@appium/base-driver 8.2.3 → 8.3.1

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 (128) hide show
  1. package/build/lib/basedriver/capabilities.js +2 -4
  2. package/build/lib/basedriver/commands/event.js +2 -4
  3. package/build/lib/basedriver/commands/find.js +5 -14
  4. package/build/lib/basedriver/commands/index.js +2 -4
  5. package/build/lib/basedriver/commands/log.js +4 -9
  6. package/build/lib/basedriver/commands/session.js +19 -30
  7. package/build/lib/basedriver/commands/settings.js +5 -11
  8. package/build/lib/basedriver/commands/timeout.js +11 -18
  9. package/build/lib/basedriver/desired-caps.js +2 -4
  10. package/build/lib/basedriver/device-settings.js +15 -5
  11. package/build/lib/basedriver/driver.js +36 -23
  12. package/build/lib/basedriver/helpers.js +10 -12
  13. package/build/lib/basedriver/logger.js +2 -4
  14. package/build/lib/constants.js +2 -4
  15. package/build/lib/express/crash.js +2 -4
  16. package/build/lib/express/express-logging.js +3 -5
  17. package/build/lib/express/idempotency.js +3 -5
  18. package/build/lib/express/logger.js +2 -4
  19. package/build/lib/express/middleware.js +2 -4
  20. package/build/lib/express/server.js +2 -4
  21. package/build/lib/express/static.js +2 -4
  22. package/build/lib/express/websocket.js +2 -4
  23. package/build/lib/helpers/capabilities.js +37 -0
  24. package/build/lib/index.js +4 -8
  25. package/build/lib/jsonwp-proxy/protocol-converter.js +19 -15
  26. package/build/lib/jsonwp-proxy/proxy.js +20 -15
  27. package/build/lib/jsonwp-status/status.js +2 -4
  28. package/build/lib/protocol/errors.js +2 -4
  29. package/build/lib/protocol/helpers.js +2 -4
  30. package/build/lib/protocol/index.js +2 -4
  31. package/build/lib/protocol/protocol.js +37 -30
  32. package/build/lib/protocol/routes.js +68 -4
  33. package/build/lib/protocol/validators.js +2 -4
  34. package/build/test/basedriver/README.md +5 -0
  35. package/build/test/basedriver/driver-e2e-tests.js +2 -4
  36. package/build/test/basedriver/driver-tests.js +12 -17
  37. package/build/test/basedriver/index.js +2 -4
  38. package/build/test/e2e/basedriver/driver.e2e.spec.js +15 -0
  39. package/build/test/e2e/basedriver/helpers.e2e.spec.js +192 -0
  40. package/build/test/e2e/basedriver/websockets.e2e.spec.js +82 -0
  41. package/build/test/e2e/express/server.e2e.spec.js +159 -0
  42. package/build/test/e2e/jsonwp-proxy/proxy.e2e.spec.js +59 -0
  43. package/build/test/e2e/protocol/fake-driver.js +163 -0
  44. package/build/test/e2e/protocol/helpers.js +25 -0
  45. package/build/test/e2e/protocol/protocol.e2e.spec.js +1186 -0
  46. package/build/test/helpers.js +2 -4
  47. package/build/test/unit/basedriver/capabilities.spec.js +672 -0
  48. package/build/test/unit/basedriver/capability.spec.js +353 -0
  49. package/build/test/unit/basedriver/commands/event.spec.js +110 -0
  50. package/build/test/unit/basedriver/commands/log.spec.js +85 -0
  51. package/build/test/unit/basedriver/driver.spec.js +15 -0
  52. package/build/test/unit/basedriver/helpers.spec.js +151 -0
  53. package/build/test/unit/basedriver/timeout.spec.js +135 -0
  54. package/build/test/unit/express/server.spec.js +155 -0
  55. package/build/test/unit/express/static.spec.js +26 -0
  56. package/build/test/unit/jsonwp-proxy/mock-request.js +91 -0
  57. package/build/test/unit/jsonwp-proxy/protocol-converter.spec.js +171 -0
  58. package/build/test/unit/jsonwp-proxy/proxy.spec.js +292 -0
  59. package/build/test/unit/jsonwp-proxy/url.spec.js +165 -0
  60. package/build/test/unit/jsonwp-status/status.spec.js +34 -0
  61. package/build/test/unit/protocol/errors.spec.js +390 -0
  62. package/build/test/unit/protocol/routes.spec.js +80 -0
  63. package/build/test/unit/protocol/validator.spec.js +149 -0
  64. package/lib/basedriver/commands/find.js +3 -6
  65. package/lib/basedriver/commands/log.js +2 -4
  66. package/lib/basedriver/commands/session.js +21 -22
  67. package/lib/basedriver/commands/settings.js +3 -5
  68. package/lib/basedriver/commands/timeout.js +9 -10
  69. package/lib/basedriver/device-settings.js +10 -1
  70. package/lib/basedriver/driver.js +36 -12
  71. package/lib/basedriver/helpers.js +13 -11
  72. package/lib/express/express-logging.js +1 -1
  73. package/lib/express/idempotency.js +1 -1
  74. package/lib/helpers/capabilities.js +25 -0
  75. package/lib/index.js +2 -2
  76. package/lib/jsonwp-proxy/protocol-converter.js +14 -13
  77. package/lib/jsonwp-proxy/proxy.js +16 -12
  78. package/lib/protocol/protocol.js +34 -29
  79. package/lib/protocol/routes.js +60 -1
  80. package/package.json +36 -24
  81. package/test/basedriver/README.md +5 -0
  82. package/test/basedriver/driver-e2e-tests.js +1 -1
  83. package/test/basedriver/driver-tests.js +12 -7
  84. package/build/lib/protocol/sessions-cache.js +0 -88
  85. package/build/test/basedriver/capabilities-specs.js +0 -632
  86. package/build/test/basedriver/capability-specs.js +0 -396
  87. package/build/test/basedriver/commands/event-specs.js +0 -112
  88. package/build/test/basedriver/commands/log-specs.js +0 -80
  89. package/build/test/basedriver/driver-e2e-specs.js +0 -17
  90. package/build/test/basedriver/driver-specs.js +0 -17
  91. package/build/test/basedriver/helpers-e2e-specs.js +0 -194
  92. package/build/test/basedriver/helpers-specs.js +0 -153
  93. package/build/test/basedriver/timeout-specs.js +0 -139
  94. package/build/test/basedriver/websockets-e2e-specs.js +0 -84
  95. package/build/test/express/server-e2e-specs.js +0 -156
  96. package/build/test/express/server-specs.js +0 -151
  97. package/build/test/express/static-specs.js +0 -23
  98. package/build/test/jsonwp-proxy/mock-request.js +0 -93
  99. package/build/test/jsonwp-proxy/protocol-converter-specs.js +0 -173
  100. package/build/test/jsonwp-proxy/proxy-e2e-specs.js +0 -61
  101. package/build/test/jsonwp-proxy/proxy-specs.js +0 -294
  102. package/build/test/jsonwp-proxy/url-specs.js +0 -167
  103. package/build/test/jsonwp-status/status-specs.js +0 -36
  104. package/build/test/protocol/errors-specs.js +0 -388
  105. package/build/test/protocol/fake-driver.js +0 -168
  106. package/build/test/protocol/helpers.js +0 -27
  107. package/build/test/protocol/protocol-e2e-specs.js +0 -1182
  108. package/build/test/protocol/routes-specs.js +0 -82
  109. package/build/test/protocol/validator-specs.js +0 -151
  110. package/lib/protocol/sessions-cache.js +0 -74
  111. package/test/basedriver/capabilities-specs.js +0 -505
  112. package/test/basedriver/capability-specs.js +0 -409
  113. package/test/basedriver/commands/event-specs.js +0 -74
  114. package/test/basedriver/commands/log-specs.js +0 -70
  115. package/test/basedriver/driver-e2e-specs.js +0 -8
  116. package/test/basedriver/driver-specs.js +0 -8
  117. package/test/basedriver/fixtures/BadZippedApp.zip +0 -1
  118. package/test/basedriver/fixtures/FakeAndroidApp.apk +0 -1
  119. package/test/basedriver/fixtures/FakeAndroidApp.asd +0 -0
  120. package/test/basedriver/fixtures/FakeIOSApp.app +0 -1
  121. package/test/basedriver/fixtures/FakeIOSApp.app.zip +0 -0
  122. package/test/basedriver/fixtures/FakeIOSApp.ipa +0 -0
  123. package/test/basedriver/fixtures/custom-element-finder-bad.js +0 -5
  124. package/test/basedriver/fixtures/custom-element-finder.js +0 -29
  125. package/test/basedriver/helpers-e2e-specs.js +0 -187
  126. package/test/basedriver/helpers-specs.js +0 -137
  127. package/test/basedriver/timeout-specs.js +0 -133
  128. package/test/basedriver/websockets-e2e-specs.js +0 -75
@@ -1,88 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.default = void 0;
9
-
10
- require("source-map-support/register");
11
-
12
- var _lruCache = _interopRequireDefault(require("lru-cache"));
13
-
14
- var _support = require("@appium/support");
15
-
16
- var _constants = require("../constants");
17
-
18
- const GENERIC_PROTOCOL = 'GENERIC';
19
-
20
- const mjsonwpLog = _support.logger.getLogger('MJSONWP');
21
-
22
- const w3cLog = _support.logger.getLogger('W3C');
23
-
24
- const genericProtocolLog = _support.logger.getLogger(GENERIC_PROTOCOL);
25
-
26
- class SessionsCache {
27
- constructor(max) {
28
- this._cache = new _lruCache.default({
29
- max
30
- });
31
- }
32
-
33
- getLogger(sessionId, protocol) {
34
- if (sessionId) {
35
- if (this._cache.has(sessionId)) {
36
- const value = this._cache.get(sessionId);
37
-
38
- if (value.logger) {
39
- return value.logger;
40
- }
41
-
42
- protocol = protocol || value.protocol;
43
- }
44
-
45
- return _support.logger.getLogger(`${protocol || GENERIC_PROTOCOL} ` + `(${sessionId.substring(0, Math.min(sessionId.length, 8))})`);
46
- }
47
-
48
- switch (protocol) {
49
- case _constants.PROTOCOLS.W3C:
50
- return w3cLog;
51
-
52
- case _constants.PROTOCOLS.MJSONWP:
53
- return mjsonwpLog;
54
-
55
- default:
56
- return genericProtocolLog;
57
- }
58
- }
59
-
60
- getProtocol(sessionId) {
61
- return (this._cache.get(sessionId) || {}).protocol;
62
- }
63
-
64
- putSession(sessionId, value) {
65
- if (sessionId && value) {
66
- this._cache.set(sessionId, {
67
- protocol: value,
68
- logger: this.getLogger(sessionId, value)
69
- });
70
- }
71
-
72
- return value;
73
- }
74
-
75
- resetLogger(sessionId) {
76
- if (this._cache.has(sessionId)) {
77
- this._cache.get(sessionId).logger = null;
78
- }
79
- }
80
-
81
- }
82
-
83
- const SESSIONS_CACHE = new SessionsCache(100);
84
- var _default = SESSIONS_CACHE;
85
- exports.default = _default;require('source-map-support').install();
86
-
87
-
88
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wcm90b2NvbC9zZXNzaW9ucy1jYWNoZS5qcyJdLCJuYW1lcyI6WyJHRU5FUklDX1BST1RPQ09MIiwibWpzb253cExvZyIsImxvZ2dlciIsImdldExvZ2dlciIsInczY0xvZyIsImdlbmVyaWNQcm90b2NvbExvZyIsIlNlc3Npb25zQ2FjaGUiLCJjb25zdHJ1Y3RvciIsIm1heCIsIl9jYWNoZSIsIkxSVSIsInNlc3Npb25JZCIsInByb3RvY29sIiwiaGFzIiwidmFsdWUiLCJnZXQiLCJzdWJzdHJpbmciLCJNYXRoIiwibWluIiwibGVuZ3RoIiwiUFJPVE9DT0xTIiwiVzNDIiwiTUpTT05XUCIsImdldFByb3RvY29sIiwicHV0U2Vzc2lvbiIsInNldCIsInJlc2V0TG9nZ2VyIiwiU0VTU0lPTlNfQ0FDSEUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsZ0JBQWdCLEdBQUcsU0FBekI7O0FBQ0EsTUFBTUMsVUFBVSxHQUFHQyxnQkFBT0MsU0FBUCxDQUFpQixTQUFqQixDQUFuQjs7QUFDQSxNQUFNQyxNQUFNLEdBQUdGLGdCQUFPQyxTQUFQLENBQWlCLEtBQWpCLENBQWY7O0FBQ0EsTUFBTUUsa0JBQWtCLEdBQUdILGdCQUFPQyxTQUFQLENBQWlCSCxnQkFBakIsQ0FBM0I7O0FBR0EsTUFBTU0sYUFBTixDQUFvQjtBQUNsQkMsRUFBQUEsV0FBVyxDQUFFQyxHQUFGLEVBQU87QUFDaEIsU0FBS0MsTUFBTCxHQUFjLElBQUlDLGlCQUFKLENBQVE7QUFBRUYsTUFBQUE7QUFBRixLQUFSLENBQWQ7QUFDRDs7QUFFREwsRUFBQUEsU0FBUyxDQUFFUSxTQUFGLEVBQWFDLFFBQWIsRUFBdUI7QUFDOUIsUUFBSUQsU0FBSixFQUFlO0FBQ2IsVUFBSSxLQUFLRixNQUFMLENBQVlJLEdBQVosQ0FBZ0JGLFNBQWhCLENBQUosRUFBZ0M7QUFDOUIsY0FBTUcsS0FBSyxHQUFHLEtBQUtMLE1BQUwsQ0FBWU0sR0FBWixDQUFnQkosU0FBaEIsQ0FBZDs7QUFDQSxZQUFJRyxLQUFLLENBQUNaLE1BQVYsRUFBa0I7QUFDaEIsaUJBQU9ZLEtBQUssQ0FBQ1osTUFBYjtBQUNEOztBQUNEVSxRQUFBQSxRQUFRLEdBQUdBLFFBQVEsSUFBSUUsS0FBSyxDQUFDRixRQUE3QjtBQUNEOztBQUlELGFBQU9WLGdCQUFPQyxTQUFQLENBQWtCLEdBQUVTLFFBQVEsSUFBSVosZ0JBQWlCLEdBQWhDLEdBQ3JCLElBQUdXLFNBQVMsQ0FBQ0ssU0FBVixDQUFvQixDQUFwQixFQUF1QkMsSUFBSSxDQUFDQyxHQUFMLENBQVNQLFNBQVMsQ0FBQ1EsTUFBbkIsRUFBMkIsQ0FBM0IsQ0FBdkIsQ0FBc0QsR0FEckQsQ0FBUDtBQUVEOztBQUdELFlBQVFQLFFBQVI7QUFDRSxXQUFLUSxxQkFBVUMsR0FBZjtBQUNFLGVBQU9qQixNQUFQOztBQUNGLFdBQUtnQixxQkFBVUUsT0FBZjtBQUNFLGVBQU9yQixVQUFQOztBQUNGO0FBQ0UsZUFBT0ksa0JBQVA7QUFOSjtBQVFEOztBQUVEa0IsRUFBQUEsV0FBVyxDQUFFWixTQUFGLEVBQWE7QUFDdEIsV0FBTyxDQUFDLEtBQUtGLE1BQUwsQ0FBWU0sR0FBWixDQUFnQkosU0FBaEIsS0FBOEIsRUFBL0IsRUFBbUNDLFFBQTFDO0FBQ0Q7O0FBRURZLEVBQUFBLFVBQVUsQ0FBRWIsU0FBRixFQUFhRyxLQUFiLEVBQW9CO0FBQzVCLFFBQUlILFNBQVMsSUFBSUcsS0FBakIsRUFBd0I7QUFDdEIsV0FBS0wsTUFBTCxDQUFZZ0IsR0FBWixDQUFnQmQsU0FBaEIsRUFBMkI7QUFDekJDLFFBQUFBLFFBQVEsRUFBRUUsS0FEZTtBQUt6QlosUUFBQUEsTUFBTSxFQUFFLEtBQUtDLFNBQUwsQ0FBZVEsU0FBZixFQUEwQkcsS0FBMUI7QUFMaUIsT0FBM0I7QUFPRDs7QUFDRCxXQUFPQSxLQUFQO0FBQ0Q7O0FBRURZLEVBQUFBLFdBQVcsQ0FBRWYsU0FBRixFQUFhO0FBQ3RCLFFBQUksS0FBS0YsTUFBTCxDQUFZSSxHQUFaLENBQWdCRixTQUFoQixDQUFKLEVBQWdDO0FBQzlCLFdBQUtGLE1BQUwsQ0FBWU0sR0FBWixDQUFnQkosU0FBaEIsRUFBMkJULE1BQTNCLEdBQW9DLElBQXBDO0FBQ0Q7QUFDRjs7QUFyRGlCOztBQTREcEIsTUFBTXlCLGNBQWMsR0FBRyxJQUFJckIsYUFBSixDQUFrQixHQUFsQixDQUF2QjtlQUVlcUIsYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMUlUgZnJvbSAnbHJ1LWNhY2hlJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBQUk9UT0NPTFMgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG5cbmNvbnN0IEdFTkVSSUNfUFJPVE9DT0wgPSAnR0VORVJJQyc7XG5jb25zdCBtanNvbndwTG9nID0gbG9nZ2VyLmdldExvZ2dlcignTUpTT05XUCcpO1xuY29uc3QgdzNjTG9nID0gbG9nZ2VyLmdldExvZ2dlcignVzNDJyk7XG5jb25zdCBnZW5lcmljUHJvdG9jb2xMb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKEdFTkVSSUNfUFJPVE9DT0wpO1xuXG5cbmNsYXNzIFNlc3Npb25zQ2FjaGUge1xuICBjb25zdHJ1Y3RvciAobWF4KSB7XG4gICAgdGhpcy5fY2FjaGUgPSBuZXcgTFJVKHsgbWF4IH0pO1xuICB9XG5cbiAgZ2V0TG9nZ2VyIChzZXNzaW9uSWQsIHByb3RvY29sKSB7XG4gICAgaWYgKHNlc3Npb25JZCkge1xuICAgICAgaWYgKHRoaXMuX2NhY2hlLmhhcyhzZXNzaW9uSWQpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fY2FjaGUuZ2V0KHNlc3Npb25JZCk7XG4gICAgICAgIGlmICh2YWx1ZS5sb2dnZXIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUubG9nZ2VyO1xuICAgICAgICB9XG4gICAgICAgIHByb3RvY29sID0gcHJvdG9jb2wgfHwgdmFsdWUucHJvdG9jb2w7XG4gICAgICB9XG4gICAgICAvLyBBbHdheXMgY3JlYXRlIGEgbmV3IGxvZ2dlciBpbnN0YW5jZSBmb3IgaWRzXG4gICAgICAvLyB0aGF0IGFyZSBub3QgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbnMgbGlzdCxcbiAgICAgIC8vIHNvIHdlIGNhbiBzdGlsbCBzZWUgc3VjaCBpZHMgYXMgcHJlZml4ZXNcbiAgICAgIHJldHVybiBsb2dnZXIuZ2V0TG9nZ2VyKGAke3Byb3RvY29sIHx8IEdFTkVSSUNfUFJPVE9DT0x9IGAgK1xuICAgICAgICBgKCR7c2Vzc2lvbklkLnN1YnN0cmluZygwLCBNYXRoLm1pbihzZXNzaW9uSWQubGVuZ3RoLCA4KSl9KWApO1xuICAgIH1cblxuICAgIC8vIEZhbGwgYmFjayB0byBwcm90b2NvbCBuYW1lLW9ubHkgbG9nZ2VyIGlmIHNlc3Npb24gaWQgaXMgdW5rbm93blxuICAgIHN3aXRjaCAocHJvdG9jb2wpIHtcbiAgICAgIGNhc2UgUFJPVE9DT0xTLlczQzpcbiAgICAgICAgcmV0dXJuIHczY0xvZztcbiAgICAgIGNhc2UgUFJPVE9DT0xTLk1KU09OV1A6XG4gICAgICAgIHJldHVybiBtanNvbndwTG9nO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGdlbmVyaWNQcm90b2NvbExvZztcbiAgICB9XG4gIH1cblxuICBnZXRQcm90b2NvbCAoc2Vzc2lvbklkKSB7XG4gICAgcmV0dXJuICh0aGlzLl9jYWNoZS5nZXQoc2Vzc2lvbklkKSB8fCB7fSkucHJvdG9jb2w7XG4gIH1cblxuICBwdXRTZXNzaW9uIChzZXNzaW9uSWQsIHZhbHVlKSB7XG4gICAgaWYgKHNlc3Npb25JZCAmJiB2YWx1ZSkge1xuICAgICAgdGhpcy5fY2FjaGUuc2V0KHNlc3Npb25JZCwge1xuICAgICAgICBwcm90b2NvbDogdmFsdWUsXG4gICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gY2FjaGUgdGhlIGxvZ2dlciBpbnN0YW5jZSBmb3IgZWFjaCByYW5kb20gc2Vzc2lvbiBpZCBpbiB0aGUgY2FjaGVcbiAgICAgICAgLy8gaW4gb3JkZXIgdG8gc2F2ZSBtZW1vcnkuIEluc3RlYWQgd2Ugb25seSBjYWNoZSBsb2dnZXJzIGZvciB2YWxpZCBpZHMgdGhhdFxuICAgICAgICAvLyBhcmUgcmV0dXJuZWQgYnkgYGNyZWF0ZVNlc3Npb25gIGNhbGwgYW5kIHJlc2V0IHRoZW0gYWZ0ZXIgYGRlbGV0ZVNlc3Npb25gIGlzIGNhbGxlZFxuICAgICAgICBsb2dnZXI6IHRoaXMuZ2V0TG9nZ2VyKHNlc3Npb25JZCwgdmFsdWUpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJlc2V0TG9nZ2VyIChzZXNzaW9uSWQpIHtcbiAgICBpZiAodGhpcy5fY2FjaGUuaGFzKHNlc3Npb25JZCkpIHtcbiAgICAgIHRoaXMuX2NhY2hlLmdldChzZXNzaW9uSWQpLmxvZ2dlciA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbi8vIFRoaXMgY2FjaGUgaXMgdXNlZnVsIHdoZW4gYSBzZXNzaW9uIGdldHMgdGVybWluYXRlZFxuLy8gYW5kIHJlbW92ZWQgZnJvbSB0aGUgc2Vzc2lvbnMgbGlzdCBpbiB0aGUgdW1icmVsbGEgZHJpdmVyLFxuLy8gYnV0IHRoZSBjbGllbnQgc3RpbGwgdHJpZXMgdG8gc2VuZCBhIGNvbW1hbmQgdG8gdGhpcyBzZXNzaW9uIGlkLlxuLy8gU28gd2Uga25vdyBob3cgdG8gcHJvcGVybHkgd3JhcCB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgaXRcbmNvbnN0IFNFU1NJT05TX0NBQ0hFID0gbmV3IFNlc3Npb25zQ2FjaGUoMTAwKTtcblxuZXhwb3J0IGRlZmF1bHQgU0VTU0lPTlNfQ0FDSEU7XG4iXSwiZmlsZSI6ImxpYi9wcm90b2NvbC9zZXNzaW9ucy1jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9