@nlabs/reaktor 1.16.0 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +186 -0
  2. package/docs/ASSISTANT.md +138 -0
  3. package/docs/GENERATION.md +29 -2
  4. package/docs/NATIVE_PUSH.md +56 -0
  5. package/lib/actions/alfredFaq.d.ts +80 -0
  6. package/lib/actions/alfredFaq.js +206 -0
  7. package/lib/actions/contentGeneration.d.ts +4 -1
  8. package/lib/actions/contentGeneration.js +83 -27
  9. package/lib/actions/contentGenerationErrors.js +1 -1
  10. package/lib/actions/conversations.d.ts +1 -1
  11. package/lib/actions/conversations.js +19 -9
  12. package/lib/actions/crud.js +26 -1
  13. package/lib/actions/index.d.ts +2 -0
  14. package/lib/actions/index.js +3 -1
  15. package/lib/actions/messages.js +23 -7
  16. package/lib/actions/phoneSupport.d.ts +18 -0
  17. package/lib/actions/phoneSupport.js +170 -0
  18. package/lib/actions/users.js +57 -4
  19. package/lib/assistant/core.d.ts +53 -0
  20. package/lib/assistant/core.js +123 -0
  21. package/lib/assistant/faq.d.ts +26 -0
  22. package/lib/assistant/faq.js +238 -0
  23. package/lib/assistant/faqCore.d.ts +23 -0
  24. package/lib/assistant/faqCore.js +20 -0
  25. package/lib/assistant/index.d.ts +7 -0
  26. package/lib/assistant/index.js +5 -0
  27. package/lib/assistant/service.d.ts +35 -0
  28. package/lib/assistant/service.js +201 -0
  29. package/lib/config.js +3 -2
  30. package/lib/durableChat/conversations.d.ts +62 -0
  31. package/lib/durableChat/conversations.js +729 -0
  32. package/lib/durableChat/errors.d.ts +6 -0
  33. package/lib/durableChat/errors.js +11 -0
  34. package/lib/durableChat/events.d.ts +22 -0
  35. package/lib/durableChat/events.js +50 -0
  36. package/lib/durableChat/index.d.ts +8 -0
  37. package/lib/durableChat/index.js +10 -0
  38. package/lib/durableChat/membership.d.ts +24 -0
  39. package/lib/durableChat/membership.js +85 -0
  40. package/lib/durableChat/messageTypes.d.ts +76 -0
  41. package/lib/durableChat/messageTypes.js +3 -0
  42. package/lib/durableChat/messages.d.ts +16 -0
  43. package/lib/durableChat/messages.js +257 -0
  44. package/lib/durableChat/transaction.d.ts +10 -0
  45. package/lib/durableChat/transaction.js +53 -0
  46. package/lib/durableChat/types.d.ts +81 -0
  47. package/lib/durableChat/types.js +3 -0
  48. package/lib/index.d.ts +4 -4
  49. package/lib/index.js +5 -3
  50. package/lib/lambdas/actions/websockets.js +4 -4
  51. package/lib/nativePush/graphql.d.ts +14 -0
  52. package/lib/nativePush/graphql.js +105 -0
  53. package/lib/nativePush/index.d.ts +7 -0
  54. package/lib/nativePush/index.js +9 -0
  55. package/lib/nativePush/migrations.d.ts +2 -0
  56. package/lib/nativePush/migrations.js +36 -0
  57. package/lib/nativePush/nativePushContract.fixture.d.ts +22 -0
  58. package/lib/nativePush/nativePushContract.fixture.js +27 -0
  59. package/lib/nativePush/payload.d.ts +2 -0
  60. package/lib/nativePush/payload.js +106 -0
  61. package/lib/nativePush/repository.d.ts +9 -0
  62. package/lib/nativePush/repository.js +120 -0
  63. package/lib/nativePush/service.d.ts +2 -0
  64. package/lib/nativePush/service.js +110 -0
  65. package/lib/nativePush/snsProvider.d.ts +17 -0
  66. package/lib/nativePush/snsProvider.js +165 -0
  67. package/lib/nativePush/types.d.ts +89 -0
  68. package/lib/nativePush/types.js +3 -0
  69. package/lib/organizations/accountLifecycle.d.ts +7 -0
  70. package/lib/organizations/accountLifecycle.js +106 -0
  71. package/lib/organizations/authorization.d.ts +9 -0
  72. package/lib/organizations/authorization.js +40 -0
  73. package/lib/organizations/billing.d.ts +38 -0
  74. package/lib/organizations/billing.js +277 -0
  75. package/lib/organizations/billingProvider.d.ts +4 -0
  76. package/lib/organizations/billingProvider.js +287 -0
  77. package/lib/organizations/billingUpdates.d.ts +9 -0
  78. package/lib/organizations/billingUpdates.js +388 -0
  79. package/lib/organizations/index.d.ts +10 -0
  80. package/lib/organizations/index.js +12 -0
  81. package/lib/organizations/mail.d.ts +10 -0
  82. package/lib/organizations/mail.js +60 -0
  83. package/lib/organizations/memberDirectory.d.ts +15 -0
  84. package/lib/organizations/memberDirectory.js +28 -0
  85. package/lib/organizations/membership.d.ts +19 -0
  86. package/lib/organizations/membership.js +248 -0
  87. package/lib/organizations/passwordRecovery.d.ts +9 -0
  88. package/lib/organizations/passwordRecovery.js +50 -0
  89. package/lib/organizations/plans.d.ts +6 -0
  90. package/lib/organizations/plans.js +40 -0
  91. package/lib/organizations/providerPagination.d.ts +6 -0
  92. package/lib/organizations/providerPagination.js +23 -0
  93. package/lib/organizations/reconciliation.d.ts +11 -0
  94. package/lib/organizations/reconciliation.js +400 -0
  95. package/lib/organizations/signup.d.ts +25 -0
  96. package/lib/organizations/signup.js +169 -0
  97. package/lib/organizations/store.d.ts +25 -0
  98. package/lib/organizations/store.js +167 -0
  99. package/lib/organizations/types.d.ts +138 -0
  100. package/lib/organizations/types.js +3 -0
  101. package/lib/organizations/verification.d.ts +3 -0
  102. package/lib/organizations/verification.js +51 -0
  103. package/package.json +16 -3
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
3
3
  * All rights reserved. Use is subject to the accompanying commercial LICENSE.
4
- */ import { cloneDeep } from '@nlabs/utils/objects/clone';
4
+ */ /* eslint no-underscore-dangle: ["error", {"allow": ["_id", "_key"]}] -- ArangoDB document identity fields. */ import { cloneDeep } from '@nlabs/utils/objects/clone';
5
5
  import { createHash, parseId } from '@nlabs/utils/parsers/strings';
6
6
  import { aql } from 'arangojs';
7
7
  import { literal } from 'arangojs/aql';
@@ -79,6 +79,7 @@ export const getConversationListByUser = (context, userId, options)=>{
79
79
  const userDocId = `users/${userId}`;
80
80
  const aqlQry = aql`
81
81
  FOR c, e IN 1..1 OUTBOUND ${userDocId} ${hasConversationCollection}
82
+ FILTER c.chatSchemaVersion != 1
82
83
  SORT c.added DESC
83
84
  ${literal(limit.aql)}
84
85
  LET users = (
@@ -113,7 +114,7 @@ export const getDirectConversation = async (context, { fromId, toId, toUser })=>
113
114
  const user = toUser || await getUserById(context, {
114
115
  userId: formatToId
115
116
  });
116
- const aqlQry = aql`LET c = DOCUMENT(${`conversations/${conversationId}`}) RETURN c`;
117
+ const aqlQry = aql`LET c = DOCUMENT(${`conversations/${conversationId}`}) FILTER c.chatSchemaVersion != 1 RETURN c`;
117
118
  const conversation = await useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).catch((error)=>logError({
118
119
  action,
119
120
  category: eventCategory,
@@ -201,6 +202,7 @@ export const getConnectionUserList = (context, { conversationId, includeAll = fa
201
202
  }
202
203
  const aqlQry = aql`FOR u, e,p IN 1..1 INBOUND ${`conversations/${conversationId}`} hasConversation
203
204
  OPTIONS {vertexCollections: "users"}
205
+ FILTER DOCUMENT(${`conversations/${conversationId}`}).chatSchemaVersion != 1
204
206
  FOR c IN connections
205
207
  FILTER ${filters.join(' && ')}
206
208
  RETURN c`;
@@ -227,6 +229,7 @@ export const getConversationUsers = (context, { conversationId, includeAll = fal
227
229
  }
228
230
  const aqlQry = aql`FOR u, e,p IN 1..1 INBOUND ${`conversations/${conversationId}`} hasConversation
229
231
  OPTIONS {vertexCollections: "users"}
232
+ FILTER DOCUMENT(${`conversations/${conversationId}`}).chatSchemaVersion != 1
230
233
  FILTER ${filters.join(' && ')}
231
234
  RETURN u`;
232
235
  return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.all()).catch((error)=>{
@@ -244,7 +247,7 @@ export const getConversationById = (context, conversationId)=>{
244
247
  const sessionDocId = `users/${sessionId}`;
245
248
  const conversationDocId = `conversations/${parseId(conversationId)}`;
246
249
  const aqlQry = aql`FOR c, e IN 1..1 OUTBOUND ${sessionDocId} hasConversation
247
- FILTER c._id == ${conversationDocId}
250
+ FILTER c._id == ${conversationDocId} AND c.chatSchemaVersion != 1
248
251
  LET u = (
249
252
  FOR inUser, inEdge IN 1..1 INBOUND ${conversationDocId} hasConversation
250
253
  RETURN inUser
@@ -275,7 +278,9 @@ export const updateConversation = (context, conversation)=>{
275
278
  ...cloneDeep(update),
276
279
  _key: formatConversationId
277
280
  };
278
- const aqlQry = aql`UPSERT {_key: ${formatConversationId} }
281
+ const aqlQry = aql`LET current = DOCUMENT('conversations', ${formatConversationId})
282
+ FILTER current.chatSchemaVersion != 1
283
+ UPSERT {_key: ${formatConversationId} }
279
284
  INSERT ${insert}
280
285
  UPDATE ${update}
281
286
  IN conversations RETURN NEW`;
@@ -292,11 +297,15 @@ export const addUserToConversation = (context, { conversationId, userId })=>{
292
297
  const formatUserId = parseId(userId);
293
298
  const conversationDocId = `conversations/${formatConversationId}`;
294
299
  const userDocId = `users/${formatUserId}`;
295
- const aqlQry = aql`FOR hc IN hasConversation
296
- FILTER hc._from == ${userDocId} && hc._to == ${conversationDocId}
297
- LIMIT 1
298
- RETURN hc`;
300
+ const aqlQry = aql`LET conversation = DOCUMENT(${conversationDocId})
301
+ RETURN conversation.chatSchemaVersion == 1 ? {chatSchemaVersion: 1} : FIRST(
302
+ FOR hc IN hasConversation
303
+ FILTER hc._from == ${userDocId} && hc._to == ${conversationDocId}
304
+ LIMIT 1 RETURN hc)`;
299
305
  return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).then((hasConversationEdge)=>{
306
+ if (hasConversationEdge?.chatSchemaVersion === 1) {
307
+ return {};
308
+ }
300
309
  if (!!hasConversationEdge) {
301
310
  return hasConversationEdge;
302
311
  }
@@ -326,6 +335,7 @@ export const deleteUserFromConversation = (context, { conversationId, userId })=
326
335
  const userDocId = `users/${formatUserId}`;
327
336
  const aqlQry = aql`FOR hc IN hasConversation
328
337
  FILTER hc._from == ${userDocId} && hc._to == ${conversationDocId}
338
+ AND DOCUMENT(${conversationDocId}).chatSchemaVersion != 1
329
339
  LIMIT 1
330
340
  REMOVE hc IN hasConversation
331
341
  RETURN OLD`;
@@ -336,4 +346,4 @@ export const deleteUserFromConversation = (context, { conversationId, userId })=
336
346
  }, error, context));
337
347
  };
338
348
 
339
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jb252ZXJzYXRpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBpcyBzdWJqZWN0IHRvIHRoZSBhY2NvbXBhbnlpbmcgY29tbWVyY2lhbCBMSUNFTlNFLlxuICovXG5pbXBvcnQge2Nsb25lRGVlcH0gZnJvbSAnQG5sYWJzL3V0aWxzL29iamVjdHMvY2xvbmUnO1xuaW1wb3J0IHtjcmVhdGVIYXNoLCBwYXJzZUlkfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge2xpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0Vycm9yVHlwZXN9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzLmpzJztcbmltcG9ydCB7bG9nRXJyb3J9IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljc1V0aWxzLmpzJztcbmltcG9ydCB7Z2V0TGltaXQsIHNvcnRJZHMsIHVzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzLmpzJztcbmltcG9ydCB7YWRkSXRlbX0gZnJvbSAnLi9jcnVkLmpzJztcbmltcG9ydCB7Z2V0UGVyc29uYVJlbGF0aW9uc2hpcFN0YXRlLCBpc1BlcnNvbmFWaXNpYmlsaXR5QmxvY2tlZH0gZnJvbSAnLi9wZXJzb25hcy5qcyc7XG5pbXBvcnQge2dldFVzZXJCeUlkfSBmcm9tICcuL3VzZXJzLmpzJztcblxuaW1wb3J0IHR5cGUge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuaW1wb3J0IHR5cGUge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgdHlwZSB7QXJhbmdvRGJMaW1pdCwgRWRnZVR5cGV9IGZyb20gJy4uL3R5cGVzL2FyYW5nb2RiLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtDb25uZWN0aW9uVHlwZX0gZnJvbSAnLi4vdHlwZXMvY29ubmVjdGlvbnMudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBDb252ZXJzYXRpb25PcHRpb25zLFxuICBDb252ZXJzYXRpb25UeXBlLFxuICBDb252ZXJzYXRpb25Vc2Vyc1BhcmFtcyxcbiAgRGlyZWN0Q29udmVyc2F0aW9uUGFyYW1zLFxuICBVcGRhdGVDb252ZXJzYXRpb25Vc2VyUGFyYW1zXG59IGZyb20gJy4uL3R5cGVzL2NvbnZlcnNhdGlvbnMudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1VzZXJUeXBlfSBmcm9tICcuLi90eXBlcy91c2Vycy50eXBlcy5qcyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnkgPSAnY29udmVyc2F0aW9ucyc7XG5jb25zdCBoYXNDb252ZXJzYXRpb25Db2xsZWN0aW9uID0gbGl0ZXJhbCgnaGFzQ29udmVyc2F0aW9uJyk7XG5cbmNvbnN0IGVuc3VyZURpcmVjdENvbnZlcnNhdGlvbkZyaWVuZHNoaXAgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGZyb21Vc2VySWQ6IHN0cmluZyxcbiAgdG9Vc2VySWQ6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IFtmcm9tVXNlciwgdG9Vc2VyXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiBmcm9tVXNlcklkfSksXG4gICAgZ2V0VXNlckJ5SWQoY29udGV4dCwge3VzZXJJZDogdG9Vc2VySWR9KVxuICBdKTtcbiAgY29uc3QgZnJvbVBlcnNvbmFJZCA9IHBhcnNlSWQoU3RyaW5nKGZyb21Vc2VyPy5wZXJzb25hSWQgfHwgJycpKTtcbiAgY29uc3QgdG9QZXJzb25hSWQgPSBwYXJzZUlkKFN0cmluZyh0b1VzZXI/LnBlcnNvbmFJZCB8fCAnJykpO1xuXG4gIGlmKCFmcm9tUGVyc29uYUlkIHx8ICF0b1BlcnNvbmFJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihFcnJvclR5cGVzLklOVkFMSURfQVVUSEVOVElDQVRJT04pO1xuICB9XG5cbiAgY29uc3QgcmVsYXRpb25zaGlwID0gYXdhaXQgZ2V0UGVyc29uYVJlbGF0aW9uc2hpcFN0YXRlKGNvbnRleHQsIHRvUGVyc29uYUlkLCBmcm9tUGVyc29uYUlkKTtcblxuICBpZighcmVsYXRpb25zaGlwLmlzRnJpZW5kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKEVycm9yVHlwZXMuSU5WQUxJRF9BVVRIRU5USUNBVElPTik7XG4gIH1cbn07XG5cbmNvbnN0IGZpbHRlckJsb2NrZWRDb252ZXJzYXRpb25zID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBjb252ZXJzYXRpb25zOiBDb252ZXJzYXRpb25UeXBlW10gPSBbXVxuKTogUHJvbWlzZTxDb252ZXJzYXRpb25UeXBlW10+ID0+IHtcbiAgY29uc3Qgc2Vzc2lvblBlcnNvbmFJZCA9IHBhcnNlSWQoU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnBlcnNvbmFJZCB8fCAnJykpO1xuXG4gIGlmKCFzZXNzaW9uUGVyc29uYUlkIHx8ICFjb252ZXJzYXRpb25zLmxlbmd0aCkge1xuICAgIHJldHVybiBjb252ZXJzYXRpb25zO1xuICB9XG5cbiAgY29uc3QgdmlzaWJpbGl0eSA9IGF3YWl0IFByb21pc2UuYWxsKGNvbnZlcnNhdGlvbnMubWFwKGFzeW5jIChjb252ZXJzYXRpb24pID0+IHtcbiAgICBpZighY29udmVyc2F0aW9uPy5pc0RpcmVjdCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydGljaXBhbnQgPSBBcnJheS5pc0FycmF5KGNvbnZlcnNhdGlvbj8udXNlcnMpXG4gICAgICA/IGNvbnZlcnNhdGlvbi51c2Vycy5maW5kKCh1c2VyKSA9PiBwYXJzZUlkKFN0cmluZyh1c2VyPy51c2VySWQgfHwgdXNlcj8uX2tleSB8fCAnJykpICE9PSBwYXJzZUlkKFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy51c2VySWQgfHwgJycpKSlcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBwYXJ0aWNpcGFudFBlcnNvbmFJZCA9IHBhcnNlSWQoU3RyaW5nKHBhcnRpY2lwYW50Py5wZXJzb25hSWQgfHwgJycpKTtcblxuICAgIGlmKCFwYXJ0aWNpcGFudFBlcnNvbmFJZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuICEoYXdhaXQgaXNQZXJzb25hVmlzaWJpbGl0eUJsb2NrZWQoY29udGV4dCwgcGFydGljaXBhbnRQZXJzb25hSWQsIHNlc3Npb25QZXJzb25hSWQpKTtcbiAgfSkpO1xuXG4gIHJldHVybiBjb252ZXJzYXRpb25zLmZpbHRlcigoX2NvbnZlcnNhdGlvbiwgaW5kZXgpID0+IHZpc2liaWxpdHlbaW5kZXhdKTtcbn07XG5cbmV4cG9ydCBjb25zdCBlbnN1cmVDb252ZXJzYXRpb25NZXNzYWdpbmdBbGxvd2VkID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBjb252ZXJzYXRpb25JZDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgY29udmVyc2F0aW9uID0gYXdhaXQgZ2V0Q29udmVyc2F0aW9uQnlJZChjb250ZXh0LCBjb252ZXJzYXRpb25JZCk7XG5cbiAgaWYoIWNvbnZlcnNhdGlvbj8uY29udmVyc2F0aW9uSWQgJiYgIWNvbnZlcnNhdGlvbj8uX2tleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihFcnJvclR5cGVzLklOVkFMSURfQVVUSEVOVElDQVRJT04pO1xuICB9XG5cbiAgaWYoIWNvbnZlcnNhdGlvbj8uaXNEaXJlY3QpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzZXNzaW9uVXNlcklkID0gcGFyc2VJZChTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSk7XG4gIGNvbnN0IHBhcnRpY2lwYW50ID0gQXJyYXkuaXNBcnJheShjb252ZXJzYXRpb24/LnVzZXJzKVxuICAgID8gY29udmVyc2F0aW9uLnVzZXJzLmZpbmQoKHVzZXIpID0+IHBhcnNlSWQoU3RyaW5nKHVzZXI/LnVzZXJJZCB8fCB1c2VyPy5fa2V5IHx8ICcnKSkgIT09IHNlc3Npb25Vc2VySWQpXG4gICAgOiBudWxsO1xuICBjb25zdCBwYXJ0aWNpcGFudFVzZXJJZCA9IHBhcnNlSWQoU3RyaW5nKHBhcnRpY2lwYW50Py51c2VySWQgfHwgcGFydGljaXBhbnQ/Ll9rZXkgfHwgJycpKTtcblxuICBpZighc2Vzc2lvblVzZXJJZCB8fCAhcGFydGljaXBhbnRVc2VySWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JUeXBlcy5JTlZBTElEX0FVVEhFTlRJQ0FUSU9OKTtcbiAgfVxuXG4gIGF3YWl0IGVuc3VyZURpcmVjdENvbnZlcnNhdGlvbkZyaWVuZHNoaXAoY29udGV4dCwgc2Vzc2lvblVzZXJJZCwgcGFydGljaXBhbnRVc2VySWQpO1xufTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlQ29udmVyc2F0aW9uT3B0aW9ucyA9IChvcHRpb25zOiBDb252ZXJzYXRpb25PcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGZyb20gPSAwLFxuICAgIHRvID0gMzBcbiAgfSA9IG9wdGlvbnM7XG5cbiAgcmV0dXJuIHtcbiAgICBsaW1pdDogZ2V0TGltaXQoZnJvbSwgdG8pIGFzIEFyYW5nb0RiTGltaXRcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb252ZXJzYXRpb25MaXN0QnlVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXJJZDogc3RyaW5nLCBvcHRpb25zPyk6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRDb252ZXJzYXRpb25zJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VDb252ZXJzYXRpb25PcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB1c2VyRG9jSWQgPSBgdXNlcnMvJHt1c2VySWR9YDtcbiAgY29uc3QgYXFsUXJ5ID0gYXFsYFxuICAgIEZPUiBjLCBlIElOIDEuLjEgT1VUQk9VTkQgJHt1c2VyRG9jSWR9ICR7aGFzQ29udmVyc2F0aW9uQ29sbGVjdGlvbn1cbiAgICAgIFNPUlQgYy5hZGRlZCBERVNDXG4gICAgICAke2xpdGVyYWwobGltaXQuYXFsKX1cbiAgICAgIExFVCB1c2VycyA9IChcbiAgICAgICAgRk9SIHUsIHVjIElOIDEuLjEgSU5CT1VORCBjLl9pZCAke2hhc0NvbnZlcnNhdGlvbkNvbGxlY3Rpb259XG4gICAgICAgICAgRklMVEVSIHUuX2lkICE9ICR7dXNlckRvY0lkfVxuICAgICAgICAgIFJFVFVSTiB1XG4gICAgICApXG4gICAgICBSRVRVUk4gTUVSR0UoYywge3VzZXJzfSlcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgQ29udmVyc2F0aW9uVHlwZVtdKVxuICAgIC50aGVuKChjb252ZXJzYXRpb25zKSA9PiBmaWx0ZXJCbG9ja2VkQ29udmVyc2F0aW9ucyhjb250ZXh0LCBjb252ZXJzYXRpb25zKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERpcmVjdENvbnZlcnNhdGlvbiA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge1xuICAgIGZyb21JZCxcbiAgICB0b0lkLFxuICAgIHRvVXNlclxuICB9OiBEaXJlY3RDb252ZXJzYXRpb25QYXJhbXNcbik6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0RGlyZWN0Q29udmVyc2F0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZm9ybWF0RnJvbUlkID0gcGFyc2VJZChmcm9tSWQpO1xuICAgIGNvbnN0IGZvcm1hdFRvSWQgPSBwYXJzZUlkKHRvSWQpO1xuICAgIGF3YWl0IGVuc3VyZURpcmVjdENvbnZlcnNhdGlvbkZyaWVuZHNoaXAoY29udGV4dCwgZm9ybWF0RnJvbUlkLCBmb3JtYXRUb0lkKTtcbiAgICBjb25zdCB1c2VySWRzID0gW2Zvcm1hdEZyb21JZCwgZm9ybWF0VG9JZF07XG4gICAgY29uc3Qgc29ydGVkVXNlcklkcyA9IHNvcnRJZHModXNlcklkcyk7XG4gICAgY29uc3QgY29udmVyc2F0aW9uSWQgPSBjcmVhdGVIYXNoKGBjb252ZXJzYXRpb25zLSR7c29ydGVkVXNlcklkcy5qb2luKCctJyl9YCwgbnVsbCk7XG4gICAgY29uc3QgdXNlcjogVXNlclR5cGUgPSB0b1VzZXIgfHwgYXdhaXQgZ2V0VXNlckJ5SWQoY29udGV4dCwge3VzZXJJZDogZm9ybWF0VG9JZH0pO1xuICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgTEVUIGMgPSBET0NVTUVOVCgke2Bjb252ZXJzYXRpb25zLyR7Y29udmVyc2F0aW9uSWR9YH0pIFJFVFVSTiBjYDtcbiAgICBjb25zdCBjb252ZXJzYXRpb24gPSBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcblxuICAgIGlmKGNvbnZlcnNhdGlvbikge1xuICAgICAgcmV0dXJuIHsuLi5jb252ZXJzYXRpb24sIHVzZXJzOiBbdXNlcl19O1xuICAgIH1cblxuICAgIHJldHVybiBhZGREaXJlY3RDb252ZXJzYXRpb24oY29udGV4dCwge2Zyb21JZCwgdG9JZCwgdG9Vc2VyOiB1c2VyfSk7XG4gIH0gY2F0Y2goZGF0YWJhc2VFcnJvcikge1xuICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZGF0YWJhc2VFcnJvciwgY29udGV4dCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBhZGREaXJlY3RDb252ZXJzYXRpb24gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBmcm9tSWQsXG4gICAgdG9JZCxcbiAgICB0b1VzZXJcbiAgfTogRGlyZWN0Q29udmVyc2F0aW9uUGFyYW1zXG4pOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldERpcmVjdENvbnZlcnNhdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcblxuICB0cnkge1xuICAgIGNvbnN0IGZvcm1hdEZyb21JZCA9IHBhcnNlSWQoZnJvbUlkKTtcbiAgICBjb25zdCBmb3JtYXRUb0lkID0gcGFyc2VJZCh0b0lkKTtcbiAgICBhd2FpdCBlbnN1cmVEaXJlY3RDb252ZXJzYXRpb25GcmllbmRzaGlwKGNvbnRleHQsIGZvcm1hdEZyb21JZCwgZm9ybWF0VG9JZCk7XG4gICAgY29uc3QgdXNlcklkcyA9IFtmb3JtYXRGcm9tSWQsIGZvcm1hdFRvSWRdO1xuICAgIGNvbnN0IHNvcnRlZFVzZXJJZHMgPSBzb3J0SWRzKHVzZXJJZHMpO1xuICAgIGNvbnN0IHVzZXI6IFVzZXJUeXBlID0gdG9Vc2VyIHx8IGF3YWl0IGdldFVzZXJCeUlkKGNvbnRleHQsIHt1c2VySWQ6IGZvcm1hdFRvSWR9KTtcbiAgICBjb25zdCBjb252ZXJzYXRpb25JZCA9IGNyZWF0ZUhhc2goYGNvbnZlcnNhdGlvbnMtJHtzb3J0ZWRVc2VySWRzLmpvaW4oJy0nKX1gLCBudWxsKTtcblxuICAgIGNvbnN0IGluc2VydCA9IHtcbiAgICAgIF9rZXk6IGNvbnZlcnNhdGlvbklkLFxuICAgICAgaXNEaXJlY3Q6IHRydWVcbiAgICB9O1xuICAgIGNvbnN0IHVwZGF0ZWRDb252ZXJzYXRpb24gPSBhd2FpdCBhZGRJdGVtPENvbnZlcnNhdGlvblR5cGU+KGNvbnRleHQsICdjb252ZXJzYXRpb25zJywgaW5zZXJ0KTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHVzZXJJZHMubWFwKCh1c2VySWQpID0+IHtcbiAgICAgIGNvbnN0IGVkZ2VJZCA9IGNyZWF0ZUhhc2goYGhhc0NvbnZlcnNhdGlvbi0ke3VzZXJJZH0tJHtjb252ZXJzYXRpb25JZH1gKTtcbiAgICAgIGNvbnN0IGVkZ2U6IEVkZ2VUeXBlID0ge1xuICAgICAgICBfZnJvbTogYHVzZXJzLyR7dXNlcklkfWAsXG4gICAgICAgIF9rZXk6IGVkZ2VJZCxcbiAgICAgICAgX3RvOiBgY29udmVyc2F0aW9ucy8ke2NvbnZlcnNhdGlvbklkfWAsXG4gICAgICAgIGFkZGVkOiBEYXRlLm5vdygpXG4gICAgICB9O1xuICAgICAgY29uc3QgaW5zZXJ0RWRnZVF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtlZGdlfSBJTiBoYXNDb252ZXJzYXRpb24gUkVUVVJOIE5FV2A7XG4gICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShpbnNlcnRFZGdlUXVlcnkpO1xuICAgIH0pKTtcblxuICAgIHJldHVybiB7Li4udXBkYXRlZENvbnZlcnNhdGlvbiwgdXNlcnM6IFt1c2VyXX07XG4gIH0gY2F0Y2goZGF0YWJhc2VFcnJvcikge1xuICAgIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBkYXRhYmFzZUVycm9yLCBjb250ZXh0KTtcbiAgICByZXR1cm4ge307XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb25uZWN0aW9uVXNlckxpc3QgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBpbmNsdWRlQWxsID0gZmFsc2UsXG4gICAgaXNEaXJlY3RcbiAgfTogQ29udmVyc2F0aW9uVXNlcnNQYXJhbXNcbik6IFByb21pc2U8Q29ubmVjdGlvblR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0Q29ubmVjdGlvblVzZXJMaXN0JztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvblVzZXJJZH19ID0gY29udGV4dDtcbiAgY29uc3QgZmlsdGVyczogc3RyaW5nW10gPSBbJ2MudXNlcklkID09IHUuX2tleSddO1xuXG4gIGlmKCFpbmNsdWRlQWxsKSB7XG4gICAgZmlsdGVycy5wdXNoKGB1Ll9rZXkgIT0gJHtzZXNzaW9uVXNlcklkfWApO1xuICB9XG4gIGlmKGlzRGlyZWN0KSB7XG4gICAgZmlsdGVycy5wdXNoKGBwLnZlcnRpY2VzWzBdLmlzRGlyZWN0ID09ICR7aXNEaXJlY3R9YCk7XG4gIH1cblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB1LCBlLHAgSU4gMS4uMSBJTkJPVU5EICR7YGNvbnZlcnNhdGlvbnMvJHtjb252ZXJzYXRpb25JZH1gfSBoYXNDb252ZXJzYXRpb25cbiAgICBPUFRJT05TIHt2ZXJ0ZXhDb2xsZWN0aW9uczogXCJ1c2Vyc1wifVxuICAgIEZPUiBjIElOIGNvbm5lY3Rpb25zXG4gICAgRklMVEVSICR7ZmlsdGVycy5qb2luKCcgJiYgJyl9XG4gICAgUkVUVVJOIGNgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBDb25uZWN0aW9uVHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udmVyc2F0aW9uVXNlcnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBpbmNsdWRlQWxsID0gZmFsc2UsXG4gICAgaXNEaXJlY3RcbiAgfTogQ29udmVyc2F0aW9uVXNlcnNQYXJhbXNcbik6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRDb252ZXJzYXRpb25Vc2Vycyc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25Vc2VySWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZpbHRlcnM6IHN0cmluZ1tdID0gWydjLnVzZXJJZCA9PSB1Ll9rZXknXTtcblxuICBpZighaW5jbHVkZUFsbCkge1xuICAgIGZpbHRlcnMucHVzaChgdS5fa2V5ICE9ICR7c2Vzc2lvblVzZXJJZH1gKTtcbiAgfVxuICBpZihpc0RpcmVjdCkge1xuICAgIGZpbHRlcnMucHVzaChgcC52ZXJ0aWNlc1swXS5pc0RpcmVjdCA9PSAke2lzRGlyZWN0fWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgdSwgZSxwIElOIDEuLjEgSU5CT1VORCAke2Bjb252ZXJzYXRpb25zLyR7Y29udmVyc2F0aW9uSWR9YH0gaGFzQ29udmVyc2F0aW9uXG4gICAgT1BUSU9OUyB7dmVydGV4Q29sbGVjdGlvbnM6IFwidXNlcnNcIn1cbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyAmJiAnKX1cbiAgICBSRVRVUk4gdWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIENvbnZlcnNhdGlvblR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnZlcnNhdGlvbkJ5SWQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgY29udmVyc2F0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0SXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qgc2Vzc2lvbkRvY0lkID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbkRvY0lkID0gYGNvbnZlcnNhdGlvbnMvJHtwYXJzZUlkKGNvbnZlcnNhdGlvbklkKX1gO1xuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGMsIGUgSU4gMS4uMSBPVVRCT1VORCAke3Nlc3Npb25Eb2NJZH0gaGFzQ29udmVyc2F0aW9uXG4gICAgRklMVEVSIGMuX2lkID09ICR7Y29udmVyc2F0aW9uRG9jSWR9XG4gICAgTEVUIHUgPSAoXG4gICAgICBGT1IgaW5Vc2VyLCBpbkVkZ2UgSU4gMS4uMSBJTkJPVU5EICR7Y29udmVyc2F0aW9uRG9jSWR9IGhhc0NvbnZlcnNhdGlvblxuICAgICAgUkVUVVJOIGluVXNlclxuICAgIClcbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIE1FUkdFKGMsIHt1c2VyczogdX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigoY29udmVyc2F0aW9uOiBDb252ZXJzYXRpb25UeXBlKSA9PiB7XG4gICAgICBpZighY29udmVyc2F0aW9uKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb252ZXJzYXRpb247XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlQ29udmVyc2F0aW9uID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBjb252ZXJzYXRpb246IENvbnZlcnNhdGlvblR5cGVcbik6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAndXBkYXRlQ29udmVyc2F0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgY29udmVyc2F0aW9uSWQgPSBjcmVhdGVIYXNoKGBjb252ZXJzYXRpb24tJHtzZXNzaW9uSWR9IGApLFxuICAgIGlzRGlyZWN0ID0gZmFsc2UsXG4gICAgbmFtZVxuICB9ID0gY29udmVyc2F0aW9uO1xuICBjb25zdCBmb3JtYXRDb252ZXJzYXRpb25JZCA9IHBhcnNlSWQoY29udmVyc2F0aW9uSWQpO1xuICBjb25zdCB1cGRhdGUgPSB7XG4gICAgaXNEaXJlY3QsXG4gICAgbmFtZVxuICB9O1xuXG4gIGNvbnN0IGluc2VydCA9IHtcbiAgICAuLi5jbG9uZURlZXAodXBkYXRlKSxcbiAgICBfa2V5OiBmb3JtYXRDb252ZXJzYXRpb25JZFxuICB9O1xuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBTRVJUIHtfa2V5OiAke2Zvcm1hdENvbnZlcnNhdGlvbklkfSB9XG4gICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgIFVQREFURSAke3VwZGF0ZX1cbiAgICBJTiBjb252ZXJzYXRpb25zIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChjb252ZXJzYXRpb246IENvbnZlcnNhdGlvblR5cGUpID0+IGNvbnZlcnNhdGlvbilcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkVXNlclRvQ29udmVyc2F0aW9uID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7XG4gICAgY29udmVyc2F0aW9uSWQsXG4gICAgdXNlcklkXG4gIH06IFVwZGF0ZUNvbnZlcnNhdGlvblVzZXJQYXJhbXNcbik6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnYWRkVXNlclRvQ29udmVyc2F0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRDb252ZXJzYXRpb25JZCA9IHBhcnNlSWQoY29udmVyc2F0aW9uSWQpO1xuICBjb25zdCBmb3JtYXRVc2VySWQgPSBwYXJzZUlkKHVzZXJJZCk7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbkRvY0lkID0gYGNvbnZlcnNhdGlvbnMvJHtmb3JtYXRDb252ZXJzYXRpb25JZH1gO1xuICBjb25zdCB1c2VyRG9jSWQgPSBgdXNlcnMvJHtmb3JtYXRVc2VySWR9YDtcblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBoYyBJTiBoYXNDb252ZXJzYXRpb25cbiAgICBGSUxURVIgaGMuX2Zyb20gPT0gJHt1c2VyRG9jSWR9ICYmIGhjLl90byA9PSAke2NvbnZlcnNhdGlvbkRvY0lkfVxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gaGNgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChoYXNDb252ZXJzYXRpb25FZGdlKSA9PiB7XG4gICAgICBpZighIWhhc0NvbnZlcnNhdGlvbkVkZ2UpIHtcbiAgICAgICAgcmV0dXJuIGhhc0NvbnZlcnNhdGlvbkVkZ2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVkZ2VDb2xsZWN0aW9uOiBFZGdlQ29sbGVjdGlvbiA9IHVzZURiKGRhdGFiYXNlTmFtZSkuY29sbGVjdGlvbignaGFzQ29udmVyc2F0aW9uJyk7XG4gICAgICBjb25zdCBlZGdlSWQgPSBjcmVhdGVIYXNoKGBjb252ZXJzYXRpb24tJHtmb3JtYXRDb252ZXJzYXRpb25JZH0tJHtmb3JtYXRVc2VySWR9YCk7XG5cbiAgICAgIGNvbnN0IGVkZ2U6IENvbnZlcnNhdGlvblR5cGUgPSB7XG4gICAgICAgIF9mcm9tOiB1c2VyRG9jSWQsXG4gICAgICAgIF9rZXk6IGVkZ2VJZCxcbiAgICAgICAgX3RvOiBjb252ZXJzYXRpb25Eb2NJZCxcbiAgICAgICAgYWRkZWQ6IERhdGUubm93KClcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBlZGdlQ29sbGVjdGlvblxuICAgICAgICAuc2F2ZShlZGdlLCB7cmV0dXJuTmV3OiB0cnVlfSlcbiAgICAgICAgLnRoZW4oKCkgPT4gZWRnZSk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlVXNlckZyb21Db252ZXJzYXRpb24gPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICB1c2VySWRcbiAgfTogVXBkYXRlQ29udmVyc2F0aW9uVXNlclBhcmFtc1xuKTogUHJvbWlzZTxDb252ZXJzYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdkZWxldGVVc2VyRnJvbUNvbnZlcnNhdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0Q29udmVyc2F0aW9uSWQgPSBwYXJzZUlkKGNvbnZlcnNhdGlvbklkKTtcbiAgY29uc3QgZm9ybWF0VXNlcklkID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCBjb252ZXJzYXRpb25Eb2NJZCA9IGBjb252ZXJzYXRpb25zLyR7Zm9ybWF0Q29udmVyc2F0aW9uSWR9YDtcbiAgY29uc3QgdXNlckRvY0lkID0gYHVzZXJzLyR7Zm9ybWF0VXNlcklkfWA7XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgaGMgSU4gaGFzQ29udmVyc2F0aW9uXG4gICAgRklMVEVSIGhjLl9mcm9tID09ICR7dXNlckRvY0lkfSAmJiBoYy5fdG8gPT0gJHtjb252ZXJzYXRpb25Eb2NJZH1cbiAgICBMSU1JVCAxXG4gICAgUkVNT1ZFIGhjIElOIGhhc0NvbnZlcnNhdGlvblxuICAgIFJFVFVSTiBPTERgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG4iXSwibmFtZXMiOlsiY2xvbmVEZWVwIiwiY3JlYXRlSGFzaCIsInBhcnNlSWQiLCJhcWwiLCJsaXRlcmFsIiwiRXJyb3JUeXBlcyIsImxvZ0Vycm9yIiwiZ2V0TGltaXQiLCJzb3J0SWRzIiwidXNlRGIiLCJhZGRJdGVtIiwiZ2V0UGVyc29uYVJlbGF0aW9uc2hpcFN0YXRlIiwiaXNQZXJzb25hVmlzaWJpbGl0eUJsb2NrZWQiLCJnZXRVc2VyQnlJZCIsImV2ZW50Q2F0ZWdvcnkiLCJoYXNDb252ZXJzYXRpb25Db2xsZWN0aW9uIiwiZW5zdXJlRGlyZWN0Q29udmVyc2F0aW9uRnJpZW5kc2hpcCIsImNvbnRleHQiLCJmcm9tVXNlcklkIiwidG9Vc2VySWQiLCJmcm9tVXNlciIsInRvVXNlciIsIlByb21pc2UiLCJhbGwiLCJ1c2VySWQiLCJmcm9tUGVyc29uYUlkIiwiU3RyaW5nIiwicGVyc29uYUlkIiwidG9QZXJzb25hSWQiLCJFcnJvciIsIklOVkFMSURfQVVUSEVOVElDQVRJT04iLCJyZWxhdGlvbnNoaXAiLCJpc0ZyaWVuZCIsImZpbHRlckJsb2NrZWRDb252ZXJzYXRpb25zIiwiY29udmVyc2F0aW9ucyIsInNlc3Npb25QZXJzb25hSWQiLCJzZXNzaW9uIiwibGVuZ3RoIiwidmlzaWJpbGl0eSIsIm1hcCIsImNvbnZlcnNhdGlvbiIsImlzRGlyZWN0IiwicGFydGljaXBhbnQiLCJBcnJheSIsImlzQXJyYXkiLCJ1c2VycyIsImZpbmQiLCJ1c2VyIiwiX2tleSIsInBhcnRpY2lwYW50UGVyc29uYUlkIiwiZmlsdGVyIiwiX2NvbnZlcnNhdGlvbiIsImluZGV4IiwiZW5zdXJlQ29udmVyc2F0aW9uTWVzc2FnaW5nQWxsb3dlZCIsImNvbnZlcnNhdGlvbklkIiwiZ2V0Q29udmVyc2F0aW9uQnlJZCIsInNlc3Npb25Vc2VySWQiLCJwYXJ0aWNpcGFudFVzZXJJZCIsInBhcnNlQ29udmVyc2F0aW9uT3B0aW9ucyIsIm9wdGlvbnMiLCJmcm9tIiwidG8iLCJsaW1pdCIsImdldENvbnZlcnNhdGlvbkxpc3RCeVVzZXIiLCJhY3Rpb24iLCJkYXRhYmFzZU5hbWUiLCJ1c2VyRG9jSWQiLCJhcWxRcnkiLCJxdWVyeSIsInRoZW4iLCJjdXJzb3IiLCJjYXRjaCIsImVycm9yIiwiY2F0ZWdvcnkiLCJsYWJlbCIsIkRBVEFCQVNFX0VSUk9SIiwiZ2V0RGlyZWN0Q29udmVyc2F0aW9uIiwiZnJvbUlkIiwidG9JZCIsImZvcm1hdEZyb21JZCIsImZvcm1hdFRvSWQiLCJ1c2VySWRzIiwic29ydGVkVXNlcklkcyIsImpvaW4iLCJuZXh0IiwiYWRkRGlyZWN0Q29udmVyc2F0aW9uIiwiZGF0YWJhc2VFcnJvciIsImluc2VydCIsInVwZGF0ZWRDb252ZXJzYXRpb24iLCJlZGdlSWQiLCJlZGdlIiwiX2Zyb20iLCJfdG8iLCJhZGRlZCIsIkRhdGUiLCJub3ciLCJpbnNlcnRFZGdlUXVlcnkiLCJnZXRDb25uZWN0aW9uVXNlckxpc3QiLCJpbmNsdWRlQWxsIiwiZmlsdGVycyIsInB1c2giLCJnZXRDb252ZXJzYXRpb25Vc2VycyIsInNlc3Npb25JZCIsInNlc3Npb25Eb2NJZCIsImNvbnZlcnNhdGlvbkRvY0lkIiwidXBkYXRlQ29udmVyc2F0aW9uIiwibmFtZSIsImZvcm1hdENvbnZlcnNhdGlvbklkIiwidXBkYXRlIiwiYWRkVXNlclRvQ29udmVyc2F0aW9uIiwiZm9ybWF0VXNlcklkIiwiaGFzQ29udmVyc2F0aW9uRWRnZSIsImVkZ2VDb2xsZWN0aW9uIiwiY29sbGVjdGlvbiIsInNhdmUiLCJyZXR1cm5OZXciLCJkZWxldGVVc2VyRnJvbUNvbnZlcnNhdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsU0FBUyxRQUFPLDZCQUE2QjtBQUNyRCxTQUFRQyxVQUFVLEVBQUVDLE9BQU8sUUFBTywrQkFBK0I7QUFDakUsU0FBUUMsR0FBRyxRQUFPLFdBQVc7QUFDN0IsU0FBUUMsT0FBTyxRQUFPLGVBQWU7QUFDckMsU0FBUUMsVUFBVSxRQUFPLDBCQUEwQjtBQUNuRCxTQUFRQyxRQUFRLFFBQU8sNkJBQTZCO0FBQ3BELFNBQVFDLFFBQVEsRUFBRUMsT0FBTyxFQUFFQyxLQUFLLFFBQU8sNEJBQTRCO0FBQ25FLFNBQVFDLE9BQU8sUUFBTyxZQUFZO0FBQ2xDLFNBQVFDLDJCQUEyQixFQUFFQywwQkFBMEIsUUFBTyxnQkFBZ0I7QUFDdEYsU0FBUUMsV0FBVyxRQUFPLGFBQWE7QUFnQnZDLE1BQU1DLGdCQUFnQjtBQUN0QixNQUFNQyw0QkFBNEJYLFFBQVE7QUFFMUMsTUFBTVkscUNBQXFDLE9BQ3pDQyxTQUNBQyxZQUNBQztJQUVBLE1BQU0sQ0FBQ0MsVUFBVUMsT0FBTyxHQUFHLE1BQU1DLFFBQVFDLEdBQUcsQ0FBQztRQUMzQ1YsWUFBWUksU0FBUztZQUFDTyxRQUFRTjtRQUFVO1FBQ3hDTCxZQUFZSSxTQUFTO1lBQUNPLFFBQVFMO1FBQVE7S0FDdkM7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
349
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jb252ZXJzYXRpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBpcyBzdWJqZWN0IHRvIHRoZSBhY2NvbXBhbnlpbmcgY29tbWVyY2lhbCBMSUNFTlNFLlxuICovXG4vKiBlc2xpbnQgbm8tdW5kZXJzY29yZS1kYW5nbGU6IFtcImVycm9yXCIsIHtcImFsbG93XCI6IFtcIl9pZFwiLCBcIl9rZXlcIl19XSAtLSBBcmFuZ29EQiBkb2N1bWVudCBpZGVudGl0eSBmaWVsZHMuICovXG5pbXBvcnQge2Nsb25lRGVlcH0gZnJvbSAnQG5sYWJzL3V0aWxzL29iamVjdHMvY2xvbmUnO1xuaW1wb3J0IHtjcmVhdGVIYXNoLCBwYXJzZUlkfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge2xpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5cbmltcG9ydCB7RXJyb3JUeXBlc30gZnJvbSAnLi4vdHlwZXMvZXJyb3IudHlwZXMuanMnO1xuaW1wb3J0IHtsb2dFcnJvcn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMuanMnO1xuaW1wb3J0IHtnZXRMaW1pdCwgc29ydElkcywgdXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMuanMnO1xuaW1wb3J0IHthZGRJdGVtfSBmcm9tICcuL2NydWQuanMnO1xuaW1wb3J0IHtnZXRQZXJzb25hUmVsYXRpb25zaGlwU3RhdGUsIGlzUGVyc29uYVZpc2liaWxpdHlCbG9ja2VkfSBmcm9tICcuL3BlcnNvbmFzLmpzJztcbmltcG9ydCB7Z2V0VXNlckJ5SWR9IGZyb20gJy4vdXNlcnMuanMnO1xuXG5pbXBvcnQgdHlwZSB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQgdHlwZSB7RWRnZUNvbGxlY3Rpb259IGZyb20gJ2FyYW5nb2pzL2NvbGxlY3Rpb25zJztcbmltcG9ydCB0eXBlIHtBcmFuZ29EYkxpbWl0LCBFZGdlVHlwZX0gZnJvbSAnLi4vdHlwZXMvYXJhbmdvZGIudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0Nvbm5lY3Rpb25UeXBlfSBmcm9tICcuLi90eXBlcy9jb25uZWN0aW9ucy50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnZlcnNhdGlvbk9wdGlvbnMsXG4gIENvbnZlcnNhdGlvblR5cGUsXG4gIENvbnZlcnNhdGlvblVzZXJzUGFyYW1zLFxuICBEaXJlY3RDb252ZXJzYXRpb25QYXJhbXMsXG4gIFVwZGF0ZUNvbnZlcnNhdGlvblVzZXJQYXJhbXNcbn0gZnJvbSAnLi4vdHlwZXMvY29udmVyc2F0aW9ucy50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7VXNlclR5cGV9IGZyb20gJy4uL3R5cGVzL3VzZXJzLnR5cGVzLmpzJztcblxuY29uc3QgZXZlbnRDYXRlZ29yeSA9ICdjb252ZXJzYXRpb25zJztcbmNvbnN0IGhhc0NvbnZlcnNhdGlvbkNvbGxlY3Rpb24gPSBsaXRlcmFsKCdoYXNDb252ZXJzYXRpb24nKTtcblxuY29uc3QgZW5zdXJlRGlyZWN0Q29udmVyc2F0aW9uRnJpZW5kc2hpcCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgZnJvbVVzZXJJZDogc3RyaW5nLFxuICB0b1VzZXJJZDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgW2Zyb21Vc2VyLCB0b1VzZXJdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGdldFVzZXJCeUlkKGNvbnRleHQsIHt1c2VySWQ6IGZyb21Vc2VySWR9KSxcbiAgICBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiB0b1VzZXJJZH0pXG4gIF0pO1xuICBjb25zdCBmcm9tUGVyc29uYUlkID0gcGFyc2VJZChTdHJpbmcoZnJvbVVzZXI/LnBlcnNvbmFJZCB8fCAnJykpO1xuICBjb25zdCB0b1BlcnNvbmFJZCA9IHBhcnNlSWQoU3RyaW5nKHRvVXNlcj8ucGVyc29uYUlkIHx8ICcnKSk7XG5cbiAgaWYoIWZyb21QZXJzb25hSWQgfHwgIXRvUGVyc29uYUlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKEVycm9yVHlwZXMuSU5WQUxJRF9BVVRIRU5USUNBVElPTik7XG4gIH1cblxuICBjb25zdCByZWxhdGlvbnNoaXAgPSBhd2FpdCBnZXRQZXJzb25hUmVsYXRpb25zaGlwU3RhdGUoY29udGV4dCwgdG9QZXJzb25hSWQsIGZyb21QZXJzb25hSWQpO1xuXG4gIGlmKCFyZWxhdGlvbnNoaXAuaXNGcmllbmQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JUeXBlcy5JTlZBTElEX0FVVEhFTlRJQ0FUSU9OKTtcbiAgfVxufTtcblxuY29uc3QgZmlsdGVyQmxvY2tlZENvbnZlcnNhdGlvbnMgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGNvbnZlcnNhdGlvbnM6IENvbnZlcnNhdGlvblR5cGVbXSA9IFtdXG4pOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGVbXT4gPT4ge1xuICBjb25zdCBzZXNzaW9uUGVyc29uYUlkID0gcGFyc2VJZChTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8ucGVyc29uYUlkIHx8ICcnKSk7XG5cbiAgaWYoIXNlc3Npb25QZXJzb25hSWQgfHwgIWNvbnZlcnNhdGlvbnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGNvbnZlcnNhdGlvbnM7XG4gIH1cblxuICBjb25zdCB2aXNpYmlsaXR5ID0gYXdhaXQgUHJvbWlzZS5hbGwoY29udmVyc2F0aW9ucy5tYXAoYXN5bmMgKGNvbnZlcnNhdGlvbikgPT4ge1xuICAgIGlmKCFjb252ZXJzYXRpb24/LmlzRGlyZWN0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aWNpcGFudCA9IEFycmF5LmlzQXJyYXkoY29udmVyc2F0aW9uPy51c2VycylcbiAgICAgID8gY29udmVyc2F0aW9uLnVzZXJzLmZpbmQoKHVzZXIpID0+IHBhcnNlSWQoU3RyaW5nKHVzZXI/LnVzZXJJZCB8fCB1c2VyPy5fa2V5IHx8ICcnKSkgIT09IHBhcnNlSWQoU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnVzZXJJZCB8fCAnJykpKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IHBhcnRpY2lwYW50UGVyc29uYUlkID0gcGFyc2VJZChTdHJpbmcocGFydGljaXBhbnQ/LnBlcnNvbmFJZCB8fCAnJykpO1xuXG4gICAgaWYoIXBhcnRpY2lwYW50UGVyc29uYUlkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gIShhd2FpdCBpc1BlcnNvbmFWaXNpYmlsaXR5QmxvY2tlZChjb250ZXh0LCBwYXJ0aWNpcGFudFBlcnNvbmFJZCwgc2Vzc2lvblBlcnNvbmFJZCkpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGNvbnZlcnNhdGlvbnMuZmlsdGVyKChfY29udmVyc2F0aW9uLCBpbmRleCkgPT4gdmlzaWJpbGl0eVtpbmRleF0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGVuc3VyZUNvbnZlcnNhdGlvbk1lc3NhZ2luZ0FsbG93ZWQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGNvbnZlcnNhdGlvbklkOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCBjb252ZXJzYXRpb24gPSBhd2FpdCBnZXRDb252ZXJzYXRpb25CeUlkKGNvbnRleHQsIGNvbnZlcnNhdGlvbklkKTtcblxuICBpZighY29udmVyc2F0aW9uPy5jb252ZXJzYXRpb25JZCAmJiAhY29udmVyc2F0aW9uPy5fa2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKEVycm9yVHlwZXMuSU5WQUxJRF9BVVRIRU5USUNBVElPTik7XG4gIH1cblxuICBpZighY29udmVyc2F0aW9uPy5pc0RpcmVjdCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNlc3Npb25Vc2VySWQgPSBwYXJzZUlkKFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy51c2VySWQgfHwgJycpKTtcbiAgY29uc3QgcGFydGljaXBhbnQgPSBBcnJheS5pc0FycmF5KGNvbnZlcnNhdGlvbj8udXNlcnMpXG4gICAgPyBjb252ZXJzYXRpb24udXNlcnMuZmluZCgodXNlcikgPT4gcGFyc2VJZChTdHJpbmcodXNlcj8udXNlcklkIHx8IHVzZXI/Ll9rZXkgfHwgJycpKSAhPT0gc2Vzc2lvblVzZXJJZClcbiAgICA6IG51bGw7XG4gIGNvbnN0IHBhcnRpY2lwYW50VXNlcklkID0gcGFyc2VJZChTdHJpbmcocGFydGljaXBhbnQ/LnVzZXJJZCB8fCBwYXJ0aWNpcGFudD8uX2tleSB8fCAnJykpO1xuXG4gIGlmKCFzZXNzaW9uVXNlcklkIHx8ICFwYXJ0aWNpcGFudFVzZXJJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihFcnJvclR5cGVzLklOVkFMSURfQVVUSEVOVElDQVRJT04pO1xuICB9XG5cbiAgYXdhaXQgZW5zdXJlRGlyZWN0Q29udmVyc2F0aW9uRnJpZW5kc2hpcChjb250ZXh0LCBzZXNzaW9uVXNlcklkLCBwYXJ0aWNpcGFudFVzZXJJZCk7XG59O1xuXG5leHBvcnQgY29uc3QgcGFyc2VDb252ZXJzYXRpb25PcHRpb25zID0gKG9wdGlvbnM6IENvbnZlcnNhdGlvbk9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZnJvbSA9IDAsXG4gICAgdG8gPSAzMFxuICB9ID0gb3B0aW9ucztcblxuICByZXR1cm4ge1xuICAgIGxpbWl0OiBnZXRMaW1pdChmcm9tLCB0bykgYXMgQXJhbmdvRGJMaW1pdFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnZlcnNhdGlvbkxpc3RCeVVzZXIgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXJJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udmVyc2F0aW9uT3B0aW9uc1xuKTogUHJvbWlzZTxDb252ZXJzYXRpb25UeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldENvbnZlcnNhdGlvbnMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZUNvbnZlcnNhdGlvbk9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHVzZXJEb2NJZCA9IGB1c2Vycy8ke3VzZXJJZH1gO1xuICBjb25zdCBhcWxRcnkgPSBhcWxgXG4gICAgRk9SIGMsIGUgSU4gMS4uMSBPVVRCT1VORCAke3VzZXJEb2NJZH0gJHtoYXNDb252ZXJzYXRpb25Db2xsZWN0aW9ufVxuICAgICAgRklMVEVSIGMuY2hhdFNjaGVtYVZlcnNpb24gIT0gMVxuICAgICAgU09SVCBjLmFkZGVkIERFU0NcbiAgICAgICR7bGl0ZXJhbChsaW1pdC5hcWwpfVxuICAgICAgTEVUIHVzZXJzID0gKFxuICAgICAgICBGT1IgdSwgdWMgSU4gMS4uMSBJTkJPVU5EIGMuX2lkICR7aGFzQ29udmVyc2F0aW9uQ29sbGVjdGlvbn1cbiAgICAgICAgICBGSUxURVIgdS5faWQgIT0gJHt1c2VyRG9jSWR9XG4gICAgICAgICAgUkVUVVJOIHVcbiAgICAgIClcbiAgICAgIFJFVFVSTiBNRVJHRShjLCB7dXNlcnN9KVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBDb252ZXJzYXRpb25UeXBlW10pXG4gICAgLnRoZW4oKGNvbnZlcnNhdGlvbnMpID0+IGZpbHRlckJsb2NrZWRDb252ZXJzYXRpb25zKGNvbnRleHQsIGNvbnZlcnNhdGlvbnMpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGlyZWN0Q29udmVyc2F0aW9uID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7XG4gICAgZnJvbUlkLFxuICAgIHRvSWQsXG4gICAgdG9Vc2VyXG4gIH06IERpcmVjdENvbnZlcnNhdGlvblBhcmFtc1xuKTogUHJvbWlzZTxDb252ZXJzYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXREaXJlY3RDb252ZXJzYXRpb24nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBmb3JtYXRGcm9tSWQgPSBwYXJzZUlkKGZyb21JZCk7XG4gICAgY29uc3QgZm9ybWF0VG9JZCA9IHBhcnNlSWQodG9JZCk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0Q29udmVyc2F0aW9uRnJpZW5kc2hpcChjb250ZXh0LCBmb3JtYXRGcm9tSWQsIGZvcm1hdFRvSWQpO1xuICAgIGNvbnN0IHVzZXJJZHMgPSBbZm9ybWF0RnJvbUlkLCBmb3JtYXRUb0lkXTtcbiAgICBjb25zdCBzb3J0ZWRVc2VySWRzID0gc29ydElkcyh1c2VySWRzKTtcbiAgICBjb25zdCBjb252ZXJzYXRpb25JZCA9IGNyZWF0ZUhhc2goYGNvbnZlcnNhdGlvbnMtJHtzb3J0ZWRVc2VySWRzLmpvaW4oJy0nKX1gLCBudWxsKTtcbiAgICBjb25zdCB1c2VyOiBVc2VyVHlwZSA9IHRvVXNlciB8fCBhd2FpdCBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiBmb3JtYXRUb0lkfSk7XG4gICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgYyA9IERPQ1VNRU5UKCR7YGNvbnZlcnNhdGlvbnMvJHtjb252ZXJzYXRpb25JZH1gfSkgRklMVEVSIGMuY2hhdFNjaGVtYVZlcnNpb24gIT0gMSBSRVRVUk4gY2A7XG4gICAgY29uc3QgY29udmVyc2F0aW9uID0gYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG5cbiAgICBpZihjb252ZXJzYXRpb24pIHtcbiAgICAgIHJldHVybiB7Li4uY29udmVyc2F0aW9uLCB1c2VyczogW3VzZXJdfTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkRGlyZWN0Q29udmVyc2F0aW9uKGNvbnRleHQsIHtmcm9tSWQsIHRvSWQsIHRvVXNlcjogdXNlcn0pO1xuICB9IGNhdGNoKGRhdGFiYXNlRXJyb3IpIHtcbiAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGRhdGFiYXNlRXJyb3IsIGNvbnRleHQpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgYWRkRGlyZWN0Q29udmVyc2F0aW9uID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7XG4gICAgZnJvbUlkLFxuICAgIHRvSWQsXG4gICAgdG9Vc2VyXG4gIH06IERpcmVjdENvbnZlcnNhdGlvblBhcmFtc1xuKTogUHJvbWlzZTxDb252ZXJzYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXREaXJlY3RDb252ZXJzYXRpb24nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBmb3JtYXRGcm9tSWQgPSBwYXJzZUlkKGZyb21JZCk7XG4gICAgY29uc3QgZm9ybWF0VG9JZCA9IHBhcnNlSWQodG9JZCk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0Q29udmVyc2F0aW9uRnJpZW5kc2hpcChjb250ZXh0LCBmb3JtYXRGcm9tSWQsIGZvcm1hdFRvSWQpO1xuICAgIGNvbnN0IHVzZXJJZHMgPSBbZm9ybWF0RnJvbUlkLCBmb3JtYXRUb0lkXTtcbiAgICBjb25zdCBzb3J0ZWRVc2VySWRzID0gc29ydElkcyh1c2VySWRzKTtcbiAgICBjb25zdCB1c2VyOiBVc2VyVHlwZSA9IHRvVXNlciB8fCBhd2FpdCBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiBmb3JtYXRUb0lkfSk7XG4gICAgY29uc3QgY29udmVyc2F0aW9uSWQgPSBjcmVhdGVIYXNoKGBjb252ZXJzYXRpb25zLSR7c29ydGVkVXNlcklkcy5qb2luKCctJyl9YCwgbnVsbCk7XG5cbiAgICBjb25zdCBpbnNlcnQgPSB7XG4gICAgICBfa2V5OiBjb252ZXJzYXRpb25JZCxcbiAgICAgIGlzRGlyZWN0OiB0cnVlXG4gICAgfTtcbiAgICBjb25zdCB1cGRhdGVkQ29udmVyc2F0aW9uID0gYXdhaXQgYWRkSXRlbTxDb252ZXJzYXRpb25UeXBlPihjb250ZXh0LCAnY29udmVyc2F0aW9ucycsIGluc2VydCk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbCh1c2VySWRzLm1hcCgodXNlcklkKSA9PiB7XG4gICAgICBjb25zdCBlZGdlSWQgPSBjcmVhdGVIYXNoKGBoYXNDb252ZXJzYXRpb24tJHt1c2VySWR9LSR7Y29udmVyc2F0aW9uSWR9YCk7XG4gICAgICBjb25zdCBlZGdlOiBFZGdlVHlwZSA9IHtcbiAgICAgICAgX2Zyb206IGB1c2Vycy8ke3VzZXJJZH1gLFxuICAgICAgICBfa2V5OiBlZGdlSWQsXG4gICAgICAgIF90bzogYGNvbnZlcnNhdGlvbnMvJHtjb252ZXJzYXRpb25JZH1gLFxuICAgICAgICBhZGRlZDogRGF0ZS5ub3coKVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGluc2VydEVkZ2VRdWVyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7ZWRnZX0gSU4gaGFzQ29udmVyc2F0aW9uIFJFVFVSTiBORVdgO1xuICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoaW5zZXJ0RWRnZVF1ZXJ5KTtcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gey4uLnVwZGF0ZWRDb252ZXJzYXRpb24sIHVzZXJzOiBbdXNlcl19O1xuICB9IGNhdGNoKGRhdGFiYXNlRXJyb3IpIHtcbiAgICBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZGF0YWJhc2VFcnJvciwgY29udGV4dCk7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29ubmVjdGlvblVzZXJMaXN0ID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7XG4gICAgY29udmVyc2F0aW9uSWQsXG4gICAgaW5jbHVkZUFsbCA9IGZhbHNlLFxuICAgIGlzRGlyZWN0XG4gIH06IENvbnZlcnNhdGlvblVzZXJzUGFyYW1zXG4pOiBQcm9taXNlPENvbm5lY3Rpb25UeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldENvbm5lY3Rpb25Vc2VyTGlzdCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25Vc2VySWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZpbHRlcnM6IHN0cmluZ1tdID0gWydjLnVzZXJJZCA9PSB1Ll9rZXknXTtcblxuICBpZighaW5jbHVkZUFsbCkge1xuICAgIGZpbHRlcnMucHVzaChgdS5fa2V5ICE9ICR7c2Vzc2lvblVzZXJJZH1gKTtcbiAgfVxuICBpZihpc0RpcmVjdCkge1xuICAgIGZpbHRlcnMucHVzaChgcC52ZXJ0aWNlc1swXS5pc0RpcmVjdCA9PSAke2lzRGlyZWN0fWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgdSwgZSxwIElOIDEuLjEgSU5CT1VORCAke2Bjb252ZXJzYXRpb25zLyR7Y29udmVyc2F0aW9uSWR9YH0gaGFzQ29udmVyc2F0aW9uXG4gICAgT1BUSU9OUyB7dmVydGV4Q29sbGVjdGlvbnM6IFwidXNlcnNcIn1cbiAgICBGSUxURVIgRE9DVU1FTlQoJHtgY29udmVyc2F0aW9ucy8ke2NvbnZlcnNhdGlvbklkfWB9KS5jaGF0U2NoZW1hVmVyc2lvbiAhPSAxXG4gICAgRk9SIGMgSU4gY29ubmVjdGlvbnNcbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyAmJiAnKX1cbiAgICBSRVRVUk4gY2A7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIENvbm5lY3Rpb25UeXBlW10pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb252ZXJzYXRpb25Vc2VycyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge1xuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIGluY2x1ZGVBbGwgPSBmYWxzZSxcbiAgICBpc0RpcmVjdFxuICB9OiBDb252ZXJzYXRpb25Vc2Vyc1BhcmFtc1xuKTogUHJvbWlzZTxDb252ZXJzYXRpb25UeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldENvbnZlcnNhdGlvblVzZXJzJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvblVzZXJJZH19ID0gY29udGV4dDtcbiAgY29uc3QgZmlsdGVyczogc3RyaW5nW10gPSBbJ2MudXNlcklkID09IHUuX2tleSddO1xuXG4gIGlmKCFpbmNsdWRlQWxsKSB7XG4gICAgZmlsdGVycy5wdXNoKGB1Ll9rZXkgIT0gJHtzZXNzaW9uVXNlcklkfWApO1xuICB9XG4gIGlmKGlzRGlyZWN0KSB7XG4gICAgZmlsdGVycy5wdXNoKGBwLnZlcnRpY2VzWzBdLmlzRGlyZWN0ID09ICR7aXNEaXJlY3R9YCk7XG4gIH1cblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB1LCBlLHAgSU4gMS4uMSBJTkJPVU5EICR7YGNvbnZlcnNhdGlvbnMvJHtjb252ZXJzYXRpb25JZH1gfSBoYXNDb252ZXJzYXRpb25cbiAgICBPUFRJT05TIHt2ZXJ0ZXhDb2xsZWN0aW9uczogXCJ1c2Vyc1wifVxuICAgIEZJTFRFUiBET0NVTUVOVCgke2Bjb252ZXJzYXRpb25zLyR7Y29udmVyc2F0aW9uSWR9YH0pLmNoYXRTY2hlbWFWZXJzaW9uICE9IDFcbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyAmJiAnKX1cbiAgICBSRVRVUk4gdWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIENvbnZlcnNhdGlvblR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnZlcnNhdGlvbkJ5SWQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgY29udmVyc2F0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0SXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qgc2Vzc2lvbkRvY0lkID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbkRvY0lkID0gYGNvbnZlcnNhdGlvbnMvJHtwYXJzZUlkKGNvbnZlcnNhdGlvbklkKX1gO1xuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGMsIGUgSU4gMS4uMSBPVVRCT1VORCAke3Nlc3Npb25Eb2NJZH0gaGFzQ29udmVyc2F0aW9uXG4gICAgRklMVEVSIGMuX2lkID09ICR7Y29udmVyc2F0aW9uRG9jSWR9IEFORCBjLmNoYXRTY2hlbWFWZXJzaW9uICE9IDFcbiAgICBMRVQgdSA9IChcbiAgICAgIEZPUiBpblVzZXIsIGluRWRnZSBJTiAxLi4xIElOQk9VTkQgJHtjb252ZXJzYXRpb25Eb2NJZH0gaGFzQ29udmVyc2F0aW9uXG4gICAgICBSRVRVUk4gaW5Vc2VyXG4gICAgKVxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gTUVSR0UoYywge3VzZXJzOiB1fSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChjb252ZXJzYXRpb246IENvbnZlcnNhdGlvblR5cGUpID0+IHtcbiAgICAgIGlmKCFjb252ZXJzYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnZlcnNhdGlvbjtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVDb252ZXJzYXRpb24gPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uVHlwZVxuKTogUHJvbWlzZTxDb252ZXJzYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICd1cGRhdGVDb252ZXJzYXRpb24nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBjb252ZXJzYXRpb25JZCA9IGNyZWF0ZUhhc2goYGNvbnZlcnNhdGlvbi0ke3Nlc3Npb25JZH0gYCksXG4gICAgaXNEaXJlY3QgPSBmYWxzZSxcbiAgICBuYW1lXG4gIH0gPSBjb252ZXJzYXRpb247XG4gIGNvbnN0IGZvcm1hdENvbnZlcnNhdGlvbklkID0gcGFyc2VJZChjb252ZXJzYXRpb25JZCk7XG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICBpc0RpcmVjdCxcbiAgICBuYW1lXG4gIH07XG5cbiAgY29uc3QgaW5zZXJ0ID0ge1xuICAgIC4uLmNsb25lRGVlcCh1cGRhdGUpLFxuICAgIF9rZXk6IGZvcm1hdENvbnZlcnNhdGlvbklkXG4gIH07XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgY3VycmVudCA9IERPQ1VNRU5UKCdjb252ZXJzYXRpb25zJywgJHtmb3JtYXRDb252ZXJzYXRpb25JZH0pXG4gICAgRklMVEVSIGN1cnJlbnQuY2hhdFNjaGVtYVZlcnNpb24gIT0gMVxuICAgIFVQU0VSVCB7X2tleTogJHtmb3JtYXRDb252ZXJzYXRpb25JZH0gfVxuICAgIElOU0VSVCAke2luc2VydH1cbiAgICBVUERBVEUgJHt1cGRhdGV9XG4gICAgSU4gY29udmVyc2F0aW9ucyBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigoY29udmVyc2F0aW9uOiBDb252ZXJzYXRpb25UeXBlKSA9PiBjb252ZXJzYXRpb24pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFVzZXJUb0NvbnZlcnNhdGlvbiA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge1xuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIHVzZXJJZFxuICB9OiBVcGRhdGVDb252ZXJzYXRpb25Vc2VyUGFyYW1zXG4pOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2FkZFVzZXJUb0NvbnZlcnNhdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0Q29udmVyc2F0aW9uSWQgPSBwYXJzZUlkKGNvbnZlcnNhdGlvbklkKTtcbiAgY29uc3QgZm9ybWF0VXNlcklkID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCBjb252ZXJzYXRpb25Eb2NJZCA9IGBjb252ZXJzYXRpb25zLyR7Zm9ybWF0Q29udmVyc2F0aW9uSWR9YDtcbiAgY29uc3QgdXNlckRvY0lkID0gYHVzZXJzLyR7Zm9ybWF0VXNlcklkfWA7XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgY29udmVyc2F0aW9uID0gRE9DVU1FTlQoJHtjb252ZXJzYXRpb25Eb2NJZH0pXG4gICAgUkVUVVJOIGNvbnZlcnNhdGlvbi5jaGF0U2NoZW1hVmVyc2lvbiA9PSAxID8ge2NoYXRTY2hlbWFWZXJzaW9uOiAxfSA6IEZJUlNUKFxuICAgICAgRk9SIGhjIElOIGhhc0NvbnZlcnNhdGlvblxuICAgICAgICBGSUxURVIgaGMuX2Zyb20gPT0gJHt1c2VyRG9jSWR9ICYmIGhjLl90byA9PSAke2NvbnZlcnNhdGlvbkRvY0lkfVxuICAgICAgICBMSU1JVCAxIFJFVFVSTiBoYylgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChoYXNDb252ZXJzYXRpb25FZGdlKSA9PiB7XG4gICAgICBpZihoYXNDb252ZXJzYXRpb25FZGdlPy5jaGF0U2NoZW1hVmVyc2lvbiA9PT0gMSkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICBpZighIWhhc0NvbnZlcnNhdGlvbkVkZ2UpIHtcbiAgICAgICAgcmV0dXJuIGhhc0NvbnZlcnNhdGlvbkVkZ2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVkZ2VDb2xsZWN0aW9uOiBFZGdlQ29sbGVjdGlvbiA9IHVzZURiKGRhdGFiYXNlTmFtZSkuY29sbGVjdGlvbignaGFzQ29udmVyc2F0aW9uJyk7XG4gICAgICBjb25zdCBlZGdlSWQgPSBjcmVhdGVIYXNoKGBjb252ZXJzYXRpb24tJHtmb3JtYXRDb252ZXJzYXRpb25JZH0tJHtmb3JtYXRVc2VySWR9YCk7XG5cbiAgICAgIGNvbnN0IGVkZ2U6IENvbnZlcnNhdGlvblR5cGUgPSB7XG4gICAgICAgIF9mcm9tOiB1c2VyRG9jSWQsXG4gICAgICAgIF9rZXk6IGVkZ2VJZCxcbiAgICAgICAgX3RvOiBjb252ZXJzYXRpb25Eb2NJZCxcbiAgICAgICAgYWRkZWQ6IERhdGUubm93KClcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBlZGdlQ29sbGVjdGlvblxuICAgICAgICAuc2F2ZShlZGdlLCB7cmV0dXJuTmV3OiB0cnVlfSlcbiAgICAgICAgLnRoZW4oKCkgPT4gZWRnZSk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlVXNlckZyb21Db252ZXJzYXRpb24gPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICB1c2VySWRcbiAgfTogVXBkYXRlQ29udmVyc2F0aW9uVXNlclBhcmFtc1xuKTogUHJvbWlzZTxDb252ZXJzYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdkZWxldGVVc2VyRnJvbUNvbnZlcnNhdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0Q29udmVyc2F0aW9uSWQgPSBwYXJzZUlkKGNvbnZlcnNhdGlvbklkKTtcbiAgY29uc3QgZm9ybWF0VXNlcklkID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCBjb252ZXJzYXRpb25Eb2NJZCA9IGBjb252ZXJzYXRpb25zLyR7Zm9ybWF0Q29udmVyc2F0aW9uSWR9YDtcbiAgY29uc3QgdXNlckRvY0lkID0gYHVzZXJzLyR7Zm9ybWF0VXNlcklkfWA7XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgaGMgSU4gaGFzQ29udmVyc2F0aW9uXG4gICAgRklMVEVSIGhjLl9mcm9tID09ICR7dXNlckRvY0lkfSAmJiBoYy5fdG8gPT0gJHtjb252ZXJzYXRpb25Eb2NJZH1cbiAgICAgIEFORCBET0NVTUVOVCgke2NvbnZlcnNhdGlvbkRvY0lkfSkuY2hhdFNjaGVtYVZlcnNpb24gIT0gMVxuICAgIExJTUlUIDFcbiAgICBSRU1PVkUgaGMgSU4gaGFzQ29udmVyc2F0aW9uXG4gICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcbiJdLCJuYW1lcyI6WyJjbG9uZURlZXAiLCJjcmVhdGVIYXNoIiwicGFyc2VJZCIsImFxbCIsImxpdGVyYWwiLCJFcnJvclR5cGVzIiwibG9nRXJyb3IiLCJnZXRMaW1pdCIsInNvcnRJZHMiLCJ1c2VEYiIsImFkZEl0ZW0iLCJnZXRQZXJzb25hUmVsYXRpb25zaGlwU3RhdGUiLCJpc1BlcnNvbmFWaXNpYmlsaXR5QmxvY2tlZCIsImdldFVzZXJCeUlkIiwiZXZlbnRDYXRlZ29yeSIsImhhc0NvbnZlcnNhdGlvbkNvbGxlY3Rpb24iLCJlbnN1cmVEaXJlY3RDb252ZXJzYXRpb25GcmllbmRzaGlwIiwiY29udGV4dCIsImZyb21Vc2VySWQiLCJ0b1VzZXJJZCIsImZyb21Vc2VyIiwidG9Vc2VyIiwiUHJvbWlzZSIsImFsbCIsInVzZXJJZCIsImZyb21QZXJzb25hSWQiLCJTdHJpbmciLCJwZXJzb25hSWQiLCJ0b1BlcnNvbmFJZCIsIkVycm9yIiwiSU5WQUxJRF9BVVRIRU5USUNBVElPTiIsInJlbGF0aW9uc2hpcCIsImlzRnJpZW5kIiwiZmlsdGVyQmxvY2tlZENvbnZlcnNhdGlvbnMiLCJjb252ZXJzYXRpb25zIiwic2Vzc2lvblBlcnNvbmFJZCIsInNlc3Npb24iLCJsZW5ndGgiLCJ2aXNpYmlsaXR5IiwibWFwIiwiY29udmVyc2F0aW9uIiwiaXNEaXJlY3QiLCJwYXJ0aWNpcGFudCIsIkFycmF5IiwiaXNBcnJheSIsInVzZXJzIiwiZmluZCIsInVzZXIiLCJfa2V5IiwicGFydGljaXBhbnRQZXJzb25hSWQiLCJmaWx0ZXIiLCJfY29udmVyc2F0aW9uIiwiaW5kZXgiLCJlbnN1cmVDb252ZXJzYXRpb25NZXNzYWdpbmdBbGxvd2VkIiwiY29udmVyc2F0aW9uSWQiLCJnZXRDb252ZXJzYXRpb25CeUlkIiwic2Vzc2lvblVzZXJJZCIsInBhcnRpY2lwYW50VXNlcklkIiwicGFyc2VDb252ZXJzYXRpb25PcHRpb25zIiwib3B0aW9ucyIsImZyb20iLCJ0byIsImxpbWl0IiwiZ2V0Q29udmVyc2F0aW9uTGlzdEJ5VXNlciIsImFjdGlvbiIsImRhdGFiYXNlTmFtZSIsInVzZXJEb2NJZCIsImFxbFFyeSIsInF1ZXJ5IiwidGhlbiIsImN1cnNvciIsImNhdGNoIiwiZXJyb3IiLCJjYXRlZ29yeSIsImxhYmVsIiwiREFUQUJBU0VfRVJST1IiLCJnZXREaXJlY3RDb252ZXJzYXRpb24iLCJmcm9tSWQiLCJ0b0lkIiwiZm9ybWF0RnJvbUlkIiwiZm9ybWF0VG9JZCIsInVzZXJJZHMiLCJzb3J0ZWRVc2VySWRzIiwiam9pbiIsIm5leHQiLCJhZGREaXJlY3RDb252ZXJzYXRpb24iLCJkYXRhYmFzZUVycm9yIiwiaW5zZXJ0IiwidXBkYXRlZENvbnZlcnNhdGlvbiIsImVkZ2VJZCIsImVkZ2UiLCJfZnJvbSIsIl90byIsImFkZGVkIiwiRGF0ZSIsIm5vdyIsImluc2VydEVkZ2VRdWVyeSIsImdldENvbm5lY3Rpb25Vc2VyTGlzdCIsImluY2x1ZGVBbGwiLCJmaWx0ZXJzIiwicHVzaCIsImdldENvbnZlcnNhdGlvblVzZXJzIiwic2Vzc2lvbklkIiwic2Vzc2lvbkRvY0lkIiwiY29udmVyc2F0aW9uRG9jSWQiLCJ1cGRhdGVDb252ZXJzYXRpb24iLCJuYW1lIiwiZm9ybWF0Q29udmVyc2F0aW9uSWQiLCJ1cGRhdGUiLCJhZGRVc2VyVG9Db252ZXJzYXRpb24iLCJmb3JtYXRVc2VySWQiLCJoYXNDb252ZXJzYXRpb25FZGdlIiwiY2hhdFNjaGVtYVZlcnNpb24iLCJlZGdlQ29sbGVjdGlvbiIsImNvbGxlY3Rpb24iLCJzYXZlIiwicmV0dXJuTmV3IiwiZGVsZXRlVXNlckZyb21Db252ZXJzYXRpb24iXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELDRHQUE0RyxHQUM1RyxTQUFRQSxTQUFTLFFBQU8sNkJBQTZCO0FBQ3JELFNBQVFDLFVBQVUsRUFBRUMsT0FBTyxRQUFPLCtCQUErQjtBQUNqRSxTQUFRQyxHQUFHLFFBQU8sV0FBVztBQUM3QixTQUFRQyxPQUFPLFFBQU8sZUFBZTtBQUVyQyxTQUFRQyxVQUFVLFFBQU8sMEJBQTBCO0FBQ25ELFNBQVFDLFFBQVEsUUFBTyw2QkFBNkI7QUFDcEQsU0FBUUMsUUFBUSxFQUFFQyxPQUFPLEVBQUVDLEtBQUssUUFBTyw0QkFBNEI7QUFDbkUsU0FBUUMsT0FBTyxRQUFPLFlBQVk7QUFDbEMsU0FBUUMsMkJBQTJCLEVBQUVDLDBCQUEwQixRQUFPLGdCQUFnQjtBQUN0RixTQUFRQyxXQUFXLFFBQU8sYUFBYTtBQWdCdkMsTUFBTUMsZ0JBQWdCO0FBQ3RCLE1BQU1DLDRCQUE0QlgsUUFBUTtBQUUxQyxNQUFNWSxxQ0FBcUMsT0FDekNDLFNBQ0FDLFlBQ0FDO0lBRUEsTUFBTSxDQUFDQyxVQUFVQyxPQUFPLEdBQUcsTUFBTUMsUUFBUUMsR0FBRyxDQUFDO1FBQzNDVixZQUFZSSxTQUFTO1lBQUNPLFFBQVFOO1FBQVU7UUFDeENMLFlBQVlJLFNBQVM7WUFBQ08sUUFBUUw7UUFBUTtLQUN2QztJQUNELE1BQU1NLGdCQUFnQnZCLFFBQVF3QixPQUFPTixVQUFVTyxhQUFhO0lB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
@@ -3,6 +3,7 @@
3
3
  * All rights reserved. Use is subject to the accompanying commercial LICENSE.
4
4
  */ import { aql } from 'arangojs';
5
5
  import { literal } from 'arangojs/aql';
6
+ import { organizationAccountMutation, organizationAccountWriteGuard } from '../organizations/accountLifecycle.js';
6
7
  import { ErrorTypes } from '../types/error.types.js';
7
8
  import { logError } from '../utils/analyticsUtils.js';
8
9
  import { buildFilterClause } from '../utils/aqlHelpers.js';
@@ -236,6 +237,12 @@ const eventCategory = 'crud';
236
237
  const action = 'updateItem';
237
238
  const { databaseName, session: { userId: sessionId } = {} } = context;
238
239
  const { hooks = false, ownership = false } = options;
240
+ if (collection === 'users') {
241
+ const managed = await organizationAccountMutation(context, id, 'update', updates);
242
+ if (managed) {
243
+ return managed;
244
+ }
245
+ }
239
246
  try {
240
247
  const config = registry.get(collection);
241
248
  let updateData = {
@@ -262,15 +269,18 @@ const eventCategory = 'crud';
262
269
  // Build query with ownership check if needed
263
270
  let aqlQuery;
264
271
  const collectionLiteral = literal(collection);
272
+ const accountGuard = organizationAccountWriteGuard(context, collection);
265
273
  if (ownership && sessionId) {
266
274
  aqlQuery = aql`FOR doc IN ${collectionLiteral}
267
275
  FILTER doc._id == ${docId} && doc.userId == ${sessionId}
276
+ FILTER ${accountGuard}
268
277
  LIMIT 1
269
278
  UPDATE doc WITH ${updateData} IN ${collectionLiteral}
270
279
  RETURN NEW`;
271
280
  } else {
272
281
  aqlQuery = aql`FOR doc IN ${collectionLiteral}
273
282
  FILTER doc._id == ${docId}
283
+ FILTER ${accountGuard}
274
284
  LIMIT 1
275
285
  UPDATE doc WITH ${updateData} IN ${collectionLiteral}
276
286
  RETURN NEW`;
@@ -300,6 +310,12 @@ const eventCategory = 'crud';
300
310
  const action = 'deleteItem';
301
311
  const { databaseName, session: { userId: sessionId } = {} } = context;
302
312
  const { soft = false, cascade = [], ownership = false } = options;
313
+ if (collection === 'users') {
314
+ const managed = await organizationAccountMutation(context, id, soft ? 'deactivate' : 'delete', {});
315
+ if (managed) {
316
+ return managed;
317
+ }
318
+ }
303
319
  try {
304
320
  const config = registry.get(collection);
305
321
  const database = useDb(databaseName);
@@ -319,6 +335,7 @@ const eventCategory = 'crud';
319
335
  const collectionLiteral = literal(collection);
320
336
  const aqlQuery = aql`FOR doc IN ${collectionLiteral}
321
337
  FILTER doc._id == ${docId}
338
+ FILTER ${organizationAccountWriteGuard(context, collection)}
322
339
  LIMIT 1
323
340
  UPDATE doc WITH ${update} IN ${collectionLiteral}
324
341
  RETURN NEW`;
@@ -332,11 +349,19 @@ const eventCategory = 'crud';
332
349
  const aqlQuery = aql`
333
350
  FOR doc IN ${literal(collection)}
334
351
  FILTER doc._id == ${docId} && doc.userId == ${sessionId}
352
+ FILTER ${organizationAccountWriteGuard(context, collection)}
335
353
  REMOVE doc IN ${literal(collection)}
336
354
  RETURN OLD
337
355
  `;
338
356
  const result = await database.query(aqlQuery);
339
357
  deletedItem = await result.next();
358
+ } else if (collection === 'users' && databaseName === process.env.ARANGODB_DATABASE) {
359
+ const aqlQuery = aql`FOR doc IN users
360
+ FILTER doc._key == ${docKey}
361
+ FILTER ${organizationAccountWriteGuard(context, collection)}
362
+ REMOVE doc IN users RETURN OLD`;
363
+ const result = await database.query(aqlQuery);
364
+ deletedItem = await result.next();
340
365
  } else {
341
366
  const aqlQuery = aql`REMOVE ${docKey} IN ${literal(collection)} RETURN OLD`;
342
367
  const result = await database.query(aqlQuery);
@@ -410,4 +435,4 @@ const eventCategory = 'crud';
410
435
  return count > 0;
411
436
  };
412
437
 
413
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jcnVkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBpcyBzdWJqZWN0IHRvIHRoZSBhY2NvbXBhbnlpbmcgY29tbWVyY2lhbCBMSUNFTlNFLlxuICovXG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtsaXRlcmFsfSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuaW1wb3J0IHtFcnJvclR5cGVzfSBmcm9tICcuLi90eXBlcy9lcnJvci50eXBlcy5qcyc7XG5pbXBvcnQge2xvZ0Vycm9yfSBmcm9tICcuLi91dGlscy9hbmFseXRpY3NVdGlscy5qcyc7XG5pbXBvcnQge2J1aWxkRmlsdGVyQ2xhdXNlfSBmcm9tICcuLi91dGlscy9hcWxIZWxwZXJzLmpzJztcbmltcG9ydCB7dXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMuanMnO1xuaW1wb3J0IHtyZWdpc3RyeX0gZnJvbSAnLi4vdXRpbHMvY29sbGVjdGlvblJlZ2lzdHJ5LmpzJztcblxuaW1wb3J0IHR5cGUge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuaW1wb3J0IHR5cGUge0ZpbHRlckdyb3VwfSBmcm9tICcuLi90eXBlcy9hcmFuZ29kYi50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnkgPSAnY3J1ZCc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgQ1JVRCBvcGVyYXRpb25zXG4gKi9cbmV4cG9ydCB0eXBlIENydWRPcHRpb25zID0gUmVhZG9ubHk8e1xuICByZWFkb25seSBzb3J0PzogUmVhZG9ubHlBcnJheTx7cmVhZG9ubHkgZmllbGQ6IHN0cmluZzsgcmVhZG9ubHkgZGlyZWN0aW9uOiAnQVNDJyB8ICdERVNDJ30+O1xuICByZWFkb25seSBsaW1pdD86IHtyZWFkb25seSBmcm9tOiBudW1iZXI7IHJlYWRvbmx5IHRvOiBudW1iZXJ9O1xuICByZWFkb25seSBmaWVsZHM/OiBSZWFkb25seUFycmF5PHN0cmluZz47IC8vIFNlbGVjdCBzcGVjaWZpYyBmaWVsZHNcbiAgcmVhZG9ubHkgaW5jbHVkZUVkZ2VzPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+OyAvLyBJbmNsdWRlIHJlbGF0ZWQgZG9jdW1lbnRzIHZpYSBlZGdlc1xuICByZWFkb25seSBwcml2YWN5PzogYm9vbGVhbjsgLy8gQXBwbHkgcHJpdmFjeSBjaGVja3MgKGRlZmF1bHQ6IHRydWUpXG4gIHJlYWRvbmx5IG93bmVyc2hpcD86IGJvb2xlYW47IC8vIEFwcGx5IG93bmVyc2hpcCBjaGVja3MgKGRlZmF1bHQ6IGZhbHNlKVxuICByZWFkb25seSBjdXN0b21RdWVyaWVzPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+OyAvLyBBZGRpdGlvbmFsIGN1c3RvbSBxdWVyeSBzdHJpbmdzXG4gIHJlYWRvbmx5IGN1c3RvbU9iamVjdHM/OiBSZWFkb25seUFycmF5PHN0cmluZz47IC8vIEFkZGl0aW9uYWwgY3VzdG9tIG9iamVjdCBzZWxlY3Rpb25zXG59PjtcblxuLyoqXG4gKiBCdWlsZCBmaWx0ZXIgY2xhdXNlIGZyb20gZmlsdGVycyBvYmplY3Qgb3IgRmlsdGVyR3JvdXBcbiAqL1xuY29uc3QgYnVpbGRGaWx0ZXJzID0gKFxuICBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgRmlsdGVyR3JvdXAsXG4gIHZhck5hbWU6IHN0cmluZyA9ICdkb2MnXG4pOiBzdHJpbmcgPT4ge1xuICAvLyBJZiBpdCdzIGEgRmlsdGVyR3JvdXAgd2l0aCBsb2dpYyBhbmQgY29uZGl0aW9uc1xuICBpZiAoJ2xvZ2ljJyBpbiBmaWx0ZXJzICYmICdjb25kaXRpb25zJyBpbiBmaWx0ZXJzKSB7XG4gICAgcmV0dXJuIGJ1aWxkRmlsdGVyQ2xhdXNlKGZpbHRlcnMgYXMgRmlsdGVyR3JvdXAsIHZhck5hbWUpO1xuICB9XG5cbiAgLy8gU2ltcGxlIG9iamVjdCBmaWx0ZXJzXG4gIGNvbnN0IHNpbXBsZUZpbHRlcnMgPSBmaWx0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGNvbnN0IGNvbmRpdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2ltcGxlRmlsdGVycykpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChgJHt2YXJOYW1lfS4ke2tleX0gPT0gbnVsbGApO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGAke3Zhck5hbWV9LiR7a2V5fSA9PSBcIiR7dmFsdWV9XCJgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGAke3Zhck5hbWV9LiR7a2V5fSA9PSAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucy5qb2luKCcgJiYgJyk7XG59O1xuXG4vKipcbiAqIEJ1aWxkIHNvcnQgY2xhdXNlXG4gKi9cbmNvbnN0IGJ1aWxkU29ydCA9IChcbiAgc29ydDogUmVhZG9ubHlBcnJheTx7cmVhZG9ubHkgZmllbGQ6IHN0cmluZzsgcmVhZG9ubHkgZGlyZWN0aW9uOiAnQVNDJyB8ICdERVNDJ30+LFxuICB2YXJOYW1lOiBzdHJpbmcgPSAnZG9jJ1xuKTogc3RyaW5nID0+IHtcbiAgaWYgKCFzb3J0IHx8IHNvcnQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3Qgc29ydFBhcnRzID0gc29ydC5tYXAoKHtmaWVsZCwgZGlyZWN0aW9ufSkgPT4gYCR7dmFyTmFtZX0uJHtmaWVsZH0gJHtkaXJlY3Rpb259YCk7XG4gIHJldHVybiBgU09SVCAke3NvcnRQYXJ0cy5qb2luKCcsICcpfWA7XG59O1xuXG4vKipcbiAqIEJ1aWxkIGxpbWl0IGNsYXVzZVxuICovXG5jb25zdCBidWlsZExpbWl0ID0gKGxpbWl0Pzoge3JlYWRvbmx5IGZyb206IG51bWJlcjsgcmVhZG9ubHkgdG86IG51bWJlcn0pOiBzdHJpbmcgPT4ge1xuICBpZiAoIWxpbWl0KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3Qge2Zyb20sIHRvfSA9IGxpbWl0O1xuICBjb25zdCBjb3VudCA9IHRvIC0gZnJvbTtcbiAgcmV0dXJuIGBMSU1JVCAke2Zyb219LCAke2NvdW50fWA7XG59O1xuXG4vKipcbiAqIEFwcGx5IHByaXZhY3kgZmlsdGVyIGlmIGNvbGxlY3Rpb24gaGFzIHByaXZhY3lcbiAqL1xuY29uc3QgYXBwbHlQcml2YWN5RmlsdGVyID0gKFxuICBjb2xsZWN0aW9uOiBzdHJpbmcsXG4gIHNlc3Npb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB2YXJOYW1lOiBzdHJpbmcgPSAnZG9jJ1xuKTogc3RyaW5nID0+IHtcbiAgY29uc3QgY29uZmlnID0gcmVnaXN0cnkuZ2V0KGNvbGxlY3Rpb24pO1xuXG4gIGlmICghY29uZmlnIHx8ICFjb25maWcuaGFzUHJpdmFjeSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8vIElmIG5vIHNlc3Npb24sIG9ubHkgcmV0dXJuIHB1YmxpYyBpdGVtc1xuICBpZiAoIXNlc3Npb25JZCkge1xuICAgIHJldHVybiBgJHt2YXJOYW1lfS5wcml2YWN5ID09IFwicHVibGljXCJgO1xuICB9XG5cbiAgLy8gUmV0dXJuIGl0ZW1zIHRoYXQgYXJlIHB1YmxpYyBPUiBvd25lZCBieSB0aGUgdXNlclxuICByZXR1cm4gYCgke3Zhck5hbWV9LnByaXZhY3kgPT0gXCJwdWJsaWNcIiB8fCAke3Zhck5hbWV9LnVzZXJJZCA9PSBcIiR7c2Vzc2lvbklkfVwiKWA7XG59O1xuXG4vKipcbiAqIEFwcGx5IG93bmVyc2hpcCBmaWx0ZXJcbiAqL1xuY29uc3QgYXBwbHlPd25lcnNoaXBGaWx0ZXIgPSAoXG4gIHNlc3Npb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB2YXJOYW1lOiBzdHJpbmcgPSAnZG9jJ1xuKTogc3RyaW5nID0+IHtcbiAgaWYgKCFzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm4gYCR7dmFyTmFtZX0udXNlcklkID09IFwiJHtzZXNzaW9uSWR9XCJgO1xufTtcblxuLyoqXG4gKiBHZXQgYSBzaW5nbGUgaXRlbSBmcm9tIGFueSBjb2xsZWN0aW9uIGJ5IGZpbHRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEl0ZW1CeSA9IGFzeW5jIDxUID0gYW55PihcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgY29sbGVjdGlvbjogc3RyaW5nLFxuICBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgRmlsdGVyR3JvdXAsXG4gIG9wdGlvbnM6IENydWRPcHRpb25zID0ge31cbik6IFByb21pc2U8VCB8IG51bGw+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEl0ZW1CeSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH0gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCB7cHJpdmFjeSA9IGZhbHNlLCBvd25lcnNoaXAgPSBmYWxzZSwgY3VzdG9tUXVlcmllcyA9IFtdLCBjdXN0b21PYmplY3RzID0gW119ID0gb3B0aW9ucztcblxuICB0cnkge1xuICAgIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2VOYW1lKTtcbiAgICBjb25zdCBmaWx0ZXJDbGF1c2UgPSBidWlsZEZpbHRlcnMoZmlsdGVycywgJ2RvYycpO1xuICAgIGNvbnN0IGNvbmRpdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoZmlsdGVyQ2xhdXNlKSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goZmlsdGVyQ2xhdXNlKTtcbiAgICB9XG5cbiAgICBpZiAocHJpdmFjeSkge1xuICAgICAgY29uc3QgcHJpdmFjeUZpbHRlciA9IGFwcGx5UHJpdmFjeUZpbHRlcihjb2xsZWN0aW9uLCBzZXNzaW9uSWQsICdkb2MnKTtcbiAgICAgIGlmIChwcml2YWN5RmlsdGVyKSB7XG4gICAgICAgIGNvbmRpdGlvbnMucHVzaChwcml2YWN5RmlsdGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3duZXJzaGlwKSB7XG4gICAgICBjb25zdCBvd25lcnNoaXBGaWx0ZXIgPSBhcHBseU93bmVyc2hpcEZpbHRlcihzZXNzaW9uSWQsICdkb2MnKTtcbiAgICAgIGlmIChvd25lcnNoaXBGaWx0ZXIpIHtcbiAgICAgICAgY29uZGl0aW9ucy5wdXNoKG93bmVyc2hpcEZpbHRlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29sbGVjdGlvbkxpdGVyYWwgPSBsaXRlcmFsKGNvbGxlY3Rpb24pO1xuICAgIGNvbnN0IHdoZXJlQ2xhdXNlID0gY29uZGl0aW9ucy5sZW5ndGggPiAwID8gbGl0ZXJhbChgRklMVEVSICR7Y29uZGl0aW9ucy5qb2luKCcgJiYgJyl9YCkgOiBsaXRlcmFsKCcnKTtcbiAgICBjb25zdCBjdXN0b21RdWVyaWVzTGl0ZXJhbCA9IGN1c3RvbVF1ZXJpZXMubGVuZ3RoID4gMCA/IGxpdGVyYWwoY3VzdG9tUXVlcmllcy5qb2luKCdcXG4nKSkgOiBsaXRlcmFsKCcnKTtcbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGN1c3RvbU9iamVjdHMubGVuZ3RoID4gMFxuICAgICAgPyBsaXRlcmFsKGBNRVJHRShkb2MsIHske2N1c3RvbU9iamVjdHMuam9pbignLCAnKX19KWApXG4gICAgICA6IGxpdGVyYWwoJ2RvYycpO1xuXG4gICAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgICAgRk9SIGRvYyBJTiAke2NvbGxlY3Rpb25MaXRlcmFsfVxuICAgICAgICAke3doZXJlQ2xhdXNlfVxuICAgICAgICAke2N1c3RvbVF1ZXJpZXNMaXRlcmFsfVxuICAgICAgICBMSU1JVCAxXG4gICAgICAgIFJFVFVSTiAke3JldHVyblZhbHVlfVxuICAgIGA7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSk7XG4gICAgY29uc3QgaXRlbSA9IGF3YWl0IHJlc3VsdC5uZXh0KCk7XG5cbiAgICByZXR1cm4gaXRlbSB8fCBudWxsO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1IsXG4gICAgICBwYXJhbXM6IHtjb2xsZWN0aW9uLCBmaWx0ZXJzfVxuICAgIH0sIGVycm9yIGFzIEVycm9yLCBjb250ZXh0KTtcbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgbXVsdGlwbGUgaXRlbXMgZnJvbSBhbnkgY29sbGVjdGlvbiBieSBmaWx0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRMaXN0QnkgPSBhc3luYyA8VCA9IGFueT4oXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGNvbGxlY3Rpb246IHN0cmluZyxcbiAgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PiB8IEZpbHRlckdyb3VwID0ge30sXG4gIG9wdGlvbnM6IENydWRPcHRpb25zID0ge31cbik6IFByb21pc2U8VFtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRMaXN0QnknO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIHByaXZhY3kgPSBmYWxzZSxcbiAgICBvd25lcnNoaXAgPSBmYWxzZSxcbiAgICBzb3J0LFxuICAgIGxpbWl0LFxuICAgIGN1c3RvbVF1ZXJpZXMgPSBbXSxcbiAgICBjdXN0b21PYmplY3RzID0gW11cbiAgfSA9IG9wdGlvbnM7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBkYXRhYmFzZSA9IHVzZURiKGRhdGFiYXNlTmFtZSk7XG4gICAgY29uc3QgZmlsdGVyQ2xhdXNlID0gYnVpbGRGaWx0ZXJzKGZpbHRlcnMsICdkb2MnKTtcbiAgICBjb25zdCBjb25kaXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKGZpbHRlckNsYXVzZSkge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGZpbHRlckNsYXVzZSk7XG4gICAgfVxuXG4gICAgaWYgKHByaXZhY3kpIHtcbiAgICAgIGNvbnN0IHByaXZhY3lGaWx0ZXIgPSBhcHBseVByaXZhY3lGaWx0ZXIoY29sbGVjdGlvbiwgc2Vzc2lvbklkLCAnZG9jJyk7XG4gICAgICBpZiAocHJpdmFjeUZpbHRlcikge1xuICAgICAgICBjb25kaXRpb25zLnB1c2gocHJpdmFjeUZpbHRlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG93bmVyc2hpcCkge1xuICAgICAgY29uc3Qgb3duZXJzaGlwRmlsdGVyID0gYXBwbHlPd25lcnNoaXBGaWx0ZXIoc2Vzc2lvbklkLCAnZG9jJyk7XG4gICAgICBpZiAob3duZXJzaGlwRmlsdGVyKSB7XG4gICAgICAgIGNvbmRpdGlvbnMucHVzaChvd25lcnNoaXBGaWx0ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbGxlY3Rpb25MaXRlcmFsID0gbGl0ZXJhbChjb2xsZWN0aW9uKTtcbiAgICBjb25zdCB3aGVyZUNsYXVzZSA9IGNvbmRpdGlvbnMubGVuZ3RoID4gMCA/IGxpdGVyYWwoYEZJTFRFUiAke2NvbmRpdGlvbnMuam9pbignICYmICcpfWApIDogbGl0ZXJhbCgnJyk7XG4gICAgY29uc3Qgc29ydENsYXVzZSA9IHNvcnQgPyBsaXRlcmFsKGJ1aWxkU29ydChzb3J0LCAnZG9jJykpIDogbGl0ZXJhbCgnJyk7XG4gICAgY29uc3QgbGltaXRDbGF1c2UgPSBsaW1pdCA/IGxpdGVyYWwoYnVpbGRMaW1pdChsaW1pdCkpIDogbGl0ZXJhbCgnJyk7XG4gICAgY29uc3QgY3VzdG9tUXVlcmllc0xpdGVyYWwgPSBjdXN0b21RdWVyaWVzLmxlbmd0aCA+IDAgPyBsaXRlcmFsKGN1c3RvbVF1ZXJpZXMuam9pbignXFxuJykpIDogbGl0ZXJhbCgnJyk7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSBjdXN0b21PYmplY3RzLmxlbmd0aCA+IDBcbiAgICAgID8gbGl0ZXJhbChgTUVSR0UoZG9jLCB7JHtjdXN0b21PYmplY3RzLmpvaW4oJywgJyl9fSlgKVxuICAgICAgOiBsaXRlcmFsKCdkb2MnKTtcblxuICAgIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICAgIEZPUiBkb2MgSU4gJHtjb2xsZWN0aW9uTGl0ZXJhbH1cbiAgICAgICAgJHt3aGVyZUNsYXVzZX1cbiAgICAgICAgJHtjdXN0b21RdWVyaWVzTGl0ZXJhbH1cbiAgICAgICAgJHtzb3J0Q2xhdXNlfVxuICAgICAgICAke2xpbWl0Q2xhdXNlfVxuICAgICAgICBSRVRVUk4gJHtyZXR1cm5WYWx1ZX1cbiAgICBgO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGF0YWJhc2UucXVlcnkoYXFsUXVlcnkpO1xuICAgIHJldHVybiBhd2FpdCByZXN1bHQuYWxsKCkgYXMgVFtdO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1IsXG4gICAgICBwYXJhbXM6IHtjb2xsZWN0aW9uLCBmaWx0ZXJzfVxuICAgIH0sIGVycm9yIGFzIEVycm9yLCBjb250ZXh0KTtcbiAgfVxufTtcblxuLyoqXG4gKiBBZGQgYSBuZXcgaXRlbSB0byBhbnkgY29sbGVjdGlvblxuICovXG5leHBvcnQgY29uc3QgYWRkSXRlbSA9IGFzeW5jIDxUID0gYW55PihcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgY29sbGVjdGlvbjogc3RyaW5nLFxuICBkYXRhOiBQYXJ0aWFsPFQ+LFxuICBvcHRpb25zOiB7cmVhZG9ubHkgaG9va3M/OiBib29sZWFufSA9IHt9XG4pOiBQcm9taXNlPFQ+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2FkZEl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtob29rcyA9IGZhbHNlfSA9IG9wdGlvbnM7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb25maWcgPSByZWdpc3RyeS5nZXQoY29sbGVjdGlvbik7XG4gICAgbGV0IGluc2VydERhdGE6IGFueSA9IHsuLi5kYXRhfTtcblxuICAgIC8vIEFwcGx5IHBhcnNlIGFkYXB0ZXIgaWYgYXZhaWxhYmxlXG4gICAgaWYgKGNvbmZpZz8uYWRhcHRlcnM/LnBhcnNlKSB7XG4gICAgICBpbnNlcnREYXRhID0gY29uZmlnLmFkYXB0ZXJzLnBhcnNlKGluc2VydERhdGEpO1xuICAgIH1cblxuICAgIC8vIENhbGwgYmVmb3JlSW5zZXJ0IGhvb2tcbiAgICBpZiAoaG9va3MgJiYgY29uZmlnPy5ob29rcz8uYmVmb3JlSW5zZXJ0KSB7XG4gICAgICBpbnNlcnREYXRhID0gYXdhaXQgY29uZmlnLmhvb2tzLmJlZm9yZUluc2VydChjb250ZXh0LCBpbnNlcnREYXRhKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGltZXN0YW1wcyAodHlwZS1zYWZlIGFwcHJvYWNoKVxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgaWYgKGNvbmZpZz8udGltZXN0YW1wcz8uY3JlYXRlZCkge1xuICAgICAgaW5zZXJ0RGF0YSA9IHsuLi5pbnNlcnREYXRhLCBbY29uZmlnLnRpbWVzdGFtcHMuY3JlYXRlZF06IG5vd307XG4gICAgfVxuICAgIGlmIChjb25maWc/LnRpbWVzdGFtcHM/LnVwZGF0ZWQpIHtcbiAgICAgIGluc2VydERhdGEgPSB7Li4uaW5zZXJ0RGF0YSwgW2NvbmZpZy50aW1lc3RhbXBzLnVwZGF0ZWRdOiBub3d9O1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2VOYW1lKTtcbiAgICBjb25zdCBjb2xsZWN0aW9uUmVmID0gZGF0YWJhc2UuY29sbGVjdGlvbihjb2xsZWN0aW9uKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb2xsZWN0aW9uUmVmLnNhdmUoaW5zZXJ0RGF0YSBhcyBhbnksIHtyZXR1cm5OZXc6IHRydWV9KTtcbiAgICBsZXQgaXRlbSA9IHJlc3VsdC5uZXcgYXMgVDtcblxuICAgIC8vIENhbGwgYWZ0ZXJJbnNlcnQgaG9va1xuICAgIGlmIChob29rcyAmJiBjb25maWc/Lmhvb2tzPy5hZnRlckluc2VydCkge1xuICAgICAgaXRlbSA9IGF3YWl0IGNvbmZpZy5ob29rcy5hZnRlckluc2VydChjb250ZXh0LCBpdGVtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SLFxuICAgICAgcGFyYW1zOiB7Y29sbGVjdGlvbn1cbiAgICB9LCBlcnJvciBhcyBFcnJvciwgY29udGV4dCk7XG4gIH1cbn07XG5cbi8qKlxuICogVXBkYXRlIGFuIGl0ZW0gaW4gYW55IGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZUl0ZW0gPSBhc3luYyA8VCA9IGFueT4oXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGNvbGxlY3Rpb246IHN0cmluZyxcbiAgaWQ6IHN0cmluZyxcbiAgdXBkYXRlczogUGFydGlhbDxUPixcbiAgb3B0aW9uczoge3JlYWRvbmx5IGhvb2tzPzogYm9vbGVhbjsgcmVhZG9ubHkgb3duZXJzaGlwPzogYm9vbGVhbn0gPSB7fVxuKTogUHJvbWlzZTxUPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICd1cGRhdGVJdGVtJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtob29rcyA9IGZhbHNlLCBvd25lcnNoaXAgPSBmYWxzZX0gPSBvcHRpb25zO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY29uZmlnID0gcmVnaXN0cnkuZ2V0KGNvbGxlY3Rpb24pO1xuICAgIGxldCB1cGRhdGVEYXRhOiBhbnkgPSB7Li4udXBkYXRlc307XG5cbiAgICAvLyBBcHBseSBwYXJzZSBhZGFwdGVyIGlmIGF2YWlsYWJsZVxuICAgIGlmIChjb25maWc/LmFkYXB0ZXJzPy5wYXJzZSkge1xuICAgICAgdXBkYXRlRGF0YSA9IGNvbmZpZy5hZGFwdGVycy5wYXJzZSh1cGRhdGVEYXRhKTtcbiAgICB9XG5cbiAgICAvLyBDYWxsIGJlZm9yZVVwZGF0ZSBob29rXG4gICAgaWYgKGhvb2tzICYmIGNvbmZpZz8uaG9va3M/LmJlZm9yZVVwZGF0ZSkge1xuICAgICAgdXBkYXRlRGF0YSA9IGF3YWl0IGNvbmZpZy5ob29rcy5iZWZvcmVVcGRhdGUoY29udGV4dCwgaWQsIHVwZGF0ZURhdGEpO1xuICAgIH1cblxuICAgIC8vIEFkZCB1cGRhdGVkIHRpbWVzdGFtcCAodHlwZS1zYWZlIGFwcHJvYWNoKVxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgaWYgKGNvbmZpZz8udGltZXN0YW1wcz8udXBkYXRlZCkge1xuICAgICAgdXBkYXRlRGF0YSA9IHsuLi51cGRhdGVEYXRhLCBbY29uZmlnLnRpbWVzdGFtcHMudXBkYXRlZF06IG5vd307XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZU5hbWUpO1xuICAgIGNvbnN0IGRvY0lkID0gaWQuaW5jbHVkZXMoJy8nKSA/IGlkIDogYCR7Y29sbGVjdGlvbn0vJHtpZH1gO1xuXG4gICAgLy8gQnVpbGQgcXVlcnkgd2l0aCBvd25lcnNoaXAgY2hlY2sgaWYgbmVlZGVkXG4gICAgbGV0IGFxbFF1ZXJ5OiBBcWxRdWVyeTtcbiAgICBjb25zdCBjb2xsZWN0aW9uTGl0ZXJhbCA9IGxpdGVyYWwoY29sbGVjdGlvbik7XG4gICAgaWYgKG93bmVyc2hpcCAmJiBzZXNzaW9uSWQpIHtcbiAgICAgIGFxbFF1ZXJ5ID0gYXFsYEZPUiBkb2MgSU4gJHtjb2xsZWN0aW9uTGl0ZXJhbH1cbiAgICAgICAgRklMVEVSIGRvYy5faWQgPT0gJHtkb2NJZH0gJiYgZG9jLnVzZXJJZCA9PSAke3Nlc3Npb25JZH1cbiAgICAgICAgTElNSVQgMVxuICAgICAgICBVUERBVEUgZG9jIFdJVEggJHt1cGRhdGVEYXRhfSBJTiAke2NvbGxlY3Rpb25MaXRlcmFsfVxuICAgICAgICBSRVRVUk4gTkVXYDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXFsUXVlcnkgPSBhcWxgRk9SIGRvYyBJTiAke2NvbGxlY3Rpb25MaXRlcmFsfVxuICAgICAgICBGSUxURVIgZG9jLl9pZCA9PSAke2RvY0lkfVxuICAgICAgICBMSU1JVCAxXG4gICAgICAgIFVQREFURSBkb2MgV0lUSCAke3VwZGF0ZURhdGF9IElOICR7Y29sbGVjdGlvbkxpdGVyYWx9XG4gICAgICAgIFJFVFVSTiBORVdgO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KTtcbiAgICBsZXQgaXRlbSA9IGF3YWl0IHJlc3VsdC5uZXh0KCk7XG5cbiAgICAvLyBDYWxsIGFmdGVyVXBkYXRlIGhvb2tcbiAgICBpZiAoaG9va3MgJiYgY29uZmlnPy5ob29rcz8uYWZ0ZXJVcGRhdGUpIHtcbiAgICAgIGl0ZW0gPSBhd2FpdCBjb25maWcuaG9va3MuYWZ0ZXJVcGRhdGUoY29udGV4dCwgaXRlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUixcbiAgICAgIHBhcmFtczoge2NvbGxlY3Rpb24sIGlkfVxuICAgIH0sIGVycm9yIGFzIEVycm9yLCBjb250ZXh0KTtcbiAgfVxufTtcblxuLyoqXG4gKiBEZWxldGUgYW4gaXRlbSBmcm9tIGFueSBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBkZWxldGVJdGVtID0gYXN5bmMgPFQgPSBhbnk+KFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBjb2xsZWN0aW9uOiBzdHJpbmcsXG4gIGlkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHtcbiAgICByZWFkb25seSBzb2Z0PzogYm9vbGVhbjtcbiAgICByZWFkb25seSBjYXNjYWRlPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+O1xuICAgIHJlYWRvbmx5IG93bmVyc2hpcD86IGJvb2xlYW47XG4gIH0gPSB7fVxuKTogUHJvbWlzZTxUIHwgbnVsbD4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZGVsZXRlSXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH0gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCB7c29mdCA9IGZhbHNlLCBjYXNjYWRlID0gW10sIG93bmVyc2hpcCA9IGZhbHNlfSA9IG9wdGlvbnM7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb25maWcgPSByZWdpc3RyeS5nZXQoY29sbGVjdGlvbik7XG4gICAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZU5hbWUpO1xuICAgIGNvbnN0IGRvY0lkID0gaWQuaW5jbHVkZXMoJy8nKSA/IGlkIDogYCR7Y29sbGVjdGlvbn0vJHtpZH1gO1xuICAgIGNvbnN0IGRvY0tleSA9IGlkLmluY2x1ZGVzKCcvJykgPyBpZC5zcGxpdCgnLycpLnBvcCgpIHx8ICcnIDogaWQ7XG4gICAgbGV0IGRlbGV0ZWRJdGVtOiBUIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvLyBDYWxsIGJlZm9yZURlbGV0ZSBob29rXG4gICAgaWYgKGNvbmZpZz8uaG9va3M/LmJlZm9yZURlbGV0ZSkge1xuICAgICAgYXdhaXQgY29uZmlnLmhvb2tzLmJlZm9yZURlbGV0ZShjb250ZXh0LCBkb2NJZCk7XG4gICAgfVxuXG4gICAgLy8gU29mdCBkZWxldGVcbiAgICBpZiAoc29mdCkge1xuICAgICAgY29uc3QgdXBkYXRlID0ge2RlbGV0ZWQ6IHRydWUsIGRlbGV0ZWRBdDogRGF0ZS5ub3coKX07XG4gICAgICBjb25zdCBjb2xsZWN0aW9uTGl0ZXJhbCA9IGxpdGVyYWwoY29sbGVjdGlvbik7XG4gICAgICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGRvYyBJTiAke2NvbGxlY3Rpb25MaXRlcmFsfVxuICAgICAgICBGSUxURVIgZG9jLl9pZCA9PSAke2RvY0lkfVxuICAgICAgICBMSU1JVCAxXG4gICAgICAgIFVQREFURSBkb2MgV0lUSCAke3VwZGF0ZX0gSU4gJHtjb2xsZWN0aW9uTGl0ZXJhbH1cbiAgICAgICAgUkVUVVJOIE5FV2A7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSk7XG4gICAgICBkZWxldGVkSXRlbSA9IGF3YWl0IHJlc3VsdC5uZXh0KCkgYXMgVCB8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhhcmQgZGVsZXRlIHdpdGggY2FzY2FkZVxuICAgICAgY29uc3QgZWRnZXNUb0Nhc2NhZGUgPSBjYXNjYWRlLmxlbmd0aCA+IDAgPyBjYXNjYWRlIDogKGNvbmZpZz8uY2FzY2FkZUVkZ2VzIHx8IFtdKTtcblxuICAgICAgLy8gRGVsZXRlIHRoZSBkb2N1bWVudFxuICAgICAgaWYgKG93bmVyc2hpcCAmJiBzZXNzaW9uSWQpIHtcbiAgICAgICAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgICAgICAgIEZPUiBkb2MgSU4gJHtsaXRlcmFsKGNvbGxlY3Rpb24pfVxuICAgICAgICAgICAgRklMVEVSIGRvYy5faWQgPT0gJHtkb2NJZH0gJiYgZG9jLnVzZXJJZCA9PSAke3Nlc3Npb25JZH1cbiAgICAgICAgICAgIFJFTU9WRSBkb2MgSU4gJHtsaXRlcmFsKGNvbGxlY3Rpb24pfVxuICAgICAgICAgICAgUkVUVVJOIE9MRFxuICAgICAgICBgO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSk7XG4gICAgICAgIGRlbGV0ZWRJdGVtID0gYXdhaXQgcmVzdWx0Lm5leHQoKSBhcyBUIHwgbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBSRU1PVkUgJHtkb2NLZXl9IElOICR7bGl0ZXJhbChjb2xsZWN0aW9uKX0gUkVUVVJOIE9MRGA7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KTtcbiAgICAgICAgZGVsZXRlZEl0ZW0gPSBhd2FpdCByZXN1bHQubmV4dCgpIGFzIFQgfCBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWxldGUgcmVsYXRlZCBlZGdlcyBvbmx5IGFmdGVyIHRoZSBkb2N1bWVudCBkZWxldGUgc3VjY2VlZHMsIHNvIG93bmVyc2hpcCBjaGVja3MgcHJvdGVjdCBjYXNjYWRlcyB0b28uXG4gICAgICBpZiAoZGVsZXRlZEl0ZW0pIHtcbiAgICAgICAgZm9yIChjb25zdCBlZGdlVHlwZSBvZiBlZGdlc1RvQ2FzY2FkZSkge1xuICAgICAgICAgIC8vIFVzZSBzdHJpbmcgZm9yIGVkZ2UgY29sbGVjdGlvbiBuYW1lIChzYWZlKVxuICAgICAgICAgIGNvbnN0IGVkZ2VRdWVyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgICAgICAgICBGT1IgZSBJTiAke2xpdGVyYWwoZWRnZVR5cGUpfVxuICAgICAgICAgICAgICBGSUxURVIgZS5fdG8gPT0gJHtkb2NJZH0gfHwgZS5fZnJvbSA9PSAke2RvY0lkfVxuICAgICAgICAgICAgICBSRU1PVkUgZSBJTiAke2xpdGVyYWwoZWRnZVR5cGUpfVxuICAgICAgICAgIGA7XG4gICAgICAgICAgYXdhaXQgZGF0YWJhc2UucXVlcnkoZWRnZVF1ZXJ5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGwgYWZ0ZXJEZWxldGUgaG9va1xuICAgIGlmIChjb25maWc/Lmhvb2tzPy5hZnRlckRlbGV0ZSkge1xuICAgICAgYXdhaXQgY29uZmlnLmhvb2tzLmFmdGVyRGVsZXRlKGNvbnRleHQsIGRvY0lkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZEl0ZW07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUixcbiAgICAgIHBhcmFtczoge2NvbGxlY3Rpb24sIGlkfVxuICAgIH0sIGVycm9yIGFzIEVycm9yLCBjb250ZXh0KTtcbiAgfVxufTtcblxuLyoqXG4gKiBDb3VudCBpdGVtcyBpbiBhbnkgY29sbGVjdGlvblxuICovXG5leHBvcnQgY29uc3QgY291bnRJdGVtcyA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgY29sbGVjdGlvbjogc3RyaW5nLFxuICBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgRmlsdGVyR3JvdXAgPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2NvdW50SXRlbXMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBkYXRhYmFzZSA9IHVzZURiKGRhdGFiYXNlTmFtZSk7XG4gICAgY29uc3QgZmlsdGVyQ2xhdXNlID0gYnVpbGRGaWx0ZXJzKGZpbHRlcnMsICdkb2MnKTtcbiAgICBjb25zdCB3aGVyZUNsYXVzZSA9IGZpbHRlckNsYXVzZSA/IGxpdGVyYWwoYEZJTFRFUiAke2ZpbHRlckNsYXVzZX1gKSA6IGxpdGVyYWwoJycpO1xuXG4gICAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgICAgTEVUIGl0ZW1zID0gKFxuICAgICAgICBGT1IgZG9jIElOICR7bGl0ZXJhbChjb2xsZWN0aW9uKX1cbiAgICAgICAgICAke3doZXJlQ2xhdXNlfVxuICAgICAgICAgIFJFVFVSTiBkb2NcbiAgICAgIClcbiAgICAgIFJFVFVSTiBMRU5HVEgoaXRlbXMpXG4gICAgYDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KTtcbiAgICByZXR1cm4gYXdhaXQgcmVzdWx0Lm5leHQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SLFxuICAgICAgcGFyYW1zOiB7Y29sbGVjdGlvbiwgZmlsdGVyc31cbiAgICB9LCBlcnJvciBhcyBFcnJvciwgY29udGV4dCk7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgaXRlbSBleGlzdHNcbiAqL1xuZXhwb3J0IGNvbnN0IGl0ZW1FeGlzdHMgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGNvbGxlY3Rpb246IHN0cmluZyxcbiAgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PiB8IEZpbHRlckdyb3VwXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgY291bnQgPSBhd2FpdCBjb3VudEl0ZW1zKGNvbnRleHQsIGNvbGxlY3Rpb24sIGZpbHRlcnMpO1xuICByZXR1cm4gY291bnQgPiAwO1xufTtcbiJdLCJuYW1lcyI6WyJhcWwiLCJsaXRlcmFsIiwiRXJyb3JUeXBlcyIsImxvZ0Vycm9yIiwiYnVpbGRGaWx0ZXJDbGF1c2UiLCJ1c2VEYiIsInJlZ2lzdHJ5IiwiZXZlbnRDYXRlZ29yeSIsImJ1aWxkRmlsdGVycyIsImZpbHRlcnMiLCJ2YXJOYW1lIiwic2ltcGxlRmlsdGVycyIsImNvbmRpdGlvbnMiLCJrZXkiLCJ2YWx1ZSIsIk9iamVjdCIsImVudHJpZXMiLCJwdXNoIiwiSlNPTiIsInN0cmluZ2lmeSIsImpvaW4iLCJidWlsZFNvcnQiLCJzb3J0IiwibGVuZ3RoIiwic29ydFBhcnRzIiwibWFwIiwiZmllbGQiLCJkaXJlY3Rpb24iLCJidWlsZExpbWl0IiwibGltaXQiLCJmcm9tIiwidG8iLCJjb3VudCIsImFwcGx5UHJpdmFjeUZpbHRlciIsImNvbGxlY3Rpb24iLCJzZXNzaW9uSWQiLCJjb25maWciLCJnZXQiLCJoYXNQcml2YWN5IiwiYXBwbHlPd25lcnNoaXBGaWx0ZXIiLCJnZXRJdGVtQnkiLCJjb250ZXh0Iiwib3B0aW9ucyIsImFjdGlvbiIsImRhdGFiYXNlTmFtZSIsInNlc3Npb24iLCJ1c2VySWQiLCJwcml2YWN5Iiwib3duZXJzaGlwIiwiY3VzdG9tUXVlcmllcyIsImN1c3RvbU9iamVjdHMiLCJkYXRhYmFzZSIsImZpbHRlckNsYXVzZSIsInByaXZhY3lGaWx0ZXIiLCJvd25lcnNoaXBGaWx0ZXIiLCJjb2xsZWN0aW9uTGl0ZXJhbCIsIndoZXJlQ2xhdXNlIiwiY3VzdG9tUXVlcmllc0xpdGVyYWwiLCJyZXR1cm5WYWx1ZSIsImFxbFF1ZXJ5IiwicmVzdWx0IiwicXVlcnkiLCJpdGVtIiwibmV4dCIsImVycm9yIiwiY2F0ZWdvcnkiLCJsYWJlbCIsIkRBVEFCQVNFX0VSUk9SIiwicGFyYW1zIiwiZ2V0TGlzdEJ5Iiwic29ydENsYXVzZSIsImxpbWl0Q2xhdXNlIiwiYWxsIiwiYWRkSXRlbSIsImRhdGEiLCJob29rcyIsImluc2VydERhdGEiLCJhZGFwdGVycyIsInBhcnNlIiwiYmVmb3JlSW5zZXJ0Iiwibm93IiwiRGF0ZSIsInRpbWVzdGFtcHMiLCJjcmVhdGVkIiwidXBkYXRlZCIsImNvbGxlY3Rpb25SZWYiLCJzYXZlIiwicmV0dXJuTmV3IiwibmV3IiwiYWZ0ZXJJbnNlcnQiLCJ1cGRhdGVJdGVtIiwiaWQiLCJ1cGRhdGVzIiwidXBkYXRlRGF0YSIsImJlZm9yZVVwZGF0ZSIsImRvY0lkIiwiaW5jbHVkZXMiLCJhZnRlclVwZGF0ZSIsImRlbGV0ZUl0ZW0iLCJzb2Z0IiwiY2FzY2FkZSIsImRvY0tleSIsInNwbGl0IiwicG9wIiwiZGVsZXRlZEl0ZW0iLCJiZWZvcmVEZWxldGUiLCJ1cGRhdGUiLCJkZWxldGVkIiwiZGVsZXRlZEF0IiwiZWRnZXNUb0Nhc2NhZGUiLCJjYXNjYWRlRWRnZXMiLCJlZGdlVHlwZSIsImVkZ2VRdWVyeSIsImFmdGVyRGVsZXRlIiwiY291bnRJdGVtcyIsIml0ZW1FeGlzdHMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLEdBQUcsUUFBTyxXQUFXO0FBQzdCLFNBQVFDLE9BQU8sUUFBTyxlQUFlO0FBQ3JDLFNBQVFDLFVBQVUsUUFBTywwQkFBMEI7QUFDbkQsU0FBUUMsUUFBUSxRQUFPLDZCQUE2QjtBQUNwRCxTQUFRQyxpQkFBaUIsUUFBTyx5QkFBeUI7QUFDekQsU0FBUUMsS0FBSyxRQUFPLDRCQUE0QjtBQUNoRCxTQUFRQyxRQUFRLFFBQU8saUNBQWlDO0FBTXhELE1BQU1DLGdCQUFnQjtBQWdCdEI7O0NBRUMsR0FDRCxNQUFNQyxlQUFlLENBQ25CQyxTQUNBQyxVQUFrQixLQUFLO0lBRXZCLGtEQUFrRDtJQUNsRCxJQUFJLFdBQVdELFdBQVcsZ0JBQWdCQSxTQUFTO1FBQ2pELE9BQU9MLGtCQUFrQkssU0FBd0JDO0lBQ25EO0lBRUEsd0JBQXdCO0lBQ3hCLE1BQU1DLGdCQUFnQkY7SUFDdEIsTUFBTUcsYUFBdUIsRUFBRTtJQUUvQixLQUFLLE1BQU0sQ0FBQ0MsS0FBS0MsTUFBTSxJQUFJQyxPQUFPQyxPQUFPLENBQUNMLGVBQWdCO1FBQ3hELElB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
438
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jcnVkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBpcyBzdWJqZWN0IHRvIHRoZSBhY2NvbXBhbnlpbmcgY29tbWVyY2lhbCBMSUNFTlNFLlxuICovXG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtsaXRlcmFsfSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuXG5pbXBvcnQge29yZ2FuaXphdGlvbkFjY291bnRNdXRhdGlvbiwgb3JnYW5pemF0aW9uQWNjb3VudFdyaXRlR3VhcmR9IGZyb20gJy4uL29yZ2FuaXphdGlvbnMvYWNjb3VudExpZmVjeWNsZS5qcyc7XG5pbXBvcnQge0Vycm9yVHlwZXN9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzLmpzJztcbmltcG9ydCB7bG9nRXJyb3J9IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljc1V0aWxzLmpzJztcbmltcG9ydCB7YnVpbGRGaWx0ZXJDbGF1c2V9IGZyb20gJy4uL3V0aWxzL2FxbEhlbHBlcnMuanMnO1xuaW1wb3J0IHt1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscy5qcyc7XG5pbXBvcnQge3JlZ2lzdHJ5fSBmcm9tICcuLi91dGlscy9jb2xsZWN0aW9uUmVnaXN0cnkuanMnO1xuXG5pbXBvcnQgdHlwZSB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQgdHlwZSB7RmlsdGVyR3JvdXB9IGZyb20gJy4uL3R5cGVzL2FyYW5nb2RiLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcblxuY29uc3QgZXZlbnRDYXRlZ29yeSA9ICdjcnVkJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciBDUlVEIG9wZXJhdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgQ3J1ZE9wdGlvbnMgPSBSZWFkb25seTx7XG4gIHJlYWRvbmx5IHNvcnQ/OiBSZWFkb25seUFycmF5PHtyZWFkb25seSBmaWVsZDogc3RyaW5nOyByZWFkb25seSBkaXJlY3Rpb246ICdBU0MnIHwgJ0RFU0MnfT47XG4gIHJlYWRvbmx5IGxpbWl0Pzoge3JlYWRvbmx5IGZyb206IG51bWJlcjsgcmVhZG9ubHkgdG86IG51bWJlcn07XG4gIHJlYWRvbmx5IGZpZWxkcz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPjsgLy8gU2VsZWN0IHNwZWNpZmljIGZpZWxkc1xuICByZWFkb25seSBpbmNsdWRlRWRnZXM/OiBSZWFkb25seUFycmF5PHN0cmluZz47IC8vIEluY2x1ZGUgcmVsYXRlZCBkb2N1bWVudHMgdmlhIGVkZ2VzXG4gIHJlYWRvbmx5IHByaXZhY3k/OiBib29sZWFuOyAvLyBBcHBseSBwcml2YWN5IGNoZWNrcyAoZGVmYXVsdDogdHJ1ZSlcbiAgcmVhZG9ubHkgb3duZXJzaGlwPzogYm9vbGVhbjsgLy8gQXBwbHkgb3duZXJzaGlwIGNoZWNrcyAoZGVmYXVsdDogZmFsc2UpXG4gIHJlYWRvbmx5IGN1c3RvbVF1ZXJpZXM/OiBSZWFkb25seUFycmF5PHN0cmluZz47IC8vIEFkZGl0aW9uYWwgY3VzdG9tIHF1ZXJ5IHN0cmluZ3NcbiAgcmVhZG9ubHkgY3VzdG9tT2JqZWN0cz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPjsgLy8gQWRkaXRpb25hbCBjdXN0b20gb2JqZWN0IHNlbGVjdGlvbnNcbn0+O1xuXG4vKipcbiAqIEJ1aWxkIGZpbHRlciBjbGF1c2UgZnJvbSBmaWx0ZXJzIG9iamVjdCBvciBGaWx0ZXJHcm91cFxuICovXG5jb25zdCBidWlsZEZpbHRlcnMgPSAoXG4gIGZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBGaWx0ZXJHcm91cCxcbiAgdmFyTmFtZTogc3RyaW5nID0gJ2RvYydcbik6IHN0cmluZyA9PiB7XG4gIC8vIElmIGl0J3MgYSBGaWx0ZXJHcm91cCB3aXRoIGxvZ2ljIGFuZCBjb25kaXRpb25zXG4gIGlmKCdsb2dpYycgaW4gZmlsdGVycyAmJiAnY29uZGl0aW9ucycgaW4gZmlsdGVycykge1xuICAgIHJldHVybiBidWlsZEZpbHRlckNsYXVzZShmaWx0ZXJzIGFzIEZpbHRlckdyb3VwLCB2YXJOYW1lKTtcbiAgfVxuXG4gIC8vIFNpbXBsZSBvYmplY3QgZmlsdGVyc1xuICBjb25zdCBzaW1wbGVGaWx0ZXJzID0gZmlsdGVycyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBjb25zdCBjb25kaXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvcihjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2ltcGxlRmlsdGVycykpIHtcbiAgICBpZih2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGAke3Zhck5hbWV9LiR7a2V5fSA9PSBudWxsYCk7XG4gICAgfSBlbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChgJHt2YXJOYW1lfS4ke2tleX0gPT0gXCIke3ZhbHVlfVwiYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChgJHt2YXJOYW1lfS4ke2tleX0gPT0gJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnMuam9pbignICYmICcpO1xufTtcblxuLyoqXG4gKiBCdWlsZCBzb3J0IGNsYXVzZVxuICovXG5jb25zdCBidWlsZFNvcnQgPSAoXG4gIHNvcnQ6IFJlYWRvbmx5QXJyYXk8e3JlYWRvbmx5IGZpZWxkOiBzdHJpbmc7IHJlYWRvbmx5IGRpcmVjdGlvbjogJ0FTQycgfCAnREVTQyd9PixcbiAgdmFyTmFtZTogc3RyaW5nID0gJ2RvYydcbik6IHN0cmluZyA9PiB7XG4gIGlmKCFzb3J0IHx8IHNvcnQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3Qgc29ydFBhcnRzID0gc29ydC5tYXAoKHtmaWVsZCwgZGlyZWN0aW9ufSkgPT4gYCR7dmFyTmFtZX0uJHtmaWVsZH0gJHtkaXJlY3Rpb259YCk7XG4gIHJldHVybiBgU09SVCAke3NvcnRQYXJ0cy5qb2luKCcsICcpfWA7XG59O1xuXG4vKipcbiAqIEJ1aWxkIGxpbWl0IGNsYXVzZVxuICovXG5jb25zdCBidWlsZExpbWl0ID0gKGxpbWl0Pzoge3JlYWRvbmx5IGZyb206IG51bWJlcjsgcmVhZG9ubHkgdG86IG51bWJlcn0pOiBzdHJpbmcgPT4ge1xuICBpZighbGltaXQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCB7ZnJvbSwgdG99ID0gbGltaXQ7XG4gIGNvbnN0IGNvdW50ID0gdG8gLSBmcm9tO1xuICByZXR1cm4gYExJTUlUICR7ZnJvbX0sICR7Y291bnR9YDtcbn07XG5cbi8qKlxuICogQXBwbHkgcHJpdmFjeSBmaWx0ZXIgaWYgY29sbGVjdGlvbiBoYXMgcHJpdmFjeVxuICovXG5jb25zdCBhcHBseVByaXZhY3lGaWx0ZXIgPSAoXG4gIGNvbGxlY3Rpb246IHN0cmluZyxcbiAgc2Vzc2lvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHZhck5hbWU6IHN0cmluZyA9ICdkb2MnXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBjb25maWcgPSByZWdpc3RyeS5nZXQoY29sbGVjdGlvbik7XG5cbiAgaWYoIWNvbmZpZyB8fCAhY29uZmlnLmhhc1ByaXZhY3kpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvLyBJZiBubyBzZXNzaW9uLCBvbmx5IHJldHVybiBwdWJsaWMgaXRlbXNcbiAgaWYoIXNlc3Npb25JZCkge1xuICAgIHJldHVybiBgJHt2YXJOYW1lfS5wcml2YWN5ID09IFwicHVibGljXCJgO1xuICB9XG5cbiAgLy8gUmV0dXJuIGl0ZW1zIHRoYXQgYXJlIHB1YmxpYyBPUiBvd25lZCBieSB0aGUgdXNlclxuICByZXR1cm4gYCgke3Zhck5hbWV9LnByaXZhY3kgPT0gXCJwdWJsaWNcIiB8fCAke3Zhck5hbWV9LnVzZXJJZCA9PSBcIiR7c2Vzc2lvbklkfVwiKWA7XG59O1xuXG4vKipcbiAqIEFwcGx5IG93bmVyc2hpcCBmaWx0ZXJcbiAqL1xuY29uc3QgYXBwbHlPd25lcnNoaXBGaWx0ZXIgPSAoXG4gIHNlc3Npb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB2YXJOYW1lOiBzdHJpbmcgPSAnZG9jJ1xuKTogc3RyaW5nID0+IHtcbiAgaWYoIXNlc3Npb25JZCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBgJHt2YXJOYW1lfS51c2VySWQgPT0gXCIke3Nlc3Npb25JZH1cImA7XG59O1xuXG4vKipcbiAqIEdldCBhIHNpbmdsZSBpdGVtIGZyb20gYW55IGNvbGxlY3Rpb24gYnkgZmlsdGVyc1xuICovXG5leHBvcnQgY29uc3QgZ2V0SXRlbUJ5ID0gYXN5bmMgPFQgPSBhbnk+KFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBjb2xsZWN0aW9uOiBzdHJpbmcsXG4gIGZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBGaWx0ZXJHcm91cCxcbiAgb3B0aW9uczogQ3J1ZE9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUIHwgbnVsbD4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0SXRlbUJ5JztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtwcml2YWN5ID0gZmFsc2UsIG93bmVyc2hpcCA9IGZhbHNlLCBjdXN0b21RdWVyaWVzID0gW10sIGN1c3RvbU9iamVjdHMgPSBbXX0gPSBvcHRpb25zO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZU5hbWUpO1xuICAgIGNvbnN0IGZpbHRlckNsYXVzZSA9IGJ1aWxkRmlsdGVycyhmaWx0ZXJzLCAnZG9jJyk7XG4gICAgY29uc3QgY29uZGl0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmKGZpbHRlckNsYXVzZSkge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGZpbHRlckNsYXVzZSk7XG4gICAgfVxuXG4gICAgaWYocHJpdmFjeSkge1xuICAgICAgY29uc3QgcHJpdmFjeUZpbHRlciA9IGFwcGx5UHJpdmFjeUZpbHRlcihjb2xsZWN0aW9uLCBzZXNzaW9uSWQsICdkb2MnKTtcbiAgICAgIGlmKHByaXZhY3lGaWx0ZXIpIHtcbiAgICAgICAgY29uZGl0aW9ucy5wdXNoKHByaXZhY3lGaWx0ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKG93bmVyc2hpcCkge1xuICAgICAgY29uc3Qgb3duZXJzaGlwRmlsdGVyID0gYXBwbHlPd25lcnNoaXBGaWx0ZXIoc2Vzc2lvbklkLCAnZG9jJyk7XG4gICAgICBpZihvd25lcnNoaXBGaWx0ZXIpIHtcbiAgICAgICAgY29uZGl0aW9ucy5wdXNoKG93bmVyc2hpcEZpbHRlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29sbGVjdGlvbkxpdGVyYWwgPSBsaXRlcmFsKGNvbGxlY3Rpb24pO1xuICAgIGNvbnN0IHdoZXJlQ2xhdXNlID0gY29uZGl0aW9ucy5sZW5ndGggPiAwID8gbGl0ZXJhbChgRklMVEVSICR7Y29uZGl0aW9ucy5qb2luKCcgJiYgJyl9YCkgOiBsaXRlcmFsKCcnKTtcbiAgICBjb25zdCBjdXN0b21RdWVyaWVzTGl0ZXJhbCA9IGN1c3RvbVF1ZXJpZXMubGVuZ3RoID4gMCA/IGxpdGVyYWwoY3VzdG9tUXVlcmllcy5qb2luKCdcXG4nKSkgOiBsaXRlcmFsKCcnKTtcbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGN1c3RvbU9iamVjdHMubGVuZ3RoID4gMFxuICAgICAgPyBsaXRlcmFsKGBNRVJHRShkb2MsIHske2N1c3RvbU9iamVjdHMuam9pbignLCAnKX19KWApXG4gICAgICA6IGxpdGVyYWwoJ2RvYycpO1xuXG4gICAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgICAgRk9SIGRvYyBJTiAke2NvbGxlY3Rpb25MaXRlcmFsfVxuICAgICAgICAke3doZXJlQ2xhdXNlfVxuICAgICAgICAke2N1c3RvbVF1ZXJpZXNMaXRlcmFsfVxuICAgICAgICBMSU1JVCAxXG4gICAgICAgIFJFVFVSTiAke3JldHVyblZhbHVlfVxuICAgIGA7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSk7XG4gICAgY29uc3QgaXRlbSA9IGF3YWl0IHJlc3VsdC5uZXh0KCk7XG5cbiAgICByZXR1cm4gaXRlbSB8fCBudWxsO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUixcbiAgICAgIHBhcmFtczoge2NvbGxlY3Rpb24sIGZpbHRlcnN9XG4gICAgfSwgZXJyb3IgYXMgRXJyb3IsIGNvbnRleHQpO1xuICB9XG59O1xuXG4vKipcbiAqIEdldCBtdWx0aXBsZSBpdGVtcyBmcm9tIGFueSBjb2xsZWN0aW9uIGJ5IGZpbHRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldExpc3RCeSA9IGFzeW5jIDxUID0gYW55PihcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgY29sbGVjdGlvbjogc3RyaW5nLFxuICBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgRmlsdGVyR3JvdXAgPSB7fSxcbiAgb3B0aW9uczogQ3J1ZE9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldExpc3RCeSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH0gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgcHJpdmFjeSA9IGZhbHNlLFxuICAgIG93bmVyc2hpcCA9IGZhbHNlLFxuICAgIHNvcnQsXG4gICAgbGltaXQsXG4gICAgY3VzdG9tUXVlcmllcyA9IFtdLFxuICAgIGN1c3RvbU9iamVjdHMgPSBbXVxuICB9ID0gb3B0aW9ucztcblxuICB0cnkge1xuICAgIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2VOYW1lKTtcbiAgICBjb25zdCBmaWx0ZXJDbGF1c2UgPSBidWlsZEZpbHRlcnMoZmlsdGVycywgJ2RvYycpO1xuICAgIGNvbnN0IGNvbmRpdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZihmaWx0ZXJDbGF1c2UpIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChmaWx0ZXJDbGF1c2UpO1xuICAgIH1cblxuICAgIGlmKHByaXZhY3kpIHtcbiAgICAgIGNvbnN0IHByaXZhY3lGaWx0ZXIgPSBhcHBseVByaXZhY3lGaWx0ZXIoY29sbGVjdGlvbiwgc2Vzc2lvbklkLCAnZG9jJyk7XG4gICAgICBpZihwcml2YWN5RmlsdGVyKSB7XG4gICAgICAgIGNvbmRpdGlvbnMucHVzaChwcml2YWN5RmlsdGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihvd25lcnNoaXApIHtcbiAgICAgIGNvbnN0IG93bmVyc2hpcEZpbHRlciA9IGFwcGx5T3duZXJzaGlwRmlsdGVyKHNlc3Npb25JZCwgJ2RvYycpO1xuICAgICAgaWYob3duZXJzaGlwRmlsdGVyKSB7XG4gICAgICAgIGNvbmRpdGlvbnMucHVzaChvd25lcnNoaXBGaWx0ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbGxlY3Rpb25MaXRlcmFsID0gbGl0ZXJhbChjb2xsZWN0aW9uKTtcbiAgICBjb25zdCB3aGVyZUNsYXVzZSA9IGNvbmRpdGlvbnMubGVuZ3RoID4gMCA/IGxpdGVyYWwoYEZJTFRFUiAke2NvbmRpdGlvbnMuam9pbignICYmICcpfWApIDogbGl0ZXJhbCgnJyk7XG4gICAgY29uc3Qgc29ydENsYXVzZSA9IHNvcnQgPyBsaXRlcmFsKGJ1aWxkU29ydChzb3J0LCAnZG9jJykpIDogbGl0ZXJhbCgnJyk7XG4gICAgY29uc3QgbGltaXRDbGF1c2UgPSBsaW1pdCA/IGxpdGVyYWwoYnVpbGRMaW1pdChsaW1pdCkpIDogbGl0ZXJhbCgnJyk7XG4gICAgY29uc3QgY3VzdG9tUXVlcmllc0xpdGVyYWwgPSBjdXN0b21RdWVyaWVzLmxlbmd0aCA+IDAgPyBsaXRlcmFsKGN1c3RvbVF1ZXJpZXMuam9pbignXFxuJykpIDogbGl0ZXJhbCgnJyk7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSBjdXN0b21PYmplY3RzLmxlbmd0aCA+IDBcbiAgICAgID8gbGl0ZXJhbChgTUVSR0UoZG9jLCB7JHtjdXN0b21PYmplY3RzLmpvaW4oJywgJyl9fSlgKVxuICAgICAgOiBsaXRlcmFsKCdkb2MnKTtcblxuICAgIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICAgIEZPUiBkb2MgSU4gJHtjb2xsZWN0aW9uTGl0ZXJhbH1cbiAgICAgICAgJHt3aGVyZUNsYXVzZX1cbiAgICAgICAgJHtjdXN0b21RdWVyaWVzTGl0ZXJhbH1cbiAgICAgICAgJHtzb3J0Q2xhdXNlfVxuICAgICAgICAke2xpbWl0Q2xhdXNlfVxuICAgICAgICBSRVRVUk4gJHtyZXR1cm5WYWx1ZX1cbiAgICBgO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGF0YWJhc2UucXVlcnkoYXFsUXVlcnkpO1xuICAgIHJldHVybiBhd2FpdCByZXN1bHQuYWxsKCkgYXMgVFtdO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUixcbiAgICAgIHBhcmFtczoge2NvbGxlY3Rpb24sIGZpbHRlcnN9XG4gICAgfSwgZXJyb3IgYXMgRXJyb3IsIGNvbnRleHQpO1xuICB9XG59O1xuXG4vKipcbiAqIEFkZCBhIG5ldyBpdGVtIHRvIGFueSBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRJdGVtID0gYXN5bmMgPFQgPSBhbnk+KFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBjb2xsZWN0aW9uOiBzdHJpbmcsXG4gIGRhdGE6IFBhcnRpYWw8VD4sXG4gIG9wdGlvbnM6IHtyZWFkb25seSBob29rcz86IGJvb2xlYW59ID0ge31cbik6IFByb21pc2U8VD4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnYWRkSXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3Qge2hvb2tzID0gZmFsc2V9ID0gb3B0aW9ucztcblxuICB0cnkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHJlZ2lzdHJ5LmdldChjb2xsZWN0aW9uKTtcbiAgICBsZXQgaW5zZXJ0RGF0YTogYW55ID0gey4uLmRhdGF9O1xuXG4gICAgLy8gQXBwbHkgcGFyc2UgYWRhcHRlciBpZiBhdmFpbGFibGVcbiAgICBpZihjb25maWc/LmFkYXB0ZXJzPy5wYXJzZSkge1xuICAgICAgaW5zZXJ0RGF0YSA9IGNvbmZpZy5hZGFwdGVycy5wYXJzZShpbnNlcnREYXRhKTtcbiAgICB9XG5cbiAgICAvLyBDYWxsIGJlZm9yZUluc2VydCBob29rXG4gICAgaWYoaG9va3MgJiYgY29uZmlnPy5ob29rcz8uYmVmb3JlSW5zZXJ0KSB7XG4gICAgICBpbnNlcnREYXRhID0gYXdhaXQgY29uZmlnLmhvb2tzLmJlZm9yZUluc2VydChjb250ZXh0LCBpbnNlcnREYXRhKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGltZXN0YW1wcyAodHlwZS1zYWZlIGFwcHJvYWNoKVxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgaWYoY29uZmlnPy50aW1lc3RhbXBzPy5jcmVhdGVkKSB7XG4gICAgICBpbnNlcnREYXRhID0gey4uLmluc2VydERhdGEsIFtjb25maWcudGltZXN0YW1wcy5jcmVhdGVkXTogbm93fTtcbiAgICB9XG4gICAgaWYoY29uZmlnPy50aW1lc3RhbXBzPy51cGRhdGVkKSB7XG4gICAgICBpbnNlcnREYXRhID0gey4uLmluc2VydERhdGEsIFtjb25maWcudGltZXN0YW1wcy51cGRhdGVkXTogbm93fTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhYmFzZSA9IHVzZURiKGRhdGFiYXNlTmFtZSk7XG4gICAgY29uc3QgY29sbGVjdGlvblJlZiA9IGRhdGFiYXNlLmNvbGxlY3Rpb24oY29sbGVjdGlvbik7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29sbGVjdGlvblJlZi5zYXZlKGluc2VydERhdGEgYXMgYW55LCB7cmV0dXJuTmV3OiB0cnVlfSk7XG4gICAgbGV0IGl0ZW0gPSByZXN1bHQubmV3IGFzIFQ7XG5cbiAgICAvLyBDYWxsIGFmdGVySW5zZXJ0IGhvb2tcbiAgICBpZihob29rcyAmJiBjb25maWc/Lmhvb2tzPy5hZnRlckluc2VydCkge1xuICAgICAgaXRlbSA9IGF3YWl0IGNvbmZpZy5ob29rcy5hZnRlckluc2VydChjb250ZXh0LCBpdGVtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1IsXG4gICAgICBwYXJhbXM6IHtjb2xsZWN0aW9ufVxuICAgIH0sIGVycm9yIGFzIEVycm9yLCBjb250ZXh0KTtcbiAgfVxufTtcblxuLyoqXG4gKiBVcGRhdGUgYW4gaXRlbSBpbiBhbnkgY29sbGVjdGlvblxuICovXG5leHBvcnQgY29uc3QgdXBkYXRlSXRlbSA9IGFzeW5jIDxUID0gYW55PihcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgY29sbGVjdGlvbjogc3RyaW5nLFxuICBpZDogc3RyaW5nLFxuICB1cGRhdGVzOiBQYXJ0aWFsPFQ+LFxuICBvcHRpb25zOiB7cmVhZG9ubHkgaG9va3M/OiBib29sZWFuOyByZWFkb25seSBvd25lcnNoaXA/OiBib29sZWFufSA9IHt9XG4pOiBQcm9taXNlPFQ+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3VwZGF0ZUl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3Qge2hvb2tzID0gZmFsc2UsIG93bmVyc2hpcCA9IGZhbHNlfSA9IG9wdGlvbnM7XG5cbiAgaWYoY29sbGVjdGlvbiA9PT0gJ3VzZXJzJykge1xuICAgIGNvbnN0IG1hbmFnZWQgPSBhd2FpdCBvcmdhbml6YXRpb25BY2NvdW50TXV0YXRpb24oY29udGV4dCwgaWQsICd1cGRhdGUnLCB1cGRhdGVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICBpZihtYW5hZ2VkKSB7XG4gICAgICByZXR1cm4gbWFuYWdlZCBhcyBUO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgY29uZmlnID0gcmVnaXN0cnkuZ2V0KGNvbGxlY3Rpb24pO1xuICAgIGxldCB1cGRhdGVEYXRhOiBhbnkgPSB7Li4udXBkYXRlc307XG5cbiAgICAvLyBBcHBseSBwYXJzZSBhZGFwdGVyIGlmIGF2YWlsYWJsZVxuICAgIGlmKGNvbmZpZz8uYWRhcHRlcnM/LnBhcnNlKSB7XG4gICAgICB1cGRhdGVEYXRhID0gY29uZmlnLmFkYXB0ZXJzLnBhcnNlKHVwZGF0ZURhdGEpO1xuICAgIH1cblxuICAgIC8vIENhbGwgYmVmb3JlVXBkYXRlIGhvb2tcbiAgICBpZihob29rcyAmJiBjb25maWc/Lmhvb2tzPy5iZWZvcmVVcGRhdGUpIHtcbiAgICAgIHVwZGF0ZURhdGEgPSBhd2FpdCBjb25maWcuaG9va3MuYmVmb3JlVXBkYXRlKGNvbnRleHQsIGlkLCB1cGRhdGVEYXRhKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdXBkYXRlZCB0aW1lc3RhbXAgKHR5cGUtc2FmZSBhcHByb2FjaClcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmKGNvbmZpZz8udGltZXN0YW1wcz8udXBkYXRlZCkge1xuICAgICAgdXBkYXRlRGF0YSA9IHsuLi51cGRhdGVEYXRhLCBbY29uZmlnLnRpbWVzdGFtcHMudXBkYXRlZF06IG5vd307XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZU5hbWUpO1xuICAgIGNvbnN0IGRvY0lkID0gaWQuaW5jbHVkZXMoJy8nKSA/IGlkIDogYCR7Y29sbGVjdGlvbn0vJHtpZH1gO1xuXG4gICAgLy8gQnVpbGQgcXVlcnkgd2l0aCBvd25lcnNoaXAgY2hlY2sgaWYgbmVlZGVkXG4gICAgbGV0IGFxbFF1ZXJ5OiBBcWxRdWVyeTtcbiAgICBjb25zdCBjb2xsZWN0aW9uTGl0ZXJhbCA9IGxpdGVyYWwoY29sbGVjdGlvbik7XG4gICAgY29uc3QgYWNjb3VudEd1YXJkID0gb3JnYW5pemF0aW9uQWNjb3VudFdyaXRlR3VhcmQoY29udGV4dCwgY29sbGVjdGlvbik7XG4gICAgaWYob3duZXJzaGlwICYmIHNlc3Npb25JZCkge1xuICAgICAgYXFsUXVlcnkgPSBhcWxgRk9SIGRvYyBJTiAke2NvbGxlY3Rpb25MaXRlcmFsfVxuICAgICAgICBGSUxURVIgZG9jLl9pZCA9PSAke2RvY0lkfSAmJiBkb2MudXNlcklkID09ICR7c2Vzc2lvbklkfVxuICAgICAgICBGSUxURVIgJHthY2NvdW50R3VhcmR9XG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgVVBEQVRFIGRvYyBXSVRIICR7dXBkYXRlRGF0YX0gSU4gJHtjb2xsZWN0aW9uTGl0ZXJhbH1cbiAgICAgICAgUkVUVVJOIE5FV2A7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFxbFF1ZXJ5ID0gYXFsYEZPUiBkb2MgSU4gJHtjb2xsZWN0aW9uTGl0ZXJhbH1cbiAgICAgICAgRklMVEVSIGRvYy5faWQgPT0gJHtkb2NJZH1cbiAgICAgICAgRklMVEVSICR7YWNjb3VudEd1YXJkfVxuICAgICAgICBMSU1JVCAxXG4gICAgICAgIFVQREFURSBkb2MgV0lUSCAke3VwZGF0ZURhdGF9IElOICR7Y29sbGVjdGlvbkxpdGVyYWx9XG4gICAgICAgIFJFVFVSTiBORVdgO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KTtcbiAgICBsZXQgaXRlbSA9IGF3YWl0IHJlc3VsdC5uZXh0KCk7XG5cbiAgICAvLyBDYWxsIGFmdGVyVXBkYXRlIGhvb2tcbiAgICBpZihob29rcyAmJiBjb25maWc/Lmhvb2tzPy5hZnRlclVwZGF0ZSkge1xuICAgICAgaXRlbSA9IGF3YWl0IGNvbmZpZy5ob29rcy5hZnRlclVwZGF0ZShjb250ZXh0LCBpdGVtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1IsXG4gICAgICBwYXJhbXM6IHtjb2xsZWN0aW9uLCBpZH1cbiAgICB9LCBlcnJvciBhcyBFcnJvciwgY29udGV4dCk7XG4gIH1cbn07XG5cbi8qKlxuICogRGVsZXRlIGFuIGl0ZW0gZnJvbSBhbnkgY29sbGVjdGlvblxuICovXG5leHBvcnQgY29uc3QgZGVsZXRlSXRlbSA9IGFzeW5jIDxUID0gYW55PihcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgY29sbGVjdGlvbjogc3RyaW5nLFxuICBpZDogc3RyaW5nLFxuICBvcHRpb25zOiB7XG4gICAgcmVhZG9ubHkgc29mdD86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgY2FzY2FkZT86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPjtcbiAgICByZWFkb25seSBvd25lcnNoaXA/OiBib29sZWFuO1xuICB9ID0ge31cbik6IFByb21pc2U8VCB8IG51bGw+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2RlbGV0ZUl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3Qge3NvZnQgPSBmYWxzZSwgY2FzY2FkZSA9IFtdLCBvd25lcnNoaXAgPSBmYWxzZX0gPSBvcHRpb25zO1xuXG4gIGlmKGNvbGxlY3Rpb24gPT09ICd1c2VycycpIHtcbiAgICBjb25zdCBtYW5hZ2VkID0gYXdhaXQgb3JnYW5pemF0aW9uQWNjb3VudE11dGF0aW9uKGNvbnRleHQsIGlkLCBzb2Z0ID8gJ2RlYWN0aXZhdGUnIDogJ2RlbGV0ZScsIHt9KTtcbiAgICBpZihtYW5hZ2VkKSB7XG4gICAgICByZXR1cm4gbWFuYWdlZCBhcyBUO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgY29uZmlnID0gcmVnaXN0cnkuZ2V0KGNvbGxlY3Rpb24pO1xuICAgIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2VOYW1lKTtcbiAgICBjb25zdCBkb2NJZCA9IGlkLmluY2x1ZGVzKCcvJykgPyBpZCA6IGAke2NvbGxlY3Rpb259LyR7aWR9YDtcbiAgICBjb25zdCBkb2NLZXkgPSBpZC5pbmNsdWRlcygnLycpID8gaWQuc3BsaXQoJy8nKS5wb3AoKSB8fCAnJyA6IGlkO1xuICAgIGxldCBkZWxldGVkSXRlbTogVCB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gQ2FsbCBiZWZvcmVEZWxldGUgaG9va1xuICAgIGlmKGNvbmZpZz8uaG9va3M/LmJlZm9yZURlbGV0ZSkge1xuICAgICAgYXdhaXQgY29uZmlnLmhvb2tzLmJlZm9yZURlbGV0ZShjb250ZXh0LCBkb2NJZCk7XG4gICAgfVxuXG4gICAgLy8gU29mdCBkZWxldGVcbiAgICBpZihzb2Z0KSB7XG4gICAgICBjb25zdCB1cGRhdGUgPSB7ZGVsZXRlZDogdHJ1ZSwgZGVsZXRlZEF0OiBEYXRlLm5vdygpfTtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25MaXRlcmFsID0gbGl0ZXJhbChjb2xsZWN0aW9uKTtcbiAgICAgIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgZG9jIElOICR7Y29sbGVjdGlvbkxpdGVyYWx9XG4gICAgICAgIEZJTFRFUiBkb2MuX2lkID09ICR7ZG9jSWR9XG4gICAgICAgIEZJTFRFUiAke29yZ2FuaXphdGlvbkFjY291bnRXcml0ZUd1YXJkKGNvbnRleHQsIGNvbGxlY3Rpb24pfVxuICAgICAgICBMSU1JVCAxXG4gICAgICAgIFVQREFURSBkb2MgV0lUSCAke3VwZGF0ZX0gSU4gJHtjb2xsZWN0aW9uTGl0ZXJhbH1cbiAgICAgICAgUkVUVVJOIE5FV2A7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSk7XG4gICAgICBkZWxldGVkSXRlbSA9IGF3YWl0IHJlc3VsdC5uZXh0KCkgYXMgVCB8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhhcmQgZGVsZXRlIHdpdGggY2FzY2FkZVxuICAgICAgY29uc3QgZWRnZXNUb0Nhc2NhZGUgPSBjYXNjYWRlLmxlbmd0aCA+IDAgPyBjYXNjYWRlIDogKGNvbmZpZz8uY2FzY2FkZUVkZ2VzIHx8IFtdKTtcblxuICAgICAgLy8gRGVsZXRlIHRoZSBkb2N1bWVudFxuICAgICAgaWYob3duZXJzaGlwICYmIHNlc3Npb25JZCkge1xuICAgICAgICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgICAgICAgRk9SIGRvYyBJTiAke2xpdGVyYWwoY29sbGVjdGlvbil9XG4gICAgICAgICAgICBGSUxURVIgZG9jLl9pZCA9PSAke2RvY0lkfSAmJiBkb2MudXNlcklkID09ICR7c2Vzc2lvbklkfVxuICAgICAgICAgICAgRklMVEVSICR7b3JnYW5pemF0aW9uQWNjb3VudFdyaXRlR3VhcmQoY29udGV4dCwgY29sbGVjdGlvbil9XG4gICAgICAgICAgICBSRU1PVkUgZG9jIElOICR7bGl0ZXJhbChjb2xsZWN0aW9uKX1cbiAgICAgICAgICAgIFJFVFVSTiBPTERcbiAgICAgICAgYDtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGF0YWJhc2UucXVlcnkoYXFsUXVlcnkpO1xuICAgICAgICBkZWxldGVkSXRlbSA9IGF3YWl0IHJlc3VsdC5uZXh0KCkgYXMgVCB8IG51bGw7XG4gICAgICB9IGVsc2UgaWYoY29sbGVjdGlvbiA9PT0gJ3VzZXJzJyAmJiBkYXRhYmFzZU5hbWUgPT09IHByb2Nlc3MuZW52LkFSQU5HT0RCX0RBVEFCQVNFKSB7XG4gICAgICAgIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgZG9jIElOIHVzZXJzXG4gICAgICAgICAgRklMVEVSIGRvYy5fa2V5ID09ICR7ZG9jS2V5fVxuICAgICAgICAgIEZJTFRFUiAke29yZ2FuaXphdGlvbkFjY291bnRXcml0ZUd1YXJkKGNvbnRleHQsIGNvbGxlY3Rpb24pfVxuICAgICAgICAgIFJFTU9WRSBkb2MgSU4gdXNlcnMgUkVUVVJOIE9MRGA7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KTtcbiAgICAgICAgZGVsZXRlZEl0ZW0gPSBhd2FpdCByZXN1bHQubmV4dCgpIGFzIFQgfCBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFJFTU9WRSAke2RvY0tleX0gSU4gJHtsaXRlcmFsKGNvbGxlY3Rpb24pfSBSRVRVUk4gT0xEYDtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGF0YWJhc2UucXVlcnkoYXFsUXVlcnkpO1xuICAgICAgICBkZWxldGVkSXRlbSA9IGF3YWl0IHJlc3VsdC5uZXh0KCkgYXMgVCB8IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIERlbGV0ZSByZWxhdGVkIGVkZ2VzIG9ubHkgYWZ0ZXIgdGhlIGRvY3VtZW50IGRlbGV0ZSBzdWNjZWVkcywgc28gb3duZXJzaGlwIGNoZWNrcyBwcm90ZWN0IGNhc2NhZGVzIHRvby5cbiAgICAgIGlmKGRlbGV0ZWRJdGVtKSB7XG4gICAgICAgIGZvcihjb25zdCBlZGdlVHlwZSBvZiBlZGdlc1RvQ2FzY2FkZSkge1xuICAgICAgICAgIC8vIFVzZSBzdHJpbmcgZm9yIGVkZ2UgY29sbGVjdGlvbiBuYW1lIChzYWZlKVxuICAgICAgICAgIGNvbnN0IGVkZ2VRdWVyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgICAgICAgICBGT1IgZSBJTiAke2xpdGVyYWwoZWRnZVR5cGUpfVxuICAgICAgICAgICAgICBGSUxURVIgZS5fdG8gPT0gJHtkb2NJZH0gfHwgZS5fZnJvbSA9PSAke2RvY0lkfVxuICAgICAgICAgICAgICBSRU1PVkUgZSBJTiAke2xpdGVyYWwoZWRnZVR5cGUpfVxuICAgICAgICAgIGA7XG4gICAgICAgICAgYXdhaXQgZGF0YWJhc2UucXVlcnkoZWRnZVF1ZXJ5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGwgYWZ0ZXJEZWxldGUgaG9va1xuICAgIGlmKGNvbmZpZz8uaG9va3M/LmFmdGVyRGVsZXRlKSB7XG4gICAgICBhd2FpdCBjb25maWcuaG9va3MuYWZ0ZXJEZWxldGUoY29udGV4dCwgZG9jSWQpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkSXRlbTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1IsXG4gICAgICBwYXJhbXM6IHtjb2xsZWN0aW9uLCBpZH1cbiAgICB9LCBlcnJvciBhcyBFcnJvciwgY29udGV4dCk7XG4gIH1cbn07XG5cbi8qKlxuICogQ291bnQgaXRlbXMgaW4gYW55IGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGNvdW50SXRlbXMgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGNvbGxlY3Rpb246IHN0cmluZyxcbiAgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PiB8IEZpbHRlckdyb3VwID0ge31cbik6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdjb3VudEl0ZW1zJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZU5hbWUpO1xuICAgIGNvbnN0IGZpbHRlckNsYXVzZSA9IGJ1aWxkRmlsdGVycyhmaWx0ZXJzLCAnZG9jJyk7XG4gICAgY29uc3Qgd2hlcmVDbGF1c2UgPSBmaWx0ZXJDbGF1c2UgPyBsaXRlcmFsKGBGSUxURVIgJHtmaWx0ZXJDbGF1c2V9YCkgOiBsaXRlcmFsKCcnKTtcblxuICAgIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICAgIExFVCBpdGVtcyA9IChcbiAgICAgICAgRk9SIGRvYyBJTiAke2xpdGVyYWwoY29sbGVjdGlvbil9XG4gICAgICAgICAgJHt3aGVyZUNsYXVzZX1cbiAgICAgICAgICBSRVRVUk4gZG9jXG4gICAgICApXG4gICAgICBSRVRVUk4gTEVOR1RIKGl0ZW1zKVxuICAgIGA7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSk7XG4gICAgcmV0dXJuIGF3YWl0IHJlc3VsdC5uZXh0KCk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SLFxuICAgICAgcGFyYW1zOiB7Y29sbGVjdGlvbiwgZmlsdGVyc31cbiAgICB9LCBlcnJvciBhcyBFcnJvciwgY29udGV4dCk7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgaXRlbSBleGlzdHNcbiAqL1xuZXhwb3J0IGNvbnN0IGl0ZW1FeGlzdHMgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGNvbGxlY3Rpb246IHN0cmluZyxcbiAgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PiB8IEZpbHRlckdyb3VwXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgY291bnQgPSBhd2FpdCBjb3VudEl0ZW1zKGNvbnRleHQsIGNvbGxlY3Rpb24sIGZpbHRlcnMpO1xuICByZXR1cm4gY291bnQgPiAwO1xufTtcbiJdLCJuYW1lcyI6WyJhcWwiLCJsaXRlcmFsIiwib3JnYW5pemF0aW9uQWNjb3VudE11dGF0aW9uIiwib3JnYW5pemF0aW9uQWNjb3VudFdyaXRlR3VhcmQiLCJFcnJvclR5cGVzIiwibG9nRXJyb3IiLCJidWlsZEZpbHRlckNsYXVzZSIsInVzZURiIiwicmVnaXN0cnkiLCJldmVudENhdGVnb3J5IiwiYnVpbGRGaWx0ZXJzIiwiZmlsdGVycyIsInZhck5hbWUiLCJzaW1wbGVGaWx0ZXJzIiwiY29uZGl0aW9ucyIsImtleSIsInZhbHVlIiwiT2JqZWN0IiwiZW50cmllcyIsInB1c2giLCJKU09OIiwic3RyaW5naWZ5Iiwiam9pbiIsImJ1aWxkU29ydCIsInNvcnQiLCJsZW5ndGgiLCJzb3J0UGFydHMiLCJtYXAiLCJmaWVsZCIsImRpcmVjdGlvbiIsImJ1aWxkTGltaXQiLCJsaW1pdCIsImZyb20iLCJ0byIsImNvdW50IiwiYXBwbHlQcml2YWN5RmlsdGVyIiwiY29sbGVjdGlvbiIsInNlc3Npb25JZCIsImNvbmZpZyIsImdldCIsImhhc1ByaXZhY3kiLCJhcHBseU93bmVyc2hpcEZpbHRlciIsImdldEl0ZW1CeSIsImNvbnRleHQiLCJvcHRpb25zIiwiYWN0aW9uIiwiZGF0YWJhc2VOYW1lIiwic2Vzc2lvbiIsInVzZXJJZCIsInByaXZhY3kiLCJvd25lcnNoaXAiLCJjdXN0b21RdWVyaWVzIiwiY3VzdG9tT2JqZWN0cyIsImRhdGFiYXNlIiwiZmlsdGVyQ2xhdXNlIiwicHJpdmFjeUZpbHRlciIsIm93bmVyc2hpcEZpbHRlciIsImNvbGxlY3Rpb25MaXRlcmFsIiwid2hlcmVDbGF1c2UiLCJjdXN0b21RdWVyaWVzTGl0ZXJhbCIsInJldHVyblZhbHVlIiwiYXFsUXVlcnkiLCJyZXN1bHQiLCJxdWVyeSIsIml0ZW0iLCJuZXh0IiwiZXJyb3IiLCJjYXRlZ29yeSIsImxhYmVsIiwiREFUQUJBU0VfRVJST1IiLCJwYXJhbXMiLCJnZXRMaXN0QnkiLCJzb3J0Q2xhdXNlIiwibGltaXRDbGF1c2UiLCJhbGwiLCJhZGRJdGVtIiwiZGF0YSIsImhvb2tzIiwiaW5zZXJ0RGF0YSIsImFkYXB0ZXJzIiwicGFyc2UiLCJiZWZvcmVJbnNlcnQiLCJub3ciLCJEYXRlIiwidGltZXN0YW1wcyIsImNyZWF0ZWQiLCJ1cGRhdGVkIiwiY29sbGVjdGlvblJlZiIsInNhdmUiLCJyZXR1cm5OZXciLCJuZXciLCJhZnRlckluc2VydCIsInVwZGF0ZUl0ZW0iLCJpZCIsInVwZGF0ZXMiLCJtYW5hZ2VkIiwidXBkYXRlRGF0YSIsImJlZm9yZVVwZGF0ZSIsImRvY0lkIiwiaW5jbHVkZXMiLCJhY2NvdW50R3VhcmQiLCJhZnRlclVwZGF0ZSIsImRlbGV0ZUl0ZW0iLCJzb2Z0IiwiY2FzY2FkZSIsImRvY0tleSIsInNwbGl0IiwicG9wIiwiZGVsZXRlZEl0ZW0iLCJiZWZvcmVEZWxldGUiLCJ1cGRhdGUiLCJkZWxldGVkIiwiZGVsZXRlZEF0IiwiZWRnZXNUb0Nhc2NhZGUiLCJjYXNjYWRlRWRnZXMiLCJwcm9jZXNzIiwiZW52IiwiQVJBTkdPREJfREFUQUJBU0UiLCJlZGdlVHlwZSIsImVkZ2VRdWVyeSIsImFmdGVyRGVsZXRlIiwiY291bnRJdGVtcyIsIml0ZW1FeGlzdHMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLEdBQUcsUUFBTyxXQUFXO0FBQzdCLFNBQVFDLE9BQU8sUUFBTyxlQUFlO0FBRXJDLFNBQVFDLDJCQUEy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
@@ -38,3 +38,5 @@ export * from './contentGeneration.js';
38
38
  export * from './videoGeneration.js';
39
39
  export * from './geminiVideo.js';
40
40
  export * from './openaiResponseSession.js';
41
+ export * from './phoneSupport.js';
42
+ export * from './alfredFaq.js';
@@ -37,5 +37,7 @@ export * from './contentGeneration.js';
37
37
  export * from './videoGeneration.js';
38
38
  export * from './geminiVideo.js';
39
39
  export * from './openaiResponseSession.js';
40
+ export * from './phoneSupport.js';
41
+ export * from './alfredFaq.js';
40
42
 
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2UgaXMgc3ViamVjdCB0byB0aGUgYWNjb21wYW55aW5nIGNvbW1lcmNpYWwgTElDRU5TRS5cbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9hcHBzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYW5hbHl0aWNzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29ubmVjdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9kYXRhYmFzZVByb3Zpc2lvbmluZ0xlYXNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZGF0YWJhc2VBY2NvdW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnNhdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jcm0uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9keW5hbW9kYi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2VtYWlsLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZmlsZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9mbGFncy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2dyb3Vwcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2hpZ2dzZmllbGQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbWFnZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9pb3MuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9sb2NhdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdlcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL25vdGlmaWNhdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9wYXltZW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3Bvc3RzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcGVyc29uYXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZWFjdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9ydW0uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zMy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NlYXJjaC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3Ntcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3N0YXRpc3RpY3MuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zdWJzY3JpcHRpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdGFncy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3VzZXJzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdmlkZW9zLmpzJztcblxuZXhwb3J0ICogZnJvbSAnLi9pbWFnZUdlbmVyYXRpb24uanMnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbnRlbnRHZW5lcmF0aW9uLmpzJztcblxuZXhwb3J0ICogZnJvbSAnLi92aWRlb0dlbmVyYXRpb24uanMnO1xuXG5leHBvcnQgKiBmcm9tICcuL2dlbWluaVZpZGVvLmpzJztcblxuZXhwb3J0ICogZnJvbSAnLi9vcGVuYWlSZXNwb25zZVNlc3Npb24uanMnO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELGNBQWMsWUFBWTtBQUMxQixjQUFjLGlCQUFpQjtBQUMvQixjQUFjLG1CQUFtQjtBQUNqQyxjQUFjLGlDQUFpQztBQUMvQyxjQUFjLHdCQUF3QjtBQUN0QyxjQUFjLHFCQUFxQjtBQUNuQyxjQUFjLFdBQVc7QUFDekIsY0FBYyxnQkFBZ0I7QUFDOUIsY0FBYyxhQUFhO0FBQzNCLGNBQWMsYUFBYTtBQUMzQixjQUFjLGFBQWE7QUFDM0IsY0FBYyxjQUFjO0FBQzVCLGNBQWMsa0JBQWtCO0FBQ2hDLGNBQWMsY0FBYztBQUM1QixjQUFjLFdBQVc7QUFDekIsY0FBYyxpQkFBaUI7QUFDL0IsY0FBYyxnQkFBZ0I7QUFDOUIsY0FBYyxxQkFBcUI7QUFDbkMsY0FBYyxnQkFBZ0I7QUFDOUIsY0FBYyxhQUFhO0FBQzNCLGNBQWMsZ0JBQWdCO0FBQzlCLGNBQWMsaUJBQWlCO0FBQy9CLGNBQWMsV0FBVztBQUN6QixjQUFjLFVBQVU7QUFDeEIsY0FBYyxjQUFjO0FBQzVCLGNBQWMsV0FBVztBQUN6QixjQUFjLGtCQUFrQjtBQUNoQyxjQUFjLHFCQUFxQjtBQUNuQyxjQUFjLFlBQVk7QUFDMUIsY0FBYyxhQUFhO0FBQzNCLGNBQWMsY0FBYztBQUU1QixjQUFjLHVCQUF1QjtBQUVyQyxjQUFjLHlCQUF5QjtBQUV2QyxjQUFjLHVCQUF1QjtBQUVyQyxjQUFjLG1CQUFtQjtBQUVqQyxjQUFjLDZCQUE2QiJ9
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2UgaXMgc3ViamVjdCB0byB0aGUgYWNjb21wYW55aW5nIGNvbW1lcmNpYWwgTElDRU5TRS5cbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9hcHBzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYW5hbHl0aWNzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29ubmVjdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9kYXRhYmFzZVByb3Zpc2lvbmluZ0xlYXNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZGF0YWJhc2VBY2NvdW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnNhdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jcm0uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9keW5hbW9kYi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2VtYWlsLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZmlsZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9mbGFncy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2dyb3Vwcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2hpZ2dzZmllbGQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbWFnZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9pb3MuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9sb2NhdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdlcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL25vdGlmaWNhdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9wYXltZW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3Bvc3RzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcGVyc29uYXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZWFjdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9ydW0uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zMy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NlYXJjaC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3Ntcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3N0YXRpc3RpY3MuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zdWJzY3JpcHRpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdGFncy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3VzZXJzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdmlkZW9zLmpzJztcblxuZXhwb3J0ICogZnJvbSAnLi9pbWFnZUdlbmVyYXRpb24uanMnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbnRlbnRHZW5lcmF0aW9uLmpzJztcblxuZXhwb3J0ICogZnJvbSAnLi92aWRlb0dlbmVyYXRpb24uanMnO1xuXG5leHBvcnQgKiBmcm9tICcuL2dlbWluaVZpZGVvLmpzJztcblxuZXhwb3J0ICogZnJvbSAnLi9vcGVuYWlSZXNwb25zZVNlc3Npb24uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9waG9uZVN1cHBvcnQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9hbGZyZWRGYXEuanMnO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELGNBQWMsWUFBWTtBQUMxQixjQUFjLGlCQUFpQjtBQUMvQixjQUFjLG1CQUFtQjtBQUNqQyxjQUFjLGlDQUFpQztBQUMvQyxjQUFjLHdCQUF3QjtBQUN0QyxjQUFjLHFCQUFxQjtBQUNuQyxjQUFjLFdBQVc7QUFDekIsY0FBYyxnQkFBZ0I7QUFDOUIsY0FBYyxhQUFhO0FBQzNCLGNBQWMsYUFBYTtBQUMzQixjQUFjLGFBQWE7QUFDM0IsY0FBYyxjQUFjO0FBQzVCLGNBQWMsa0JBQWtCO0FBQ2hDLGNBQWMsY0FBYztBQUM1QixjQUFjLFdBQVc7QUFDekIsY0FBYyxpQkFBaUI7QUFDL0IsY0FBYyxnQkFBZ0I7QUFDOUIsY0FBYyxxQkFBcUI7QUFDbkMsY0FBYyxnQkFBZ0I7QUFDOUIsY0FBYyxhQUFhO0FBQzNCLGNBQWMsZ0JBQWdCO0FBQzlCLGNBQWMsaUJBQWlCO0FBQy9CLGNBQWMsV0FBVztBQUN6QixjQUFjLFVBQVU7QUFDeEIsY0FBYyxjQUFjO0FBQzVCLGNBQWMsV0FBVztBQUN6QixjQUFjLGtCQUFrQjtBQUNoQyxjQUFjLHFCQUFxQjtBQUNuQyxjQUFjLFlBQVk7QUFDMUIsY0FBYyxhQUFhO0FBQzNCLGNBQWMsY0FBYztBQUU1QixjQUFjLHVCQUF1QjtBQUVyQyxjQUFjLHlCQUF5QjtBQUV2QyxjQUFjLHVCQUF1QjtBQUVyQyxjQUFjLG1CQUFtQjtBQUVqQyxjQUFjLDZCQUE2QjtBQUMzQyxjQUFjLG9CQUFvQjtBQUNsQyxjQUFjLGlCQUFpQiJ9