@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, parseString } from '@nlabs/utils/parsers/strings';
6
6
  import { aql } from 'arangojs';
7
7
  import { literal } from 'arangojs/aql';
@@ -100,6 +100,7 @@ export const getMessages = (context, conversationId, { from, to })=>{
100
100
  const conversationDocId = `conversations/${formatConversationId}`;
101
101
  const conversationQry = aql`FOR e IN hasConversation
102
102
  FILTER e._from == ${sessionDocId} && e._to == ${conversationDocId}
103
+ AND DOCUMENT(${conversationDocId}).chatSchemaVersion != 1
103
104
  LIMIT 1
104
105
  RETURN e`;
105
106
  return useDb(databaseName).query(conversationQry).then((cursor)=>cursor.all()).then((conversations)=>{
@@ -109,7 +110,7 @@ export const getMessages = (context, conversationId, { from, to })=>{
109
110
  const limit = getLimit(from, to);
110
111
  const aqlQry = aql`
111
112
  FOR m IN messages
112
- FILTER m.conversationId == ${formatConversationId}
113
+ FILTER m.conversationId == ${formatConversationId} AND m.chatSchemaVersion != 1
113
114
  SORT m.added DESC
114
115
  ${literal(limit.aql)}
115
116
  SORT m.added ASC
@@ -146,7 +147,9 @@ export const updateMessage = (context, message)=>{
146
147
  personaId,
147
148
  userId: sessionId
148
149
  };
149
- const aqlQry = aql`UPSERT {_key: ${formatMsgId}, conversationId: ${formatConversationId}, personaId: ${personaId}}
150
+ const aqlQry = aql`LET current = DOCUMENT('messages', ${formatMsgId})
151
+ FILTER current.chatSchemaVersion != 1
152
+ UPSERT {_key: ${formatMsgId}, conversationId: ${formatConversationId}, personaId: ${personaId}}
150
153
  INSERT ${insert}
151
154
  UPDATE ${update} IN messages
152
155
  RETURN NEW`;
@@ -176,8 +179,11 @@ export const saveMessage = (context, messageId, conversationId)=>{
176
179
  const formatId = parseId(messageId);
177
180
  return getConversationById(context, conversationId).then((conversation)=>{
178
181
  const { _key: conversationKey } = conversation;
182
+ if (!conversationKey) {
183
+ return null;
184
+ }
179
185
  const aqlQry = aql`FOR m IN messages
180
- FILTER m._key == ${formatId} && m.to == ${conversationKey}
186
+ FILTER m._key == ${formatId} && m.to == ${conversationKey} && m.chatSchemaVersion != 1
181
187
  UPDATE m WITH {saved: APPEND(m.saved, ${sessionId}, true)} IN messages
182
188
  RETURN NEW`;
183
189
  return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).then((message)=>{
@@ -197,8 +203,11 @@ export const unsaveMessage = (context, messageId, conversationId)=>{
197
203
  const formatId = parseId(messageId);
198
204
  return getConversationById(context, conversationId).then((conversation)=>{
199
205
  const { _key: conversationKey } = conversation;
206
+ if (!conversationKey) {
207
+ return null;
208
+ }
200
209
  const aqlQry = aql`FOR m IN messages
201
- FILTER m._key == ${formatId} && m.to == ${conversationKey}
210
+ FILTER m._key == ${formatId} && m.to == ${conversationKey} && m.chatSchemaVersion != 1
202
211
  UPDATE m WITH {saved: REMOVE_VALUE(m.saved, ${sessionId})} IN messages
203
212
  RETURN NEW`;
204
213
  return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).then((message)=>{
@@ -218,8 +227,11 @@ export const deleteMessage = (context, messageId, conversationId)=>{
218
227
  const formatId = parseId(messageId);
219
228
  return getConversationById(context, conversationId).then((conversation)=>{
220
229
  const { _key: conversationKey } = conversation;
230
+ if (!conversationKey) {
231
+ return null;
232
+ }
221
233
  const aqlQry = aql`FOR m IN messages
222
- FILTER m._key == ${formatId} && m.to == ${conversationKey} && m.from == ${sessionId}
234
+ FILTER m._key == ${formatId} && m.to == ${conversationKey} && m.from == ${sessionId} && m.chatSchemaVersion != 1
223
235
  REMOVE m IN messages
224
236
  RETURN OLD`;
225
237
  return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).then((message)=>{
@@ -239,6 +251,9 @@ export const getMessage = (context, messageId)=>{
239
251
  return getListBy(context, 'messages', {
240
252
  _key: formatId
241
253
  }, {
254
+ customQueries: [
255
+ 'FILTER doc.chatSchemaVersion != 1'
256
+ ],
242
257
  limit: {
243
258
  from: 0,
244
259
  to: 1
@@ -251,6 +266,7 @@ export const cleanMessages = (databaseName)=>{
251
266
  // Remove all messages that are over 60 days and not saved
252
267
  const aqlQry = aql`FOR m IN messages
253
268
  FILTER m.added < DATE_TIMESTAMP(DATE_SUBTRACT(DATE_NOW(), 60, 'day')) && LENGTH(m.saved) > 0
269
+ AND m.chatSchemaVersion != 1
254
270
  REMOVE m IN messages
255
271
  RETURN OLD`;
256
272
  return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.all()).then((list)=>list.length).catch((error)=>{
@@ -258,4 +274,4 @@ export const cleanMessages = (databaseName)=>{
258
274
  });
259
275
  };
260
276
 
261
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9tZXNzYWdlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2UgaXMgc3ViamVjdCB0byB0aGUgYWNjb21wYW55aW5nIGNvbW1lcmNpYWwgTElDRU5TRS5cbiAqL1xuaW1wb3J0IHtjbG9uZURlZXB9IGZyb20gJ0BubGFicy91dGlscy9vYmplY3RzL2Nsb25lJztcbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VJZCwgcGFyc2VTdHJpbmd9IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL3N0cmluZ3MnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnksIGxpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5cbmltcG9ydCB7cGFyc2VNZXNzYWdlfSBmcm9tICcuLi9hZGFwdGVycy9tZXNzYWdlQWRhcHRlci5qcyc7XG5pbXBvcnQge2dldENvbm5lY3Rpb25CeUNvbnZlcnNhdGlvbn0gZnJvbSAnLi4vbGFtYmRhcy9hY3Rpb25zL3dlYnNvY2tldHMuanMnO1xuaW1wb3J0IHt3c0NsaWVudH0gZnJvbSAnLi4vbGFtYmRhcy91dGlscy93ZWJzb2NrZXQuanMnO1xuaW1wb3J0IHtsb2dFcnJvcn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMuanMnO1xuaW1wb3J0IHtnZXRMaW1pdCwgdXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMuanMnO1xuaW1wb3J0IHtlbnN1cmVDb252ZXJzYXRpb25NZXNzYWdpbmdBbGxvd2VkLCBnZXRDb252ZXJzYXRpb25CeUlkfSBmcm9tICcuL2NvbnZlcnNhdGlvbnMuanMnO1xuaW1wb3J0IHthZGRJdGVtLCBnZXRMaXN0Qnl9IGZyb20gJy4vY3J1ZC5qcyc7XG5pbXBvcnQge2dldFBlcnNvbmFCeUlkfSBmcm9tICcuL3BlcnNvbmFzLmpzJztcbmltcG9ydCB7Z2V0VXNlckRpc3BsYXlOYW1lfSBmcm9tICcuL3VzZXJzLmpzJztcblxuaW1wb3J0IHR5cGUge0FyYW5nb0RiTGltaXR9IGZyb20gJy4uL3R5cGVzL2FyYW5nb2RiLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtDb252ZXJzYXRpb25UeXBlfSBmcm9tICcuLi90eXBlcy9jb252ZXJzYXRpb25zLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtNZXNzYWdlSW5wdXRUeXBlLCBNZXNzYWdlVHlwZX0gZnJvbSAnLi4vdHlwZXMvbWVzc2FnZXMudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1VzZXJUeXBlfSBmcm9tICcuLi90eXBlcy91c2Vycy50eXBlcy5qcyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnkgPSAnbWVzc2FnZXMnO1xuXG5jb25zdCBlbnJpY2hNZXNzYWdlVXNlciA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgbWVzc2FnZTogTWVzc2FnZVR5cGUsXG4gIGJhc2VVc2VyPzogVXNlclR5cGUgfCBudWxsXG4pOiBQcm9taXNlPFVzZXJUeXBlIHwgbnVsbD4gPT4ge1xuICBjb25zdCBzZXNzaW9uVXNlcklkID0gcGFyc2VJZChTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSk7XG4gIGNvbnN0IHNlc3Npb25QZXJzb25hSWQgPSBwYXJzZUlkKFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy5wZXJzb25hSWQgfHwgJycpKTtcbiAgY29uc3QgbWVzc2FnZVVzZXJJZCA9IHBhcnNlSWQoU3RyaW5nKG1lc3NhZ2U/LnVzZXJJZCB8fCBiYXNlVXNlcj8udXNlcklkIHx8IGJhc2VVc2VyPy5fa2V5IHx8ICcnKSk7XG5cbiAgaWYoIW1lc3NhZ2VVc2VySWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHVzZXIgPSBiYXNlVXNlciB8fCBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsYFxuICAgIEZPUiB1IElOIHVzZXJzXG4gICAgICBGSUxURVIgdS5fa2V5ID09ICR7bWVzc2FnZVVzZXJJZH1cbiAgICAgIExJTUlUIDFcbiAgICAgIFJFVFVSTiB1XG4gIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgVXNlclR5cGUgfCBudWxsO1xuICBjb25zdCByZXNvbHZlZFBlcnNvbmFJZCA9IHBhcnNlSWQoXG4gICAgU3RyaW5nKFxuICAgICAgbWVzc2FnZT8ucGVyc29uYUlkXG4gICAgICB8fCAobWVzc2FnZVVzZXJJZCA9PT0gc2Vzc2lvblVzZXJJZCA/IHNlc3Npb25QZXJzb25hSWQgOiAnJylcbiAgICAgIHx8IHVzZXI/LnBlcnNvbmFJZFxuICAgICAgfHwgJydcbiAgICApXG4gICk7XG4gIGNvbnN0IHBlcnNvbmEgPSByZXNvbHZlZFBlcnNvbmFJZFxuICAgID8gYXdhaXQgZ2V0UGVyc29uYUJ5SWQoY29udGV4dCwgcmVzb2x2ZWRQZXJzb25hSWQpLmNhdGNoKCgpID0+IG51bGwpXG4gICAgOiBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgLi4udXNlcixcbiAgICBpbWFnZVVybDogU3RyaW5nKHVzZXI/LmltYWdlVXJsIHx8IHBlcnNvbmE/LmltYWdlVXJsIHx8ICcnKSxcbiAgICBuYW1lOiBTdHJpbmcocGVyc29uYT8ubmFtZSB8fCB1c2VyPy5uYW1lIHx8IGdldFVzZXJEaXNwbGF5TmFtZSh1c2VyIHx8IHt9IGFzIFVzZXJUeXBlKSksXG4gICAgcGVyc29uYUlkOiBTdHJpbmcocmVzb2x2ZWRQZXJzb25hSWQgfHwgdXNlcj8ucGVyc29uYUlkIHx8ICcnKSxcbiAgICB0aHVtYlVybDogU3RyaW5nKHVzZXI/LnRodW1iVXJsIHx8IHVzZXI/LnRodW1iSWQgfHwgcGVyc29uYT8udGh1bWJVcmwgfHwgJycpLFxuICAgIHVzZXJJZDogbWVzc2FnZVVzZXJJZCxcbiAgICB1c2VybmFtZTogU3RyaW5nKHVzZXI/LnVzZXJuYW1lIHx8ICcnKVxuICB9O1xufTtcblxuY29uc3Qgd2l0aE1lc3NhZ2VVc2VyID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBtZXNzYWdlOiBNZXNzYWdlVHlwZSxcbiAgYmFzZVVzZXI/OiBVc2VyVHlwZSB8IG51bGxcbik6IFByb21pc2U8TWVzc2FnZVR5cGU+ID0+ICh7XG4gIC4uLm1lc3NhZ2UsXG4gIHVzZXI6IGF3YWl0IGVucmljaE1lc3NhZ2VVc2VyKGNvbnRleHQsIG1lc3NhZ2UsIGJhc2VVc2VyKVxufSk7XG5cbmNvbnN0IHVwZGF0ZUNvbnZlcnNhdGlvblN1bW1hcnkgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIG1lc3NhZ2U6IE1lc3NhZ2VUeXBlXG4pOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGUgfCBudWxsPiA9PiB7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbklkID0gcGFyc2VJZChTdHJpbmcobWVzc2FnZT8uY29udmVyc2F0aW9uSWQgfHwgJycpKTtcblxuICBpZighY29udmVyc2F0aW9uSWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBwYXJzZVN0cmluZyhTdHJpbmcobWVzc2FnZT8uY29udGVudCB8fCAnJyksIDY0MCk7XG4gIGNvbnN0IG1vZGlmaWVkID0gTnVtYmVyKG1lc3NhZ2U/Lm1vZGlmaWVkIHx8IG1lc3NhZ2U/LmFkZGVkIHx8IERhdGUubm93KCkpO1xuICBjb25zdCBzdW1tYXJ5ID0ge1xuICAgIGNvbnRlbnQsXG4gICAgbW9kaWZpZWRcbiAgfTtcblxuICBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsYFxuICAgIFVQREFURSAke2NvbnZlcnNhdGlvbklkfVxuICAgIFdJVEggJHtzdW1tYXJ5fVxuICAgIElOIGNvbnZlcnNhdGlvbnNcbiAgYCk7XG5cbiAgY29uc3QgY29udmVyc2F0aW9uID0gYXdhaXQgZ2V0Q29udmVyc2F0aW9uQnlJZChjb250ZXh0LCBjb252ZXJzYXRpb25JZCk7XG5cbiAgaWYoIWNvbnZlcnNhdGlvbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5jb252ZXJzYXRpb24sXG4gICAgY29udGVudCxcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBtb2RpZmllZFxuICB9IGFzIENvbnZlcnNhdGlvblR5cGU7XG59O1xuXG5jb25zdCBlbWl0UmVhbHRpbWVNZXNzYWdlID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIG1lc3NhZ2U6IE1lc3NhZ2VUeXBlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGlmKCFtZXNzYWdlPy5jb252ZXJzYXRpb25JZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGF3YWl0IHVwZGF0ZUNvbnZlcnNhdGlvblN1bW1hcnkoY29udGV4dCwgbWVzc2FnZSk7XG5cbiAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICBhY3Rpb246ICdtZXNzYWdlLmNyZWF0ZWQnLFxuICAgIGRhdGE6IHtcbiAgICAgIC4uLihjb252ZXJzYXRpb24gPyB7Y29udmVyc2F0aW9ufSA6IHt9KSxcbiAgICAgIG1lc3NhZ2U6IHtcbiAgICAgICAgLi4uKGF3YWl0IHdpdGhNZXNzYWdlVXNlcihjb250ZXh0LCBtZXNzYWdlKSlcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGNvbm5lY3Rpb25Hcm91cHMgPSBhd2FpdCBnZXRDb25uZWN0aW9uQnlDb252ZXJzYXRpb24oY29udGV4dCwgbWVzc2FnZS5jb252ZXJzYXRpb25JZCk7XG4gIGNvbnN0IGNvbm5lY3Rpb25JZHMgPSBjb25uZWN0aW9uR3JvdXBzXG4gICAgLmZsYXRNYXAoKGdyb3VwKSA9PiBBcnJheS5pc0FycmF5KGdyb3VwKSA/IGdyb3VwIDogW10pXG4gICAgLm1hcCgoY29ubmVjdGlvbklkKSA9PiBwYXJzZVN0cmluZyhjb25uZWN0aW9uSWQsIDMyKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLmZpbHRlcigoY29ubmVjdGlvbklkLCBpbmRleCwgbGlzdCkgPT4gbGlzdC5pbmRleE9mKGNvbm5lY3Rpb25JZCkgPT09IGluZGV4KTtcblxuICBpZihjb25uZWN0aW9uSWRzLmxlbmd0aCkge1xuICAgIGF3YWl0IHdzQ2xpZW50LnNlbmQoY29ubmVjdGlvbklkcywgcGF5bG9hZCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNZXNzYWdlcyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBjb252ZXJzYXRpb25JZDogc3RyaW5nLCB7ZnJvbSwgdG99KTogUHJvbWlzZTxNZXNzYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0Q29udmVyc2F0aW9uSWQgPSBwYXJzZUlkKGNvbnZlcnNhdGlvbklkKTtcbiAgY29uc3Qgc2Vzc2lvbkRvY0lkID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbkRvY0lkID0gYGNvbnZlcnNhdGlvbnMvJHtmb3JtYXRDb252ZXJzYXRpb25JZH1gO1xuICBjb25zdCBjb252ZXJzYXRpb25RcnkgPSBhcWxgRk9SIGUgSU4gaGFzQ29udmVyc2F0aW9uXG4gICAgRklMVEVSIGUuX2Zyb20gPT0gJHtzZXNzaW9uRG9jSWR9ICYmIGUuX3RvID09ICR7Y29udmVyc2F0aW9uRG9jSWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBlYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShjb252ZXJzYXRpb25RcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC50aGVuKChjb252ZXJzYXRpb25zKSA9PiB7XG4gICAgICBpZighY29udmVyc2F0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsaW1pdDogQXJhbmdvRGJMaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcbiAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgICAgIEZPUiBtIElOIG1lc3NhZ2VzXG4gICAgICAgICAgRklMVEVSIG0uY29udmVyc2F0aW9uSWQgPT0gJHtmb3JtYXRDb252ZXJzYXRpb25JZH1cbiAgICAgICAgICBTT1JUIG0uYWRkZWQgREVTQ1xuICAgICAgICAgICR7bGl0ZXJhbChsaW1pdC5hcWwpfVxuICAgICAgICAgIFNPUlQgbS5hZGRlZCBBU0NcbiAgICAgICAgICBMRVQgdXNlciA9IEZJUlNUKFxuICAgICAgICAgICAgRk9SIHUgSU4gdXNlcnNcbiAgICAgICAgICAgICAgRklMVEVSIHUuX2tleSA9PSBtLnVzZXJJZFxuICAgICAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgICAgIFJFVFVSTiB1XG4gICAgICAgICAgKVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShtLCB7dXNlcn0pXG4gICAgICBgO1xuXG4gICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAgICAgLnRoZW4oKG1lc3NhZ2VzKSA9PiBQcm9taXNlLmFsbChtZXNzYWdlcy5tYXAoKG1lc3NhZ2U6IE1lc3NhZ2VUeXBlKSA9PiB3aXRoTWVzc2FnZVVzZXIoY29udGV4dCwgbWVzc2FnZSwgbWVzc2FnZT8udXNlciBhcyBVc2VyVHlwZSB8IG51bGwpKSkpXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZU1lc3NhZ2UgPSAoY29udGV4dDogQXBpQ29udGV4dCwgbWVzc2FnZTogTWVzc2FnZUlucHV0VHlwZSk6IFByb21pc2U8TWVzc2FnZVR5cGU+ID0+IHtcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3BlcnNvbmFJZCwgdXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBmaWxlcyxcbiAgICBpbWFnZXMsXG4gICAgbWVzc2FnZUlkID0gY3JlYXRlSGFzaChgbWVzc2FnZS0ke3BlcnNvbmFJZH0tJHtEYXRlLm5vdygpfWApLFxuICB9ID0gbWVzc2FnZTtcbiAgY29uc3QgZm9ybWF0Q29udmVyc2F0aW9uSWQgPSBwYXJzZUlkKGNvbnZlcnNhdGlvbklkKTtcblxuICBpZihmb3JtYXRDb252ZXJzYXRpb25JZCA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX2NvbnZlcnNhdGlvbklkJyk7XG4gIH1cblxuICBjb25zdCBmb3JtYXRNc2dJZCA9IHBhcnNlSWQobWVzc2FnZUlkKTtcbiAgY29uc3QgdXBkYXRlOiBNZXNzYWdlVHlwZSA9IHtcbiAgICBjb250ZW50OiBwYXJzZVN0cmluZyhtZXNzYWdlLmNvbnRlbnQsIDY0MCksXG4gICAgZmlsZXM6IGZpbGVzIHx8IFtdLFxuICAgIGltYWdlczogaW1hZ2VzIHx8IFtdXG4gIH07XG5cbiAgY29uc3QgaW5zZXJ0OiBNZXNzYWdlVHlwZSA9IHtcbiAgICAuLi5jbG9uZURlZXAodXBkYXRlKSxcbiAgICBfa2V5OiBmb3JtYXRNc2dJZCxcbiAgICBjb252ZXJzYXRpb25JZDogZm9ybWF0Q29udmVyc2F0aW9uSWQsXG4gICAgcGVyc29uYUlkLFxuICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gIH07XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBTRVJUIHtfa2V5OiAke2Zvcm1hdE1zZ0lkfSwgY29udmVyc2F0aW9uSWQ6ICR7Zm9ybWF0Q29udmVyc2F0aW9uSWR9LCBwZXJzb25hSWQ6ICR7cGVyc29uYUlkfX1cbiAgICBJTlNFUlQgJHtpbnNlcnR9XG4gICAgVVBEQVRFICR7dXBkYXRlfSBJTiBtZXNzYWdlc1xuICAgIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBlbnN1cmVDb252ZXJzYXRpb25NZXNzYWdpbmdBbGxvd2VkKGNvbnRleHQsIGZvcm1hdENvbnZlcnNhdGlvbklkKVxuICAgIC50aGVuKCgpID0+IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKGFzeW5jIChzYXZlZE1lc3NhZ2U6IE1lc3NhZ2VUeXBlKSA9PiB7XG4gICAgICBjb25zdCBlbnJpY2hlZE1lc3NhZ2UgPSBhd2FpdCB3aXRoTWVzc2FnZVVzZXIoY29udGV4dCwgc2F2ZWRNZXNzYWdlKTtcbiAgICAgIGF3YWl0IGVtaXRSZWFsdGltZU1lc3NhZ2UoY29udGV4dCwgZW5yaWNoZWRNZXNzYWdlKTtcbiAgICAgIHJldHVybiBlbnJpY2hlZE1lc3NhZ2U7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkTWVzc2FnZSA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBtZXNzYWdlOiBNZXNzYWdlSW5wdXRUeXBlKTogUHJvbWlzZTxNZXNzYWdlVHlwZT4gPT4ge1xuICBjb25zdCBuZXdNZXNzYWdlOiBNZXNzYWdlVHlwZSA9IHBhcnNlTWVzc2FnZShtZXNzYWdlKTtcbiAgY29uc3QgY29udmVyc2F0aW9uSWQgPSBwYXJzZUlkKFN0cmluZyhuZXdNZXNzYWdlPy5jb252ZXJzYXRpb25JZCB8fCAnJykpO1xuXG4gIHJldHVybiBlbnN1cmVDb252ZXJzYXRpb25NZXNzYWdpbmdBbGxvd2VkKGNvbnRleHQsIGNvbnZlcnNhdGlvbklkKVxuICAgIC50aGVuKCgpID0+IGFkZEl0ZW08TWVzc2FnZVR5cGU+KGNvbnRleHQsICdtZXNzYWdlcycsIG5ld01lc3NhZ2UpKVxuICAgIC50aGVuKGFzeW5jIChzYXZlZE1lc3NhZ2U6IE1lc3NhZ2VUeXBlKSA9PiB7XG4gICAgICBjb25zdCBlbnJpY2hlZE1lc3NhZ2UgPSBhd2FpdCB3aXRoTWVzc2FnZVVzZXIoY29udGV4dCwgc2F2ZWRNZXNzYWdlKTtcbiAgICAgIGF3YWl0IGVtaXRSZWFsdGltZU1lc3NhZ2UoY29udGV4dCwgZW5yaWNoZWRNZXNzYWdlKTtcbiAgICAgIHJldHVybiBlbnJpY2hlZE1lc3NhZ2U7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uOiAnYWRkTWVzc2FnZScsXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnYWRkTWVzc2FnZSdcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNhdmVNZXNzYWdlID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIG1lc3NhZ2VJZDogc3RyaW5nLCBjb252ZXJzYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxNZXNzYWdlVHlwZT4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdElkID0gcGFyc2VJZChtZXNzYWdlSWQpO1xuXG4gIHJldHVybiBnZXRDb252ZXJzYXRpb25CeUlkKGNvbnRleHQsIGNvbnZlcnNhdGlvbklkKVxuICAgIC50aGVuKChjb252ZXJzYXRpb246IENvbnZlcnNhdGlvblR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHtfa2V5OiBjb252ZXJzYXRpb25LZXl9ID0gY29udmVyc2F0aW9uO1xuICAgICAgY29uc3QgYXFsUXJ5ID0gYXFsYEZPUiBtIElOIG1lc3NhZ2VzXG4gICAgICAgIEZJTFRFUiBtLl9rZXkgPT0gJHtmb3JtYXRJZH0gJiYgbS50byA9PSAke2NvbnZlcnNhdGlvbktleX1cbiAgICAgICAgVVBEQVRFIG0gV0lUSCB7c2F2ZWQ6IEFQUEVORChtLnNhdmVkLCAke3Nlc3Npb25JZH0sIHRydWUpfSBJTiBtZXNzYWdlc1xuICAgICAgICBSRVRVUk4gTkVXYDtcblxuICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAudGhlbigobWVzc2FnZTogTWVzc2FnZVR5cGUpID0+IHtcbiAgICAgICAgICBpZihtZXNzYWdlKSB7XG4gICAgICAgICAgICAvLyBCcm9hZGNhc3QgdG8gbWVzc2FnZSBib3hcbiAgICAgICAgICAgIC8vIGNvbnN0IG1lc3NhZ2U6IE1lc3NhZ2VUeXBlID0gTWVzc2FnZXMuZ2V0TWVzc2FnZU9iamVjdChtZXNzYWdlKTtcbiAgICAgICAgICAgIC8vIGlvLnRvKG1lc3NhZ2UudG9JZCkuZW1pdCgnbWVzc2FnZV9zYXZlJywgbWVzc2FnZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVuc2F2ZU1lc3NhZ2UgPSAoY29udGV4dDogQXBpQ29udGV4dCwgbWVzc2FnZUlkOiBzdHJpbmcsIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1lc3NhZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SWQgPSBwYXJzZUlkKG1lc3NhZ2VJZCk7XG5cbiAgcmV0dXJuIGdldENvbnZlcnNhdGlvbkJ5SWQoY29udGV4dCwgY29udmVyc2F0aW9uSWQpXG4gICAgLnRoZW4oKGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uVHlwZSkgPT4ge1xuICAgICAgY29uc3Qge19rZXk6IGNvbnZlcnNhdGlvbktleX0gPSBjb252ZXJzYXRpb247XG4gICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBtIElOIG1lc3NhZ2VzXG4gICAgICAgICAgRklMVEVSIG0uX2tleSA9PSAke2Zvcm1hdElkfSAmJiBtLnRvID09ICR7Y29udmVyc2F0aW9uS2V5fVxuICAgICAgICAgIFVQREFURSBtIFdJVEgge3NhdmVkOiBSRU1PVkVfVkFMVUUobS5zYXZlZCwgJHtzZXNzaW9uSWR9KX0gSU4gbWVzc2FnZXNcbiAgICAgICAgICBSRVRVUk4gTkVXYDtcblxuICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAudGhlbigobWVzc2FnZTogTWVzc2FnZVR5cGUpID0+IHtcbiAgICAgICAgICBpZihtZXNzYWdlKSB7XG4gICAgICAgICAgICAvLyBCcm9hZGNhc3QgdG8gbWVzc2FnZSBib3hcbiAgICAgICAgICAgIC8vIGNvbnN0IG1lc3NhZ2U6IE1lc3NhZ2VUeXBlID0gTWVzc2FnZXMuZ2V0TWVzc2FnZU9iamVjdChtZXNzYWdlKTtcbiAgICAgICAgICAgIC8vIGlvLnRvKG1lc3NhZ2UuaWQpLmVtaXQoJ21lc3NhZ2VfdW5zYXZlJywgbWVzc2FnZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZU1lc3NhZ2UgPSAoY29udGV4dDogQXBpQ29udGV4dCwgbWVzc2FnZUlkOiBzdHJpbmcsIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1lc3NhZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SWQgPSBwYXJzZUlkKG1lc3NhZ2VJZCk7XG5cbiAgcmV0dXJuIGdldENvbnZlcnNhdGlvbkJ5SWQoY29udGV4dCwgY29udmVyc2F0aW9uSWQpXG4gICAgLnRoZW4oKGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uVHlwZSkgPT4ge1xuICAgICAgY29uc3Qge19rZXk6IGNvbnZlcnNhdGlvbktleX0gPSBjb252ZXJzYXRpb247XG4gICAgICBjb25zdCBhcWxRcnkgPSBhcWxgRk9SIG0gSU4gbWVzc2FnZXNcbiAgICAgICAgRklMVEVSIG0uX2tleSA9PSAke2Zvcm1hdElkfSAmJiBtLnRvID09ICR7Y29udmVyc2F0aW9uS2V5fSAmJiBtLmZyb20gPT0gJHtzZXNzaW9uSWR9XG4gICAgICAgIFJFTU9WRSBtIElOIG1lc3NhZ2VzXG4gICAgICAgIFJFVFVSTiBPTERgO1xuXG4gICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgIC50aGVuKChtZXNzYWdlOiBNZXNzYWdlVHlwZSkgPT4ge1xuICAgICAgICAgIGlmKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgIC8vIEJyb2FkY2FzdCB0byBtZXNzYWdlIGJveFxuICAgICAgICAgICAgLy8gY29uc3QgbWVzc2FnZTogTWVzc2FnZVR5cGUgPSBNZXNzYWdlcy5nZXRNZXNzYWdlT2JqZWN0KG1lc3NhZ2UpO1xuICAgICAgICAgICAgLy8gaW8udG8obWVzc2FnZS50b0lkKS5lbWl0KCdtZXNzYWdlX2RlbGV0ZScsIG1lc3NhZ2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNZXNzYWdlID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIG1lc3NhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTxNZXNzYWdlVHlwZT4gPT4ge1xuICBjb25zdCBmb3JtYXRJZCA9IHBhcnNlSWQobWVzc2FnZUlkKTtcblxuICByZXR1cm4gZ2V0TGlzdEJ5PE1lc3NhZ2VUeXBlPihcbiAgICBjb250ZXh0LFxuICAgICdtZXNzYWdlcycsXG4gICAge19rZXk6IGZvcm1hdElkfSxcbiAgICB7bGltaXQ6IHtmcm9tOiAwLCB0bzogMX19XG4gIClcbiAgICAudGhlbigobWVzc2FnZXMpID0+IG1lc3NhZ2VzWzBdIHx8IG51bGwpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNsZWFuTWVzc2FnZXMgPSAoZGF0YWJhc2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICAvLyBSZW1vdmUgYWxsIG1lc3NhZ2VzIHRoYXQgYXJlIG92ZXIgNjAgZGF5cyBhbmQgbm90IHNhdmVkXG4gIGNvbnN0IGFxbFFyeSA9IGFxbGBGT1IgbSBJTiBtZXNzYWdlc1xuICAgICAgRklMVEVSIG0uYWRkZWQgPCBEQVRFX1RJTUVTVEFNUChEQVRFX1NVQlRSQUNUKERBVEVfTk9XKCksIDYwLCAnZGF5JykpICYmIExFTkdUSChtLnNhdmVkKSA+IDBcbiAgICAgIFJFTU9WRSBtIElOIG1lc3NhZ2VzXG4gICAgICBSRVRVUk4gT0xEYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC50aGVuKChsaXN0OiBNZXNzYWdlVHlwZVtdKSA9PiBsaXN0Lmxlbmd0aClcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuIl0sIm5hbWVzIjpbImNsb25lRGVlcCIsImNyZWF0ZUhhc2giLCJwYXJzZUlkIiwicGFyc2VTdHJpbmciLCJhcWwiLCJsaXRlcmFsIiwicGFyc2VNZXNzYWdlIiwiZ2V0Q29ubmVjdGlvbkJ5Q29udmVyc2F0aW9uIiwid3NDbGllbnQiLCJsb2dFcnJvciIsImdldExpbWl0IiwidXNlRGIiLCJlbnN1cmVDb252ZXJzYXRpb25NZXNzYWdpbmdBbGxvd2VkIiwiZ2V0Q29udmVyc2F0aW9uQnlJZCIsImFkZEl0ZW0iLCJnZXRMaXN0QnkiLCJnZXRQZXJzb25hQnlJZCIsImdldFVzZXJEaXNwbGF5TmFtZSIsImV2ZW50Q2F0ZWdvcnkiLCJlbnJpY2hNZXNzYWdlVXNlciIsImNvbnRleHQiLCJtZXNzYWdlIiwiYmFzZVVzZXIiLCJzZXNzaW9uVXNlcklkIiwiU3RyaW5nIiwic2Vzc2lvbiIsInVzZXJJZCIsInNlc3Npb25QZXJzb25hSWQiLCJwZXJzb25hSWQiLCJtZXNzYWdlVXNlcklkIiwiX2tleSIsInVzZXIiLCJkYXRhYmFzZU5hbWUiLCJxdWVyeSIsInRoZW4iLCJjdXJzb3IiLCJuZXh0IiwicmVzb2x2ZWRQZXJzb25hSWQiLCJwZXJzb25hIiwiY2F0Y2giLCJpbWFnZVVybCIsIm5hbWUiLCJ0aHVtYlVybCIsInRodW1iSWQiLCJ1c2VybmFtZSIsIndpdGhNZXNzYWdlVXNlciIsInVwZGF0ZUNvbnZlcnNhdGlvblN1bW1hcnkiLCJjb252ZXJzYXRpb25JZCIsImNvbnRlbnQiLCJtb2RpZmllZCIsIk51bWJlciIsImFkZGVkIiwiRGF0ZSIsIm5vdyIsInN1bW1hcnkiLCJjb252ZXJzYXRpb24iLCJlbWl0UmVhbHRpbWVNZXNzYWdlIiwicGF5bG9hZCIsImFjdGlvbiIsImRhdGEiLCJjb25uZWN0aW9uR3JvdXBzIiwiY29ubmVjdGlvbklkcyIsImZsYXRNYXAiLCJncm91cCIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsImNvbm5lY3Rpb25JZCIsImZpbHRlciIsIkJvb2xlYW4iLCJpbmRleCIsImxpc3QiLCJpbmRleE9mIiwibGVuZ3RoIiwic2VuZCIsImdldE1lc3NhZ2VzIiwiZnJvbSIsInRvIiwic2Vzc2lvbklkIiwiZm9ybWF0Q29udmVyc2F0aW9uSWQiLCJzZXNzaW9uRG9jSWQiLCJjb252ZXJzYXRpb25Eb2NJZCIsImNvbnZlcnNhdGlvblFyeSIsImFsbCIsImNvbnZlcnNhdGlvbnMiLCJsaW1pdCIsImFxbFFyeSIsIm1lc3NhZ2VzIiwiUHJvbWlzZSIsImVycm9yIiwidXBkYXRlTWVzc2FnZSIsImZpbGVzIiwiaW1hZ2VzIiwibWVzc2FnZUlkIiwiRXJyb3IiLCJmb3JtYXRNc2dJZCIsInVwZGF0ZSIsImluc2VydCIsInNhdmVkTWVzc2FnZSIsImVucmljaGVkTWVzc2FnZSIsImFkZE1lc3NhZ2UiLCJuZXdNZXNzYWdlIiwiY2F0ZWdvcnkiLCJsYWJlbCIsInNhdmVNZXNzYWdlIiwiZm9ybWF0SWQiLCJjb252ZXJzYXRpb25LZXkiLCJ1bnNhdmVNZXNzYWdlIiwiZGVsZXRlTWVzc2FnZSIsImdldE1lc3NhZ2UiLCJjbGVhbk1lc3NhZ2VzIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxTQUFTLFFBQU8sNkJBQTZCO0FBQ3JELFNBQVFDLFVBQVUsRUFBRUMsT0FBTyxFQUFFQyxXQUFXLFFBQU8sK0JBQStCO0FBQzlFLFNBQVFDLEdBQUcsUUFBTyxXQUFXO0FBQzdCLFNBQWtCQyxPQUFPLFFBQU8sZUFBZTtBQUUvQyxTQUFRQyxZQUFZLFFBQU8sZ0NBQWdDO0FBQzNELFNBQVFDLDJCQUEyQixRQUFPLG1DQUFtQztBQUM3RSxTQUFRQyxRQUFRLFFBQU8sZ0NBQWdDO0FBQ3ZELFNBQVFDLFFBQVEsUUFBTyw2QkFBNkI7QUFDcEQsU0FBUUMsUUFBUSxFQUFFQyxLQUFLLFFBQU8sNEJBQTRCO0FBQzFE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
277
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9tZXNzYWdlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2UgaXMgc3ViamVjdCB0byB0aGUgYWNjb21wYW55aW5nIGNvbW1lcmNpYWwgTElDRU5TRS5cbiAqL1xuLyogZXNsaW50IG5vLXVuZGVyc2NvcmUtZGFuZ2xlOiBbXCJlcnJvclwiLCB7XCJhbGxvd1wiOiBbXCJfaWRcIiwgXCJfa2V5XCJdfV0gLS0gQXJhbmdvREIgZG9jdW1lbnQgaWRlbnRpdHkgZmllbGRzLiAqL1xuaW1wb3J0IHtjbG9uZURlZXB9IGZyb20gJ0BubGFicy91dGlscy9vYmplY3RzL2Nsb25lJztcbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VJZCwgcGFyc2VTdHJpbmd9IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL3N0cmluZ3MnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnksIGxpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5cbmltcG9ydCB7cGFyc2VNZXNzYWdlfSBmcm9tICcuLi9hZGFwdGVycy9tZXNzYWdlQWRhcHRlci5qcyc7XG5pbXBvcnQge2dldENvbm5lY3Rpb25CeUNvbnZlcnNhdGlvbn0gZnJvbSAnLi4vbGFtYmRhcy9hY3Rpb25zL3dlYnNvY2tldHMuanMnO1xuaW1wb3J0IHt3c0NsaWVudH0gZnJvbSAnLi4vbGFtYmRhcy91dGlscy93ZWJzb2NrZXQuanMnO1xuaW1wb3J0IHtsb2dFcnJvcn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMuanMnO1xuaW1wb3J0IHtnZXRMaW1pdCwgdXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMuanMnO1xuaW1wb3J0IHtlbnN1cmVDb252ZXJzYXRpb25NZXNzYWdpbmdBbGxvd2VkLCBnZXRDb252ZXJzYXRpb25CeUlkfSBmcm9tICcuL2NvbnZlcnNhdGlvbnMuanMnO1xuaW1wb3J0IHthZGRJdGVtLCBnZXRMaXN0Qnl9IGZyb20gJy4vY3J1ZC5qcyc7XG5pbXBvcnQge2dldFBlcnNvbmFCeUlkfSBmcm9tICcuL3BlcnNvbmFzLmpzJztcbmltcG9ydCB7Z2V0VXNlckRpc3BsYXlOYW1lfSBmcm9tICcuL3VzZXJzLmpzJztcblxuaW1wb3J0IHR5cGUge0FyYW5nb0RiTGltaXR9IGZyb20gJy4uL3R5cGVzL2FyYW5nb2RiLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtDb252ZXJzYXRpb25UeXBlfSBmcm9tICcuLi90eXBlcy9jb252ZXJzYXRpb25zLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtNZXNzYWdlSW5wdXRUeXBlLCBNZXNzYWdlVHlwZX0gZnJvbSAnLi4vdHlwZXMvbWVzc2FnZXMudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1VzZXJUeXBlfSBmcm9tICcuLi90eXBlcy91c2Vycy50eXBlcy5qcyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnkgPSAnbWVzc2FnZXMnO1xuXG5jb25zdCBlbnJpY2hNZXNzYWdlVXNlciA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgbWVzc2FnZTogTWVzc2FnZVR5cGUsXG4gIGJhc2VVc2VyPzogVXNlclR5cGUgfCBudWxsXG4pOiBQcm9taXNlPFVzZXJUeXBlIHwgbnVsbD4gPT4ge1xuICBjb25zdCBzZXNzaW9uVXNlcklkID0gcGFyc2VJZChTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSk7XG4gIGNvbnN0IHNlc3Npb25QZXJzb25hSWQgPSBwYXJzZUlkKFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy5wZXJzb25hSWQgfHwgJycpKTtcbiAgY29uc3QgbWVzc2FnZVVzZXJJZCA9IHBhcnNlSWQoU3RyaW5nKG1lc3NhZ2U/LnVzZXJJZCB8fCBiYXNlVXNlcj8udXNlcklkIHx8IGJhc2VVc2VyPy5fa2V5IHx8ICcnKSk7XG5cbiAgaWYoIW1lc3NhZ2VVc2VySWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHVzZXIgPSBiYXNlVXNlciB8fCBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsYFxuICAgIEZPUiB1IElOIHVzZXJzXG4gICAgICBGSUxURVIgdS5fa2V5ID09ICR7bWVzc2FnZVVzZXJJZH1cbiAgICAgIExJTUlUIDFcbiAgICAgIFJFVFVSTiB1XG4gIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgVXNlclR5cGUgfCBudWxsO1xuICBjb25zdCByZXNvbHZlZFBlcnNvbmFJZCA9IHBhcnNlSWQoXG4gICAgU3RyaW5nKFxuICAgICAgbWVzc2FnZT8ucGVyc29uYUlkXG4gICAgICB8fCAobWVzc2FnZVVzZXJJZCA9PT0gc2Vzc2lvblVzZXJJZCA/IHNlc3Npb25QZXJzb25hSWQgOiAnJylcbiAgICAgIHx8IHVzZXI/LnBlcnNvbmFJZFxuICAgICAgfHwgJydcbiAgICApXG4gICk7XG4gIGNvbnN0IHBlcnNvbmEgPSByZXNvbHZlZFBlcnNvbmFJZFxuICAgID8gYXdhaXQgZ2V0UGVyc29uYUJ5SWQoY29udGV4dCwgcmVzb2x2ZWRQZXJzb25hSWQpLmNhdGNoKCgpID0+IG51bGwpXG4gICAgOiBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgLi4udXNlcixcbiAgICBpbWFnZVVybDogU3RyaW5nKHVzZXI/LmltYWdlVXJsIHx8IHBlcnNvbmE/LmltYWdlVXJsIHx8ICcnKSxcbiAgICBuYW1lOiBTdHJpbmcocGVyc29uYT8ubmFtZSB8fCB1c2VyPy5uYW1lIHx8IGdldFVzZXJEaXNwbGF5TmFtZSh1c2VyIHx8IHt9KSksXG4gICAgcGVyc29uYUlkOiBTdHJpbmcocmVzb2x2ZWRQZXJzb25hSWQgfHwgdXNlcj8ucGVyc29uYUlkIHx8ICcnKSxcbiAgICB0aHVtYlVybDogU3RyaW5nKHVzZXI/LnRodW1iVXJsIHx8IHVzZXI/LnRodW1iSWQgfHwgcGVyc29uYT8udGh1bWJVcmwgfHwgJycpLFxuICAgIHVzZXJJZDogbWVzc2FnZVVzZXJJZCxcbiAgICB1c2VybmFtZTogU3RyaW5nKHVzZXI/LnVzZXJuYW1lIHx8ICcnKVxuICB9O1xufTtcblxuY29uc3Qgd2l0aE1lc3NhZ2VVc2VyID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBtZXNzYWdlOiBNZXNzYWdlVHlwZSxcbiAgYmFzZVVzZXI/OiBVc2VyVHlwZSB8IG51bGxcbik6IFByb21pc2U8TWVzc2FnZVR5cGU+ID0+ICh7XG4gIC4uLm1lc3NhZ2UsXG4gIHVzZXI6IGF3YWl0IGVucmljaE1lc3NhZ2VVc2VyKGNvbnRleHQsIG1lc3NhZ2UsIGJhc2VVc2VyKVxufSk7XG5cbmNvbnN0IHVwZGF0ZUNvbnZlcnNhdGlvblN1bW1hcnkgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIG1lc3NhZ2U6IE1lc3NhZ2VUeXBlXG4pOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGUgfCBudWxsPiA9PiB7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbklkID0gcGFyc2VJZChTdHJpbmcobWVzc2FnZT8uY29udmVyc2F0aW9uSWQgfHwgJycpKTtcblxuICBpZighY29udmVyc2F0aW9uSWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBwYXJzZVN0cmluZyhTdHJpbmcobWVzc2FnZT8uY29udGVudCB8fCAnJyksIDY0MCk7XG4gIGNvbnN0IG1vZGlmaWVkID0gTnVtYmVyKG1lc3NhZ2U/Lm1vZGlmaWVkIHx8IG1lc3NhZ2U/LmFkZGVkIHx8IERhdGUubm93KCkpO1xuICBjb25zdCBzdW1tYXJ5ID0ge1xuICAgIGNvbnRlbnQsXG4gICAgbW9kaWZpZWRcbiAgfTtcblxuICBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsYFxuICAgIFVQREFURSAke2NvbnZlcnNhdGlvbklkfVxuICAgIFdJVEggJHtzdW1tYXJ5fVxuICAgIElOIGNvbnZlcnNhdGlvbnNcbiAgYCk7XG5cbiAgY29uc3QgY29udmVyc2F0aW9uID0gYXdhaXQgZ2V0Q29udmVyc2F0aW9uQnlJZChjb250ZXh0LCBjb252ZXJzYXRpb25JZCk7XG5cbiAgaWYoIWNvbnZlcnNhdGlvbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5jb252ZXJzYXRpb24sXG4gICAgY29udGVudCxcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBtb2RpZmllZFxuICB9O1xufTtcblxuY29uc3QgZW1pdFJlYWx0aW1lTWVzc2FnZSA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCBtZXNzYWdlOiBNZXNzYWdlVHlwZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBpZighbWVzc2FnZT8uY29udmVyc2F0aW9uSWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjb252ZXJzYXRpb24gPSBhd2FpdCB1cGRhdGVDb252ZXJzYXRpb25TdW1tYXJ5KGNvbnRleHQsIG1lc3NhZ2UpO1xuXG4gIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgYWN0aW9uOiAnbWVzc2FnZS5jcmVhdGVkJyxcbiAgICBkYXRhOiB7XG4gICAgICAuLi4oY29udmVyc2F0aW9uID8ge2NvbnZlcnNhdGlvbn0gOiB7fSksXG4gICAgICBtZXNzYWdlOiB7XG4gICAgICAgIC4uLihhd2FpdCB3aXRoTWVzc2FnZVVzZXIoY29udGV4dCwgbWVzc2FnZSkpXG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBjb25uZWN0aW9uR3JvdXBzID0gYXdhaXQgZ2V0Q29ubmVjdGlvbkJ5Q29udmVyc2F0aW9uKGNvbnRleHQsIG1lc3NhZ2UuY29udmVyc2F0aW9uSWQpO1xuICBjb25zdCBjb25uZWN0aW9uSWRzID0gY29ubmVjdGlvbkdyb3Vwc1xuICAgIC5mbGF0TWFwKChncm91cCkgPT4gKEFycmF5LmlzQXJyYXkoZ3JvdXApID8gZ3JvdXAgOiBbXSkpXG4gICAgLm1hcCgoY29ubmVjdGlvbklkKSA9PiBwYXJzZVN0cmluZyhjb25uZWN0aW9uSWQsIDMyKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLmZpbHRlcigoY29ubmVjdGlvbklkLCBpbmRleCwgbGlzdCkgPT4gbGlzdC5pbmRleE9mKGNvbm5lY3Rpb25JZCkgPT09IGluZGV4KTtcblxuICBpZihjb25uZWN0aW9uSWRzLmxlbmd0aCkge1xuICAgIGF3YWl0IHdzQ2xpZW50LnNlbmQoY29ubmVjdGlvbklkcywgcGF5bG9hZCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNZXNzYWdlcyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBjb252ZXJzYXRpb25JZDogc3RyaW5nLCB7ZnJvbSwgdG99KTogUHJvbWlzZTxNZXNzYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0Q29udmVyc2F0aW9uSWQgPSBwYXJzZUlkKGNvbnZlcnNhdGlvbklkKTtcbiAgY29uc3Qgc2Vzc2lvbkRvY0lkID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbkRvY0lkID0gYGNvbnZlcnNhdGlvbnMvJHtmb3JtYXRDb252ZXJzYXRpb25JZH1gO1xuICBjb25zdCBjb252ZXJzYXRpb25RcnkgPSBhcWxgRk9SIGUgSU4gaGFzQ29udmVyc2F0aW9uXG4gICAgRklMVEVSIGUuX2Zyb20gPT0gJHtzZXNzaW9uRG9jSWR9ICYmIGUuX3RvID09ICR7Y29udmVyc2F0aW9uRG9jSWR9XG4gICAgICBBTkQgRE9DVU1FTlQoJHtjb252ZXJzYXRpb25Eb2NJZH0pLmNoYXRTY2hlbWFWZXJzaW9uICE9IDFcbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIGVgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGNvbnZlcnNhdGlvblFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKGNvbnZlcnNhdGlvbnMpID0+IHtcbiAgICAgIGlmKCFjb252ZXJzYXRpb25zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpbWl0OiBBcmFuZ29EYkxpbWl0ID0gZ2V0TGltaXQoZnJvbSwgdG8pO1xuICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICAgICAgRk9SIG0gSU4gbWVzc2FnZXNcbiAgICAgICAgICBGSUxURVIgbS5jb252ZXJzYXRpb25JZCA9PSAke2Zvcm1hdENvbnZlcnNhdGlvbklkfSBBTkQgbS5jaGF0U2NoZW1hVmVyc2lvbiAhPSAxXG4gICAgICAgICAgU09SVCBtLmFkZGVkIERFU0NcbiAgICAgICAgICAke2xpdGVyYWwobGltaXQuYXFsKX1cbiAgICAgICAgICBTT1JUIG0uYWRkZWQgQVNDXG4gICAgICAgICAgTEVUIHVzZXIgPSBGSVJTVChcbiAgICAgICAgICAgIEZPUiB1IElOIHVzZXJzXG4gICAgICAgICAgICAgIEZJTFRFUiB1Ll9rZXkgPT0gbS51c2VySWRcbiAgICAgICAgICAgICAgTElNSVQgMVxuICAgICAgICAgICAgICBSRVRVUk4gdVxuICAgICAgICAgIClcbiAgICAgICAgICBSRVRVUk4gTUVSR0UobSwge3VzZXJ9KVxuICAgICAgYDtcblxuICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgICAgIC50aGVuKChtZXNzYWdlcykgPT4gUHJvbWlzZS5hbGwobWVzc2FnZXMubWFwKChtZXNzYWdlOiBNZXNzYWdlVHlwZSkgPT5cbiAgICAgICAgICB3aXRoTWVzc2FnZVVzZXIoY29udGV4dCwgbWVzc2FnZSwgbWVzc2FnZT8udXNlciBhcyBVc2VyVHlwZSB8IG51bGwpKSkpXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZU1lc3NhZ2UgPSAoY29udGV4dDogQXBpQ29udGV4dCwgbWVzc2FnZTogTWVzc2FnZUlucHV0VHlwZSk6IFByb21pc2U8TWVzc2FnZVR5cGU+ID0+IHtcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3BlcnNvbmFJZCwgdXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBmaWxlcyxcbiAgICBpbWFnZXMsXG4gICAgbWVzc2FnZUlkID0gY3JlYXRlSGFzaChgbWVzc2FnZS0ke3BlcnNvbmFJZH0tJHtEYXRlLm5vdygpfWApXG4gIH0gPSBtZXNzYWdlO1xuICBjb25zdCBmb3JtYXRDb252ZXJzYXRpb25JZCA9IHBhcnNlSWQoY29udmVyc2F0aW9uSWQpO1xuXG4gIGlmKGZvcm1hdENvbnZlcnNhdGlvbklkID09PSAnJykge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfY29udmVyc2F0aW9uSWQnKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdE1zZ0lkID0gcGFyc2VJZChtZXNzYWdlSWQpO1xuICBjb25zdCB1cGRhdGU6IE1lc3NhZ2VUeXBlID0ge1xuICAgIGNvbnRlbnQ6IHBhcnNlU3RyaW5nKG1lc3NhZ2UuY29udGVudCwgNjQwKSxcbiAgICBmaWxlczogZmlsZXMgfHwgW10sXG4gICAgaW1hZ2VzOiBpbWFnZXMgfHwgW11cbiAgfTtcblxuICBjb25zdCBpbnNlcnQ6IE1lc3NhZ2VUeXBlID0ge1xuICAgIC4uLmNsb25lRGVlcCh1cGRhdGUpLFxuICAgIF9rZXk6IGZvcm1hdE1zZ0lkLFxuICAgIGNvbnZlcnNhdGlvbklkOiBmb3JtYXRDb252ZXJzYXRpb25JZCxcbiAgICBwZXJzb25hSWQsXG4gICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgfTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgY3VycmVudCA9IERPQ1VNRU5UKCdtZXNzYWdlcycsICR7Zm9ybWF0TXNnSWR9KVxuICAgIEZJTFRFUiBjdXJyZW50LmNoYXRTY2hlbWFWZXJzaW9uICE9IDFcbiAgICBVUFNFUlQge19rZXk6ICR7Zm9ybWF0TXNnSWR9LCBjb252ZXJzYXRpb25JZDogJHtmb3JtYXRDb252ZXJzYXRpb25JZH0sIHBlcnNvbmFJZDogJHtwZXJzb25hSWR9fVxuICAgIElOU0VSVCAke2luc2VydH1cbiAgICBVUERBVEUgJHt1cGRhdGV9IElOIG1lc3NhZ2VzXG4gICAgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIGVuc3VyZUNvbnZlcnNhdGlvbk1lc3NhZ2luZ0FsbG93ZWQoY29udGV4dCwgZm9ybWF0Q29udmVyc2F0aW9uSWQpXG4gICAgLnRoZW4oKCkgPT4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpKVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oYXN5bmMgKHNhdmVkTWVzc2FnZTogTWVzc2FnZVR5cGUpID0+IHtcbiAgICAgIGNvbnN0IGVucmljaGVkTWVzc2FnZSA9IGF3YWl0IHdpdGhNZXNzYWdlVXNlcihjb250ZXh0LCBzYXZlZE1lc3NhZ2UpO1xuICAgICAgYXdhaXQgZW1pdFJlYWx0aW1lTWVzc2FnZShjb250ZXh0LCBlbnJpY2hlZE1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIGVucmljaGVkTWVzc2FnZTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRNZXNzYWdlID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIG1lc3NhZ2U6IE1lc3NhZ2VJbnB1dFR5cGUpOiBQcm9taXNlPE1lc3NhZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IG5ld01lc3NhZ2U6IE1lc3NhZ2VUeXBlID0gcGFyc2VNZXNzYWdlKG1lc3NhZ2UpO1xuICBjb25zdCBjb252ZXJzYXRpb25JZCA9IHBhcnNlSWQoU3RyaW5nKG5ld01lc3NhZ2U/LmNvbnZlcnNhdGlvbklkIHx8ICcnKSk7XG5cbiAgcmV0dXJuIGVuc3VyZUNvbnZlcnNhdGlvbk1lc3NhZ2luZ0FsbG93ZWQoY29udGV4dCwgY29udmVyc2F0aW9uSWQpXG4gICAgLnRoZW4oKCkgPT4gYWRkSXRlbTxNZXNzYWdlVHlwZT4oY29udGV4dCwgJ21lc3NhZ2VzJywgbmV3TWVzc2FnZSkpXG4gICAgLnRoZW4oYXN5bmMgKHNhdmVkTWVzc2FnZTogTWVzc2FnZVR5cGUpID0+IHtcbiAgICAgIGNvbnN0IGVucmljaGVkTWVzc2FnZSA9IGF3YWl0IHdpdGhNZXNzYWdlVXNlcihjb250ZXh0LCBzYXZlZE1lc3NhZ2UpO1xuICAgICAgYXdhaXQgZW1pdFJlYWx0aW1lTWVzc2FnZShjb250ZXh0LCBlbnJpY2hlZE1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIGVucmljaGVkTWVzc2FnZTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb246ICdhZGRNZXNzYWdlJyxcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdhZGRNZXNzYWdlJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2F2ZU1lc3NhZ2UgPSAoY29udGV4dDogQXBpQ29udGV4dCwgbWVzc2FnZUlkOiBzdHJpbmcsIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1lc3NhZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SWQgPSBwYXJzZUlkKG1lc3NhZ2VJZCk7XG5cbiAgcmV0dXJuIGdldENvbnZlcnNhdGlvbkJ5SWQoY29udGV4dCwgY29udmVyc2F0aW9uSWQpXG4gICAgLnRoZW4oKGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uVHlwZSkgPT4ge1xuICAgICAgY29uc3Qge19rZXk6IGNvbnZlcnNhdGlvbktleX0gPSBjb252ZXJzYXRpb247XG4gICAgICBpZighY29udmVyc2F0aW9uS2V5KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgYXFsUXJ5ID0gYXFsYEZPUiBtIElOIG1lc3NhZ2VzXG4gICAgICAgIEZJTFRFUiBtLl9rZXkgPT0gJHtmb3JtYXRJZH0gJiYgbS50byA9PSAke2NvbnZlcnNhdGlvbktleX0gJiYgbS5jaGF0U2NoZW1hVmVyc2lvbiAhPSAxXG4gICAgICAgIFVQREFURSBtIFdJVEgge3NhdmVkOiBBUFBFTkQobS5zYXZlZCwgJHtzZXNzaW9uSWR9LCB0cnVlKX0gSU4gbWVzc2FnZXNcbiAgICAgICAgUkVUVVJOIE5FV2A7XG5cbiAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgLnRoZW4oKG1lc3NhZ2U6IE1lc3NhZ2VUeXBlKSA9PiB7XG4gICAgICAgICAgaWYobWVzc2FnZSkge1xuICAgICAgICAgICAgLy8gQnJvYWRjYXN0IHRvIG1lc3NhZ2UgYm94XG4gICAgICAgICAgICAvLyBjb25zdCBtZXNzYWdlOiBNZXNzYWdlVHlwZSA9IE1lc3NhZ2VzLmdldE1lc3NhZ2VPYmplY3QobWVzc2FnZSk7XG4gICAgICAgICAgICAvLyBpby50byhtZXNzYWdlLnRvSWQpLmVtaXQoJ21lc3NhZ2Vfc2F2ZScsIG1lc3NhZ2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB1bnNhdmVNZXNzYWdlID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIG1lc3NhZ2VJZDogc3RyaW5nLCBjb252ZXJzYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxNZXNzYWdlVHlwZT4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdElkID0gcGFyc2VJZChtZXNzYWdlSWQpO1xuXG4gIHJldHVybiBnZXRDb252ZXJzYXRpb25CeUlkKGNvbnRleHQsIGNvbnZlcnNhdGlvbklkKVxuICAgIC50aGVuKChjb252ZXJzYXRpb246IENvbnZlcnNhdGlvblR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHtfa2V5OiBjb252ZXJzYXRpb25LZXl9ID0gY29udmVyc2F0aW9uO1xuICAgICAgaWYoIWNvbnZlcnNhdGlvbktleSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIG0gSU4gbWVzc2FnZXNcbiAgICAgICAgICBGSUxURVIgbS5fa2V5ID09ICR7Zm9ybWF0SWR9ICYmIG0udG8gPT0gJHtjb252ZXJzYXRpb25LZXl9ICYmIG0uY2hhdFNjaGVtYVZlcnNpb24gIT0gMVxuICAgICAgICAgIFVQREFURSBtIFdJVEgge3NhdmVkOiBSRU1PVkVfVkFMVUUobS5zYXZlZCwgJHtzZXNzaW9uSWR9KX0gSU4gbWVzc2FnZXNcbiAgICAgICAgICBSRVRVUk4gTkVXYDtcblxuICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAudGhlbigobWVzc2FnZTogTWVzc2FnZVR5cGUpID0+IHtcbiAgICAgICAgICBpZihtZXNzYWdlKSB7XG4gICAgICAgICAgICAvLyBCcm9hZGNhc3QgdG8gbWVzc2FnZSBib3hcbiAgICAgICAgICAgIC8vIGNvbnN0IG1lc3NhZ2U6IE1lc3NhZ2VUeXBlID0gTWVzc2FnZXMuZ2V0TWVzc2FnZU9iamVjdChtZXNzYWdlKTtcbiAgICAgICAgICAgIC8vIGlvLnRvKG1lc3NhZ2UuaWQpLmVtaXQoJ21lc3NhZ2VfdW5zYXZlJywgbWVzc2FnZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZU1lc3NhZ2UgPSAoY29udGV4dDogQXBpQ29udGV4dCwgbWVzc2FnZUlkOiBzdHJpbmcsIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1lc3NhZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SWQgPSBwYXJzZUlkKG1lc3NhZ2VJZCk7XG5cbiAgcmV0dXJuIGdldENvbnZlcnNhdGlvbkJ5SWQoY29udGV4dCwgY29udmVyc2F0aW9uSWQpXG4gICAgLnRoZW4oKGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uVHlwZSkgPT4ge1xuICAgICAgY29uc3Qge19rZXk6IGNvbnZlcnNhdGlvbktleX0gPSBjb252ZXJzYXRpb247XG4gICAgICBpZighY29udmVyc2F0aW9uS2V5KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgYXFsUXJ5ID0gYXFsYEZPUiBtIElOIG1lc3NhZ2VzXG4gICAgICAgIEZJTFRFUiBtLl9rZXkgPT0gJHtmb3JtYXRJZH0gJiYgbS50byA9PSAke2NvbnZlcnNhdGlvbktleX0gJiYgbS5mcm9tID09ICR7c2Vzc2lvbklkfSAmJiBtLmNoYXRTY2hlbWFWZXJzaW9uICE9IDFcbiAgICAgICAgUkVNT1ZFIG0gSU4gbWVzc2FnZXNcbiAgICAgICAgUkVUVVJOIE9MRGA7XG5cbiAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgLnRoZW4oKG1lc3NhZ2U6IE1lc3NhZ2VUeXBlKSA9PiB7XG4gICAgICAgICAgaWYobWVzc2FnZSkge1xuICAgICAgICAgICAgLy8gQnJvYWRjYXN0IHRvIG1lc3NhZ2UgYm94XG4gICAgICAgICAgICAvLyBjb25zdCBtZXNzYWdlOiBNZXNzYWdlVHlwZSA9IE1lc3NhZ2VzLmdldE1lc3NhZ2VPYmplY3QobWVzc2FnZSk7XG4gICAgICAgICAgICAvLyBpby50byhtZXNzYWdlLnRvSWQpLmVtaXQoJ21lc3NhZ2VfZGVsZXRlJywgbWVzc2FnZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1lc3NhZ2UgPSAoY29udGV4dDogQXBpQ29udGV4dCwgbWVzc2FnZUlkOiBzdHJpbmcpOiBQcm9taXNlPE1lc3NhZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IGZvcm1hdElkID0gcGFyc2VJZChtZXNzYWdlSWQpO1xuXG4gIHJldHVybiBnZXRMaXN0Qnk8TWVzc2FnZVR5cGU+KFxuICAgIGNvbnRleHQsXG4gICAgJ21lc3NhZ2VzJyxcbiAgICB7X2tleTogZm9ybWF0SWR9LFxuICAgIHtjdXN0b21RdWVyaWVzOiBbJ0ZJTFRFUiBkb2MuY2hhdFNjaGVtYVZlcnNpb24gIT0gMSddLCBsaW1pdDoge2Zyb206IDAsIHRvOiAxfX1cbiAgKVxuICAgIC50aGVuKChtZXNzYWdlcykgPT4gbWVzc2FnZXNbMF0gfHwgbnVsbClcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY2xlYW5NZXNzYWdlcyA9IChkYXRhYmFzZU5hbWU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIC8vIFJlbW92ZSBhbGwgbWVzc2FnZXMgdGhhdCBhcmUgb3ZlciA2MCBkYXlzIGFuZCBub3Qgc2F2ZWRcbiAgY29uc3QgYXFsUXJ5ID0gYXFsYEZPUiBtIElOIG1lc3NhZ2VzXG4gICAgICBGSUxURVIgbS5hZGRlZCA8IERBVEVfVElNRVNUQU1QKERBVEVfU1VCVFJBQ1QoREFURV9OT1coKSwgNjAsICdkYXknKSkgJiYgTEVOR1RIKG0uc2F2ZWQpID4gMFxuICAgICAgICBBTkQgbS5jaGF0U2NoZW1hVmVyc2lvbiAhPSAxXG4gICAgICBSRU1PVkUgbSBJTiBtZXNzYWdlc1xuICAgICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigobGlzdDogTWVzc2FnZVR5cGVbXSkgPT4gbGlzdC5sZW5ndGgpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcbiJdLCJuYW1lcyI6WyJjbG9uZURlZXAiLCJjcmVhdGVIYXNoIiwicGFyc2VJZCIsInBhcnNlU3RyaW5nIiwiYXFsIiwibGl0ZXJhbCIsInBhcnNlTWVzc2FnZSIsImdldENvbm5lY3Rpb25CeUNvbnZlcnNhdGlvbiIsIndzQ2xpZW50IiwibG9nRXJyb3IiLCJnZXRMaW1pdCIsInVzZURiIiwiZW5zdXJlQ29udmVyc2F0aW9uTWVzc2FnaW5nQWxsb3dlZCIsImdldENvbnZlcnNhdGlvbkJ5SWQiLCJhZGRJdGVtIiwiZ2V0TGlzdEJ5IiwiZ2V0UGVyc29uYUJ5SWQiLCJnZXRVc2VyRGlzcGxheU5hbWUiLCJldmVudENhdGVnb3J5IiwiZW5yaWNoTWVzc2FnZVVzZXIiLCJjb250ZXh0IiwibWVzc2FnZSIsImJhc2VVc2VyIiwic2Vzc2lvblVzZXJJZCIsIlN0cmluZyIsInNlc3Npb24iLCJ1c2VySWQiLCJzZXNzaW9uUGVyc29uYUlkIiwicGVyc29uYUlkIiwibWVzc2FnZVVzZXJJZCIsIl9rZXkiLCJ1c2VyIiwiZGF0YWJhc2VOYW1lIiwicXVlcnkiLCJ0aGVuIiwiY3Vyc29yIiwibmV4dCIsInJlc29sdmVkUGVyc29uYUlkIiwicGVyc29uYSIsImNhdGNoIiwiaW1hZ2VVcmwiLCJuYW1lIiwidGh1bWJVcmwiLCJ0aHVtYklkIiwidXNlcm5hbWUiLCJ3aXRoTWVzc2FnZVVzZXIiLCJ1cGRhdGVDb252ZXJzYXRpb25TdW1tYXJ5IiwiY29udmVyc2F0aW9uSWQiLCJjb250ZW50IiwibW9kaWZpZWQiLCJOdW1iZXIiLCJhZGRlZCIsIkRhdGUiLCJub3ciLCJzdW1tYXJ5IiwiY29udmVyc2F0aW9uIiwiZW1pdFJlYWx0aW1lTWVzc2FnZSIsInBheWxvYWQiLCJhY3Rpb24iLCJkYXRhIiwiY29ubmVjdGlvbkdyb3VwcyIsImNvbm5lY3Rpb25JZHMiLCJmbGF0TWFwIiwiZ3JvdXAiLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJjb25uZWN0aW9uSWQiLCJmaWx0ZXIiLCJCb29sZWFuIiwiaW5kZXgiLCJsaXN0IiwiaW5kZXhPZiIsImxlbmd0aCIsInNlbmQiLCJnZXRNZXNzYWdlcyIsImZyb20iLCJ0byIsInNlc3Npb25JZCIsImZvcm1hdENvbnZlcnNhdGlvbklkIiwic2Vzc2lvbkRvY0lkIiwiY29udmVyc2F0aW9uRG9jSWQiLCJjb252ZXJzYXRpb25RcnkiLCJhbGwiLCJjb252ZXJzYXRpb25zIiwibGltaXQiLCJhcWxRcnkiLCJtZXNzYWdlcyIsIlByb21pc2UiLCJlcnJvciIsInVwZGF0ZU1lc3NhZ2UiLCJmaWxlcyIsImltYWdlcyIsIm1lc3NhZ2VJZCIsIkVycm9yIiwiZm9ybWF0TXNnSWQiLCJ1cGRhdGUiLCJpbnNlcnQiLCJzYXZlZE1lc3NhZ2UiLCJlbnJpY2hlZE1lc3NhZ2UiLCJhZGRNZXNzYWdlIiwibmV3TWVzc2FnZSIsImNhdGVnb3J5IiwibGFiZWwiLCJzYXZlTWVzc2FnZSIsImZvcm1hdElkIiwiY29udmVyc2F0aW9uS2V5IiwidW5zYXZlTWVzc2FnZSIsImRlbGV0ZU1lc3NhZ2UiLCJnZXRNZXNzYWdlIiwiY3VzdG9tUXVlcmllcyIsImNsZWFuTWVzc2FnZXMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELDRHQUE0RyxHQUM1RyxTQUFRQSxTQUFTLFFBQU8sNkJBQTZCO0FBQ3JELFNBQVFDLFVBQVUsRUFBRUMsT0FBTyxFQUFFQyxXQUFXLFFBQU8sK0JBQStCO0FBQzlFLFNBQVFDLEdBQUcsUUFBTyxXQUFXO0FBQzdCLFNBQWtCQyxPQUFPLFFBQU8sZUFBZTtBQUUvQyxTQUFRQyxZQUFZLFFBQU8sZ0NBQWdDO0FBQzNELFNBQVFDLDJCQUEyQixRQUFPLG1DQUFtQztBQUM3RSxTQUFRQyxRQUFRLFFBQU8sZ0NBQWdDO0FBQ3ZELFNBQVFDLFFBQVEsUUFBTyw2QkFBNkI7QUFDcEQsU0FBUUMsUUFBUSxFQUFFQyxLQUFLLFFBQU8sNEJBQTRCO0FBQzFELFNBQVFDLGtDQUFrQyxFQUFFQyxtQkFBbUIsUUFBTyxxQkFBcUI7QUFDM0YsU0FBUUMsT0FBTyxFQUFFQyxTQUFTLFFBQU8sWUFBWTtBQUM3QyxTQUFRQyxjQUFjLFFBQU8sZ0JBQWdCO0FBQzdDLFNBQVFDLGtCQUFrQixRQUFPLGFBQWE7QUFROUMsTUFBTUMsZ0JBQWdCO0FBRXRCLE1BQU1DLG9CQUFvQixPQUN4QkMsU0FDQUMsU0FDQUM7SUFFQSxNQUFNQyxnQkFBZ0JyQixRQUFRc0Is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
@@ -0,0 +1,18 @@
1
+ import type { ApiContext } from '../types/auth.types.js';
2
+ export interface PhoneSupportInput {
3
+ readonly company?: string;
4
+ readonly contactId: string;
5
+ readonly email: string;
6
+ readonly firstName: string;
7
+ readonly lastName?: string;
8
+ readonly message: string;
9
+ readonly phone: string;
10
+ readonly product: string;
11
+ readonly source?: 'website-assistant';
12
+ }
13
+ export declare const submitPhoneSupportTicket: (context: ApiContext, input: PhoneSupportInput) => Promise<{
14
+ notificationStatus: string;
15
+ status: string;
16
+ supportTicketId: string;
17
+ ticketNumber: string;
18
+ }>;
@@ -0,0 +1,170 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { aql } from 'arangojs';
3
+ import { useDb } from '../utils/arangodbUtils.js';
4
+ import { sesSend } from './email.js';
5
+ const hash = (value)=>createHash('sha256').update(value).digest('hex');
6
+ const documents = [
7
+ 'users',
8
+ 'supportTickets',
9
+ 'supportTicketEvents',
10
+ 'supportTicketMessages'
11
+ ];
12
+ const edges = [
13
+ 'hasSupportTicket',
14
+ 'hasSupportTicketEvent',
15
+ 'hasSupportTicketMessage'
16
+ ];
17
+ // Atomic, deterministic IDs make a retried Connect request return the original ticket.
18
+ export const submitPhoneSupportTicket = async (context, input)=>{
19
+ const db = useDb(context.databaseName);
20
+ for (const name of [
21
+ ...documents,
22
+ ...edges
23
+ ]){
24
+ const target = db.collection(name);
25
+ if (!await target.exists()) {
26
+ try {
27
+ await target.create({
28
+ type: edges.includes(name) ? 3 : 2
29
+ });
30
+ } catch (error) {
31
+ if (!await target.exists()) throw error;
32
+ }
33
+ }
34
+ }
35
+ const email = input.email.toLowerCase();
36
+ const source = input.source || 'amazon-connect';
37
+ const channel = input.source ? 'website' : 'phone';
38
+ const key = hash(`nitrogenx:${channel}:${input.contactId}`);
39
+ const payloadHash = hash(JSON.stringify({
40
+ ...input,
41
+ email
42
+ }));
43
+ const timestamp = Date.now();
44
+ const ticketNumber = `NX-${key.slice(0, 12).toUpperCase()}`;
45
+ const tx = await db.beginTransaction({
46
+ exclusive: [
47
+ ...documents,
48
+ ...edges
49
+ ]
50
+ }, {
51
+ lockTimeout: 10
52
+ });
53
+ let ticket;
54
+ try {
55
+ const existing = await tx.step(()=>db.query(aql`RETURN DOCUMENT('supportTickets', ${key})`)).then((cursor)=>cursor.next());
56
+ if (existing) {
57
+ if (existing.payloadHash !== payloadHash) throw new Error('contact_payload_conflict');
58
+ ticket = existing;
59
+ } else {
60
+ const userKey = hash(email);
61
+ const user = await tx.step(()=>db.query(aql`
62
+ UPSERT {email: ${email}}
63
+ INSERT ${{
64
+ _key: userKey,
65
+ active: false,
66
+ added: timestamp,
67
+ company: input.company || '',
68
+ crmSource: `nitrogenx-${channel}`,
69
+ email,
70
+ firstName: input.firstName,
71
+ lastName: input.lastName || '',
72
+ marketingOptIn: false,
73
+ modified: timestamp,
74
+ phone: input.phone,
75
+ userId: userKey
76
+ }}
77
+ UPDATE {modified: ${timestamp}} IN users RETURN NEW
78
+ `)).then((cursor)=>cursor.next());
79
+ // Caller-provided details are kept on the ticket. An unauthenticated caller cannot overwrite an existing CRM profile.
80
+ ticket = {
81
+ _key: key,
82
+ added: timestamp,
83
+ appId: 'nitrogenx',
84
+ caller: input,
85
+ description: input.message,
86
+ modified: timestamp,
87
+ notificationStatus: 'pending',
88
+ payloadHash,
89
+ priority: 'normal',
90
+ productId: input.product,
91
+ source,
92
+ status: 'submitted',
93
+ subject: `${channel} message: ${input.product}`,
94
+ supportTicketId: key,
95
+ ticketNumber,
96
+ type: 'general_support',
97
+ userId: user._key
98
+ };
99
+ await tx.step(()=>db.query(aql`INSERT ${ticket} IN supportTickets`));
100
+ await tx.step(()=>db.query(aql`INSERT ${{
101
+ _from: `users/${user._key}`,
102
+ _key: key,
103
+ _to: `supportTickets/${key}`,
104
+ added: timestamp,
105
+ status: 'submitted'
106
+ }} IN hasSupportTicket`));
107
+ await tx.step(()=>db.query(aql`INSERT ${{
108
+ _key: key,
109
+ added: timestamp,
110
+ eventType: 'submitted',
111
+ metadata: {
112
+ details: input.message,
113
+ source
114
+ },
115
+ supportTicketId: key,
116
+ toValue: 'submitted'
117
+ }} IN supportTicketEvents`));
118
+ await tx.step(()=>db.query(aql`INSERT ${{
119
+ _from: `supportTickets/${key}`,
120
+ _key: key,
121
+ _to: `supportTicketEvents/${key}`,
122
+ added: timestamp
123
+ }} IN hasSupportTicketEvent`));
124
+ }
125
+ await tx.commit();
126
+ } catch (error) {
127
+ await tx.abort();
128
+ throw error;
129
+ }
130
+ // At-least-once email delivery; retries never duplicate the CRM contact or ticket.
131
+ if (ticket.notificationStatus !== 'sent') {
132
+ // An invalid legacy transcription must not prevent the internal support notification.
133
+ const replyable = email.length <= 254 && email.split('@')[0].length <= 64 && /^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,63}$/i.test(email);
134
+ const delivery = await sesSend({
135
+ Destination: {
136
+ ToAddresses: [
137
+ 'support@nitrogenx.co'
138
+ ]
139
+ },
140
+ Message: {
141
+ Body: {
142
+ Text: {
143
+ Data: `New Nitrogen ${channel} message\nTicket: ${ticketNumber}\nProduct: ${input.product}\nName: ${input.firstName} ${input.lastName || ''}\nEmail: ${email}${replyable ? '' : ' (needs correction; use callback number)'}\nPhone: ${input.phone}\nCompany: ${input.company || 'Not supplied'}\nSubmission: ${input.contactId}\n\n${input.message}`
144
+ }
145
+ },
146
+ Subject: {
147
+ Data: `[${ticketNumber}] Nitrogen ${channel} support — ${input.product}`
148
+ }
149
+ },
150
+ ...replyable ? {
151
+ ReplyToAddresses: [
152
+ email
153
+ ]
154
+ } : {},
155
+ Source: 'Nitrogen Support <support@nitrogenx.co>'
156
+ });
157
+ await db.query(aql`UPDATE ${key} WITH ${{
158
+ notificationMessageId: delivery.MessageId || null,
159
+ notificationStatus: 'sent'
160
+ }} IN supportTickets`);
161
+ }
162
+ return {
163
+ notificationStatus: 'sent',
164
+ status: 'submitted',
165
+ supportTicketId: key,
166
+ ticketNumber
167
+ };
168
+ };
169
+
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9waG9uZVN1cHBvcnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtjcmVhdGVIYXNofSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuXG5pbXBvcnQge3VzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzLmpzJztcbmltcG9ydCB7c2VzU2VuZH0gZnJvbSAnLi9lbWFpbC5qcyc7XG5cbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQaG9uZVN1cHBvcnRJbnB1dCB7XG4gIHJlYWRvbmx5IGNvbXBhbnk/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbnRhY3RJZDogc3RyaW5nO1xuICByZWFkb25seSBlbWFpbDogc3RyaW5nO1xuICByZWFkb25seSBmaXJzdE5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgbGFzdE5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbiAgcmVhZG9ubHkgcGhvbmU6IHN0cmluZztcbiAgcmVhZG9ubHkgcHJvZHVjdDogc3RyaW5nO1xuICByZWFkb25seSBzb3VyY2U/OiAnd2Vic2l0ZS1hc3Npc3RhbnQnO1xufVxuXG5jb25zdCBoYXNoID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHZhbHVlKS5kaWdlc3QoJ2hleCcpO1xuY29uc3QgZG9jdW1lbnRzID0gWyd1c2VycycsICdzdXBwb3J0VGlja2V0cycsICdzdXBwb3J0VGlja2V0RXZlbnRzJywgJ3N1cHBvcnRUaWNrZXRNZXNzYWdlcyddO1xuY29uc3QgZWRnZXMgPSBbJ2hhc1N1cHBvcnRUaWNrZXQnLCAnaGFzU3VwcG9ydFRpY2tldEV2ZW50JywgJ2hhc1N1cHBvcnRUaWNrZXRNZXNzYWdlJ107XG5cbi8vIEF0b21pYywgZGV0ZXJtaW5pc3RpYyBJRHMgbWFrZSBhIHJldHJpZWQgQ29ubmVjdCByZXF1ZXN0IHJldHVybiB0aGUgb3JpZ2luYWwgdGlja2V0LlxuZXhwb3J0IGNvbnN0IHN1Ym1pdFBob25lU3VwcG9ydFRpY2tldCA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCBpbnB1dDogUGhvbmVTdXBwb3J0SW5wdXQpID0+IHtcbiAgY29uc3QgZGIgPSB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSk7XG4gIGZvcihjb25zdCBuYW1lIG9mIFsuLi5kb2N1bWVudHMsIC4uLmVkZ2VzXSkge1xuICAgIGNvbnN0IHRhcmdldCA9IGRiLmNvbGxlY3Rpb24obmFtZSk7XG4gICAgaWYoIWF3YWl0IHRhcmdldC5leGlzdHMoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGFyZ2V0LmNyZWF0ZSh7dHlwZTogZWRnZXMuaW5jbHVkZXMobmFtZSkgPyAzIDogMn0pO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICBpZighYXdhaXQgdGFyZ2V0LmV4aXN0cygpKSB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgZW1haWwgPSBpbnB1dC5lbWFpbC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBzb3VyY2UgPSBpbnB1dC5zb3VyY2UgfHwgJ2FtYXpvbi1jb25uZWN0JztcbiAgY29uc3QgY2hhbm5lbCA9IGlucHV0LnNvdXJjZSA/ICd3ZWJzaXRlJyA6ICdwaG9uZSc7XG4gIGNvbnN0IGtleSA9IGhhc2goYG5pdHJvZ2VueDoke2NoYW5uZWx9OiR7aW5wdXQuY29udGFjdElkfWApO1xuICBjb25zdCBwYXlsb2FkSGFzaCA9IGhhc2goSlNPTi5zdHJpbmdpZnkoey4uLmlucHV0LCBlbWFpbH0pKTtcbiAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgdGlja2V0TnVtYmVyID0gYE5YLSR7a2V5LnNsaWNlKDAsIDEyKS50b1VwcGVyQ2FzZSgpfWA7XG4gIGNvbnN0IHR4ID0gYXdhaXQgZGIuYmVnaW5UcmFuc2FjdGlvbih7ZXhjbHVzaXZlOiBbLi4uZG9jdW1lbnRzLCAuLi5lZGdlc119LCB7bG9ja1RpbWVvdXQ6IDEwfSk7XG4gIGxldCB0aWNrZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB0cnkge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdHguc3RlcCgoKSA9PiBkYi5xdWVyeShhcWxgUkVUVVJOIERPQ1VNRU5UKCdzdXBwb3J0VGlja2V0cycsICR7a2V5fSlgKSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbiAgICBpZihleGlzdGluZykge1xuICAgICAgaWYoZXhpc3RpbmcucGF5bG9hZEhhc2ggIT09IHBheWxvYWRIYXNoKSB0aHJvdyBuZXcgRXJyb3IoJ2NvbnRhY3RfcGF5bG9hZF9jb25mbGljdCcpO1xuICAgICAgdGlja2V0ID0gZXhpc3Rpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHVzZXJLZXkgPSBoYXNoKGVtYWlsKTtcbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0eC5zdGVwKCgpID0+IGRiLnF1ZXJ5KGFxbGBcbiAgICAgICAgVVBTRVJUIHtlbWFpbDogJHtlbWFpbH19XG4gICAgICAgIElOU0VSVCAke3tfa2V5OiB1c2VyS2V5LCBhY3RpdmU6IGZhbHNlLCBhZGRlZDogdGltZXN0YW1wLCBjb21wYW55OiBpbnB1dC5jb21wYW55IHx8ICcnLCBjcm1Tb3VyY2U6IGBuaXRyb2dlbngtJHtjaGFubmVsfWAsIGVtYWlsLCBmaXJzdE5hbWU6IGlucHV0LmZpcnN0TmFtZSwgbGFzdE5hbWU6IGlucHV0Lmxhc3ROYW1lIHx8ICcnLCBtYXJrZXRpbmdPcHRJbjogZmFsc2UsIG1vZGlmaWVkOiB0aW1lc3RhbXAsIHBob25lOiBpbnB1dC5waG9uZSwgdXNlcklkOiB1c2VyS2V5fX1cbiAgICAgICAgVVBEQVRFIHttb2RpZmllZDogJHt0aW1lc3RhbXB9fSBJTiB1c2VycyBSRVRVUk4gTkVXXG4gICAgICBgKSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbiAgICAgIC8vIENhbGxlci1wcm92aWRlZCBkZXRhaWxzIGFyZSBrZXB0IG9uIHRoZSB0aWNrZXQuIEFuIHVuYXV0aGVudGljYXRlZCBjYWxsZXIgY2Fubm90IG92ZXJ3cml0ZSBhbiBleGlzdGluZyBDUk0gcHJvZmlsZS5cbiAgICAgIHRpY2tldCA9IHtfa2V5OiBrZXksIGFkZGVkOiB0aW1lc3RhbXAsIGFwcElkOiAnbml0cm9nZW54JywgY2FsbGVyOiBpbnB1dCwgZGVzY3JpcHRpb246IGlucHV0Lm1lc3NhZ2UsIG1vZGlmaWVkOiB0aW1lc3RhbXAsIG5vdGlmaWNhdGlvblN0YXR1czogJ3BlbmRpbmcnLCBwYXlsb2FkSGFzaCwgcHJpb3JpdHk6ICdub3JtYWwnLCBwcm9kdWN0SWQ6IGlucHV0LnByb2R1Y3QsIHNvdXJjZSwgc3RhdHVzOiAnc3VibWl0dGVkJywgc3ViamVjdDogYCR7Y2hhbm5lbH0gbWVzc2FnZTogJHtpbnB1dC5wcm9kdWN0fWAsIHN1cHBvcnRUaWNrZXRJZDoga2V5LCB0aWNrZXROdW1iZXIsIHR5cGU6ICdnZW5lcmFsX3N1cHBvcnQnLCB1c2VySWQ6IHVzZXIuX2tleX07XG4gICAgICBhd2FpdCB0eC5zdGVwKCgpID0+IGRiLnF1ZXJ5KGFxbGBJTlNFUlQgJHt0aWNrZXR9IElOIHN1cHBvcnRUaWNrZXRzYCkpO1xuICAgICAgYXdhaXQgdHguc3RlcCgoKSA9PiBkYi5xdWVyeShhcWxgSU5TRVJUICR7e19mcm9tOiBgdXNlcnMvJHt1c2VyLl9rZXl9YCwgX2tleToga2V5LCBfdG86IGBzdXBwb3J0VGlja2V0cy8ke2tleX1gLCBhZGRlZDogdGltZXN0YW1wLCBzdGF0dXM6ICdzdWJtaXR0ZWQnfX0gSU4gaGFzU3VwcG9ydFRpY2tldGApKTtcbiAgICAgIGF3YWl0IHR4LnN0ZXAoKCkgPT4gZGIucXVlcnkoYXFsYElOU0VSVCAke3tfa2V5OiBrZXksIGFkZGVkOiB0aW1lc3RhbXAsIGV2ZW50VHlwZTogJ3N1Ym1pdHRlZCcsIG1ldGFkYXRhOiB7ZGV0YWlsczogaW5wdXQubWVzc2FnZSwgc291cmNlfSwgc3VwcG9ydFRpY2tldElkOiBrZXksIHRvVmFsdWU6ICdzdWJtaXR0ZWQnfX0gSU4gc3VwcG9ydFRpY2tldEV2ZW50c2ApKTtcbiAgICAgIGF3YWl0IHR4LnN0ZXAoKCkgPT4gZGIucXVlcnkoYXFsYElOU0VSVCAke3tfZnJvbTogYHN1cHBvcnRUaWNrZXRzLyR7a2V5fWAsIF9rZXk6IGtleSwgX3RvOiBgc3VwcG9ydFRpY2tldEV2ZW50cy8ke2tleX1gLCBhZGRlZDogdGltZXN0YW1wfX0gSU4gaGFzU3VwcG9ydFRpY2tldEV2ZW50YCkpO1xuICAgIH1cbiAgICBhd2FpdCB0eC5jb21taXQoKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGF3YWl0IHR4LmFib3J0KCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgLy8gQXQtbGVhc3Qtb25jZSBlbWFpbCBkZWxpdmVyeTsgcmV0cmllcyBuZXZlciBkdXBsaWNhdGUgdGhlIENSTSBjb250YWN0IG9yIHRpY2tldC5cbiAgaWYodGlja2V0Lm5vdGlmaWNhdGlvblN0YXR1cyAhPT0gJ3NlbnQnKSB7XG4gICAgLy8gQW4gaW52YWxpZCBsZWdhY3kgdHJhbnNjcmlwdGlvbiBtdXN0IG5vdCBwcmV2ZW50IHRoZSBpbnRlcm5hbCBzdXBwb3J0IG5vdGlmaWNhdGlvbi5cbiAgICBjb25zdCByZXBseWFibGUgPSBlbWFpbC5sZW5ndGggPD0gMjU0ICYmIGVtYWlsLnNwbGl0KCdAJylbMF0ubGVuZ3RoIDw9IDY0ICYmIC9eW2EtejAtOSEjJCUmJyorXFwvPT9eX2B7fH1+LV0rKD86XFwuW2EtejAtOSEjJCUmJyorXFwvPT9eX2B7fH1+LV0rKSpAKD86W2EtejAtOV0oPzpbYS16MC05LV17MCw2MX1bYS16MC05XSk/XFwuKStbYS16XXsyLDYzfSQvaS50ZXN0KGVtYWlsKTtcbiAgICBjb25zdCBkZWxpdmVyeSA9IGF3YWl0IHNlc1NlbmQoe1xuICAgICAgRGVzdGluYXRpb246IHtUb0FkZHJlc3NlczogWydzdXBwb3J0QG5pdHJvZ2VueC5jbyddfSxcbiAgICAgIE1lc3NhZ2U6IHtcbiAgICAgICAgQm9keToge1RleHQ6IHtEYXRhOiBgTmV3IE5pdHJvZ2VuICR7Y2hhbm5lbH0gbWVzc2FnZVxcblRpY2tldDogJHt0aWNrZXROdW1iZXJ9XFxuUHJvZHVjdDogJHtpbnB1dC5wcm9kdWN0fVxcbk5hbWU6ICR7aW5wdXQuZmlyc3ROYW1lfSAke2lucHV0Lmxhc3ROYW1lIHx8ICcnfVxcbkVtYWlsOiAke2VtYWlsfSR7cmVwbHlhYmxlID8gJycgOiAnIChuZWVkcyBjb3JyZWN0aW9uOyB1c2UgY2FsbGJhY2sgbnVtYmVyKSd9XFxuUGhvbmU6ICR7aW5wdXQucGhvbmV9XFxuQ29tcGFueTogJHtpbnB1dC5jb21wYW55IHx8ICdOb3Qgc3VwcGxpZWQnfVxcblN1Ym1pc3Npb246ICR7aW5wdXQuY29udGFjdElkfVxcblxcbiR7aW5wdXQubWVzc2FnZX1gfX0sXG4gICAgICAgIFN1YmplY3Q6IHtEYXRhOiBgWyR7dGlja2V0TnVtYmVyfV0gTml0cm9nZW4gJHtjaGFubmVsfSBzdXBwb3J0IOKAlCAke2lucHV0LnByb2R1Y3R9YH1cbiAgICAgIH0sXG4gICAgICAuLi4ocmVwbHlhYmxlID8ge1JlcGx5VG9BZGRyZXNzZXM6IFtlbWFpbF19IDoge30pLFxuICAgICAgU291cmNlOiAnTml0cm9nZW4gU3VwcG9ydCA8c3VwcG9ydEBuaXRyb2dlbnguY28+J1xuICAgIH0pO1xuICAgIGF3YWl0IGRiLnF1ZXJ5KGFxbGBVUERBVEUgJHtrZXl9IFdJVEggJHt7bm90aWZpY2F0aW9uTWVzc2FnZUlkOiBkZWxpdmVyeS5NZXNzYWdlSWQgfHwgbnVsbCwgbm90aWZpY2F0aW9uU3RhdHVzOiAnc2VudCd9fSBJTiBzdXBwb3J0VGlja2V0c2ApO1xuICB9XG4gIHJldHVybiB7bm90aWZpY2F0aW9uU3RhdHVzOiAnc2VudCcsIHN0YXR1czogJ3N1Ym1pdHRlZCcsIHN1cHBvcnRUaWNrZXRJZDoga2V5LCB0aWNrZXROdW1iZXJ9O1xufTtcbiJdLCJuYW1lcyI6WyJjcmVhdGVIYXNoIiwiYXFsIiwidXNlRGIiLCJzZXNTZW5kIiwiaGFzaCIsInZhbHVlIiwidXBkYXRlIiwiZGlnZXN0IiwiZG9jdW1lbnRzIiwiZWRnZXMiLCJzdWJtaXRQaG9uZVN1cHBvcnRUaWNrZXQiLCJjb250ZXh0IiwiaW5wdXQiLCJkYiIsImRhdGFiYXNlTmFtZSIsIm5hbWUiLCJ0YXJnZXQiLCJjb2xsZWN0aW9uIiwiZXhpc3RzIiwiY3JlYXRlIiwidHlwZSIsImluY2x1ZGVzIiwiZXJyb3IiLCJlbWFpbCIsInRvTG93ZXJDYXNlIiwic291cmNlIiwiY2hhbm5lbCIsImtleSIsImNvbnRhY3RJZCIsInBheWxvYWRIYXNoIiwiSlNPTiIsInN0cmluZ2lmeSIsInRpbWVzdGFtcCIsIkRhdGUiLCJub3ciLCJ0aWNrZXROdW1iZXIiLCJzbGljZSIsInRvVXBwZXJDYXNlIiwidHgiLCJiZWdpblRyYW5zYWN0aW9uIiwiZXhjbHVzaXZlIiwibG9ja1RpbWVvdXQiLCJ0aWNrZXQiLCJleGlzdGluZyIsInN0ZXAiLCJxdWVyeSIsInRoZW4iLCJjdXJzb3IiLCJuZXh0IiwiRXJyb3IiLCJ1c2VyS2V5IiwidXNlciIsIl9rZXkiLCJhY3RpdmUiLCJhZGRlZCIsImNvbXBhbnkiLCJjcm1Tb3VyY2UiLCJmaXJzdE5hbWUiLCJsYXN0TmFtZSIsIm1hcmtldGluZ09wdEluIiwibW9kaWZpZWQiLCJwaG9uZSIsInVzZXJJZCIsImFwcElkIiwiY2FsbGVyIiwiZGVzY3JpcHRpb24iLCJtZXNzYWdlIiwibm90aWZpY2F0aW9uU3RhdHVzIiwicHJpb3JpdHkiLCJwcm9kdWN0SWQiLCJwcm9kdWN0Iiwic3RhdHVzIiwic3ViamVjdCIsInN1cHBvcnRUaWNrZXRJZCIsIl9mcm9tIiwiX3RvIiwiZXZlbnRUeXBlIiwibWV0YWRhdGEiLCJkZXRhaWxzIiwidG9WYWx1ZSIsImNvbW1pdCIsImFib3J0IiwicmVwbHlhYmxlIiwibGVuZ3RoIiwic3BsaXQiLCJ0ZXN0IiwiZGVsaXZlcnkiLCJEZXN0aW5hdGlvbiIsIlRvQWRkcmVzc2VzIiwiTWVzc2FnZSIsIkJvZHkiLCJUZXh0IiwiRGF0YSIsIlN1YmplY3QiLCJSZXBseVRvQWRkcmVzc2VzIiwiU291cmNlIiwibm90aWZpY2F0aW9uTWVzc2FnZUlkIiwiTWVzc2FnZUlkIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFRQSxVQUFVLFFBQU8sY0FBYztBQUN2QyxTQUFRQyxHQUFHLFFBQU8sV0FBVztBQUU3QixTQUFRQyxLQUFLLFFBQU8sNEJBQTRCO0FBQ2hELFNBQVFDLE9BQU8sUUFBTyxhQUFhO0FBZ0JuQyxNQUFNQyxPQUFPLENBQUNDLFFBQTBCTCxXQUFXLFVBQVVNLE1BQU0sQ0FBQ0QsT0FBT0UsTUFBTSxDQUFDO0FBQ2xGLE1BQU1DLFlBQVk7SUFBQztJQUFTO0lBQWtCO0lBQXVCO0NBQXdCO0FBQzdGLE1BQU1DLFFBQVE7SUFBQztJQUFvQjtJQUF5QjtDQUEwQjtBQUV0Rix1RkFBdUY7QUFDdkYsT0FBTyxNQUFNQywyQkFBMkIsT0FBT0MsU0FBcUJDO0lBQ2xFLE1BQU1DLEtBQUtYLE1BQU1TLFFBQVFHLFlBQVk7SUFDckMsS0FBSSxNQUFNQyxRQUFRO1dBQUlQO1dBQWNDO0tBQU0sQ0FBRTtRQUMxQyxNQUFNTyxTQUFTSCxHQUFHSSxVQUFVLENBQUNGO1FBQzdCLElBQUcsQ0FBQyxNQUFNQyxPQUFPRSxNQUFNLElBQUk7WUFDekIsSUFBSTtnQkFDRixNQUFNRixPQUFPRyxNQUFNLENBQUM7b0JBQUNDLE1BQU1YLE1BQU1ZLFFBQVEsQ0FBQ04sUUFBUSxJQUFJO2dCQUFDO1lBQ3pELEVBQUUsT0FBTU8sT0FBTztnQkFDYixJQUFHLENBQUMsTUFBTU4sT0FBT0UsTUFBTSxJQUFJLE1BQU1JO1lBQ25DO1FBQ0Y7SUFDRjtJQUNBLE1BQU1DLFFBQVFYLE1BQU1XLEtBQUssQ0FBQ0MsV0FBVztJQUNyQyxN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