appium 2.0.0-beta.25 → 2.0.0-beta.28

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 (191) hide show
  1. package/build/lib/appium.d.ts +215 -0
  2. package/build/lib/appium.d.ts.map +1 -0
  3. package/build/lib/appium.js +94 -101
  4. package/build/lib/cli/args.d.ts +20 -0
  5. package/build/lib/cli/args.d.ts.map +1 -0
  6. package/build/lib/cli/args.js +19 -39
  7. package/build/lib/cli/driver-command.d.ts +36 -0
  8. package/build/lib/cli/driver-command.d.ts.map +1 -0
  9. package/build/lib/cli/driver-command.js +10 -13
  10. package/build/lib/cli/extension-command.d.ts +345 -0
  11. package/build/lib/cli/extension-command.d.ts.map +1 -0
  12. package/build/lib/cli/extension-command.js +117 -94
  13. package/build/lib/cli/extension.d.ts +14 -0
  14. package/build/lib/cli/extension.d.ts.map +1 -0
  15. package/build/lib/cli/extension.js +14 -22
  16. package/build/lib/cli/parser.d.ts +79 -0
  17. package/build/lib/cli/parser.d.ts.map +1 -0
  18. package/build/lib/cli/parser.js +9 -19
  19. package/build/lib/cli/plugin-command.d.ts +39 -0
  20. package/build/lib/cli/plugin-command.d.ts.map +1 -0
  21. package/build/lib/cli/plugin-command.js +9 -14
  22. package/build/lib/cli/utils.d.ts +29 -0
  23. package/build/lib/cli/utils.d.ts.map +1 -0
  24. package/build/lib/cli/utils.js +2 -4
  25. package/build/lib/config-file.d.ts +100 -0
  26. package/build/lib/config-file.d.ts.map +1 -0
  27. package/build/lib/config-file.js +2 -4
  28. package/build/lib/config.d.ts +40 -0
  29. package/build/lib/config.d.ts.map +1 -0
  30. package/build/lib/config.js +8 -7
  31. package/build/lib/constants.d.ts +48 -0
  32. package/build/lib/constants.d.ts.map +1 -0
  33. package/build/lib/constants.js +60 -0
  34. package/build/lib/extension/driver-config.d.ts +84 -0
  35. package/build/lib/extension/driver-config.d.ts.map +1 -0
  36. package/build/lib/extension/driver-config.js +190 -0
  37. package/build/lib/extension/extension-config.d.ts +170 -0
  38. package/build/lib/extension/extension-config.d.ts.map +1 -0
  39. package/build/lib/extension/extension-config.js +297 -0
  40. package/build/lib/extension/index.d.ts +39 -0
  41. package/build/lib/extension/index.d.ts.map +1 -0
  42. package/build/lib/extension/index.js +77 -0
  43. package/build/lib/extension/manifest.d.ts +174 -0
  44. package/build/lib/extension/manifest.d.ts.map +1 -0
  45. package/build/lib/extension/manifest.js +246 -0
  46. package/build/lib/extension/package-changed.d.ts +11 -0
  47. package/build/lib/extension/package-changed.d.ts.map +1 -0
  48. package/build/lib/extension/package-changed.js +68 -0
  49. package/build/lib/extension/plugin-config.d.ts +62 -0
  50. package/build/lib/extension/plugin-config.d.ts.map +1 -0
  51. package/build/lib/extension/plugin-config.js +87 -0
  52. package/build/lib/grid-register.d.ts +10 -0
  53. package/build/lib/grid-register.d.ts.map +1 -0
  54. package/build/lib/grid-register.js +2 -4
  55. package/build/lib/logger.d.ts +3 -0
  56. package/build/lib/logger.d.ts.map +1 -0
  57. package/build/lib/logger.js +2 -4
  58. package/build/lib/logsink.d.ts +4 -0
  59. package/build/lib/logsink.d.ts.map +1 -0
  60. package/build/lib/logsink.js +2 -4
  61. package/build/lib/main.d.ts +51 -0
  62. package/build/lib/main.d.ts.map +1 -0
  63. package/build/lib/main.js +40 -68
  64. package/build/lib/schema/arg-spec.d.ts +143 -0
  65. package/build/lib/schema/arg-spec.d.ts.map +1 -0
  66. package/build/lib/schema/arg-spec.js +11 -14
  67. package/build/lib/schema/cli-args.d.ts +19 -0
  68. package/build/lib/schema/cli-args.d.ts.map +1 -0
  69. package/build/lib/schema/cli-args.js +2 -4
  70. package/build/lib/schema/cli-transformers.d.ts +5 -0
  71. package/build/lib/schema/cli-transformers.d.ts.map +1 -0
  72. package/build/lib/schema/cli-transformers.js +2 -4
  73. package/build/lib/schema/index.d.ts +3 -0
  74. package/build/lib/schema/index.d.ts.map +1 -0
  75. package/build/lib/schema/index.js +2 -4
  76. package/build/lib/schema/keywords.d.ts +24 -0
  77. package/build/lib/schema/keywords.d.ts.map +1 -0
  78. package/build/lib/schema/keywords.js +2 -4
  79. package/build/lib/schema/schema.d.ts +259 -0
  80. package/build/lib/schema/schema.d.ts.map +1 -0
  81. package/build/lib/schema/schema.js +57 -39
  82. package/build/lib/utils.d.ts +66 -0
  83. package/build/lib/utils.d.ts.map +1 -0
  84. package/build/lib/utils.js +6 -35
  85. package/build/tsconfig.tsbuildinfo +1 -0
  86. package/lib/appium.js +188 -117
  87. package/lib/cli/args.js +19 -24
  88. package/lib/cli/driver-command.js +19 -8
  89. package/lib/cli/extension-command.js +314 -184
  90. package/lib/cli/extension.js +18 -16
  91. package/lib/cli/parser.js +7 -16
  92. package/lib/cli/plugin-command.js +16 -7
  93. package/lib/cli/utils.js +1 -1
  94. package/lib/config-file.js +6 -7
  95. package/lib/config.js +17 -12
  96. package/lib/constants.js +78 -0
  97. package/lib/extension/driver-config.js +249 -0
  98. package/lib/extension/extension-config.js +458 -0
  99. package/lib/extension/index.js +102 -0
  100. package/lib/extension/manifest.js +486 -0
  101. package/lib/extension/package-changed.js +63 -0
  102. package/lib/extension/plugin-config.js +113 -0
  103. package/lib/grid-register.js +4 -4
  104. package/lib/logsink.js +4 -0
  105. package/lib/main.js +54 -92
  106. package/lib/schema/arg-spec.js +11 -7
  107. package/lib/schema/cli-args.js +1 -1
  108. package/lib/schema/cli-transformers.js +0 -1
  109. package/lib/schema/keywords.js +1 -2
  110. package/lib/schema/schema.js +62 -31
  111. package/lib/utils.js +48 -45
  112. package/package.json +30 -24
  113. package/{postinstall.js → scripts/postinstall.js} +1 -1
  114. package/types/appium-manifest.d.ts +61 -0
  115. package/types/cli.d.ts +134 -0
  116. package/types/extension.d.ts +56 -0
  117. package/types/external-manifest.d.ts +58 -0
  118. package/types/index.d.ts +7 -0
  119. package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
  120. package/build/check-npm-pack-files.js +0 -23
  121. package/build/commands-yml/parse.js +0 -319
  122. package/build/commands-yml/validator.js +0 -130
  123. package/build/index.js +0 -19
  124. package/build/lib/appium-config.schema.json +0 -0
  125. package/build/lib/cli/npm.js +0 -220
  126. package/build/lib/driver-config.js +0 -100
  127. package/build/lib/drivers.js +0 -100
  128. package/build/lib/ext-config-io.js +0 -165
  129. package/build/lib/extension-config.js +0 -320
  130. package/build/lib/plugin-config.js +0 -69
  131. package/build/lib/plugins.js +0 -18
  132. package/build/lib/schema/appium-config-schema.js +0 -253
  133. package/build/postinstall.js +0 -90
  134. package/build/test/cli/cli-e2e-specs.js +0 -221
  135. package/build/test/cli/cli-helpers.js +0 -86
  136. package/build/test/cli/cli-specs.js +0 -71
  137. package/build/test/cli/fixtures/test-driver/package.json +0 -27
  138. package/build/test/cli/schema-args-specs.js +0 -48
  139. package/build/test/cli/schema-e2e-specs.js +0 -47
  140. package/build/test/config-e2e-specs.js +0 -112
  141. package/build/test/config-file-e2e-specs.js +0 -191
  142. package/build/test/config-file-specs.js +0 -281
  143. package/build/test/config-specs.js +0 -258
  144. package/build/test/driver-e2e-specs.js +0 -435
  145. package/build/test/driver-specs.js +0 -386
  146. package/build/test/ext-config-io-specs.js +0 -181
  147. package/build/test/extension-config-specs.js +0 -365
  148. package/build/test/fixtures/allow-feat.txt +0 -5
  149. package/build/test/fixtures/caps.json +0 -3
  150. package/build/test/fixtures/config/allow-insecure.txt +0 -3
  151. package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +0 -5
  152. package/build/test/fixtures/config/appium.config.bad.json +0 -32
  153. package/build/test/fixtures/config/appium.config.ext-good.json +0 -9
  154. package/build/test/fixtures/config/appium.config.ext-unknown-props.json +0 -10
  155. package/build/test/fixtures/config/appium.config.good.js +0 -40
  156. package/build/test/fixtures/config/appium.config.good.json +0 -33
  157. package/build/test/fixtures/config/appium.config.good.yaml +0 -30
  158. package/build/test/fixtures/config/appium.config.invalid.json +0 -31
  159. package/build/test/fixtures/config/appium.config.security-array.json +0 -5
  160. package/build/test/fixtures/config/appium.config.security-delimited.json +0 -5
  161. package/build/test/fixtures/config/appium.config.security-path.json +0 -5
  162. package/build/test/fixtures/config/driver-fake.config.json +0 -8
  163. package/build/test/fixtures/config/nodeconfig.json +0 -3
  164. package/build/test/fixtures/config/plugin-fake.config.json +0 -0
  165. package/build/test/fixtures/default-args.js +0 -35
  166. package/build/test/fixtures/deny-feat.txt +0 -5
  167. package/build/test/fixtures/driver.schema.js +0 -20
  168. package/build/test/fixtures/extensions.yaml +0 -27
  169. package/build/test/fixtures/flattened-schema.js +0 -532
  170. package/build/test/fixtures/plugin.schema.js +0 -20
  171. package/build/test/fixtures/schema-with-extensions.js +0 -28
  172. package/build/test/grid-register-specs.js +0 -74
  173. package/build/test/helpers.js +0 -75
  174. package/build/test/logger-specs.js +0 -76
  175. package/build/test/npm-specs.js +0 -20
  176. package/build/test/parser-specs.js +0 -319
  177. package/build/test/plugin-e2e-specs.js +0 -316
  178. package/build/test/schema/arg-spec-specs.js +0 -70
  179. package/build/test/schema/cli-args-specs.js +0 -408
  180. package/build/test/schema/schema-specs.js +0 -407
  181. package/build/test/utils-specs.js +0 -288
  182. package/lib/cli/npm.js +0 -251
  183. package/lib/driver-config.js +0 -101
  184. package/lib/drivers.js +0 -84
  185. package/lib/ext-config-io.js +0 -287
  186. package/lib/extension-config.js +0 -366
  187. package/lib/plugin-config.js +0 -63
  188. package/lib/plugins.js +0 -13
  189. package/lib/schema/appium-config-schema.js +0 -287
  190. package/types/appium-config.d.ts +0 -197
  191. package/types/types.d.ts +0 -206
@@ -1,112 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- require("source-map-support/register");
6
-
7
- var _sinon = _interopRequireDefault(require("sinon"));
8
-
9
- var _config = require("../lib/config");
10
-
11
- var _axios = _interopRequireDefault(require("axios"));
12
-
13
- var _support = require("@appium/support");
14
-
15
- describe('Config', function () {
16
- describe('getGitRev', function () {
17
- it('should get a reasonable git revision', async function () {
18
- let rev = await (0, _config.getGitRev)();
19
- rev.should.be.a('string');
20
- rev.length.should.be.equal(40);
21
- rev.match(/[0-9a-f]+/i)[0].should.eql(rev);
22
- });
23
- });
24
- describe('getBuildInfo', function () {
25
- async function verifyBuildInfoUpdate(useLocalGit) {
26
- const buildInfo = (0, _config.getBuildInfo)();
27
- mockFs.expects('exists').atLeast(1).returns(useLocalGit);
28
- buildInfo['git-sha'] = undefined;
29
- buildInfo.built = undefined;
30
- await (0, _config.updateBuildInfo)(true);
31
- buildInfo.should.be.an('object');
32
- should.exist(buildInfo['git-sha']);
33
- should.exist(buildInfo.built);
34
- should.exist(buildInfo.version);
35
- }
36
-
37
- let mockFs;
38
- let getStub;
39
- beforeEach(function () {
40
- mockFs = _sinon.default.mock(_support.fs);
41
- getStub = _sinon.default.stub(_axios.default, 'get');
42
- });
43
- afterEach(function () {
44
- getStub.restore();
45
- mockFs.restore();
46
- });
47
- it('should get a configuration object if the local git metadata is present', async function () {
48
- await verifyBuildInfoUpdate(true);
49
- });
50
- it('should get a configuration object if the local git metadata is not present', async function () {
51
- getStub.onCall(0).returns({
52
- data: [{
53
- name: `v${_config.APPIUM_VER}`,
54
- zipball_url: 'https://api.github.com/repos/appium/appium/zipball/v1.9.0-beta.1',
55
- tarball_url: 'https://api.github.com/repos/appium/appium/tarball/v1.9.0-beta.1',
56
- commit: {
57
- sha: '3c2752f9f9c56000705a4ae15b3ba68a5d2e644c',
58
- url: 'https://api.github.com/repos/appium/appium/commits/3c2752f9f9c56000705a4ae15b3ba68a5d2e644c'
59
- },
60
- node_id: 'MDM6UmVmNzUzMDU3MDp2MS45LjAtYmV0YS4x'
61
- }, {
62
- name: 'v1.8.2-beta',
63
- zipball_url: 'https://api.github.com/repos/appium/appium/zipball/v1.8.2-beta',
64
- tarball_url: 'https://api.github.com/repos/appium/appium/tarball/v1.8.2-beta',
65
- commit: {
66
- sha: '5b98b9197e75aa85e7507d21d3126c1a63d1ce8f',
67
- url: 'https://api.github.com/repos/appium/appium/commits/5b98b9197e75aa85e7507d21d3126c1a63d1ce8f'
68
- },
69
- node_id: 'MDM6UmVmNzUzMDU3MDp2MS44LjItYmV0YQ=='
70
- }]
71
- });
72
- getStub.onCall(1).returns({
73
- data: {
74
- sha: '3c2752f9f9c56000705a4ae15b3ba68a5d2e644c',
75
- node_id: 'MDY6Q29tbWl0NzUzMDU3MDozYzI3NTJmOWY5YzU2MDAwNzA1YTRhZTE1YjNiYTY4YTVkMmU2NDRj',
76
- commit: {
77
- author: {
78
- name: 'Isaac Murchie',
79
- email: 'isaac@saucelabs.com',
80
- date: '2018-08-17T19:48:00Z'
81
- },
82
- committer: {
83
- name: 'Isaac Murchie',
84
- email: 'isaac@saucelabs.com',
85
- date: '2018-08-17T19:48:00Z'
86
- },
87
- message: 'v1.9.0-beta.1',
88
- tree: {
89
- sha: '2c0974727470eba419ea0b9951c52f72f8036b18',
90
- url: 'https://api.github.com/repos/appium/appium/git/trees/2c0974727470eba419ea0b9951c52f72f8036b18'
91
- },
92
- url: 'https://api.github.com/repos/appium/appium/git/commits/3c2752f9f9c56000705a4ae15b3ba68a5d2e644c',
93
- comment_count: 0,
94
- verification: {
95
- verified: false,
96
- reason: 'unsigned',
97
- signature: null,
98
- payload: null
99
- }
100
- },
101
- url: 'https://api.github.com/repos/appium/appium/commits/3c2752f9f9c56000705a4ae15b3ba68a5d2e644c',
102
- html_url: 'https://github.com/appium/appium/commit/3c2752f9f9c56000705a4ae15b3ba68a5d2e644c',
103
- comments_url: 'https://api.github.com/repos/appium/appium/commits/3c2752f9f9c56000705a4ae15b3ba68a5d2e644c/comments'
104
- }
105
- });
106
- await verifyBuildInfoUpdate(false);
107
- });
108
- });
109
- });require('source-map-support').install();
110
-
111
-
112
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY29uZmlnLWUyZS1zcGVjcy5qcyJdLCJuYW1lcyI6WyJkZXNjcmliZSIsIml0IiwicmV2Iiwic2hvdWxkIiwiYmUiLCJhIiwibGVuZ3RoIiwiZXF1YWwiLCJtYXRjaCIsImVxbCIsInZlcmlmeUJ1aWxkSW5mb1VwZGF0ZSIsInVzZUxvY2FsR2l0IiwiYnVpbGRJbmZvIiwibW9ja0ZzIiwiZXhwZWN0cyIsImF0TGVhc3QiLCJyZXR1cm5zIiwidW5kZWZpbmVkIiwiYnVpbHQiLCJhbiIsImV4aXN0IiwidmVyc2lvbiIsImdldFN0dWIiLCJiZWZvcmVFYWNoIiwic2lub24iLCJtb2NrIiwiZnMiLCJzdHViIiwiYXhpb3MiLCJhZnRlckVhY2giLCJyZXN0b3JlIiwib25DYWxsIiwiZGF0YSIsIm5hbWUiLCJBUFBJVU1fVkVSIiwiemlwYmFsbF91cmwiLCJ0YXJiYWxsX3VybCIsImNvbW1pdCIsInNoYSIsInVybCIsIm5vZGVfaWQiLCJhdXRob3IiLCJlbWFpbCIsImRhdGUiLCJjb21taXR0ZXIiLCJtZXNzYWdlIiwidHJlZSIsImNvbW1lbnRfY291bnQiLCJ2ZXJpZmljYXRpb24iLCJ2ZXJpZmllZCIsInJlYXNvbiIsInNpZ25hdHVyZSIsInBheWxvYWQiLCJodG1sX3VybCIsImNvbW1lbnRzX3VybCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBQ0E7O0FBTUE7O0FBQ0E7O0FBR0FBLFFBQVEsQ0FBQyxRQUFELEVBQVcsWUFBWTtBQUM3QkEsRUFBQUEsUUFBUSxDQUFDLFdBQUQsRUFBYyxZQUFZO0FBQ2hDQyxJQUFBQSxFQUFFLENBQUMsc0NBQUQsRUFBeUMsa0JBQWtCO0FBQzNELFVBQUlDLEdBQUcsR0FBRyxNQUFNLHdCQUFoQjtBQUNBQSxNQUFBQSxHQUFHLENBQUNDLE1BQUosQ0FBV0MsRUFBWCxDQUFjQyxDQUFkLENBQWdCLFFBQWhCO0FBQ0FILE1BQUFBLEdBQUcsQ0FBQ0ksTUFBSixDQUFXSCxNQUFYLENBQWtCQyxFQUFsQixDQUFxQkcs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Y0FBQUEsSUFBSSxFQUFFLGVBREE7QUFFTlMsY0FBQUEsS0FBSyxFQUFFLHFCQUZEO0FBR05DLGNBQUFBLElBQUksRUFBRTtBQUhBLGFBREY7QUFNTkMsWUFBQUEsU0FBUyxFQUFFO0FBQ1RYLGNBQUFBLElBQUksRUFBRSxlQURHO0FBRVRTLGNBQUFBLEtBQUssRUFBRSxxQkFGRTtBQUdUQyxjQUFBQSxJQUFJLEVBQUU7QUFIRyxhQU5MO0FBV05FLFlBQUFBLE9BQU8sRUFBRSxlQVhIO0FBWU5DLFlBQUFBLElBQUksRUFBRTtBQUNKUixjQUFBQSxHQUFHLEVBQUUsMENBREQ7QUFFSkMsY0FBQUEsR0FBRyxFQUFFO0FBRkQsYUFaQTtBQWdCTkEsWUFBQUEsR0FBRyxFQUFFLGlHQWhCQztBQWlCTlEsWUFBQUEsYUFBYSxFQUFFLENBakJUO0FBa0JOQyxZQUFBQSxZQUFZLEVBQUU7QUFDWkMsY0FBQUEsUUFBUSxFQUFFLEtBREU7QUFFWkMsY0FBQUEsTUFBTSxFQUFFLFVBRkk7QUFHWkMsY0FBQUEsU0FBUyxFQUFFLElBSEM7QUFJWkMsY0FBQUEsT0FBTyxFQUFFO0FBSkc7QUFsQlIsV0FKSjtBQTZCSmIsVUFBQUEsR0FBRyxFQUFFLDZGQTdCRDtBQThCSmMsVUFBQUEsUUFBUSxFQUNOLGtGQS9CRTtBQWdDSkMsVUFBQUEsWUFBWSxFQUNWO0FBakNFO0FBRGtCLE9BQTFCO0FBcUNBLFlBQU01QyxxQkFBcUIsQ0FBQyxLQUFELENBQTNCO0FBQ0QsS0FuRUMsQ0FBRjtBQW9FRCxHQS9GTyxDQUFSO0FBZ0dELENBekdPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IHtcbiAgZ2V0R2l0UmV2LFxuICBnZXRCdWlsZEluZm8sXG4gIHVwZGF0ZUJ1aWxkSW5mbyxcbiAgQVBQSVVNX1ZFUixcbn0gZnJvbSAnLi4vbGliL2NvbmZpZyc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgZnMgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuXG5cbmRlc2NyaWJlKCdDb25maWcnLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdnZXRHaXRSZXYnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBnZXQgYSByZWFzb25hYmxlIGdpdCByZXZpc2lvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCByZXYgPSBhd2FpdCBnZXRHaXRSZXYoKTtcbiAgICAgIHJldi5zaG91bGQuYmUuYSgnc3RyaW5nJyk7XG4gICAgICByZXYubGVuZ3RoLnNob3VsZC5iZS5lcXVhbCg0MCk7XG4gICAgICByZXYubWF0Y2goL1swLTlhLWZdKy9pKVswXS5zaG91bGQuZXFsKHJldik7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnZ2V0QnVpbGRJbmZvJywgZnVuY3Rpb24gKCkge1xuICAgIGFzeW5jIGZ1bmN0aW9uIHZlcmlmeUJ1aWxkSW5mb1VwZGF0ZSAodXNlTG9jYWxHaXQpIHtcbiAgICAgIGNvbnN0IGJ1aWxkSW5mbyA9IGdldEJ1aWxkSW5mbygpO1xuICAgICAgbW9ja0ZzLmV4cGVjdHMoJ2V4aXN0cycpLmF0TGVhc3QoMSkucmV0dXJucyh1c2VMb2NhbEdpdCk7XG4gICAgICBidWlsZEluZm9bJ2dpdC1zaGEnXSA9IHVuZGVmaW5lZDtcbiAgICAgIGJ1aWxkSW5mby5idWlsdCA9IHVuZGVmaW5lZDtcbiAgICAgIGF3YWl0IHVwZGF0ZUJ1aWxkSW5mbyh0cnVlKTtcbiAgICAgIGJ1aWxkSW5mby5zaG91bGQuYmUuYW4oJ29iamVjdCcpO1xuICAgICAgc2hvdWxkLmV4aXN0KGJ1aWxkSW5mb1snZ2l0LXNoYSddKTtcbiAgICAgIHNob3VsZC5leGlzdChidWlsZEluZm8uYnVpbHQpO1xuICAgICAgc2hvdWxkLmV4aXN0KGJ1aWxkSW5mby52ZXJzaW9uKTtcbiAgICB9XG5cbiAgICBsZXQgbW9ja0ZzO1xuICAgIGxldCBnZXRTdHViO1xuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0ZzID0gc2lub24ubW9jayhmcyk7XG4gICAgICBnZXRTdHViID0gc2lub24uc3R1YihheGlvcywgJ2dldCcpO1xuICAgIH0pO1xuICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBnZXRTdHViLnJlc3RvcmUoKTtcbiAgICAgIG1vY2tGcy5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdldCBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGlmIHRoZSBsb2NhbCBnaXQgbWV0YWRhdGEgaXMgcHJlc2VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IHZlcmlmeUJ1aWxkSW5mb1VwZGF0ZSh0cnVlKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGdldCBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGlmIHRoZSBsb2NhbCBnaXQgbWV0YWRhdGEgaXMgbm90IHByZXNlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBnZXRTdHViLm9uQ2FsbCgwKS5yZXR1cm5zKHtcbiAgICAgICAgZGF0YTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IGB2JHtBUFBJVU1fVkVSfWAsXG4gICAgICAgICAgICB6aXBiYWxsX3VybDpcbiAgICAgICAgICAgICAgJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXBwaXVtL2FwcGl1bS96aXBiYWxsL3YxLjkuMC1iZXRhLjEnLFxuICAgICAgICAgICAgdGFyYmFsbF91cmw6XG4gICAgICAgICAgICAgICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2FwcGl1bS9hcHBpdW0vdGFyYmFsbC92MS45LjAtYmV0YS4xJyxcbiAgICAgICAgICAgIGNvbW1pdDoge1xuICAgICAgICAgICAgICBzaGE6ICczYzI3NTJmOWY5YzU2MDAwNzA1YTRhZTE1YjNiYTY4YTVkMmU2NDRjJyxcbiAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hcHBpdW0vYXBwaXVtL2NvbW1pdHMvM2MyNzUyZjlmOWM1NjAwMDcwNWE0YWUxNWIzYmE2OGE1ZDJlNjQ0YycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbm9kZV9pZDogJ01ETTZVbVZtTnpVek1EVTNNRHAyTVM0NUxqQXRZbVYwWVM0eCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAndjEuOC4yLWJldGEnLFxuICAgICAgICAgICAgemlwYmFsbF91cmw6XG4gICAgICAgICAgICAgICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2FwcGl1bS9hcHBpdW0vemlwYmFsbC92MS44LjItYmV0YScsXG4gICAgICAgICAgICB0YXJiYWxsX3VybDpcbiAgICAgICAgICAgICAgJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXBwaXVtL2FwcGl1bS90YXJiYWxsL3YxLjguMi1iZXRhJyxcbiAgICAgICAgICAgIGNvbW1pdDoge1xuICAgICAgICAgICAgICBzaGE6ICc1Yjk4YjkxOTdlNzVhYTg1ZTc1MDdkMjFkMzEyNmMxYTYzZDFjZThmJyxcbiAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hcHBpdW0vYXBwaXVtL2NvbW1pdHMvNWI5OGI5MTk3ZTc1YWE4NWU3NTA3ZDIxZDMxMjZjMWE2M2QxY2U4ZicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbm9kZV9pZDogJ01ETTZVbVZtTnpVek1EVTNNRHAyTVM0NExqSXRZbVYwWVE9PScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgICAgZ2V0U3R1Yi5vbkNhbGwoMSkucmV0dXJucyh7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBzaGE6ICczYzI3NTJmOWY5YzU2MDAwNzA1YTRhZTE1YjNiYTY4YTVkMmU2NDRjJyxcbiAgICAgICAgICBub2RlX2lkOlxuICAgICAgICAgICAgJ01EWTZRMjl0YldsME56VXpNRFUzTURvell6STNOVEptT1dZNVl6VTJNREF3TnpBMVlUUmhaVEUxWWpOaVlUWTRZVFZrTW1VMk5EUmonLFxuICAgICAgICAgIGNvbW1pdDoge1xuICAgICAgICAgICAgYXV0aG9yOiB7XG4gICAgICAgICAgICAgIG5hbWU6ICdJc2FhYyBNdXJjaGllJyxcbiAgICAgICAgICAgICAgZW1haWw6ICdpc2FhY0BzYXVjZWxhYnMuY29tJyxcbiAgICAgICAgICAgICAgZGF0ZTogJzIwMTgtMDgtMTdUMTk6NDg6MDBaJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21taXR0ZXI6IHtcbiAgICAgICAgICAgICAgbmFtZTogJ0lzYWFjIE11cmNoaWUnLFxuICAgICAgICAgICAgICBlbWFpbDogJ2lzYWFjQHNhdWNlbGFicy5jb20nLFxuICAgICAgICAgICAgICBkYXRlOiAnMjAxOC0wOC0xN1QxOTo0ODowMFonLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICd2MS45LjAtYmV0YS4xJyxcbiAgICAgICAgICAgIHRyZWU6IHtcbiAgICAgICAgICAgICAgc2hhOiAnMmMwOTc0NzI3NDcwZWJhNDE5ZWEwYjk5NTFjNTJmNzJmODAzNmIxOCcsXG4gICAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXBwaXVtL2FwcGl1bS9naXQvdHJlZXMvMmMwOTc0NzI3NDcwZWJhNDE5ZWEwYjk5NTFjNTJmNzJmODAzNmIxOCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hcHBpdW0vYXBwaXVtL2dpdC9jb21taXRzLzNjMjc1MmY5ZjljNTYwMDA3MDVhNGFlMTViM2JhNjhhNWQyZTY0NGMnLFxuICAgICAgICAgICAgY29tbWVudF9jb3VudDogMCxcbiAgICAgICAgICAgIHZlcmlmaWNhdGlvbjoge1xuICAgICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXG4gICAgICAgICAgICAgIHJlYXNvbjogJ3Vuc2lnbmVkJyxcbiAgICAgICAgICAgICAgc2lnbmF0dXJlOiBudWxsLFxuICAgICAgICAgICAgICBwYXlsb2FkOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVybDogJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXBwaXVtL2FwcGl1bS9jb21taXRzLzNjMjc1MmY5ZjljNTYwMDA3MDVhNGFlMTViM2JhNjhhNWQyZTY0NGMnLFxuICAgICAgICAgIGh0bWxfdXJsOlxuICAgICAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2NvbW1pdC8zYzI3NTJmOWY5YzU2MDAwNzA1YTRhZTE1YjNiYTY4YTVkMmU2NDRjJyxcbiAgICAgICAgICBjb21tZW50c191cmw6XG4gICAgICAgICAgICAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hcHBpdW0vYXBwaXVtL2NvbW1pdHMvM2MyNzUyZjlmOWM1NjAwMDcwNWE0YWUxNWIzYmE2OGE1ZDJlNjQ0Yy9jb21tZW50cycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHZlcmlmeUJ1aWxkSW5mb1VwZGF0ZShmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvY29uZmlnLWUyZS1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
@@ -1,191 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- require("source-map-support/register");
6
-
7
- var _configFile = require("../lib/config-file");
8
-
9
- var _schema = require("../lib/schema/schema");
10
-
11
- var _driverSchema = _interopRequireDefault(require("./fixtures/driver.schema.js"));
12
-
13
- var _helpers = require("./helpers");
14
-
15
- describe('config file behavior', function () {
16
- const GOOD_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.good.json');
17
- const BAD_NODECONFIG_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.bad-nodeconfig.json');
18
- const BAD_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.bad.json');
19
- const INVALID_JSON_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.invalid.json');
20
- const SECURITY_ARRAY_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.security-array.json');
21
- const SECURITY_DELIMITED_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.security-delimited.json');
22
- const SECURITY_PATH_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.security-path.json');
23
- const UNKNOWN_PROPS_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.ext-unknown-props.json');
24
- const EXT_PROPS_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.ext-good.json');
25
- beforeEach(function () {
26
- (0, _schema.finalizeSchema)();
27
- });
28
- afterEach(function () {
29
- (0, _schema.resetSchema)();
30
- });
31
- describe('when provided a path to a config file', function () {
32
- describe('when the config file is valid per the schema', function () {
33
- it('should return a valid config object', async function () {
34
- const result = await (0, _configFile.readConfigFile)(GOOD_FILEPATH);
35
- result.should.deep.equal({
36
- config: require(GOOD_FILEPATH),
37
- filepath: GOOD_FILEPATH,
38
- errors: []
39
- });
40
- });
41
- describe('server.nodeconfig behavior', function () {
42
- describe('when a string', function () {
43
- it('should return errors', async function () {
44
- const result = await (0, _configFile.readConfigFile)(BAD_NODECONFIG_FILEPATH);
45
- result.should.have.nested.property('errors[0].instancePath', '/server/nodeconfig');
46
- });
47
- });
48
- describe('when an object', function () {
49
- it('should return a valid config object', async function () {
50
- const result = await (0, _configFile.readConfigFile)(GOOD_FILEPATH);
51
- result.should.have.property('errors').that.is.empty;
52
- });
53
- });
54
- });
55
- describe('server.allow-insecure behavior', function () {
56
- describe('when a string path', function () {
57
- it('should return errors', async function () {
58
- const result = await (0, _configFile.readConfigFile)(SECURITY_PATH_FILEPATH);
59
- result.should.have.nested.property('errors[0].instancePath', '/server/allow-insecure');
60
- });
61
- });
62
- describe('when a comma-delimited string', function () {
63
- it('should return errors', async function () {
64
- const result = await (0, _configFile.readConfigFile)(SECURITY_DELIMITED_FILEPATH);
65
- result.should.have.nested.property('errors[0].instancePath', '/server/allow-insecure');
66
- });
67
- });
68
- describe('when an array', function () {
69
- it('should return a valid config object', async function () {
70
- const result = await (0, _configFile.readConfigFile)(SECURITY_ARRAY_FILEPATH);
71
- result.should.deep.equal({
72
- config: require(SECURITY_ARRAY_FILEPATH),
73
- filepath: SECURITY_ARRAY_FILEPATH,
74
- errors: []
75
- });
76
- });
77
- });
78
- });
79
- });
80
- describe('when the config file is invalid per the schema', function () {
81
- describe('without extensions', function () {
82
- it('should return an object containing errors', async function () {
83
- const result = await (0, _configFile.readConfigFile)(BAD_FILEPATH);
84
- result.should.have.deep.property('config', (0, _configFile.normalizeConfig)(require(BAD_FILEPATH)));
85
- result.should.have.property('filepath', BAD_FILEPATH);
86
- result.should.have.deep.property('errors').that.contains.members([{
87
- instancePath: '',
88
- schemaPath: '#/additionalProperties',
89
- keyword: 'additionalProperties',
90
- params: {
91
- additionalProperty: 'appium-home'
92
- },
93
- message: 'must NOT have additional properties',
94
- isIdentifierLocation: true
95
- }, {
96
- instancePath: '/server/allow-cors',
97
- schemaPath: '#/properties/server/properties/allow-cors/type',
98
- keyword: 'type',
99
- params: {
100
- type: 'boolean'
101
- },
102
- message: 'must be boolean'
103
- }, {
104
- instancePath: '/server/allow-insecure',
105
- schemaPath: '#/properties/server/properties/allow-insecure/type',
106
- keyword: 'type',
107
- params: {
108
- type: 'array'
109
- },
110
- message: 'must be array'
111
- }, {
112
- instancePath: '/server/callback-port',
113
- schemaPath: '#/properties/server/properties/callback-port/maximum',
114
- keyword: 'maximum',
115
- params: {
116
- comparison: '<=',
117
- limit: 65535
118
- },
119
- message: 'must be <= 65535'
120
- }, {
121
- instancePath: '/server/log-level',
122
- schemaPath: '#/properties/server/properties/log-level/enum',
123
- keyword: 'enum',
124
- params: {
125
- allowedValues: ['info', 'info:debug', 'info:info', 'info:warn', 'info:error', 'warn', 'warn:debug', 'warn:info', 'warn:warn', 'warn:error', 'error', 'error:debug', 'error:info', 'error:warn', 'error:error', 'debug', 'debug:debug', 'debug:info', 'debug:warn', 'debug:error']
126
- },
127
- message: 'must be equal to one of the allowed values'
128
- }, {
129
- instancePath: '/server/log-no-colors',
130
- schemaPath: '#/properties/server/properties/log-no-colors/type',
131
- keyword: 'type',
132
- params: {
133
- type: 'boolean'
134
- },
135
- message: 'must be boolean'
136
- }, {
137
- instancePath: '/server/port',
138
- schemaPath: '#/properties/server/properties/port/type',
139
- keyword: 'type',
140
- params: {
141
- type: 'integer'
142
- },
143
- message: 'must be integer'
144
- }]).and.lengthOf(7);
145
- result.should.have.property('reason').that.is.a.string;
146
- });
147
- });
148
- describe('with extensions', function () {
149
- let result;
150
- beforeEach(function () {
151
- (0, _schema.resetSchema)();
152
- (0, _schema.registerSchema)('driver', 'fake', _driverSchema.default);
153
- (0, _schema.finalizeSchema)();
154
- });
155
- describe('when provided a config file with unknown properties', function () {
156
- beforeEach(async function () {
157
- result = await (0, _configFile.readConfigFile)(UNKNOWN_PROPS_FILEPATH);
158
- });
159
- it('should return an object containing errors', function () {
160
- result.should.have.deep.property('errors', [{
161
- instancePath: '/server/driver/fake',
162
- schemaPath: 'driver-fake.json/additionalProperties',
163
- keyword: 'additionalProperties',
164
- params: {
165
- additionalProperty: 'bubb'
166
- },
167
- message: 'must NOT have additional properties',
168
- isIdentifierLocation: true
169
- }]);
170
- });
171
- });
172
- describe('when provided a config file with valid properties', function () {
173
- beforeEach(async function () {
174
- result = await (0, _configFile.readConfigFile)(EXT_PROPS_FILEPATH);
175
- });
176
- it('should return an object containing no errors', function () {
177
- result.should.have.deep.property('errors', []);
178
- });
179
- });
180
- });
181
- });
182
- describe('when the config file is invalid JSON', function () {
183
- it('should reject with a user-friendly error message', async function () {
184
- await (0, _configFile.readConfigFile)(INVALID_JSON_FILEPATH).should.be.rejectedWith(new RegExp(`${INVALID_JSON_FILEPATH} is invalid`));
185
- });
186
- });
187
- });
188
- });require('source-map-support').install();
189
-
190
-
191
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY29uZmlnLWZpbGUtZTJlLXNwZWNzLmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiR09PRF9GSUxFUEFUSCIsIkJBRF9OT0RFQ09ORklHX0ZJTEVQQVRIIiwiQkFEX0ZJTEVQQVRIIiwiSU5WQUxJRF9KU09OX0ZJTEVQQVRIIiwiU0VDVVJJVFlfQVJSQVlfRklMRVBBVEgiLCJTRUNVUklUWV9ERUxJTUlURURfRklMRVBBVEgiLCJTRUNVUklUWV9QQVRIX0ZJTEVQQVRIIiwiVU5LTk9XTl9QUk9QU19GSUxFUEFUSCIsIkVYVF9QUk9QU19GSUxFUEFUSCIsImJlZm9yZUVhY2giLCJhZnRlckVhY2giLCJpdCIsInJlc3VsdCIsInNob3VsZCIsImRlZXAiLCJlcXVhbCIsImNvbmZpZyIsInJlcXVpcmUiLCJmaWxlcGF0aCIsImVycm9ycyIsImhhdmUiLCJuZXN0ZWQiLCJwcm9wZXJ0eSIsInRoYXQiLCJpcyIsImVtcHR5IiwiY29udGFpbnMiLCJtZW1iZXJzIiwiaW5zdGFuY2VQYXRoIiwic2NoZW1hUGF0aCIsImtleXdvcmQiLCJwYXJhbXMiLCJhZGRpdGlvbmFsUHJvcGVydHkiLCJtZXNzYWdlIiwiaXNJZGVudGlmaWVyTG9jYXRpb24iLCJ0eXBlIiwiY29tcGFyaXNvbiIsImxpbWl0IiwiYWxsb3dlZFZhbHVlcyIsImFuZCIsImxlbmd0aE9mIiwiYSIsInN0cmluZyIsImV4dFNjaGVtYSIsImJlIiwicmVqZWN0ZWRXaXRoIiwiUmVnRXhwIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQUEsUUFBUSxDQUFDLHNCQUFELEVBQXlCLFlBQVk7QUFDM0MsUUFBTUMsYUFBYSxHQUFHLDZCQUFlLFFBQWYsRUFBeUIseUJBQXpCLENBQXRCO0FBQ0EsUUFBTUMsdUJBQXVCLEdBQUcsNkJBQzlCLFFBRDhCLEVBRTlCLG1DQUY4QixDQUFoQztBQUlBLFFBQU1DLFlBQVksR0FBRyw2QkFBZSxRQUFmLEVBQXlCLHdCQUF6QixD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TyxDQUFSO0FBc0NELEtBMUlPLENBQVI7QUE0SUF2QixJQUFBQSxRQUFRLENBQUMsc0NBQUQsRUFBeUMsWUFBWTtBQUMzRFksTUFBQUEsRUFBRSxDQUFDLGtEQUFELEVBQXFELGtCQUFrQjtBQUN2RSxjQUFNLGdDQUFlUixxQkFBZixFQUFzQ1UsTUFBdEMsQ0FBNkMrQixFQUE3QyxDQUFnREMsWUFBaEQsQ0FDSixJQUFJQyxNQUFKLENBQVksR0FBRTNDLHFCQUFzQixhQUFwQyxDQURJLENBQU47QUFHRCxPQUpDLENBQUY7QUFLRCxLQU5PLENBQVI7QUFPRCxHQW5OTyxDQUFSO0FBb05ELENBN1BPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHsgcmVhZENvbmZpZ0ZpbGUsIG5vcm1hbGl6ZUNvbmZpZyB9IGZyb20gJy4uL2xpYi9jb25maWctZmlsZSc7XG5pbXBvcnQgeyBmaW5hbGl6ZVNjaGVtYSwgcmVnaXN0ZXJTY2hlbWEsIHJlc2V0U2NoZW1hIH0gZnJvbSAnLi4vbGliL3NjaGVtYS9zY2hlbWEnO1xuaW1wb3J0IGV4dFNjaGVtYSBmcm9tICcuL2ZpeHR1cmVzL2RyaXZlci5zY2hlbWEuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUZpeHR1cmUgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5kZXNjcmliZSgnY29uZmlnIGZpbGUgYmVoYXZpb3InLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IEdPT0RfRklMRVBBVEggPSByZXNvbHZlRml4dHVyZSgnY29uZmlnJywgJ2FwcGl1bS5jb25maWcuZ29vZC5qc29uJyk7XG4gIGNvbnN0IEJBRF9OT0RFQ09ORklHX0ZJTEVQQVRIID0gcmVzb2x2ZUZpeHR1cmUoXG4gICAgJ2NvbmZpZycsXG4gICAgJ2FwcGl1bS5jb25maWcuYmFkLW5vZGVjb25maWcuanNvbicsXG4gICk7XG4gIGNvbnN0IEJBRF9GSUxFUEFUSCA9IHJlc29sdmVGaXh0dXJlKCdjb25maWcnLCAnYXBwaXVtLmNvbmZpZy5iYWQuanNvbicpO1xuICBjb25zdCBJTlZBTElEX0pTT05fRklMRVBBVEggPSByZXNvbHZlRml4dHVyZShcbiAgICAnY29uZmlnJyxcbiAgICAnYXBwaXVtLmNvbmZpZy5pbnZhbGlkLmpzb24nLFxuICApO1xuICBjb25zdCBTRUNVUklUWV9BUlJBWV9GSUxFUEFUSCA9IHJlc29sdmVGaXh0dXJlKFxuICAgICdjb25maWcnLFxuICAgICdhcHBpdW0uY29uZmlnLnNlY3VyaXR5LWFycmF5Lmpzb24nLFxuICApO1xuICBjb25zdCBTRUNVUklUWV9ERUxJTUlURURfRklMRVBBVEggPSByZXNvbHZlRml4dHVyZShcbiAgICAnY29uZmlnJyxcbiAgICAnYXBwaXVtLmNvbmZpZy5zZWN1cml0eS1kZWxpbWl0ZWQuanNvbicsXG4gICk7XG4gIGNvbnN0IFNFQ1VSSVRZX1BBVEhfRklMRVBBVEggPSByZXNvbHZlRml4dHVyZShcbiAgICAnY29uZmlnJyxcbiAgICAnYXBwaXVtLmNvbmZpZy5zZWN1cml0eS1wYXRoLmpzb24nLFxuICApO1xuICBjb25zdCBVTktOT1dOX1BST1BTX0ZJTEVQQVRIID0gcmVzb2x2ZUZpeHR1cmUoXG4gICAgJ2NvbmZpZycsXG4gICAgJ2FwcGl1bS5jb25maWcuZXh0LXVua25vd24tcHJvcHMuanNvbicsXG4gICk7XG4gIGNvbnN0IEVYVF9QUk9QU19GSUxFUEFUSCA9IHJlc29sdmVGaXh0dXJlKFxuICAgICdjb25maWcnLFxuICAgICdhcHBpdW0uY29uZmlnLmV4dC1nb29kLmpzb24nLFxuICApO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGZpbmFsaXplU2NoZW1hKCk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgcmVzZXRTY2hlbWEoKTtcbiAgfSk7XG5cblxuICBkZXNjcmliZSgnd2hlbiBwcm92aWRlZCBhIHBhdGggdG8gYSBjb25maWcgZmlsZScsIGZ1bmN0aW9uICgpIHtcbiAgICBkZXNjcmliZSgnd2hlbiB0aGUgY29uZmlnIGZpbGUgaXMgdmFsaWQgcGVyIHRoZSBzY2hlbWEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHJldHVybiBhIHZhbGlkIGNvbmZpZyBvYmplY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRDb25maWdGaWxlKEdPT0RfRklMRVBBVEgpO1xuICAgICAgICByZXN1bHQuc2hvdWxkLmRlZXAuZXF1YWwoe1xuICAgICAgICAgIGNvbmZpZzogcmVxdWlyZShHT09EX0ZJTEVQQVRIKSxcbiAgICAgICAgICBmaWxlcGF0aDogR09PRF9GSUxFUEFUSCxcbiAgICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnc2VydmVyLm5vZGVjb25maWcgYmVoYXZpb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlc2NyaWJlKCd3aGVuIGEgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGVycm9ycycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRDb25maWdGaWxlKEJBRF9OT0RFQ09ORklHX0ZJTEVQQVRIKTtcbiAgICAgICAgICAgIHJlc3VsdC5zaG91bGQuaGF2ZS5uZXN0ZWQucHJvcGVydHkoXG4gICAgICAgICAgICAgICdlcnJvcnNbMF0uaW5zdGFuY2VQYXRoJyxcbiAgICAgICAgICAgICAgJy9zZXJ2ZXIvbm9kZWNvbmZpZycsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnd2hlbiBhbiBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSB2YWxpZCBjb25maWcgb2JqZWN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoR09PRF9GSUxFUEFUSCk7XG4gICAgICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2Vycm9ycycpLnRoYXQuaXMuZW1wdHk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCdzZXJ2ZXIuYWxsb3ctaW5zZWN1cmUgYmVoYXZpb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlc2NyaWJlKCd3aGVuIGEgc3RyaW5nIHBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gZXJyb3JzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoU0VDVVJJVFlfUEFUSF9GSUxFUEFUSCk7XG4gICAgICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUubmVzdGVkLnByb3BlcnR5KFxuICAgICAgICAgICAgICAnZXJyb3JzWzBdLmluc3RhbmNlUGF0aCcsXG4gICAgICAgICAgICAgICcvc2VydmVyL2FsbG93LWluc2VjdXJlJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCd3aGVuIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBlcnJvcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZShTRUNVUklUWV9ERUxJTUlURURfRklMRVBBVEgpO1xuICAgICAgICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLm5lc3RlZC5wcm9wZXJ0eShcbiAgICAgICAgICAgICAgJ2Vycm9yc1swXS5pbnN0YW5jZVBhdGgnLFxuICAgICAgICAgICAgICAnL3NlcnZlci9hbGxvdy1pbnNlY3VyZScsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnd2hlbiBhbiBhcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBhIHZhbGlkIGNvbmZpZyBvYmplY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZShTRUNVUklUWV9BUlJBWV9GSUxFUEFUSCk7XG4gICAgICAgICAgICByZXN1bHQuc2hvdWxkLmRlZXAuZXF1YWwoe1xuICAgICAgICAgICAgICBjb25maWc6IHJlcXVpcmUoU0VDVVJJVFlfQVJSQVlfRklMRVBBVEgpLFxuICAgICAgICAgICAgICBmaWxlcGF0aDogU0VDVVJJVFlfQVJSQVlfRklMRVBBVEgsXG4gICAgICAgICAgICAgIGVycm9yczogW10sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIHRoZSBjb25maWcgZmlsZSBpcyBpbnZhbGlkIHBlciB0aGUgc2NoZW1hJywgZnVuY3Rpb24gKCkge1xuICAgICAgZGVzY3JpYmUoJ3dpdGhvdXQgZXh0ZW5zaW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgZXJyb3JzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRDb25maWdGaWxlKEJBRF9GSUxFUEFUSCk7XG4gICAgICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLmRlZXAucHJvcGVydHkoJ2NvbmZpZycsIG5vcm1hbGl6ZUNvbmZpZyhyZXF1aXJlKEJBRF9GSUxFUEFUSCkpKTtcbiAgICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2ZpbGVwYXRoJywgQkFEX0ZJTEVQQVRIKTtcbiAgICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUuZGVlcC5wcm9wZXJ0eSgnZXJyb3JzJykudGhhdC5jb250YWlucy5tZW1iZXJzKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiAnJyxcbiAgICAgICAgICAgICAgc2NoZW1hUGF0aDogJyMvYWRkaXRpb25hbFByb3BlcnRpZXMnLFxuICAgICAgICAgICAgICBrZXl3b3JkOiAnYWRkaXRpb25hbFByb3BlcnRpZXMnLFxuICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydHk6ICdhcHBpdW0taG9tZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdtdXN0IE5PVCBoYXZlIGFkZGl0aW9uYWwgcHJvcGVydGllcycsXG4gICAgICAgICAgICAgIGlzSWRlbnRpZmllckxvY2F0aW9uOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiAnL3NlcnZlci9hbGxvdy1jb3JzJyxcbiAgICAgICAgICAgICAgc2NoZW1hUGF0aDogJyMvcHJvcGVydGllcy9zZXJ2ZXIvcHJvcGVydGllcy9hbGxvdy1jb3JzL3R5cGUnLFxuICAgICAgICAgICAgICBrZXl3b3JkOiAndHlwZScsXG4gICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ211c3QgYmUgYm9vbGVhbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6ICcvc2VydmVyL2FsbG93LWluc2VjdXJlJyxcbiAgICAgICAgICAgICAgc2NoZW1hUGF0aDogJyMvcHJvcGVydGllcy9zZXJ2ZXIvcHJvcGVydGllcy9hbGxvdy1pbnNlY3VyZS90eXBlJyxcbiAgICAgICAgICAgICAga2V5d29yZDogJ3R5cGUnLFxuICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdtdXN0IGJlIGFycmF5JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogJy9zZXJ2ZXIvY2FsbGJhY2stcG9ydCcsXG4gICAgICAgICAgICAgIHNjaGVtYVBhdGg6XG4gICAgICAgICAgICAgICAgJyMvcHJvcGVydGllcy9zZXJ2ZXIvcHJvcGVydGllcy9jYWxsYmFjay1wb3J0L21heGltdW0nLFxuICAgICAgICAgICAgICBrZXl3b3JkOiAnbWF4aW11bScsXG4gICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIGNvbXBhcmlzb246ICc8PScsXG4gICAgICAgICAgICAgICAgbGltaXQ6IDY1NTM1LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnbXVzdCBiZSA8PSA2NTUzNScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6ICcvc2VydmVyL2xvZy1sZXZlbCcsXG4gICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICcjL3Byb3BlcnRpZXMvc2VydmVyL3Byb3BlcnRpZXMvbG9nLWxldmVsL2VudW0nLFxuICAgICAgICAgICAgICBrZXl3b3JkOiAnZW51bScsXG4gICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICdpbmZvJyxcbiAgICAgICAgICAgICAgICAgICdpbmZvOmRlYnVnJyxcbiAgICAgICAgICAgICAgICAgICdpbmZvOmluZm8nLFxuICAgICAgICAgICAgICAgICAgJ2luZm86d2FybicsXG4gICAgICAgICAgICAgICAgICAnaW5mbzplcnJvcicsXG4gICAgICAgICAgICAgICAgICAnd2FybicsXG4gICAgICAgICAgICAgICAgICAnd2FybjpkZWJ1ZycsXG4gICAgICAgICAgICAgICAgICAnd2FybjppbmZvJyxcbiAgICAgICAgICAgICAgICAgICd3YXJuOndhcm4nLFxuICAgICAgICAgICAgICAgICAgJ3dhcm46ZXJyb3InLFxuICAgICAgICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICdlcnJvcjpkZWJ1ZycsXG4gICAgICAgICAgICAgICAgICAnZXJyb3I6aW5mbycsXG4gICAgICAgICAgICAgICAgICAnZXJyb3I6d2FybicsXG4gICAgICAgICAgICAgICAgICAnZXJyb3I6ZXJyb3InLFxuICAgICAgICAgICAgICAgICAgJ2RlYnVnJyxcbiAgICAgICAgICAgICAgICAgICdkZWJ1ZzpkZWJ1ZycsXG4gICAgICAgICAgICAgICAgICAnZGVidWc6aW5mbycsXG4gICAgICAgICAgICAgICAgICAnZGVidWc6d2FybicsXG4gICAgICAgICAgICAgICAgICAnZGVidWc6ZXJyb3InLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdtdXN0IGJlIGVxdWFsIHRvIG9uZSBvZiB0aGUgYWxsb3dlZCB2YWx1ZXMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiAnL3NlcnZlci9sb2ctbm8tY29sb3JzJyxcbiAgICAgICAgICAgICAgc2NoZW1hUGF0aDogJyMvcHJvcGVydGllcy9zZXJ2ZXIvcHJvcGVydGllcy9sb2ctbm8tY29sb3JzL3R5cGUnLFxuICAgICAgICAgICAgICBrZXl3b3JkOiAndHlwZScsXG4gICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ211c3QgYmUgYm9vbGVhbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6ICcvc2VydmVyL3BvcnQnLFxuICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAnIy9wcm9wZXJ0aWVzL3NlcnZlci9wcm9wZXJ0aWVzL3BvcnQvdHlwZScsXG4gICAgICAgICAgICAgIGtleXdvcmQ6ICd0eXBlJyxcbiAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2ludGVnZXInLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnbXVzdCBiZSBpbnRlZ2VyJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSkuYW5kLmxlbmd0aE9mKDcpO1xuXG4gICAgICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLnByb3BlcnR5KCdyZWFzb24nKS50aGF0LmlzLmEuc3RyaW5nO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnd2l0aCBleHRlbnNpb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAvKiogQHR5cGUge2ltcG9ydCgnLi4vbGliL2NvbmZpZy1maWxlJykuUmVhZENvbmZpZ0ZpbGVSZXN1bHR9ICovXG4gICAgICAgIGxldCByZXN1bHQ7XG5cbiAgICAgICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmVzZXRTY2hlbWEoKTtcbiAgICAgICAgICByZWdpc3RlclNjaGVtYSgnZHJpdmVyJywgJ2Zha2UnLCBleHRTY2hlbWEpO1xuICAgICAgICAgIGZpbmFsaXplU2NoZW1hKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGEgY29uZmlnIGZpbGUgd2l0aCB1bmtub3duIHByb3BlcnRpZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYmVmb3JlRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZShVTktOT1dOX1BST1BTX0ZJTEVQQVRIKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBlcnJvcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUuZGVlcC5wcm9wZXJ0eSgnZXJyb3JzJywgW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiAnL3NlcnZlci9kcml2ZXIvZmFrZScsXG4gICAgICAgICAgICAgICAgc2NoZW1hUGF0aDpcbiAgICAgICAgICAgICAgICAgICdkcml2ZXItZmFrZS5qc29uL2FkZGl0aW9uYWxQcm9wZXJ0aWVzJyxcbiAgICAgICAgICAgICAgICBrZXl3b3JkOiAnYWRkaXRpb25hbFByb3BlcnRpZXMnLFxuICAgICAgICAgICAgICAgIHBhcmFtczoge2FkZGl0aW9uYWxQcm9wZXJ0eTogJ2J1YmInfSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnbXVzdCBOT1QgaGF2ZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMnLFxuICAgICAgICAgICAgICAgIGlzSWRlbnRpZmllckxvY2F0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGEgY29uZmlnIGZpbGUgd2l0aCB2YWxpZCBwcm9wZXJ0aWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoRVhUX1BST1BTX0ZJTEVQQVRIKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBubyBlcnJvcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUuZGVlcC5wcm9wZXJ0eSgnZXJyb3JzJywgW10pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3doZW4gdGhlIGNvbmZpZyBmaWxlIGlzIGludmFsaWQgSlNPTicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgcmVqZWN0IHdpdGggYSB1c2VyLWZyaWVuZGx5IGVycm9yIG1lc3NhZ2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IHJlYWRDb25maWdGaWxlKElOVkFMSURfSlNPTl9GSUxFUEFUSCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICBuZXcgUmVnRXhwKGAke0lOVkFMSURfSlNPTl9GSUxFUEFUSH0gaXMgaW52YWxpZGApLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvY29uZmlnLWZpbGUtZTJlLXNwZWNzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=