parse-server 2.8.4 → 8.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/LICENSE +167 -25
  2. package/NOTICE +10 -0
  3. package/README.md +929 -278
  4. package/lib/AccountLockout.js +47 -30
  5. package/lib/Adapters/AdapterLoader.js +21 -6
  6. package/lib/Adapters/Analytics/AnalyticsAdapter.js +15 -12
  7. package/lib/Adapters/Auth/AuthAdapter.js +116 -13
  8. package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +99 -0
  9. package/lib/Adapters/Auth/OAuth1Client.js +27 -46
  10. package/lib/Adapters/Auth/apple.js +123 -0
  11. package/lib/Adapters/Auth/facebook.js +162 -35
  12. package/lib/Adapters/Auth/gcenter.js +217 -0
  13. package/lib/Adapters/Auth/github.js +118 -48
  14. package/lib/Adapters/Auth/google.js +160 -51
  15. package/lib/Adapters/Auth/gpgames.js +125 -0
  16. package/lib/Adapters/Auth/httpsRequest.js +6 -7
  17. package/lib/Adapters/Auth/index.js +170 -62
  18. package/lib/Adapters/Auth/instagram.js +114 -40
  19. package/lib/Adapters/Auth/janraincapture.js +52 -23
  20. package/lib/Adapters/Auth/janrainengage.js +19 -36
  21. package/lib/Adapters/Auth/keycloak.js +148 -0
  22. package/lib/Adapters/Auth/ldap.js +167 -0
  23. package/lib/Adapters/Auth/line.js +125 -0
  24. package/lib/Adapters/Auth/linkedin.js +111 -55
  25. package/lib/Adapters/Auth/meetup.js +24 -34
  26. package/lib/Adapters/Auth/mfa.js +324 -0
  27. package/lib/Adapters/Auth/microsoft.js +111 -0
  28. package/lib/Adapters/Auth/oauth2.js +97 -162
  29. package/lib/Adapters/Auth/phantauth.js +53 -0
  30. package/lib/Adapters/Auth/qq.js +108 -49
  31. package/lib/Adapters/Auth/spotify.js +107 -55
  32. package/lib/Adapters/Auth/twitter.js +188 -48
  33. package/lib/Adapters/Auth/utils.js +28 -0
  34. package/lib/Adapters/Auth/vkontakte.js +26 -39
  35. package/lib/Adapters/Auth/wechat.js +106 -44
  36. package/lib/Adapters/Auth/weibo.js +132 -58
  37. package/lib/Adapters/Cache/CacheAdapter.js +13 -8
  38. package/lib/Adapters/Cache/InMemoryCache.js +3 -13
  39. package/lib/Adapters/Cache/InMemoryCacheAdapter.js +5 -13
  40. package/lib/Adapters/Cache/LRUCache.js +13 -27
  41. package/lib/Adapters/Cache/NullCacheAdapter.js +3 -8
  42. package/lib/Adapters/Cache/RedisCacheAdapter.js +85 -76
  43. package/lib/Adapters/Cache/SchemaCache.js +25 -0
  44. package/lib/Adapters/Email/MailAdapter.js +10 -8
  45. package/lib/Adapters/Files/FilesAdapter.js +83 -25
  46. package/lib/Adapters/Files/GridFSBucketAdapter.js +231 -0
  47. package/lib/Adapters/Files/GridStoreAdapter.js +4 -91
  48. package/lib/Adapters/Logger/LoggerAdapter.js +18 -14
  49. package/lib/Adapters/Logger/WinstonLogger.js +69 -88
  50. package/lib/Adapters/Logger/WinstonLoggerAdapter.js +7 -16
  51. package/lib/Adapters/MessageQueue/EventEmitterMQ.js +8 -26
  52. package/lib/Adapters/PubSub/EventEmitterPubSub.js +12 -25
  53. package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
  54. package/lib/Adapters/PubSub/RedisPubSub.js +42 -19
  55. package/lib/Adapters/Push/PushAdapter.js +14 -7
  56. package/lib/Adapters/Storage/Mongo/MongoCollection.js +137 -45
  57. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +158 -63
  58. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +320 -168
  59. package/lib/Adapters/Storage/Mongo/MongoTransform.js +279 -306
  60. package/lib/Adapters/Storage/Postgres/PostgresClient.js +14 -10
  61. package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +47 -21
  62. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +854 -468
  63. package/lib/Adapters/Storage/Postgres/sql/index.js +4 -6
  64. package/lib/Adapters/Storage/StorageAdapter.js +1 -1
  65. package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
  66. package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
  67. package/lib/Auth.js +488 -125
  68. package/lib/ClientSDK.js +2 -6
  69. package/lib/Config.js +525 -94
  70. package/lib/Controllers/AdaptableController.js +5 -25
  71. package/lib/Controllers/AnalyticsController.js +22 -23
  72. package/lib/Controllers/CacheController.js +10 -31
  73. package/lib/Controllers/DatabaseController.js +767 -313
  74. package/lib/Controllers/FilesController.js +49 -54
  75. package/lib/Controllers/HooksController.js +80 -84
  76. package/lib/Controllers/LiveQueryController.js +35 -22
  77. package/lib/Controllers/LoggerController.js +22 -58
  78. package/lib/Controllers/ParseGraphQLController.js +293 -0
  79. package/lib/Controllers/PushController.js +58 -49
  80. package/lib/Controllers/SchemaController.js +916 -422
  81. package/lib/Controllers/UserController.js +265 -180
  82. package/lib/Controllers/index.js +90 -125
  83. package/lib/Controllers/types.js +1 -1
  84. package/lib/Deprecator/Deprecations.js +30 -0
  85. package/lib/Deprecator/Deprecator.js +127 -0
  86. package/lib/Error.js +48 -0
  87. package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
  88. package/lib/GraphQL/ParseGraphQLServer.js +214 -0
  89. package/lib/GraphQL/helpers/objectsMutations.js +30 -0
  90. package/lib/GraphQL/helpers/objectsQueries.js +246 -0
  91. package/lib/GraphQL/loaders/configMutations.js +87 -0
  92. package/lib/GraphQL/loaders/configQueries.js +79 -0
  93. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
  94. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
  95. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1098 -0
  96. package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
  97. package/lib/GraphQL/loaders/filesMutations.js +107 -0
  98. package/lib/GraphQL/loaders/functionsMutations.js +78 -0
  99. package/lib/GraphQL/loaders/parseClassMutations.js +268 -0
  100. package/lib/GraphQL/loaders/parseClassQueries.js +127 -0
  101. package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
  102. package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
  103. package/lib/GraphQL/loaders/schemaMutations.js +162 -0
  104. package/lib/GraphQL/loaders/schemaQueries.js +81 -0
  105. package/lib/GraphQL/loaders/schemaTypes.js +341 -0
  106. package/lib/GraphQL/loaders/usersMutations.js +433 -0
  107. package/lib/GraphQL/loaders/usersQueries.js +90 -0
  108. package/lib/GraphQL/parseGraphQLUtils.js +63 -0
  109. package/lib/GraphQL/transformers/className.js +14 -0
  110. package/lib/GraphQL/transformers/constraintType.js +53 -0
  111. package/lib/GraphQL/transformers/inputType.js +51 -0
  112. package/lib/GraphQL/transformers/mutation.js +274 -0
  113. package/lib/GraphQL/transformers/outputType.js +51 -0
  114. package/lib/GraphQL/transformers/query.js +237 -0
  115. package/lib/GraphQL/transformers/schemaFields.js +99 -0
  116. package/lib/KeyPromiseQueue.js +48 -0
  117. package/lib/LiveQuery/Client.js +25 -33
  118. package/lib/LiveQuery/Id.js +2 -5
  119. package/lib/LiveQuery/ParseCloudCodePublisher.js +26 -23
  120. package/lib/LiveQuery/ParseLiveQueryServer.js +560 -285
  121. package/lib/LiveQuery/ParsePubSub.js +7 -16
  122. package/lib/LiveQuery/ParseWebSocketServer.js +42 -39
  123. package/lib/LiveQuery/QueryTools.js +76 -15
  124. package/lib/LiveQuery/RequestSchema.js +111 -97
  125. package/lib/LiveQuery/SessionTokenCache.js +23 -36
  126. package/lib/LiveQuery/Subscription.js +8 -17
  127. package/lib/LiveQuery/equalObjects.js +2 -3
  128. package/lib/Options/Definitions.js +1355 -382
  129. package/lib/Options/docs.js +301 -62
  130. package/lib/Options/index.js +11 -1
  131. package/lib/Options/parsers.js +14 -10
  132. package/lib/Page.js +44 -0
  133. package/lib/ParseMessageQueue.js +6 -13
  134. package/lib/ParseServer.js +474 -235
  135. package/lib/ParseServerRESTController.js +102 -40
  136. package/lib/PromiseRouter.js +39 -50
  137. package/lib/Push/PushQueue.js +24 -30
  138. package/lib/Push/PushWorker.js +32 -56
  139. package/lib/Push/utils.js +22 -35
  140. package/lib/RestQuery.js +361 -139
  141. package/lib/RestWrite.js +713 -344
  142. package/lib/Routers/AggregateRouter.js +97 -71
  143. package/lib/Routers/AnalyticsRouter.js +8 -14
  144. package/lib/Routers/AudiencesRouter.js +16 -35
  145. package/lib/Routers/ClassesRouter.js +86 -72
  146. package/lib/Routers/CloudCodeRouter.js +28 -37
  147. package/lib/Routers/FeaturesRouter.js +22 -25
  148. package/lib/Routers/FilesRouter.js +266 -171
  149. package/lib/Routers/FunctionsRouter.js +87 -103
  150. package/lib/Routers/GlobalConfigRouter.js +94 -33
  151. package/lib/Routers/GraphQLRouter.js +41 -0
  152. package/lib/Routers/HooksRouter.js +43 -47
  153. package/lib/Routers/IAPValidationRouter.js +57 -70
  154. package/lib/Routers/InstallationsRouter.js +17 -25
  155. package/lib/Routers/LogsRouter.js +10 -25
  156. package/lib/Routers/PagesRouter.js +647 -0
  157. package/lib/Routers/PublicAPIRouter.js +104 -112
  158. package/lib/Routers/PurgeRouter.js +19 -29
  159. package/lib/Routers/PushRouter.js +14 -28
  160. package/lib/Routers/RolesRouter.js +7 -14
  161. package/lib/Routers/SchemasRouter.js +63 -42
  162. package/lib/Routers/SecurityRouter.js +34 -0
  163. package/lib/Routers/SessionsRouter.js +25 -38
  164. package/lib/Routers/UsersRouter.js +463 -190
  165. package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
  166. package/lib/SchemaMigrations/Migrations.js +30 -0
  167. package/lib/Security/Check.js +109 -0
  168. package/lib/Security/CheckGroup.js +44 -0
  169. package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
  170. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +96 -0
  171. package/lib/Security/CheckGroups/CheckGroups.js +21 -0
  172. package/lib/Security/CheckRunner.js +213 -0
  173. package/lib/SharedRest.js +29 -0
  174. package/lib/StatusHandler.js +96 -93
  175. package/lib/TestUtils.js +70 -14
  176. package/lib/Utils.js +468 -0
  177. package/lib/batch.js +74 -40
  178. package/lib/cache.js +8 -8
  179. package/lib/cli/definitions/parse-live-query-server.js +4 -3
  180. package/lib/cli/definitions/parse-server.js +4 -3
  181. package/lib/cli/parse-live-query-server.js +9 -17
  182. package/lib/cli/parse-server.js +49 -47
  183. package/lib/cli/utils/commander.js +20 -29
  184. package/lib/cli/utils/runner.js +31 -32
  185. package/lib/cloud-code/Parse.Cloud.js +711 -36
  186. package/lib/cloud-code/Parse.Server.js +21 -0
  187. package/lib/cryptoUtils.js +6 -11
  188. package/lib/defaults.js +21 -15
  189. package/lib/deprecated.js +1 -1
  190. package/lib/index.js +78 -67
  191. package/lib/logger.js +12 -20
  192. package/lib/middlewares.js +484 -160
  193. package/lib/password.js +10 -6
  194. package/lib/request.js +175 -0
  195. package/lib/requiredParameter.js +4 -3
  196. package/lib/rest.js +157 -82
  197. package/lib/triggers.js +627 -185
  198. package/lib/vendor/README.md +3 -3
  199. package/lib/vendor/mongodbUrl.js +224 -137
  200. package/package.json +135 -57
  201. package/postinstall.js +38 -50
  202. package/public_html/invalid_verification_link.html +3 -3
  203. package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
  204. package/types/@types/deepcopy/index.d.ts +5 -0
  205. package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
  206. package/types/Options/index.d.ts +301 -0
  207. package/types/ParseServer.d.ts +65 -0
  208. package/types/eslint.config.mjs +30 -0
  209. package/types/index.d.ts +21 -0
  210. package/types/logger.d.ts +2 -0
  211. package/types/tests.ts +44 -0
  212. package/types/tsconfig.json +24 -0
  213. package/CHANGELOG.md +0 -1246
  214. package/PATENTS +0 -37
  215. package/bin/dev +0 -37
  216. package/lib/.DS_Store +0 -0
  217. package/lib/Adapters/Auth/common.js +0 -2
  218. package/lib/Adapters/Auth/facebookaccountkit.js +0 -69
  219. package/lib/Controllers/SchemaCache.js +0 -97
  220. package/lib/LiveQuery/.DS_Store +0 -0
  221. package/lib/cli/utils/parsers.js +0 -77
  222. package/lib/cloud-code/.DS_Store +0 -0
  223. package/lib/cloud-code/HTTPResponse.js +0 -57
  224. package/lib/cloud-code/Untitled-1 +0 -123
  225. package/lib/cloud-code/httpRequest.js +0 -102
  226. package/lib/cloud-code/team.html +0 -123
  227. package/lib/graphql/ParseClass.js +0 -234
  228. package/lib/graphql/Schema.js +0 -197
  229. package/lib/graphql/index.js +0 -1
  230. package/lib/graphql/types/ACL.js +0 -35
  231. package/lib/graphql/types/Date.js +0 -25
  232. package/lib/graphql/types/File.js +0 -24
  233. package/lib/graphql/types/GeoPoint.js +0 -35
  234. package/lib/graphql/types/JSONObject.js +0 -30
  235. package/lib/graphql/types/NumberInput.js +0 -43
  236. package/lib/graphql/types/NumberQuery.js +0 -42
  237. package/lib/graphql/types/Pointer.js +0 -35
  238. package/lib/graphql/types/QueryConstraint.js +0 -61
  239. package/lib/graphql/types/StringQuery.js +0 -39
  240. package/lib/graphql/types/index.js +0 -110
@@ -1,20 +1,11 @@
1
- 'use strict';
2
-
3
- var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
4
-
5
- var _logger = require('../../../logger');
6
-
7
- var _logger2 = _interopRequireDefault(_logger);
8
-
9
- var _lodash = require('lodash');
10
-
11
- var _lodash2 = _interopRequireDefault(_lodash);
12
-
13
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1
+ "use strict";
14
2
 
3
+ var _logger = _interopRequireDefault(require("../../../logger"));
4
+ var _lodash = _interopRequireDefault(require("lodash"));
5
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
6
  var mongodb = require('mongodb');
16
7
  var Parse = require('parse/node').Parse;
17
-
8
+ const Utils = require('../../../Utils');
18
9
  const transformKey = (className, fieldName, schema) => {
19
10
  // Check if the schema is known since it's a built-in field.
20
11
  switch (fieldName) {
@@ -31,16 +22,13 @@ const transformKey = (className, fieldName, schema) => {
31
22
  case 'timesUsed':
32
23
  return 'times_used';
33
24
  }
34
-
35
25
  if (schema.fields[fieldName] && schema.fields[fieldName].__type == 'Pointer') {
36
26
  fieldName = '_p_' + fieldName;
37
27
  } else if (schema.fields[fieldName] && schema.fields[fieldName].type == 'Pointer') {
38
28
  fieldName = '_p_' + fieldName;
39
29
  }
40
-
41
30
  return fieldName;
42
31
  };
43
-
44
32
  const transformKeyValueForUpdate = (className, restKey, restValue, parseFormatSchema) => {
45
33
  // Check if the schema is known since it's a built-in field.
46
34
  var key = restKey;
@@ -48,7 +36,7 @@ const transformKeyValueForUpdate = (className, restKey, restValue, parseFormatSc
48
36
  switch (key) {
49
37
  case 'objectId':
50
38
  case '_id':
51
- if (className === '_GlobalConfig') {
39
+ if (['_GlobalConfig', '_GraphQLConfig'].includes(className)) {
52
40
  return {
53
41
  key: key,
54
42
  value: parseInt(restValue)
@@ -96,7 +84,10 @@ const transformKeyValueForUpdate = (className, restKey, restValue, parseFormatSc
96
84
  break;
97
85
  case '_rperm':
98
86
  case '_wperm':
99
- return { key: key, value: restValue };
87
+ return {
88
+ key: key,
89
+ value: restValue
90
+ };
100
91
  case 'lastUsed':
101
92
  case '_last_used':
102
93
  key = '_last_used';
@@ -108,8 +99,8 @@ const transformKeyValueForUpdate = (className, restKey, restValue, parseFormatSc
108
99
  timeField = true;
109
100
  break;
110
101
  }
111
-
112
- if (parseFormatSchema.fields[key] && parseFormatSchema.fields[key].type === 'Pointer' || !parseFormatSchema.fields[key] && restValue && restValue.__type == 'Pointer') {
102
+ if (parseFormatSchema.fields[key] && parseFormatSchema.fields[key].type === 'Pointer' || !key.includes('.') && !parseFormatSchema.fields[key] && restValue && restValue.__type == 'Pointer' // Do not use the _p_ prefix for pointers inside nested documents
103
+ ) {
113
104
  key = '_p_' + key;
114
105
  }
115
106
 
@@ -120,65 +111,71 @@ const transformKeyValueForUpdate = (className, restKey, restValue, parseFormatSc
120
111
  value = new Date(value);
121
112
  }
122
113
  if (restKey.indexOf('.') > 0) {
123
- return { key, value: restValue };
114
+ return {
115
+ key,
116
+ value: restValue
117
+ };
124
118
  }
125
- return { key, value };
119
+ return {
120
+ key,
121
+ value
122
+ };
126
123
  }
127
124
 
128
125
  // Handle arrays
129
126
  if (restValue instanceof Array) {
130
127
  value = restValue.map(transformInteriorValue);
131
- return { key, value };
128
+ return {
129
+ key,
130
+ value
131
+ };
132
132
  }
133
133
 
134
134
  // Handle update operators
135
135
  if (typeof restValue === 'object' && '__op' in restValue) {
136
- return { key, value: transformUpdateOperator(restValue, false) };
136
+ return {
137
+ key,
138
+ value: transformUpdateOperator(restValue, false)
139
+ };
137
140
  }
138
141
 
139
142
  // Handle normal objects by recursing
140
143
  value = mapValues(restValue, transformInteriorValue);
141
- return { key, value };
144
+ return {
145
+ key,
146
+ value
147
+ };
142
148
  };
143
-
144
149
  const isRegex = value => {
145
150
  return value && value instanceof RegExp;
146
151
  };
147
-
148
152
  const isStartsWithRegex = value => {
149
153
  if (!isRegex(value)) {
150
154
  return false;
151
155
  }
152
-
153
156
  const matches = value.toString().match(/\/\^\\Q.*\\E\//);
154
157
  return !!matches;
155
158
  };
156
-
157
159
  const isAllValuesRegexOrNone = values => {
158
160
  if (!values || !Array.isArray(values) || values.length === 0) {
159
161
  return true;
160
162
  }
161
-
162
163
  const firstValuesIsRegex = isStartsWithRegex(values[0]);
163
164
  if (values.length === 1) {
164
165
  return firstValuesIsRegex;
165
166
  }
166
-
167
167
  for (let i = 1, length = values.length; i < length; ++i) {
168
168
  if (firstValuesIsRegex !== isStartsWithRegex(values[i])) {
169
169
  return false;
170
170
  }
171
171
  }
172
-
173
172
  return true;
174
173
  };
175
-
176
174
  const isAnyValueRegex = values => {
177
175
  return values.some(function (value) {
178
176
  return isRegex(value);
179
177
  });
180
178
  };
181
-
182
179
  const transformInteriorValue = restValue => {
183
180
  if (restValue !== null && typeof restValue === 'object' && Object.keys(restValue).some(key => key.includes('$') || key.includes('.'))) {
184
181
  throw new Parse.Error(Parse.Error.INVALID_NESTED_KEY, "Nested keys should not contain the '$' or '.' characters");
@@ -186,6 +183,16 @@ const transformInteriorValue = restValue => {
186
183
  // Handle atomic values
187
184
  var value = transformInteriorAtom(restValue);
188
185
  if (value !== CannotTransform) {
186
+ if (value && typeof value === 'object') {
187
+ if (value instanceof Date) {
188
+ return value;
189
+ }
190
+ if (value instanceof Array) {
191
+ value = value.map(transformInteriorValue);
192
+ } else {
193
+ value = mapValues(value, transformInteriorValue);
194
+ }
195
+ }
189
196
  return value;
190
197
  }
191
198
 
@@ -202,7 +209,6 @@ const transformInteriorValue = restValue => {
202
209
  // Handle normal objects by recursing
203
210
  return mapValues(restValue, transformInteriorValue);
204
211
  };
205
-
206
212
  const valueAsDate = value => {
207
213
  if (typeof value === 'string') {
208
214
  return new Date(value);
@@ -211,114 +217,174 @@ const valueAsDate = value => {
211
217
  }
212
218
  return false;
213
219
  };
214
-
215
- function transformQueryKeyValue(className, key, value, schema) {
220
+ function transformQueryKeyValue(className, key, value, schema, count = false) {
216
221
  switch (key) {
217
222
  case 'createdAt':
218
223
  if (valueAsDate(value)) {
219
- return { key: '_created_at', value: valueAsDate(value) };
224
+ return {
225
+ key: '_created_at',
226
+ value: valueAsDate(value)
227
+ };
220
228
  }
221
229
  key = '_created_at';
222
230
  break;
223
231
  case 'updatedAt':
224
232
  if (valueAsDate(value)) {
225
- return { key: '_updated_at', value: valueAsDate(value) };
233
+ return {
234
+ key: '_updated_at',
235
+ value: valueAsDate(value)
236
+ };
226
237
  }
227
238
  key = '_updated_at';
228
239
  break;
229
240
  case 'expiresAt':
230
241
  if (valueAsDate(value)) {
231
- return { key: 'expiresAt', value: valueAsDate(value) };
242
+ return {
243
+ key: 'expiresAt',
244
+ value: valueAsDate(value)
245
+ };
232
246
  }
233
247
  break;
234
248
  case '_email_verify_token_expires_at':
235
249
  if (valueAsDate(value)) {
236
- return { key: '_email_verify_token_expires_at', value: valueAsDate(value) };
250
+ return {
251
+ key: '_email_verify_token_expires_at',
252
+ value: valueAsDate(value)
253
+ };
237
254
  }
238
255
  break;
239
256
  case 'objectId':
240
257
  {
241
- if (className === '_GlobalConfig') {
258
+ if (['_GlobalConfig', '_GraphQLConfig'].includes(className)) {
242
259
  value = parseInt(value);
243
260
  }
244
- return { key: '_id', value };
261
+ return {
262
+ key: '_id',
263
+ value
264
+ };
245
265
  }
246
266
  case '_account_lockout_expires_at':
247
267
  if (valueAsDate(value)) {
248
- return { key: '_account_lockout_expires_at', value: valueAsDate(value) };
268
+ return {
269
+ key: '_account_lockout_expires_at',
270
+ value: valueAsDate(value)
271
+ };
249
272
  }
250
273
  break;
251
274
  case '_failed_login_count':
252
- return { key, value };
275
+ return {
276
+ key,
277
+ value
278
+ };
253
279
  case 'sessionToken':
254
- return { key: '_session_token', value };
280
+ return {
281
+ key: '_session_token',
282
+ value
283
+ };
255
284
  case '_perishable_token_expires_at':
256
285
  if (valueAsDate(value)) {
257
- return { key: '_perishable_token_expires_at', value: valueAsDate(value) };
286
+ return {
287
+ key: '_perishable_token_expires_at',
288
+ value: valueAsDate(value)
289
+ };
258
290
  }
259
291
  break;
260
292
  case '_password_changed_at':
261
293
  if (valueAsDate(value)) {
262
- return { key: '_password_changed_at', value: valueAsDate(value) };
294
+ return {
295
+ key: '_password_changed_at',
296
+ value: valueAsDate(value)
297
+ };
263
298
  }
264
299
  break;
265
300
  case '_rperm':
266
301
  case '_wperm':
267
302
  case '_perishable_token':
268
303
  case '_email_verify_token':
269
- return { key, value };
304
+ return {
305
+ key,
306
+ value
307
+ };
270
308
  case '$or':
271
309
  case '$and':
272
310
  case '$nor':
273
- return { key: key, value: value.map(subQuery => transformWhere(className, subQuery, schema)) };
311
+ return {
312
+ key: key,
313
+ value: value.map(subQuery => transformWhere(className, subQuery, schema, count))
314
+ };
274
315
  case 'lastUsed':
275
316
  if (valueAsDate(value)) {
276
- return { key: '_last_used', value: valueAsDate(value) };
317
+ return {
318
+ key: '_last_used',
319
+ value: valueAsDate(value)
320
+ };
277
321
  }
278
322
  key = '_last_used';
279
323
  break;
280
324
  case 'timesUsed':
281
- return { key: 'times_used', value: value };
325
+ return {
326
+ key: 'times_used',
327
+ value: value
328
+ };
282
329
  default:
283
330
  {
284
331
  // Other auth data
285
332
  const authDataMatch = key.match(/^authData\.([a-zA-Z0-9_]+)\.id$/);
286
- if (authDataMatch) {
333
+ if (authDataMatch && className === '_User') {
287
334
  const provider = authDataMatch[1];
288
335
  // Special-case auth data.
289
- return { key: `_auth_data_${provider}.id`, value };
336
+ return {
337
+ key: `_auth_data_${provider}.id`,
338
+ value
339
+ };
290
340
  }
291
341
  }
292
342
  }
293
-
294
343
  const expectedTypeIsArray = schema && schema.fields[key] && schema.fields[key].type === 'Array';
295
-
296
344
  const expectedTypeIsPointer = schema && schema.fields[key] && schema.fields[key].type === 'Pointer';
297
-
298
345
  const field = schema && schema.fields[key];
299
- if (expectedTypeIsPointer || !schema && value && value.__type === 'Pointer') {
346
+ if (expectedTypeIsPointer || !schema && !key.includes('.') && value && value.__type === 'Pointer') {
300
347
  key = '_p_' + key;
301
348
  }
302
349
 
303
350
  // Handle query constraints
304
- const transformedConstraint = transformConstraint(value, field);
351
+ const transformedConstraint = transformConstraint(value, field, key, count);
305
352
  if (transformedConstraint !== CannotTransform) {
306
353
  if (transformedConstraint.$text) {
307
- return { key: '$text', value: transformedConstraint.$text };
354
+ return {
355
+ key: '$text',
356
+ value: transformedConstraint.$text
357
+ };
308
358
  }
309
359
  if (transformedConstraint.$elemMatch) {
310
- return { key: '$nor', value: [{ [key]: transformedConstraint }] };
360
+ return {
361
+ key: '$nor',
362
+ value: [{
363
+ [key]: transformedConstraint
364
+ }]
365
+ };
311
366
  }
312
- return { key, value: transformedConstraint };
367
+ return {
368
+ key,
369
+ value: transformedConstraint
370
+ };
313
371
  }
314
-
315
372
  if (expectedTypeIsArray && !(value instanceof Array)) {
316
- return { key, value: { '$all': [transformInteriorAtom(value)] } };
373
+ return {
374
+ key,
375
+ value: {
376
+ $all: [transformInteriorAtom(value)]
377
+ }
378
+ };
317
379
  }
318
380
 
319
381
  // Handle atomic values
320
- if (transformTopLevelAtom(value) !== CannotTransform) {
321
- return { key, value: transformTopLevelAtom(value) };
382
+ const transformRes = key.includes('.') ? transformInteriorAtom(value) : transformTopLevelAtom(value);
383
+ if (transformRes !== CannotTransform) {
384
+ return {
385
+ key,
386
+ value: transformRes
387
+ };
322
388
  } else {
323
389
  throw new Parse.Error(Parse.Error.INVALID_JSON, `You cannot use ${value} as a query parameter.`);
324
390
  }
@@ -327,51 +393,74 @@ function transformQueryKeyValue(className, key, value, schema) {
327
393
  // Main exposed method to help run queries.
328
394
  // restWhere is the "where" clause in REST API form.
329
395
  // Returns the mongo form of the query.
330
- function transformWhere(className, restWhere, schema) {
396
+ function transformWhere(className, restWhere, schema, count = false) {
331
397
  const mongoWhere = {};
332
398
  for (const restKey in restWhere) {
333
- const out = transformQueryKeyValue(className, restKey, restWhere[restKey], schema);
399
+ const out = transformQueryKeyValue(className, restKey, restWhere[restKey], schema, count);
334
400
  mongoWhere[out.key] = out.value;
335
401
  }
336
402
  return mongoWhere;
337
403
  }
338
-
339
404
  const parseObjectKeyValueToMongoObjectKeyValue = (restKey, restValue, schema) => {
340
405
  // Check if the schema is known since it's a built-in field.
341
406
  let transformedValue;
342
407
  let coercedToDate;
343
408
  switch (restKey) {
344
409
  case 'objectId':
345
- return { key: '_id', value: restValue };
410
+ return {
411
+ key: '_id',
412
+ value: restValue
413
+ };
346
414
  case 'expiresAt':
347
415
  transformedValue = transformTopLevelAtom(restValue);
348
416
  coercedToDate = typeof transformedValue === 'string' ? new Date(transformedValue) : transformedValue;
349
- return { key: 'expiresAt', value: coercedToDate };
417
+ return {
418
+ key: 'expiresAt',
419
+ value: coercedToDate
420
+ };
350
421
  case '_email_verify_token_expires_at':
351
422
  transformedValue = transformTopLevelAtom(restValue);
352
423
  coercedToDate = typeof transformedValue === 'string' ? new Date(transformedValue) : transformedValue;
353
- return { key: '_email_verify_token_expires_at', value: coercedToDate };
424
+ return {
425
+ key: '_email_verify_token_expires_at',
426
+ value: coercedToDate
427
+ };
354
428
  case '_account_lockout_expires_at':
355
429
  transformedValue = transformTopLevelAtom(restValue);
356
430
  coercedToDate = typeof transformedValue === 'string' ? new Date(transformedValue) : transformedValue;
357
- return { key: '_account_lockout_expires_at', value: coercedToDate };
431
+ return {
432
+ key: '_account_lockout_expires_at',
433
+ value: coercedToDate
434
+ };
358
435
  case '_perishable_token_expires_at':
359
436
  transformedValue = transformTopLevelAtom(restValue);
360
437
  coercedToDate = typeof transformedValue === 'string' ? new Date(transformedValue) : transformedValue;
361
- return { key: '_perishable_token_expires_at', value: coercedToDate };
438
+ return {
439
+ key: '_perishable_token_expires_at',
440
+ value: coercedToDate
441
+ };
362
442
  case '_password_changed_at':
363
443
  transformedValue = transformTopLevelAtom(restValue);
364
444
  coercedToDate = typeof transformedValue === 'string' ? new Date(transformedValue) : transformedValue;
365
- return { key: '_password_changed_at', value: coercedToDate };
445
+ return {
446
+ key: '_password_changed_at',
447
+ value: coercedToDate
448
+ };
366
449
  case '_failed_login_count':
367
450
  case '_rperm':
368
451
  case '_wperm':
369
452
  case '_email_verify_token':
370
453
  case '_hashed_password':
371
454
  case '_perishable_token':
372
- return { key: restKey, value: restValue };
455
+ return {
456
+ key: restKey,
457
+ value: restValue
458
+ };
373
459
  case 'sessionToken':
374
- return { key: '_session_token', value: restValue };
460
+ return {
461
+ key: '_session_token',
462
+ value: restValue
463
+ };
375
464
  default:
376
465
  // Auth data should have been transformed already
377
466
  if (restKey.match(/^authData\.([a-zA-Z0-9_]+)\.id$/)) {
@@ -379,7 +468,10 @@ const parseObjectKeyValueToMongoObjectKeyValue = (restKey, restValue, schema) =>
379
468
  }
380
469
  // Trust that the auth data has been transformed and save it directly
381
470
  if (restKey.match(/^_auth_data_[a-zA-Z0-9_]+$/)) {
382
- return { key: restKey, value: restValue };
471
+ return {
472
+ key: restKey,
473
+ value: restValue
474
+ };
383
475
  }
384
476
  }
385
477
  //skip straight to transformTopLevelAtom for Bytes, they don't show up in the schema for some reason
@@ -394,7 +486,10 @@ const parseObjectKeyValueToMongoObjectKeyValue = (restKey, restValue, schema) =>
394
486
  // Handle atomic values
395
487
  var value = transformTopLevelAtom(restValue);
396
488
  if (value !== CannotTransform) {
397
- return { key: restKey, value: value };
489
+ return {
490
+ key: restKey,
491
+ value: value
492
+ };
398
493
  }
399
494
 
400
495
  // ACLs are handled before this method is called
@@ -406,7 +501,10 @@ const parseObjectKeyValueToMongoObjectKeyValue = (restKey, restValue, schema) =>
406
501
  // Handle arrays
407
502
  if (restValue instanceof Array) {
408
503
  value = restValue.map(transformInteriorValue);
409
- return { key: restKey, value: value };
504
+ return {
505
+ key: restKey,
506
+ value: value
507
+ };
410
508
  }
411
509
 
412
510
  // Handle normal objects by recursing
@@ -414,9 +512,11 @@ const parseObjectKeyValueToMongoObjectKeyValue = (restKey, restValue, schema) =>
414
512
  throw new Parse.Error(Parse.Error.INVALID_NESTED_KEY, "Nested keys should not contain the '$' or '.' characters");
415
513
  }
416
514
  value = mapValues(restValue, transformInteriorValue);
417
- return { key: restKey, value };
515
+ return {
516
+ key: restKey,
517
+ value
518
+ };
418
519
  };
419
-
420
520
  const parseObjectToMongoObjectForCreate = (className, restCreate, schema) => {
421
521
  restCreate = addLegacyACL(restCreate);
422
522
  const mongoCreate = {};
@@ -424,7 +524,10 @@ const parseObjectToMongoObjectForCreate = (className, restCreate, schema) => {
424
524
  if (restCreate[restKey] && restCreate[restKey].__type === 'Relation') {
425
525
  continue;
426
526
  }
427
- const { key, value } = parseObjectKeyValueToMongoObjectKeyValue(restKey, restCreate[restKey], schema);
527
+ const {
528
+ key,
529
+ value
530
+ } = parseObjectKeyValueToMongoObjectKeyValue(restKey, restCreate[restKey], schema);
428
531
  if (value !== undefined) {
429
532
  mongoCreate[key] = value;
430
533
  }
@@ -439,7 +542,6 @@ const parseObjectToMongoObjectForCreate = (className, restCreate, schema) => {
439
542
  mongoCreate._updated_at = new Date(mongoCreate.updatedAt.iso || mongoCreate.updatedAt);
440
543
  delete mongoCreate.updatedAt;
441
544
  }
442
-
443
545
  return mongoCreate;
444
546
  };
445
547
 
@@ -476,40 +578,41 @@ const transformUpdate = (className, restUpdate, parseFormatSchema) => {
476
578
  mongoUpdate['$set'][out.key] = out.value;
477
579
  }
478
580
  }
479
-
480
581
  return mongoUpdate;
481
582
  };
482
583
 
483
584
  // Add the legacy _acl format.
484
585
  const addLegacyACL = restObject => {
485
- const restObjectCopy = _extends({}, restObject);
586
+ const restObjectCopy = {
587
+ ...restObject
588
+ };
486
589
  const _acl = {};
487
-
488
590
  if (restObject._wperm) {
489
591
  restObject._wperm.forEach(entry => {
490
- _acl[entry] = { w: true };
592
+ _acl[entry] = {
593
+ w: true
594
+ };
491
595
  });
492
596
  restObjectCopy._acl = _acl;
493
597
  }
494
-
495
598
  if (restObject._rperm) {
496
599
  restObject._rperm.forEach(entry => {
497
600
  if (!(entry in _acl)) {
498
- _acl[entry] = { r: true };
601
+ _acl[entry] = {
602
+ r: true
603
+ };
499
604
  } else {
500
605
  _acl[entry].r = true;
501
606
  }
502
607
  });
503
608
  restObjectCopy._acl = _acl;
504
609
  }
505
-
506
610
  return restObjectCopy;
507
611
  };
508
612
 
509
613
  // A sentinel value that helper transformations return when they
510
614
  // cannot perform a transformation
511
615
  function CannotTransform() {}
512
-
513
616
  const transformInteriorAtom = atom => {
514
617
  // TODO: check validity harder for the __type-defined types
515
618
  if (typeof atom === 'object' && atom && !(atom instanceof Date) && atom.__type === 'Pointer') {
@@ -558,7 +661,6 @@ function transformTopLevelAtom(atom, field) {
558
661
  // clear what they should be transformed to, so let's just do it.
559
662
  return atom;
560
663
  }
561
-
562
664
  if (atom === null) {
563
665
  return atom;
564
666
  }
@@ -583,148 +685,26 @@ function transformTopLevelAtom(atom, field) {
583
685
  return FileCoder.JSONToDatabase(atom);
584
686
  }
585
687
  return CannotTransform;
586
-
587
688
  default:
588
689
  // I don't think typeof can ever let us get here
589
690
  throw new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR, `really did not expect value: ${atom}`);
590
691
  }
591
692
  }
592
693
 
593
- function relativeTimeToDate(text, now = new Date()) {
594
- text = text.toLowerCase();
595
-
596
- let parts = text.split(' ');
597
-
598
- // Filter out whitespace
599
- parts = parts.filter(part => part !== '');
600
-
601
- const future = parts[0] === 'in';
602
- const past = parts[parts.length - 1] === 'ago';
603
-
604
- if (!future && !past && text !== 'now') {
605
- return { status: 'error', info: "Time should either start with 'in' or end with 'ago'" };
606
- }
607
-
608
- if (future && past) {
609
- return {
610
- status: 'error',
611
- info: "Time cannot have both 'in' and 'ago'"
612
- };
613
- }
614
-
615
- // strip the 'ago' or 'in'
616
- if (future) {
617
- parts = parts.slice(1);
618
- } else {
619
- // past
620
- parts = parts.slice(0, parts.length - 1);
621
- }
622
-
623
- if (parts.length % 2 !== 0 && text !== 'now') {
624
- return {
625
- status: 'error',
626
- info: 'Invalid time string. Dangling unit or number.'
627
- };
628
- }
629
-
630
- const pairs = [];
631
- while (parts.length) {
632
- pairs.push([parts.shift(), parts.shift()]);
633
- }
634
-
635
- let seconds = 0;
636
- for (const [num, interval] of pairs) {
637
- const val = Number(num);
638
- if (!Number.isInteger(val)) {
639
- return {
640
- status: 'error',
641
- info: `'${num}' is not an integer.`
642
- };
643
- }
644
-
645
- switch (interval) {
646
- case 'yr':
647
- case 'yrs':
648
- case 'year':
649
- case 'years':
650
- seconds += val * 31536000; // 365 * 24 * 60 * 60
651
- break;
652
-
653
- case 'wk':
654
- case 'wks':
655
- case 'week':
656
- case 'weeks':
657
- seconds += val * 604800; // 7 * 24 * 60 * 60
658
- break;
659
-
660
- case 'd':
661
- case 'day':
662
- case 'days':
663
- seconds += val * 86400; // 24 * 60 * 60
664
- break;
665
-
666
- case 'hr':
667
- case 'hrs':
668
- case 'hour':
669
- case 'hours':
670
- seconds += val * 3600; // 60 * 60
671
- break;
672
-
673
- case 'min':
674
- case 'mins':
675
- case 'minute':
676
- case 'minutes':
677
- seconds += val * 60;
678
- break;
679
-
680
- case 'sec':
681
- case 'secs':
682
- case 'second':
683
- case 'seconds':
684
- seconds += val;
685
- break;
686
-
687
- default:
688
- return {
689
- status: 'error',
690
- info: `Invalid interval: '${interval}'`
691
- };
692
- }
693
- }
694
-
695
- const milliseconds = seconds * 1000;
696
- if (future) {
697
- return {
698
- status: 'success',
699
- info: 'future',
700
- result: new Date(now.valueOf() + milliseconds)
701
- };
702
- } else if (past) {
703
- return {
704
- status: 'success',
705
- info: 'past',
706
- result: new Date(now.valueOf() - milliseconds)
707
- };
708
- } else {
709
- return {
710
- status: 'success',
711
- info: 'present',
712
- result: new Date(now.valueOf())
713
- };
714
- }
715
- }
716
-
717
694
  // Transforms a query constraint from REST API format to Mongo format.
718
695
  // A constraint is something with fields like $lt.
719
696
  // If it is not a valid constraint but it could be a valid something
720
697
  // else, return CannotTransform.
721
698
  // inArray is whether this is an array field.
722
- function transformConstraint(constraint, field) {
699
+ function transformConstraint(constraint, field, queryKey, count = false) {
723
700
  const inArray = field && field.type && field.type === 'Array';
701
+ // Check wether the given key has `.`
702
+ const isNestedKey = queryKey.indexOf('.') > -1;
724
703
  if (typeof constraint !== 'object' || !constraint) {
725
704
  return CannotTransform;
726
705
  }
727
- const transformFunction = inArray ? transformInteriorAtom : transformTopLevelAtom;
706
+ // For inArray or nested key, we need to transform the interior atom
707
+ const transformFunction = inArray || isNestedKey ? transformInteriorAtom : transformTopLevelAtom;
728
708
  const transformer = atom => {
729
709
  const result = transformFunction(atom, field);
730
710
  if (result === CannotTransform) {
@@ -753,28 +733,23 @@ function transformConstraint(constraint, field) {
753
733
  if (field && field.type !== 'Date') {
754
734
  throw new Parse.Error(Parse.Error.INVALID_JSON, '$relativeTime can only be used with Date field');
755
735
  }
756
-
757
736
  switch (key) {
758
737
  case '$exists':
759
738
  case '$ne':
760
739
  case '$eq':
761
740
  throw new Parse.Error(Parse.Error.INVALID_JSON, '$relativeTime can only be used with the $lt, $lte, $gt, and $gte operators');
762
741
  }
763
-
764
- const parserResult = relativeTimeToDate(val.$relativeTime);
742
+ const parserResult = Utils.relativeTimeToDate(val.$relativeTime);
765
743
  if (parserResult.status === 'success') {
766
744
  answer[key] = parserResult.result;
767
745
  break;
768
746
  }
769
-
770
- _logger2.default.info('Error while parsing relative date', parserResult);
747
+ _logger.default.info('Error while parsing relative date', parserResult);
771
748
  throw new Parse.Error(Parse.Error.INVALID_JSON, `bad $relativeTime (${key}) value. ${parserResult.info}`);
772
749
  }
773
-
774
750
  answer[key] = transformer(val);
775
751
  break;
776
752
  }
777
-
778
753
  case '$in':
779
754
  case '$nin':
780
755
  {
@@ -782,7 +757,7 @@ function transformConstraint(constraint, field) {
782
757
  if (!(arr instanceof Array)) {
783
758
  throw new Parse.Error(Parse.Error.INVALID_JSON, 'bad ' + key + ' value');
784
759
  }
785
- answer[key] = _lodash2.default.flatMap(arr, value => {
760
+ answer[key] = _lodash.default.flatMap(arr, value => {
786
761
  return (atom => {
787
762
  if (Array.isArray(atom)) {
788
763
  return value.map(transformer);
@@ -800,12 +775,10 @@ function transformConstraint(constraint, field) {
800
775
  throw new Parse.Error(Parse.Error.INVALID_JSON, 'bad ' + key + ' value');
801
776
  }
802
777
  answer[key] = arr.map(transformInteriorAtom);
803
-
804
778
  const values = answer[key];
805
779
  if (isAnyValueRegex(values) && !isAllValuesRegexOrNone(values)) {
806
780
  throw new Parse.Error(Parse.Error.INVALID_JSON, 'All $all values must be of regex type or none: ' + values);
807
781
  }
808
-
809
782
  break;
810
783
  }
811
784
  case '$regex':
@@ -815,7 +788,6 @@ function transformConstraint(constraint, field) {
815
788
  }
816
789
  answer[key] = s;
817
790
  break;
818
-
819
791
  case '$containedBy':
820
792
  {
821
793
  const arr = constraint[key];
@@ -830,7 +802,6 @@ function transformConstraint(constraint, field) {
830
802
  case '$options':
831
803
  answer[key] = constraint[key];
832
804
  break;
833
-
834
805
  case '$text':
835
806
  {
836
807
  const search = constraint[key].$search;
@@ -841,7 +812,7 @@ function transformConstraint(constraint, field) {
841
812
  throw new Parse.Error(Parse.Error.INVALID_JSON, `bad $text: $term, should be string`);
842
813
  } else {
843
814
  answer[key] = {
844
- '$search': search.$term
815
+ $search: search.$term
845
816
  };
846
817
  }
847
818
  if (search.$language && typeof search.$language !== 'string') {
@@ -862,14 +833,25 @@ function transformConstraint(constraint, field) {
862
833
  break;
863
834
  }
864
835
  case '$nearSphere':
865
- var point = constraint[key];
866
- answer[key] = [point.longitude, point.latitude];
867
- break;
868
-
836
+ {
837
+ const point = constraint[key];
838
+ if (count) {
839
+ answer.$geoWithin = {
840
+ $centerSphere: [[point.longitude, point.latitude], constraint.$maxDistance]
841
+ };
842
+ } else {
843
+ answer[key] = [point.longitude, point.latitude];
844
+ }
845
+ break;
846
+ }
869
847
  case '$maxDistance':
870
- answer[key] = constraint[key];
871
- break;
872
-
848
+ {
849
+ if (count) {
850
+ break;
851
+ }
852
+ answer[key] = constraint[key];
853
+ break;
854
+ }
873
855
  // The SDKs don't seem to use these but they are documented in the
874
856
  // REST API docs.
875
857
  case '$maxDistanceInRadians':
@@ -881,21 +863,18 @@ function transformConstraint(constraint, field) {
881
863
  case '$maxDistanceInKilometers':
882
864
  answer['$maxDistance'] = constraint[key] / 6371;
883
865
  break;
884
-
885
866
  case '$select':
886
867
  case '$dontSelect':
887
868
  throw new Parse.Error(Parse.Error.COMMAND_UNAVAILABLE, 'the ' + key + ' constraint is not supported yet');
888
-
889
869
  case '$within':
890
870
  var box = constraint[key]['$box'];
891
871
  if (!box || box.length != 2) {
892
872
  throw new Parse.Error(Parse.Error.INVALID_JSON, 'malformatted $within arg');
893
873
  }
894
874
  answer[key] = {
895
- '$box': [[box[0].longitude, box[0].latitude], [box[1].longitude, box[1].latitude]]
875
+ $box: [[box[0].longitude, box[0].latitude], [box[1].longitude, box[1].latitude]]
896
876
  };
897
877
  break;
898
-
899
878
  case '$geoWithin':
900
879
  {
901
880
  const polygon = constraint[key]['$polygon'];
@@ -913,7 +892,7 @@ function transformConstraint(constraint, field) {
913
892
  }
914
893
  points = polygon;
915
894
  } else {
916
- throw new Parse.Error(Parse.Error.INVALID_JSON, 'bad $geoWithin value; $polygon should be Polygon object or Array of Parse.GeoPoint\'s');
895
+ throw new Parse.Error(Parse.Error.INVALID_JSON, "bad $geoWithin value; $polygon should be Polygon object or Array of Parse.GeoPoint's");
917
896
  }
918
897
  points = points.map(point => {
919
898
  if (point instanceof Array && point.length === 2) {
@@ -928,7 +907,7 @@ function transformConstraint(constraint, field) {
928
907
  return [point.longitude, point.latitude];
929
908
  });
930
909
  answer[key] = {
931
- '$polygon': points
910
+ $polygon: points
932
911
  };
933
912
  } else if (centerSphere !== undefined) {
934
913
  if (!(centerSphere instanceof Array) || centerSphere.length < 2) {
@@ -948,7 +927,7 @@ function transformConstraint(constraint, field) {
948
927
  throw new Parse.Error(Parse.Error.INVALID_JSON, 'bad $geoWithin value; $centerSphere distance invalid');
949
928
  }
950
929
  answer[key] = {
951
- '$centerSphere': [[point.longitude, point.latitude], distance]
930
+ $centerSphere: [[point.longitude, point.latitude], distance]
952
931
  };
953
932
  }
954
933
  break;
@@ -999,9 +978,11 @@ function transformUpdateOperator({
999
978
  if (flatten) {
1000
979
  return undefined;
1001
980
  } else {
1002
- return { __op: '$unset', arg: '' };
981
+ return {
982
+ __op: '$unset',
983
+ arg: ''
984
+ };
1003
985
  }
1004
-
1005
986
  case 'Increment':
1006
987
  if (typeof amount !== 'number') {
1007
988
  throw new Parse.Error(Parse.Error.INVALID_JSON, 'incrementing must provide a number');
@@ -1009,9 +990,20 @@ function transformUpdateOperator({
1009
990
  if (flatten) {
1010
991
  return amount;
1011
992
  } else {
1012
- return { __op: '$inc', arg: amount };
993
+ return {
994
+ __op: '$inc',
995
+ arg: amount
996
+ };
997
+ }
998
+ case 'SetOnInsert':
999
+ if (flatten) {
1000
+ return amount;
1001
+ } else {
1002
+ return {
1003
+ __op: '$setOnInsert',
1004
+ arg: amount
1005
+ };
1013
1006
  }
1014
-
1015
1007
  case 'Add':
1016
1008
  case 'AddUnique':
1017
1009
  if (!(objects instanceof Array)) {
@@ -1025,9 +1017,13 @@ function transformUpdateOperator({
1025
1017
  Add: '$push',
1026
1018
  AddUnique: '$addToSet'
1027
1019
  }[__op];
1028
- return { __op: mongoOp, arg: { '$each': toAdd } };
1020
+ return {
1021
+ __op: mongoOp,
1022
+ arg: {
1023
+ $each: toAdd
1024
+ }
1025
+ };
1029
1026
  }
1030
-
1031
1027
  case 'Remove':
1032
1028
  if (!(objects instanceof Array)) {
1033
1029
  throw new Parse.Error(Parse.Error.INVALID_JSON, 'objects to remove must be an array');
@@ -1036,9 +1032,11 @@ function transformUpdateOperator({
1036
1032
  if (flatten) {
1037
1033
  return [];
1038
1034
  } else {
1039
- return { __op: '$pullAll', arg: toRemove };
1035
+ return {
1036
+ __op: '$pullAll',
1037
+ arg: toRemove
1038
+ };
1040
1039
  }
1041
-
1042
1040
  default:
1043
1041
  throw new Parse.Error(Parse.Error.COMMAND_UNAVAILABLE, `The ${__op} operator is not supported yet.`);
1044
1042
  }
@@ -1050,17 +1048,16 @@ function mapValues(object, iterator) {
1050
1048
  });
1051
1049
  return result;
1052
1050
  }
1053
-
1054
1051
  const nestedMongoObjectToNestedParseObject = mongoObject => {
1055
1052
  switch (typeof mongoObject) {
1056
1053
  case 'string':
1057
1054
  case 'number':
1058
1055
  case 'boolean':
1059
- return mongoObject;
1060
1056
  case 'undefined':
1057
+ return mongoObject;
1061
1058
  case 'symbol':
1062
1059
  case 'function':
1063
- throw 'bad value in mongoObjectToParseObject';
1060
+ throw 'bad value in nestedMongoObjectToNestedParseObject';
1064
1061
  case 'object':
1065
1062
  if (mongoObject === null) {
1066
1063
  return null;
@@ -1068,34 +1065,27 @@ const nestedMongoObjectToNestedParseObject = mongoObject => {
1068
1065
  if (mongoObject instanceof Array) {
1069
1066
  return mongoObject.map(nestedMongoObjectToNestedParseObject);
1070
1067
  }
1071
-
1072
1068
  if (mongoObject instanceof Date) {
1073
1069
  return Parse._encode(mongoObject);
1074
1070
  }
1075
-
1076
1071
  if (mongoObject instanceof mongodb.Long) {
1077
1072
  return mongoObject.toNumber();
1078
1073
  }
1079
-
1080
1074
  if (mongoObject instanceof mongodb.Double) {
1081
1075
  return mongoObject.value;
1082
1076
  }
1083
-
1084
1077
  if (BytesCoder.isValidDatabaseObject(mongoObject)) {
1085
1078
  return BytesCoder.databaseToJSON(mongoObject);
1086
1079
  }
1087
-
1088
- if (mongoObject.hasOwnProperty('__type') && mongoObject.__type == 'Date' && mongoObject.iso instanceof Date) {
1080
+ if (Object.prototype.hasOwnProperty.call(mongoObject, '__type') && mongoObject.__type == 'Date' && mongoObject.iso instanceof Date) {
1089
1081
  mongoObject.iso = mongoObject.iso.toJSON();
1090
1082
  return mongoObject;
1091
1083
  }
1092
-
1093
1084
  return mapValues(mongoObject, nestedMongoObjectToNestedParseObject);
1094
1085
  default:
1095
1086
  throw 'unknown js type';
1096
1087
  }
1097
1088
  };
1098
-
1099
1089
  const transformPointerString = (schema, field, pointerString) => {
1100
1090
  const objData = pointerString.split('$');
1101
1091
  if (objData[0] !== schema.fields[field].targetClass) {
@@ -1115,8 +1105,8 @@ const mongoObjectToParseObject = (className, mongoObject, schema) => {
1115
1105
  case 'string':
1116
1106
  case 'number':
1117
1107
  case 'boolean':
1118
- return mongoObject;
1119
1108
  case 'undefined':
1109
+ return mongoObject;
1120
1110
  case 'symbol':
1121
1111
  case 'function':
1122
1112
  throw 'bad value in mongoObjectToParseObject';
@@ -1128,23 +1118,18 @@ const mongoObjectToParseObject = (className, mongoObject, schema) => {
1128
1118
  if (mongoObject instanceof Array) {
1129
1119
  return mongoObject.map(nestedMongoObjectToNestedParseObject);
1130
1120
  }
1131
-
1132
1121
  if (mongoObject instanceof Date) {
1133
1122
  return Parse._encode(mongoObject);
1134
1123
  }
1135
-
1136
1124
  if (mongoObject instanceof mongodb.Long) {
1137
1125
  return mongoObject.toNumber();
1138
1126
  }
1139
-
1140
1127
  if (mongoObject instanceof mongodb.Double) {
1141
1128
  return mongoObject.value;
1142
1129
  }
1143
-
1144
1130
  if (BytesCoder.isValidDatabaseObject(mongoObject)) {
1145
1131
  return BytesCoder.databaseToJSON(mongoObject);
1146
1132
  }
1147
-
1148
1133
  const restObject = {};
1149
1134
  if (mongoObject._rperm || mongoObject._wperm) {
1150
1135
  restObject._rperm = mongoObject._rperm || [];
@@ -1152,7 +1137,6 @@ const mongoObjectToParseObject = (className, mongoObject, schema) => {
1152
1137
  delete mongoObject._rperm;
1153
1138
  delete mongoObject._wperm;
1154
1139
  }
1155
-
1156
1140
  for (var key in mongoObject) {
1157
1141
  switch (key) {
1158
1142
  case '_id':
@@ -1198,24 +1182,30 @@ const mongoObjectToParseObject = (className, mongoObject, schema) => {
1198
1182
  case 'times_used':
1199
1183
  restObject['timesUsed'] = mongoObject[key];
1200
1184
  break;
1185
+ case 'authData':
1186
+ if (className === '_User') {
1187
+ _logger.default.warn('ignoring authData in _User as this key is reserved to be synthesized of `_auth_data_*` keys');
1188
+ } else {
1189
+ restObject['authData'] = mongoObject[key];
1190
+ }
1191
+ break;
1201
1192
  default:
1202
1193
  // Check other auth data keys
1203
1194
  var authDataMatch = key.match(/^_auth_data_([a-zA-Z0-9_]+)$/);
1204
- if (authDataMatch) {
1195
+ if (authDataMatch && className === '_User') {
1205
1196
  var provider = authDataMatch[1];
1206
1197
  restObject['authData'] = restObject['authData'] || {};
1207
1198
  restObject['authData'][provider] = mongoObject[key];
1208
1199
  break;
1209
1200
  }
1210
-
1211
1201
  if (key.indexOf('_p_') == 0) {
1212
1202
  var newKey = key.substring(3);
1213
1203
  if (!schema.fields[newKey]) {
1214
- _logger2.default.info('transform.js', 'Found a pointer column not in the schema, dropping it.', className, newKey);
1204
+ _logger.default.info('transform.js', 'Found a pointer column not in the schema, dropping it.', className, newKey);
1215
1205
  break;
1216
1206
  }
1217
1207
  if (schema.fields[newKey].type !== 'Pointer') {
1218
- _logger2.default.info('transform.js', 'Found a pointer in a non-pointer column, dropping it.', className, key);
1208
+ _logger.default.info('transform.js', 'Found a pointer in a non-pointer column, dropping it.', className, key);
1219
1209
  break;
1220
1210
  }
1221
1211
  if (mongoObject[key] === null) {
@@ -1247,7 +1237,6 @@ const mongoObjectToParseObject = (className, mongoObject, schema) => {
1247
1237
  restObject[key] = nestedMongoObjectToNestedParseObject(mongoObject[key]);
1248
1238
  }
1249
1239
  }
1250
-
1251
1240
  const relationFieldNames = Object.keys(schema.fields).filter(fieldName => schema.fields[fieldName].type === 'Relation');
1252
1241
  const relationFields = {};
1253
1242
  relationFieldNames.forEach(relationFieldName => {
@@ -1256,33 +1245,31 @@ const mongoObjectToParseObject = (className, mongoObject, schema) => {
1256
1245
  className: schema.fields[relationFieldName].targetClass
1257
1246
  };
1258
1247
  });
1259
-
1260
- return _extends({}, restObject, relationFields);
1248
+ return {
1249
+ ...restObject,
1250
+ ...relationFields
1251
+ };
1261
1252
  }
1262
1253
  default:
1263
1254
  throw 'unknown js type';
1264
1255
  }
1265
1256
  };
1266
-
1267
1257
  var DateCoder = {
1268
1258
  JSONToDatabase(json) {
1269
1259
  return new Date(json.iso);
1270
1260
  },
1271
-
1272
1261
  isValidJSON(value) {
1273
1262
  return typeof value === 'object' && value !== null && value.__type === 'Date';
1274
1263
  }
1275
1264
  };
1276
-
1277
1265
  var BytesCoder = {
1278
- base64Pattern: new RegExp("^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$"),
1266
+ base64Pattern: new RegExp('^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$'),
1279
1267
  isBase64Value(object) {
1280
1268
  if (typeof object !== 'string') {
1281
1269
  return false;
1282
1270
  }
1283
1271
  return this.base64Pattern.test(object);
1284
1272
  },
1285
-
1286
1273
  databaseToJSON(object) {
1287
1274
  let value;
1288
1275
  if (this.isBase64Value(object)) {
@@ -1295,20 +1282,16 @@ var BytesCoder = {
1295
1282
  base64: value
1296
1283
  };
1297
1284
  },
1298
-
1299
1285
  isValidDatabaseObject(object) {
1300
1286
  return object instanceof mongodb.Binary || this.isBase64Value(object);
1301
1287
  },
1302
-
1303
1288
  JSONToDatabase(json) {
1304
- return new mongodb.Binary(new Buffer(json.base64, 'base64'));
1289
+ return new mongodb.Binary(Buffer.from(json.base64, 'base64'));
1305
1290
  },
1306
-
1307
1291
  isValidJSON(value) {
1308
1292
  return typeof value === 'object' && value !== null && value.__type === 'Bytes';
1309
1293
  }
1310
1294
  };
1311
-
1312
1295
  var GeoPointCoder = {
1313
1296
  databaseToJSON(object) {
1314
1297
  return {
@@ -1317,20 +1300,16 @@ var GeoPointCoder = {
1317
1300
  longitude: object[0]
1318
1301
  };
1319
1302
  },
1320
-
1321
1303
  isValidDatabaseObject(object) {
1322
1304
  return object instanceof Array && object.length == 2;
1323
1305
  },
1324
-
1325
1306
  JSONToDatabase(json) {
1326
1307
  return [json.longitude, json.latitude];
1327
1308
  },
1328
-
1329
1309
  isValidJSON(value) {
1330
1310
  return typeof value === 'object' && value !== null && value.__type === 'GeoPoint';
1331
1311
  }
1332
1312
  };
1333
-
1334
1313
  var PolygonCoder = {
1335
1314
  databaseToJSON(object) {
1336
1315
  // Convert lng/lat -> lat/lng
@@ -1342,7 +1321,6 @@ var PolygonCoder = {
1342
1321
  coordinates: coords
1343
1322
  };
1344
1323
  },
1345
-
1346
1324
  isValidDatabaseObject(object) {
1347
1325
  const coords = object.coordinates[0];
1348
1326
  if (object.type !== 'Polygon' || !(coords instanceof Array)) {
@@ -1357,7 +1335,6 @@ var PolygonCoder = {
1357
1335
  }
1358
1336
  return true;
1359
1337
  },
1360
-
1361
1338
  JSONToDatabase(json) {
1362
1339
  let coords = json.coordinates;
1363
1340
  // Add first point to the end to close polygon
@@ -1382,14 +1359,15 @@ var PolygonCoder = {
1382
1359
  coords = coords.map(coord => {
1383
1360
  return [coord[1], coord[0]];
1384
1361
  });
1385
- return { type: 'Polygon', coordinates: [coords] };
1362
+ return {
1363
+ type: 'Polygon',
1364
+ coordinates: [coords]
1365
+ };
1386
1366
  },
1387
-
1388
1367
  isValidJSON(value) {
1389
1368
  return typeof value === 'object' && value !== null && value.__type === 'Polygon';
1390
1369
  }
1391
1370
  };
1392
-
1393
1371
  var FileCoder = {
1394
1372
  databaseToJSON(object) {
1395
1373
  return {
@@ -1397,28 +1375,23 @@ var FileCoder = {
1397
1375
  name: object
1398
1376
  };
1399
1377
  },
1400
-
1401
1378
  isValidDatabaseObject(object) {
1402
1379
  return typeof object === 'string';
1403
1380
  },
1404
-
1405
1381
  JSONToDatabase(json) {
1406
1382
  return json.name;
1407
1383
  },
1408
-
1409
1384
  isValidJSON(value) {
1410
1385
  return typeof value === 'object' && value !== null && value.__type === 'File';
1411
1386
  }
1412
1387
  };
1413
-
1414
1388
  module.exports = {
1415
1389
  transformKey,
1416
1390
  parseObjectToMongoObjectForCreate,
1417
1391
  transformUpdate,
1418
1392
  transformWhere,
1419
1393
  mongoObjectToParseObject,
1420
- relativeTimeToDate,
1421
1394
  transformConstraint,
1422
1395
  transformPointerString
1423
1396
  };
1424
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9BZGFwdGVycy9TdG9yYWdlL01vbmdvL01vbmdvVHJhbnNmb3JtLmpzIl0sIm5hbWVzIjpbIm1vbmdvZGIiLCJyZXF1aXJlIiwiUGFyc2UiLCJ0cmFuc2Zvcm1LZXkiLCJjbGFzc05hbWUiLCJmaWVsZE5hbWUiLCJzY2hlbWEiLCJmaWVsZHMiLCJfX3R5cGUiLCJ0eXBlIiwidHJhbnNmb3JtS2V5VmFsdWVGb3JVcGRhdGUiLCJyZXN0S2V5IiwicmVzdFZhbHVlIiwicGFyc2VGb3JtYXRTY2hlbWEiLCJrZXkiLCJ0aW1lRmllbGQiLCJ2YWx1ZSIsInBhcnNlSW50IiwidHJhbnNmb3JtVG9wTGV2ZWxBdG9tIiwiQ2Fubm90VHJhbnNmb3JtIiwiRGF0ZSIsImluZGV4T2YiLCJBcnJheSIsIm1hcCIsInRyYW5zZm9ybUludGVyaW9yVmFsdWUiLCJ0cmFuc2Zvcm1VcGRhdGVPcGVyYXRvciIsIm1hcFZhbHVlcyIsImlzUmVnZXgiLCJSZWdFeHAiLCJpc1N0YXJ0c1dpdGhSZWdleCIsIm1hdGNoZXMiLCJ0b1N0cmluZyIsIm1hdGNoIiwiaXNBbGxWYWx1ZXNSZWdleE9yTm9uZSIsInZhbHVlcyIsImlzQXJyYXkiLCJsZW5ndGgiLCJmaXJzdFZhbHVlc0lzUmVnZXgiLCJpIiwiaXNBbnlWYWx1ZVJlZ2V4Iiwic29tZSIsIk9iamVjdCIsImtleXMiLCJpbmNsdWRlcyIsIkVycm9yIiwiSU5WQUxJRF9ORVNURURfS0VZIiwidHJhbnNmb3JtSW50ZXJpb3JBdG9tIiwidmFsdWVBc0RhdGUiLCJ0cmFuc2Zvcm1RdWVyeUtleVZhbHVlIiwic3ViUXVlcnkiLCJ0cmFuc2Zvcm1XaGVyZSIsImF1dGhEYXRhTWF0Y2giLCJwcm92aWRlciIsImV4cGVjdGVkVHlwZUlzQXJyYXkiLCJleHBlY3RlZFR5cGVJc1BvaW50ZXIiLCJmaWVsZCIsInRyYW5zZm9ybWVkQ29uc3RyYWludCIsInRyYW5zZm9ybUNvbnN0cmFpbnQiLCIkdGV4dCIsIiRlbGVtTWF0Y2giLCJJTlZBTElEX0pTT04iLCJyZXN0V2hlcmUiLCJtb25nb1doZXJlIiwib3V0IiwicGFyc2VPYmplY3RLZXlWYWx1ZVRvTW9uZ29PYmplY3RLZXlWYWx1ZSIsInRyYW5zZm9ybWVkVmFsdWUiLCJjb2VyY2VkVG9EYXRlIiwiSU5WQUxJRF9LRVlfTkFNRSIsInBhcnNlT2JqZWN0VG9Nb25nb09iamVjdEZvckNyZWF0ZSIsInJlc3RDcmVhdGUiLCJhZGRMZWdhY3lBQ0wiLCJtb25nb0NyZWF0ZSIsInVuZGVmaW5lZCIsImNyZWF0ZWRBdCIsIl9jcmVhdGVkX2F0IiwiaXNvIiwidXBkYXRlZEF0IiwiX3VwZGF0ZWRfYXQiLCJ0cmFuc2Zvcm1VcGRhdGUiLCJyZXN0VXBkYXRlIiwibW9uZ29VcGRhdGUiLCJhY2wiLCJfcnBlcm0iLCJfd3Blcm0iLCJfYWNsIiwiJHNldCIsIl9fb3AiLCJhcmciLCJyZXN0T2JqZWN0IiwicmVzdE9iamVjdENvcHkiLCJmb3JFYWNoIiwiZW50cnkiLCJ3IiwiciIsImF0b20iLCJvYmplY3RJZCIsIkRhdGVDb2RlciIsImlzVmFsaWRKU09OIiwiSlNPTlRvRGF0YWJhc2UiLCJCeXRlc0NvZGVyIiwiJHJlZ2V4IiwidGFyZ2V0Q2xhc3MiLCJHZW9Qb2ludENvZGVyIiwiUG9seWdvbkNvZGVyIiwiRmlsZUNvZGVyIiwiSU5URVJOQUxfU0VSVkVSX0VSUk9SIiwicmVsYXRpdmVUaW1lVG9EYXRlIiwidGV4dCIsIm5vdyIsInRvTG93ZXJDYXNlIiwicGFydHMiLCJzcGxpdCIsImZpbHRlciIsInBhcnQiLCJmdXR1cmUiLCJwYXN0Iiwic3RhdHVzIiwiaW5mbyIsInNsaWNlIiwicGFpcnMiLCJwdXNoIiwic2hpZnQiLCJzZWNvbmRzIiwibnVtIiwiaW50ZXJ2YWwiLCJ2YWwiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJtaWxsaXNlY29uZHMiLCJyZXN1bHQiLCJ2YWx1ZU9mIiwiY29uc3RyYWludCIsImluQXJyYXkiLCJ0cmFuc2Zvcm1GdW5jdGlvbiIsInRyYW5zZm9ybWVyIiwiSlNPTiIsInN0cmluZ2lmeSIsInNvcnQiLCJyZXZlcnNlIiwiYW5zd2VyIiwiJHJlbGF0aXZlVGltZSIsInBhcnNlclJlc3VsdCIsImxvZyIsImFyciIsIl8iLCJmbGF0TWFwIiwicyIsIiRuaW4iLCJzZWFyY2giLCIkc2VhcmNoIiwiJHRlcm0iLCIkbGFuZ3VhZ2UiLCIkY2FzZVNlbnNpdGl2ZSIsIiRkaWFjcml0aWNTZW5zaXRpdmUiLCJwb2ludCIsImxvbmdpdHVkZSIsImxhdGl0dWRlIiwiQ09NTUFORF9VTkFWQUlMQUJMRSIsImJveCIsInBvbHlnb24iLCJjZW50ZXJTcGhlcmUiLCJwb2ludHMiLCJjb29yZGluYXRlcyIsIkdlb1BvaW50IiwiX3ZhbGlkYXRlIiwiZGlzdGFuY2UiLCJpc05hTiIsIiRnZW9tZXRyeSIsImFtb3VudCIsIm9iamVjdHMiLCJmbGF0dGVuIiwidG9BZGQiLCJtb25nb09wIiwiQWRkIiwiQWRkVW5pcXVlIiwidG9SZW1vdmUiLCJvYmplY3QiLCJpdGVyYXRvciIsIm5lc3RlZE1vbmdvT2JqZWN0VG9OZXN0ZWRQYXJzZU9iamVjdCIsIm1vbmdvT2JqZWN0IiwiX2VuY29kZSIsIkxvbmciLCJ0b051bWJlciIsIkRvdWJsZSIsImlzVmFsaWREYXRhYmFzZU9iamVjdCIsImRhdGFiYXNlVG9KU09OIiwiaGFzT3duUHJvcGVydHkiLCJ0b0pTT04iLCJ0cmFuc2Zvcm1Qb2ludGVyU3RyaW5nIiwicG9pbnRlclN0cmluZyIsIm9iakRhdGEiLCJtb25nb09iamVjdFRvUGFyc2VPYmplY3QiLCJfaGFzaGVkX3Bhc3N3b3JkIiwibmV3S2V5Iiwic3Vic3RyaW5nIiwicmVsYXRpb25GaWVsZE5hbWVzIiwicmVsYXRpb25GaWVsZHMiLCJyZWxhdGlvbkZpZWxkTmFtZSIsImpzb24iLCJiYXNlNjRQYXR0ZXJuIiwiaXNCYXNlNjRWYWx1ZSIsInRlc3QiLCJidWZmZXIiLCJiYXNlNjQiLCJCaW5hcnkiLCJCdWZmZXIiLCJjb29yZHMiLCJjb29yZCIsInBhcnNlRmxvYXQiLCJ1bmlxdWUiLCJpdGVtIiwiaW5kZXgiLCJhciIsImZvdW5kSW5kZXgiLCJwdCIsIm5hbWUiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7Ozs7QUFDQTs7Ozs7O0FBQ0EsSUFBSUEsVUFBVUMsUUFBUSxTQUFSLENBQWQ7QUFDQSxJQUFJQyxRQUFRRCxRQUFRLFlBQVIsRUFBc0JDLEtBQWxDOztBQUVBLE1BQU1DLGVBQWUsQ0FBQ0MsU0FBRCxFQUFZQyxTQUFaLEVBQXVCQyxNQUF2QixLQUFrQztBQUNyRDtBQUNBLFVBQU9ELFNBQVA7QUFDQSxTQUFLLFVBQUw7QUFBaUIsYUFBTyxLQUFQO0FBQ2pCLFNBQUssV0FBTDtBQUFrQixhQUFPLGFBQVA7QUFDbEIsU0FBSyxXQUFMO0FBQWtCLGFBQU8sYUFBUDtBQUNsQixTQUFLLGNBQUw7QUFBcUIsYUFBTyxnQkFBUDtBQUNyQixTQUFLLFVBQUw7QUFBaUIsYUFBTyxZQUFQO0FBQ2pCLFNBQUssV0FBTDtBQUFrQixhQUFPLFlBQVA7QUFObEI7O0FBU0EsTUFBSUMsT0FBT0MsTUFBUCxDQUFjRixTQUFkLEtBQTRCQyxPQUFPQyxNQUFQLENBQWNGLFNBQWQsRUFBeUJHLE1BQXpCLElBQW1DLFNBQW5FLEVBQThFO0FBQzVFSCxnQkFBWSxRQUFRQSxTQUFwQjtBQUNELEdBRkQsTUFFTyxJQUFJQyxPQUFPQyxNQUFQLENBQWNGLFNBQWQsS0FBNEJDLE9BQU9DLE1BQVAsQ0FBY0YsU0FBZCxFQUF5QkksSUFBekIsSUFBaUMsU0FBakUsRUFBNEU7QUFDakZKLGdCQUFZLFFBQVFBLFNBQXBCO0FBQ0Q7O0FBRUQsU0FBT0EsU0FBUDtBQUNELENBbEJEOztBQW9CQSxNQUFNSyw2QkFBNkIsQ0FBQ04sU0FBRCxFQUFZTyxPQUFaLEVBQXFCQyxTQUFyQixFQUFnQ0MsaUJBQWhDLEtBQXNEO0FBQ3ZGO0FBQ0EsTUFBSUMsTUFBTUgsT0FBVjtBQUNBLE1BQUlJLFlBQVksS0FBaEI7QUFDQSxVQUFPRCxHQUFQO0FBQ0EsU0FBSyxVQUFMO0FBQ0EsU0FBSyxLQUFMO0FBQ0UsVUFBSVYsY0FBYyxlQUFsQixFQUFtQztBQUNqQyxlQUFPO0FBQ0xVLGVBQUtBLEdBREE7QUFFTEUsaUJBQU9DLFNBQVNMLFNBQVQ7QUFGRixTQUFQO0FBSUQ7QUFDREUsWUFBTSxLQUFOO0FBQ0E7QUFDRixTQUFLLFdBQUw7QUFDQSxTQUFLLGFBQUw7QUFDRUEsWUFBTSxhQUFOO0FBQ0FDLGtCQUFZLElBQVo7QUFDQTtBQUNGLFNBQUssV0FBTDtBQUNBLFNBQUssYUFBTDtBQUNFRCxZQUFNLGFBQU47QUFDQUMsa0JBQVksSUFBWjtBQUNBO0FBQ0YsU0FBSyxjQUFMO0FBQ0EsU0FBSyxnQkFBTDtBQUNFRCxZQUFNLGdCQUFOO0FBQ0E7QUFDRixTQUFLLFdBQUw7QUFDQSxTQUFLLFlBQUw7QUFDRUEsWUFBTSxXQUFOO0FBQ0FDLGtCQUFZLElBQVo7QUFDQTtBQUNGLFNBQUssZ0NBQUw7QUFDRUQsWUFBTSxnQ0FBTjtBQUNBQyxrQkFBWSxJQUFaO0FBQ0E7QUFDRixTQUFLLDZCQUFMO0FBQ0VELFlBQU0sNkJBQU47QUFDQUMsa0JBQVksSUFBWjtBQUNBO0FBQ0YsU0FBSyxxQkFBTDtBQUNFRCxZQUFNLHFCQUFOO0FBQ0E7QUFDRixTQUFLLDhCQUFMO0FBQ0VBLFlBQU0sOEJBQU47QUFDQUMsa0JBQVksSUFBWjtBQUNBO0FBQ0YsU0FBSyxzQkFBTDtBQUNFRCxZQUFNLHNCQUFOO0FBQ0FDLGtCQUFZLElBQVo7QUFDQTtBQUNGLFNBQUssUUFBTDtBQUNBLFNBQUssUUFBTDtBQUNFLGFBQU8sRUFBQ0QsS0FBS0EsR0FBTixFQUFXRSxPQUFPSixTQUFsQixFQUFQO0FBQ0YsU0FBSyxVQUFMO0FBQ0EsU0FBSyxZQUFMO0FBQ0VFLFlBQU0sWUFBTjtBQUNBQyxrQkFBWSxJQUFaO0FBQ0E7QUFDRixTQUFLLFdBQUw7QUFDQSxTQUFLLFlBQUw7QUFDRUQsWUFBTSxZQUFOO0FBQ0FDLGtCQUFZLElBQVo7QUFDQTtBQTdERjs7QUFnRUEsTUFBS0Ysa0JBQWtCTixNQUFsQixDQUF5Qk8sR0FBekIsS0FBaUNELGtCQUFrQk4sTUFBbEIsQ0FBeUJPLEdBQXpCLEVBQThCTCxJQUE5QixLQUF1QyxTQUF6RSxJQUF3RixDQUFDSSxrQkFBa0JOLE1BQWxCLENBQXlCTyxHQUF6QixDQUFELElBQWtDRixTQUFsQyxJQUErQ0EsVUFBVUosTUFBVixJQUFvQixTQUEvSixFQUEySztBQUN6S00sVUFBTSxRQUFRQSxHQUFkO0FBQ0Q7O0FBRUQ7QUFDQSxNQUFJRSxRQUFRRSxzQkFBc0JOLFNBQXRCLENBQVo7QUFDQSxNQUFJSSxVQUFVRyxlQUFkLEVBQStCO0FBQzdCLFFBQUlKLGFBQWMsT0FBT0MsS0FBUCxLQUFpQixRQUFuQyxFQUE4QztBQUM1Q0EsY0FBUSxJQUFJSSxJQUFKLENBQVNKLEtBQVQsQ0FBUjtBQUNEO0FBQ0QsUUFBSUwsUUFBUVUsT0FBUixDQUFnQixHQUFoQixJQUF1QixDQUEzQixFQUE4QjtBQUM1QixhQUFPLEVBQUNQLEdBQUQsRUFBTUUsT0FBT0osU0FBYixFQUFQO0FBQ0Q7QUFDRCxXQUFPLEVBQUNFLEdBQUQsRUFBTUUsS0FBTixFQUFQO0FBQ0Q7O0FBRUQ7QUFDQSxNQUFJSixxQkFBcUJVLEtBQXpCLEVBQWdDO0FBQzlCTixZQUFRSixVQUFVVyxHQUFWLENBQWNDLHNCQUFkLENBQVI7QUFDQSxXQUFPLEVBQUNWLEdBQUQsRUFBTUUsS0FBTixFQUFQO0FBQ0Q7O0FBRUQ7QUFDQSxNQUFJLE9BQU9KLFNBQVAsS0FBcUIsUUFBckIsSUFBaUMsVUFBVUEsU0FBL0MsRUFBMEQ7QUFDeEQsV0FBTyxFQUFDRSxHQUFELEVBQU1FLE9BQU9TLHdCQUF3QmIsU0FBeEIsRUFBbUMsS0FBbkMsQ0FBYixFQUFQO0FBQ0Q7O0FBRUQ7QUFDQUksVUFBUVUsVUFBVWQsU0FBVixFQUFxQlksc0JBQXJCLENBQVI7QUFDQSxTQUFPLEVBQUNWLEdBQUQsRUFBTUUsS0FBTixFQUFQO0FBQ0QsQ0FsR0Q7O0FBb0dBLE1BQU1XLFVBQVVYLFNBQVM7QUFDdkIsU0FBT0EsU0FBVUEsaUJBQWlCWSxNQUFsQztBQUNELENBRkQ7O0FBSUEsTUFBTUMsb0JBQW9CYixTQUFTO0FBQ2pDLE1BQUksQ0FBQ1csUUFBUVgsS0FBUixDQUFMLEVBQXFCO0FBQ25CLFdBQU8sS0FBUDtBQUNEOztBQUVELFFBQU1jLFVBQVVkLE1BQU1lLFFBQU4sR0FBaUJDLEtBQWpCLENBQXVCLGdCQUF2QixDQUFoQjtBQUNBLFNBQU8sQ0FBQyxDQUFDRixPQUFUO0FBQ0QsQ0FQRDs7QUFTQSxNQUFNRyx5QkFBeUJDLFVBQVU7QUFDdkMsTUFBSSxDQUFDQSxNQUFELElBQVcsQ0FBQ1osTUFBTWEsT0FBTixDQUFjRCxNQUFkLENBQVosSUFBcUNBLE9BQU9FLE1BQVAsS0FBa0IsQ0FBM0QsRUFBOEQ7QUFDNUQsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsUUFBTUMscUJBQXFCUixrQkFBa0JLLE9BQU8sQ0FBUCxDQUFsQixDQUEzQjtBQUNBLE1BQUlBLE9BQU9FLE1BQVAsS0FBa0IsQ0FBdEIsRUFBeUI7QUFDdkIsV0FBT0Msa0JBQVA7QUFDRDs7QUFFRCxPQUFLLElBQUlDLElBQUksQ0FBUixFQUFXRixTQUFTRixPQUFPRSxNQUFoQyxFQUF3Q0UsSUFBSUYsTUFBNUMsRUFBb0QsRUFBRUUsQ0FBdEQsRUFBeUQ7QUFDdkQsUUFBSUQsdUJBQXVCUixrQkFBa0JLLE9BQU9JLENBQVAsQ0FBbEIsQ0FBM0IsRUFBeUQ7QUFDdkQsYUFBTyxLQUFQO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPLElBQVA7QUFDRCxDQWpCRDs7QUFtQkEsTUFBTUMsa0JBQWtCTCxVQUFVO0FBQ2hDLFNBQU9BLE9BQU9NLElBQVAsQ0FBWSxVQUFVeEIsS0FBVixFQUFpQjtBQUNsQyxXQUFPVyxRQUFRWCxLQUFSLENBQVA7QUFDRCxHQUZNLENBQVA7QUFHRCxDQUpEOztBQU1BLE1BQU1RLHlCQUF5QlosYUFBYTtBQUMxQyxNQUFJQSxjQUFjLElBQWQsSUFBc0IsT0FBT0EsU0FBUCxLQUFxQixRQUEzQyxJQUF1RDZCLE9BQU9DLElBQVAsQ0FBWTlCLFNBQVosRUFBdUI0QixJQUF2QixDQUE0QjFCLE9BQU9BLElBQUk2QixRQUFKLENBQWEsR0FBYixLQUFxQjdCLElBQUk2QixRQUFKLENBQWEsR0FBYixDQUF4RCxDQUEzRCxFQUF1STtBQUNySSxVQUFNLElBQUl6QyxNQUFNMEMsS0FBVixDQUFnQjFDLE1BQU0wQyxLQUFOLENBQVlDLGtCQUE1QixFQUFnRCwwREFBaEQsQ0FBTjtBQUNEO0FBQ0Q7QUFDQSxNQUFJN0IsUUFBUThCLHNCQUFzQmxDLFNBQXRCLENBQVo7QUFDQSxNQUFJSSxVQUFVRyxlQUFkLEVBQStCO0FBQzdCLFdBQU9ILEtBQVA7QUFDRDs7QUFFRDtBQUNBLE1BQUlKLHFCQUFxQlUsS0FBekIsRUFBZ0M7QUFDOUIsV0FBT1YsVUFBVVcsR0FBVixDQUFjQyxzQkFBZCxDQUFQO0FBQ0Q7O0FBRUQ7QUFDQSxNQUFJLE9BQU9aLFNBQVAsS0FBcUIsUUFBckIsSUFBaUMsVUFBVUEsU0FBL0MsRUFBMEQ7QUFDeEQsV0FBT2Esd0JBQXdCYixTQUF4QixFQUFtQyxJQUFuQyxDQUFQO0FBQ0Q7O0FBRUQ7QUFDQSxTQUFPYyxVQUFVZCxTQUFWLEVBQXFCWSxzQkFBckIsQ0FBUDtBQUNELENBdEJEOztBQXdCQSxNQUFNdUIsY0FBYy9CLFNBQVM7QUFDM0IsTUFBSSxPQUFPQSxLQUFQLEtBQWlCLFFBQXJCLEVBQStCO0FBQzdCLFdBQU8sSUFBSUksSUFBSixDQUFTSixLQUFULENBQVA7QUFDRCxHQUZELE1BRU8sSUFBSUEsaUJBQWlCSSxJQUFyQixFQUEyQjtBQUNoQyxXQUFPSixLQUFQO0FBQ0Q7QUFDRCxTQUFPLEtBQVA7QUFDRCxDQVBEOztBQVNBLFNBQVNnQyxzQkFBVCxDQUFnQzVDLFNBQWhDLEVBQTJDVSxHQUEzQyxFQUFnREUsS0FBaEQsRUFBdURWLE1BQXZELEVBQStEO0FBQzdELFVBQU9RLEdBQVA7QUFDQSxTQUFLLFdBQUw7QUFDRSxVQUFJaUMsWUFBWS9CLEtBQVosQ0FBSixFQUF3QjtBQUN0QixlQUFPLEVBQUNGLEtBQUssYUFBTixFQUFxQkUsT0FBTytCLFlBQVkvQixLQUFaLENBQTVCLEVBQVA7QUFDRDtBQUNERixZQUFNLGFBQU47QUFDQTtBQUNGLFNBQUssV0FBTDtBQUNFLFVBQUlpQyxZQUFZL0IsS0FBWixDQUFKLEVBQXdCO0FBQ3RCLGVBQU8sRUFBQ0YsS0FBSyxhQUFOLEVBQXFCRSxPQUFPK0IsWUFBWS9CLEtBQVosQ0FBNUIsRUFBUDtBQUNEO0FBQ0RGLFlBQU0sYUFBTjtBQUNBO0FBQ0YsU0FBSyxXQUFMO0FBQ0UsVUFBSWlDLFlBQVkvQixLQUFaLENBQUosRUFBd0I7QUFDdEIsZUFBTyxFQUFDRixLQUFLLFdBQU4sRUFBbUJFLE9BQU8rQixZQUFZL0IsS0FBWixDQUExQixFQUFQO0FBQ0Q7QUFDRDtBQUNGLFNBQUssZ0NBQUw7QUFDRSxVQUFJK0IsWUFBWS9CLEtBQVosQ0FBSixFQUF3QjtBQUN0QixlQUFPLEVBQUNGLEtBQUssZ0NBQU4sRUFBd0NFLE9BQU8rQixZQUFZL0IsS0FBWixDQUEvQyxFQUFQO0FBQ0Q7QUFDRDtBQUNGLFNBQUssVUFBTDtBQUFpQjtBQUNmLFlBQUlaLGNBQWMsZUFBbEIsRUFBbUM7QUFDakNZLGtCQUFRQyxTQUFTRCxLQUFULENBQVI7QUFDRDtBQUNELGVBQU8sRUFBQ0YsS0FBSyxLQUFOLEVBQWFFLEtBQWIsRUFBUDtBQUNEO0FBQ0QsU0FBSyw2QkFBTDtBQUNFLFVBQUkrQixZQUFZL0IsS0FBWixDQUFKLEVBQXdCO0FBQ3RCLGVBQU8sRUFBQ0YsS0FBSyw2QkFBTixFQUFxQ0UsT0FBTytCLFlBQVkvQixLQUFaLENBQTVDLEVBQVA7QUFDRDtBQUNEO0FBQ0YsU0FBSyxxQkFBTDtBQUNFLGFBQU8sRUFBQ0YsR0FBRCxFQUFNRSxLQUFOLEVBQVA7QUFDRixTQUFLLGNBQUw7QUFBcUIsYUFBTyxFQUFDRixLQUFLLGdCQUFOLEVBQXdCRSxLQUF4QixFQUFQO0FBQ3JCLFNBQUssOEJBQUw7QUFDRSxVQUFJK0IsWUFBWS9CLEtBQVosQ0FBSixFQUF3QjtBQUN0QixlQUFPLEVBQUVGLEtBQUssOEJBQVAsRUFBdUNFLE9BQU8rQixZQUFZL0IsS0FBWixDQUE5QyxFQUFQO0FBQ0Q7QUFDRDtBQUNGLFNBQUssc0JBQUw7QUFDRSxVQUFJK0IsWUFBWS9CLEtBQVosQ0FBSixFQUF3QjtBQUN0QixlQUFPLEVBQUVGLEtBQUssc0JBQVAsRUFBK0JFLE9BQU8rQixZQUFZL0IsS0FBWixDQUF0QyxFQUFQO0FBQ0Q7QUFDRDtBQUNGLFNBQUssUUFBTDtBQUNBLFNBQUssUUFBTDtBQUNBLFNBQUssbUJBQUw7QUFDQSxTQUFLLHFCQUFMO0FBQTRCLGFBQU8sRUFBQ0YsR0FBRCxFQUFNRSxLQUFOLEVBQVA7QUFDNUIsU0FBSyxLQUFMO0FBQ0EsU0FBSyxNQUFMO0FBQ0EsU0FBSyxNQUFMO0FBQ0UsYUFBTyxFQUFDRixLQUFLQSxHQUFOLEVBQVdFLE9BQU9BLE1BQU1PLEdBQU4sQ0FBVTBCLFlBQVlDLGVBQWU5QyxTQUFmLEVBQTBCNkMsUUFBMUIsRUFBb0MzQyxNQUFwQyxDQUF0QixDQUFsQixFQUFQO0FBQ0YsU0FBSyxVQUFMO0FBQ0UsVUFBSXlDLFlBQVkvQixLQUFaLENBQUosRUFBd0I7QUFDdEIsZUFBTyxFQUFDRixLQUFLLFlBQU4sRUFBb0JFLE9BQU8rQixZQUFZL0IsS0FBWixDQUEzQixFQUFQO0FBQ0Q7QUFDREYsWUFBTSxZQUFOO0FBQ0E7QUFDRixTQUFLLFdBQUw7QUFDRSxhQUFPLEVBQUNBLEtBQUssWUFBTixFQUFvQkUsT0FBT0EsS0FBM0IsRUFBUDtBQUNGO0FBQVM7QUFDUDtBQUNBLGNBQU1tQyxnQkFBZ0JyQyxJQUFJa0IsS0FBSixDQUFVLGlDQUFWLENBQXRCO0FBQ0EsWUFBSW1CLGFBQUosRUFBbUI7QUFDakIsZ0JBQU1DLFdBQVdELGNBQWMsQ0FBZCxDQUFqQjtBQUNBO0FBQ0EsaUJBQU8sRUFBQ3JDLEtBQU0sY0FBYXNDLFFBQVMsS0FBN0IsRUFBbUNwQyxLQUFuQyxFQUFQO0FBQ0Q7QUFDRjtBQXZFRDs7QUEwRUEsUUFBTXFDLHNCQUNKL0MsVUFDQUEsT0FBT0MsTUFBUCxDQUFjTyxHQUFkLENBREEsSUFFQVIsT0FBT0MsTUFBUCxDQUFjTyxHQUFkLEVBQW1CTCxJQUFuQixLQUE0QixPQUg5Qjs7QUFLQSxRQUFNNkMsd0JBQ0poRCxVQUNBQSxPQUFPQyxNQUFQLENBQWNPLEdBQWQsQ0FEQSxJQUVBUixPQUFPQyxNQUFQLENBQWNPLEdBQWQsRUFBbUJMLElBQW5CLEtBQTRCLFNBSDlCOztBQUtBLFFBQU04QyxRQUFRakQsVUFBVUEsT0FBT0MsTUFBUCxDQUFjTyxHQUFkLENBQXhCO0FBQ0EsTUFBSXdDLHlCQUF5QixDQUFDaEQsTUFBRCxJQUFXVSxLQUFYLElBQW9CQSxNQUFNUixNQUFOLEtBQWlCLFNBQWxFLEVBQTZFO0FBQzNFTSxVQUFNLFFBQVFBLEdBQWQ7QUFDRDs7QUFFRDtBQUNBLFFBQU0wQyx3QkFBd0JDLG9CQUFvQnpDLEtBQXBCLEVBQTJCdUMsS0FBM0IsQ0FBOUI7QUFDQSxNQUFJQywwQkFBMEJyQyxlQUE5QixFQUErQztBQUM3QyxRQUFJcUMsc0JBQXNCRSxLQUExQixFQUFpQztBQUMvQixhQUFPLEVBQUM1QyxLQUFLLE9BQU4sRUFBZUUsT0FBT3dDLHNCQUFzQkUsS0FBNUMsRUFBUDtBQUNEO0FBQ0QsUUFBSUYsc0JBQXNCRyxVQUExQixFQUFzQztBQUNwQyxhQUFPLEVBQUU3QyxLQUFLLE1BQVAsRUFBZUUsT0FBTyxDQUFDLEVBQUUsQ0FBQ0YsR0FBRCxHQUFPMEMscUJBQVQsRUFBRCxDQUF0QixFQUFQO0FBQ0Q7QUFDRCxXQUFPLEVBQUMxQyxHQUFELEVBQU1FLE9BQU93QyxxQkFBYixFQUFQO0FBQ0Q7O0FBRUQsTUFBSUgsdUJBQXVCLEVBQUVyQyxpQkFBaUJNLEtBQW5CLENBQTNCLEVBQXNEO0FBQ3BELFdBQU8sRUFBQ1IsR0FBRCxFQUFNRSxPQUFPLEVBQUUsUUFBUyxDQUFDOEIsc0JBQXNCOUIsS0FBdEIsQ0FBRCxDQUFYLEVBQWIsRUFBUDtBQUNEOztBQUVEO0FBQ0EsTUFBSUUsc0JBQXNCRixLQUF0QixNQUFpQ0csZUFBckMsRUFBc0Q7QUFDcEQsV0FBTyxFQUFDTCxHQUFELEVBQU1FLE9BQU9FLHNCQUFzQkYsS0FBdEIsQ0FBYixFQUFQO0FBQ0QsR0FGRCxNQUVPO0FBQ0wsVUFBTSxJQUFJZCxNQUFNMEMsS0FBVixDQUFnQjFDLE1BQU0wQyxLQUFOLENBQVlnQixZQUE1QixFQUEyQyxrQkFBaUI1QyxLQUFNLHdCQUFsRSxDQUFOO0FBQ0Q7QUFDRjs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxTQUFTa0MsY0FBVCxDQUF3QjlDLFNBQXhCLEVBQW1DeUQsU0FBbkMsRUFBOEN2RCxNQUE5QyxFQUFzRDtBQUNwRCxRQUFNd0QsYUFBYSxFQUFuQjtBQUNBLE9BQUssTUFBTW5ELE9BQVgsSUFBc0JrRCxTQUF0QixFQUFpQztBQUMvQixVQUFNRSxNQUFNZix1QkFBdUI1QyxTQUF2QixFQUFrQ08sT0FBbEMsRUFBMkNrRCxVQUFVbEQsT0FBVixDQUEzQyxFQUErREwsTUFBL0QsQ0FBWjtBQUNBd0QsZUFBV0MsSUFBSWpELEdBQWYsSUFBc0JpRCxJQUFJL0MsS0FBMUI7QUFDRDtBQUNELFNBQU84QyxVQUFQO0FBQ0Q7O0FBRUQsTUFBTUUsMkNBQTJDLENBQUNyRCxPQUFELEVBQVVDLFNBQVYsRUFBcUJOLE1BQXJCLEtBQWdDO0FBQy9FO0FBQ0EsTUFBSTJELGdCQUFKO0FBQ0EsTUFBSUMsYUFBSjtBQUNBLFVBQU92RCxPQUFQO0FBQ0EsU0FBSyxVQUFMO0FBQWlCLGFBQU8sRUFBQ0csS0FBSyxLQUFOLEVBQWFFLE9BQU9KLFNBQXBCLEVBQVA7QUFDakIsU0FBSyxXQUFMO0FBQ0VxRCx5QkFBbUIvQyxzQkFBc0JOLFNBQXRCLENBQW5CO0FBQ0FzRCxzQkFBZ0IsT0FBT0QsZ0JBQVAsS0FBNEIsUUFBNUIsR0FBdUMsSUFBSTdDLElBQUosQ0FBUzZDLGdCQUFULENBQXZDLEdBQW9FQSxnQkFBcEY7QUFDQSxhQUFPLEVBQUNuRCxLQUFLLFdBQU4sRUFBbUJFLE9BQU9rRCxhQUExQixFQUFQO0FBQ0YsU0FBSyxnQ0FBTDtBQUNFRCx5QkFBbUIvQyxzQkFBc0JOLFNBQXRCLENBQW5CO0FBQ0FzRCxzQkFBZ0IsT0FBT0QsZ0JBQVAsS0FBNEIsUUFBNUIsR0FBdUMsSUFBSTdDLElBQUosQ0FBUzZDLGdCQUFULENBQXZDLEdBQW9FQSxnQkFBcEY7QUFDQSxhQUFPLEVBQUNuRCxLQUFLLGdDQUFOLEVBQXdDRSxPQUFPa0QsYUFBL0MsRUFBUDtBQUNGLFNBQUssNkJBQUw7QUFDRUQseUJBQW1CL0Msc0JBQXNCTixTQUF0QixDQUFuQjtBQUNBc0Qsc0JBQWdCLE9BQU9ELGdCQUFQLEtBQTRCLFFBQTVCLEdBQXVDLElBQUk3QyxJQUFKLENBQVM2QyxnQkFBVCxDQUF2QyxHQUFvRUEsZ0JBQXBGO0FBQ0EsYUFBTyxFQUFDbkQsS0FBSyw2QkFBTixFQUFxQ0UsT0FBT2tELGFBQTVDLEVBQVA7QUFDRixTQUFLLDhCQUFMO0FBQ0VELHlCQUFtQi9DLHNCQUFzQk4sU0FBdEIsQ0FBbkI7QUFDQXNELHNCQUFnQixPQUFPRCxnQkFBUCxLQUE0QixRQUE1QixHQUF1QyxJQUFJN0MsSUFBSixDQUFTNkMsZ0JBQVQsQ0FBdkMsR0FBb0VBLGdCQUFwRjtBQUNBLGFBQU8sRUFBRW5ELEtBQUssOEJBQVAsRUFBdUNFLE9BQU9rRCxhQUE5QyxFQUFQO0FBQ0YsU0FBSyxzQkFBTDtBQUNFRCx5QkFBbUIvQyxzQkFBc0JOLFNBQXRCLENBQW5CO0FBQ0FzRCxzQkFBZ0IsT0FBT0QsZ0JBQVAsS0FBNEIsUUFBNUIsR0FBdUMsSUFBSTdDLElBQUosQ0FBUzZDLGdCQUFULENBQXZDLEdBQW9FQSxnQkFBcEY7QUFDQSxhQUFPLEVBQUVuRCxLQUFLLHNCQUFQLEVBQStCRSxPQUFPa0QsYUFBdEMsRUFBUDtBQUNGLFNBQUsscUJBQUw7QUFDQSxTQUFLLFFBQUw7QUFDQSxTQUFLLFFBQUw7QUFDQSxTQUFLLHFCQUFMO0FBQ0EsU0FBSyxrQkFBTDtBQUNBLFNBQUssbUJBQUw7QUFBMEIsYUFBTyxFQUFDcEQsS0FBS0gsT0FBTixFQUFlSyxPQUFPSixTQUF0QixFQUFQO0FBQzFCLFNBQUssY0FBTDtBQUFxQixhQUFPLEVBQUNFLEtBQUssZ0JBQU4sRUFBd0JFLE9BQU9KLFNBQS9CLEVBQVA7QUFDckI7QUFDRTtBQUNBLFVBQUlELFFBQVFxQixLQUFSLENBQWMsaUNBQWQsQ0FBSixFQUFzRDtBQUNwRCxjQUFNLElBQUk5QixNQUFNMEMsS0FBVixDQUFnQjFDLE1BQU0wQyxLQUFOLENBQVl1QixnQkFBNUIsRUFBOEMsdUJBQXVCeEQsT0FBckUsQ0FBTjtBQUNEO0FBQ0Q7QUFDQSxVQUFJQSxRQUFRcUIsS0FBUixDQUFjLDRCQUFkLENBQUosRUFBaUQ7QUFDL0MsZUFBTyxFQUFDbEIsS0FBS0gsT0FBTixFQUFlSyxPQUFPSixTQUF0QixFQUFQO0FBQ0Q7QUFyQ0g7QUF1Q0E7QUFDQSxNQUFJQSxhQUFhQSxVQUFVSixNQUFWLEtBQXFCLE9BQXRDLEVBQStDO0FBQzdDO0FBQ0E7QUFDQSxRQUFJRixPQUFPQyxNQUFQLENBQWNJLE9BQWQsS0FBMEJMLE9BQU9DLE1BQVAsQ0FBY0ksT0FBZCxFQUF1QkYsSUFBdkIsSUFBK0IsU0FBekQsSUFBc0VHLFVBQVVKLE1BQVYsSUFBb0IsU0FBOUYsRUFBeUc7QUFDdkdHLGdCQUFVLFFBQVFBLE9BQWxCO0FBQ0Q7QUFDRjs7QUFFRDtBQUNBLE1BQUlLLFFBQVFFLHNCQUFzQk4sU0FBdEIsQ0FBWjtBQUNBLE1BQUlJLFVBQVVHLGVBQWQsRUFBK0I7QUFDN0IsV0FBTyxFQUFDTCxLQUFLSCxPQUFOLEVBQWVLLE9BQU9BLEtBQXRCLEVBQVA7QUFDRDs7QUFFRDtBQUNBO0FBQ0EsTUFBSUwsWUFBWSxLQUFoQixFQUF1QjtBQUNyQixVQUFNLDBDQUFOO0FBQ0Q7O0FBRUQ7QUFDQSxNQUFJQyxxQkFBcUJVLEtBQXpCLEVBQWdDO0FBQzlCTixZQUFRSixVQUFVVyxHQUFWLENBQWNDLHNCQUFkLENBQVI7QUFDQSxXQUFPLEVBQUNWLEtBQUtILE9BQU4sRUFBZUssT0FBT0EsS0FBdEIsRUFBUDtBQUNEOztBQUVEO0FBQ0EsTUFBSXlCLE9BQU9DLElBQVAsQ0FBWTlCLFNBQVosRUFBdUI0QixJQUF2QixDQUE0QjFCLE9BQU9BLElBQUk2QixRQUFKLENBQWEsR0FBYixLQUFxQjdCLElBQUk2QixRQUFKLENBQWEsR0FBYixDQUF4RCxDQUFKLEVBQWdGO0FBQzlFLFVBQU0sSUFBSXpDLE1BQU0wQyxLQUFWLENBQWdCMUMsTUFBTTBDLEtBQU4sQ0FBWUMsa0JBQTVCLEVBQWdELDBEQUFoRCxDQUFOO0FBQ0Q7QUFDRDdCLFVBQVFVLFVBQVVkLFNBQVYsRUFBcUJZLHNCQUFyQixDQUFSO0FBQ0EsU0FBTyxFQUFDVixLQUFLSCxPQUFOLEVBQWVLLEtBQWYsRUFBUDtBQUNELENBNUVEOztBQThFQSxNQUFNb0Qsb0NBQW9DLENBQUNoRSxTQUFELEVBQVlpRSxVQUFaLEVBQXdCL0QsTUFBeEIsS0FBbUM7QUFDM0UrRCxlQUFhQyxhQUFhRCxVQUFiLENBQWI7QUFDQSxRQUFNRSxjQUFjLEVBQXBCO0FBQ0EsT0FBSyxNQUFNNUQsT0FBWCxJQUFzQjBELFVBQXRCLEVBQWtDO0FBQ2hDLFFBQUlBLFdBQVcxRCxPQUFYLEtBQXVCMEQsV0FBVzFELE9BQVgsRUFBb0JILE1BQXBCLEtBQStCLFVBQTFELEVBQXNFO0FBQ3BFO0FBQ0Q7QUFDRCxVQUFNLEVBQUVNLEdBQUYsRUFBT0UsS0FBUCxLQUFpQmdELHlDQUNyQnJELE9BRHFCLEVBRXJCMEQsV0FBVzFELE9BQVgsQ0FGcUIsRUFHckJMLE1BSHFCLENBQXZCO0FBS0EsUUFBSVUsVUFBVXdELFNBQWQsRUFBeUI7QUFDdkJELGtCQUFZekQsR0FBWixJQUFtQkUsS0FBbkI7QUFDRDtBQUNGOztBQUVEO0FBQ0EsTUFBSXVELFlBQVlFLFNBQWhCLEVBQTJCO0FBQ3pCRixnQkFBWUcsV0FBWixHQUEwQixJQUFJdEQsSUFBSixDQUFTbUQsWUFBWUUsU0FBWixDQUFzQkUsR0FBdEIsSUFBNkJKLFlBQVlFLFNBQWxELENBQTFCO0FBQ0EsV0FBT0YsWUFBWUUsU0FBbkI7QUFDRDtBQUNELE1BQUlGLFlBQVlLLFNBQWhCLEVBQTJCO0FBQ3pCTCxnQkFBWU0sV0FBWixHQUEwQixJQUFJekQsSUFBSixDQUFTbUQsWUFBWUssU0FBWixDQUFzQkQsR0FBdEIsSUFBNkJKLFlBQVlLLFNBQWxELENBQTFCO0FBQ0EsV0FBT0wsWUFBWUssU0FBbkI7QUFDRDs7QUFFRCxTQUFPTCxXQUFQO0FBQ0QsQ0E1QkQ7O0FBOEJBO0FBQ0EsTUFBTU8sa0JBQWtCLENBQUMxRSxTQUFELEVBQVkyRSxVQUFaLEVBQXdCbEUsaUJBQXhCLEtBQThDO0FBQ3BFLFFBQU1tRSxjQUFjLEVBQXBCO0FBQ0EsUUFBTUMsTUFBTVgsYUFBYVMsVUFBYixDQUFaO0FBQ0EsTUFBSUUsSUFBSUMsTUFBSixJQUFjRCxJQUFJRSxNQUFsQixJQUE0QkYsSUFBSUcsSUFBcEMsRUFBMEM7QUFDeENKLGdCQUFZSyxJQUFaLEdBQW1CLEVBQW5CO0FBQ0EsUUFBSUosSUFBSUMsTUFBUixFQUFnQjtBQUNkRixrQkFBWUssSUFBWixDQUFpQkgsTUFBakIsR0FBMEJELElBQUlDLE1BQTlCO0FBQ0Q7QUFDRCxRQUFJRCxJQUFJRSxNQUFSLEVBQWdCO0FBQ2RILGtCQUFZSyxJQUFaLENBQWlCRixNQUFqQixHQUEwQkYsSUFBSUUsTUFBOUI7QUFDRDtBQUNELFFBQUlGLElBQUlHLElBQVIsRUFBYztBQUNaSixrQkFBWUssSUFBWixDQUFpQkQsSUFBakIsR0FBd0JILElBQUlHLElBQTVCO0FBQ0Q7QUFDRjtBQUNELE9BQUssSUFBSXpFLE9BQVQsSUFBb0JvRSxVQUFwQixFQUFnQztBQUM5QixRQUFJQSxXQUFXcEUsT0FBWCxLQUF1Qm9FLFdBQVdwRSxPQUFYLEVBQW9CSCxNQUFwQixLQUErQixVQUExRCxFQUFzRTtBQUNwRTtBQUNEO0FBQ0QsUUFBSXVELE1BQU1yRCwyQkFBMkJOLFNBQTNCLEVBQXNDTyxPQUF0QyxFQUErQ29FLFdBQVdwRSxPQUFYLENBQS9DLEVBQW9FRSxpQkFBcEUsQ0FBVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFJLE9BQU9rRCxJQUFJL0MsS0FBWCxLQUFxQixRQUFyQixJQUFpQytDLElBQUkvQyxLQUFKLEtBQWMsSUFBL0MsSUFBdUQrQyxJQUFJL0MsS0FBSixDQUFVc0UsSUFBckUsRUFBMkU7QUFDekVOLGtCQUFZakIsSUFBSS9DLEtBQUosQ0FBVXNFLElBQXRCLElBQThCTixZQUFZakIsSUFBSS9DLEtBQUosQ0FBVXNFLElBQXRCLEtBQStCLEVBQTdEO0FBQ0FOLGtCQUFZakIsSUFBSS9DLEtBQUosQ0FBVXNFLElBQXRCLEVBQTRCdkIsSUFBSWpELEdBQWhDLElBQXVDaUQsSUFBSS9DLEtBQUosQ0FBVXVFLEdBQWpEO0FBQ0QsS0FIRCxNQUdPO0FBQ0xQLGtCQUFZLE1BQVosSUFBc0JBLFlBQVksTUFBWixLQUF1QixFQUE3QztBQUNBQSxrQkFBWSxNQUFaLEVBQW9CakIsSUFBSWpELEdBQXhCLElBQStCaUQsSUFBSS9DLEtBQW5DO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPZ0UsV0FBUDtBQUNELENBbENEOztBQW9DQTtBQUNBLE1BQU1WLGVBQWVrQixjQUFjO0FBQ2pDLFFBQU1DLDhCQUFxQkQsVUFBckIsQ0FBTjtBQUNBLFFBQU1KLE9BQU8sRUFBYjs7QUFFQSxNQUFJSSxXQUFXTCxNQUFmLEVBQXVCO0FBQ3JCSyxlQUFXTCxNQUFYLENBQWtCTyxPQUFsQixDQUEwQkMsU0FBUztBQUNqQ1AsV0FBS08sS0FBTCxJQUFjLEVBQUVDLEdBQUcsSUFBTCxFQUFkO0FBQ0QsS0FGRDtBQUdBSCxtQkFBZUwsSUFBZixHQUFzQkEsSUFBdEI7QUFDRDs7QUFFRCxNQUFJSSxXQUFXTixNQUFmLEVBQXVCO0FBQ3JCTSxlQUFXTixNQUFYLENBQWtCUSxPQUFsQixDQUEwQkMsU0FBUztBQUNqQyxVQUFJLEVBQUVBLFNBQVNQLElBQVgsQ0FBSixFQUFzQjtBQUNwQkEsYUFBS08sS0FBTCxJQUFjLEVBQUVFLEdBQUcsSUFBTCxFQUFkO0FBQ0QsT0FGRCxNQUVPO0FBQ0xULGFBQUtPLEtBQUwsRUFBWUUsQ0FBWixHQUFnQixJQUFoQjtBQUNEO0FBQ0YsS0FORDtBQU9BSixtQkFBZUwsSUFBZixHQUFzQkEsSUFBdEI7QUFDRDs7QUFFRCxTQUFPSyxjQUFQO0FBQ0QsQ0F2QkQ7O0FBMEJBO0FBQ0E7QUFDQSxTQUFTdEUsZUFBVCxHQUEyQixDQUFFOztBQUU3QixNQUFNMkIsd0JBQXlCZ0QsSUFBRCxJQUFVO0FBQ3RDO0FBQ0EsTUFBSSxPQUFPQSxJQUFQLEtBQWdCLFFBQWhCLElBQTRCQSxJQUE1QixJQUFvQyxFQUFFQSxnQkFBZ0IxRSxJQUFsQixDQUFwQyxJQUErRDBFLEtBQUt0RixNQUFMLEtBQWdCLFNBQW5GLEVBQThGO0FBQzVGLFdBQU87QUFDTEEsY0FBUSxTQURIO0FBRUxKLGlCQUFXMEYsS0FBSzFGLFNBRlg7QUFHTDJGLGdCQUFVRCxLQUFLQztBQUhWLEtBQVA7QUFLRCxHQU5ELE1BTU8sSUFBSSxPQUFPRCxJQUFQLEtBQWdCLFVBQWhCLElBQThCLE9BQU9BLElBQVAsS0FBZ0IsUUFBbEQsRUFBNEQ7QUFDakUsVUFBTSxJQUFJNUYsTUFBTTBDLEtBQVYsQ0FBZ0IxQyxNQUFNMEMsS0FBTixDQUFZZ0IsWUFBNUIsRUFBMkMsMkJBQTBCa0MsSUFBSyxFQUExRSxDQUFOO0FBQ0QsR0FGTSxNQUVBLElBQUlFLFVBQVVDLFdBQVYsQ0FBc0JILElBQXRCLENBQUosRUFBaUM7QUFDdEMsV0FBT0UsVUFBVUUsY0FBVixDQUF5QkosSUFBekIsQ0FBUDtBQUNELEdBRk0sTUFFQSxJQUFJSyxXQUFXRixXQUFYLENBQXVCSCxJQUF2QixDQUFKLEVBQWtDO0FBQ3ZDLFdBQU9LLFdBQVdELGNBQVgsQ0FBMEJKLElBQTFCLENBQVA7QUFDRCxHQUZNLE1BRUEsSUFBSSxPQUFPQSxJQUFQLEtBQWdCLFFBQWhCLElBQTRCQSxJQUE1QixJQUFvQ0EsS0FBS00sTUFBTCxLQUFnQjVCLFNBQXhELEVBQW1FO0FBQ3hFLFdBQU8sSUFBSTVDLE1BQUosQ0FBV2tFLEtBQUtNLE1BQWhCLENBQVA7QUFDRCxHQUZNLE1BRUE7QUFDTCxXQUFPTixJQUFQO0FBQ0Q7QUFDRixDQW5CRDs7QUFxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTNUUscUJBQVQsQ0FBK0I0RSxJQUEvQixFQUFxQ3ZDLEtBQXJDLEVBQTRDO0FBQzFDLFVBQU8sT0FBT3VDLElBQWQ7QUFDQSxTQUFLLFFBQUw7QUFDQSxTQUFLLFNBQUw7QUFDQSxTQUFLLFdBQUw7QUFDRSxhQUFPQSxJQUFQO0FBQ0YsU0FBSyxRQUFMO0FBQ0UsVUFBSXZDLFNBQVNBLE1BQU05QyxJQUFOLEtBQWUsU0FBNUIsRUFBdUM7QUFDckMsZUFBUSxHQUFFOEMsTUFBTThDLFdBQVksSUFBR1AsSUFBSyxFQUFwQztBQUNEO0FBQ0QsYUFBT0EsSUFBUDtBQUNGLFNBQUssUUFBTDtBQUNBLFNBQUssVUFBTDtBQUNFLFlBQU0sSUFBSTVGLE1BQU0wQyxLQUFWLENBQWdCMUMsTUFBTTBDLEtBQU4sQ0FBWWdCLFlBQTVCLEVBQTJDLDJCQUEwQmtDLElBQUssRUFBMUUsQ0FBTjtBQUNGLFNBQUssUUFBTDtBQUNFLFVBQUlBLGdCQUFnQjFFLElBQXBCLEVBQTBCO0FBQ3hCO0FBQ0E7QUFDQSxlQUFPMEUsSUFBUDtBQUNEOztBQUVELFVBQUlBLFNBQVMsSUFBYixFQUFtQjtBQUNqQixlQUFPQSxJQUFQO0FBQ0Q7O0FBRUQ7QUFDQSxVQUFJQSxLQUFLdEYsTUFBTCxJQUFlLFNBQW5CLEVBQThCO0FBQzVCLGVBQVEsR0FBRXNGLEtBQUsxRixTQUFVLElBQUcwRixLQUFLQyxRQUFTLEVBQTFDO0FBQ0Q7QUFDRCxVQUFJQyxVQUFVQyxXQUFWLENBQXNCSCxJQUF0QixDQUFKLEVBQWlDO0FBQy9CLGVBQU9FLFVBQVVFLGNBQVYsQ0FBeUJKLElBQXpCLENBQVA7QUFDRDtBQUNELFVBQUlLLFdBQVdGLFdBQVgsQ0FBdUJILElBQXZCLENBQUosRUFBa0M7QUFDaEMsZUFBT0ssV0FBV0QsY0FBWCxDQUEwQkosSUFBMUIsQ0FBUDtBQUNEO0FBQ0QsVUFBSVEsY0FBY0wsV0FBZCxDQUEwQkgsSUFBMUIsQ0FBSixFQUFxQztBQUNuQyxlQUFPUSxjQUFjSixjQUFkLENBQTZCSixJQUE3QixDQUFQO0FBQ0Q7QUFDRCxVQUFJUyxhQUFhTixXQUFiLENBQXlCSCxJQUF6QixDQUFKLEVBQW9DO0FBQ2xDLGVBQU9TLGFBQWFMLGNBQWIsQ0FBNEJKLElBQTVCLENBQVA7QUFDRDtBQUNELFVBQUlVLFVBQVVQLFdBQVYsQ0FBc0JILElBQXRCLENBQUosRUFBaUM7QUFDL0IsZUFBT1UsVUFBVU4sY0FBVixDQUF5QkosSUFBekIsQ0FBUDtBQUNEO0FBQ0QsYUFBTzNFLGVBQVA7O0FBRUY7QUFDRTtBQUNBLFlBQU0sSUFBSWpCLE1BQU0wQyxLQUFWLENBQWdCMUMsTUFBTTBDLEtBQU4sQ0FBWTZELHFCQUE1QixFQUFvRCxnQ0FBK0JYLElBQUssRUFBeEYsQ0FBTjtBQS9DRjtBQWlERDs7QUFFRCxTQUFTWSxrQkFBVCxDQUE0QkMsSUFBNUIsRUFBa0NDLE1BQU0sSUFBSXhGLElBQUosRUFBeEMsRUFBb0Q7QUFDbER1RixTQUFPQSxLQUFLRSxXQUFMLEVBQVA7O0FBRUEsTUFBSUMsUUFBUUgsS0FBS0ksS0FBTCxDQUFXLEdBQVgsQ0FBWjs7QUFFQTtBQUNBRCxVQUFRQSxNQUFNRSxNQUFOLENBQWNDLElBQUQsSUFBVUEsU0FBUyxFQUFoQyxDQUFSOztBQUVBLFFBQU1DLFNBQVNKLE1BQU0sQ0FBTixNQUFhLElBQTVCO0FBQ0EsUUFBTUssT0FBT0wsTUFBTUEsTUFBTTFFLE1BQU4sR0FBZSxDQUFyQixNQUE0QixLQUF6Qzs7QUFFQSxNQUFJLENBQUM4RSxNQUFELElBQVcsQ0FBQ0MsSUFBWixJQUFvQlIsU0FBUyxLQUFqQyxFQUF3QztBQUN0QyxXQUFPLEVBQUVTLFFBQVEsT0FBVixFQUFtQkMsTUFBTSxzREFBekIsRUFBUDtBQUNEOztBQUVELE1BQUlILFVBQVVDLElBQWQsRUFBb0I7QUFDbEIsV0FBTztBQUNMQyxjQUFRLE9BREg7QUFFTEMsWUFBTTtBQUZELEtBQVA7QUFJRDs7QUFFRDtBQUNBLE1BQUlILE1BQUosRUFBWTtBQUNWSixZQUFRQSxNQUFNUSxLQUFOLENBQVksQ0FBWixDQUFSO0FBQ0QsR0FGRCxNQUVPO0FBQUU7QUFDUFIsWUFBUUEsTUFBTVEsS0FBTixDQUFZLENBQVosRUFBZVIsTUFBTTFFLE1BQU4sR0FBZSxDQUE5QixDQUFSO0FBQ0Q7O0FBRUQsTUFBSTBFLE1BQU0xRSxNQUFOLEdBQWUsQ0FBZixLQUFxQixDQUFyQixJQUEwQnVFLFNBQVMsS0FBdkMsRUFBOEM7QUFDNUMsV0FBTztBQUNMUyxjQUFRLE9BREg7QUFFTEMsWUFBTTtBQUZELEtBQVA7QUFJRDs7QUFFRCxRQUFNRSxRQUFRLEVBQWQ7QUFDQSxTQUFNVCxNQUFNMUUsTUFBWixFQUFvQjtBQUNsQm1GLFVBQU1DLElBQU4sQ0FBVyxDQUFFVixNQUFNVyxLQUFOLEVBQUYsRUFBaUJYLE1BQU1XLEtBQU4sRUFBakIsQ0FBWDtBQUNEOztBQUVELE1BQUlDLFVBQVUsQ0FBZDtBQUNBLE9BQUssTUFBTSxDQUFDQyxHQUFELEVBQU1DLFFBQU4sQ0FBWCxJQUE4QkwsS0FBOUIsRUFBcUM7QUFDbkMsVUFBTU0sTUFBTUMsT0FBT0gsR0FBUCxDQUFaO0FBQ0EsUUFBSSxDQUFDRyxPQUFPQyxTQUFQLENBQWlCRixHQUFqQixDQUFMLEVBQTRCO0FBQzFCLGFBQU87QUFDTFQsZ0JBQVEsT0FESDtBQUVMQyxjQUFPLElBQUdNLEdBQUk7QUFGVCxPQUFQO0FBSUQ7O0FBRUQsWUFBT0MsUUFBUDtBQUNBLFdBQUssSUFBTDtBQUNBLFdBQUssS0FBTDtBQUNBLFdBQUssTUFBTDtBQUNBLFdBQUssT0FBTDtBQUNFRixtQkFBV0csTUFBTSxRQUFqQixDQURGLENBQzZCO0FBQzNCOztBQUVGLFdBQUssSUFBTDtBQUNBLFdBQUssS0FBTDtBQUNBLFdBQUssTUFBTDtBQUNBLFdBQUssT0FBTDtBQUNFSCxtQkFBV0csTUFBTSxNQUFqQixDQURGLENBQzJCO0FBQ3pCOztBQUVGLFdBQUssR0FBTDtBQUNBLFdBQUssS0FBTDtBQUNBLFdBQUssTUFBTDtBQUNFSCxtQkFBV0csTUFBTSxLQUFqQixDQURGLENBQzBCO0FBQ3hCOztBQUVGLFdBQUssSUFBTDtBQUNBLFdBQUssS0FBTDtBQUNBLFdBQUssTUFBTDtBQUNBLFdBQUssT0FBTDtBQUNFSCxtQkFBV0csTUFBTSxJQUFqQixDQURGLENBQ3lCO0FBQ3ZCOztBQUVGLFdBQUssS0FBTDtBQUNBLFdBQUssTUFBTDtBQUNBLFdBQUssUUFBTDtBQUNBLFdBQUssU0FBTDtBQUNFSCxtQkFBV0csTUFBTSxFQUFqQjtBQUNBOztBQUVGLFdBQUssS0FBTDtBQUNBLFdBQUssTUFBTDtBQUNBLFdBQUssUUFBTDtBQUNBLFdBQUssU0FBTDtBQUNFSCxtQkFBV0csR0FBWDtBQUNBOztBQUVGO0FBQ0UsZUFBTztBQUNMVCxrQkFBUSxPQURIO0FBRUxDLGdCQUFPLHNCQUFxQk8sUUFBUztBQUZoQyxTQUFQO0FBM0NGO0FBZ0REOztBQUVELFFBQU1JLGVBQWVOLFVBQVUsSUFBL0I7QUFDQSxNQUFJUixNQUFKLEVBQVk7QUFDVixXQUFPO0FBQ0xFLGNBQVEsU0FESDtBQUVMQyxZQUFNLFFBRkQ7QUFHTFksY0FBUSxJQUFJN0csSUFBSixDQUFTd0YsSUFBSXNCLE9BQUosS0FBZ0JGLFlBQXpCO0FBSEgsS0FBUDtBQUtELEdBTkQsTUFNTyxJQUFJYixJQUFKLEVBQVU7QUFDZixXQUFPO0FBQ0xDLGNBQVEsU0FESDtBQUVMQyxZQUFNLE1BRkQ7QUFHTFksY0FBUSxJQUFJN0csSUFBSixDQUFTd0YsSUFBSXNCLE9BQUosS0FBZ0JGLFlBQXpCO0FBSEgsS0FBUDtBQUtELEdBTk0sTUFNQTtBQUNMLFdBQU87QUFDTFosY0FBUSxTQURIO0FBRUxDLFlBQU0sU0FGRDtBQUdMWSxjQUFRLElBQUk3RyxJQUFKLENBQVN3RixJQUFJc0IsT0FBSixFQUFUO0FBSEgsS0FBUDtBQUtEO0FBQ0Y7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVN6RSxtQkFBVCxDQUE2QjBFLFVBQTdCLEVBQXlDNUUsS0FBekMsRUFBZ0Q7QUFDOUMsUUFBTTZFLFVBQVU3RSxTQUFTQSxNQUFNOUMsSUFBZixJQUF1QjhDLE1BQU05QyxJQUFOLEtBQWUsT0FBdEQ7QUFDQSxNQUFJLE9BQU8wSCxVQUFQLEtBQXNCLFFBQXRCLElBQWtDLENBQUNBLFVBQXZDLEVBQW1EO0FBQ2pELFdBQU9oSCxlQUFQO0FBQ0Q7QUFDRCxRQUFNa0gsb0JBQW9CRCxVQUFVdEYscUJBQVYsR0FBa0M1QixxQkFBNUQ7QUFDQSxRQUFNb0gsY0FBZXhDLElBQUQsSUFBVTtBQUM1QixVQUFNbUMsU0FBU0ksa0JBQWtCdkMsSUFBbEIsRUFBd0J2QyxLQUF4QixDQUFmO0FBQ0EsUUFBSTBFLFdBQVc5RyxlQUFmLEVBQWdDO0FBQzlCLFlBQU0sSUFBSWpCLE1BQU0wQyxLQUFWLENBQWdCMUMsTUFBTTBDLEtBQU4sQ0FBWWdCLFlBQTVCLEVBQTJDLGFBQVkyRSxLQUFLQyxTQUFMLENBQWUxQyxJQUFmLENBQXFCLEVBQTVFLENBQU47QUFDRDtBQUNELFdBQU9tQyxNQUFQO0FBQ0QsR0FORDtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSXZGLE9BQU9ELE9BQU9DLElBQVAsQ0FBWXlGLFVBQVosRUFBd0JNLElBQXhCLEdBQStCQyxPQUEvQixFQUFYO0FBQ0EsTUFBSUMsU0FBUyxFQUFiO0FBQ0EsT0FBSyxJQUFJN0gsR0FBVCxJQUFnQjRCLElBQWhCLEVBQXNCO0FBQ3BCLFlBQU81QixHQUFQO0FBQ0EsV0FBSyxLQUFMO0FBQ0EsV0FBSyxNQUFMO0FBQ0EsV0FBSyxLQUFMO0FBQ0EsV0FBSyxNQUFMO0FBQ0EsV0FBSyxTQUFMO0FBQ0EsV0FBSyxLQUFMO0FBQ0EsV0FBSyxLQUFMO0FBQVk7QUFDVixnQkFBTStHLE1BQU1NLFdBQVdySCxHQUFYLENBQVo7QUFDQSxjQUFJK0csT0FBTyxPQUFPQSxHQUFQLEtBQWUsUUFBdEIsSUFBa0NBLElBQUllLGFBQTFDLEVBQXlEO0FBQ3ZELGdCQUFJckYsU0FBU0EsTUFBTTlDLElBQU4sS0FBZSxNQUE1QixFQUFvQztBQUNsQyxvQkFBTSxJQUFJUCxNQUFNMEMsS0FBVixDQUFnQjFDLE1BQU0wQyxLQUFOLENBQVlnQixZQUE1QixFQUEwQyxnREFBMUMsQ0FBTjtBQUNEOztBQUVELG9CQUFROUMsR0FBUjtBQUNBLG1CQUFLLFNBQUw7QUFDQSxtQkFBSyxLQUFMO0FBQ0EsbUJBQUssS0FBTDtBQUNFLHNCQUFNLElBQUlaLE1BQU0wQyxLQUFWLENBQWdCMUMsTUFBTTBDLEtBQU4sQ0FBWWdCLFlBQTVCLEVBQTBDLDRFQUExQyxDQUFOO0FBSkY7O0FBT0Esa0JBQU1pRixlQUFlbkMsbUJBQW1CbUIsSUFBSWUsYUFBdkIsQ0FBckI7QUFDQSxnQkFBSUMsYUFBYXpCLE1BQWIsS0FBd0IsU0FBNUIsRUFBdUM7QUFDckN1QixxQkFBTzdILEdBQVAsSUFBYytILGFBQWFaLE1BQTNCO0FBQ0E7QUFDRDs7QUFFRGEsNkJBQUl6QixJQUFKLENBQVMsbUNBQVQsRUFBOEN3QixZQUE5QztBQUNBLGtCQUFNLElBQUkzSSxNQUFNMEMsS0FBVixDQUFnQjFDLE1BQU0wQyxLQUFOLENBQVlnQixZQUE1QixFQUEyQyxzQkFBcUI5QyxHQUFJLFlBQVcrSCxhQUFheEIsSUFBSyxFQUFqRyxDQUFOO0FBQ0Q7O0FBRURzQixpQkFBTzdILEdBQVAsSUFBY3dILFlBQVlULEdBQVosQ0FBZDtBQUNBO0FBQ0Q7O0FBRUQsV0FBSyxLQUFMO0FBQ0EsV0FBSyxNQUFMO0FBQWE7QUFDWCxnQkFBTWtCLE1BQU1aLFdBQVdySCxHQUFYLENBQVo7QUFDQSxjQUFJLEVBQUVpSSxlQUFlekgsS0FBakIsQ0FBSixFQUE2QjtBQUMzQixrQkFBTSxJQUFJcEIsTUFBTTBDLEtBQVYsQ0FBZ0IxQyxNQUFNMEMsS0FBTixDQUFZZ0IsWUFBNUIsRUFBMEMsU0FBUzlDLEdBQVQsR0FBZSxRQUF6RCxDQUFOO0FBQ0Q7QUFDRDZILGlCQUFPN0gsR0FBUCxJQUFja0ksaUJBQUVDLE9BQUYsQ0FBVUYsR0FBVixFQUFlL0gsU0FBUztBQUNwQyxtQkFBTyxDQUFFOEUsSUFBRCxJQUFVO0FBQ2hCLGtCQUFJeEUsTUFBTWEsT0FBTixDQUFjMkQsSUFBZCxDQUFKLEVBQXlCO0FBQ3ZCLHVCQUFPOUUsTUFBTU8sR0FBTixDQUFVK0csV0FBVixDQUFQO0FBQ0QsZUFGRCxNQUVPO0FBQ0wsdUJBQU9BLFlBQVl4QyxJQUFaLENBQVA7QUFDRDtBQUNGLGFBTk0sRUFNSjlFLEtBTkksQ0FBUDtBQU9ELFdBUmEsQ0FBZDtBQVNBO0FBQ0Q7QUFDRCxXQUFLLE1BQUw7QUFBYTtBQUNYLGdCQUFNK0gsTUFBTVosV0FBV3JILEdBQVgsQ0FBWjtBQUNBLGNBQUksRUFBRWlJLGVBQWV6SCxLQUFqQixDQUFKLEVBQTZCO0FBQzNCLGtCQUFNLElBQUlwQixNQUFNMEMsS0FBVixDQUFnQjFDLE1BQU0wQyxLQUFOLENBQVlnQixZQUE1QixFQUNKLFNBQVM5QyxHQUFULEdBQWUsUUFEWCxDQUFOO0FBRUQ7QUFDRDZILGlCQUFPN0gsR0FBUCxJQUFjaUksSUFBSXhILEdBQUosQ0FBUXVCLHFCQUFSLENBQWQ7O0FBRUEsZ0JBQU1aLFNBQVN5RyxPQUFPN0gsR0FBUCxDQUFmO0FBQ0EsY0FBSXlCLGdCQUFnQkwsTUFBaEIsS0FBMkIsQ0FBQ0QsdUJBQXVCQyxNQUF2QixDQUFoQyxFQUFnRTtBQUM5RCxrQkFBTSxJQUFJaEMsTUFBTTBDLEtBQVYsQ0FBZ0IxQyxNQUFNMEMsS0FBTixDQUFZZ0IsWUFBNUIsRUFBMEMsb0RBQzVDMUIsTUFERSxDQUFOO0FBRUQ7O0FBRUQ7QUFDRDtBQUNELFdBQUssUUFBTDtBQUNFLFlBQUlnSCxJQUFJZixXQUFXckgsR0FBWCxDQUFSO0FBQ0EsWUFBSSxPQUFPb0ksQ0FBUCxLQUFhLFFBQWpCLEVBQTJCO0FBQ3pCLGdCQUFNLElBQUloSixNQUFNMEMsS0FBVixDQUFnQjFDLE1BQU0wQyxLQUFOLENBQVlnQixZQUE1QixFQUEwQyxnQkFBZ0JzRixDQUExRCxDQUFOO0FBQ0Q7QUFDRFAsZUFBTzdILEdBQVAsSUFBY29JLENBQWQ7QUFDQTs7QUFFRixXQUFLLGNBQUw7QUFBcUI7QUFDbkIsZ0JBQU1ILE1BQU1aLFdBQVdySCxHQUFYLENBQVo7QUFDQSxjQUFJLEVBQUVpSSxlQUFlekgsS0FBakIsQ0FBSixFQUE2QjtBQUMzQixrQkFBTSxJQUFJcEIsTUFBTTBDLEtBQVYsQ0FDSjFDLE1BQU0wQyxLQUFOLENBQVlnQixZQURSLEVBRUgsc0NBRkcsQ0FBTjtBQUlEO0FBQ0QrRSxpQkFBT2hGLFVBQVAsR0FBb0I7QUFDbEJ3RixrQkFBTUosSUFBSXhILEdBQUosQ0FBUStHLFdBQVI7QUFEWSxXQUFwQjtBQUdBO0FBQ0Q7QUFDRCxXQUFLLFVBQUw7QUFDRUssZUFBTzdILEdBQVAsSUFBY3FILFdBQVdySCxHQUFYLENBQWQ7QUFDQTs7QUFFRixXQUFLLE9BQUw7QUFBYztBQUNaLGdCQUFNc0ksU0FBU2pCLFdBQVdySCxHQUFYLEVBQWdCdUksT0FBL0I7QUFDQSxjQUFJLE9BQU9ELE1BQVAsS0FBa0IsUUFBdEIsRUFBZ0M7QUFDOUIsa0JBQU0sSUFBSWxKLE1BQU0wQyxLQUFWLENBQ0oxQyxNQUFNMEMsS0FBTixDQUFZZ0IsWUFEUixFQUVILHNDQUZHLENBQU47QUFJRDtBQUNELGNBQUksQ0FBQ3dGLE9BQU9FLEtBQVIsSUFBaUIsT0FBT0YsT0FBT0UsS0FBZCxLQUF3QixRQUE3QyxFQUF1RDtBQUNyRCxrQkFBTSxJQUFJcEosTUFBTTBDLEtBQVYsQ0FDSjFDLE1BQU0wQyxLQUFOLENBQVlnQixZQURSLEVBRUgsb0NBRkcsQ0FBTjtBQUlELFdBTEQsTUFLTztBQUNMK0UsbUJBQU83SCxHQUFQLElBQWM7QUFDWix5QkFBV3NJLE9BQU9FO0FBRE4sYUFBZDtBQUdEO0FBQ0QsY0FBSUYsT0FBT0csU0FBUCxJQUFvQixPQUFPSCxPQUFPRyxTQUFkLEtBQTRCLFFBQXBELEVBQThEO0FBQzVELGtCQUFNLElBQUlySixNQUFNMEMsS0FBVixDQUNKMUMsTUFBTTBDLEtBQU4sQ0FBWWdCLFlBRFIsRUFFSCx3Q0FGRyxDQUFOO0FBSUQsV0FMRCxNQUtPLElBQUl3RixPQUFPRyxTQUFYLEVBQXNCO0FBQzNCWixtQkFBTzdILEdBQVAsRUFBWXlJLFNBQVosR0FBd0JILE9BQU9HLFNBQS9CO0FBQ0Q7QUFDRCxjQUFJSCxPQUFPSSxjQUFQLElBQXlCLE9BQU9KLE9BQU9JLGNBQWQsS0FBaUMsU0FBOUQsRUFBeUU7QUFDdkUsa0JBQU0sSUFBSXRKLE1BQU0wQyxLQUFWLENBQ0oxQyxNQUFNMEMsS0FBTixDQUFZZ0IsWUFEUixFQUVILDhDQUZHLENBQU47QUFJRCxXQUxELE1BS08sSUFBSXdGLE9BQU9JLGNBQVgsRUFBMkI7QUFDaENiLG1CQUFPN0gsR0FBUCxFQUFZMEksY0FBWixHQUE2QkosT0FBT0ksY0FBcEM7QUFDRDtBQUNELGNBQUlKLE9BQU9LLG1CQUFQLElBQThCLE9BQU9MLE9BQU9LLG1CQUFkLEtBQXNDLFNBQXhFLEVBQW1GO0FBQ2pGLGtCQUFNLElBQUl2SixNQUFNMEMsS0FBVixDQUNKMUMsTUFBTTBDLEtBQU4sQ0FBWWdCLFlBRFIsRUFFSCxtREFGRyxDQUFOO0FBSUQsV0FMRCxNQUtPLElBQUl3RixPQUFPSyxtQkFBWCxFQUFnQztBQUNyQ2QsbUJBQU83SCxHQUFQLEVBQVkySSxtQkFBWixHQUFrQ0wsT0FBT0ssbUJBQXpDO0FBQ0Q7QUFDRDtBQUNEO0FBQ0QsV0FBSyxhQUFMO0FBQ0UsWUFBSUMsUUFBUXZCLFdBQVdySCxHQUFYLENBQVo7QUFDQTZILGVBQU83SCxHQUFQLElBQWMsQ0FBQzRJLE1BQU1DLFNBQVAsRUFBa0JELE1BQU1FLFFBQXhCLENBQWQ7QUFDQTs7QUFFRixXQUFLLGNBQUw7QUFDRWpCLGVBQU83SCxHQUFQLElBQWNxSCxXQUFXckgsR0FBWCxDQUFkO0FBQ0E7O0FBRUY7QUFDQTtBQUNBLFdBQUssdUJBQUw7QUFDRTZILGVBQU8sY0FBUCxJQUF5QlIsV0FBV3JILEdBQVgsQ0FBekI7QUFDQTtBQUNGLFdBQUsscUJBQUw7QUFDRTZILGVBQU8sY0FBUCxJQUF5QlIsV0FBV3JILEdBQVgsSUFBa0IsSUFBM0M7QUFDQTtBQUNGLFdBQUssMEJBQUw7QUFDRTZILGVBQU8sY0FBUCxJQUF5QlIsV0FBV3JILEdBQVgsSUFBa0IsSUFBM0M7QUFDQTs7QUFFRixXQUFLLFNBQUw7QUFDQSxXQUFLLGFBQUw7QUFDRSxjQUFNLElBQUlaLE1BQU0wQyxLQUFWLENBQ0oxQyxNQUFNMEMsS0FBTixDQUFZaUgsbUJBRFIsRUFFSixTQUFTL0ksR0FBVCxHQUFlLGtDQUZYLENBQU47O0FBSUYsV0FBSyxTQUFMO0FBQ0UsWUFBSWdKLE1BQU0zQixXQUFXckgsR0FBWCxFQUFnQixNQUFoQixDQUFWO0FBQ0EsWUFBSSxDQUFDZ0osR0FBRCxJQUFRQSxJQUFJMUgsTUFBSixJQUFjLENBQTFCLEVBQTZCO0FBQzNCLGdCQUFNLElBQUlsQyxNQUFNMEMsS0FBVixDQUNKMUMsTUFBTTBDLEtBQU4sQ0FBWWdCLFlBRFIsRUFFSiwwQkFGSSxDQUFOO0FBR0Q7QUFDRCtFLGVBQU83SCxHQUFQLElBQWM7QUFDWixrQkFBUSxDQUNOLENBQUNnSixJQUFJLENBQUosRUFBT0gsU0FBUixFQUFtQkcsSUFBSSxDQUFKLEVBQU9GLFFBQTFCLENBRE0sRUFFTixDQUFDRSxJQUFJLENBQUosRUFBT0gsU0FBUixFQUFtQkcsSUFBSSxDQUFKLEVBQU9GLFFBQTFCLENBRk07QUFESSxTQUFkO0FBTUE7O0FBRUYsV0FBSyxZQUFMO0FBQW1CO0FBQ2pCLGdCQUFNRyxVQUFVNUIsV0FBV3JILEdBQVgsRUFBZ0IsVUFBaEIsQ0FBaEI7QUFDQSxnQkFBTWtKLGVBQWU3QixXQUFXckgsR0FBWCxFQUFnQixlQUFoQixDQUFyQjtBQUNBLGNBQUlpSixZQUFZdkYsU0FBaEIsRUFBMkI7QUFDekIsZ0JBQUl5RixNQUFKO0FBQ0EsZ0JBQUksT0FBT0YsT0FBUCxLQUFtQixRQUFuQixJQUErQkEsUUFBUXZKLE1BQVIsS0FBbUIsU0FBdEQsRUFBaUU7QUFDL0Qsa0JBQUksQ0FBQ3VKLFFBQVFHLFdBQVQsSUFBd0JILFFBQVFHLFdBQVIsQ0FBb0I5SCxNQUFwQixHQUE2QixDQUF6RCxFQUE0RDtBQUMxRCxzQkFBTSxJQUFJbEMsTUFBTTBDLEtBQVYsQ0FDSjFDLE1BQU0wQyxLQUFOLENBQVlnQixZQURSLEVBRUosbUZBRkksQ0FBTjtBQUlEO0FBQ0RxRyx1QkFBU0YsUUFBUUcsV0FBakI7QUFDRCxhQVJELE1BUU8sSUFBSUgsbUJBQW1CekksS0FBdkIsRUFBOEI7QUFDbkMsa0JBQUl5SSxRQUFRM0gsTUFBUixHQUFpQixDQUFyQixFQUF3QjtBQUN0QixzQkFBTSxJQUFJbEMsTUFBTTBDLEtBQVYsQ0FDSjFDLE1BQU0wQyxLQUFOLENBQVlnQixZQURSLEVBRUosb0VBRkksQ0FBTjtBQUlEO0FBQ0RxRyx1QkFBU0YsT0FBVDtBQUNELGFBUk0sTUFRQTtBQUNMLG9CQUFNLElBQUk3SixNQUFNMEMsS0FBVixDQUNKMUMsTUFBTTBDLEtBQU4sQ0FBWWdCLFlBRFIsRUFFSix1RkFGSSxDQUFOO0FBSUQ7QUFDRHFHLHFCQUFTQSxPQUFPMUksR0FBUCxDQUFZbUksS0FBRCxJQUFXO0FBQzdCLGtCQUFJQSxpQkFBaUJwSSxLQUFqQixJQUEwQm9JLE1BQU10SCxNQUFOLEtBQWlCLENBQS9DLEVBQWtEO0FBQ2hEbEMsc0JBQU1pSyxRQUFOLENBQWVDLFNBQWYsQ0FBeUJWLE1BQU0sQ0FBTixDQUF6QixFQUFtQ0EsTUFBTSxDQUFOLENBQW5DO0FBQ0EsdUJBQU9BLEtBQVA7QUFDRDtBQUNELGtCQUFJLENBQUNwRCxjQUFjTCxXQUFkLENBQTBCeUQsS0FBMUIsQ0FBTCxFQUF1QztBQUNyQyxzQkFBTSxJQUFJeEosTUFBTTBDLEtBQVYsQ0FBZ0IxQyxNQUFNMEMsS0FBTixDQUFZZ0IsWUFBNUIsRUFBMEMsc0JBQTFDLENBQU47QUFDRCxlQUZELE1BRU87QUFDTDFELHNCQUFNaUssUUFBTixDQUFlQyxTQUFmLENBQXlCVixNQUFNRSxRQUEvQixFQUF5Q0YsTUFBTUMsU0FBL0M7QUFDRDtBQUNELHFCQUFPLENBQUNELE1BQU1DLFNBQVAsRUFBa0JELE1BQU1FLFFBQXhCLENBQVA7QUFDRCxhQVhRLENBQVQ7QUFZQWpCLG1CQUFPN0gsR0FBUCxJQUFjO0FBQ1osMEJBQVltSjtBQURBLGFBQWQ7QUFHRCxXQXZDRCxNQXVDTyxJQUFJRCxpQkFBaUJ4RixTQUFyQixFQUFnQztBQUNyQyxnQkFBSSxFQUFFd0Ysd0JBQXdCMUksS0FBMUIsS0FBb0MwSSxhQUFhNUgsTUFBYixHQUFzQixDQUE5RCxFQUFpRTtBQUMvRCxvQkFBTSxJQUFJbEMsTUFBTTBDLEtBQVYsQ0FBZ0IxQyxNQUFNMEMsS0FBTixDQUFZZ0IsWUFBNUIsRUFBMEMsdUZBQTFDLENBQU47QUFDRDtBQUNEO0FBQ0EsZ0JBQUk4RixRQUFRTSxhQUFhLENBQWIsQ0FBWjtBQUNBLGdCQUFJTixpQkFBaUJwSSxLQUFqQixJQUEwQm9JLE1BQU10SCxNQUFOLEtBQWlCLENBQS9DLEVBQWtEO0FBQ2hEc0gsc0JBQVEsSUFBSXhKLE1BQU1pSyxRQUFWLENBQW1CVCxNQUFNLENBQU4sQ0FBbkIsRUFBNkJBLE1BQU0sQ0FBTixDQUE3QixDQUFSO0FBQ0QsYUFGRCxNQUVPLElBQUksQ0FBQ3BELGNBQWNMLFdBQWQsQ0FBMEJ5RCxLQUExQixDQUFMLEVBQXVDO0FBQzVDLG9CQUFNLElBQUl4SixNQUFNMEMsS0FBVixDQUFnQjFDLE1BQU0wQyxLQUFOLENBQVlnQixZQUE1QixFQUEwQyx1REFBMUMsQ0FBTjtBQUNEO0FBQ0QxRCxrQkFBTWlLLFFBQU4sQ0FBZUMsU0FBZixDQUF5QlYsTUFBTUUsUUFBL0IsRUFBeUNGLE1BQU1DLFNBQS9DO0FBQ0E7QUFDQSxrQkFBTVUsV0FBV0wsYUFBYSxDQUFiLENBQWpCO0FBQ0EsZ0JBQUdNLE1BQU1ELFFBQU4sS0FBbUJBLFdBQVcsQ0FBakMsRUFBb0M7QUFDbEMsb0JBQU0sSUFBSW5LLE1BQU0wQyxLQUFWLENBQWdCMUMsTUFBTTBDLEtBQU4sQ0FBWWdCLFlBQTVCLEVBQTBDLHNEQUExQyxDQUFOO0FBQ0Q7QUFDRCtFLG1CQUFPN0gsR0FBUCxJQUFjO0FBQ1osK0JBQWlCLENBQ2YsQ0FBQzRJLE1BQU1DLFNBQVAsRUFBa0JELE1BQU1FLFFBQXhCLENBRGUsRUFFZlMsUUFGZTtBQURMLGFBQWQ7QUFNRDtBQUNEO0FBQ0Q7QUFDRCxXQUFLLGdCQUFMO0FBQXVCO0FBQ3JCLGdCQUFNWCxRQUFRdkIsV0FBV3JILEdBQVgsRUFBZ0IsUUFBaEIsQ0FBZDtBQUNBLGNBQUksQ0FBQ3dGLGNBQWNMLFdBQWQsQ0FBMEJ5RCxLQUExQixDQUFMLEVBQXVDO0FBQ3JDLGtCQUFNLElBQUl4SixNQUFNMEMsS0FBVixDQUNKMUMsTUFBTTBDLEtBQU4sQ0FBWWdCLFlBRFIsRUFFSixvREFGSSxDQUFOO0FBSUQsV0FMRCxNQUtPO0FBQ0wxRCxrQkFBTWlLLFFBQU4sQ0FBZUMsU0FBZixDQUF5QlYsTUFBTUUsUUFBL0IsRUFBeUNGLE1BQU1DLFNBQS9DO0FBQ0Q7QUFDRGhCLGlCQUFPN0gsR0FBUCxJQUFjO0FBQ1p5Six1QkFBVztBQUNUOUosb0JBQU0sT0FERztBQUVUeUosMkJBQWEsQ0FBQ1IsTUFBTUMsU0FBUCxFQUFrQkQsTUFBTUUsUUFBeEI7QUFGSjtBQURDLFdBQWQ7QUFNQTtBQUNEO0FBQ0Q7QUFDRSxZQUFJOUksSUFBSWtCLEtBQUosQ0FBVSxNQUFWLENBQUosRUFBdUI7QUFDckIsZ0JBQU0sSUFBSTlCLE1BQU0wQyxLQUFWLENBQ0oxQyxNQUFNMEMsS0FBTixDQUFZZ0IsWUFEUixFQUVKLHFCQUFxQjlDLEdBRmpCLENBQU47QUFHRDtBQUNELGVBQU9LLGVBQVA7QUEvUUY7QUFpUkQ7QUFDRCxTQUFPd0gsTUFBUDtBQUNEOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTbEgsdUJBQVQsQ0FBaUM7QUFDL0I2RCxNQUQrQjtBQUUvQmtGLFFBRitCO0FBRy9CQztBQUgrQixDQUFqQyxFQUlHQyxPQUpILEVBSVk7QUFDVixVQUFPcEYsSUFBUDtBQUNBLFNBQUssUUFBTDtBQUNFLFVBQUlvRixPQUFKLEVBQWE7QUFDWCxlQUFPbEcsU0FBUDtBQUNELE9BRkQsTUFFTztBQUNMLGVBQU8sRUFBQ2MsTUFBTSxRQUFQLEVBQWlCQyxLQUFLLEVBQXRCLEVBQVA7QUFDRDs7QUFFSCxTQUFLLFdBQUw7QUFDRSxVQUFJLE9BQU9pRixNQUFQLEtBQWtCLFFBQXRCLEVBQWdDO0FBQzlCLGNBQU0sSUFBSXRLLE1BQU0wQyxLQUFWLENBQWdCMUMsTUFBTTBDLEtBQU4sQ0FBWWdCLFlBQTVCLEVBQTBDLG9DQUExQyxDQUFOO0FBQ0Q7QUFDRCxVQUFJOEcsT0FBSixFQUFhO0FBQ1gsZUFBT0YsTUFBUDtBQUNELE9BRkQsTUFFTztBQUNMLGVBQU8sRUFBQ2xGLE1BQU0sTUFBUCxFQUFlQyxLQUFLaUYsTUFBcEIsRUFBUDtBQUNEOztBQUVILFNBQUssS0FBTDtBQUNBLFNBQUssV0FBTDtBQUNFLFVBQUksRUFBRUMsbUJBQW1CbkosS0FBckIsQ0FBSixFQUFpQztBQUMvQixjQUFNLElBQUlwQixNQUFNMEMsS0FBVixDQUFnQjFDLE1BQU0wQyxLQUFOLENBQVlnQixZQUE1QixFQUEwQyxpQ0FBMUMsQ0FBTjtBQUNEO0FBQ0QsVUFBSStHLFFBQVFGLFFBQVFsSixHQUFSLENBQVl1QixxQkFBWixDQUFaO0FBQ0EsVUFBSTRILE9BQUosRUFBYTtBQUNYLGVBQU9DLEtBQVA7QUFDRCxPQUZELE1BRU87QUFDTCxZQUFJQyxVQUFVO0FBQ1pDLGVBQUssT0FETztBQUVaQyxxQkFBVztBQUZDLFVBR1p4RixJQUhZLENBQWQ7QUFJQSxlQUFPLEVBQUNBLE1BQU1zRixPQUFQLEVBQWdCckYsS0FBSyxFQUFDLFNBQVNvRixLQUFWLEVBQXJCLEVBQVA7QUFDRDs7QUFFSCxTQUFLLFFBQUw7QUFDRSxVQUFJLEVBQUVGLG1CQUFtQm5KLEtBQXJCLENBQUosRUFBaUM7QUFDL0IsY0FBTSxJQUFJcEIsTUFBTTBDLEtBQVYsQ0FBZ0IxQyxNQUFNMEMsS0FBTixDQUFZZ0IsWUFBNUIsRUFBMEMsb0NBQTFDLENBQU47QUFDRDtBQUNELFVBQUltSCxXQUFXTixRQUFRbEosR0FBUixDQUFZdUIscUJBQVosQ0FBZjtBQUNBLFVBQUk0SCxPQUFKLEVBQWE7QUFDWCxlQUFPLEVBQVA7QUFDRCxPQUZELE1BRU87QUFDTCxlQUFPLEVBQUNwRixNQUFNLFVBQVAsRUFBbUJDLEtBQUt3RixRQUF4QixFQUFQO0FBQ0Q7O0FBRUg7QUFDRSxZQUFNLElBQUk3SyxNQUFNMEMsS0FBVixDQUFnQjFDLE1BQU0wQyxLQUFOLENBQVlpSCxtQkFBNUIsRUFBa0QsT0FBTXZFLElBQUssaUNBQTdELENBQU47QUE5Q0Y7QUFnREQ7QUFDRCxTQUFTNUQsU0FBVCxDQUFtQnNKLE1BQW5CLEVBQTJCQyxRQUEzQixFQUFxQztBQUNuQyxRQUFNaEQsU0FBUyxFQUFmO0FBQ0F4RixTQUFPQyxJQUFQLENBQVlzSSxNQUFaLEVBQW9CdEYsT0FBcEIsQ0FBNkI1RSxHQUFELElBQVM7QUFDbkNtSCxXQUFPbkgsR0FBUCxJQUFjbUssU0FBU0QsT0FBT2xLLEdBQVAsQ0FBVCxDQUFkO0FBQ0QsR0FGRDtBQUdBLFNBQU9tSCxNQUFQO0FBQ0Q7O0FBRUQsTUFBTWlELHVDQUF1Q0MsZUFBZTtBQUMxRCxVQUFPLE9BQU9BLFdBQWQ7QUFDQSxTQUFLLFFBQUw7QUFDQSxTQUFLLFFBQUw7QUFDQSxTQUFLLFNBQUw7QUFDRSxhQUFPQSxXQUFQO0FBQ0YsU0FBSyxXQUFMO0FBQ0EsU0FBSyxRQUFMO0FBQ0EsU0FBSyxVQUFMO0FBQ0UsWUFBTSx1Q0FBTjtBQUNGLFNBQUssUUFBTDtBQUNFLFVBQUlBLGdCQUFnQixJQUFwQixFQUEwQjtBQUN4QixlQUFPLElBQVA7QUFDRDtBQUNELFVBQUlBLHVCQUF1QjdKLEtBQTNCLEVBQWtDO0FBQ2hDLGVBQU82SixZQUFZNUosR0FBWixDQUFnQjJKLG9DQUFoQixDQUFQO0FBQ0Q7O0FBRUQsVUFBSUMsdUJBQXVCL0osSUFBM0IsRUFBaUM7QUFDL0IsZUFBT2xCLE1BQU1rTCxPQUFOLENBQWNELFdBQWQsQ0FBUDtBQUNEOztBQUVELFVBQUlBLHVCQUF1Qm5MLFFBQVFxTCxJQUFuQyxFQUF5QztBQUN2QyxlQUFPRixZQUFZRyxRQUFaLEVBQVA7QUFDRDs7QUFFRCxVQUFJSCx1QkFBdUJuTCxRQUFRdUwsTUFBbkMsRUFBMkM7QUFDekMsZUFBT0osWUFBWW5LLEtBQW5CO0FBQ0Q7O0FBRUQsVUFBSW1GLFdBQVdxRixxQkFBWCxDQUFpQ0wsV0FBakMsQ0FBSixFQUFtRDtBQUNqRCxlQUFPaEYsV0FBV3NGLGNBQVgsQ0FBMEJOLFdBQTFCLENBQVA7QUFDRDs7QUFFRCxVQUFJQSxZQUFZTyxjQUFaLENBQTJCLFFBQTNCLEtBQXdDUCxZQUFZM0ssTUFBWixJQUFzQixNQUE5RCxJQUF3RTJLLFlBQVl4RyxHQUFaLFlBQTJCdkQsSUFBdkcsRUFBNkc7QUFDM0crSixvQkFBWXhHLEdBQVosR0FBa0J3RyxZQUFZeEcsR0FBWixDQUFnQmdILE1BQWhCLEVBQWxCO0FBQ0EsZUFBT1IsV0FBUDtBQUNEOztBQUVELGFBQU96SixVQUFVeUosV0FBVixFQUF1QkQsb0NBQXZCLENBQVA7QUFDRjtBQUNFLFlBQU0saUJBQU47QUF4Q0Y7QUEwQ0QsQ0EzQ0Q7O0FBNkNBLE1BQU1VLHlCQUF5QixDQUFDdEwsTUFBRCxFQUFTaUQsS0FBVCxFQUFnQnNJLGFBQWhCLEtBQWtDO0FBQy9ELFFBQU1DLFVBQVVELGNBQWM5RSxLQUFkLENBQW9CLEdBQXBCLENBQWhCO0FBQ0EsTUFBSStFLFFBQVEsQ0FBUixNQUFleEwsT0FBT0MsTUFBUCxDQUFjZ0QsS0FBZCxFQUFxQjhDLFdBQXhDLEVBQXFEO0FBQ25ELFVBQU0sZ0NBQU47QUFDRDtBQUNELFNBQU87QUFDTDdGLFlBQVEsU0FESDtBQUVMSixlQUFXMEwsUUFBUSxDQUFSLENBRk47QUFHTC9GLGNBQVUrRixRQUFRLENBQVI7QUFITCxHQUFQO0FBS0QsQ0FWRDs7QUFZQTtBQUNBO0FBQ0EsTUFBTUMsMkJBQTJCLENBQUMzTCxTQUFELEVBQVkrSyxXQUFaLEVBQXlCN0ssTUFBekIsS0FBb0M7QUFDbkUsVUFBTyxPQUFPNkssV0FBZDtBQUNBLFNBQUssUUFBTDtBQUNBLFNBQUssUUFBTDtBQUNBLFNBQUssU0FBTDtBQUNFLGFBQU9BLFdBQVA7QUFDRixTQUFLLFdBQUw7QUFDQSxTQUFLLFFBQUw7QUFDQSxTQUFLLFVBQUw7QUFDRSxZQUFNLHVDQUFOO0FBQ0YsU0FBSyxRQUFMO0FBQWU7QUFDYixZQUFJQSxnQkFBZ0IsSUFBcEIsRUFBMEI7QUFDeEIsaUJBQU8sSUFBUDtBQUNEO0FBQ0QsWUFBSUEsdUJBQXVCN0osS0FBM0IsRUFBa0M7QUFDaEMsaUJBQU82SixZQUFZNUosR0FBWixDQUFnQjJKLG9DQUFoQixDQUFQO0FBQ0Q7O0FBRUQsWUFBSUMsdUJBQXVCL0osSUFBM0IsRUFBaUM7QUFDL0IsaUJBQU9sQixNQUFNa0wsT0FBTixDQUFjRCxXQUFkLENBQVA7QUFDRDs7QUFFRCxZQUFJQSx1QkFBdUJuTCxRQUFRcUwsSUFBbkMsRUFBeUM7QUFDdkMsaUJBQU9GLFlBQVlHLFFBQVosRUFBUDtBQUNEOztBQUVELFlBQUlILHVCQUF1Qm5MLFFBQVF1TCxNQUFuQyxFQUEyQztBQUN6QyxpQkFBT0osWUFBWW5LLEtBQW5CO0FBQ0Q7O0FBRUQsWUFBSW1GLFdBQVdxRixxQkFBWCxDQUFpQ0wsV0FBakMsQ0FBSixFQUFtRDtBQUNqRCxpQkFBT2hGLFdBQVdzRixjQUFYLENBQTBCTixXQUExQixDQUFQO0FBQ0Q7O0FBRUQsY0FBTTNGLGFBQWEsRUFBbkI7QUFDQSxZQUFJMkYsWUFBWWpHLE1BQVosSUFBc0JpRyxZQUFZaEcsTUFBdEMsRUFBOEM7QUFDNUNLLHFCQUFXTixNQUFYLEdBQW9CaUcsWUFBWWpHLE1BQVosSUFBc0IsRUFBMUM7QUFDQU0scUJBQVdMLE1BQVgsR0FBb0JnRyxZQUFZaEcsTUFBWixJQUFzQixFQUExQztBQUNBLGlCQUFPZ0csWUFBWWpHLE1BQW5CO0FBQ0EsaUJBQU9pRyxZQUFZaEcsTUFBbkI7QUFDRDs7QUFFRCxhQUFLLElBQUlyRSxHQUFULElBQWdCcUssV0FBaEIsRUFBNkI7QUFDM0Isa0JBQU9ySyxHQUFQO0FBQ0EsaUJBQUssS0FBTDtBQUNFMEUseUJBQVcsVUFBWCxJQUF5QixLQUFLMkYsWUFBWXJLLEdBQVosQ0FBOUI7QUFDQTtBQUNGLGlCQUFLLGtCQUFMO0FBQ0UwRSx5QkFBV3dHLGdCQUFYLEdBQThCYixZQUFZckssR0FBWixDQUE5QjtBQUNBO0FBQ0YsaUJBQUssTUFBTDtBQUNFO0FBQ0YsaUJBQUsscUJBQUw7QUFDQSxpQkFBSyxtQkFBTDtBQUNBLGlCQUFLLDhCQUFMO0FBQ0EsaUJBQUssc0JBQUw7QUFDQSxpQkFBSyxZQUFMO0FBQ0EsaUJBQUssZ0NBQUw7QUFDQSxpQkFBSyw2QkFBTDtBQUNBLGlCQUFLLHFCQUFMO0FBQ0EsaUJBQUssbUJBQUw7QUFDRTtBQUNBMEUseUJBQVcxRSxHQUFYLElBQWtCcUssWUFBWXJLLEdBQVosQ0FBbEI7QUFDQTtBQUNGLGlCQUFLLGdCQUFMO0FBQ0UwRSx5QkFBVyxjQUFYLElBQTZCMkYsWUFBWXJLLEdBQVosQ0FBN0I7QUFDQTtBQUNGLGlCQUFLLFdBQUw7QUFDQSxpQkFBSyxhQUFMO0FBQ0UwRSx5QkFBVyxXQUFYLElBQTBCdEYsTUFBTWtMLE9BQU4sQ0FBYyxJQUFJaEssSUFBSixDQUFTK0osWUFBWXJLLEdBQVosQ0FBVCxDQUFkLEVBQTBDNkQsR0FBcEU7QUFDQTtBQUNGLGlCQUFLLFdBQUw7QUFDQSxpQkFBSyxhQUFMO0FBQ0VhLHlCQUFXLFdBQVgsSUFBMEJ0RixNQUFNa0wsT0FBTixDQUFjLElBQUloSyxJQUFKLENBQVMrSixZQUFZckssR0FBWixDQUFULENBQWQsRUFBMEM2RCxHQUFwRTtBQUNBO0FBQ0YsaUJBQUssV0FBTDtBQUNBLGlCQUFLLFlBQUw7QUFDRWEseUJBQVcsV0FBWCxJQUEwQnRGLE1BQU1rTCxPQUFOLENBQWMsSUFBSWhLLElBQUosQ0FBUytKLFlBQVlySyxHQUFaLENBQVQsQ0FBZCxDQUExQjtBQUNBO0FBQ0YsaUJBQUssVUFBTDtBQUNBLGlCQUFLLFlBQUw7QUFDRTBFLHlCQUFXLFVBQVgsSUFBeUJ0RixNQUFNa0wsT0FBTixDQUFjLElBQUloSyxJQUFKLENBQVMrSixZQUFZckssR0FBWixDQUFULENBQWQsRUFBMEM2RCxHQUFuRTtBQUNBO0FBQ0YsaUJBQUssV0FBTDtBQUNBLGlCQUFLLFlBQUw7QUFDRWEseUJBQVcsV0FBWCxJQUEwQjJGLFlBQVlySyxHQUFaLENBQTFCO0FBQ0E7QUFDRjtBQUNFO0FBQ0Esa0JBQUlxQyxnQkFBZ0JyQyxJQUFJa0IsS0FBSixDQUFVLDhCQUFWLENBQXBCO0FBQ0Esa0JBQUltQixhQUFKLEVBQW1CO0FBQ2pCLG9CQUFJQyxXQUFXRCxjQUFjLENBQWQsQ0FBZjtBQUNBcUMsMkJBQVcsVUFBWCxJQUF5QkEsV0FBVyxVQUFYLEtBQTBCLEVBQW5EO0FBQ0FBLDJCQUFXLFVBQVgsRUFBdUJwQyxRQUF2QixJQUFtQytILFlBQVlySyxHQUFaLENBQW5DO0FBQ0E7QUFDRDs7QUFFRCxrQkFBSUEsSUFBSU8sT0FBSixDQUFZLEtBQVosS0FBc0IsQ0FBMUIsRUFBNkI7QUFDM0Isb0JBQUk0SyxTQUFTbkwsSUFBSW9MLFNBQUosQ0FBYyxDQUFkLENBQWI7QUFDQSxvQkFBSSxDQUFDNUwsT0FBT0MsTUFBUCxDQUFjMEwsTUFBZCxDQUFMLEVBQTRCO0FBQzFCbkQsbUNBQUl6QixJQUFKLENBQVMsY0FBVCxFQUF5Qix3REFBekIsRUFBbUZqSCxTQUFuRixFQUE4RjZMLE1BQTlGO0FBQ0E7QUFDRDtBQUNELG9CQUFJM0wsT0FBT0MsTUFBUCxDQUFjMEwsTUFBZCxFQUFzQnhMLElBQXRCLEtBQStCLFNBQW5DLEVBQThDO0FBQzVDcUksbUNBQUl6QixJQUFKLENBQVMsY0FBVCxFQUF5Qix1REFBekIsRUFBa0ZqSCxTQUFsRixFQUE2RlUsR0FBN0Y7QUFDQTtBQUNEO0FBQ0Qsb0JBQUlxSyxZQUFZckssR0FBWixNQUFxQixJQUF6QixFQUErQjtBQUM3QjtBQUNEO0FBQ0QwRSwyQkFBV3lHLE1BQVgsSUFBcUJMLHVCQUF1QnRMLE1BQXZCLEVBQStCMkwsTUFBL0IsRUFBdUNkLFlBQVlySyxHQUFaLENBQXZDLENBQXJCO0FBQ0E7QUFDRCxlQWZELE1BZU8sSUFBSUEsSUFBSSxDQUFKLEtBQVUsR0FBVixJQUFpQkEsT0FBTyxRQUE1QixFQUFzQztBQUMzQyxzQkFBTyw2QkFBNkJBLEdBQXBDO0FBQ0QsZUFGTSxNQUVBO0FBQ0wsb0JBQUlFLFFBQVFtSyxZQUFZckssR0FBWixDQUFaO0FBQ0Esb0JBQUlSLE9BQU9DLE1BQVAsQ0FBY08sR0FBZCxLQUFzQlIsT0FBT0MsTUFBUCxDQUFjTyxHQUFkLEVBQW1CTCxJQUFuQixLQUE0QixNQUFsRCxJQUE0RCtGLFVBQVVnRixxQkFBVixDQUFnQ3hLLEtBQWhDLENBQWhFLEVBQXdHO0FBQ3RHd0UsNkJBQVcxRSxHQUFYLElBQWtCMEYsVUFBVWlGLGNBQVYsQ0FBeUJ6SyxLQUF6QixDQUFsQjtBQUNBO0FBQ0Q7QUFDRCxvQkFBSVYsT0FBT0MsTUFBUCxDQUFjTyxHQUFkLEtBQXNCUixPQUFPQyxNQUFQLENBQWNPLEdBQWQsRUFBbUJMLElBQW5CLEtBQTRCLFVBQWxELElBQWdFNkYsY0FBY2tGLHFCQUFkLENBQW9DeEssS0FBcEMsQ0FBcEUsRUFBZ0g7QUFDOUd3RSw2QkFBVzFFLEdBQVgsSUFBa0J3RixjQUFjbUYsY0FBZCxDQUE2QnpLLEtBQTdCLENBQWxCO0FBQ0E7QUFDRDtBQUNELG9CQUFJVixPQUFPQyxNQUFQLENBQWNPLEdBQWQsS0FBc0JSLE9BQU9DLE1BQVAsQ0FBY08sR0FBZCxFQUFtQkwsSUFBbkIsS0FBNEIsU0FBbEQsSUFBK0Q4RixhQUFhaUYscUJBQWIsQ0FBbUN4SyxLQUFuQyxDQUFuRSxFQUE4RztBQUM1R3dFLDZCQUFXMUUsR0FBWCxJQUFrQnlGLGFBQWFrRixjQUFiLENBQTRCekssS0FBNUIsQ0FBbEI7QUFDQTtBQUNEO0FBQ0Qsb0JBQUlWLE9BQU9DLE1BQVAsQ0FBY08sR0FBZCxLQUFzQlIsT0FBT0MsTUFBUCxDQUFjTyxHQUFkLEVBQW1CTCxJQUFuQixLQUE0QixPQUFsRCxJQUE2RDBGLFdBQVdxRixxQkFBWCxDQUFpQ3hLLEtBQWpDLENBQWpFLEVBQTBHO0FBQ3hHd0UsNkJBQVcxRSxHQUFYLElBQWtCcUYsV0FBV3NGLGNBQVgsQ0FBMEJ6SyxLQUExQixDQUFsQjtBQUNBO0FBQ0Q7QUFDRjtBQUNEd0UseUJBQVcxRSxHQUFYLElBQWtCb0sscUNBQXFDQyxZQUFZckssR0FBWixDQUFyQyxDQUFsQjtBQTFGRjtBQTRGRDs7QUFFRCxjQUFNcUwscUJBQXFCMUosT0FBT0MsSUFBUCxDQUFZcEMsT0FBT0MsTUFBbkIsRUFBMkJ5RyxNQUEzQixDQUFrQzNHLGFBQWFDLE9BQU9DLE1BQVAsQ0FBY0YsU0FBZCxFQUF5QkksSUFBekIsS0FBa0MsVUFBakYsQ0FBM0I7QUFDQSxjQUFNMkwsaUJBQWlCLEVBQXZCO0FBQ0FELDJCQUFtQnpHLE9BQW5CLENBQTJCMkcscUJBQXFCO0FBQzlDRCx5QkFBZUMsaUJBQWYsSUFBb0M7QUFDbEM3TCxvQkFBUSxVQUQwQjtBQUVsQ0osdUJBQVdFLE9BQU9DLE1BQVAsQ0FBYzhMLGlCQUFkLEVBQWlDaEc7QUFGVixXQUFwQztBQUlELFNBTEQ7O0FBT0EsNEJBQVliLFVBQVosRUFBMkI0RyxjQUEzQjtBQUNEO0FBQ0Q7QUFDRSxZQUFNLGlCQUFOO0FBcEpGO0FBc0pELENBdkpEOztBQXlKQSxJQUFJcEcsWUFBWTtBQUNkRSxpQkFBZW9HLElBQWYsRUFBcUI7QUFDbkIsV0FBTyxJQUFJbEwsSUFBSixDQUFTa0wsS0FBSzNILEdBQWQsQ0FBUDtBQUNELEdBSGE7O0FBS2RzQixjQUFZakYsS0FBWixFQUFtQjtBQUNqQixXQUFRLE9BQU9BLEtBQVAsS0FBaUIsUUFBakIsSUFDTkEsVUFBVSxJQURKLElBRU5BLE1BQU1SLE1BQU4sS0FBaUIsTUFGbkI7QUFJRDtBQVZhLENBQWhCOztBQWFBLElBQUkyRixhQUFhO0FBQ2ZvRyxpQkFBZSxJQUFJM0ssTUFBSixDQUFXLGtFQUFYLENBREE7QUFFZjRLLGdCQUFjeEIsTUFBZCxFQUFzQjtBQUNwQixRQUFJLE9BQU9BLE1BQVAsS0FBa0IsUUFBdEIsRUFBZ0M7QUFDOUIsYUFBTyxLQUFQO0FBQ0Q7QUFDRCxXQUFPLEtBQUt1QixhQUFMLENBQW1CRSxJQUFuQixDQUF3QnpCLE1BQXhCLENBQVA7QUFDRCxHQVBjOztBQVNmUyxpQkFBZVQsTUFBZixFQUF1QjtBQUNyQixRQUFJaEssS0FBSjtBQUNBLFFBQUksS0FBS3dMLGFBQUwsQ0FBbUJ4QixNQUFuQixDQUFKLEVBQWdDO0FBQzlCaEssY0FBUWdLLE1BQVI7QUFDRCxLQUZELE1BRU87QUFDTGhLLGNBQVFnSyxPQUFPMEIsTUFBUCxDQUFjM0ssUUFBZCxDQUF1QixRQUF2QixDQUFSO0FBQ0Q7QUFDRCxXQUFPO0FBQ0x2QixjQUFRLE9BREg7QUFFTG1NLGNBQVEzTDtBQUZILEtBQVA7QUFJRCxHQXBCYzs7QUFzQmZ3Syx3QkFBc0JSLE1BQXRCLEVBQThCO0FBQzVCLFdBQVFBLGtCQUFrQmhMLFFBQVE0TSxNQUEzQixJQUFzQyxLQUFLSixhQUFMLENBQW1CeEIsTUFBbkIsQ0FBN0M7QUFDRCxHQXhCYzs7QUEwQmY5RSxpQkFBZW9HLElBQWYsRUFBcUI7QUFDbkIsV0FBTyxJQUFJdE0sUUFBUTRNLE1BQVosQ0FBbUIsSUFBSUMsTUFBSixDQUFXUCxLQUFLSyxNQUFoQixFQUF3QixRQUF4QixDQUFuQixDQUFQO0FBQ0QsR0E1QmM7O0FBOEJmMUcsY0FBWWpGLEtBQVosRUFBbUI7QUFDakIsV0FBUSxPQUFPQSxLQUFQLEtBQWlCLFFBQWpCLElBQ05BLFVBQVUsSUFESixJQUVOQSxNQUFNUixNQUFOLEtBQWlCLE9BRm5CO0FBSUQ7QUFuQ2MsQ0FBakI7O0FBc0NBLElBQUk4RixnQkFBZ0I7QUFDbEJtRixpQkFBZVQsTUFBZixFQUF1QjtBQUNyQixXQUFPO0FBQ0x4SyxjQUFRLFVBREg7QUFFTG9KLGdCQUFVb0IsT0FBTyxDQUFQLENBRkw7QUFHTHJCLGlCQUFXcUIsT0FBTyxDQUFQO0FBSE4sS0FBUDtBQUtELEdBUGlCOztBQVNsQlEsd0JBQXNCUixNQUF0QixFQUE4QjtBQUM1QixXQUFRQSxrQkFBa0IxSixLQUFsQixJQUNOMEosT0FBTzVJLE1BQVAsSUFBaUIsQ0FEbkI7QUFHRCxHQWJpQjs7QUFlbEI4RCxpQkFBZW9HLElBQWYsRUFBcUI7QUFDbkIsV0FBTyxDQUFFQSxLQUFLM0MsU0FBUCxFQUFrQjJDLEtBQUsxQyxRQUF2QixDQUFQO0FBQ0QsR0FqQmlCOztBQW1CbEIzRCxjQUFZakYsS0FBWixFQUFtQjtBQUNqQixXQUFRLE9BQU9BLEtBQVAsS0FBaUIsUUFBakIsSUFDTkEsVUFBVSxJQURKLElBRU5BLE1BQU1SLE1BQU4sS0FBaUIsVUFGbkI7QUFJRDtBQXhCaUIsQ0FBcEI7O0FBMkJBLElBQUkrRixlQUFlO0FBQ2pCa0YsaUJBQWVULE1BQWYsRUFBdUI7QUFDckI7QUFDQSxVQUFNOEIsU0FBUzlCLE9BQU9kLFdBQVAsQ0FBbUIsQ0FBbkIsRUFBc0IzSSxHQUF0QixDQUEyQndMLEtBQUQsSUFBVztBQUNsRCxhQUFPLENBQUNBLE1BQU0sQ0FBTixDQUFELEVBQVdBLE1BQU0sQ0FBTixDQUFYLENBQVA7QUFDRCxLQUZjLENBQWY7QUFHQSxXQUFPO0FBQ0x2TSxjQUFRLFNBREg7QUFFTDBKLG1CQUFhNEM7QUFGUixLQUFQO0FBSUQsR0FWZ0I7O0FBWWpCdEIsd0JBQXNCUixNQUF0QixFQUE4QjtBQUM1QixVQUFNOEIsU0FBUzlCLE9BQU9kLFdBQVAsQ0FBbUIsQ0FBbkIsQ0FBZjtBQUNBLFFBQUljLE9BQU92SyxJQUFQLEtBQWdCLFNBQWhCLElBQTZCLEVBQUVxTSxrQkFBa0J4TCxLQUFwQixDQUFqQyxFQUE2RDtBQUMzRCxhQUFPLEtBQVA7QUFDRDtBQUNELFNBQUssSUFBSWdCLElBQUksQ0FBYixFQUFnQkEsSUFBSXdLLE9BQU8xSyxNQUEzQixFQUFtQ0UsR0FBbkMsRUFBd0M7QUFDdEMsWUFBTW9ILFFBQVFvRCxPQUFPeEssQ0FBUCxDQUFkO0FBQ0EsVUFBSSxDQUFDZ0UsY0FBY2tGLHFCQUFkLENBQW9DOUIsS0FBcEMsQ0FBTCxFQUFpRDtBQUMvQyxlQUFPLEtBQVA7QUFDRDtBQUNEeEosWUFBTWlLLFFBQU4sQ0FBZUMsU0FBZixDQUF5QjRDLFdBQVd0RCxNQUFNLENBQU4sQ0FBWCxDQUF6QixFQUErQ3NELFdBQVd0RCxNQUFNLENBQU4sQ0FBWCxDQUEvQztBQUNEO0FBQ0QsV0FBTyxJQUFQO0FBQ0QsR0F6QmdCOztBQTJCakJ4RCxpQkFBZW9HLElBQWYsRUFBcUI7QUFDbkIsUUFBSVEsU0FBU1IsS0FBS3BDLFdBQWxCO0FBQ0E7QUFDQSxRQUFJNEMsT0FBTyxDQUFQLEVBQVUsQ0FBVixNQUFpQkEsT0FBT0EsT0FBTzFLLE1BQVAsR0FBZ0IsQ0FBdkIsRUFBMEIsQ0FBMUIsQ0FBakIsSUFDQTBLLE9BQU8sQ0FBUCxFQUFVLENBQVYsTUFBaUJBLE9BQU9BLE9BQU8xSyxNQUFQLEdBQWdCLENBQXZCLEVBQTBCLENBQTFCLENBRHJCLEVBQ21EO0FBQ2pEMEssYUFBT3RGLElBQVAsQ0FBWXNGLE9BQU8sQ0FBUCxDQUFaO0FBQ0Q7QUFDRCxVQUFNRyxTQUFTSCxPQUFPOUYsTUFBUCxDQUFjLENBQUNrRyxJQUFELEVBQU9DLEtBQVAsRUFBY0MsRUFBZCxLQUFxQjtBQUNoRCxVQUFJQyxhQUFhLENBQUMsQ0FBbEI7QUFDQSxXQUFLLElBQUkvSyxJQUFJLENBQWIsRUFBZ0JBLElBQUk4SyxHQUFHaEwsTUFBdkIsRUFBK0JFLEtBQUssQ0FBcEMsRUFBdUM7QUFDckMsY0FBTWdMLEtBQUtGLEdBQUc5SyxDQUFILENBQVg7QUFDQSxZQUFJZ0wsR0FBRyxDQUFILE1BQVVKLEtBQUssQ0FBTCxDQUFWLElBQ0FJLEdBQUcsQ0FBSCxNQUFVSixLQUFLLENBQUwsQ0FEZCxFQUN1QjtBQUNyQkcsdUJBQWEvSyxDQUFiO0FBQ0E7QUFDRDtBQUNGO0FBQ0QsYUFBTytLLGVBQWVGLEtBQXRCO0FBQ0QsS0FYYyxDQUFmO0FBWUEsUUFBSUYsT0FBTzdLLE1BQVAsR0FBZ0IsQ0FBcEIsRUFBdUI7QUFDckIsWUFBTSxJQUFJbEMsTUFBTTBDLEtBQVYsQ0FDSjFDLE1BQU0wQyxLQUFOLENBQVk2RCxxQkFEUixFQUVKLHVEQUZJLENBQU47QUFJRDtBQUNEO0FBQ0FxRyxhQUFTQSxPQUFPdkwsR0FBUCxDQUFZd0wsS0FBRCxJQUFXO0FBQzdCLGFBQU8sQ0FBQ0EsTUFBTSxDQUFOLENBQUQsRUFBV0EsTUFBTSxDQUFOLENBQVgsQ0FBUDtBQUNELEtBRlEsQ0FBVDtBQUdBLFdBQU8sRUFBRXRNLE1BQU0sU0FBUixFQUFtQnlKLGFBQWEsQ0FBQzRDLE1BQUQsQ0FBaEMsRUFBUDtBQUNELEdBekRnQjs7QUEyRGpCN0csY0FBWWpGLEtBQVosRUFBbUI7QUFDakIsV0FBUSxPQUFPQSxLQUFQLEtBQWlCLFFBQWpCLElBQ05BLFVBQVUsSUFESixJQUVOQSxNQUFNUixNQUFOLEtBQWlCLFNBRm5CO0FBSUQ7QUFoRWdCLENBQW5COztBQW1FQSxJQUFJZ0csWUFBWTtBQUNkaUYsaUJBQWVULE1BQWYsRUFBdUI7QUFDckIsV0FBTztBQUNMeEssY0FBUSxNQURIO0FBRUwrTSxZQUFNdkM7QUFGRCxLQUFQO0FBSUQsR0FOYTs7QUFRZFEsd0JBQXNCUixNQUF0QixFQUE4QjtBQUM1QixXQUFRLE9BQU9BLE1BQVAsS0FBa0IsUUFBMUI7QUFDRCxHQVZhOztBQVlkOUUsaUJBQWVvRyxJQUFmLEVBQXFCO0FBQ25CLFdBQU9BLEtBQUtpQixJQUFaO0FBQ0QsR0FkYTs7QUFnQmR0SCxjQUFZakYsS0FBWixFQUFtQjtBQUNqQixXQUFRLE9BQU9BLEtBQVAsS0FBaUIsUUFBakIsSUFDTkEsVUFBVSxJQURKLElBRU5BLE1BQU1SLE1BQU4sS0FBaUIsTUFGbkI7QUFJRDtBQXJCYSxDQUFoQjs7QUF3QkFnTixPQUFPQyxPQUFQLEdBQWlCO0FBQ2Z0TixjQURlO0FBRWZpRSxtQ0FGZTtBQUdmVSxpQkFIZTtBQUlmNUIsZ0JBSmU7QUFLZjZJLDBCQUxlO0FBTWZyRixvQkFOZTtBQU9makQscUJBUGU7QUFRZm1JO0FBUmUsQ0FBakIiLCJmaWxlIjoiTW9uZ29UcmFuc2Zvcm0uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nIGZyb20gJy4uLy4uLy4uL2xvZ2dlcic7XG5pbXBvcnQgXyAgIGZyb20gJ2xvZGFzaCc7XG52YXIgbW9uZ29kYiA9IHJlcXVpcmUoJ21vbmdvZGInKTtcbnZhciBQYXJzZSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKS5QYXJzZTtcblxuY29uc3QgdHJhbnNmb3JtS2V5ID0gKGNsYXNzTmFtZSwgZmllbGROYW1lLCBzY2hlbWEpID0+IHtcbiAgLy8gQ2hlY2sgaWYgdGhlIHNjaGVtYSBpcyBrbm93biBzaW5jZSBpdCdzIGEgYnVpbHQtaW4gZmllbGQuXG4gIHN3aXRjaChmaWVsZE5hbWUpIHtcbiAgY2FzZSAnb2JqZWN0SWQnOiByZXR1cm4gJ19pZCc7XG4gIGNhc2UgJ2NyZWF0ZWRBdCc6IHJldHVybiAnX2NyZWF0ZWRfYXQnO1xuICBjYXNlICd1cGRhdGVkQXQnOiByZXR1cm4gJ191cGRhdGVkX2F0JztcbiAgY2FzZSAnc2Vzc2lvblRva2VuJzogcmV0dXJuICdfc2Vzc2lvbl90b2tlbic7XG4gIGNhc2UgJ2xhc3RVc2VkJzogcmV0dXJuICdfbGFzdF91c2VkJztcbiAgY2FzZSAndGltZXNVc2VkJzogcmV0dXJuICd0aW1lc191c2VkJztcbiAgfVxuXG4gIGlmIChzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0gJiYgc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLl9fdHlwZSA9PSAnUG9pbnRlcicpIHtcbiAgICBmaWVsZE5hbWUgPSAnX3BfJyArIGZpZWxkTmFtZTtcbiAgfSBlbHNlIGlmIChzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0gJiYgc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnR5cGUgPT0gJ1BvaW50ZXInKSB7XG4gICAgZmllbGROYW1lID0gJ19wXycgKyBmaWVsZE5hbWU7XG4gIH1cblxuICByZXR1cm4gZmllbGROYW1lO1xufVxuXG5jb25zdCB0cmFuc2Zvcm1LZXlWYWx1ZUZvclVwZGF0ZSA9IChjbGFzc05hbWUsIHJlc3RLZXksIHJlc3RWYWx1ZSwgcGFyc2VGb3JtYXRTY2hlbWEpID0+IHtcbiAgLy8gQ2hlY2sgaWYgdGhlIHNjaGVtYSBpcyBrbm93biBzaW5jZSBpdCdzIGEgYnVpbHQtaW4gZmllbGQuXG4gIHZhciBrZXkgPSByZXN0S2V5O1xuICB2YXIgdGltZUZpZWxkID0gZmFsc2U7XG4gIHN3aXRjaChrZXkpIHtcbiAgY2FzZSAnb2JqZWN0SWQnOlxuICBjYXNlICdfaWQnOlxuICAgIGlmIChjbGFzc05hbWUgPT09ICdfR2xvYmFsQ29uZmlnJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIHZhbHVlOiBwYXJzZUludChyZXN0VmFsdWUpXG4gICAgICB9XG4gICAgfVxuICAgIGtleSA9ICdfaWQnO1xuICAgIGJyZWFrO1xuICBjYXNlICdjcmVhdGVkQXQnOlxuICBjYXNlICdfY3JlYXRlZF9hdCc6XG4gICAga2V5ID0gJ19jcmVhdGVkX2F0JztcbiAgICB0aW1lRmllbGQgPSB0cnVlO1xuICAgIGJyZWFrO1xuICBjYXNlICd1cGRhdGVkQXQnOlxuICBjYXNlICdfdXBkYXRlZF9hdCc6XG4gICAga2V5ID0gJ191cGRhdGVkX2F0JztcbiAgICB0aW1lRmllbGQgPSB0cnVlO1xuICAgIGJyZWFrO1xuICBjYXNlICdzZXNzaW9uVG9rZW4nOlxuICBjYXNlICdfc2Vzc2lvbl90b2tlbic6XG4gICAga2V5ID0gJ19zZXNzaW9uX3Rva2VuJztcbiAgICBicmVhaztcbiAgY2FzZSAnZXhwaXJlc0F0JzpcbiAgY2FzZSAnX2V4cGlyZXNBdCc6XG4gICAga2V5ID0gJ2V4cGlyZXNBdCc7XG4gICAgdGltZUZpZWxkID0gdHJ1ZTtcbiAgICBicmVhaztcbiAgY2FzZSAnX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0JzpcbiAgICBrZXkgPSAnX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0JztcbiAgICB0aW1lRmllbGQgPSB0cnVlO1xuICAgIGJyZWFrO1xuICBjYXNlICdfYWNjb3VudF9sb2Nrb3V0X2V4cGlyZXNfYXQnOlxuICAgIGtleSA9ICdfYWNjb3VudF9sb2Nrb3V0X2V4cGlyZXNfYXQnO1xuICAgIHRpbWVGaWVsZCA9IHRydWU7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ19mYWlsZWRfbG9naW5fY291bnQnOlxuICAgIGtleSA9ICdfZmFpbGVkX2xvZ2luX2NvdW50JztcbiAgICBicmVhaztcbiAgY2FzZSAnX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdCc6XG4gICAga2V5ID0gJ19wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQnO1xuICAgIHRpbWVGaWVsZCA9IHRydWU7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ19wYXNzd29yZF9jaGFuZ2VkX2F0JzpcbiAgICBrZXkgPSAnX3Bhc3N3b3JkX2NoYW5nZWRfYXQnO1xuICAgIHRpbWVGaWVsZCA9IHRydWU7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ19ycGVybSc6XG4gIGNhc2UgJ193cGVybSc6XG4gICAgcmV0dXJuIHtrZXk6IGtleSwgdmFsdWU6IHJlc3RWYWx1ZX07XG4gIGNhc2UgJ2xhc3RVc2VkJzpcbiAgY2FzZSAnX2xhc3RfdXNlZCc6XG4gICAga2V5ID0gJ19sYXN0X3VzZWQnO1xuICAgIHRpbWVGaWVsZCA9IHRydWU7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ3RpbWVzVXNlZCc6XG4gIGNhc2UgJ3RpbWVzX3VzZWQnOlxuICAgIGtleSA9ICd0aW1lc191c2VkJztcbiAgICB0aW1lRmllbGQgPSB0cnVlO1xuICAgIGJyZWFrO1xuICB9XG5cbiAgaWYgKChwYXJzZUZvcm1hdFNjaGVtYS5maWVsZHNba2V5XSAmJiBwYXJzZUZvcm1hdFNjaGVtYS5maWVsZHNba2V5XS50eXBlID09PSAnUG9pbnRlcicpIHx8ICghcGFyc2VGb3JtYXRTY2hlbWEuZmllbGRzW2tleV0gJiYgcmVzdFZhbHVlICYmIHJlc3RWYWx1ZS5fX3R5cGUgPT0gJ1BvaW50ZXInKSkge1xuICAgIGtleSA9ICdfcF8nICsga2V5O1xuICB9XG5cbiAgLy8gSGFuZGxlIGF0b21pYyB2YWx1ZXNcbiAgdmFyIHZhbHVlID0gdHJhbnNmb3JtVG9wTGV2ZWxBdG9tKHJlc3RWYWx1ZSk7XG4gIGlmICh2YWx1ZSAhPT0gQ2Fubm90VHJhbnNmb3JtKSB7XG4gICAgaWYgKHRpbWVGaWVsZCAmJiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykpIHtcbiAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuICAgIH1cbiAgICBpZiAocmVzdEtleS5pbmRleE9mKCcuJykgPiAwKSB7XG4gICAgICByZXR1cm4ge2tleSwgdmFsdWU6IHJlc3RWYWx1ZX1cbiAgICB9XG4gICAgcmV0dXJuIHtrZXksIHZhbHVlfTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBhcnJheXNcbiAgaWYgKHJlc3RWYWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgdmFsdWUgPSByZXN0VmFsdWUubWFwKHRyYW5zZm9ybUludGVyaW9yVmFsdWUpO1xuICAgIHJldHVybiB7a2V5LCB2YWx1ZX07XG4gIH1cblxuICAvLyBIYW5kbGUgdXBkYXRlIG9wZXJhdG9yc1xuICBpZiAodHlwZW9mIHJlc3RWYWx1ZSA9PT0gJ29iamVjdCcgJiYgJ19fb3AnIGluIHJlc3RWYWx1ZSkge1xuICAgIHJldHVybiB7a2V5LCB2YWx1ZTogdHJhbnNmb3JtVXBkYXRlT3BlcmF0b3IocmVzdFZhbHVlLCBmYWxzZSl9O1xuICB9XG5cbiAgLy8gSGFuZGxlIG5vcm1hbCBvYmplY3RzIGJ5IHJlY3Vyc2luZ1xuICB2YWx1ZSA9IG1hcFZhbHVlcyhyZXN0VmFsdWUsIHRyYW5zZm9ybUludGVyaW9yVmFsdWUpO1xuICByZXR1cm4ge2tleSwgdmFsdWV9O1xufVxuXG5jb25zdCBpc1JlZ2V4ID0gdmFsdWUgPT4ge1xuICByZXR1cm4gdmFsdWUgJiYgKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKVxufVxuXG5jb25zdCBpc1N0YXJ0c1dpdGhSZWdleCA9IHZhbHVlID0+IHtcbiAgaWYgKCFpc1JlZ2V4KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1hdGNoZXMgPSB2YWx1ZS50b1N0cmluZygpLm1hdGNoKC9cXC9cXF5cXFxcUS4qXFxcXEVcXC8vKTtcbiAgcmV0dXJuICEhbWF0Y2hlcztcbn1cblxuY29uc3QgaXNBbGxWYWx1ZXNSZWdleE9yTm9uZSA9IHZhbHVlcyA9PiB7XG4gIGlmICghdmFsdWVzIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlcykgfHwgdmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgZmlyc3RWYWx1ZXNJc1JlZ2V4ID0gaXNTdGFydHNXaXRoUmVnZXgodmFsdWVzWzBdKTtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZmlyc3RWYWx1ZXNJc1JlZ2V4O1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDEsIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGg7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmIChmaXJzdFZhbHVlc0lzUmVnZXggIT09IGlzU3RhcnRzV2l0aFJlZ2V4KHZhbHVlc1tpXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaXNBbnlWYWx1ZVJlZ2V4ID0gdmFsdWVzID0+IHtcbiAgcmV0dXJuIHZhbHVlcy5zb21lKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBpc1JlZ2V4KHZhbHVlKTtcbiAgfSk7XG59XG5cbmNvbnN0IHRyYW5zZm9ybUludGVyaW9yVmFsdWUgPSByZXN0VmFsdWUgPT4ge1xuICBpZiAocmVzdFZhbHVlICE9PSBudWxsICYmIHR5cGVvZiByZXN0VmFsdWUgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHJlc3RWYWx1ZSkuc29tZShrZXkgPT4ga2V5LmluY2x1ZGVzKCckJykgfHwga2V5LmluY2x1ZGVzKCcuJykpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfTkVTVEVEX0tFWSwgXCJOZXN0ZWQga2V5cyBzaG91bGQgbm90IGNvbnRhaW4gdGhlICckJyBvciAnLicgY2hhcmFjdGVyc1wiKTtcbiAgfVxuICAvLyBIYW5kbGUgYXRvbWljIHZhbHVlc1xuICB2YXIgdmFsdWUgPSB0cmFuc2Zvcm1JbnRlcmlvckF0b20ocmVzdFZhbHVlKTtcbiAgaWYgKHZhbHVlICE9PSBDYW5ub3RUcmFuc2Zvcm0pIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvLyBIYW5kbGUgYXJyYXlzXG4gIGlmIChyZXN0VmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHJldHVybiByZXN0VmFsdWUubWFwKHRyYW5zZm9ybUludGVyaW9yVmFsdWUpO1xuICB9XG5cbiAgLy8gSGFuZGxlIHVwZGF0ZSBvcGVyYXRvcnNcbiAgaWYgKHR5cGVvZiByZXN0VmFsdWUgPT09ICdvYmplY3QnICYmICdfX29wJyBpbiByZXN0VmFsdWUpIHtcbiAgICByZXR1cm4gdHJhbnNmb3JtVXBkYXRlT3BlcmF0b3IocmVzdFZhbHVlLCB0cnVlKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBub3JtYWwgb2JqZWN0cyBieSByZWN1cnNpbmdcbiAgcmV0dXJuIG1hcFZhbHVlcyhyZXN0VmFsdWUsIHRyYW5zZm9ybUludGVyaW9yVmFsdWUpO1xufVxuXG5jb25zdCB2YWx1ZUFzRGF0ZSA9IHZhbHVlID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVF1ZXJ5S2V5VmFsdWUoY2xhc3NOYW1lLCBrZXksIHZhbHVlLCBzY2hlbWEpIHtcbiAgc3dpdGNoKGtleSkge1xuICBjYXNlICdjcmVhdGVkQXQnOlxuICAgIGlmICh2YWx1ZUFzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7a2V5OiAnX2NyZWF0ZWRfYXQnLCB2YWx1ZTogdmFsdWVBc0RhdGUodmFsdWUpfVxuICAgIH1cbiAgICBrZXkgPSAnX2NyZWF0ZWRfYXQnO1xuICAgIGJyZWFrO1xuICBjYXNlICd1cGRhdGVkQXQnOlxuICAgIGlmICh2YWx1ZUFzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7a2V5OiAnX3VwZGF0ZWRfYXQnLCB2YWx1ZTogdmFsdWVBc0RhdGUodmFsdWUpfVxuICAgIH1cbiAgICBrZXkgPSAnX3VwZGF0ZWRfYXQnO1xuICAgIGJyZWFrO1xuICBjYXNlICdleHBpcmVzQXQnOlxuICAgIGlmICh2YWx1ZUFzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7a2V5OiAnZXhwaXJlc0F0JywgdmFsdWU6IHZhbHVlQXNEYXRlKHZhbHVlKX1cbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgJ19lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCc6XG4gICAgaWYgKHZhbHVlQXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHtrZXk6ICdfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQnLCB2YWx1ZTogdmFsdWVBc0RhdGUodmFsdWUpfVxuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSAnb2JqZWN0SWQnOiB7XG4gICAgaWYgKGNsYXNzTmFtZSA9PT0gJ19HbG9iYWxDb25maWcnKSB7XG4gICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHtrZXk6ICdfaWQnLCB2YWx1ZX1cbiAgfVxuICBjYXNlICdfYWNjb3VudF9sb2Nrb3V0X2V4cGlyZXNfYXQnOlxuICAgIGlmICh2YWx1ZUFzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7a2V5OiAnX2FjY291bnRfbG9ja291dF9leHBpcmVzX2F0JywgdmFsdWU6IHZhbHVlQXNEYXRlKHZhbHVlKX1cbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgJ19mYWlsZWRfbG9naW5fY291bnQnOlxuICAgIHJldHVybiB7a2V5LCB2YWx1ZX07XG4gIGNhc2UgJ3Nlc3Npb25Ub2tlbic6IHJldHVybiB7a2V5OiAnX3Nlc3Npb25fdG9rZW4nLCB2YWx1ZX1cbiAgY2FzZSAnX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdCc6XG4gICAgaWYgKHZhbHVlQXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsga2V5OiAnX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdCcsIHZhbHVlOiB2YWx1ZUFzRGF0ZSh2YWx1ZSkgfVxuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSAnX3Bhc3N3b3JkX2NoYW5nZWRfYXQnOlxuICAgIGlmICh2YWx1ZUFzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGtleTogJ19wYXNzd29yZF9jaGFuZ2VkX2F0JywgdmFsdWU6IHZhbHVlQXNEYXRlKHZhbHVlKSB9XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlICdfcnBlcm0nOlxuICBjYXNlICdfd3Blcm0nOlxuICBjYXNlICdfcGVyaXNoYWJsZV90b2tlbic6XG4gIGNhc2UgJ19lbWFpbF92ZXJpZnlfdG9rZW4nOiByZXR1cm4ge2tleSwgdmFsdWV9XG4gIGNhc2UgJyRvcic6XG4gIGNhc2UgJyRhbmQnOlxuICBjYXNlICckbm9yJzpcbiAgICByZXR1cm4ge2tleToga2V5LCB2YWx1ZTogdmFsdWUubWFwKHN1YlF1ZXJ5ID0+IHRyYW5zZm9ybVdoZXJlKGNsYXNzTmFtZSwgc3ViUXVlcnksIHNjaGVtYSkpfTtcbiAgY2FzZSAnbGFzdFVzZWQnOlxuICAgIGlmICh2YWx1ZUFzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7a2V5OiAnX2xhc3RfdXNlZCcsIHZhbHVlOiB2YWx1ZUFzRGF0ZSh2YWx1ZSl9XG4gICAgfVxuICAgIGtleSA9ICdfbGFzdF91c2VkJztcbiAgICBicmVhaztcbiAgY2FzZSAndGltZXNVc2VkJzpcbiAgICByZXR1cm4ge2tleTogJ3RpbWVzX3VzZWQnLCB2YWx1ZTogdmFsdWV9O1xuICBkZWZhdWx0OiB7XG4gICAgLy8gT3RoZXIgYXV0aCBkYXRhXG4gICAgY29uc3QgYXV0aERhdGFNYXRjaCA9IGtleS5tYXRjaCgvXmF1dGhEYXRhXFwuKFthLXpBLVowLTlfXSspXFwuaWQkLyk7XG4gICAgaWYgKGF1dGhEYXRhTWF0Y2gpIHtcbiAgICAgIGNvbnN0IHByb3ZpZGVyID0gYXV0aERhdGFNYXRjaFsxXTtcbiAgICAgIC8vIFNwZWNpYWwtY2FzZSBhdXRoIGRhdGEuXG4gICAgICByZXR1cm4ge2tleTogYF9hdXRoX2RhdGFfJHtwcm92aWRlcn0uaWRgLCB2YWx1ZX07XG4gICAgfVxuICB9XG4gIH1cblxuICBjb25zdCBleHBlY3RlZFR5cGVJc0FycmF5ID1cbiAgICBzY2hlbWEgJiZcbiAgICBzY2hlbWEuZmllbGRzW2tleV0gJiZcbiAgICBzY2hlbWEuZmllbGRzW2tleV0udHlwZSA9PT0gJ0FycmF5JztcblxuICBjb25zdCBleHBlY3RlZFR5cGVJc1BvaW50ZXIgPVxuICAgIHNjaGVtYSAmJlxuICAgIHNjaGVtYS5maWVsZHNba2V5XSAmJlxuICAgIHNjaGVtYS5maWVsZHNba2V5XS50eXBlID09PSAnUG9pbnRlcic7XG5cbiAgY29uc3QgZmllbGQgPSBzY2hlbWEgJiYgc2NoZW1hLmZpZWxkc1trZXldO1xuICBpZiAoZXhwZWN0ZWRUeXBlSXNQb2ludGVyIHx8ICFzY2hlbWEgJiYgdmFsdWUgJiYgdmFsdWUuX190eXBlID09PSAnUG9pbnRlcicpIHtcbiAgICBrZXkgPSAnX3BfJyArIGtleTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBxdWVyeSBjb25zdHJhaW50c1xuICBjb25zdCB0cmFuc2Zvcm1lZENvbnN0cmFpbnQgPSB0cmFuc2Zvcm1Db25zdHJhaW50KHZhbHVlLCBmaWVsZCk7XG4gIGlmICh0cmFuc2Zvcm1lZENvbnN0cmFpbnQgIT09IENhbm5vdFRyYW5zZm9ybSkge1xuICAgIGlmICh0cmFuc2Zvcm1lZENvbnN0cmFpbnQuJHRleHQpIHtcbiAgICAgIHJldHVybiB7a2V5OiAnJHRleHQnLCB2YWx1ZTogdHJhbnNmb3JtZWRDb25zdHJhaW50LiR0ZXh0fTtcbiAgICB9XG4gICAgaWYgKHRyYW5zZm9ybWVkQ29uc3RyYWludC4kZWxlbU1hdGNoKSB7XG4gICAgICByZXR1cm4geyBrZXk6ICckbm9yJywgdmFsdWU6IFt7IFtrZXldOiB0cmFuc2Zvcm1lZENvbnN0cmFpbnQgfV0gfTtcbiAgICB9XG4gICAgcmV0dXJuIHtrZXksIHZhbHVlOiB0cmFuc2Zvcm1lZENvbnN0cmFpbnR9O1xuICB9XG5cbiAgaWYgKGV4cGVjdGVkVHlwZUlzQXJyYXkgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgIHJldHVybiB7a2V5LCB2YWx1ZTogeyAnJGFsbCcgOiBbdHJhbnNmb3JtSW50ZXJpb3JBdG9tKHZhbHVlKV0gfX07XG4gIH1cblxuICAvLyBIYW5kbGUgYXRvbWljIHZhbHVlc1xuICBpZiAodHJhbnNmb3JtVG9wTGV2ZWxBdG9tKHZhbHVlKSAhPT0gQ2Fubm90VHJhbnNmb3JtKSB7XG4gICAgcmV0dXJuIHtrZXksIHZhbHVlOiB0cmFuc2Zvcm1Ub3BMZXZlbEF0b20odmFsdWUpfTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLCBgWW91IGNhbm5vdCB1c2UgJHt2YWx1ZX0gYXMgYSBxdWVyeSBwYXJhbWV0ZXIuYCk7XG4gIH1cbn1cblxuLy8gTWFpbiBleHBvc2VkIG1ldGhvZCB0byBoZWxwIHJ1biBxdWVyaWVzLlxuLy8gcmVzdFdoZXJlIGlzIHRoZSBcIndoZXJlXCIgY2xhdXNlIGluIFJFU1QgQVBJIGZvcm0uXG4vLyBSZXR1cm5zIHRoZSBtb25nbyBmb3JtIG9mIHRoZSBxdWVyeS5cbmZ1bmN0aW9uIHRyYW5zZm9ybVdoZXJlKGNsYXNzTmFtZSwgcmVzdFdoZXJlLCBzY2hlbWEpIHtcbiAgY29uc3QgbW9uZ29XaGVyZSA9IHt9O1xuICBmb3IgKGNvbnN0IHJlc3RLZXkgaW4gcmVzdFdoZXJlKSB7XG4gICAgY29uc3Qgb3V0ID0gdHJhbnNmb3JtUXVlcnlLZXlWYWx1ZShjbGFzc05hbWUsIHJlc3RLZXksIHJlc3RXaGVyZVtyZXN0S2V5XSwgc2NoZW1hKTtcbiAgICBtb25nb1doZXJlW291dC5rZXldID0gb3V0LnZhbHVlO1xuICB9XG4gIHJldHVybiBtb25nb1doZXJlO1xufVxuXG5jb25zdCBwYXJzZU9iamVjdEtleVZhbHVlVG9Nb25nb09iamVjdEtleVZhbHVlID0gKHJlc3RLZXksIHJlc3RWYWx1ZSwgc2NoZW1hKSA9PiB7XG4gIC8vIENoZWNrIGlmIHRoZSBzY2hlbWEgaXMga25vd24gc2luY2UgaXQncyBhIGJ1aWx0LWluIGZpZWxkLlxuICBsZXQgdHJhbnNmb3JtZWRWYWx1ZTtcbiAgbGV0IGNvZXJjZWRUb0RhdGU7XG4gIHN3aXRjaChyZXN0S2V5KSB7XG4gIGNhc2UgJ29iamVjdElkJzogcmV0dXJuIHtrZXk6ICdfaWQnLCB2YWx1ZTogcmVzdFZhbHVlfTtcbiAgY2FzZSAnZXhwaXJlc0F0JzpcbiAgICB0cmFuc2Zvcm1lZFZhbHVlID0gdHJhbnNmb3JtVG9wTGV2ZWxBdG9tKHJlc3RWYWx1ZSk7XG4gICAgY29lcmNlZFRvRGF0ZSA9IHR5cGVvZiB0cmFuc2Zvcm1lZFZhbHVlID09PSAnc3RyaW5nJyA/IG5ldyBEYXRlKHRyYW5zZm9ybWVkVmFsdWUpIDogdHJhbnNmb3JtZWRWYWx1ZVxuICAgIHJldHVybiB7a2V5OiAnZXhwaXJlc0F0JywgdmFsdWU6IGNvZXJjZWRUb0RhdGV9O1xuICBjYXNlICdfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQnOlxuICAgIHRyYW5zZm9ybWVkVmFsdWUgPSB0cmFuc2Zvcm1Ub3BMZXZlbEF0b20ocmVzdFZhbHVlKTtcbiAgICBjb2VyY2VkVG9EYXRlID0gdHlwZW9mIHRyYW5zZm9ybWVkVmFsdWUgPT09ICdzdHJpbmcnID8gbmV3IERhdGUodHJhbnNmb3JtZWRWYWx1ZSkgOiB0cmFuc2Zvcm1lZFZhbHVlXG4gICAgcmV0dXJuIHtrZXk6ICdfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQnLCB2YWx1ZTogY29lcmNlZFRvRGF0ZX07XG4gIGNhc2UgJ19hY2NvdW50X2xvY2tvdXRfZXhwaXJlc19hdCc6XG4gICAgdHJhbnNmb3JtZWRWYWx1ZSA9IHRyYW5zZm9ybVRvcExldmVsQXRvbShyZXN0VmFsdWUpO1xuICAgIGNvZXJjZWRUb0RhdGUgPSB0eXBlb2YgdHJhbnNmb3JtZWRWYWx1ZSA9PT0gJ3N0cmluZycgPyBuZXcgRGF0ZSh0cmFuc2Zvcm1lZFZhbHVlKSA6IHRyYW5zZm9ybWVkVmFsdWVcbiAgICByZXR1cm4ge2tleTogJ19hY2NvdW50X2xvY2tvdXRfZXhwaXJlc19hdCcsIHZhbHVlOiBjb2VyY2VkVG9EYXRlfTtcbiAgY2FzZSAnX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdCc6XG4gICAgdHJhbnNmb3JtZWRWYWx1ZSA9IHRyYW5zZm9ybVRvcExldmVsQXRvbShyZXN0VmFsdWUpO1xuICAgIGNvZXJjZWRUb0RhdGUgPSB0eXBlb2YgdHJhbnNmb3JtZWRWYWx1ZSA9PT0gJ3N0cmluZycgPyBuZXcgRGF0ZSh0cmFuc2Zvcm1lZFZhbHVlKSA6IHRyYW5zZm9ybWVkVmFsdWVcbiAgICByZXR1cm4geyBrZXk6ICdfcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0JywgdmFsdWU6IGNvZXJjZWRUb0RhdGUgfTtcbiAgY2FzZSAnX3Bhc3N3b3JkX2NoYW5nZWRfYXQnOlxuICAgIHRyYW5zZm9ybWVkVmFsdWUgPSB0cmFuc2Zvcm1Ub3BMZXZlbEF0b20ocmVzdFZhbHVlKTtcbiAgICBjb2VyY2VkVG9EYXRlID0gdHlwZW9mIHRyYW5zZm9ybWVkVmFsdWUgPT09ICdzdHJpbmcnID8gbmV3IERhdGUodHJhbnNmb3JtZWRWYWx1ZSkgOiB0cmFuc2Zvcm1lZFZhbHVlXG4gICAgcmV0dXJuIHsga2V5OiAnX3Bhc3N3b3JkX2NoYW5nZWRfYXQnLCB2YWx1ZTogY29lcmNlZFRvRGF0ZSB9O1xuICBjYXNlICdfZmFpbGVkX2xvZ2luX2NvdW50JzpcbiAgY2FzZSAnX3JwZXJtJzpcbiAgY2FzZSAnX3dwZXJtJzpcbiAgY2FzZSAnX2VtYWlsX3ZlcmlmeV90b2tlbic6XG4gIGNhc2UgJ19oYXNoZWRfcGFzc3dvcmQnOlxuICBjYXNlICdfcGVyaXNoYWJsZV90b2tlbic6IHJldHVybiB7a2V5OiByZXN0S2V5LCB2YWx1ZTogcmVzdFZhbHVlfTtcbiAgY2FzZSAnc2Vzc2lvblRva2VuJzogcmV0dXJuIHtrZXk6ICdfc2Vzc2lvbl90b2tlbicsIHZhbHVlOiByZXN0VmFsdWV9O1xuICBkZWZhdWx0OlxuICAgIC8vIEF1dGggZGF0YSBzaG91bGQgaGF2ZSBiZWVuIHRyYW5zZm9ybWVkIGFscmVhZHlcbiAgICBpZiAocmVzdEtleS5tYXRjaCgvXmF1dGhEYXRhXFwuKFthLXpBLVowLTlfXSspXFwuaWQkLykpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0tFWV9OQU1FLCAnY2FuIG9ubHkgcXVlcnkgb24gJyArIHJlc3RLZXkpO1xuICAgIH1cbiAgICAvLyBUcnVzdCB0aGF0IHRoZSBhdXRoIGRhdGEgaGFzIGJlZW4gdHJhbnNmb3JtZWQgYW5kIHNhdmUgaXQgZGlyZWN0bHlcbiAgICBpZiAocmVzdEtleS5tYXRjaCgvXl9hdXRoX2RhdGFfW2EtekEtWjAtOV9dKyQvKSkge1xuICAgICAgcmV0dXJuIHtrZXk6IHJlc3RLZXksIHZhbHVlOiByZXN0VmFsdWV9O1xuICAgIH1cbiAgfVxuICAvL3NraXAgc3RyYWlnaHQgdG8gdHJhbnNmb3JtVG9wTGV2ZWxBdG9tIGZvciBCeXRlcywgdGhleSBkb24ndCBzaG93IHVwIGluIHRoZSBzY2hlbWEgZm9yIHNvbWUgcmVhc29uXG4gIGlmIChyZXN0VmFsdWUgJiYgcmVzdFZhbHVlLl9fdHlwZSAhPT0gJ0J5dGVzJykge1xuICAgIC8vTm90ZTogV2UgbWF5IG5vdCBrbm93IHRoZSB0eXBlIG9mIGEgZmllbGQgaGVyZSwgYXMgdGhlIHVzZXIgY291bGQgYmUgc2F2aW5nIChudWxsKSB0byBhIGZpZWxkXG4gICAgLy9UaGF0IG5ldmVyIGV4aXN0ZWQgYmVmb3JlLCBtZWFuaW5nIHdlIGNhbid0IGluZmVyIHRoZSB0eXBlLlxuICAgIGlmIChzY2hlbWEuZmllbGRzW3Jlc3RLZXldICYmIHNjaGVtYS5maWVsZHNbcmVzdEtleV0udHlwZSA9PSAnUG9pbnRlcicgfHwgcmVzdFZhbHVlLl9fdHlwZSA9PSAnUG9pbnRlcicpIHtcbiAgICAgIHJlc3RLZXkgPSAnX3BfJyArIHJlc3RLZXk7XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIGF0b21pYyB2YWx1ZXNcbiAgdmFyIHZhbHVlID0gdHJhbnNmb3JtVG9wTGV2ZWxBdG9tKHJlc3RWYWx1ZSk7XG4gIGlmICh2YWx1ZSAhPT0gQ2Fubm90VHJhbnNmb3JtKSB7XG4gICAgcmV0dXJuIHtrZXk6IHJlc3RLZXksIHZhbHVlOiB2YWx1ZX07XG4gIH1cblxuICAvLyBBQ0xzIGFyZSBoYW5kbGVkIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWRcbiAgLy8gSWYgYW4gQUNMIGtleSBzdGlsbCBleGlzdHMgaGVyZSwgc29tZXRoaW5nIGlzIHdyb25nLlxuICBpZiAocmVzdEtleSA9PT0gJ0FDTCcpIHtcbiAgICB0aHJvdyAnVGhlcmUgd2FzIGEgcHJvYmxlbSB0cmFuc2Zvcm1pbmcgYW4gQUNMLic7XG4gIH1cblxuICAvLyBIYW5kbGUgYXJyYXlzXG4gIGlmIChyZXN0VmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHZhbHVlID0gcmVzdFZhbHVlLm1hcCh0cmFuc2Zvcm1JbnRlcmlvclZhbHVlKTtcbiAgICByZXR1cm4ge2tleTogcmVzdEtleSwgdmFsdWU6IHZhbHVlfTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBub3JtYWwgb2JqZWN0cyBieSByZWN1cnNpbmdcbiAgaWYgKE9iamVjdC5rZXlzKHJlc3RWYWx1ZSkuc29tZShrZXkgPT4ga2V5LmluY2x1ZGVzKCckJykgfHwga2V5LmluY2x1ZGVzKCcuJykpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfTkVTVEVEX0tFWSwgXCJOZXN0ZWQga2V5cyBzaG91bGQgbm90IGNvbnRhaW4gdGhlICckJyBvciAnLicgY2hhcmFjdGVyc1wiKTtcbiAgfVxuICB2YWx1ZSA9IG1hcFZhbHVlcyhyZXN0VmFsdWUsIHRyYW5zZm9ybUludGVyaW9yVmFsdWUpO1xuICByZXR1cm4ge2tleTogcmVzdEtleSwgdmFsdWV9O1xufVxuXG5jb25zdCBwYXJzZU9iamVjdFRvTW9uZ29PYmplY3RGb3JDcmVhdGUgPSAoY2xhc3NOYW1lLCByZXN0Q3JlYXRlLCBzY2hlbWEpID0+IHtcbiAgcmVzdENyZWF0ZSA9IGFkZExlZ2FjeUFDTChyZXN0Q3JlYXRlKTtcbiAgY29uc3QgbW9uZ29DcmVhdGUgPSB7fVxuICBmb3IgKGNvbnN0IHJlc3RLZXkgaW4gcmVzdENyZWF0ZSkge1xuICAgIGlmIChyZXN0Q3JlYXRlW3Jlc3RLZXldICYmIHJlc3RDcmVhdGVbcmVzdEtleV0uX190eXBlID09PSAnUmVsYXRpb24nKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgeyBrZXksIHZhbHVlIH0gPSBwYXJzZU9iamVjdEtleVZhbHVlVG9Nb25nb09iamVjdEtleVZhbHVlKFxuICAgICAgcmVzdEtleSxcbiAgICAgIHJlc3RDcmVhdGVbcmVzdEtleV0sXG4gICAgICBzY2hlbWFcbiAgICApO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb25nb0NyZWF0ZVtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gVXNlIHRoZSBsZWdhY3kgbW9uZ28gZm9ybWF0IGZvciBjcmVhdGVkQXQgYW5kIHVwZGF0ZWRBdFxuICBpZiAobW9uZ29DcmVhdGUuY3JlYXRlZEF0KSB7XG4gICAgbW9uZ29DcmVhdGUuX2NyZWF0ZWRfYXQgPSBuZXcgRGF0ZShtb25nb0NyZWF0ZS5jcmVhdGVkQXQuaXNvIHx8IG1vbmdvQ3JlYXRlLmNyZWF0ZWRBdCk7XG4gICAgZGVsZXRlIG1vbmdvQ3JlYXRlLmNyZWF0ZWRBdDtcbiAgfVxuICBpZiAobW9uZ29DcmVhdGUudXBkYXRlZEF0KSB7XG4gICAgbW9uZ29DcmVhdGUuX3VwZGF0ZWRfYXQgPSBuZXcgRGF0ZShtb25nb0NyZWF0ZS51cGRhdGVkQXQuaXNvIHx8IG1vbmdvQ3JlYXRlLnVwZGF0ZWRBdCk7XG4gICAgZGVsZXRlIG1vbmdvQ3JlYXRlLnVwZGF0ZWRBdDtcbiAgfVxuXG4gIHJldHVybiBtb25nb0NyZWF0ZTtcbn1cblxuLy8gTWFpbiBleHBvc2VkIG1ldGhvZCB0byBoZWxwIHVwZGF0ZSBvbGQgb2JqZWN0cy5cbmNvbnN0IHRyYW5zZm9ybVVwZGF0ZSA9IChjbGFzc05hbWUsIHJlc3RVcGRhdGUsIHBhcnNlRm9ybWF0U2NoZW1hKSA9PiB7XG4gIGNvbnN0IG1vbmdvVXBkYXRlID0ge307XG4gIGNvbnN0IGFjbCA9IGFkZExlZ2FjeUFDTChyZXN0VXBkYXRlKTtcbiAgaWYgKGFjbC5fcnBlcm0gfHwgYWNsLl93cGVybSB8fCBhY2wuX2FjbCkge1xuICAgIG1vbmdvVXBkYXRlLiRzZXQgPSB7fTtcbiAgICBpZiAoYWNsLl9ycGVybSkge1xuICAgICAgbW9uZ29VcGRhdGUuJHNldC5fcnBlcm0gPSBhY2wuX3JwZXJtO1xuICAgIH1cbiAgICBpZiAoYWNsLl93cGVybSkge1xuICAgICAgbW9uZ29VcGRhdGUuJHNldC5fd3Blcm0gPSBhY2wuX3dwZXJtO1xuICAgIH1cbiAgICBpZiAoYWNsLl9hY2wpIHtcbiAgICAgIG1vbmdvVXBkYXRlLiRzZXQuX2FjbCA9IGFjbC5fYWNsO1xuICAgIH1cbiAgfVxuICBmb3IgKHZhciByZXN0S2V5IGluIHJlc3RVcGRhdGUpIHtcbiAgICBpZiAocmVzdFVwZGF0ZVtyZXN0S2V5XSAmJiByZXN0VXBkYXRlW3Jlc3RLZXldLl9fdHlwZSA9PT0gJ1JlbGF0aW9uJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBvdXQgPSB0cmFuc2Zvcm1LZXlWYWx1ZUZvclVwZGF0ZShjbGFzc05hbWUsIHJlc3RLZXksIHJlc3RVcGRhdGVbcmVzdEtleV0sIHBhcnNlRm9ybWF0U2NoZW1hKTtcblxuICAgIC8vIElmIHRoZSBvdXRwdXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW55ICQga2V5cywgaXQncyBhblxuICAgIC8vIG9wZXJhdG9yIHRoYXQgbmVlZHMgdG8gYmUgbGlmdGVkIG9udG8gdGhlIHRvcCBsZXZlbCB1cGRhdGVcbiAgICAvLyBvYmplY3QuXG4gICAgaWYgKHR5cGVvZiBvdXQudmFsdWUgPT09ICdvYmplY3QnICYmIG91dC52YWx1ZSAhPT0gbnVsbCAmJiBvdXQudmFsdWUuX19vcCkge1xuICAgICAgbW9uZ29VcGRhdGVbb3V0LnZhbHVlLl9fb3BdID0gbW9uZ29VcGRhdGVbb3V0LnZhbHVlLl9fb3BdIHx8IHt9O1xuICAgICAgbW9uZ29VcGRhdGVbb3V0LnZhbHVlLl9fb3BdW291dC5rZXldID0gb3V0LnZhbHVlLmFyZztcbiAgICB9IGVsc2Uge1xuICAgICAgbW9uZ29VcGRhdGVbJyRzZXQnXSA9IG1vbmdvVXBkYXRlWyckc2V0J10gfHwge307XG4gICAgICBtb25nb1VwZGF0ZVsnJHNldCddW291dC5rZXldID0gb3V0LnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtb25nb1VwZGF0ZTtcbn1cblxuLy8gQWRkIHRoZSBsZWdhY3kgX2FjbCBmb3JtYXQuXG5jb25zdCBhZGRMZWdhY3lBQ0wgPSByZXN0T2JqZWN0ID0+IHtcbiAgY29uc3QgcmVzdE9iamVjdENvcHkgPSB7Li4ucmVzdE9iamVjdH07XG4gIGNvbnN0IF9hY2wgPSB7fTtcblxuICBpZiAocmVzdE9iamVjdC5fd3Blcm0pIHtcbiAgICByZXN0T2JqZWN0Ll93cGVybS5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgIF9hY2xbZW50cnldID0geyB3OiB0cnVlIH07XG4gICAgfSk7XG4gICAgcmVzdE9iamVjdENvcHkuX2FjbCA9IF9hY2w7XG4gIH1cblxuICBpZiAocmVzdE9iamVjdC5fcnBlcm0pIHtcbiAgICByZXN0T2JqZWN0Ll9ycGVybS5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgIGlmICghKGVudHJ5IGluIF9hY2wpKSB7XG4gICAgICAgIF9hY2xbZW50cnldID0geyByOiB0cnVlIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfYWNsW2VudHJ5XS5yID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXN0T2JqZWN0Q29weS5fYWNsID0gX2FjbDtcbiAgfVxuXG4gIHJldHVybiByZXN0T2JqZWN0Q29weTtcbn1cblxuXG4vLyBBIHNlbnRpbmVsIHZhbHVlIHRoYXQgaGVscGVyIHRyYW5zZm9ybWF0aW9ucyByZXR1cm4gd2hlbiB0aGV5XG4vLyBjYW5ub3QgcGVyZm9ybSBhIHRyYW5zZm9ybWF0aW9uXG5mdW5jdGlvbiBDYW5ub3RUcmFuc2Zvcm0oKSB7fVxuXG5jb25zdCB0cmFuc2Zvcm1JbnRlcmlvckF0b20gPSAoYXRvbSkgPT4ge1xuICAvLyBUT0RPOiBjaGVjayB2YWxpZGl0eSBoYXJkZXIgZm9yIHRoZSBfX3R5cGUtZGVmaW5lZCB0eXBlc1xuICBpZiAodHlwZW9mIGF0b20gPT09ICdvYmplY3QnICYmIGF0b20gJiYgIShhdG9tIGluc3RhbmNlb2YgRGF0ZSkgJiYgYXRvbS5fX3R5cGUgPT09ICdQb2ludGVyJykge1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdQb2ludGVyJyxcbiAgICAgIGNsYXNzTmFtZTogYXRvbS5jbGFzc05hbWUsXG4gICAgICBvYmplY3RJZDogYXRvbS5vYmplY3RJZFxuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZW9mIGF0b20gPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGF0b20gPT09ICdzeW1ib2wnKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgYGNhbm5vdCB0cmFuc2Zvcm0gdmFsdWU6ICR7YXRvbX1gKTtcbiAgfSBlbHNlIGlmIChEYXRlQ29kZXIuaXNWYWxpZEpTT04oYXRvbSkpIHtcbiAgICByZXR1cm4gRGF0ZUNvZGVyLkpTT05Ub0RhdGFiYXNlKGF0b20pO1xuICB9IGVsc2UgaWYgKEJ5dGVzQ29kZXIuaXNWYWxpZEpTT04oYXRvbSkpIHtcbiAgICByZXR1cm4gQnl0ZXNDb2Rlci5KU09OVG9EYXRhYmFzZShhdG9tKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgYXRvbSA9PT0gJ29iamVjdCcgJiYgYXRvbSAmJiBhdG9tLiRyZWdleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYXRvbS4kcmVnZXgpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhdG9tO1xuICB9XG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gYW4gYXRvbSBmcm9tIFJFU1QgZm9ybWF0IHRvIE1vbmdvIGZvcm1hdC5cbi8vIEFuIGF0b20gaXMgYW55dGhpbmcgdGhhdCBjYW4ndCBjb250YWluIG90aGVyIGV4cHJlc3Npb25zLiBTbyBpdFxuLy8gaW5jbHVkZXMgdGhpbmdzIHdoZXJlIG9iamVjdHMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IG90aGVyXG4vLyBkYXRhdHlwZXMsIGxpa2UgcG9pbnRlcnMgYW5kIGRhdGVzLCBidXQgaXQgZG9lcyBub3QgaW5jbHVkZSBvYmplY3RzXG4vLyBvciBhcnJheXMgd2l0aCBnZW5lcmljIHN0dWZmIGluc2lkZS5cbi8vIFJhaXNlcyBhbiBlcnJvciBpZiB0aGlzIGNhbm5vdCBwb3NzaWJseSBiZSB2YWxpZCBSRVNUIGZvcm1hdC5cbi8vIFJldHVybnMgQ2Fubm90VHJhbnNmb3JtIGlmIGl0J3MganVzdCBub3QgYW4gYXRvbVxuZnVuY3Rpb24gdHJhbnNmb3JtVG9wTGV2ZWxBdG9tKGF0b20sIGZpZWxkKSB7XG4gIHN3aXRjaCh0eXBlb2YgYXRvbSkge1xuICBjYXNlICdudW1iZXInOlxuICBjYXNlICdib29sZWFuJzpcbiAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICByZXR1cm4gYXRvbTtcbiAgY2FzZSAnc3RyaW5nJzpcbiAgICBpZiAoZmllbGQgJiYgZmllbGQudHlwZSA9PT0gJ1BvaW50ZXInKSB7XG4gICAgICByZXR1cm4gYCR7ZmllbGQudGFyZ2V0Q2xhc3N9JCR7YXRvbX1gO1xuICAgIH1cbiAgICByZXR1cm4gYXRvbTtcbiAgY2FzZSAnc3ltYm9sJzpcbiAgY2FzZSAnZnVuY3Rpb24nOlxuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sIGBjYW5ub3QgdHJhbnNmb3JtIHZhbHVlOiAke2F0b219YCk7XG4gIGNhc2UgJ29iamVjdCc6XG4gICAgaWYgKGF0b20gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAvLyBUZWNobmljYWxseSBkYXRlcyBhcmUgbm90IHJlc3QgZm9ybWF0LCBidXQsIGl0IHNlZW1zIHByZXR0eVxuICAgICAgLy8gY2xlYXIgd2hhdCB0aGV5IHNob3VsZCBiZSB0cmFuc2Zvcm1lZCB0bywgc28gbGV0J3MganVzdCBkbyBpdC5cbiAgICAgIHJldHVybiBhdG9tO1xuICAgIH1cblxuICAgIGlmIChhdG9tID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gYXRvbTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBjaGVjayB2YWxpZGl0eSBoYXJkZXIgZm9yIHRoZSBfX3R5cGUtZGVmaW5lZCB0eXBlc1xuICAgIGlmIChhdG9tLl9fdHlwZSA9PSAnUG9pbnRlcicpIHtcbiAgICAgIHJldHVybiBgJHthdG9tLmNsYXNzTmFtZX0kJHthdG9tLm9iamVjdElkfWA7XG4gICAgfVxuICAgIGlmIChEYXRlQ29kZXIuaXNWYWxpZEpTT04oYXRvbSkpIHtcbiAgICAgIHJldHVybiBEYXRlQ29kZXIuSlNPTlRvRGF0YWJhc2UoYXRvbSk7XG4gICAgfVxuICAgIGlmIChCeXRlc0NvZGVyLmlzVmFsaWRKU09OKGF0b20pKSB7XG4gICAgICByZXR1cm4gQnl0ZXNDb2Rlci5KU09OVG9EYXRhYmFzZShhdG9tKTtcbiAgICB9XG4gICAgaWYgKEdlb1BvaW50Q29kZXIuaXNWYWxpZEpTT04oYXRvbSkpIHtcbiAgICAgIHJldHVybiBHZW9Qb2ludENvZGVyLkpTT05Ub0RhdGFiYXNlKGF0b20pO1xuICAgIH1cbiAgICBpZiAoUG9seWdvbkNvZGVyLmlzVmFsaWRKU09OKGF0b20pKSB7XG4gICAgICByZXR1cm4gUG9seWdvbkNvZGVyLkpTT05Ub0RhdGFiYXNlKGF0b20pO1xuICAgIH1cbiAgICBpZiAoRmlsZUNvZGVyLmlzVmFsaWRKU09OKGF0b20pKSB7XG4gICAgICByZXR1cm4gRmlsZUNvZGVyLkpTT05Ub0RhdGFiYXNlKGF0b20pO1xuICAgIH1cbiAgICByZXR1cm4gQ2Fubm90VHJhbnNmb3JtO1xuXG4gIGRlZmF1bHQ6XG4gICAgLy8gSSBkb24ndCB0aGluayB0eXBlb2YgY2FuIGV2ZXIgbGV0IHVzIGdldCBoZXJlXG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVEVSTkFMX1NFUlZFUl9FUlJPUiwgYHJlYWxseSBkaWQgbm90IGV4cGVjdCB2YWx1ZTogJHthdG9tfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbGF0aXZlVGltZVRvRGF0ZSh0ZXh0LCBub3cgPSBuZXcgRGF0ZSgpKSB7XG4gIHRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG5cbiAgbGV0IHBhcnRzID0gdGV4dC5zcGxpdCgnICcpO1xuXG4gIC8vIEZpbHRlciBvdXQgd2hpdGVzcGFjZVxuICBwYXJ0cyA9IHBhcnRzLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gJycpO1xuXG4gIGNvbnN0IGZ1dHVyZSA9IHBhcnRzWzBdID09PSAnaW4nO1xuICBjb25zdCBwYXN0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gPT09ICdhZ28nO1xuXG4gIGlmICghZnV0dXJlICYmICFwYXN0ICYmIHRleHQgIT09ICdub3cnKSB7XG4gICAgcmV0dXJuIHsgc3RhdHVzOiAnZXJyb3InLCBpbmZvOiBcIlRpbWUgc2hvdWxkIGVpdGhlciBzdGFydCB3aXRoICdpbicgb3IgZW5kIHdpdGggJ2FnbydcIiB9O1xuICB9XG5cbiAgaWYgKGZ1dHVyZSAmJiBwYXN0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgIGluZm86IFwiVGltZSBjYW5ub3QgaGF2ZSBib3RoICdpbicgYW5kICdhZ28nXCIsXG4gICAgfTtcbiAgfVxuXG4gIC8vIHN0cmlwIHRoZSAnYWdvJyBvciAnaW4nXG4gIGlmIChmdXR1cmUpIHtcbiAgICBwYXJ0cyA9IHBhcnRzLnNsaWNlKDEpO1xuICB9IGVsc2UgeyAvLyBwYXN0XG4gICAgcGFydHMgPSBwYXJ0cy5zbGljZSgwLCBwYXJ0cy5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIGlmIChwYXJ0cy5sZW5ndGggJSAyICE9PSAwICYmIHRleHQgIT09ICdub3cnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgIGluZm86ICdJbnZhbGlkIHRpbWUgc3RyaW5nLiBEYW5nbGluZyB1bml0IG9yIG51bWJlci4nLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBwYWlycyA9IFtdO1xuICB3aGlsZShwYXJ0cy5sZW5ndGgpIHtcbiAgICBwYWlycy5wdXNoKFsgcGFydHMuc2hpZnQoKSwgcGFydHMuc2hpZnQoKSBdKTtcbiAgfVxuXG4gIGxldCBzZWNvbmRzID0gMDtcbiAgZm9yIChjb25zdCBbbnVtLCBpbnRlcnZhbF0gb2YgcGFpcnMpIHtcbiAgICBjb25zdCB2YWwgPSBOdW1iZXIobnVtKTtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodmFsKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICBpbmZvOiBgJyR7bnVtfScgaXMgbm90IGFuIGludGVnZXIuYCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgc3dpdGNoKGludGVydmFsKSB7XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneWVhcnMnOlxuICAgICAgc2Vjb25kcyArPSB2YWwgKiAzMTUzNjAwMDsgLy8gMzY1ICogMjQgKiA2MCAqIDYwXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3drJzpcbiAgICBjYXNlICd3a3MnOlxuICAgIGNhc2UgJ3dlZWsnOlxuICAgIGNhc2UgJ3dlZWtzJzpcbiAgICAgIHNlY29uZHMgKz0gdmFsICogNjA0ODAwOyAvLyA3ICogMjQgKiA2MCAqIDYwXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2QnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZGF5cyc6XG4gICAgICBzZWNvbmRzICs9IHZhbCAqIDg2NDAwOyAvLyAyNCAqIDYwICogNjBcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaG91cic6XG4gICAgY2FzZSAnaG91cnMnOlxuICAgICAgc2Vjb25kcyArPSB2YWwgKiAzNjAwOyAvLyA2MCAqIDYwXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgIHNlY29uZHMgKz0gdmFsICogNjA7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAnc2Vjcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICAgIHNlY29uZHMgKz0gdmFsO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICBpbmZvOiBgSW52YWxpZCBpbnRlcnZhbDogJyR7aW50ZXJ2YWx9J2AsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1pbGxpc2Vjb25kcyA9IHNlY29uZHMgKiAxMDAwO1xuICBpZiAoZnV0dXJlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgaW5mbzogJ2Z1dHVyZScsXG4gICAgICByZXN1bHQ6IG5ldyBEYXRlKG5vdy52YWx1ZU9mKCkgKyBtaWxsaXNlY29uZHMpXG4gICAgfTtcbiAgfSBlbHNlIGlmIChwYXN0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgaW5mbzogJ3Bhc3QnLFxuICAgICAgcmVzdWx0OiBuZXcgRGF0ZShub3cudmFsdWVPZigpIC0gbWlsbGlzZWNvbmRzKVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgaW5mbzogJ3ByZXNlbnQnLFxuICAgICAgcmVzdWx0OiBuZXcgRGF0ZShub3cudmFsdWVPZigpKVxuICAgIH1cbiAgfVxufVxuXG4vLyBUcmFuc2Zvcm1zIGEgcXVlcnkgY29uc3RyYWludCBmcm9tIFJFU1QgQVBJIGZvcm1hdCB0byBNb25nbyBmb3JtYXQuXG4vLyBBIGNvbnN0cmFpbnQgaXMgc29tZXRoaW5nIHdpdGggZmllbGRzIGxpa2UgJGx0LlxuLy8gSWYgaXQgaXMgbm90IGEgdmFsaWQgY29uc3RyYWludCBidXQgaXQgY291bGQgYmUgYSB2YWxpZCBzb21ldGhpbmdcbi8vIGVsc2UsIHJldHVybiBDYW5ub3RUcmFuc2Zvcm0uXG4vLyBpbkFycmF5IGlzIHdoZXRoZXIgdGhpcyBpcyBhbiBhcnJheSBmaWVsZC5cbmZ1bmN0aW9uIHRyYW5zZm9ybUNvbnN0cmFpbnQoY29uc3RyYWludCwgZmllbGQpIHtcbiAgY29uc3QgaW5BcnJheSA9IGZpZWxkICYmIGZpZWxkLnR5cGUgJiYgZmllbGQudHlwZSA9PT0gJ0FycmF5JztcbiAgaWYgKHR5cGVvZiBjb25zdHJhaW50ICE9PSAnb2JqZWN0JyB8fCAhY29uc3RyYWludCkge1xuICAgIHJldHVybiBDYW5ub3RUcmFuc2Zvcm07XG4gIH1cbiAgY29uc3QgdHJhbnNmb3JtRnVuY3Rpb24gPSBpbkFycmF5ID8gdHJhbnNmb3JtSW50ZXJpb3JBdG9tIDogdHJhbnNmb3JtVG9wTGV2ZWxBdG9tO1xuICBjb25zdCB0cmFuc2Zvcm1lciA9IChhdG9tKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdHJhbnNmb3JtRnVuY3Rpb24oYXRvbSwgZmllbGQpO1xuICAgIGlmIChyZXN1bHQgPT09IENhbm5vdFRyYW5zZm9ybSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgYGJhZCBhdG9tOiAke0pTT04uc3RyaW5naWZ5KGF0b20pfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8vIGtleXMgaXMgdGhlIGNvbnN0cmFpbnRzIGluIHJldmVyc2UgYWxwaGFiZXRpY2FsIG9yZGVyLlxuICAvLyBUaGlzIGlzIGEgaGFjayBzbyB0aGF0OlxuICAvLyAgICRyZWdleCBpcyBoYW5kbGVkIGJlZm9yZSAkb3B0aW9uc1xuICAvLyAgICRuZWFyU3BoZXJlIGlzIGhhbmRsZWQgYmVmb3JlICRtYXhEaXN0YW5jZVxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGNvbnN0cmFpbnQpLnNvcnQoKS5yZXZlcnNlKCk7XG4gIHZhciBhbnN3ZXIgPSB7fTtcbiAgZm9yICh2YXIga2V5IG9mIGtleXMpIHtcbiAgICBzd2l0Y2goa2V5KSB7XG4gICAgY2FzZSAnJGx0JzpcbiAgICBjYXNlICckbHRlJzpcbiAgICBjYXNlICckZ3QnOlxuICAgIGNhc2UgJyRndGUnOlxuICAgIGNhc2UgJyRleGlzdHMnOlxuICAgIGNhc2UgJyRuZSc6XG4gICAgY2FzZSAnJGVxJzoge1xuICAgICAgY29uc3QgdmFsID0gY29uc3RyYWludFtrZXldO1xuICAgICAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwuJHJlbGF0aXZlVGltZSkge1xuICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQudHlwZSAhPT0gJ0RhdGUnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgJyRyZWxhdGl2ZVRpbWUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIERhdGUgZmllbGQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJyRleGlzdHMnOlxuICAgICAgICBjYXNlICckbmUnOlxuICAgICAgICBjYXNlICckZXEnOlxuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sICckcmVsYXRpdmVUaW1lIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgJGx0LCAkbHRlLCAkZ3QsIGFuZCAkZ3RlIG9wZXJhdG9ycycpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyc2VyUmVzdWx0ID0gcmVsYXRpdmVUaW1lVG9EYXRlKHZhbC4kcmVsYXRpdmVUaW1lKTtcbiAgICAgICAgaWYgKHBhcnNlclJlc3VsdC5zdGF0dXMgPT09ICdzdWNjZXNzJykge1xuICAgICAgICAgIGFuc3dlcltrZXldID0gcGFyc2VyUmVzdWx0LnJlc3VsdDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZy5pbmZvKCdFcnJvciB3aGlsZSBwYXJzaW5nIHJlbGF0aXZlIGRhdGUnLCBwYXJzZXJSZXN1bHQpO1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLCBgYmFkICRyZWxhdGl2ZVRpbWUgKCR7a2V5fSkgdmFsdWUuICR7cGFyc2VyUmVzdWx0LmluZm99YCk7XG4gICAgICB9XG5cbiAgICAgIGFuc3dlcltrZXldID0gdHJhbnNmb3JtZXIodmFsKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgJyRpbic6XG4gICAgY2FzZSAnJG5pbic6IHtcbiAgICAgIGNvbnN0IGFyciA9IGNvbnN0cmFpbnRba2V5XTtcbiAgICAgIGlmICghKGFyciBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLCAnYmFkICcgKyBrZXkgKyAnIHZhbHVlJyk7XG4gICAgICB9XG4gICAgICBhbnN3ZXJba2V5XSA9IF8uZmxhdE1hcChhcnIsIHZhbHVlID0+IHtcbiAgICAgICAgcmV0dXJuICgoYXRvbSkgPT4ge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGF0b20pKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKHRyYW5zZm9ybWVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVyKGF0b20pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkodmFsdWUpO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnJGFsbCc6IHtcbiAgICAgIGNvbnN0IGFyciA9IGNvbnN0cmFpbnRba2V5XTtcbiAgICAgIGlmICghKGFyciBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgICdiYWQgJyArIGtleSArICcgdmFsdWUnKTtcbiAgICAgIH1cbiAgICAgIGFuc3dlcltrZXldID0gYXJyLm1hcCh0cmFuc2Zvcm1JbnRlcmlvckF0b20pO1xuXG4gICAgICBjb25zdCB2YWx1ZXMgPSBhbnN3ZXJba2V5XTtcbiAgICAgIGlmIChpc0FueVZhbHVlUmVnZXgodmFsdWVzKSAmJiAhaXNBbGxWYWx1ZXNSZWdleE9yTm9uZSh2YWx1ZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sICdBbGwgJGFsbCB2YWx1ZXMgbXVzdCBiZSBvZiByZWdleCB0eXBlIG9yIG5vbmU6ICdcbiAgICAgICAgICArIHZhbHVlcyk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICckcmVnZXgnOlxuICAgICAgdmFyIHMgPSBjb25zdHJhaW50W2tleV07XG4gICAgICBpZiAodHlwZW9mIHMgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sICdiYWQgcmVnZXg6ICcgKyBzKTtcbiAgICAgIH1cbiAgICAgIGFuc3dlcltrZXldID0gcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnJGNvbnRhaW5lZEJ5Jzoge1xuICAgICAgY29uc3QgYXJyID0gY29uc3RyYWludFtrZXldO1xuICAgICAgaWYgKCEoYXJyIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgYGJhZCAkY29udGFpbmVkQnk6IHNob3VsZCBiZSBhbiBhcnJheWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGFuc3dlci4kZWxlbU1hdGNoID0ge1xuICAgICAgICAkbmluOiBhcnIubWFwKHRyYW5zZm9ybWVyKVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICckb3B0aW9ucyc6XG4gICAgICBhbnN3ZXJba2V5XSA9IGNvbnN0cmFpbnRba2V5XTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnJHRleHQnOiB7XG4gICAgICBjb25zdCBzZWFyY2ggPSBjb25zdHJhaW50W2tleV0uJHNlYXJjaDtcbiAgICAgIGlmICh0eXBlb2Ygc2VhcmNoICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgIGBiYWQgJHRleHQ6ICRzZWFyY2gsIHNob3VsZCBiZSBvYmplY3RgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoIXNlYXJjaC4kdGVybSB8fCB0eXBlb2Ygc2VhcmNoLiR0ZXJtICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgIGBiYWQgJHRleHQ6ICR0ZXJtLCBzaG91bGQgYmUgc3RyaW5nYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYW5zd2VyW2tleV0gPSB7XG4gICAgICAgICAgJyRzZWFyY2gnOiBzZWFyY2guJHRlcm1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHNlYXJjaC4kbGFuZ3VhZ2UgJiYgdHlwZW9mIHNlYXJjaC4kbGFuZ3VhZ2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgYGJhZCAkdGV4dDogJGxhbmd1YWdlLCBzaG91bGQgYmUgc3RyaW5nYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChzZWFyY2guJGxhbmd1YWdlKSB7XG4gICAgICAgIGFuc3dlcltrZXldLiRsYW5ndWFnZSA9IHNlYXJjaC4kbGFuZ3VhZ2U7XG4gICAgICB9XG4gICAgICBpZiAoc2VhcmNoLiRjYXNlU2Vuc2l0aXZlICYmIHR5cGVvZiBzZWFyY2guJGNhc2VTZW5zaXRpdmUgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgIGBiYWQgJHRleHQ6ICRjYXNlU2Vuc2l0aXZlLCBzaG91bGQgYmUgYm9vbGVhbmBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VhcmNoLiRjYXNlU2Vuc2l0aXZlKSB7XG4gICAgICAgIGFuc3dlcltrZXldLiRjYXNlU2Vuc2l0aXZlID0gc2VhcmNoLiRjYXNlU2Vuc2l0aXZlO1xuICAgICAgfVxuICAgICAgaWYgKHNlYXJjaC4kZGlhY3JpdGljU2Vuc2l0aXZlICYmIHR5cGVvZiBzZWFyY2guJGRpYWNyaXRpY1NlbnNpdGl2ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgYGJhZCAkdGV4dDogJGRpYWNyaXRpY1NlbnNpdGl2ZSwgc2hvdWxkIGJlIGJvb2xlYW5gXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHNlYXJjaC4kZGlhY3JpdGljU2Vuc2l0aXZlKSB7XG4gICAgICAgIGFuc3dlcltrZXldLiRkaWFjcml0aWNTZW5zaXRpdmUgPSBzZWFyY2guJGRpYWNyaXRpY1NlbnNpdGl2ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICckbmVhclNwaGVyZSc6XG4gICAgICB2YXIgcG9pbnQgPSBjb25zdHJhaW50W2tleV07XG4gICAgICBhbnN3ZXJba2V5XSA9IFtwb2ludC5sb25naXR1ZGUsIHBvaW50LmxhdGl0dWRlXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnJG1heERpc3RhbmNlJzpcbiAgICAgIGFuc3dlcltrZXldID0gY29uc3RyYWludFtrZXldO1xuICAgICAgYnJlYWs7XG5cbiAgICAvLyBUaGUgU0RLcyBkb24ndCBzZWVtIHRvIHVzZSB0aGVzZSBidXQgdGhleSBhcmUgZG9jdW1lbnRlZCBpbiB0aGVcbiAgICAvLyBSRVNUIEFQSSBkb2NzLlxuICAgIGNhc2UgJyRtYXhEaXN0YW5jZUluUmFkaWFucyc6XG4gICAgICBhbnN3ZXJbJyRtYXhEaXN0YW5jZSddID0gY29uc3RyYWludFtrZXldO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnJG1heERpc3RhbmNlSW5NaWxlcyc6XG4gICAgICBhbnN3ZXJbJyRtYXhEaXN0YW5jZSddID0gY29uc3RyYWludFtrZXldIC8gMzk1OTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJyRtYXhEaXN0YW5jZUluS2lsb21ldGVycyc6XG4gICAgICBhbnN3ZXJbJyRtYXhEaXN0YW5jZSddID0gY29uc3RyYWludFtrZXldIC8gNjM3MTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnJHNlbGVjdCc6XG4gICAgY2FzZSAnJGRvbnRTZWxlY3QnOlxuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5DT01NQU5EX1VOQVZBSUxBQkxFLFxuICAgICAgICAndGhlICcgKyBrZXkgKyAnIGNvbnN0cmFpbnQgaXMgbm90IHN1cHBvcnRlZCB5ZXQnKTtcblxuICAgIGNhc2UgJyR3aXRoaW4nOlxuICAgICAgdmFyIGJveCA9IGNvbnN0cmFpbnRba2V5XVsnJGJveCddO1xuICAgICAgaWYgKCFib3ggfHwgYm94Lmxlbmd0aCAhPSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgJ21hbGZvcm1hdHRlZCAkd2l0aGluIGFyZycpO1xuICAgICAgfVxuICAgICAgYW5zd2VyW2tleV0gPSB7XG4gICAgICAgICckYm94JzogW1xuICAgICAgICAgIFtib3hbMF0ubG9uZ2l0dWRlLCBib3hbMF0ubGF0aXR1ZGVdLFxuICAgICAgICAgIFtib3hbMV0ubG9uZ2l0dWRlLCBib3hbMV0ubGF0aXR1ZGVdXG4gICAgICAgIF1cbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJyRnZW9XaXRoaW4nOiB7XG4gICAgICBjb25zdCBwb2x5Z29uID0gY29uc3RyYWludFtrZXldWyckcG9seWdvbiddO1xuICAgICAgY29uc3QgY2VudGVyU3BoZXJlID0gY29uc3RyYWludFtrZXldWyckY2VudGVyU3BoZXJlJ107XG4gICAgICBpZiAocG9seWdvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBwb2ludHM7XG4gICAgICAgIGlmICh0eXBlb2YgcG9seWdvbiA9PT0gJ29iamVjdCcgJiYgcG9seWdvbi5fX3R5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgIGlmICghcG9seWdvbi5jb29yZGluYXRlcyB8fCBwb2x5Z29uLmNvb3JkaW5hdGVzLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgICAgICAnYmFkICRnZW9XaXRoaW4gdmFsdWU7IFBvbHlnb24uY29vcmRpbmF0ZXMgc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3QgMyBsb24vbGF0IHBhaXJzJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9pbnRzID0gcG9seWdvbi5jb29yZGluYXRlcztcbiAgICAgICAgfSBlbHNlIGlmIChwb2x5Z29uIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBpZiAocG9seWdvbi5sZW5ndGggPCAzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAgIFBhcnNlLkVycm9yLklOVkFMSURfSlNPTixcbiAgICAgICAgICAgICAgJ2JhZCAkZ2VvV2l0aGluIHZhbHVlOyAkcG9seWdvbiBzaG91bGQgY29udGFpbiBhdCBsZWFzdCAzIEdlb1BvaW50cydcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBvaW50cyA9IHBvbHlnb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgICAgJ2JhZCAkZ2VvV2l0aGluIHZhbHVlOyAkcG9seWdvbiBzaG91bGQgYmUgUG9seWdvbiBvYmplY3Qgb3IgQXJyYXkgb2YgUGFyc2UuR2VvUG9pbnRcXCdzJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcG9pbnRzID0gcG9pbnRzLm1hcCgocG9pbnQpID0+IHtcbiAgICAgICAgICBpZiAocG9pbnQgaW5zdGFuY2VvZiBBcnJheSAmJiBwb2ludC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIFBhcnNlLkdlb1BvaW50Ll92YWxpZGF0ZShwb2ludFsxXSwgcG9pbnRbMF0pO1xuICAgICAgICAgICAgcmV0dXJuIHBvaW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIUdlb1BvaW50Q29kZXIuaXNWYWxpZEpTT04ocG9pbnQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLCAnYmFkICRnZW9XaXRoaW4gdmFsdWUnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgUGFyc2UuR2VvUG9pbnQuX3ZhbGlkYXRlKHBvaW50LmxhdGl0dWRlLCBwb2ludC5sb25naXR1ZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gW3BvaW50LmxvbmdpdHVkZSwgcG9pbnQubGF0aXR1ZGVdO1xuICAgICAgICB9KTtcbiAgICAgICAgYW5zd2VyW2tleV0gPSB7XG4gICAgICAgICAgJyRwb2x5Z29uJzogcG9pbnRzXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGNlbnRlclNwaGVyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghKGNlbnRlclNwaGVyZSBpbnN0YW5jZW9mIEFycmF5KSB8fCBjZW50ZXJTcGhlcmUubGVuZ3RoIDwgMikge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sICdiYWQgJGdlb1dpdGhpbiB2YWx1ZTsgJGNlbnRlclNwaGVyZSBzaG91bGQgYmUgYW4gYXJyYXkgb2YgUGFyc2UuR2VvUG9pbnQgYW5kIGRpc3RhbmNlJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gR2V0IHBvaW50LCBjb252ZXJ0IHRvIGdlbyBwb2ludCBpZiBuZWNlc3NhcnkgYW5kIHZhbGlkYXRlXG4gICAgICAgIGxldCBwb2ludCA9IGNlbnRlclNwaGVyZVswXTtcbiAgICAgICAgaWYgKHBvaW50IGluc3RhbmNlb2YgQXJyYXkgJiYgcG9pbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgcG9pbnQgPSBuZXcgUGFyc2UuR2VvUG9pbnQocG9pbnRbMV0sIHBvaW50WzBdKTtcbiAgICAgICAgfSBlbHNlIGlmICghR2VvUG9pbnRDb2Rlci5pc1ZhbGlkSlNPTihwb2ludCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLCAnYmFkICRnZW9XaXRoaW4gdmFsdWU7ICRjZW50ZXJTcGhlcmUgZ2VvIHBvaW50IGludmFsaWQnKTtcbiAgICAgICAgfVxuICAgICAgICBQYXJzZS5HZW9Qb2ludC5fdmFsaWRhdGUocG9pbnQubGF0aXR1ZGUsIHBvaW50LmxvbmdpdHVkZSk7XG4gICAgICAgIC8vIEdldCBkaXN0YW5jZSBhbmQgdmFsaWRhdGVcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBjZW50ZXJTcGhlcmVbMV07XG4gICAgICAgIGlmKGlzTmFOKGRpc3RhbmNlKSB8fCBkaXN0YW5jZSA8IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLCAnYmFkICRnZW9XaXRoaW4gdmFsdWU7ICRjZW50ZXJTcGhlcmUgZGlzdGFuY2UgaW52YWxpZCcpO1xuICAgICAgICB9XG4gICAgICAgIGFuc3dlcltrZXldID0ge1xuICAgICAgICAgICckY2VudGVyU3BoZXJlJzogW1xuICAgICAgICAgICAgW3BvaW50LmxvbmdpdHVkZSwgcG9pbnQubGF0aXR1ZGVdLFxuICAgICAgICAgICAgZGlzdGFuY2VcbiAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnJGdlb0ludGVyc2VjdHMnOiB7XG4gICAgICBjb25zdCBwb2ludCA9IGNvbnN0cmFpbnRba2V5XVsnJHBvaW50J107XG4gICAgICBpZiAoIUdlb1BvaW50Q29kZXIuaXNWYWxpZEpTT04ocG9pbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgJ2JhZCAkZ2VvSW50ZXJzZWN0IHZhbHVlOyAkcG9pbnQgc2hvdWxkIGJlIEdlb1BvaW50J1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgUGFyc2UuR2VvUG9pbnQuX3ZhbGlkYXRlKHBvaW50LmxhdGl0dWRlLCBwb2ludC5sb25naXR1ZGUpO1xuICAgICAgfVxuICAgICAgYW5zd2VyW2tleV0gPSB7XG4gICAgICAgICRnZW9tZXRyeToge1xuICAgICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgICAgY29vcmRpbmF0ZXM6IFtwb2ludC5sb25naXR1ZGUsIHBvaW50LmxhdGl0dWRlXVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAoa2V5Lm1hdGNoKC9eXFwkKy8pKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgJ2JhZCBjb25zdHJhaW50OiAnICsga2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBDYW5ub3RUcmFuc2Zvcm07XG4gICAgfVxuICB9XG4gIHJldHVybiBhbnN3ZXI7XG59XG5cbi8vIFRyYW5zZm9ybXMgYW4gdXBkYXRlIG9wZXJhdG9yIGZyb20gUkVTVCBmb3JtYXQgdG8gbW9uZ28gZm9ybWF0LlxuLy8gVG8gYmUgdHJhbnNmb3JtZWQsIHRoZSBpbnB1dCBzaG91bGQgaGF2ZSBhbiBfX29wIGZpZWxkLlxuLy8gSWYgZmxhdHRlbiBpcyB0cnVlLCB0aGlzIHdpbGwgZmxhdHRlbiBvcGVyYXRvcnMgdG8gdGhlaXIgc3RhdGljXG4vLyBkYXRhIGZvcm1hdC4gRm9yIGV4YW1wbGUsIGFuIGluY3JlbWVudCBvZiAyIHdvdWxkIHNpbXBseSBiZWNvbWUgYVxuLy8gMi5cbi8vIFRoZSBvdXRwdXQgZm9yIGEgbm9uLWZsYXR0ZW5lZCBvcGVyYXRvciBpcyBhIGhhc2ggd2l0aCBfX29wIGJlaW5nXG4vLyB0aGUgbW9uZ28gb3AsIGFuZCBhcmcgYmVpbmcgdGhlIGFyZ3VtZW50LlxuLy8gVGhlIG91dHB1dCBmb3IgYSBmbGF0dGVuZWQgb3BlcmF0b3IgaXMganVzdCBhIHZhbHVlLlxuLy8gUmV0dXJucyB1bmRlZmluZWQgaWYgdGhpcyBzaG91bGQgYmUgYSBuby1vcC5cblxuZnVuY3Rpb24gdHJhbnNmb3JtVXBkYXRlT3BlcmF0b3Ioe1xuICBfX29wLFxuICBhbW91bnQsXG4gIG9iamVjdHMsXG59LCBmbGF0dGVuKSB7XG4gIHN3aXRjaChfX29wKSB7XG4gIGNhc2UgJ0RlbGV0ZSc6XG4gICAgaWYgKGZsYXR0ZW4pIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7X19vcDogJyR1bnNldCcsIGFyZzogJyd9O1xuICAgIH1cblxuICBjYXNlICdJbmNyZW1lbnQnOlxuICAgIGlmICh0eXBlb2YgYW1vdW50ICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgJ2luY3JlbWVudGluZyBtdXN0IHByb3ZpZGUgYSBudW1iZXInKTtcbiAgICB9XG4gICAgaWYgKGZsYXR0ZW4pIHtcbiAgICAgIHJldHVybiBhbW91bnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7X19vcDogJyRpbmMnLCBhcmc6IGFtb3VudH07XG4gICAgfVxuXG4gIGNhc2UgJ0FkZCc6XG4gIGNhc2UgJ0FkZFVuaXF1ZSc6XG4gICAgaWYgKCEob2JqZWN0cyBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgJ29iamVjdHMgdG8gYWRkIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgdmFyIHRvQWRkID0gb2JqZWN0cy5tYXAodHJhbnNmb3JtSW50ZXJpb3JBdG9tKTtcbiAgICBpZiAoZmxhdHRlbikge1xuICAgICAgcmV0dXJuIHRvQWRkO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbW9uZ29PcCA9IHtcbiAgICAgICAgQWRkOiAnJHB1c2gnLFxuICAgICAgICBBZGRVbmlxdWU6ICckYWRkVG9TZXQnXG4gICAgICB9W19fb3BdO1xuICAgICAgcmV0dXJuIHtfX29wOiBtb25nb09wLCBhcmc6IHsnJGVhY2gnOiB0b0FkZH19O1xuICAgIH1cblxuICBjYXNlICdSZW1vdmUnOlxuICAgIGlmICghKG9iamVjdHMgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sICdvYmplY3RzIHRvIHJlbW92ZSBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIHZhciB0b1JlbW92ZSA9IG9iamVjdHMubWFwKHRyYW5zZm9ybUludGVyaW9yQXRvbSk7XG4gICAgaWYgKGZsYXR0ZW4pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtfX29wOiAnJHB1bGxBbGwnLCBhcmc6IHRvUmVtb3ZlfTtcbiAgICB9XG5cbiAgZGVmYXVsdDpcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuQ09NTUFORF9VTkFWQUlMQUJMRSwgYFRoZSAke19fb3B9IG9wZXJhdG9yIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LmApO1xuICB9XG59XG5mdW5jdGlvbiBtYXBWYWx1ZXMob2JqZWN0LCBpdGVyYXRvcikge1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgT2JqZWN0LmtleXMob2JqZWN0KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICByZXN1bHRba2V5XSA9IGl0ZXJhdG9yKG9iamVjdFtrZXldKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IG5lc3RlZE1vbmdvT2JqZWN0VG9OZXN0ZWRQYXJzZU9iamVjdCA9IG1vbmdvT2JqZWN0ID0+IHtcbiAgc3dpdGNoKHR5cGVvZiBtb25nb09iamVjdCkge1xuICBjYXNlICdzdHJpbmcnOlxuICBjYXNlICdudW1iZXInOlxuICBjYXNlICdib29sZWFuJzpcbiAgICByZXR1cm4gbW9uZ29PYmplY3Q7XG4gIGNhc2UgJ3VuZGVmaW5lZCc6XG4gIGNhc2UgJ3N5bWJvbCc6XG4gIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICB0aHJvdyAnYmFkIHZhbHVlIGluIG1vbmdvT2JqZWN0VG9QYXJzZU9iamVjdCc7XG4gIGNhc2UgJ29iamVjdCc6XG4gICAgaWYgKG1vbmdvT2JqZWN0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKG1vbmdvT2JqZWN0IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHJldHVybiBtb25nb09iamVjdC5tYXAobmVzdGVkTW9uZ29PYmplY3RUb05lc3RlZFBhcnNlT2JqZWN0KTtcbiAgICB9XG5cbiAgICBpZiAobW9uZ29PYmplY3QgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gUGFyc2UuX2VuY29kZShtb25nb09iamVjdCk7XG4gICAgfVxuXG4gICAgaWYgKG1vbmdvT2JqZWN0IGluc3RhbmNlb2YgbW9uZ29kYi5Mb25nKSB7XG4gICAgICByZXR1cm4gbW9uZ29PYmplY3QudG9OdW1iZXIoKTtcbiAgICB9XG5cbiAgICBpZiAobW9uZ29PYmplY3QgaW5zdGFuY2VvZiBtb25nb2RiLkRvdWJsZSkge1xuICAgICAgcmV0dXJuIG1vbmdvT2JqZWN0LnZhbHVlO1xuICAgIH1cblxuICAgIGlmIChCeXRlc0NvZGVyLmlzVmFsaWREYXRhYmFzZU9iamVjdChtb25nb09iamVjdCkpIHtcbiAgICAgIHJldHVybiBCeXRlc0NvZGVyLmRhdGFiYXNlVG9KU09OKG1vbmdvT2JqZWN0KTtcbiAgICB9XG5cbiAgICBpZiAobW9uZ29PYmplY3QuaGFzT3duUHJvcGVydHkoJ19fdHlwZScpICYmIG1vbmdvT2JqZWN0Ll9fdHlwZSA9PSAnRGF0ZScgJiYgbW9uZ29PYmplY3QuaXNvIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgbW9uZ29PYmplY3QuaXNvID0gbW9uZ29PYmplY3QuaXNvLnRvSlNPTigpO1xuICAgICAgcmV0dXJuIG1vbmdvT2JqZWN0O1xuICAgIH1cblxuICAgIHJldHVybiBtYXBWYWx1ZXMobW9uZ29PYmplY3QsIG5lc3RlZE1vbmdvT2JqZWN0VG9OZXN0ZWRQYXJzZU9iamVjdCk7XG4gIGRlZmF1bHQ6XG4gICAgdGhyb3cgJ3Vua25vd24ganMgdHlwZSc7XG4gIH1cbn1cblxuY29uc3QgdHJhbnNmb3JtUG9pbnRlclN0cmluZyA9IChzY2hlbWEsIGZpZWxkLCBwb2ludGVyU3RyaW5nKSA9PiB7XG4gIGNvbnN0IG9iakRhdGEgPSBwb2ludGVyU3RyaW5nLnNwbGl0KCckJyk7XG4gIGlmIChvYmpEYXRhWzBdICE9PSBzY2hlbWEuZmllbGRzW2ZpZWxkXS50YXJnZXRDbGFzcykge1xuICAgIHRocm93ICdwb2ludGVyIHRvIGluY29ycmVjdCBjbGFzc05hbWUnO1xuICB9XG4gIHJldHVybiB7XG4gICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgY2xhc3NOYW1lOiBvYmpEYXRhWzBdLFxuICAgIG9iamVjdElkOiBvYmpEYXRhWzFdXG4gIH07XG59XG5cbi8vIENvbnZlcnRzIGZyb20gYSBtb25nby1mb3JtYXQgb2JqZWN0IHRvIGEgUkVTVC1mb3JtYXQgb2JqZWN0LlxuLy8gRG9lcyBub3Qgc3RyaXAgb3V0IGFueXRoaW5nIGJhc2VkIG9uIGEgbGFjayBvZiBhdXRoZW50aWNhdGlvbi5cbmNvbnN0IG1vbmdvT2JqZWN0VG9QYXJzZU9iamVjdCA9IChjbGFzc05hbWUsIG1vbmdvT2JqZWN0LCBzY2hlbWEpID0+IHtcbiAgc3dpdGNoKHR5cGVvZiBtb25nb09iamVjdCkge1xuICBjYXNlICdzdHJpbmcnOlxuICBjYXNlICdudW1iZXInOlxuICBjYXNlICdib29sZWFuJzpcbiAgICByZXR1cm4gbW9uZ29PYmplY3Q7XG4gIGNhc2UgJ3VuZGVmaW5lZCc6XG4gIGNhc2UgJ3N5bWJvbCc6XG4gIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICB0aHJvdyAnYmFkIHZhbHVlIGluIG1vbmdvT2JqZWN0VG9QYXJzZU9iamVjdCc7XG4gIGNhc2UgJ29iamVjdCc6IHtcbiAgICBpZiAobW9uZ29PYmplY3QgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAobW9uZ29PYmplY3QgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgcmV0dXJuIG1vbmdvT2JqZWN0Lm1hcChuZXN0ZWRNb25nb09iamVjdFRvTmVzdGVkUGFyc2VPYmplY3QpO1xuICAgIH1cblxuICAgIGlmIChtb25nb09iamVjdCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiBQYXJzZS5fZW5jb2RlKG1vbmdvT2JqZWN0KTtcbiAgICB9XG5cbiAgICBpZiAobW9uZ29PYmplY3QgaW5zdGFuY2VvZiBtb25nb2RiLkxvbmcpIHtcbiAgICAgIHJldHVybiBtb25nb09iamVjdC50b051bWJlcigpO1xuICAgIH1cblxuICAgIGlmIChtb25nb09iamVjdCBpbnN0YW5jZW9mIG1vbmdvZGIuRG91YmxlKSB7XG4gICAgICByZXR1cm4gbW9uZ29PYmplY3QudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKEJ5dGVzQ29kZXIuaXNWYWxpZERhdGFiYXNlT2JqZWN0KG1vbmdvT2JqZWN0KSkge1xuICAgICAgcmV0dXJuIEJ5dGVzQ29kZXIuZGF0YWJhc2VUb0pTT04obW9uZ29PYmplY3QpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3RPYmplY3QgPSB7fTtcbiAgICBpZiAobW9uZ29PYmplY3QuX3JwZXJtIHx8IG1vbmdvT2JqZWN0Ll93cGVybSkge1xuICAgICAgcmVzdE9iamVjdC5fcnBlcm0gPSBtb25nb09iamVjdC5fcnBlcm0gfHwgW107XG4gICAgICByZXN0T2JqZWN0Ll93cGVybSA9IG1vbmdvT2JqZWN0Ll93cGVybSB8fCBbXTtcbiAgICAgIGRlbGV0ZSBtb25nb09iamVjdC5fcnBlcm07XG4gICAgICBkZWxldGUgbW9uZ29PYmplY3QuX3dwZXJtO1xuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiBtb25nb09iamVjdCkge1xuICAgICAgc3dpdGNoKGtleSkge1xuICAgICAgY2FzZSAnX2lkJzpcbiAgICAgICAgcmVzdE9iamVjdFsnb2JqZWN0SWQnXSA9ICcnICsgbW9uZ29PYmplY3Rba2V5XTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdfaGFzaGVkX3Bhc3N3b3JkJzpcbiAgICAgICAgcmVzdE9iamVjdC5faGFzaGVkX3Bhc3N3b3JkID0gbW9uZ29PYmplY3Rba2V5XTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdfYWNsJzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdfZW1haWxfdmVyaWZ5X3Rva2VuJzpcbiAgICAgIGNhc2UgJ19wZXJpc2hhYmxlX3Rva2VuJzpcbiAgICAgIGNhc2UgJ19wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQnOlxuICAgICAgY2FzZSAnX3Bhc3N3b3JkX2NoYW5nZWRfYXQnOlxuICAgICAgY2FzZSAnX3RvbWJzdG9uZSc6XG4gICAgICBjYXNlICdfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQnOlxuICAgICAgY2FzZSAnX2FjY291bnRfbG9ja291dF9leHBpcmVzX2F0JzpcbiAgICAgIGNhc2UgJ19mYWlsZWRfbG9naW5fY291bnQnOlxuICAgICAgY2FzZSAnX3Bhc3N3b3JkX2hpc3RvcnknOlxuICAgICAgICAvLyBUaG9zZSBrZXlzIHdpbGwgYmUgZGVsZXRlZCBpZiBuZWVkZWQgaW4gdGhlIERCIENvbnRyb2xsZXJcbiAgICAgICAgcmVzdE9iamVjdFtrZXldID0gbW9uZ29PYmplY3Rba2V5XTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdfc2Vzc2lvbl90b2tlbic6XG4gICAgICAgIHJlc3RPYmplY3RbJ3Nlc3Npb25Ub2tlbiddID0gbW9uZ29PYmplY3Rba2V5XTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1cGRhdGVkQXQnOlxuICAgICAgY2FzZSAnX3VwZGF0ZWRfYXQnOlxuICAgICAgICByZXN0T2JqZWN0Wyd1cGRhdGVkQXQnXSA9IFBhcnNlLl9lbmNvZGUobmV3IERhdGUobW9uZ29PYmplY3Rba2V5XSkpLmlzbztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjcmVhdGVkQXQnOlxuICAgICAgY2FzZSAnX2NyZWF0ZWRfYXQnOlxuICAgICAgICByZXN0T2JqZWN0WydjcmVhdGVkQXQnXSA9IFBhcnNlLl9lbmNvZGUobmV3IERhdGUobW9uZ29PYmplY3Rba2V5XSkpLmlzbztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdleHBpcmVzQXQnOlxuICAgICAgY2FzZSAnX2V4cGlyZXNBdCc6XG4gICAgICAgIHJlc3RPYmplY3RbJ2V4cGlyZXNBdCddID0gUGFyc2UuX2VuY29kZShuZXcgRGF0ZShtb25nb09iamVjdFtrZXldKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGFzdFVzZWQnOlxuICAgICAgY2FzZSAnX2xhc3RfdXNlZCc6XG4gICAgICAgIHJlc3RPYmplY3RbJ2xhc3RVc2VkJ10gPSBQYXJzZS5fZW5jb2RlKG5ldyBEYXRlKG1vbmdvT2JqZWN0W2tleV0pKS5pc287XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGltZXNVc2VkJzpcbiAgICAgIGNhc2UgJ3RpbWVzX3VzZWQnOlxuICAgICAgICByZXN0T2JqZWN0Wyd0aW1lc1VzZWQnXSA9IG1vbmdvT2JqZWN0W2tleV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gQ2hlY2sgb3RoZXIgYXV0aCBkYXRhIGtleXNcbiAgICAgICAgdmFyIGF1dGhEYXRhTWF0Y2ggPSBrZXkubWF0Y2goL15fYXV0aF9kYXRhXyhbYS16QS1aMC05X10rKSQvKTtcbiAgICAgICAgaWYgKGF1dGhEYXRhTWF0Y2gpIHtcbiAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBhdXRoRGF0YU1hdGNoWzFdO1xuICAgICAgICAgIHJlc3RPYmplY3RbJ2F1dGhEYXRhJ10gPSByZXN0T2JqZWN0WydhdXRoRGF0YSddIHx8IHt9O1xuICAgICAgICAgIHJlc3RPYmplY3RbJ2F1dGhEYXRhJ11bcHJvdmlkZXJdID0gbW9uZ29PYmplY3Rba2V5XTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXkuaW5kZXhPZignX3BfJykgPT0gMCkge1xuICAgICAgICAgIHZhciBuZXdLZXkgPSBrZXkuc3Vic3RyaW5nKDMpO1xuICAgICAgICAgIGlmICghc2NoZW1hLmZpZWxkc1tuZXdLZXldKSB7XG4gICAgICAgICAgICBsb2cuaW5mbygndHJhbnNmb3JtLmpzJywgJ0ZvdW5kIGEgcG9pbnRlciBjb2x1bW4gbm90IGluIHRoZSBzY2hlbWEsIGRyb3BwaW5nIGl0LicsIGNsYXNzTmFtZSwgbmV3S2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2NoZW1hLmZpZWxkc1tuZXdLZXldLnR5cGUgIT09ICdQb2ludGVyJykge1xuICAgICAgICAgICAgbG9nLmluZm8oJ3RyYW5zZm9ybS5qcycsICdGb3VuZCBhIHBvaW50ZXIgaW4gYSBub24tcG9pbnRlciBjb2x1bW4sIGRyb3BwaW5nIGl0LicsIGNsYXNzTmFtZSwga2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobW9uZ29PYmplY3Rba2V5XSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3RPYmplY3RbbmV3S2V5XSA9IHRyYW5zZm9ybVBvaW50ZXJTdHJpbmcoc2NoZW1hLCBuZXdLZXksIG1vbmdvT2JqZWN0W2tleV0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKGtleVswXSA9PSAnXycgJiYga2V5ICE9ICdfX3R5cGUnKSB7XG4gICAgICAgICAgdGhyb3cgKCdiYWQga2V5IGluIHVudHJhbnNmb3JtOiAnICsga2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBtb25nb09iamVjdFtrZXldO1xuICAgICAgICAgIGlmIChzY2hlbWEuZmllbGRzW2tleV0gJiYgc2NoZW1hLmZpZWxkc1trZXldLnR5cGUgPT09ICdGaWxlJyAmJiBGaWxlQ29kZXIuaXNWYWxpZERhdGFiYXNlT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgcmVzdE9iamVjdFtrZXldID0gRmlsZUNvZGVyLmRhdGFiYXNlVG9KU09OKHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2NoZW1hLmZpZWxkc1trZXldICYmIHNjaGVtYS5maWVsZHNba2V5XS50eXBlID09PSAnR2VvUG9pbnQnICYmIEdlb1BvaW50Q29kZXIuaXNWYWxpZERhdGFiYXNlT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgcmVzdE9iamVjdFtrZXldID0gR2VvUG9pbnRDb2Rlci5kYXRhYmFzZVRvSlNPTih2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNjaGVtYS5maWVsZHNba2V5XSAmJiBzY2hlbWEuZmllbGRzW2tleV0udHlwZSA9PT0gJ1BvbHlnb24nICYmIFBvbHlnb25Db2Rlci5pc1ZhbGlkRGF0YWJhc2VPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXN0T2JqZWN0W2tleV0gPSBQb2x5Z29uQ29kZXIuZGF0YWJhc2VUb0pTT04odmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzY2hlbWEuZmllbGRzW2tleV0gJiYgc2NoZW1hLmZpZWxkc1trZXldLnR5cGUgPT09ICdCeXRlcycgJiYgQnl0ZXNDb2Rlci5pc1ZhbGlkRGF0YWJhc2VPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXN0T2JqZWN0W2tleV0gPSBCeXRlc0NvZGVyLmRhdGFiYXNlVG9KU09OKHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXN0T2JqZWN0W2tleV0gPSBuZXN0ZWRNb25nb09iamVjdFRvTmVzdGVkUGFyc2VPYmplY3QobW9uZ29PYmplY3Rba2V5XSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRpb25GaWVsZE5hbWVzID0gT2JqZWN0LmtleXMoc2NoZW1hLmZpZWxkcykuZmlsdGVyKGZpZWxkTmFtZSA9PiBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0udHlwZSA9PT0gJ1JlbGF0aW9uJyk7XG4gICAgY29uc3QgcmVsYXRpb25GaWVsZHMgPSB7fTtcbiAgICByZWxhdGlvbkZpZWxkTmFtZXMuZm9yRWFjaChyZWxhdGlvbkZpZWxkTmFtZSA9PiB7XG4gICAgICByZWxhdGlvbkZpZWxkc1tyZWxhdGlvbkZpZWxkTmFtZV0gPSB7XG4gICAgICAgIF9fdHlwZTogJ1JlbGF0aW9uJyxcbiAgICAgICAgY2xhc3NOYW1lOiBzY2hlbWEuZmllbGRzW3JlbGF0aW9uRmllbGROYW1lXS50YXJnZXRDbGFzcyxcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7IC4uLnJlc3RPYmplY3QsIC4uLnJlbGF0aW9uRmllbGRzIH07XG4gIH1cbiAgZGVmYXVsdDpcbiAgICB0aHJvdyAndW5rbm93biBqcyB0eXBlJztcbiAgfVxufVxuXG52YXIgRGF0ZUNvZGVyID0ge1xuICBKU09OVG9EYXRhYmFzZShqc29uKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGpzb24uaXNvKTtcbiAgfSxcblxuICBpc1ZhbGlkSlNPTih2YWx1ZSkge1xuICAgIHJldHVybiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgIHZhbHVlLl9fdHlwZSA9PT0gJ0RhdGUnXG4gICAgKTtcbiAgfVxufTtcblxudmFyIEJ5dGVzQ29kZXIgPSB7XG4gIGJhc2U2NFBhdHRlcm46IG5ldyBSZWdFeHAoXCJeKD86W0EtWmEtejAtOSsvXXs0fSkqKD86W0EtWmEtejAtOSsvXXsyfT09fFtBLVphLXowLTkrL117M309KT8kXCIpLFxuICBpc0Jhc2U2NFZhbHVlKG9iamVjdCkge1xuICAgIGlmICh0eXBlb2Ygb2JqZWN0ICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iYXNlNjRQYXR0ZXJuLnRlc3Qob2JqZWN0KTtcbiAgfSxcblxuICBkYXRhYmFzZVRvSlNPTihvYmplY3QpIHtcbiAgICBsZXQgdmFsdWU7XG4gICAgaWYgKHRoaXMuaXNCYXNlNjRWYWx1ZShvYmplY3QpKSB7XG4gICAgICB2YWx1ZSA9IG9iamVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSBvYmplY3QuYnVmZmVyLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogJ0J5dGVzJyxcbiAgICAgIGJhc2U2NDogdmFsdWVcbiAgICB9O1xuICB9LFxuXG4gIGlzVmFsaWREYXRhYmFzZU9iamVjdChvYmplY3QpIHtcbiAgICByZXR1cm4gKG9iamVjdCBpbnN0YW5jZW9mIG1vbmdvZGIuQmluYXJ5KSB8fCB0aGlzLmlzQmFzZTY0VmFsdWUob2JqZWN0KTtcbiAgfSxcblxuICBKU09OVG9EYXRhYmFzZShqc29uKSB7XG4gICAgcmV0dXJuIG5ldyBtb25nb2RiLkJpbmFyeShuZXcgQnVmZmVyKGpzb24uYmFzZTY0LCAnYmFzZTY0JykpO1xuICB9LFxuXG4gIGlzVmFsaWRKU09OKHZhbHVlKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgdmFsdWUuX190eXBlID09PSAnQnl0ZXMnXG4gICAgKTtcbiAgfVxufTtcblxudmFyIEdlb1BvaW50Q29kZXIgPSB7XG4gIGRhdGFiYXNlVG9KU09OKG9iamVjdCkge1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdHZW9Qb2ludCcsXG4gICAgICBsYXRpdHVkZTogb2JqZWN0WzFdLFxuICAgICAgbG9uZ2l0dWRlOiBvYmplY3RbMF1cbiAgICB9XG4gIH0sXG5cbiAgaXNWYWxpZERhdGFiYXNlT2JqZWN0KG9iamVjdCkge1xuICAgIHJldHVybiAob2JqZWN0IGluc3RhbmNlb2YgQXJyYXkgJiZcbiAgICAgIG9iamVjdC5sZW5ndGggPT0gMlxuICAgICk7XG4gIH0sXG5cbiAgSlNPTlRvRGF0YWJhc2UoanNvbikge1xuICAgIHJldHVybiBbIGpzb24ubG9uZ2l0dWRlLCBqc29uLmxhdGl0dWRlIF07XG4gIH0sXG5cbiAgaXNWYWxpZEpTT04odmFsdWUpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICB2YWx1ZS5fX3R5cGUgPT09ICdHZW9Qb2ludCdcbiAgICApO1xuICB9XG59O1xuXG52YXIgUG9seWdvbkNvZGVyID0ge1xuICBkYXRhYmFzZVRvSlNPTihvYmplY3QpIHtcbiAgICAvLyBDb252ZXJ0IGxuZy9sYXQgLT4gbGF0L2xuZ1xuICAgIGNvbnN0IGNvb3JkcyA9IG9iamVjdC5jb29yZGluYXRlc1swXS5tYXAoKGNvb3JkKSA9PiB7XG4gICAgICByZXR1cm4gW2Nvb3JkWzFdLCBjb29yZFswXV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogJ1BvbHlnb24nLFxuICAgICAgY29vcmRpbmF0ZXM6IGNvb3Jkc1xuICAgIH1cbiAgfSxcblxuICBpc1ZhbGlkRGF0YWJhc2VPYmplY3Qob2JqZWN0KSB7XG4gICAgY29uc3QgY29vcmRzID0gb2JqZWN0LmNvb3JkaW5hdGVzWzBdO1xuICAgIGlmIChvYmplY3QudHlwZSAhPT0gJ1BvbHlnb24nIHx8ICEoY29vcmRzIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwb2ludCA9IGNvb3Jkc1tpXTtcbiAgICAgIGlmICghR2VvUG9pbnRDb2Rlci5pc1ZhbGlkRGF0YWJhc2VPYmplY3QocG9pbnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFBhcnNlLkdlb1BvaW50Ll92YWxpZGF0ZShwYXJzZUZsb2F0KHBvaW50WzFdKSwgcGFyc2VGbG9hdChwb2ludFswXSkpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcblxuICBKU09OVG9EYXRhYmFzZShqc29uKSB7XG4gICAgbGV0IGNvb3JkcyA9IGpzb24uY29vcmRpbmF0ZXM7XG4gICAgLy8gQWRkIGZpcnN0IHBvaW50IHRvIHRoZSBlbmQgdG8gY2xvc2UgcG9seWdvblxuICAgIGlmIChjb29yZHNbMF1bMF0gIT09IGNvb3Jkc1tjb29yZHMubGVuZ3RoIC0gMV1bMF0gfHxcbiAgICAgICAgY29vcmRzWzBdWzFdICE9PSBjb29yZHNbY29vcmRzLmxlbmd0aCAtIDFdWzFdKSB7XG4gICAgICBjb29yZHMucHVzaChjb29yZHNbMF0pO1xuICAgIH1cbiAgICBjb25zdCB1bmlxdWUgPSBjb29yZHMuZmlsdGVyKChpdGVtLCBpbmRleCwgYXIpID0+IHtcbiAgICAgIGxldCBmb3VuZEluZGV4ID0gLTE7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IHB0ID0gYXJbaV07XG4gICAgICAgIGlmIChwdFswXSA9PT0gaXRlbVswXSAmJlxuICAgICAgICAgICAgcHRbMV0gPT09IGl0ZW1bMV0pIHtcbiAgICAgICAgICBmb3VuZEluZGV4ID0gaTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZvdW5kSW5kZXggPT09IGluZGV4O1xuICAgIH0pO1xuICAgIGlmICh1bmlxdWUubGVuZ3RoIDwgMykge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5JTlRFUk5BTF9TRVJWRVJfRVJST1IsXG4gICAgICAgICdHZW9KU09OOiBMb29wIG11c3QgaGF2ZSBhdCBsZWFzdCAzIGRpZmZlcmVudCB2ZXJ0aWNlcydcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIENvbnZlcnQgbGF0L2xvbmcgLT4gbG9uZy9sYXRcbiAgICBjb29yZHMgPSBjb29yZHMubWFwKChjb29yZCkgPT4ge1xuICAgICAgcmV0dXJuIFtjb29yZFsxXSwgY29vcmRbMF1dO1xuICAgIH0pO1xuICAgIHJldHVybiB7IHR5cGU6ICdQb2x5Z29uJywgY29vcmRpbmF0ZXM6IFtjb29yZHNdIH07XG4gIH0sXG5cbiAgaXNWYWxpZEpTT04odmFsdWUpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICB2YWx1ZS5fX3R5cGUgPT09ICdQb2x5Z29uJ1xuICAgICk7XG4gIH1cbn07XG5cbnZhciBGaWxlQ29kZXIgPSB7XG4gIGRhdGFiYXNlVG9KU09OKG9iamVjdCkge1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdGaWxlJyxcbiAgICAgIG5hbWU6IG9iamVjdFxuICAgIH1cbiAgfSxcblxuICBpc1ZhbGlkRGF0YWJhc2VPYmplY3Qob2JqZWN0KSB7XG4gICAgcmV0dXJuICh0eXBlb2Ygb2JqZWN0ID09PSAnc3RyaW5nJyk7XG4gIH0sXG5cbiAgSlNPTlRvRGF0YWJhc2UoanNvbikge1xuICAgIHJldHVybiBqc29uLm5hbWU7XG4gIH0sXG5cbiAgaXNWYWxpZEpTT04odmFsdWUpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICB2YWx1ZS5fX3R5cGUgPT09ICdGaWxlJ1xuICAgICk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB0cmFuc2Zvcm1LZXksXG4gIHBhcnNlT2JqZWN0VG9Nb25nb09iamVjdEZvckNyZWF0ZSxcbiAgdHJhbnNmb3JtVXBkYXRlLFxuICB0cmFuc2Zvcm1XaGVyZSxcbiAgbW9uZ29PYmplY3RUb1BhcnNlT2JqZWN0LFxuICByZWxhdGl2ZVRpbWVUb0RhdGUsXG4gIHRyYW5zZm9ybUNvbnN0cmFpbnQsXG4gIHRyYW5zZm9ybVBvaW50ZXJTdHJpbmcsXG59O1xuIl19
1397
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbG9kYXNoIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwibW9uZ29kYiIsIlBhcnNlIiwiVXRpbHMiLCJ0cmFuc2Zvcm1LZXkiLCJjbGFzc05hbWUiLCJmaWVsZE5hbWUiLCJzY2hlbWEiLCJmaWVsZHMiLCJfX3R5cGUiLCJ0eXBlIiwidHJhbnNmb3JtS2V5VmFsdWVGb3JVcGRhdGUiLCJyZXN0S2V5IiwicmVzdFZhbHVlIiwicGFyc2VGb3JtYXRTY2hlbWEiLCJrZXkiLCJ0aW1lRmllbGQiLCJpbmNsdWRlcyIsInZhbHVlIiwicGFyc2VJbnQiLCJ0cmFuc2Zvcm1Ub3BMZXZlbEF0b20iLCJDYW5ub3RUcmFuc2Zvcm0iLCJEYXRlIiwiaW5kZXhPZiIsIkFycmF5IiwibWFwIiwidHJhbnNmb3JtSW50ZXJpb3JWYWx1ZSIsInRyYW5zZm9ybVVwZGF0ZU9wZXJhdG9yIiwibWFwVmFsdWVzIiwiaXNSZWdleCIsIlJlZ0V4cCIsImlzU3RhcnRzV2l0aFJlZ2V4IiwibWF0Y2hlcyIsInRvU3RyaW5nIiwibWF0Y2giLCJpc0FsbFZhbHVlc1JlZ2V4T3JOb25lIiwidmFsdWVzIiwiaXNBcnJheSIsImxlbmd0aCIsImZpcnN0VmFsdWVzSXNSZWdleCIsImkiLCJpc0FueVZhbHVlUmVnZXgiLCJzb21lIiwiT2JqZWN0Iiwia2V5cyIsIkVycm9yIiwiSU5WQUxJRF9ORVNURURfS0VZIiwidHJhbnNmb3JtSW50ZXJpb3JBdG9tIiwidmFsdWVBc0RhdGUiLCJ0cmFuc2Zvcm1RdWVyeUtleVZhbHVlIiwiY291bnQiLCJzdWJRdWVyeSIsInRyYW5zZm9ybVdoZXJlIiwiYXV0aERhdGFNYXRjaCIsInByb3ZpZGVyIiwiZXhwZWN0ZWRUeXBlSXNBcnJheSIsImV4cGVjdGVkVHlwZUlzUG9pbnRlciIsImZpZWxkIiwidHJhbnNmb3JtZWRDb25zdHJhaW50IiwidHJhbnNmb3JtQ29uc3RyYWludCIsIiR0ZXh0IiwiJGVsZW1NYXRjaCIsIiRhbGwiLCJ0cmFuc2Zvcm1SZXMiLCJJTlZBTElEX0pTT04iLCJyZXN0V2hlcmUiLCJtb25nb1doZXJlIiwib3V0IiwicGFyc2VPYmplY3RLZXlWYWx1ZVRvTW9uZ29PYmplY3RLZXlWYWx1ZSIsInRyYW5zZm9ybWVkVmFsdWUiLCJjb2VyY2VkVG9EYXRlIiwiSU5WQUxJRF9LRVlfTkFNRSIsInBhcnNlT2JqZWN0VG9Nb25nb09iamVjdEZvckNyZWF0ZSIsInJlc3RDcmVhdGUiLCJhZGRMZWdhY3lBQ0wiLCJtb25nb0NyZWF0ZSIsInVuZGVmaW5lZCIsImNyZWF0ZWRBdCIsIl9jcmVhdGVkX2F0IiwiaXNvIiwidXBkYXRlZEF0IiwiX3VwZGF0ZWRfYXQiLCJ0cmFuc2Zvcm1VcGRhdGUiLCJyZXN0VXBkYXRlIiwibW9uZ29VcGRhdGUiLCJhY2wiLCJfcnBlcm0iLCJfd3Blcm0iLCJfYWNsIiwiJHNldCIsIl9fb3AiLCJhcmciLCJyZXN0T2JqZWN0IiwicmVzdE9iamVjdENvcHkiLCJmb3JFYWNoIiwiZW50cnkiLCJ3IiwiciIsImF0b20iLCJvYmplY3RJZCIsIkRhdGVDb2RlciIsImlzVmFsaWRKU09OIiwiSlNPTlRvRGF0YWJhc2UiLCJCeXRlc0NvZGVyIiwiJHJlZ2V4IiwidGFyZ2V0Q2xhc3MiLCJHZW9Qb2ludENvZGVyIiwiUG9seWdvbkNvZGVyIiwiRmlsZUNvZGVyIiwiSU5URVJOQUxfU0VSVkVSX0VSUk9SIiwiY29uc3RyYWludCIsInF1ZXJ5S2V5IiwiaW5BcnJheSIsImlzTmVzdGVkS2V5IiwidHJhbnNmb3JtRnVuY3Rpb24iLCJ0cmFuc2Zvcm1lciIsInJlc3VsdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJzb3J0IiwicmV2ZXJzZSIsImFuc3dlciIsInZhbCIsIiRyZWxhdGl2ZVRpbWUiLCJwYXJzZXJSZXN1bHQiLCJyZWxhdGl2ZVRpbWVUb0RhdGUiLCJzdGF0dXMiLCJsb2ciLCJpbmZvIiwiYXJyIiwiXyIsImZsYXRNYXAiLCJzIiwiJG5pbiIsInNlYXJjaCIsIiRzZWFyY2giLCIkdGVybSIsIiRsYW5ndWFnZSIsIiRjYXNlU2Vuc2l0aXZlIiwiJGRpYWNyaXRpY1NlbnNpdGl2ZSIsInBvaW50IiwiJGdlb1dpdGhpbiIsIiRjZW50ZXJTcGhlcmUiLCJsb25naXR1ZGUiLCJsYXRpdHVkZSIsIiRtYXhEaXN0YW5jZSIsIkNPTU1BTkRfVU5BVkFJTEFCTEUiLCJib3giLCIkYm94IiwicG9seWdvbiIsImNlbnRlclNwaGVyZSIsInBvaW50cyIsImNvb3JkaW5hdGVzIiwiR2VvUG9pbnQiLCJfdmFsaWRhdGUiLCIkcG9seWdvbiIsImRpc3RhbmNlIiwiaXNOYU4iLCIkZ2VvbWV0cnkiLCJhbW91bnQiLCJvYmplY3RzIiwiZmxhdHRlbiIsInRvQWRkIiwibW9uZ29PcCIsIkFkZCIsIkFkZFVuaXF1ZSIsIiRlYWNoIiwidG9SZW1vdmUiLCJvYmplY3QiLCJpdGVyYXRvciIsIm5lc3RlZE1vbmdvT2JqZWN0VG9OZXN0ZWRQYXJzZU9iamVjdCIsIm1vbmdvT2JqZWN0IiwiX2VuY29kZSIsIkxvbmciLCJ0b051bWJlciIsIkRvdWJsZSIsImlzVmFsaWREYXRhYmFzZU9iamVjdCIsImRhdGFiYXNlVG9KU09OIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwidG9KU09OIiwidHJhbnNmb3JtUG9pbnRlclN0cmluZyIsInBvaW50ZXJTdHJpbmciLCJvYmpEYXRhIiwic3BsaXQiLCJtb25nb09iamVjdFRvUGFyc2VPYmplY3QiLCJfaGFzaGVkX3Bhc3N3b3JkIiwid2FybiIsIm5ld0tleSIsInN1YnN0cmluZyIsInJlbGF0aW9uRmllbGROYW1lcyIsImZpbHRlciIsInJlbGF0aW9uRmllbGRzIiwicmVsYXRpb25GaWVsZE5hbWUiLCJqc29uIiwiYmFzZTY0UGF0dGVybiIsImlzQmFzZTY0VmFsdWUiLCJ0ZXN0IiwiYnVmZmVyIiwiYmFzZTY0IiwiQmluYXJ5IiwiQnVmZmVyIiwiZnJvbSIsImNvb3JkcyIsImNvb3JkIiwicGFyc2VGbG9hdCIsInB1c2giLCJ1bmlxdWUiLCJpdGVtIiwiaW5kZXgiLCJhciIsImZvdW5kSW5kZXgiLCJwdCIsIm5hbWUiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL1N0b3JhZ2UvTW9uZ28vTW9uZ29UcmFuc2Zvcm0uanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi8uLi8uLi9sb2dnZXInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbnZhciBtb25nb2RiID0gcmVxdWlyZSgnbW9uZ29kYicpO1xudmFyIFBhcnNlID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpLlBhcnNlO1xuY29uc3QgVXRpbHMgPSByZXF1aXJlKCcuLi8uLi8uLi9VdGlscycpO1xuXG5jb25zdCB0cmFuc2Zvcm1LZXkgPSAoY2xhc3NOYW1lLCBmaWVsZE5hbWUsIHNjaGVtYSkgPT4ge1xuICAvLyBDaGVjayBpZiB0aGUgc2NoZW1hIGlzIGtub3duIHNpbmNlIGl0J3MgYSBidWlsdC1pbiBmaWVsZC5cbiAgc3dpdGNoIChmaWVsZE5hbWUpIHtcbiAgICBjYXNlICdvYmplY3RJZCc6XG4gICAgICByZXR1cm4gJ19pZCc7XG4gICAgY2FzZSAnY3JlYXRlZEF0JzpcbiAgICAgIHJldHVybiAnX2NyZWF0ZWRfYXQnO1xuICAgIGNhc2UgJ3VwZGF0ZWRBdCc6XG4gICAgICByZXR1cm4gJ191cGRhdGVkX2F0JztcbiAgICBjYXNlICdzZXNzaW9uVG9rZW4nOlxuICAgICAgcmV0dXJuICdfc2Vzc2lvbl90b2tlbic7XG4gICAgY2FzZSAnbGFzdFVzZWQnOlxuICAgICAgcmV0dXJuICdfbGFzdF91c2VkJztcbiAgICBjYXNlICd0aW1lc1VzZWQnOlxuICAgICAgcmV0dXJuICd0aW1lc191c2VkJztcbiAgfVxuXG4gIGlmIChzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0gJiYgc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLl9fdHlwZSA9PSAnUG9pbnRlcicpIHtcbiAgICBmaWVsZE5hbWUgPSAnX3BfJyArIGZpZWxkTmFtZTtcbiAgfSBlbHNlIGlmIChzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0gJiYgc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnR5cGUgPT0gJ1BvaW50ZXInKSB7XG4gICAgZmllbGROYW1lID0gJ19wXycgKyBmaWVsZE5hbWU7XG4gIH1cblxuICByZXR1cm4gZmllbGROYW1lO1xufTtcblxuY29uc3QgdHJhbnNmb3JtS2V5VmFsdWVGb3JVcGRhdGUgPSAoY2xhc3NOYW1lLCByZXN0S2V5LCByZXN0VmFsdWUsIHBhcnNlRm9ybWF0U2NoZW1hKSA9PiB7XG4gIC8vIENoZWNrIGlmIHRoZSBzY2hlbWEgaXMga25vd24gc2luY2UgaXQncyBhIGJ1aWx0LWluIGZpZWxkLlxuICB2YXIga2V5ID0gcmVzdEtleTtcbiAgdmFyIHRpbWVGaWVsZCA9IGZhbHNlO1xuICBzd2l0Y2ggKGtleSkge1xuICAgIGNhc2UgJ29iamVjdElkJzpcbiAgICBjYXNlICdfaWQnOlxuICAgICAgaWYgKFsnX0dsb2JhbENvbmZpZycsICdfR3JhcGhRTENvbmZpZyddLmluY2x1ZGVzKGNsYXNzTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VJbnQocmVzdFZhbHVlKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGtleSA9ICdfaWQnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY3JlYXRlZEF0JzpcbiAgICBjYXNlICdfY3JlYXRlZF9hdCc6XG4gICAgICBrZXkgPSAnX2NyZWF0ZWRfYXQnO1xuICAgICAgdGltZUZpZWxkID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3VwZGF0ZWRBdCc6XG4gICAgY2FzZSAnX3VwZGF0ZWRfYXQnOlxuICAgICAga2V5ID0gJ191cGRhdGVkX2F0JztcbiAgICAgIHRpbWVGaWVsZCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZXNzaW9uVG9rZW4nOlxuICAgIGNhc2UgJ19zZXNzaW9uX3Rva2VuJzpcbiAgICAgIGtleSA9ICdfc2Vzc2lvbl90b2tlbic7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdleHBpcmVzQXQnOlxuICAgIGNhc2UgJ19leHBpcmVzQXQnOlxuICAgICAga2V5ID0gJ2V4cGlyZXNBdCc7XG4gICAgICB0aW1lRmllbGQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0JzpcbiAgICAgIGtleSA9ICdfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQnO1xuICAgICAgdGltZUZpZWxkID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ19hY2NvdW50X2xvY2tvdXRfZXhwaXJlc19hdCc6XG4gICAgICBrZXkgPSAnX2FjY291bnRfbG9ja291dF9leHBpcmVzX2F0JztcbiAgICAgIHRpbWVGaWVsZCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdfZmFpbGVkX2xvZ2luX2NvdW50JzpcbiAgICAgIGtleSA9ICdfZmFpbGVkX2xvZ2luX2NvdW50JztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ19wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQnOlxuICAgICAga2V5ID0gJ19wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQnO1xuICAgICAgdGltZUZpZWxkID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ19wYXNzd29yZF9jaGFuZ2VkX2F0JzpcbiAgICAgIGtleSA9ICdfcGFzc3dvcmRfY2hhbmdlZF9hdCc7XG4gICAgICB0aW1lRmllbGQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnX3JwZXJtJzpcbiAgICBjYXNlICdfd3Blcm0nOlxuICAgICAgcmV0dXJuIHsga2V5OiBrZXksIHZhbHVlOiByZXN0VmFsdWUgfTtcbiAgICBjYXNlICdsYXN0VXNlZCc6XG4gICAgY2FzZSAnX2xhc3RfdXNlZCc6XG4gICAgICBrZXkgPSAnX2xhc3RfdXNlZCc7XG4gICAgICB0aW1lRmllbGQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndGltZXNVc2VkJzpcbiAgICBjYXNlICd0aW1lc191c2VkJzpcbiAgICAgIGtleSA9ICd0aW1lc191c2VkJztcbiAgICAgIHRpbWVGaWVsZCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIGlmIChcbiAgICAocGFyc2VGb3JtYXRTY2hlbWEuZmllbGRzW2tleV0gJiYgcGFyc2VGb3JtYXRTY2hlbWEuZmllbGRzW2tleV0udHlwZSA9PT0gJ1BvaW50ZXInKSB8fFxuICAgICgha2V5LmluY2x1ZGVzKCcuJykgJiZcbiAgICAgICFwYXJzZUZvcm1hdFNjaGVtYS5maWVsZHNba2V5XSAmJlxuICAgICAgcmVzdFZhbHVlICYmXG4gICAgICByZXN0VmFsdWUuX190eXBlID09ICdQb2ludGVyJykgLy8gRG8gbm90IHVzZSB0aGUgX3BfIHByZWZpeCBmb3IgcG9pbnRlcnMgaW5zaWRlIG5lc3RlZCBkb2N1bWVudHNcbiAgKSB7XG4gICAga2V5ID0gJ19wXycgKyBrZXk7XG4gIH1cblxuICAvLyBIYW5kbGUgYXRvbWljIHZhbHVlc1xuICB2YXIgdmFsdWUgPSB0cmFuc2Zvcm1Ub3BMZXZlbEF0b20ocmVzdFZhbHVlKTtcbiAgaWYgKHZhbHVlICE9PSBDYW5ub3RUcmFuc2Zvcm0pIHtcbiAgICBpZiAodGltZUZpZWxkICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuICAgIH1cbiAgICBpZiAocmVzdEtleS5pbmRleE9mKCcuJykgPiAwKSB7XG4gICAgICByZXR1cm4geyBrZXksIHZhbHVlOiByZXN0VmFsdWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsga2V5LCB2YWx1ZSB9O1xuICB9XG5cbiAgLy8gSGFuZGxlIGFycmF5c1xuICBpZiAocmVzdFZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICB2YWx1ZSA9IHJlc3RWYWx1ZS5tYXAodHJhbnNmb3JtSW50ZXJpb3JWYWx1ZSk7XG4gICAgcmV0dXJuIHsga2V5LCB2YWx1ZSB9O1xuICB9XG5cbiAgLy8gSGFuZGxlIHVwZGF0ZSBvcGVyYXRvcnNcbiAgaWYgKHR5cGVvZiByZXN0VmFsdWUgPT09ICdvYmplY3QnICYmICdfX29wJyBpbiByZXN0VmFsdWUpIHtcbiAgICByZXR1cm4geyBrZXksIHZhbHVlOiB0cmFuc2Zvcm1VcGRhdGVPcGVyYXRvcihyZXN0VmFsdWUsIGZhbHNlKSB9O1xuICB9XG5cbiAgLy8gSGFuZGxlIG5vcm1hbCBvYmplY3RzIGJ5IHJlY3Vyc2luZ1xuICB2YWx1ZSA9IG1hcFZhbHVlcyhyZXN0VmFsdWUsIHRyYW5zZm9ybUludGVyaW9yVmFsdWUpO1xuICByZXR1cm4geyBrZXksIHZhbHVlIH07XG59O1xuXG5jb25zdCBpc1JlZ2V4ID0gdmFsdWUgPT4ge1xuICByZXR1cm4gdmFsdWUgJiYgdmFsdWUgaW5zdGFuY2VvZiBSZWdFeHA7XG59O1xuXG5jb25zdCBpc1N0YXJ0c1dpdGhSZWdleCA9IHZhbHVlID0+IHtcbiAgaWYgKCFpc1JlZ2V4KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1hdGNoZXMgPSB2YWx1ZS50b1N0cmluZygpLm1hdGNoKC9cXC9cXF5cXFxcUS4qXFxcXEVcXC8vKTtcbiAgcmV0dXJuICEhbWF0Y2hlcztcbn07XG5cbmNvbnN0IGlzQWxsVmFsdWVzUmVnZXhPck5vbmUgPSB2YWx1ZXMgPT4ge1xuICBpZiAoIXZhbHVlcyB8fCAhQXJyYXkuaXNBcnJheSh2YWx1ZXMpIHx8IHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0VmFsdWVzSXNSZWdleCA9IGlzU3RhcnRzV2l0aFJlZ2V4KHZhbHVlc1swXSk7XG4gIGlmICh2YWx1ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGZpcnN0VmFsdWVzSXNSZWdleDtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAxLCBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoZmlyc3RWYWx1ZXNJc1JlZ2V4ICE9PSBpc1N0YXJ0c1dpdGhSZWdleCh2YWx1ZXNbaV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5jb25zdCBpc0FueVZhbHVlUmVnZXggPSB2YWx1ZXMgPT4ge1xuICByZXR1cm4gdmFsdWVzLnNvbWUoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzUmVnZXgodmFsdWUpO1xuICB9KTtcbn07XG5cbmNvbnN0IHRyYW5zZm9ybUludGVyaW9yVmFsdWUgPSByZXN0VmFsdWUgPT4ge1xuICBpZiAoXG4gICAgcmVzdFZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHJlc3RWYWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICBPYmplY3Qua2V5cyhyZXN0VmFsdWUpLnNvbWUoa2V5ID0+IGtleS5pbmNsdWRlcygnJCcpIHx8IGtleS5pbmNsdWRlcygnLicpKVxuICApIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5JTlZBTElEX05FU1RFRF9LRVksXG4gICAgICBcIk5lc3RlZCBrZXlzIHNob3VsZCBub3QgY29udGFpbiB0aGUgJyQnIG9yICcuJyBjaGFyYWN0ZXJzXCJcbiAgICApO1xuICB9XG4gIC8vIEhhbmRsZSBhdG9taWMgdmFsdWVzXG4gIHZhciB2YWx1ZSA9IHRyYW5zZm9ybUludGVyaW9yQXRvbShyZXN0VmFsdWUpO1xuICBpZiAodmFsdWUgIT09IENhbm5vdFRyYW5zZm9ybSkge1xuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUubWFwKHRyYW5zZm9ybUludGVyaW9yVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBtYXBWYWx1ZXModmFsdWUsIHRyYW5zZm9ybUludGVyaW9yVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvLyBIYW5kbGUgYXJyYXlzXG4gIGlmIChyZXN0VmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHJldHVybiByZXN0VmFsdWUubWFwKHRyYW5zZm9ybUludGVyaW9yVmFsdWUpO1xuICB9XG5cbiAgLy8gSGFuZGxlIHVwZGF0ZSBvcGVyYXRvcnNcbiAgaWYgKHR5cGVvZiByZXN0VmFsdWUgPT09ICdvYmplY3QnICYmICdfX29wJyBpbiByZXN0VmFsdWUpIHtcbiAgICByZXR1cm4gdHJhbnNmb3JtVXBkYXRlT3BlcmF0b3IocmVzdFZhbHVlLCB0cnVlKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBub3JtYWwgb2JqZWN0cyBieSByZWN1cnNpbmdcbiAgcmV0dXJuIG1hcFZhbHVlcyhyZXN0VmFsdWUsIHRyYW5zZm9ybUludGVyaW9yVmFsdWUpO1xufTtcblxuY29uc3QgdmFsdWVBc0RhdGUgPSB2YWx1ZSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbiAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuZnVuY3Rpb24gdHJhbnNmb3JtUXVlcnlLZXlWYWx1ZShjbGFzc05hbWUsIGtleSwgdmFsdWUsIHNjaGVtYSwgY291bnQgPSBmYWxzZSkge1xuICBzd2l0Y2ggKGtleSkge1xuICAgIGNhc2UgJ2NyZWF0ZWRBdCc6XG4gICAgICBpZiAodmFsdWVBc0RhdGUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGtleTogJ19jcmVhdGVkX2F0JywgdmFsdWU6IHZhbHVlQXNEYXRlKHZhbHVlKSB9O1xuICAgICAgfVxuICAgICAga2V5ID0gJ19jcmVhdGVkX2F0JztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3VwZGF0ZWRBdCc6XG4gICAgICBpZiAodmFsdWVBc0RhdGUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGtleTogJ191cGRhdGVkX2F0JywgdmFsdWU6IHZhbHVlQXNEYXRlKHZhbHVlKSB9O1xuICAgICAgfVxuICAgICAga2V5ID0gJ191cGRhdGVkX2F0JztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2V4cGlyZXNBdCc6XG4gICAgICBpZiAodmFsdWVBc0RhdGUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGtleTogJ2V4cGlyZXNBdCcsIHZhbHVlOiB2YWx1ZUFzRGF0ZSh2YWx1ZSkgfTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ19lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCc6XG4gICAgICBpZiAodmFsdWVBc0RhdGUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga2V5OiAnX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0JyxcbiAgICAgICAgICB2YWx1ZTogdmFsdWVBc0RhdGUodmFsdWUpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnb2JqZWN0SWQnOiB7XG4gICAgICBpZiAoWydfR2xvYmFsQ29uZmlnJywgJ19HcmFwaFFMQ29uZmlnJ10uaW5jbHVkZXMoY2xhc3NOYW1lKSkge1xuICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGtleTogJ19pZCcsIHZhbHVlIH07XG4gICAgfVxuICAgIGNhc2UgJ19hY2NvdW50X2xvY2tvdXRfZXhwaXJlc19hdCc6XG4gICAgICBpZiAodmFsdWVBc0RhdGUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga2V5OiAnX2FjY291bnRfbG9ja291dF9leHBpcmVzX2F0JyxcbiAgICAgICAgICB2YWx1ZTogdmFsdWVBc0RhdGUodmFsdWUpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnX2ZhaWxlZF9sb2dpbl9jb3VudCc6XG4gICAgICByZXR1cm4geyBrZXksIHZhbHVlIH07XG4gICAgY2FzZSAnc2Vzc2lvblRva2VuJzpcbiAgICAgIHJldHVybiB7IGtleTogJ19zZXNzaW9uX3Rva2VuJywgdmFsdWUgfTtcbiAgICBjYXNlICdfcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0JzpcbiAgICAgIGlmICh2YWx1ZUFzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBrZXk6ICdfcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0JyxcbiAgICAgICAgICB2YWx1ZTogdmFsdWVBc0RhdGUodmFsdWUpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnX3Bhc3N3b3JkX2NoYW5nZWRfYXQnOlxuICAgICAgaWYgKHZhbHVlQXNEYXRlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4geyBrZXk6ICdfcGFzc3dvcmRfY2hhbmdlZF9hdCcsIHZhbHVlOiB2YWx1ZUFzRGF0ZSh2YWx1ZSkgfTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ19ycGVybSc6XG4gICAgY2FzZSAnX3dwZXJtJzpcbiAgICBjYXNlICdfcGVyaXNoYWJsZV90b2tlbic6XG4gICAgY2FzZSAnX2VtYWlsX3ZlcmlmeV90b2tlbic6XG4gICAgICByZXR1cm4geyBrZXksIHZhbHVlIH07XG4gICAgY2FzZSAnJG9yJzpcbiAgICBjYXNlICckYW5kJzpcbiAgICBjYXNlICckbm9yJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICB2YWx1ZTogdmFsdWUubWFwKHN1YlF1ZXJ5ID0+IHRyYW5zZm9ybVdoZXJlKGNsYXNzTmFtZSwgc3ViUXVlcnksIHNjaGVtYSwgY291bnQpKSxcbiAgICAgIH07XG4gICAgY2FzZSAnbGFzdFVzZWQnOlxuICAgICAgaWYgKHZhbHVlQXNEYXRlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4geyBrZXk6ICdfbGFzdF91c2VkJywgdmFsdWU6IHZhbHVlQXNEYXRlKHZhbHVlKSB9O1xuICAgICAgfVxuICAgICAga2V5ID0gJ19sYXN0X3VzZWQnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndGltZXNVc2VkJzpcbiAgICAgIHJldHVybiB7IGtleTogJ3RpbWVzX3VzZWQnLCB2YWx1ZTogdmFsdWUgfTtcbiAgICBkZWZhdWx0OiB7XG4gICAgICAvLyBPdGhlciBhdXRoIGRhdGFcbiAgICAgIGNvbnN0IGF1dGhEYXRhTWF0Y2ggPSBrZXkubWF0Y2goL15hdXRoRGF0YVxcLihbYS16QS1aMC05X10rKVxcLmlkJC8pO1xuICAgICAgaWYgKGF1dGhEYXRhTWF0Y2ggJiYgY2xhc3NOYW1lID09PSAnX1VzZXInKSB7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gYXV0aERhdGFNYXRjaFsxXTtcbiAgICAgICAgLy8gU3BlY2lhbC1jYXNlIGF1dGggZGF0YS5cbiAgICAgICAgcmV0dXJuIHsga2V5OiBgX2F1dGhfZGF0YV8ke3Byb3ZpZGVyfS5pZGAsIHZhbHVlIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXhwZWN0ZWRUeXBlSXNBcnJheSA9IHNjaGVtYSAmJiBzY2hlbWEuZmllbGRzW2tleV0gJiYgc2NoZW1hLmZpZWxkc1trZXldLnR5cGUgPT09ICdBcnJheSc7XG5cbiAgY29uc3QgZXhwZWN0ZWRUeXBlSXNQb2ludGVyID1cbiAgICBzY2hlbWEgJiYgc2NoZW1hLmZpZWxkc1trZXldICYmIHNjaGVtYS5maWVsZHNba2V5XS50eXBlID09PSAnUG9pbnRlcic7XG5cbiAgY29uc3QgZmllbGQgPSBzY2hlbWEgJiYgc2NoZW1hLmZpZWxkc1trZXldO1xuICBpZiAoXG4gICAgZXhwZWN0ZWRUeXBlSXNQb2ludGVyIHx8XG4gICAgKCFzY2hlbWEgJiYgIWtleS5pbmNsdWRlcygnLicpICYmIHZhbHVlICYmIHZhbHVlLl9fdHlwZSA9PT0gJ1BvaW50ZXInKVxuICApIHtcbiAgICBrZXkgPSAnX3BfJyArIGtleTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBxdWVyeSBjb25zdHJhaW50c1xuICBjb25zdCB0cmFuc2Zvcm1lZENvbnN0cmFpbnQgPSB0cmFuc2Zvcm1Db25zdHJhaW50KHZhbHVlLCBmaWVsZCwga2V5LCBjb3VudCk7XG4gIGlmICh0cmFuc2Zvcm1lZENvbnN0cmFpbnQgIT09IENhbm5vdFRyYW5zZm9ybSkge1xuICAgIGlmICh0cmFuc2Zvcm1lZENvbnN0cmFpbnQuJHRleHQpIHtcbiAgICAgIHJldHVybiB7IGtleTogJyR0ZXh0JywgdmFsdWU6IHRyYW5zZm9ybWVkQ29uc3RyYWludC4kdGV4dCB9O1xuICAgIH1cbiAgICBpZiAodHJhbnNmb3JtZWRDb25zdHJhaW50LiRlbGVtTWF0Y2gpIHtcbiAgICAgIHJldHVybiB7IGtleTogJyRub3InLCB2YWx1ZTogW3sgW2tleV06IHRyYW5zZm9ybWVkQ29uc3RyYWludCB9XSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBrZXksIHZhbHVlOiB0cmFuc2Zvcm1lZENvbnN0cmFpbnQgfTtcbiAgfVxuXG4gIGlmIChleHBlY3RlZFR5cGVJc0FycmF5ICYmICEodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICByZXR1cm4geyBrZXksIHZhbHVlOiB7ICRhbGw6IFt0cmFuc2Zvcm1JbnRlcmlvckF0b20odmFsdWUpXSB9IH07XG4gIH1cblxuICAvLyBIYW5kbGUgYXRvbWljIHZhbHVlc1xuICBjb25zdCB0cmFuc2Zvcm1SZXMgPSBrZXkuaW5jbHVkZXMoJy4nKVxuICAgID8gdHJhbnNmb3JtSW50ZXJpb3JBdG9tKHZhbHVlKVxuICAgIDogdHJhbnNmb3JtVG9wTGV2ZWxBdG9tKHZhbHVlKTtcbiAgaWYgKHRyYW5zZm9ybVJlcyAhPT0gQ2Fubm90VHJhbnNmb3JtKSB7XG4gICAgcmV0dXJuIHsga2V5LCB2YWx1ZTogdHJhbnNmb3JtUmVzIH07XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgYFlvdSBjYW5ub3QgdXNlICR7dmFsdWV9IGFzIGEgcXVlcnkgcGFyYW1ldGVyLmBcbiAgICApO1xuICB9XG59XG5cbi8vIE1haW4gZXhwb3NlZCBtZXRob2QgdG8gaGVscCBydW4gcXVlcmllcy5cbi8vIHJlc3RXaGVyZSBpcyB0aGUgXCJ3aGVyZVwiIGNsYXVzZSBpbiBSRVNUIEFQSSBmb3JtLlxuLy8gUmV0dXJucyB0aGUgbW9uZ28gZm9ybSBvZiB0aGUgcXVlcnkuXG5mdW5jdGlvbiB0cmFuc2Zvcm1XaGVyZShjbGFzc05hbWUsIHJlc3RXaGVyZSwgc2NoZW1hLCBjb3VudCA9IGZhbHNlKSB7XG4gIGNvbnN0IG1vbmdvV2hlcmUgPSB7fTtcbiAgZm9yIChjb25zdCByZXN0S2V5IGluIHJlc3RXaGVyZSkge1xuICAgIGNvbnN0IG91dCA9IHRyYW5zZm9ybVF1ZXJ5S2V5VmFsdWUoY2xhc3NOYW1lLCByZXN0S2V5LCByZXN0V2hlcmVbcmVzdEtleV0sIHNjaGVtYSwgY291bnQpO1xuICAgIG1vbmdvV2hlcmVbb3V0LmtleV0gPSBvdXQudmFsdWU7XG4gIH1cbiAgcmV0dXJuIG1vbmdvV2hlcmU7XG59XG5cbmNvbnN0IHBhcnNlT2JqZWN0S2V5VmFsdWVUb01vbmdvT2JqZWN0S2V5VmFsdWUgPSAocmVzdEtleSwgcmVzdFZhbHVlLCBzY2hlbWEpID0+IHtcbiAgLy8gQ2hlY2sgaWYgdGhlIHNjaGVtYSBpcyBrbm93biBzaW5jZSBpdCdzIGEgYnVpbHQtaW4gZmllbGQuXG4gIGxldCB0cmFuc2Zvcm1lZFZhbHVlO1xuICBsZXQgY29lcmNlZFRvRGF0ZTtcbiAgc3dpdGNoIChyZXN0S2V5KSB7XG4gICAgY2FzZSAnb2JqZWN0SWQnOlxuICAgICAgcmV0dXJuIHsga2V5OiAnX2lkJywgdmFsdWU6IHJlc3RWYWx1ZSB9O1xuICAgIGNhc2UgJ2V4cGlyZXNBdCc6XG4gICAgICB0cmFuc2Zvcm1lZFZhbHVlID0gdHJhbnNmb3JtVG9wTGV2ZWxBdG9tKHJlc3RWYWx1ZSk7XG4gICAgICBjb2VyY2VkVG9EYXRlID1cbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybWVkVmFsdWUgPT09ICdzdHJpbmcnID8gbmV3IERhdGUodHJhbnNmb3JtZWRWYWx1ZSkgOiB0cmFuc2Zvcm1lZFZhbHVlO1xuICAgICAgcmV0dXJuIHsga2V5OiAnZXhwaXJlc0F0JywgdmFsdWU6IGNvZXJjZWRUb0RhdGUgfTtcbiAgICBjYXNlICdfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQnOlxuICAgICAgdHJhbnNmb3JtZWRWYWx1ZSA9IHRyYW5zZm9ybVRvcExldmVsQXRvbShyZXN0VmFsdWUpO1xuICAgICAgY29lcmNlZFRvRGF0ZSA9XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm1lZFZhbHVlID09PSAnc3RyaW5nJyA/IG5ldyBEYXRlKHRyYW5zZm9ybWVkVmFsdWUpIDogdHJhbnNmb3JtZWRWYWx1ZTtcbiAgICAgIHJldHVybiB7IGtleTogJ19lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCcsIHZhbHVlOiBjb2VyY2VkVG9EYXRlIH07XG4gICAgY2FzZSAnX2FjY291bnRfbG9ja291dF9leHBpcmVzX2F0JzpcbiAgICAgIHRyYW5zZm9ybWVkVmFsdWUgPSB0cmFuc2Zvcm1Ub3BMZXZlbEF0b20ocmVzdFZhbHVlKTtcbiAgICAgIGNvZXJjZWRUb0RhdGUgPVxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtZWRWYWx1ZSA9PT0gJ3N0cmluZycgPyBuZXcgRGF0ZSh0cmFuc2Zvcm1lZFZhbHVlKSA6IHRyYW5zZm9ybWVkVmFsdWU7XG4gICAgICByZXR1cm4geyBrZXk6ICdfYWNjb3VudF9sb2Nrb3V0X2V4cGlyZXNfYXQnLCB2YWx1ZTogY29lcmNlZFRvRGF0ZSB9O1xuICAgIGNhc2UgJ19wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQnOlxuICAgICAgdHJhbnNmb3JtZWRWYWx1ZSA9IHRyYW5zZm9ybVRvcExldmVsQXRvbShyZXN0VmFsdWUpO1xuICAgICAgY29lcmNlZFRvRGF0ZSA9XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm1lZFZhbHVlID09PSAnc3RyaW5nJyA/IG5ldyBEYXRlKHRyYW5zZm9ybWVkVmFsdWUpIDogdHJhbnNmb3JtZWRWYWx1ZTtcbiAgICAgIHJldHVybiB7IGtleTogJ19wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQnLCB2YWx1ZTogY29lcmNlZFRvRGF0ZSB9O1xuICAgIGNhc2UgJ19wYXNzd29yZF9jaGFuZ2VkX2F0JzpcbiAgICAgIHRyYW5zZm9ybWVkVmFsdWUgPSB0cmFuc2Zvcm1Ub3BMZXZlbEF0b20ocmVzdFZhbHVlKTtcbiAgICAgIGNvZXJjZWRUb0RhdGUgPVxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtZWRWYWx1ZSA9PT0gJ3N0cmluZycgPyBuZXcgRGF0ZSh0cmFuc2Zvcm1lZFZhbHVlKSA6IHRyYW5zZm9ybWVkVmFsdWU7XG4gICAgICByZXR1cm4geyBrZXk6ICdfcGFzc3dvcmRfY2hhbmdlZF9hdCcsIHZhbHVlOiBjb2VyY2VkVG9EYXRlIH07XG4gICAgY2FzZSAnX2ZhaWxlZF9sb2dpbl9jb3VudCc6XG4gICAgY2FzZSAnX3JwZXJtJzpcbiAgICBjYXNlICdfd3Blcm0nOlxuICAgIGNhc2UgJ19lbWFpbF92ZXJpZnlfdG9rZW4nOlxuICAgIGNhc2UgJ19oYXNoZWRfcGFzc3dvcmQnOlxuICAgIGNhc2UgJ19wZXJpc2hhYmxlX3Rva2VuJzpcbiAgICAgIHJldHVybiB7IGtleTogcmVzdEtleSwgdmFsdWU6IHJlc3RWYWx1ZSB9O1xuICAgIGNhc2UgJ3Nlc3Npb25Ub2tlbic6XG4gICAgICByZXR1cm4geyBrZXk6ICdfc2Vzc2lvbl90b2tlbicsIHZhbHVlOiByZXN0VmFsdWUgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gQXV0aCBkYXRhIHNob3VsZCBoYXZlIGJlZW4gdHJhbnNmb3JtZWQgYWxyZWFkeVxuICAgICAgaWYgKHJlc3RLZXkubWF0Y2goL15hdXRoRGF0YVxcLihbYS16QS1aMC05X10rKVxcLmlkJC8pKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0tFWV9OQU1FLCAnY2FuIG9ubHkgcXVlcnkgb24gJyArIHJlc3RLZXkpO1xuICAgICAgfVxuICAgICAgLy8gVHJ1c3QgdGhhdCB0aGUgYXV0aCBkYXRhIGhhcyBiZWVuIHRyYW5zZm9ybWVkIGFuZCBzYXZlIGl0IGRpcmVjdGx5XG4gICAgICBpZiAocmVzdEtleS5tYXRjaCgvXl9hdXRoX2RhdGFfW2EtekEtWjAtOV9dKyQvKSkge1xuICAgICAgICByZXR1cm4geyBrZXk6IHJlc3RLZXksIHZhbHVlOiByZXN0VmFsdWUgfTtcbiAgICAgIH1cbiAgfVxuICAvL3NraXAgc3RyYWlnaHQgdG8gdHJhbnNmb3JtVG9wTGV2ZWxBdG9tIGZvciBCeXRlcywgdGhleSBkb24ndCBzaG93IHVwIGluIHRoZSBzY2hlbWEgZm9yIHNvbWUgcmVhc29uXG4gIGlmIChyZXN0VmFsdWUgJiYgcmVzdFZhbHVlLl9fdHlwZSAhPT0gJ0J5dGVzJykge1xuICAgIC8vTm90ZTogV2UgbWF5IG5vdCBrbm93IHRoZSB0eXBlIG9mIGEgZmllbGQgaGVyZSwgYXMgdGhlIHVzZXIgY291bGQgYmUgc2F2aW5nIChudWxsKSB0byBhIGZpZWxkXG4gICAgLy9UaGF0IG5ldmVyIGV4aXN0ZWQgYmVmb3JlLCBtZWFuaW5nIHdlIGNhbid0IGluZmVyIHRoZSB0eXBlLlxuICAgIGlmIChcbiAgICAgIChzY2hlbWEuZmllbGRzW3Jlc3RLZXldICYmIHNjaGVtYS5maWVsZHNbcmVzdEtleV0udHlwZSA9PSAnUG9pbnRlcicpIHx8XG4gICAgICByZXN0VmFsdWUuX190eXBlID09ICdQb2ludGVyJ1xuICAgICkge1xuICAgICAgcmVzdEtleSA9ICdfcF8nICsgcmVzdEtleTtcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgYXRvbWljIHZhbHVlc1xuICB2YXIgdmFsdWUgPSB0cmFuc2Zvcm1Ub3BMZXZlbEF0b20ocmVzdFZhbHVlKTtcbiAgaWYgKHZhbHVlICE9PSBDYW5ub3RUcmFuc2Zvcm0pIHtcbiAgICByZXR1cm4geyBrZXk6IHJlc3RLZXksIHZhbHVlOiB2YWx1ZSB9O1xuICB9XG5cbiAgLy8gQUNMcyBhcmUgaGFuZGxlZCBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkXG4gIC8vIElmIGFuIEFDTCBrZXkgc3RpbGwgZXhpc3RzIGhlcmUsIHNvbWV0aGluZyBpcyB3cm9uZy5cbiAgaWYgKHJlc3RLZXkgPT09ICdBQ0wnKSB7XG4gICAgdGhyb3cgJ1RoZXJlIHdhcyBhIHByb2JsZW0gdHJhbnNmb3JtaW5nIGFuIEFDTC4nO1xuICB9XG5cbiAgLy8gSGFuZGxlIGFycmF5c1xuICBpZiAocmVzdFZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICB2YWx1ZSA9IHJlc3RWYWx1ZS5tYXAodHJhbnNmb3JtSW50ZXJpb3JWYWx1ZSk7XG4gICAgcmV0dXJuIHsga2V5OiByZXN0S2V5LCB2YWx1ZTogdmFsdWUgfTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBub3JtYWwgb2JqZWN0cyBieSByZWN1cnNpbmdcbiAgaWYgKE9iamVjdC5rZXlzKHJlc3RWYWx1ZSkuc29tZShrZXkgPT4ga2V5LmluY2x1ZGVzKCckJykgfHwga2V5LmluY2x1ZGVzKCcuJykpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9ORVNURURfS0VZLFxuICAgICAgXCJOZXN0ZWQga2V5cyBzaG91bGQgbm90IGNvbnRhaW4gdGhlICckJyBvciAnLicgY2hhcmFjdGVyc1wiXG4gICAgKTtcbiAgfVxuICB2YWx1ZSA9IG1hcFZhbHVlcyhyZXN0VmFsdWUsIHRyYW5zZm9ybUludGVyaW9yVmFsdWUpO1xuXG4gIHJldHVybiB7IGtleTogcmVzdEtleSwgdmFsdWUgfTtcbn07XG5cbmNvbnN0IHBhcnNlT2JqZWN0VG9Nb25nb09iamVjdEZvckNyZWF0ZSA9IChjbGFzc05hbWUsIHJlc3RDcmVhdGUsIHNjaGVtYSkgPT4ge1xuICByZXN0Q3JlYXRlID0gYWRkTGVnYWN5QUNMKHJlc3RDcmVhdGUpO1xuICBjb25zdCBtb25nb0NyZWF0ZSA9IHt9O1xuICBmb3IgKGNvbnN0IHJlc3RLZXkgaW4gcmVzdENyZWF0ZSkge1xuICAgIGlmIChyZXN0Q3JlYXRlW3Jlc3RLZXldICYmIHJlc3RDcmVhdGVbcmVzdEtleV0uX190eXBlID09PSAnUmVsYXRpb24nKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgeyBrZXksIHZhbHVlIH0gPSBwYXJzZU9iamVjdEtleVZhbHVlVG9Nb25nb09iamVjdEtleVZhbHVlKFxuICAgICAgcmVzdEtleSxcbiAgICAgIHJlc3RDcmVhdGVbcmVzdEtleV0sXG4gICAgICBzY2hlbWFcbiAgICApO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb25nb0NyZWF0ZVtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gVXNlIHRoZSBsZWdhY3kgbW9uZ28gZm9ybWF0IGZvciBjcmVhdGVkQXQgYW5kIHVwZGF0ZWRBdFxuICBpZiAobW9uZ29DcmVhdGUuY3JlYXRlZEF0KSB7XG4gICAgbW9uZ29DcmVhdGUuX2NyZWF0ZWRfYXQgPSBuZXcgRGF0ZShtb25nb0NyZWF0ZS5jcmVhdGVkQXQuaXNvIHx8IG1vbmdvQ3JlYXRlLmNyZWF0ZWRBdCk7XG4gICAgZGVsZXRlIG1vbmdvQ3JlYXRlLmNyZWF0ZWRBdDtcbiAgfVxuICBpZiAobW9uZ29DcmVhdGUudXBkYXRlZEF0KSB7XG4gICAgbW9uZ29DcmVhdGUuX3VwZGF0ZWRfYXQgPSBuZXcgRGF0ZShtb25nb0NyZWF0ZS51cGRhdGVkQXQuaXNvIHx8IG1vbmdvQ3JlYXRlLnVwZGF0ZWRBdCk7XG4gICAgZGVsZXRlIG1vbmdvQ3JlYXRlLnVwZGF0ZWRBdDtcbiAgfVxuXG4gIHJldHVybiBtb25nb0NyZWF0ZTtcbn07XG5cbi8vIE1haW4gZXhwb3NlZCBtZXRob2QgdG8gaGVscCB1cGRhdGUgb2xkIG9iamVjdHMuXG5jb25zdCB0cmFuc2Zvcm1VcGRhdGUgPSAoY2xhc3NOYW1lLCByZXN0VXBkYXRlLCBwYXJzZUZvcm1hdFNjaGVtYSkgPT4ge1xuICBjb25zdCBtb25nb1VwZGF0ZSA9IHt9O1xuICBjb25zdCBhY2wgPSBhZGRMZWdhY3lBQ0wocmVzdFVwZGF0ZSk7XG4gIGlmIChhY2wuX3JwZXJtIHx8IGFjbC5fd3Blcm0gfHwgYWNsLl9hY2wpIHtcbiAgICBtb25nb1VwZGF0ZS4kc2V0ID0ge307XG4gICAgaWYgKGFjbC5fcnBlcm0pIHtcbiAgICAgIG1vbmdvVXBkYXRlLiRzZXQuX3JwZXJtID0gYWNsLl9ycGVybTtcbiAgICB9XG4gICAgaWYgKGFjbC5fd3Blcm0pIHtcbiAgICAgIG1vbmdvVXBkYXRlLiRzZXQuX3dwZXJtID0gYWNsLl93cGVybTtcbiAgICB9XG4gICAgaWYgKGFjbC5fYWNsKSB7XG4gICAgICBtb25nb1VwZGF0ZS4kc2V0Ll9hY2wgPSBhY2wuX2FjbDtcbiAgICB9XG4gIH1cbiAgZm9yICh2YXIgcmVzdEtleSBpbiByZXN0VXBkYXRlKSB7XG4gICAgaWYgKHJlc3RVcGRhdGVbcmVzdEtleV0gJiYgcmVzdFVwZGF0ZVtyZXN0S2V5XS5fX3R5cGUgPT09ICdSZWxhdGlvbicpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgb3V0ID0gdHJhbnNmb3JtS2V5VmFsdWVGb3JVcGRhdGUoXG4gICAgICBjbGFzc05hbWUsXG4gICAgICByZXN0S2V5LFxuICAgICAgcmVzdFVwZGF0ZVtyZXN0S2V5XSxcbiAgICAgIHBhcnNlRm9ybWF0U2NoZW1hXG4gICAgKTtcblxuICAgIC8vIElmIHRoZSBvdXRwdXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW55ICQga2V5cywgaXQncyBhblxuICAgIC8vIG9wZXJhdG9yIHRoYXQgbmVlZHMgdG8gYmUgbGlmdGVkIG9udG8gdGhlIHRvcCBsZXZlbCB1cGRhdGVcbiAgICAvLyBvYmplY3QuXG4gICAgaWYgKHR5cGVvZiBvdXQudmFsdWUgPT09ICdvYmplY3QnICYmIG91dC52YWx1ZSAhPT0gbnVsbCAmJiBvdXQudmFsdWUuX19vcCkge1xuICAgICAgbW9uZ29VcGRhdGVbb3V0LnZhbHVlLl9fb3BdID0gbW9uZ29VcGRhdGVbb3V0LnZhbHVlLl9fb3BdIHx8IHt9O1xuICAgICAgbW9uZ29VcGRhdGVbb3V0LnZhbHVlLl9fb3BdW291dC5rZXldID0gb3V0LnZhbHVlLmFyZztcbiAgICB9IGVsc2Uge1xuICAgICAgbW9uZ29VcGRhdGVbJyRzZXQnXSA9IG1vbmdvVXBkYXRlWyckc2V0J10gfHwge307XG4gICAgICBtb25nb1VwZGF0ZVsnJHNldCddW291dC5rZXldID0gb3V0LnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtb25nb1VwZGF0ZTtcbn07XG5cbi8vIEFkZCB0aGUgbGVnYWN5IF9hY2wgZm9ybWF0LlxuY29uc3QgYWRkTGVnYWN5QUNMID0gcmVzdE9iamVjdCA9PiB7XG4gIGNvbnN0IHJlc3RPYmplY3RDb3B5ID0geyAuLi5yZXN0T2JqZWN0IH07XG4gIGNvbnN0IF9hY2wgPSB7fTtcblxuICBpZiAocmVzdE9iamVjdC5fd3Blcm0pIHtcbiAgICByZXN0T2JqZWN0Ll93cGVybS5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgIF9hY2xbZW50cnldID0geyB3OiB0cnVlIH07XG4gICAgfSk7XG4gICAgcmVzdE9iamVjdENvcHkuX2FjbCA9IF9hY2w7XG4gIH1cblxuICBpZiAocmVzdE9iamVjdC5fcnBlcm0pIHtcbiAgICByZXN0T2JqZWN0Ll9ycGVybS5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgIGlmICghKGVudHJ5IGluIF9hY2wpKSB7XG4gICAgICAgIF9hY2xbZW50cnldID0geyByOiB0cnVlIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfYWNsW2VudHJ5XS5yID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXN0T2JqZWN0Q29weS5fYWNsID0gX2FjbDtcbiAgfVxuXG4gIHJldHVybiByZXN0T2JqZWN0Q29weTtcbn07XG5cbi8vIEEgc2VudGluZWwgdmFsdWUgdGhhdCBoZWxwZXIgdHJhbnNmb3JtYXRpb25zIHJldHVybiB3aGVuIHRoZXlcbi8vIGNhbm5vdCBwZXJmb3JtIGEgdHJhbnNmb3JtYXRpb25cbmZ1bmN0aW9uIENhbm5vdFRyYW5zZm9ybSgpIHt9XG5cbmNvbnN0IHRyYW5zZm9ybUludGVyaW9yQXRvbSA9IGF0b20gPT4ge1xuICAvLyBUT0RPOiBjaGVjayB2YWxpZGl0eSBoYXJkZXIgZm9yIHRoZSBfX3R5cGUtZGVmaW5lZCB0eXBlc1xuICBpZiAodHlwZW9mIGF0b20gPT09ICdvYmplY3QnICYmIGF0b20gJiYgIShhdG9tIGluc3RhbmNlb2YgRGF0ZSkgJiYgYXRvbS5fX3R5cGUgPT09ICdQb2ludGVyJykge1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdQb2ludGVyJyxcbiAgICAgIGNsYXNzTmFtZTogYXRvbS5jbGFzc05hbWUsXG4gICAgICBvYmplY3RJZDogYXRvbS5vYmplY3RJZCxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGVvZiBhdG9tID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBhdG9tID09PSAnc3ltYm9sJykge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sIGBjYW5ub3QgdHJhbnNmb3JtIHZhbHVlOiAke2F0b219YCk7XG4gIH0gZWxzZSBpZiAoRGF0ZUNvZGVyLmlzVmFsaWRKU09OKGF0b20pKSB7XG4gICAgcmV0dXJuIERhdGVDb2Rlci5KU09OVG9EYXRhYmFzZShhdG9tKTtcbiAgfSBlbHNlIGlmIChCeXRlc0NvZGVyLmlzVmFsaWRKU09OKGF0b20pKSB7XG4gICAgcmV0dXJuIEJ5dGVzQ29kZXIuSlNPTlRvRGF0YWJhc2UoYXRvbSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGF0b20gPT09ICdvYmplY3QnICYmIGF0b20gJiYgYXRvbS4kcmVnZXggIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGF0b20uJHJlZ2V4KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYXRvbTtcbiAgfVxufTtcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSBhbiBhdG9tIGZyb20gUkVTVCBmb3JtYXQgdG8gTW9uZ28gZm9ybWF0LlxuLy8gQW4gYXRvbSBpcyBhbnl0aGluZyB0aGF0IGNhbid0IGNvbnRhaW4gb3RoZXIgZXhwcmVzc2lvbnMuIFNvIGl0XG4vLyBpbmNsdWRlcyB0aGluZ3Mgd2hlcmUgb2JqZWN0cyBhcmUgdXNlZCB0byByZXByZXNlbnQgb3RoZXJcbi8vIGRhdGF0eXBlcywgbGlrZSBwb2ludGVycyBhbmQgZGF0ZXMsIGJ1dCBpdCBkb2VzIG5vdCBpbmNsdWRlIG9iamVjdHNcbi8vIG9yIGFycmF5cyB3aXRoIGdlbmVyaWMgc3R1ZmYgaW5zaWRlLlxuLy8gUmFpc2VzIGFuIGVycm9yIGlmIHRoaXMgY2Fubm90IHBvc3NpYmx5IGJlIHZhbGlkIFJFU1QgZm9ybWF0LlxuLy8gUmV0dXJucyBDYW5ub3RUcmFuc2Zvcm0gaWYgaXQncyBqdXN0IG5vdCBhbiBhdG9tXG5mdW5jdGlvbiB0cmFuc2Zvcm1Ub3BMZXZlbEF0b20oYXRvbSwgZmllbGQpIHtcbiAgc3dpdGNoICh0eXBlb2YgYXRvbSkge1xuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgIHJldHVybiBhdG9tO1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBpZiAoZmllbGQgJiYgZmllbGQudHlwZSA9PT0gJ1BvaW50ZXInKSB7XG4gICAgICAgIHJldHVybiBgJHtmaWVsZC50YXJnZXRDbGFzc30kJHthdG9tfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXRvbTtcbiAgICBjYXNlICdzeW1ib2wnOlxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sIGBjYW5ub3QgdHJhbnNmb3JtIHZhbHVlOiAke2F0b219YCk7XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIGlmIChhdG9tIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAvLyBUZWNobmljYWxseSBkYXRlcyBhcmUgbm90IHJlc3QgZm9ybWF0LCBidXQsIGl0IHNlZW1zIHByZXR0eVxuICAgICAgICAvLyBjbGVhciB3aGF0IHRoZXkgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIHRvLCBzbyBsZXQncyBqdXN0IGRvIGl0LlxuICAgICAgICByZXR1cm4gYXRvbTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF0b20gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGF0b207XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IGNoZWNrIHZhbGlkaXR5IGhhcmRlciBmb3IgdGhlIF9fdHlwZS1kZWZpbmVkIHR5cGVzXG4gICAgICBpZiAoYXRvbS5fX3R5cGUgPT0gJ1BvaW50ZXInKSB7XG4gICAgICAgIHJldHVybiBgJHthdG9tLmNsYXNzTmFtZX0kJHthdG9tLm9iamVjdElkfWA7XG4gICAgICB9XG4gICAgICBpZiAoRGF0ZUNvZGVyLmlzVmFsaWRKU09OKGF0b20pKSB7XG4gICAgICAgIHJldHVybiBEYXRlQ29kZXIuSlNPTlRvRGF0YWJhc2UoYXRvbSk7XG4gICAgICB9XG4gICAgICBpZiAoQnl0ZXNDb2Rlci5pc1ZhbGlkSlNPTihhdG9tKSkge1xuICAgICAgICByZXR1cm4gQnl0ZXNDb2Rlci5KU09OVG9EYXRhYmFzZShhdG9tKTtcbiAgICAgIH1cbiAgICAgIGlmIChHZW9Qb2ludENvZGVyLmlzVmFsaWRKU09OKGF0b20pKSB7XG4gICAgICAgIHJldHVybiBHZW9Qb2ludENvZGVyLkpTT05Ub0RhdGFiYXNlKGF0b20pO1xuICAgICAgfVxuICAgICAgaWYgKFBvbHlnb25Db2Rlci5pc1ZhbGlkSlNPTihhdG9tKSkge1xuICAgICAgICByZXR1cm4gUG9seWdvbkNvZGVyLkpTT05Ub0RhdGFiYXNlKGF0b20pO1xuICAgICAgfVxuICAgICAgaWYgKEZpbGVDb2Rlci5pc1ZhbGlkSlNPTihhdG9tKSkge1xuICAgICAgICByZXR1cm4gRmlsZUNvZGVyLkpTT05Ub0RhdGFiYXNlKGF0b20pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIENhbm5vdFRyYW5zZm9ybTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBJIGRvbid0IHRoaW5rIHR5cGVvZiBjYW4gZXZlciBsZXQgdXMgZ2V0IGhlcmVcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgUGFyc2UuRXJyb3IuSU5URVJOQUxfU0VSVkVSX0VSUk9SLFxuICAgICAgICBgcmVhbGx5IGRpZCBub3QgZXhwZWN0IHZhbHVlOiAke2F0b219YFxuICAgICAgKTtcbiAgfVxufVxuXG4vLyBUcmFuc2Zvcm1zIGEgcXVlcnkgY29uc3RyYWludCBmcm9tIFJFU1QgQVBJIGZvcm1hdCB0byBNb25nbyBmb3JtYXQuXG4vLyBBIGNvbnN0cmFpbnQgaXMgc29tZXRoaW5nIHdpdGggZmllbGRzIGxpa2UgJGx0LlxuLy8gSWYgaXQgaXMgbm90IGEgdmFsaWQgY29uc3RyYWludCBidXQgaXQgY291bGQgYmUgYSB2YWxpZCBzb21ldGhpbmdcbi8vIGVsc2UsIHJldHVybiBDYW5ub3RUcmFuc2Zvcm0uXG4vLyBpbkFycmF5IGlzIHdoZXRoZXIgdGhpcyBpcyBhbiBhcnJheSBmaWVsZC5cbmZ1bmN0aW9uIHRyYW5zZm9ybUNvbnN0cmFpbnQoY29uc3RyYWludCwgZmllbGQsIHF1ZXJ5S2V5LCBjb3VudCA9IGZhbHNlKSB7XG4gIGNvbnN0IGluQXJyYXkgPSBmaWVsZCAmJiBmaWVsZC50eXBlICYmIGZpZWxkLnR5cGUgPT09ICdBcnJheSc7XG4gIC8vIENoZWNrIHdldGhlciB0aGUgZ2l2ZW4ga2V5IGhhcyBgLmBcbiAgY29uc3QgaXNOZXN0ZWRLZXkgPSBxdWVyeUtleS5pbmRleE9mKCcuJykgPiAtMTtcbiAgaWYgKHR5cGVvZiBjb25zdHJhaW50ICE9PSAnb2JqZWN0JyB8fCAhY29uc3RyYWludCkge1xuICAgIHJldHVybiBDYW5ub3RUcmFuc2Zvcm07XG4gIH1cbiAgLy8gRm9yIGluQXJyYXkgb3IgbmVzdGVkIGtleSwgd2UgbmVlZCB0byB0cmFuc2Zvcm0gdGhlIGludGVyaW9yIGF0b21cbiAgY29uc3QgdHJhbnNmb3JtRnVuY3Rpb24gPSAoaW5BcnJheSB8fCBpc05lc3RlZEtleSkgPyB0cmFuc2Zvcm1JbnRlcmlvckF0b20gOiB0cmFuc2Zvcm1Ub3BMZXZlbEF0b207XG4gIGNvbnN0IHRyYW5zZm9ybWVyID0gYXRvbSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdHJhbnNmb3JtRnVuY3Rpb24oYXRvbSwgZmllbGQpO1xuICAgIGlmIChyZXN1bHQgPT09IENhbm5vdFRyYW5zZm9ybSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgYGJhZCBhdG9tOiAke0pTT04uc3RyaW5naWZ5KGF0b20pfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICAvLyBrZXlzIGlzIHRoZSBjb25zdHJhaW50cyBpbiByZXZlcnNlIGFscGhhYmV0aWNhbCBvcmRlci5cbiAgLy8gVGhpcyBpcyBhIGhhY2sgc28gdGhhdDpcbiAgLy8gICAkcmVnZXggaXMgaGFuZGxlZCBiZWZvcmUgJG9wdGlvbnNcbiAgLy8gICAkbmVhclNwaGVyZSBpcyBoYW5kbGVkIGJlZm9yZSAkbWF4RGlzdGFuY2VcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhjb25zdHJhaW50KS5zb3J0KCkucmV2ZXJzZSgpO1xuICB2YXIgYW5zd2VyID0ge307XG4gIGZvciAodmFyIGtleSBvZiBrZXlzKSB7XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJyRsdCc6XG4gICAgICBjYXNlICckbHRlJzpcbiAgICAgIGNhc2UgJyRndCc6XG4gICAgICBjYXNlICckZ3RlJzpcbiAgICAgIGNhc2UgJyRleGlzdHMnOlxuICAgICAgY2FzZSAnJG5lJzpcbiAgICAgIGNhc2UgJyRlcSc6IHtcbiAgICAgICAgY29uc3QgdmFsID0gY29uc3RyYWludFtrZXldO1xuICAgICAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbC4kcmVsYXRpdmVUaW1lKSB7XG4gICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLnR5cGUgIT09ICdEYXRlJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgICAgICckcmVsYXRpdmVUaW1lIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBEYXRlIGZpZWxkJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnJGV4aXN0cyc6XG4gICAgICAgICAgICBjYXNlICckbmUnOlxuICAgICAgICAgICAgY2FzZSAnJGVxJzpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgICAgIFBhcnNlLkVycm9yLklOVkFMSURfSlNPTixcbiAgICAgICAgICAgICAgICAnJHJlbGF0aXZlVGltZSBjYW4gb25seSBiZSB1c2VkIHdpdGggdGhlICRsdCwgJGx0ZSwgJGd0LCBhbmQgJGd0ZSBvcGVyYXRvcnMnXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcGFyc2VyUmVzdWx0ID0gVXRpbHMucmVsYXRpdmVUaW1lVG9EYXRlKHZhbC4kcmVsYXRpdmVUaW1lKTtcbiAgICAgICAgICBpZiAocGFyc2VyUmVzdWx0LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICBhbnN3ZXJba2V5XSA9IHBhcnNlclJlc3VsdC5yZXN1bHQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsb2cuaW5mbygnRXJyb3Igd2hpbGUgcGFyc2luZyByZWxhdGl2ZSBkYXRlJywgcGFyc2VyUmVzdWx0KTtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgICBgYmFkICRyZWxhdGl2ZVRpbWUgKCR7a2V5fSkgdmFsdWUuICR7cGFyc2VyUmVzdWx0LmluZm99YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBhbnN3ZXJba2V5XSA9IHRyYW5zZm9ybWVyKHZhbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlICckaW4nOlxuICAgICAgY2FzZSAnJG5pbic6IHtcbiAgICAgICAgY29uc3QgYXJyID0gY29uc3RyYWludFtrZXldO1xuICAgICAgICBpZiAoIShhcnIgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLCAnYmFkICcgKyBrZXkgKyAnIHZhbHVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgYW5zd2VyW2tleV0gPSBfLmZsYXRNYXAoYXJyLCB2YWx1ZSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChhdG9tID0+IHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGF0b20pKSB7XG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAodHJhbnNmb3JtZXIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVyKGF0b20pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnJGFsbCc6IHtcbiAgICAgICAgY29uc3QgYXJyID0gY29uc3RyYWludFtrZXldO1xuICAgICAgICBpZiAoIShhcnIgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLCAnYmFkICcgKyBrZXkgKyAnIHZhbHVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgYW5zd2VyW2tleV0gPSBhcnIubWFwKHRyYW5zZm9ybUludGVyaW9yQXRvbSk7XG5cbiAgICAgICAgY29uc3QgdmFsdWVzID0gYW5zd2VyW2tleV07XG4gICAgICAgIGlmIChpc0FueVZhbHVlUmVnZXgodmFsdWVzKSAmJiAhaXNBbGxWYWx1ZXNSZWdleE9yTm9uZSh2YWx1ZXMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgICAgJ0FsbCAkYWxsIHZhbHVlcyBtdXN0IGJlIG9mIHJlZ2V4IHR5cGUgb3Igbm9uZTogJyArIHZhbHVlc1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJyRyZWdleCc6XG4gICAgICAgIHZhciBzID0gY29uc3RyYWludFtrZXldO1xuICAgICAgICBpZiAodHlwZW9mIHMgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgJ2JhZCByZWdleDogJyArIHMpO1xuICAgICAgICB9XG4gICAgICAgIGFuc3dlcltrZXldID0gcztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJyRjb250YWluZWRCeSc6IHtcbiAgICAgICAgY29uc3QgYXJyID0gY29uc3RyYWludFtrZXldO1xuICAgICAgICBpZiAoIShhcnIgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLCBgYmFkICRjb250YWluZWRCeTogc2hvdWxkIGJlIGFuIGFycmF5YCk7XG4gICAgICAgIH1cbiAgICAgICAgYW5zd2VyLiRlbGVtTWF0Y2ggPSB7XG4gICAgICAgICAgJG5pbjogYXJyLm1hcCh0cmFuc2Zvcm1lciksXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnJG9wdGlvbnMnOlxuICAgICAgICBhbnN3ZXJba2V5XSA9IGNvbnN0cmFpbnRba2V5XTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJyR0ZXh0Jzoge1xuICAgICAgICBjb25zdCBzZWFyY2ggPSBjb25zdHJhaW50W2tleV0uJHNlYXJjaDtcbiAgICAgICAgaWYgKHR5cGVvZiBzZWFyY2ggIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgYGJhZCAkdGV4dDogJHNlYXJjaCwgc2hvdWxkIGJlIG9iamVjdGApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2VhcmNoLiR0ZXJtIHx8IHR5cGVvZiBzZWFyY2guJHRlcm0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgYGJhZCAkdGV4dDogJHRlcm0sIHNob3VsZCBiZSBzdHJpbmdgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhbnN3ZXJba2V5XSA9IHtcbiAgICAgICAgICAgICRzZWFyY2g6IHNlYXJjaC4kdGVybSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWFyY2guJGxhbmd1YWdlICYmIHR5cGVvZiBzZWFyY2guJGxhbmd1YWdlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sIGBiYWQgJHRleHQ6ICRsYW5ndWFnZSwgc2hvdWxkIGJlIHN0cmluZ2ApO1xuICAgICAgICB9IGVsc2UgaWYgKHNlYXJjaC4kbGFuZ3VhZ2UpIHtcbiAgICAgICAgICBhbnN3ZXJba2V5XS4kbGFuZ3VhZ2UgPSBzZWFyY2guJGxhbmd1YWdlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWFyY2guJGNhc2VTZW5zaXRpdmUgJiYgdHlwZW9mIHNlYXJjaC4kY2FzZVNlbnNpdGl2ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgICAgYGJhZCAkdGV4dDogJGNhc2VTZW5zaXRpdmUsIHNob3VsZCBiZSBib29sZWFuYFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2VhcmNoLiRjYXNlU2Vuc2l0aXZlKSB7XG4gICAgICAgICAgYW5zd2VyW2tleV0uJGNhc2VTZW5zaXRpdmUgPSBzZWFyY2guJGNhc2VTZW5zaXRpdmU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlYXJjaC4kZGlhY3JpdGljU2Vuc2l0aXZlICYmIHR5cGVvZiBzZWFyY2guJGRpYWNyaXRpY1NlbnNpdGl2ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgICAgYGJhZCAkdGV4dDogJGRpYWNyaXRpY1NlbnNpdGl2ZSwgc2hvdWxkIGJlIGJvb2xlYW5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzZWFyY2guJGRpYWNyaXRpY1NlbnNpdGl2ZSkge1xuICAgICAgICAgIGFuc3dlcltrZXldLiRkaWFjcml0aWNTZW5zaXRpdmUgPSBzZWFyY2guJGRpYWNyaXRpY1NlbnNpdGl2ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJyRuZWFyU3BoZXJlJzoge1xuICAgICAgICBjb25zdCBwb2ludCA9IGNvbnN0cmFpbnRba2V5XTtcbiAgICAgICAgaWYgKGNvdW50KSB7XG4gICAgICAgICAgYW5zd2VyLiRnZW9XaXRoaW4gPSB7XG4gICAgICAgICAgICAkY2VudGVyU3BoZXJlOiBbW3BvaW50LmxvbmdpdHVkZSwgcG9pbnQubGF0aXR1ZGVdLCBjb25zdHJhaW50LiRtYXhEaXN0YW5jZV0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhbnN3ZXJba2V5XSA9IFtwb2ludC5sb25naXR1ZGUsIHBvaW50LmxhdGl0dWRlXTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJyRtYXhEaXN0YW5jZSc6IHtcbiAgICAgICAgaWYgKGNvdW50KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgYW5zd2VyW2tleV0gPSBjb25zdHJhaW50W2tleV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gVGhlIFNES3MgZG9uJ3Qgc2VlbSB0byB1c2UgdGhlc2UgYnV0IHRoZXkgYXJlIGRvY3VtZW50ZWQgaW4gdGhlXG4gICAgICAvLyBSRVNUIEFQSSBkb2NzLlxuICAgICAgY2FzZSAnJG1heERpc3RhbmNlSW5SYWRpYW5zJzpcbiAgICAgICAgYW5zd2VyWyckbWF4RGlzdGFuY2UnXSA9IGNvbnN0cmFpbnRba2V5XTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckbWF4RGlzdGFuY2VJbk1pbGVzJzpcbiAgICAgICAgYW5zd2VyWyckbWF4RGlzdGFuY2UnXSA9IGNvbnN0cmFpbnRba2V5XSAvIDM5NTk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJG1heERpc3RhbmNlSW5LaWxvbWV0ZXJzJzpcbiAgICAgICAgYW5zd2VyWyckbWF4RGlzdGFuY2UnXSA9IGNvbnN0cmFpbnRba2V5XSAvIDYzNzE7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICckc2VsZWN0JzpcbiAgICAgIGNhc2UgJyRkb250U2VsZWN0JzpcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgIFBhcnNlLkVycm9yLkNPTU1BTkRfVU5BVkFJTEFCTEUsXG4gICAgICAgICAgJ3RoZSAnICsga2V5ICsgJyBjb25zdHJhaW50IGlzIG5vdCBzdXBwb3J0ZWQgeWV0J1xuICAgICAgICApO1xuXG4gICAgICBjYXNlICckd2l0aGluJzpcbiAgICAgICAgdmFyIGJveCA9IGNvbnN0cmFpbnRba2V5XVsnJGJveCddO1xuICAgICAgICBpZiAoIWJveCB8fCBib3gubGVuZ3RoICE9IDIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLCAnbWFsZm9ybWF0dGVkICR3aXRoaW4gYXJnJyk7XG4gICAgICAgIH1cbiAgICAgICAgYW5zd2VyW2tleV0gPSB7XG4gICAgICAgICAgJGJveDogW1xuICAgICAgICAgICAgW2JveFswXS5sb25naXR1ZGUsIGJveFswXS5sYXRpdHVkZV0sXG4gICAgICAgICAgICBbYm94WzFdLmxvbmdpdHVkZSwgYm94WzFdLmxhdGl0dWRlXSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnJGdlb1dpdGhpbic6IHtcbiAgICAgICAgY29uc3QgcG9seWdvbiA9IGNvbnN0cmFpbnRba2V5XVsnJHBvbHlnb24nXTtcbiAgICAgICAgY29uc3QgY2VudGVyU3BoZXJlID0gY29uc3RyYWludFtrZXldWyckY2VudGVyU3BoZXJlJ107XG4gICAgICAgIGlmIChwb2x5Z29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBsZXQgcG9pbnRzO1xuICAgICAgICAgIGlmICh0eXBlb2YgcG9seWdvbiA9PT0gJ29iamVjdCcgJiYgcG9seWdvbi5fX3R5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgaWYgKCFwb2x5Z29uLmNvb3JkaW5hdGVzIHx8IHBvbHlnb24uY29vcmRpbmF0ZXMubGVuZ3RoIDwgMykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgICAgICAgICdiYWQgJGdlb1dpdGhpbiB2YWx1ZTsgUG9seWdvbi5jb29yZGluYXRlcyBzaG91bGQgY29udGFpbiBhdCBsZWFzdCAzIGxvbi9sYXQgcGFpcnMnXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb2ludHMgPSBwb2x5Z29uLmNvb3JkaW5hdGVzO1xuICAgICAgICAgIH0gZWxzZSBpZiAocG9seWdvbiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICBpZiAocG9seWdvbi5sZW5ndGggPCAzKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgICAgICAgJ2JhZCAkZ2VvV2l0aGluIHZhbHVlOyAkcG9seWdvbiBzaG91bGQgY29udGFpbiBhdCBsZWFzdCAzIEdlb1BvaW50cydcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvaW50cyA9IHBvbHlnb247XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgICAgICBcImJhZCAkZ2VvV2l0aGluIHZhbHVlOyAkcG9seWdvbiBzaG91bGQgYmUgUG9seWdvbiBvYmplY3Qgb3IgQXJyYXkgb2YgUGFyc2UuR2VvUG9pbnQnc1wiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwb2ludHMgPSBwb2ludHMubWFwKHBvaW50ID0+IHtcbiAgICAgICAgICAgIGlmIChwb2ludCBpbnN0YW5jZW9mIEFycmF5ICYmIHBvaW50Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICBQYXJzZS5HZW9Qb2ludC5fdmFsaWRhdGUocG9pbnRbMV0sIHBvaW50WzBdKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHBvaW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFHZW9Qb2ludENvZGVyLmlzVmFsaWRKU09OKHBvaW50KSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLCAnYmFkICRnZW9XaXRoaW4gdmFsdWUnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIFBhcnNlLkdlb1BvaW50Ll92YWxpZGF0ZShwb2ludC5sYXRpdHVkZSwgcG9pbnQubG9uZ2l0dWRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbcG9pbnQubG9uZ2l0dWRlLCBwb2ludC5sYXRpdHVkZV07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYW5zd2VyW2tleV0gPSB7XG4gICAgICAgICAgICAkcG9seWdvbjogcG9pbnRzLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoY2VudGVyU3BoZXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoIShjZW50ZXJTcGhlcmUgaW5zdGFuY2VvZiBBcnJheSkgfHwgY2VudGVyU3BoZXJlLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgICAgICAnYmFkICRnZW9XaXRoaW4gdmFsdWU7ICRjZW50ZXJTcGhlcmUgc2hvdWxkIGJlIGFuIGFycmF5IG9mIFBhcnNlLkdlb1BvaW50IGFuZCBkaXN0YW5jZSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEdldCBwb2ludCwgY29udmVydCB0byBnZW8gcG9pbnQgaWYgbmVjZXNzYXJ5IGFuZCB2YWxpZGF0ZVxuICAgICAgICAgIGxldCBwb2ludCA9IGNlbnRlclNwaGVyZVswXTtcbiAgICAgICAgICBpZiAocG9pbnQgaW5zdGFuY2VvZiBBcnJheSAmJiBwb2ludC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHBvaW50ID0gbmV3IFBhcnNlLkdlb1BvaW50KHBvaW50WzFdLCBwb2ludFswXSk7XG4gICAgICAgICAgfSBlbHNlIGlmICghR2VvUG9pbnRDb2Rlci5pc1ZhbGlkSlNPTihwb2ludCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgICAgICAnYmFkICRnZW9XaXRoaW4gdmFsdWU7ICRjZW50ZXJTcGhlcmUgZ2VvIHBvaW50IGludmFsaWQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBQYXJzZS5HZW9Qb2ludC5fdmFsaWRhdGUocG9pbnQubGF0aXR1ZGUsIHBvaW50LmxvbmdpdHVkZSk7XG4gICAgICAgICAgLy8gR2V0IGRpc3RhbmNlIGFuZCB2YWxpZGF0ZVxuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gY2VudGVyU3BoZXJlWzFdO1xuICAgICAgICAgIGlmIChpc05hTihkaXN0YW5jZSkgfHwgZGlzdGFuY2UgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAgIFBhcnNlLkVycm9yLklOVkFMSURfSlNPTixcbiAgICAgICAgICAgICAgJ2JhZCAkZ2VvV2l0aGluIHZhbHVlOyAkY2VudGVyU3BoZXJlIGRpc3RhbmNlIGludmFsaWQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhbnN3ZXJba2V5XSA9IHtcbiAgICAgICAgICAgICRjZW50ZXJTcGhlcmU6IFtbcG9pbnQubG9uZ2l0dWRlLCBwb2ludC5sYXRpdHVkZV0sIGRpc3RhbmNlXSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnJGdlb0ludGVyc2VjdHMnOiB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gY29uc3RyYWludFtrZXldWyckcG9pbnQnXTtcbiAgICAgICAgaWYgKCFHZW9Qb2ludENvZGVyLmlzVmFsaWRKU09OKHBvaW50KSkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgIFBhcnNlLkVycm9yLklOVkFMSURfSlNPTixcbiAgICAgICAgICAgICdiYWQgJGdlb0ludGVyc2VjdCB2YWx1ZTsgJHBvaW50IHNob3VsZCBiZSBHZW9Qb2ludCdcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIFBhcnNlLkdlb1BvaW50Ll92YWxpZGF0ZShwb2ludC5sYXRpdHVkZSwgcG9pbnQubG9uZ2l0dWRlKTtcbiAgICAgICAgfVxuICAgICAgICBhbnN3ZXJba2V5XSA9IHtcbiAgICAgICAgICAkZ2VvbWV0cnk6IHtcbiAgICAgICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgICAgICBjb29yZGluYXRlczogW3BvaW50LmxvbmdpdHVkZSwgcG9pbnQubGF0aXR1ZGVdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGtleS5tYXRjaCgvXlxcJCsvKSkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sICdiYWQgY29uc3RyYWludDogJyArIGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENhbm5vdFRyYW5zZm9ybTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFuc3dlcjtcbn1cblxuLy8gVHJhbnNmb3JtcyBhbiB1cGRhdGUgb3BlcmF0b3IgZnJvbSBSRVNUIGZvcm1hdCB0byBtb25nbyBmb3JtYXQuXG4vLyBUbyBiZSB0cmFuc2Zvcm1lZCwgdGhlIGlucHV0IHNob3VsZCBoYXZlIGFuIF9fb3AgZmllbGQuXG4vLyBJZiBmbGF0dGVuIGlzIHRydWUsIHRoaXMgd2lsbCBmbGF0dGVuIG9wZXJhdG9ycyB0byB0aGVpciBzdGF0aWNcbi8vIGRhdGEgZm9ybWF0LiBGb3IgZXhhbXBsZSwgYW4gaW5jcmVtZW50IG9mIDIgd291bGQgc2ltcGx5IGJlY29tZSBhXG4vLyAyLlxuLy8gVGhlIG91dHB1dCBmb3IgYSBub24tZmxhdHRlbmVkIG9wZXJhdG9yIGlzIGEgaGFzaCB3aXRoIF9fb3AgYmVpbmdcbi8vIHRoZSBtb25nbyBvcCwgYW5kIGFyZyBiZWluZyB0aGUgYXJndW1lbnQuXG4vLyBUaGUgb3V0cHV0IGZvciBhIGZsYXR0ZW5lZCBvcGVyYXRvciBpcyBqdXN0IGEgdmFsdWUuXG4vLyBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGlzIHNob3VsZCBiZSBhIG5vLW9wLlxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1VcGRhdGVPcGVyYXRvcih7IF9fb3AsIGFtb3VudCwgb2JqZWN0cyB9LCBmbGF0dGVuKSB7XG4gIHN3aXRjaCAoX19vcCkge1xuICAgIGNhc2UgJ0RlbGV0ZSc6XG4gICAgICBpZiAoZmxhdHRlbikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHsgX19vcDogJyR1bnNldCcsIGFyZzogJycgfTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ0luY3JlbWVudCc6XG4gICAgICBpZiAodHlwZW9mIGFtb3VudCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgJ2luY3JlbWVudGluZyBtdXN0IHByb3ZpZGUgYSBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIGlmIChmbGF0dGVuKSB7XG4gICAgICAgIHJldHVybiBhbW91bnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4geyBfX29wOiAnJGluYycsIGFyZzogYW1vdW50IH07XG4gICAgICB9XG5cbiAgICBjYXNlICdTZXRPbkluc2VydCc6XG4gICAgICBpZiAoZmxhdHRlbikge1xuICAgICAgICByZXR1cm4gYW1vdW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHsgX19vcDogJyRzZXRPbkluc2VydCcsIGFyZzogYW1vdW50IH07XG4gICAgICB9XG5cbiAgICBjYXNlICdBZGQnOlxuICAgIGNhc2UgJ0FkZFVuaXF1ZSc6XG4gICAgICBpZiAoIShvYmplY3RzIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sICdvYmplY3RzIHRvIGFkZCBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgICB9XG4gICAgICB2YXIgdG9BZGQgPSBvYmplY3RzLm1hcCh0cmFuc2Zvcm1JbnRlcmlvckF0b20pO1xuICAgICAgaWYgKGZsYXR0ZW4pIHtcbiAgICAgICAgcmV0dXJuIHRvQWRkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG1vbmdvT3AgPSB7XG4gICAgICAgICAgQWRkOiAnJHB1c2gnLFxuICAgICAgICAgIEFkZFVuaXF1ZTogJyRhZGRUb1NldCcsXG4gICAgICAgIH1bX19vcF07XG4gICAgICAgIHJldHVybiB7IF9fb3A6IG1vbmdvT3AsIGFyZzogeyAkZWFjaDogdG9BZGQgfSB9O1xuICAgICAgfVxuXG4gICAgY2FzZSAnUmVtb3ZlJzpcbiAgICAgIGlmICghKG9iamVjdHMgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgJ29iamVjdHMgdG8gcmVtb3ZlIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICAgIH1cbiAgICAgIHZhciB0b1JlbW92ZSA9IG9iamVjdHMubWFwKHRyYW5zZm9ybUludGVyaW9yQXRvbSk7XG4gICAgICBpZiAoZmxhdHRlbikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4geyBfX29wOiAnJHB1bGxBbGwnLCBhcmc6IHRvUmVtb3ZlIH07XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5DT01NQU5EX1VOQVZBSUxBQkxFLFxuICAgICAgICBgVGhlICR7X19vcH0gb3BlcmF0b3IgaXMgbm90IHN1cHBvcnRlZCB5ZXQuYFxuICAgICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gbWFwVmFsdWVzKG9iamVjdCwgaXRlcmF0b3IpIHtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIE9iamVjdC5rZXlzKG9iamVjdCkuZm9yRWFjaChrZXkgPT4ge1xuICAgIHJlc3VsdFtrZXldID0gaXRlcmF0b3Iob2JqZWN0W2tleV0pO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3QgbmVzdGVkTW9uZ29PYmplY3RUb05lc3RlZFBhcnNlT2JqZWN0ID0gbW9uZ29PYmplY3QgPT4ge1xuICBzd2l0Y2ggKHR5cGVvZiBtb25nb09iamVjdCkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgcmV0dXJuIG1vbmdvT2JqZWN0O1xuICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgdGhyb3cgJ2JhZCB2YWx1ZSBpbiBuZXN0ZWRNb25nb09iamVjdFRvTmVzdGVkUGFyc2VPYmplY3QnO1xuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICBpZiAobW9uZ29PYmplY3QgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAobW9uZ29PYmplY3QgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICByZXR1cm4gbW9uZ29PYmplY3QubWFwKG5lc3RlZE1vbmdvT2JqZWN0VG9OZXN0ZWRQYXJzZU9iamVjdCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb25nb09iamVjdCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgcmV0dXJuIFBhcnNlLl9lbmNvZGUobW9uZ29PYmplY3QpO1xuICAgICAgfVxuXG4gICAgICBpZiAobW9uZ29PYmplY3QgaW5zdGFuY2VvZiBtb25nb2RiLkxvbmcpIHtcbiAgICAgICAgcmV0dXJuIG1vbmdvT2JqZWN0LnRvTnVtYmVyKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb25nb09iamVjdCBpbnN0YW5jZW9mIG1vbmdvZGIuRG91YmxlKSB7XG4gICAgICAgIHJldHVybiBtb25nb09iamVjdC52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKEJ5dGVzQ29kZXIuaXNWYWxpZERhdGFiYXNlT2JqZWN0KG1vbmdvT2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gQnl0ZXNDb2Rlci5kYXRhYmFzZVRvSlNPTihtb25nb09iamVjdCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vbmdvT2JqZWN0LCAnX190eXBlJykgJiZcbiAgICAgICAgbW9uZ29PYmplY3QuX190eXBlID09ICdEYXRlJyAmJlxuICAgICAgICBtb25nb09iamVjdC5pc28gaW5zdGFuY2VvZiBEYXRlXG4gICAgICApIHtcbiAgICAgICAgbW9uZ29PYmplY3QuaXNvID0gbW9uZ29PYmplY3QuaXNvLnRvSlNPTigpO1xuICAgICAgICByZXR1cm4gbW9uZ29PYmplY3Q7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXBWYWx1ZXMobW9uZ29PYmplY3QsIG5lc3RlZE1vbmdvT2JqZWN0VG9OZXN0ZWRQYXJzZU9iamVjdCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93ICd1bmtub3duIGpzIHR5cGUnO1xuICB9XG59O1xuXG5jb25zdCB0cmFuc2Zvcm1Qb2ludGVyU3RyaW5nID0gKHNjaGVtYSwgZmllbGQsIHBvaW50ZXJTdHJpbmcpID0+IHtcbiAgY29uc3Qgb2JqRGF0YSA9IHBvaW50ZXJTdHJpbmcuc3BsaXQoJyQnKTtcbiAgaWYgKG9iakRhdGFbMF0gIT09IHNjaGVtYS5maWVsZHNbZmllbGRdLnRhcmdldENsYXNzKSB7XG4gICAgdGhyb3cgJ3BvaW50ZXIgdG8gaW5jb3JyZWN0IGNsYXNzTmFtZSc7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBfX3R5cGU6ICdQb2ludGVyJyxcbiAgICBjbGFzc05hbWU6IG9iakRhdGFbMF0sXG4gICAgb2JqZWN0SWQ6IG9iakRhdGFbMV0sXG4gIH07XG59O1xuXG4vLyBDb252ZXJ0cyBmcm9tIGEgbW9uZ28tZm9ybWF0IG9iamVjdCB0byBhIFJFU1QtZm9ybWF0IG9iamVjdC5cbi8vIERvZXMgbm90IHN0cmlwIG91dCBhbnl0aGluZyBiYXNlZCBvbiBhIGxhY2sgb2YgYXV0aGVudGljYXRpb24uXG5jb25zdCBtb25nb09iamVjdFRvUGFyc2VPYmplY3QgPSAoY2xhc3NOYW1lLCBtb25nb09iamVjdCwgc2NoZW1hKSA9PiB7XG4gIHN3aXRjaCAodHlwZW9mIG1vbmdvT2JqZWN0KSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICByZXR1cm4gbW9uZ29PYmplY3Q7XG4gICAgY2FzZSAnc3ltYm9sJzpcbiAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICB0aHJvdyAnYmFkIHZhbHVlIGluIG1vbmdvT2JqZWN0VG9QYXJzZU9iamVjdCc7XG4gICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgaWYgKG1vbmdvT2JqZWN0ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKG1vbmdvT2JqZWN0IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIG1vbmdvT2JqZWN0Lm1hcChuZXN0ZWRNb25nb09iamVjdFRvTmVzdGVkUGFyc2VPYmplY3QpO1xuICAgICAgfVxuXG4gICAgICBpZiAobW9uZ29PYmplY3QgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiBQYXJzZS5fZW5jb2RlKG1vbmdvT2JqZWN0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vbmdvT2JqZWN0IGluc3RhbmNlb2YgbW9uZ29kYi5Mb25nKSB7XG4gICAgICAgIHJldHVybiBtb25nb09iamVjdC50b051bWJlcigpO1xuICAgICAgfVxuXG4gICAgICBpZiAobW9uZ29PYmplY3QgaW5zdGFuY2VvZiBtb25nb2RiLkRvdWJsZSkge1xuICAgICAgICByZXR1cm4gbW9uZ29PYmplY3QudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChCeXRlc0NvZGVyLmlzVmFsaWREYXRhYmFzZU9iamVjdChtb25nb09iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIEJ5dGVzQ29kZXIuZGF0YWJhc2VUb0pTT04obW9uZ29PYmplY3QpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN0T2JqZWN0ID0ge307XG4gICAgICBpZiAobW9uZ29PYmplY3QuX3JwZXJtIHx8IG1vbmdvT2JqZWN0Ll93cGVybSkge1xuICAgICAgICByZXN0T2JqZWN0Ll9ycGVybSA9IG1vbmdvT2JqZWN0Ll9ycGVybSB8fCBbXTtcbiAgICAgICAgcmVzdE9iamVjdC5fd3Blcm0gPSBtb25nb09iamVjdC5fd3Blcm0gfHwgW107XG4gICAgICAgIGRlbGV0ZSBtb25nb09iamVjdC5fcnBlcm07XG4gICAgICAgIGRlbGV0ZSBtb25nb09iamVjdC5fd3Blcm07XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBtb25nb09iamVjdCkge1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgIGNhc2UgJ19pZCc6XG4gICAgICAgICAgICByZXN0T2JqZWN0WydvYmplY3RJZCddID0gJycgKyBtb25nb09iamVjdFtrZXldO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnX2hhc2hlZF9wYXNzd29yZCc6XG4gICAgICAgICAgICByZXN0T2JqZWN0Ll9oYXNoZWRfcGFzc3dvcmQgPSBtb25nb09iamVjdFtrZXldO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnX2FjbCc6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdfZW1haWxfdmVyaWZ5X3Rva2VuJzpcbiAgICAgICAgICBjYXNlICdfcGVyaXNoYWJsZV90b2tlbic6XG4gICAgICAgICAgY2FzZSAnX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdCc6XG4gICAgICAgICAgY2FzZSAnX3Bhc3N3b3JkX2NoYW5nZWRfYXQnOlxuICAgICAgICAgIGNhc2UgJ190b21ic3RvbmUnOlxuICAgICAgICAgIGNhc2UgJ19lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCc6XG4gICAgICAgICAgY2FzZSAnX2FjY291bnRfbG9ja291dF9leHBpcmVzX2F0JzpcbiAgICAgICAgICBjYXNlICdfZmFpbGVkX2xvZ2luX2NvdW50JzpcbiAgICAgICAgICBjYXNlICdfcGFzc3dvcmRfaGlzdG9yeSc6XG4gICAgICAgICAgICAvLyBUaG9zZSBrZXlzIHdpbGwgYmUgZGVsZXRlZCBpZiBuZWVkZWQgaW4gdGhlIERCIENvbnRyb2xsZXJcbiAgICAgICAgICAgIHJlc3RPYmplY3Rba2V5XSA9IG1vbmdvT2JqZWN0W2tleV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdfc2Vzc2lvbl90b2tlbic6XG4gICAgICAgICAgICByZXN0T2JqZWN0WydzZXNzaW9uVG9rZW4nXSA9IG1vbmdvT2JqZWN0W2tleV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICd1cGRhdGVkQXQnOlxuICAgICAgICAgIGNhc2UgJ191cGRhdGVkX2F0JzpcbiAgICAgICAgICAgIHJlc3RPYmplY3RbJ3VwZGF0ZWRBdCddID0gUGFyc2UuX2VuY29kZShuZXcgRGF0ZShtb25nb09iamVjdFtrZXldKSkuaXNvO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnY3JlYXRlZEF0JzpcbiAgICAgICAgICBjYXNlICdfY3JlYXRlZF9hdCc6XG4gICAgICAgICAgICByZXN0T2JqZWN0WydjcmVhdGVkQXQnXSA9IFBhcnNlLl9lbmNvZGUobmV3IERhdGUobW9uZ29PYmplY3Rba2V5XSkpLmlzbztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2V4cGlyZXNBdCc6XG4gICAgICAgICAgY2FzZSAnX2V4cGlyZXNBdCc6XG4gICAgICAgICAgICByZXN0T2JqZWN0WydleHBpcmVzQXQnXSA9IFBhcnNlLl9lbmNvZGUobmV3IERhdGUobW9uZ29PYmplY3Rba2V5XSkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnbGFzdFVzZWQnOlxuICAgICAgICAgIGNhc2UgJ19sYXN0X3VzZWQnOlxuICAgICAgICAgICAgcmVzdE9iamVjdFsnbGFzdFVzZWQnXSA9IFBhcnNlLl9lbmNvZGUobmV3IERhdGUobW9uZ29PYmplY3Rba2V5XSkpLmlzbztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3RpbWVzVXNlZCc6XG4gICAgICAgICAgY2FzZSAndGltZXNfdXNlZCc6XG4gICAgICAgICAgICByZXN0T2JqZWN0Wyd0aW1lc1VzZWQnXSA9IG1vbmdvT2JqZWN0W2tleV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdhdXRoRGF0YSc6XG4gICAgICAgICAgICBpZiAoY2xhc3NOYW1lID09PSAnX1VzZXInKSB7XG4gICAgICAgICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgICAgICAgICdpZ25vcmluZyBhdXRoRGF0YSBpbiBfVXNlciBhcyB0aGlzIGtleSBpcyByZXNlcnZlZCB0byBiZSBzeW50aGVzaXplZCBvZiBgX2F1dGhfZGF0YV8qYCBrZXlzJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzdE9iamVjdFsnYXV0aERhdGEnXSA9IG1vbmdvT2JqZWN0W2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gQ2hlY2sgb3RoZXIgYXV0aCBkYXRhIGtleXNcbiAgICAgICAgICAgIHZhciBhdXRoRGF0YU1hdGNoID0ga2V5Lm1hdGNoKC9eX2F1dGhfZGF0YV8oW2EtekEtWjAtOV9dKykkLyk7XG4gICAgICAgICAgICBpZiAoYXV0aERhdGFNYXRjaCAmJiBjbGFzc05hbWUgPT09ICdfVXNlcicpIHtcbiAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gYXV0aERhdGFNYXRjaFsxXTtcbiAgICAgICAgICAgICAgcmVzdE9iamVjdFsnYXV0aERhdGEnXSA9IHJlc3RPYmplY3RbJ2F1dGhEYXRhJ10gfHwge307XG4gICAgICAgICAgICAgIHJlc3RPYmplY3RbJ2F1dGhEYXRhJ11bcHJvdmlkZXJdID0gbW9uZ29PYmplY3Rba2V5XTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZignX3BfJykgPT0gMCkge1xuICAgICAgICAgICAgICB2YXIgbmV3S2V5ID0ga2V5LnN1YnN0cmluZygzKTtcbiAgICAgICAgICAgICAgaWYgKCFzY2hlbWEuZmllbGRzW25ld0tleV0pIHtcbiAgICAgICAgICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICAgICAgICAgICd0cmFuc2Zvcm0uanMnLFxuICAgICAgICAgICAgICAgICAgJ0ZvdW5kIGEgcG9pbnRlciBjb2x1bW4gbm90IGluIHRoZSBzY2hlbWEsIGRyb3BwaW5nIGl0LicsXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICBuZXdLZXlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzY2hlbWEuZmllbGRzW25ld0tleV0udHlwZSAhPT0gJ1BvaW50ZXInKSB7XG4gICAgICAgICAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgICAgICAgICAndHJhbnNmb3JtLmpzJyxcbiAgICAgICAgICAgICAgICAgICdGb3VuZCBhIHBvaW50ZXIgaW4gYSBub24tcG9pbnRlciBjb2x1bW4sIGRyb3BwaW5nIGl0LicsXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChtb25nb09iamVjdFtrZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzdE9iamVjdFtuZXdLZXldID0gdHJhbnNmb3JtUG9pbnRlclN0cmluZyhzY2hlbWEsIG5ld0tleSwgbW9uZ29PYmplY3Rba2V5XSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlbMF0gPT0gJ18nICYmIGtleSAhPSAnX190eXBlJykge1xuICAgICAgICAgICAgICB0aHJvdyAnYmFkIGtleSBpbiB1bnRyYW5zZm9ybTogJyArIGtleTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG1vbmdvT2JqZWN0W2tleV07XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBzY2hlbWEuZmllbGRzW2tleV0gJiZcbiAgICAgICAgICAgICAgICBzY2hlbWEuZmllbGRzW2tleV0udHlwZSA9PT0gJ0ZpbGUnICYmXG4gICAgICAgICAgICAgICAgRmlsZUNvZGVyLmlzVmFsaWREYXRhYmFzZU9iamVjdCh2YWx1ZSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmVzdE9iamVjdFtrZXldID0gRmlsZUNvZGVyLmRhdGFiYXNlVG9KU09OKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgc2NoZW1hLmZpZWxkc1trZXldICYmXG4gICAgICAgICAgICAgICAgc2NoZW1hLmZpZWxkc1trZXldLnR5cGUgPT09ICdHZW9Qb2ludCcgJiZcbiAgICAgICAgICAgICAgICBHZW9Qb2ludENvZGVyLmlzVmFsaWREYXRhYmFzZU9iamVjdCh2YWx1ZSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmVzdE9iamVjdFtrZXldID0gR2VvUG9pbnRDb2Rlci5kYXRhYmFzZVRvSlNPTih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNjaGVtYS5maWVsZHNba2V5XSAmJlxuICAgICAgICAgICAgICAgIHNjaGVtYS5maWVsZHNba2V5XS50eXBlID09PSAnUG9seWdvbicgJiZcbiAgICAgICAgICAgICAgICBQb2x5Z29uQ29kZXIuaXNWYWxpZERhdGFiYXNlT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXN0T2JqZWN0W2tleV0gPSBQb2x5Z29uQ29kZXIuZGF0YWJhc2VUb0pTT04odmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBzY2hlbWEuZmllbGRzW2tleV0gJiZcbiAgICAgICAgICAgICAgICBzY2hlbWEuZmllbGRzW2tleV0udHlwZSA9PT0gJ0J5dGVzJyAmJlxuICAgICAgICAgICAgICAgIEJ5dGVzQ29kZXIuaXNWYWxpZERhdGFiYXNlT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXN0T2JqZWN0W2tleV0gPSBCeXRlc0NvZGVyLmRhdGFiYXNlVG9KU09OKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdE9iamVjdFtrZXldID0gbmVzdGVkTW9uZ29PYmplY3RUb05lc3RlZFBhcnNlT2JqZWN0KG1vbmdvT2JqZWN0W2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbGF0aW9uRmllbGROYW1lcyA9IE9iamVjdC5rZXlzKHNjaGVtYS5maWVsZHMpLmZpbHRlcihcbiAgICAgICAgZmllbGROYW1lID0+IHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS50eXBlID09PSAnUmVsYXRpb24nXG4gICAgICApO1xuICAgICAgY29uc3QgcmVsYXRpb25GaWVsZHMgPSB7fTtcbiAgICAgIHJlbGF0aW9uRmllbGROYW1lcy5mb3JFYWNoKHJlbGF0aW9uRmllbGROYW1lID0+IHtcbiAgICAgICAgcmVsYXRpb25GaWVsZHNbcmVsYXRpb25GaWVsZE5hbWVdID0ge1xuICAgICAgICAgIF9fdHlwZTogJ1JlbGF0aW9uJyxcbiAgICAgICAgICBjbGFzc05hbWU6IHNjaGVtYS5maWVsZHNbcmVsYXRpb25GaWVsZE5hbWVdLnRhcmdldENsYXNzLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7IC4uLnJlc3RPYmplY3QsIC4uLnJlbGF0aW9uRmllbGRzIH07XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyAndW5rbm93biBqcyB0eXBlJztcbiAgfVxufTtcblxudmFyIERhdGVDb2RlciA9IHtcbiAgSlNPTlRvRGF0YWJhc2UoanNvbikge1xuICAgIHJldHVybiBuZXcgRGF0ZShqc29uLmlzbyk7XG4gIH0sXG5cbiAgaXNWYWxpZEpTT04odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZS5fX3R5cGUgPT09ICdEYXRlJztcbiAgfSxcbn07XG5cbnZhciBCeXRlc0NvZGVyID0ge1xuICBiYXNlNjRQYXR0ZXJuOiBuZXcgUmVnRXhwKCdeKD86W0EtWmEtejAtOSsvXXs0fSkqKD86W0EtWmEtejAtOSsvXXsyfT09fFtBLVphLXowLTkrL117M309KT8kJyksXG4gIGlzQmFzZTY0VmFsdWUob2JqZWN0KSB7XG4gICAgaWYgKHR5cGVvZiBvYmplY3QgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhc2U2NFBhdHRlcm4udGVzdChvYmplY3QpO1xuICB9LFxuXG4gIGRhdGFiYXNlVG9KU09OKG9iamVjdCkge1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAodGhpcy5pc0Jhc2U2NFZhbHVlKG9iamVjdCkpIHtcbiAgICAgIHZhbHVlID0gb2JqZWN0O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IG9iamVjdC5idWZmZXIudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiAnQnl0ZXMnLFxuICAgICAgYmFzZTY0OiB2YWx1ZSxcbiAgICB9O1xuICB9LFxuXG4gIGlzVmFsaWREYXRhYmFzZU9iamVjdChvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgbW9uZ29kYi5CaW5hcnkgfHwgdGhpcy5pc0Jhc2U2NFZhbHVlKG9iamVjdCk7XG4gIH0sXG5cbiAgSlNPTlRvRGF0YWJhc2UoanNvbikge1xuICAgIHJldHVybiBuZXcgbW9uZ29kYi5CaW5hcnkoQnVmZmVyLmZyb20oanNvbi5iYXNlNjQsICdiYXNlNjQnKSk7XG4gIH0sXG5cbiAgaXNWYWxpZEpTT04odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZS5fX3R5cGUgPT09ICdCeXRlcyc7XG4gIH0sXG59O1xuXG52YXIgR2VvUG9pbnRDb2RlciA9IHtcbiAgZGF0YWJhc2VUb0pTT04ob2JqZWN0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogJ0dlb1BvaW50JyxcbiAgICAgIGxhdGl0dWRlOiBvYmplY3RbMV0sXG4gICAgICBsb25naXR1ZGU6IG9iamVjdFswXSxcbiAgICB9O1xuICB9LFxuXG4gIGlzVmFsaWREYXRhYmFzZU9iamVjdChvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgQXJyYXkgJiYgb2JqZWN0Lmxlbmd0aCA9PSAyO1xuICB9LFxuXG4gIEpTT05Ub0RhdGFiYXNlKGpzb24pIHtcbiAgICByZXR1cm4gW2pzb24ubG9uZ2l0dWRlLCBqc29uLmxhdGl0dWRlXTtcbiAgfSxcblxuICBpc1ZhbGlkSlNPTih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlLl9fdHlwZSA9PT0gJ0dlb1BvaW50JztcbiAgfSxcbn07XG5cbnZhciBQb2x5Z29uQ29kZXIgPSB7XG4gIGRhdGFiYXNlVG9KU09OKG9iamVjdCkge1xuICAgIC8vIENvbnZlcnQgbG5nL2xhdCAtPiBsYXQvbG5nXG4gICAgY29uc3QgY29vcmRzID0gb2JqZWN0LmNvb3JkaW5hdGVzWzBdLm1hcChjb29yZCA9PiB7XG4gICAgICByZXR1cm4gW2Nvb3JkWzFdLCBjb29yZFswXV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogJ1BvbHlnb24nLFxuICAgICAgY29vcmRpbmF0ZXM6IGNvb3JkcyxcbiAgICB9O1xuICB9LFxuXG4gIGlzVmFsaWREYXRhYmFzZU9iamVjdChvYmplY3QpIHtcbiAgICBjb25zdCBjb29yZHMgPSBvYmplY3QuY29vcmRpbmF0ZXNbMF07XG4gICAgaWYgKG9iamVjdC50eXBlICE9PSAnUG9seWdvbicgfHwgIShjb29yZHMgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBvaW50ID0gY29vcmRzW2ldO1xuICAgICAgaWYgKCFHZW9Qb2ludENvZGVyLmlzVmFsaWREYXRhYmFzZU9iamVjdChwb2ludCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgUGFyc2UuR2VvUG9pbnQuX3ZhbGlkYXRlKHBhcnNlRmxvYXQocG9pbnRbMV0pLCBwYXJzZUZsb2F0KHBvaW50WzBdKSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuXG4gIEpTT05Ub0RhdGFiYXNlKGpzb24pIHtcbiAgICBsZXQgY29vcmRzID0ganNvbi5jb29yZGluYXRlcztcbiAgICAvLyBBZGQgZmlyc3QgcG9pbnQgdG8gdGhlIGVuZCB0byBjbG9zZSBwb2x5Z29uXG4gICAgaWYgKFxuICAgICAgY29vcmRzWzBdWzBdICE9PSBjb29yZHNbY29vcmRzLmxlbmd0aCAtIDFdWzBdIHx8XG4gICAgICBjb29yZHNbMF1bMV0gIT09IGNvb3Jkc1tjb29yZHMubGVuZ3RoIC0gMV1bMV1cbiAgICApIHtcbiAgICAgIGNvb3Jkcy5wdXNoKGNvb3Jkc1swXSk7XG4gICAgfVxuICAgIGNvbnN0IHVuaXF1ZSA9IGNvb3Jkcy5maWx0ZXIoKGl0ZW0sIGluZGV4LCBhcikgPT4ge1xuICAgICAgbGV0IGZvdW5kSW5kZXggPSAtMTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3QgcHQgPSBhcltpXTtcbiAgICAgICAgaWYgKHB0WzBdID09PSBpdGVtWzBdICYmIHB0WzFdID09PSBpdGVtWzFdKSB7XG4gICAgICAgICAgZm91bmRJbmRleCA9IGk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmb3VuZEluZGV4ID09PSBpbmRleDtcbiAgICB9KTtcbiAgICBpZiAodW5pcXVlLmxlbmd0aCA8IDMpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgUGFyc2UuRXJyb3IuSU5URVJOQUxfU0VSVkVSX0VSUk9SLFxuICAgICAgICAnR2VvSlNPTjogTG9vcCBtdXN0IGhhdmUgYXQgbGVhc3QgMyBkaWZmZXJlbnQgdmVydGljZXMnXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBDb252ZXJ0IGxhdC9sb25nIC0+IGxvbmcvbGF0XG4gICAgY29vcmRzID0gY29vcmRzLm1hcChjb29yZCA9PiB7XG4gICAgICByZXR1cm4gW2Nvb3JkWzFdLCBjb29yZFswXV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgdHlwZTogJ1BvbHlnb24nLCBjb29yZGluYXRlczogW2Nvb3Jkc10gfTtcbiAgfSxcblxuICBpc1ZhbGlkSlNPTih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlLl9fdHlwZSA9PT0gJ1BvbHlnb24nO1xuICB9LFxufTtcblxudmFyIEZpbGVDb2RlciA9IHtcbiAgZGF0YWJhc2VUb0pTT04ob2JqZWN0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogJ0ZpbGUnLFxuICAgICAgbmFtZTogb2JqZWN0LFxuICAgIH07XG4gIH0sXG5cbiAgaXNWYWxpZERhdGFiYXNlT2JqZWN0KG9iamVjdCkge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnc3RyaW5nJztcbiAgfSxcblxuICBKU09OVG9EYXRhYmFzZShqc29uKSB7XG4gICAgcmV0dXJuIGpzb24ubmFtZTtcbiAgfSxcblxuICBpc1ZhbGlkSlNPTih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlLl9fdHlwZSA9PT0gJ0ZpbGUnO1xuICB9LFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHRyYW5zZm9ybUtleSxcbiAgcGFyc2VPYmplY3RUb01vbmdvT2JqZWN0Rm9yQ3JlYXRlLFxuICB0cmFuc2Zvcm1VcGRhdGUsXG4gIHRyYW5zZm9ybVdoZXJlLFxuICBtb25nb09iamVjdFRvUGFyc2VPYmplY3QsXG4gIHRyYW5zZm9ybUNvbnN0cmFpbnQsXG4gIHRyYW5zZm9ybVBvaW50ZXJTdHJpbmcsXG59O1xuIl0sIm1hcHBpbmdzIjoiOztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUF1QixTQUFBRCx1QkFBQUcsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQUN2QixJQUFJRyxPQUFPLEdBQUdMLE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFDaEMsSUFBSU0sS0FBSyxHQUFHTixPQUFPLENBQUMsWUFBWSxDQUFDLENBQUNNLEtBQUs7QUFDdkMsTUFBTUMsS0FBSyxHQUFHUCxPQUFPLENBQUMsZ0JBQWdCLENBQUM7QUFFdkMsTUFBTVEsWUFBWSxHQUFHQSxDQUFDQyxTQUFTLEVBQUVDLFNBQVMsRUFBRUMsTUFBTSxLQUFLO0VBQ3JEO0VBQ0EsUUFBUUQsU0FBUztJQUNmLEtBQUssVUFBVTtNQUNiLE9BQU8sS0FBSztJQUNkLEtBQUssV0FB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