@nlabs/reaktor 1.6.3 → 1.8.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 (278) hide show
  1. package/LICENSE +74 -201
  2. package/README.md +48 -16
  3. package/lib/actions/analytics.d.ts +10 -0
  4. package/lib/actions/analytics.js +539 -0
  5. package/lib/actions/apps.js +2 -2
  6. package/lib/actions/connections.js +1 -1
  7. package/lib/actions/content.js +2 -2
  8. package/lib/actions/conversations.js +2 -2
  9. package/lib/actions/crm.d.ts +11 -1
  10. package/lib/actions/crm.js +443 -13
  11. package/lib/actions/crud.js +2 -2
  12. package/lib/actions/dynamodb.d.ts +1 -1
  13. package/lib/actions/dynamodb.js +2 -2
  14. package/lib/actions/email.d.ts +1 -1
  15. package/lib/actions/email.js +2 -2
  16. package/lib/actions/files.js +2 -2
  17. package/lib/actions/flags.d.ts +6 -0
  18. package/lib/actions/flags.js +147 -0
  19. package/lib/actions/groups.js +2 -2
  20. package/lib/actions/images.d.ts +1 -1
  21. package/lib/actions/images.js +2 -2
  22. package/lib/actions/index.d.ts +3 -2
  23. package/lib/actions/index.js +4 -3
  24. package/lib/actions/ios.js +1 -1
  25. package/lib/actions/locations.js +2 -2
  26. package/lib/actions/messages.js +2 -2
  27. package/lib/actions/notifications.d.ts +1 -1
  28. package/lib/actions/notifications.js +2 -2
  29. package/lib/actions/payments.d.ts +3 -3
  30. package/lib/actions/payments.js +144 -189
  31. package/lib/actions/personas.js +1 -1
  32. package/lib/actions/posts.d.ts +0 -4
  33. package/lib/actions/posts.js +2 -4
  34. package/lib/actions/query.js +2 -2
  35. package/lib/actions/reactions.js +2 -2
  36. package/lib/actions/rum.js +148 -45
  37. package/lib/actions/s3.d.ts +1 -1
  38. package/lib/actions/s3.js +2 -2
  39. package/lib/actions/search.js +2 -2
  40. package/lib/actions/sms.js +2 -2
  41. package/lib/actions/statistics.js +2 -2
  42. package/lib/actions/subscriptions.js +2 -2
  43. package/lib/actions/tags.js +2 -2
  44. package/lib/actions/users.d.ts +4 -1
  45. package/lib/actions/users.js +85 -11
  46. package/lib/actions/videos.js +2 -2
  47. package/lib/adapters/arangoAdapter.js +1 -1
  48. package/lib/adapters/contentAdapter.js +2 -2
  49. package/lib/adapters/fileAdapter.js +1 -1
  50. package/lib/adapters/imageAdapter.js +1 -1
  51. package/lib/adapters/index.js +1 -1
  52. package/lib/adapters/messageAdapter.js +1 -1
  53. package/lib/adapters/postAdapter.js +1 -1
  54. package/lib/adapters/reaktorAdapter.js +1 -1
  55. package/lib/adapters/tagAdapter.d.ts +0 -1
  56. package/lib/adapters/tagAdapter.js +1 -2
  57. package/lib/adapters/userAdapter.d.ts +0 -1
  58. package/lib/adapters/userAdapter.js +1 -2
  59. package/lib/config.js +8 -2
  60. package/lib/constants/collections.d.ts +17 -1
  61. package/lib/constants/collections.js +18 -2
  62. package/lib/handlers/graphqlHandler.d.ts +2 -2
  63. package/lib/handlers/graphqlHandler.js +2 -19
  64. package/lib/index.d.ts +4 -2
  65. package/lib/index.js +4 -3
  66. package/lib/lambdas/actions/websockets.js +2 -2
  67. package/lib/lambdas/authorizer.js +2 -2
  68. package/lib/lambdas/connection.js +2 -2
  69. package/lib/lambdas/utils/message.js +2 -2
  70. package/lib/lambdas/utils/websocket.d.ts +1 -1
  71. package/lib/lambdas/utils/websocket.js +2 -2
  72. package/lib/mocks/conversation.js +1 -1
  73. package/lib/mocks/file.js +1 -1
  74. package/lib/mocks/group.js +1 -1
  75. package/lib/mocks/image.js +1 -1
  76. package/lib/mocks/post.js +1 -1
  77. package/lib/mocks/tag.js +1 -1
  78. package/lib/mocks/user.js +1 -1
  79. package/lib/mocks/video.js +1 -1
  80. package/lib/mutations/analytics/analytics.d.ts +1 -0
  81. package/lib/mutations/analytics/analytics.js +35 -0
  82. package/lib/mutations/content/content.js +2 -2
  83. package/lib/mutations/crm/crm.js +57 -11
  84. package/lib/mutations/events/events.js +2 -2
  85. package/lib/mutations/flags/flags.d.ts +1 -0
  86. package/lib/mutations/flags/flags.js +33 -0
  87. package/lib/mutations/groups/groups.js +2 -2
  88. package/lib/mutations/images/images.js +2 -2
  89. package/lib/mutations/index.d.ts +3 -1
  90. package/lib/mutations/index.js +13 -3
  91. package/lib/mutations/locations/locations.js +2 -2
  92. package/lib/mutations/messages/messages.js +2 -2
  93. package/lib/mutations/personas/personas.js +2 -2
  94. package/lib/mutations/posts/posts.js +2 -2
  95. package/lib/mutations/reactions/reactions.js +2 -2
  96. package/lib/mutations/rum/rum.js +2 -2
  97. package/lib/mutations/statistics/statistics.js +2 -2
  98. package/lib/mutations/subscriptions/subscriptions.js +2 -2
  99. package/lib/mutations/tags/tags.js +2 -2
  100. package/lib/mutations/users/users.js +30 -17
  101. package/lib/mutations/videos/videos.js +2 -2
  102. package/lib/objectTypes/analytics.d.ts +8 -0
  103. package/lib/objectTypes/analytics.js +147 -0
  104. package/lib/objectTypes/app.js +2 -2
  105. package/lib/objectTypes/bankAccount.js +2 -2
  106. package/lib/objectTypes/connection.js +2 -2
  107. package/lib/objectTypes/content.js +2 -2
  108. package/lib/objectTypes/conversation.js +2 -2
  109. package/lib/objectTypes/creditCard.js +2 -2
  110. package/lib/objectTypes/crm.d.ts +5 -0
  111. package/lib/objectTypes/crm.js +68 -2
  112. package/lib/objectTypes/document.js +1 -1
  113. package/lib/objectTypes/error.js +2 -2
  114. package/lib/objectTypes/event.js +2 -2
  115. package/lib/objectTypes/external.js +2 -2
  116. package/lib/objectTypes/file.js +2 -2
  117. package/lib/objectTypes/filter.js +2 -2
  118. package/lib/objectTypes/flag.d.ts +1 -0
  119. package/lib/objectTypes/flag.js +35 -0
  120. package/lib/objectTypes/group.js +2 -2
  121. package/lib/objectTypes/iapSubscription.js +2 -2
  122. package/lib/objectTypes/image.d.ts +1 -1
  123. package/lib/objectTypes/image.js +2 -2
  124. package/lib/objectTypes/index.d.ts +2 -0
  125. package/lib/objectTypes/index.js +3 -1
  126. package/lib/objectTypes/location.js +2 -2
  127. package/lib/objectTypes/message.js +2 -2
  128. package/lib/objectTypes/passcode.js +2 -2
  129. package/lib/objectTypes/persona.js +2 -2
  130. package/lib/objectTypes/plan.js +2 -2
  131. package/lib/objectTypes/post.js +2 -2
  132. package/lib/objectTypes/query.js +2 -2
  133. package/lib/objectTypes/reaction.js +2 -2
  134. package/lib/objectTypes/relation.js +2 -2
  135. package/lib/objectTypes/rum.js +4 -4
  136. package/lib/objectTypes/search.js +2 -2
  137. package/lib/objectTypes/statistics.js +2 -2
  138. package/lib/objectTypes/subscription.js +2 -2
  139. package/lib/objectTypes/tag.js +2 -2
  140. package/lib/objectTypes/user.js +10 -2
  141. package/lib/objectTypes/video.d.ts +1 -1
  142. package/lib/objectTypes/video.js +2 -2
  143. package/lib/queries/analytics/analytics.d.ts +1 -0
  144. package/lib/queries/analytics/analytics.js +41 -0
  145. package/lib/queries/content/content.js +2 -2
  146. package/lib/queries/crm/crm.js +52 -13
  147. package/lib/queries/events/events.js +2 -2
  148. package/lib/queries/flags/flags.d.ts +1 -0
  149. package/lib/queries/flags/flags.js +16 -0
  150. package/lib/queries/groups/groups.js +2 -2
  151. package/lib/queries/images/images.js +2 -2
  152. package/lib/queries/index.d.ts +3 -1
  153. package/lib/queries/index.js +13 -3
  154. package/lib/queries/locations/locations.js +2 -2
  155. package/lib/queries/messages/messages.js +1 -1
  156. package/lib/queries/personas/personas.js +2 -2
  157. package/lib/queries/posts/posts.js +2 -2
  158. package/lib/queries/query/query.js +2 -2
  159. package/lib/queries/reactions/reactions.js +2 -2
  160. package/lib/queries/statistics/statistics.js +2 -2
  161. package/lib/queries/subscriptions/subscriptions.js +1 -1
  162. package/lib/queries/tags/tags.js +2 -2
  163. package/lib/queries/users/users.js +2 -2
  164. package/lib/queries/videos/videos.js +2 -2
  165. package/lib/templates/email/layout.js +1 -1
  166. package/lib/templates/email/passwordForgot.js +1 -1
  167. package/lib/templates/email/passwordRecovery.js +1 -1
  168. package/lib/templates/email/verifyEmail.js +1 -1
  169. package/lib/templates/email/welcome.js +1 -1
  170. package/lib/templates/sms/passwordForgot.js +1 -1
  171. package/lib/templates/sms/passwordRecovery.js +1 -1
  172. package/lib/templates/sms/verifyEmail.js +1 -1
  173. package/lib/templates/sms/verifyPhone.js +1 -1
  174. package/lib/templates/sms/welcome.js +1 -1
  175. package/lib/types/analytics.types.d.ts +92 -0
  176. package/lib/types/analytics.types.js +6 -0
  177. package/lib/types/apps.types.d.ts +1 -1
  178. package/lib/types/apps.types.js +2 -2
  179. package/lib/types/arangodb.types.d.ts +2 -2
  180. package/lib/types/arangodb.types.js +2 -2
  181. package/lib/types/auth.types.d.ts +4 -1
  182. package/lib/types/auth.types.js +2 -2
  183. package/lib/types/connections.types.d.ts +1 -1
  184. package/lib/types/connections.types.js +2 -2
  185. package/lib/types/content.types.d.ts +1 -1
  186. package/lib/types/content.types.js +2 -2
  187. package/lib/types/conversations.types.d.ts +1 -1
  188. package/lib/types/conversations.types.js +2 -2
  189. package/lib/types/crm.types.d.ts +58 -2
  190. package/lib/types/crm.types.js +2 -2
  191. package/lib/types/email.types.d.ts +1 -1
  192. package/lib/types/email.types.js +2 -2
  193. package/lib/types/error.types.js +1 -1
  194. package/lib/types/files.types.d.ts +1 -1
  195. package/lib/types/files.types.js +2 -2
  196. package/lib/types/flags.types.d.ts +28 -0
  197. package/lib/types/flags.types.js +3 -0
  198. package/lib/types/google.types.d.ts +1 -1
  199. package/lib/types/google.types.js +2 -2
  200. package/lib/types/groups.types.d.ts +1 -1
  201. package/lib/types/groups.types.js +2 -2
  202. package/lib/types/images.types.d.ts +1 -1
  203. package/lib/types/images.types.js +2 -2
  204. package/lib/types/index.d.ts +3 -1
  205. package/lib/types/index.js +4 -2
  206. package/lib/types/locations.types.d.ts +1 -1
  207. package/lib/types/locations.types.js +2 -2
  208. package/lib/types/messages.types.d.ts +1 -1
  209. package/lib/types/messages.types.js +2 -2
  210. package/lib/types/notifications.types.d.ts +1 -1
  211. package/lib/types/notifications.types.js +2 -2
  212. package/lib/types/payments.types.d.ts +4 -1
  213. package/lib/types/payments.types.js +2 -2
  214. package/lib/types/personas.types.js +1 -1
  215. package/lib/types/posts.types.d.ts +1 -1
  216. package/lib/types/posts.types.js +2 -2
  217. package/lib/types/rum.types.d.ts +3 -3
  218. package/lib/types/rum.types.js +2 -2
  219. package/lib/types/statistics.types.js +1 -1
  220. package/lib/types/tags.types.d.ts +1 -1
  221. package/lib/types/tags.types.js +2 -2
  222. package/lib/types/users.types.d.ts +2 -1
  223. package/lib/types/users.types.js +2 -2
  224. package/lib/types/videos.types.d.ts +1 -1
  225. package/lib/types/videos.types.js +2 -2
  226. package/lib/types/websockets.types.d.ts +1 -1
  227. package/lib/types/websockets.types.js +2 -2
  228. package/lib/upload.js +4 -9
  229. package/lib/utils/adapterUtils.d.ts +1 -1
  230. package/lib/utils/adapterUtils.js +2 -2
  231. package/lib/utils/analyticsUtils.d.ts +1 -1
  232. package/lib/utils/analyticsUtils.js +2 -2
  233. package/lib/utils/appContext.d.ts +2 -0
  234. package/lib/utils/appContext.js +10 -0
  235. package/lib/utils/aqlHelpers.d.ts +1 -1
  236. package/lib/utils/aqlHelpers.js +2 -2
  237. package/lib/utils/arangodbUtils.d.ts +9 -1
  238. package/lib/utils/arangodbUtils.js +10 -2
  239. package/lib/utils/authUtils.js +2 -2
  240. package/lib/utils/awsUtils.js +2 -2
  241. package/lib/utils/collectionRegistry.d.ts +1 -1
  242. package/lib/utils/collectionRegistry.js +17 -2
  243. package/lib/utils/contextUtils.d.ts +2 -2
  244. package/lib/utils/contextUtils.js +2 -2
  245. package/lib/utils/dbI18n.example.d.ts +1 -1
  246. package/lib/utils/dbI18n.example.js +2 -2
  247. package/lib/utils/dbI18n.js +2 -2
  248. package/lib/utils/googleTranslate.d.ts +1 -1
  249. package/lib/utils/googleTranslate.js +2 -2
  250. package/lib/utils/graphqlUtils.d.ts +2 -0
  251. package/lib/utils/graphqlUtils.js +1 -1
  252. package/lib/utils/imageUtils.js +1 -1
  253. package/lib/utils/index.d.ts +1 -1
  254. package/lib/utils/index.js +2 -2
  255. package/lib/utils/languageDetection.js +1 -1
  256. package/lib/utils/localeUtils.d.ts +1 -1
  257. package/lib/utils/localeUtils.example.d.ts +1 -1
  258. package/lib/utils/localeUtils.example.js +2 -2
  259. package/lib/utils/localeUtils.js +2 -2
  260. package/lib/utils/middlewareUtils.js +1 -1
  261. package/lib/utils/queryBuilder.d.ts +1 -1
  262. package/lib/utils/queryBuilder.js +2 -2
  263. package/lib/utils/schemaUtils.js +1 -1
  264. package/lib/utils/sessionUtils.d.ts +4 -0
  265. package/lib/utils/sessionUtils.js +2 -2
  266. package/lib/utils/stripeUtils.d.ts +1 -1
  267. package/lib/utils/stripeUtils.js +2 -2
  268. package/lib/utils/templateUtils.js +1 -1
  269. package/lib/utils/testUtils.js +2 -2
  270. package/lib/utils/translationQueue.d.ts +1 -1
  271. package/lib/utils/translationQueue.example.d.ts +1 -1
  272. package/lib/utils/translationQueue.example.js +2 -2
  273. package/lib/utils/translationQueue.js +2 -2
  274. package/lib/videoProcessing.js +1 -1
  275. package/package.json +49 -86
  276. package/lib/actions/websockets.d.ts +0 -20
  277. package/lib/actions/websockets.js +0 -164
  278. package/lib/mocks/nlabs.png +0 -0
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
3
- * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
3
+ * All rights reserved. Use is subject to the accompanying commercial LICENSE.
4
4
  */ import { parseNum } from '@nlabs/utils/parsers/numbers';
5
- import { createHash, parseChar, parseId, parseString, parseVarChar } from '@nlabs/utils/parsers/strings';
5
+ import { parseChar, parseId, parseString, parseVarChar } from '@nlabs/utils/parsers/strings';
6
6
  import { aql } from 'arangojs';
7
7
  import { ErrorTypes } from '../types/error.types.js';
8
8
  import { logError, UserError } from '../utils/analyticsUtils.js';
@@ -106,122 +106,6 @@ export const addBankAccount = (context, bankAccount)=>{
106
106
  });
107
107
  });
108
108
  };
109
- export const addCreditCard = (context, card)=>{
110
- const action = 'addCreditCard';
111
- const { databaseName, session: { userId: sessionId } } = context;
112
- return getUserById(context, {
113
- userId: sessionId
114
- }).then((user)=>{
115
- // User
116
- const { stripeAccountId } = user;
117
- // Card
118
- const { accountNumber, city, country, cvc, expMonth, expYear, fullName, street1, street2, state, zip } = card;
119
- const formatNumber = parseNum(accountNumber, 16);
120
- if (!formatNumber) {
121
- throw new UserError('required_credit_card_number');
122
- }
123
- const formatExpMonth = parseNum(expMonth, 2);
124
- if (!formatExpMonth) {
125
- throw new UserError('required_credit_card_exp_month');
126
- }
127
- const formatExpYear = parseNum(expYear, 2);
128
- if (!formatExpYear) {
129
- throw new UserError('required_credit_card_exp_year');
130
- }
131
- const formatCvc = parseNum(cvc, 3);
132
- // Address
133
- const paymentCard = {};
134
- const formatCity = parseVarChar(city, 32);
135
- if (formatCity) {
136
- paymentCard.city = formatCity;
137
- }
138
- const formatCountry = parseChar(country, 2);
139
- if (formatCountry) {
140
- paymentCard.country = formatCountry;
141
- }
142
- const formatFullName = parseVarChar(fullName, 32);
143
- if (formatFullName) {
144
- paymentCard.fullName = formatFullName;
145
- }
146
- const formatStreet1 = parseVarChar(street1, 32);
147
- if (formatStreet1) {
148
- paymentCard.street1 = formatStreet1;
149
- }
150
- const formatStreet2 = parseVarChar(street2, 32);
151
- if (formatStreet2) {
152
- paymentCard.street2 = formatStreet2;
153
- }
154
- const formatState = parseChar(state, 2);
155
- if (formatState) {
156
- paymentCard.state = formatState;
157
- }
158
- const formatZip = parseVarChar(zip, 10);
159
- if (formatZip) {
160
- paymentCard.zip = formatZip;
161
- }
162
- const stripeClient = getStripeClient();
163
- // Create a token first, then use the token as the source
164
- return stripeClient.tokens.create({
165
- card: {
166
- address_city: formatCity,
167
- address_country: formatCountry,
168
- address_line1: formatStreet1,
169
- address_line2: formatStreet2,
170
- address_state: formatState,
171
- address_zip: formatZip,
172
- cvc: formatCvc.toString(),
173
- exp_month: formatExpMonth.toString(),
174
- exp_year: formatExpYear.toString(),
175
- name: fullName,
176
- number: formatNumber.toString()
177
- }
178
- }).then((token)=>stripeClient.customers.createSource(stripeAccountId, {
179
- source: token.id
180
- })).then((newSource)=>{
181
- // Use type assertion for card properties
182
- const cardSource = newSource;
183
- const brand = cardSource.brand || '';
184
- const cvcCheck = cardSource.cvc_check || '';
185
- const last4 = cardSource.last4 || '';
186
- // Create session
187
- const now = Date.now();
188
- const insert = {
189
- ...paymentCard,
190
- _key: createHash(`user-payment-${sessionId}`),
191
- accountNumber: last4,
192
- added: now,
193
- brand,
194
- cvcCheck,
195
- expMonth,
196
- expYear,
197
- modified: now,
198
- userId: sessionId
199
- };
200
- const insertAqlQry = aql`INSERT ${insert} IN creditCards RETURN NEW`;
201
- return useDb(databaseName).query(insertAqlQry).then((cursor)=>cursor.next()).then((newCard)=>{
202
- if (newCard) {
203
- // Add linked edge
204
- const { _id: cardId, _key: cardKey } = card;
205
- const edgeCollection = useDb(databaseName).collection('hasPayment');
206
- const edgeId = createHash(`payment-${cardKey}`);
207
- const edge = {
208
- _from: `users/${sessionId}`,
209
- _key: edgeId,
210
- _to: cardId
211
- };
212
- return edgeCollection.save(edge, {
213
- returnNew: true
214
- }).then(()=>card);
215
- }
216
- return newCard;
217
- }).catch((error)=>logError({
218
- action,
219
- category: eventCategory,
220
- label: 'payment_error'
221
- }, error, context).then(()=>null));
222
- });
223
- });
224
- };
225
109
  export const updateCreditCard = (context, card)=>{
226
110
  const { databaseName, session: { userId: sessionId } } = context;
227
111
  const { city, country, expMonth, expYear, fullName, id, street1, state, zip } = card;
@@ -462,13 +346,55 @@ const ensureStripeCustomerId = async (context)=>{
462
346
  }
463
347
  return String(user?.stripeCustomerId || '');
464
348
  };
465
- const parseCardNumber = (accountNumber)=>String(accountNumber || '').replace(/\D/g, '');
466
- const parseCardExpYear = (expYear)=>{
467
- const parsedYear = parseNum(expYear, 4);
468
- if (!parsedYear) {
469
- return 0;
349
+ const getConfiguredBillingOrigins = (context)=>{
350
+ const configuredOrigins = String(process.env.STRIPE_RETURN_URL_ORIGINS || '').split(',').map((origin)=>origin.trim()).filter(Boolean);
351
+ const appUrl = String(context.config?.details?.url || '').trim();
352
+ if (appUrl) {
353
+ configuredOrigins.push(appUrl.includes('://') ? appUrl : `https://${appUrl}`);
354
+ }
355
+ return new Set(configuredOrigins.map((origin)=>{
356
+ try {
357
+ return new URL(origin).origin;
358
+ } catch {
359
+ return '';
360
+ }
361
+ }).filter(Boolean));
362
+ };
363
+ const parseBillingReturnUrl = (context, returnUrl)=>{
364
+ let parsedUrl;
365
+ try {
366
+ parsedUrl = new URL(String(returnUrl || '').trim());
367
+ } catch {
368
+ throw new UserError('invalid_billing_return_url');
369
+ }
370
+ const isLocalDevelopmentUrl = parsedUrl.protocol === 'http:' && [
371
+ '127.0.0.1',
372
+ 'localhost'
373
+ ].includes(parsedUrl.hostname);
374
+ const isSecureUrl = parsedUrl.protocol === 'https:';
375
+ const allowedOrigins = getConfiguredBillingOrigins(context);
376
+ if (!isSecureUrl && !isLocalDevelopmentUrl || !isLocalDevelopmentUrl && !allowedOrigins.has(parsedUrl.origin)) {
377
+ throw new UserError('invalid_billing_return_url');
378
+ }
379
+ parsedUrl.hash = '';
380
+ return parsedUrl;
381
+ };
382
+ const getCheckoutReturnUrl = (returnUrl, status)=>{
383
+ const nextUrl = new URL(returnUrl.toString());
384
+ nextUrl.searchParams.set('billing', status);
385
+ if (status === 'success') {
386
+ nextUrl.searchParams.set('session_id', '{CHECKOUT_SESSION_ID}');
470
387
  }
471
- return parsedYear < 100 ? 2000 + parsedYear : parsedYear;
388
+ return nextUrl.toString().replace('%7BCHECKOUT_SESSION_ID%7D', '{CHECKOUT_SESSION_ID}');
389
+ };
390
+ const updateUserBillingPaymentMethod = async (context, update)=>{
391
+ const sessionId = String(context.session?.userId || '').trim();
392
+ const userUpdate = {
393
+ modified: Date.now(),
394
+ ...update
395
+ };
396
+ const aqlQry = aql`UPDATE ${sessionId} WITH ${userUpdate} IN users LIMIT 1 RETURN NEW`;
397
+ return useDb(context.databaseName).query(aqlQry).then((cursor)=>cursor.next()).then((user)=>user);
472
398
  };
473
399
  const ensurePlusStripePlan = async ()=>{
474
400
  const stripeClient = getStripeClient();
@@ -548,78 +474,98 @@ export const upgradeUserToPlus = async (context)=>{
548
474
  throw new UserError('payment_error');
549
475
  }
550
476
  };
551
- export const saveUserBillingCard = async (context, card)=>{
552
- const action = 'saveUserBillingCard';
553
- const { databaseName, session: { userId: sessionId } = {} } = context;
477
+ export const createBillingSetupSession = async (context, { returnUrl })=>{
478
+ const sessionId = String(context.session?.userId || '').trim();
479
+ if (!sessionId) {
480
+ throw new UserError('invalid_session');
481
+ }
554
482
  const stripeCustomerId = await ensureStripeCustomerId(context);
555
- if (!stripeCustomerId || !sessionId) {
483
+ if (!stripeCustomerId) {
556
484
  throw new UserError('payment_error');
557
485
  }
558
- const formatNumber = parseCardNumber(card?.accountNumber);
559
- if (formatNumber.length < 12 || formatNumber.length > 19) {
560
- throw new UserError('required_credit_card_number');
561
- }
562
- const formatExpMonth = parseNum(card?.expMonth, 2);
563
- if (!formatExpMonth) {
564
- throw new UserError('required_credit_card_exp_month');
486
+ const parsedReturnUrl = parseBillingReturnUrl(context, returnUrl);
487
+ const checkoutSession = await getStripeClient().checkout.sessions.create({
488
+ cancel_url: getCheckoutReturnUrl(parsedReturnUrl, 'canceled'),
489
+ customer: stripeCustomerId,
490
+ metadata: {
491
+ type: 'billing-payment-method',
492
+ userId: sessionId
493
+ },
494
+ mode: 'setup',
495
+ payment_method_types: [
496
+ 'card'
497
+ ],
498
+ setup_intent_data: {
499
+ metadata: {
500
+ type: 'billing-payment-method',
501
+ userId: sessionId
502
+ }
503
+ },
504
+ success_url: getCheckoutReturnUrl(parsedReturnUrl, 'success')
505
+ });
506
+ const checkoutUrl = String(checkoutSession.url || '').trim();
507
+ if (!checkoutUrl) {
508
+ throw new UserError('payment_error');
565
509
  }
566
- const formatExpYear = parseCardExpYear(card?.expYear);
567
- if (!formatExpYear) {
568
- throw new UserError('required_credit_card_exp_year');
510
+ return checkoutUrl;
511
+ };
512
+ export const completeBillingSetupSession = async (context, checkoutSessionId)=>{
513
+ const sessionId = String(context.session?.userId || '').trim();
514
+ const normalizedCheckoutSessionId = String(checkoutSessionId || '').trim();
515
+ if (!sessionId) {
516
+ throw new UserError('invalid_session');
569
517
  }
570
- const formatCvc = String(card?.cvc || '').replace(/\D/g, '');
571
- if (formatCvc.length < 3 || formatCvc.length > 4) {
572
- throw new UserError('required_credit_card_cvc');
518
+ if (!normalizedCheckoutSessionId) {
519
+ throw new UserError('invalid_billing_setup_session');
573
520
  }
574
- const stripeClient = getStripeClient();
575
521
  const currentUser = await getUserById(context, {
576
522
  userId: sessionId
577
523
  });
578
- const currentStripeCardId = String(currentUser?.stripeCardId || '');
579
- try {
580
- const token = await stripeClient.tokens.create({
581
- card: {
582
- cvc: formatCvc,
583
- exp_month: String(formatExpMonth),
584
- exp_year: String(formatExpYear),
585
- name: String(card?.fullName || '').trim() || undefined,
586
- number: formatNumber
587
- }
588
- });
589
- const newSource = await stripeClient.customers.createSource(stripeCustomerId, {
590
- source: token.id
591
- });
592
- const cardSource = newSource;
593
- const brand = String(cardSource.brand || '').trim();
594
- const last4 = String(cardSource.last4 || '').trim();
595
- const stripeCardId = String(cardSource.id || '').trim();
596
- await stripeClient.customers.update(stripeCustomerId, {
597
- default_source: stripeCardId
598
- });
599
- if (currentStripeCardId && currentStripeCardId !== stripeCardId) {
600
- await stripeClient.customers.deleteSource(stripeCustomerId, currentStripeCardId).catch(()=>null);
601
- }
602
- const update = {
603
- modified: Date.now(),
604
- stripeCardBrand: brand,
605
- stripeCardId,
606
- stripeCardLast4: last4
607
- };
608
- const aqlQry = aql`UPDATE ${sessionId} WITH ${update} IN users LIMIT 1 RETURN NEW`;
609
- const updatedUser = await useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).then((user)=>user);
610
- return updatedUser;
611
- } catch (error) {
612
- await logError({
613
- action,
614
- category: eventCategory,
615
- label: 'payment_error'
616
- }, error, context);
524
+ const stripeCustomerId = String(currentUser?.stripeCustomerId || '').trim();
525
+ if (!stripeCustomerId) {
617
526
  throw new UserError('payment_error');
618
527
  }
528
+ const stripeClient = getStripeClient();
529
+ const checkoutSession = await stripeClient.checkout.sessions.retrieve(normalizedCheckoutSessionId, {
530
+ expand: [
531
+ 'setup_intent.payment_method'
532
+ ]
533
+ });
534
+ const checkoutCustomerId = typeof checkoutSession.customer === 'string' ? checkoutSession.customer : checkoutSession.customer?.id;
535
+ if (checkoutSession.mode !== 'setup' || checkoutSession.status !== 'complete' || checkoutCustomerId !== stripeCustomerId || checkoutSession.metadata?.userId !== sessionId) {
536
+ throw new UserError('invalid_billing_setup_session');
537
+ }
538
+ const setupIntent = typeof checkoutSession.setup_intent === 'string' ? await stripeClient.setupIntents.retrieve(checkoutSession.setup_intent, {
539
+ expand: [
540
+ 'payment_method'
541
+ ]
542
+ }) : checkoutSession.setup_intent;
543
+ if (!setupIntent || setupIntent.status !== 'succeeded') {
544
+ throw new UserError('billing_setup_incomplete');
545
+ }
546
+ const paymentMethod = typeof setupIntent.payment_method === 'string' ? await stripeClient.paymentMethods.retrieve(setupIntent.payment_method) : setupIntent.payment_method;
547
+ const paymentMethodCustomerId = typeof paymentMethod?.customer === 'string' ? paymentMethod.customer : paymentMethod?.customer?.id;
548
+ if (!paymentMethod || paymentMethod.type !== 'card' || !paymentMethod.card || paymentMethodCustomerId !== stripeCustomerId) {
549
+ throw new UserError('invalid_billing_payment_method');
550
+ }
551
+ await stripeClient.customers.update(stripeCustomerId, {
552
+ invoice_settings: {
553
+ default_payment_method: paymentMethod.id
554
+ }
555
+ });
556
+ const currentStripeCardId = String(currentUser?.stripeCardId || '').trim();
557
+ if (currentStripeCardId.startsWith('pm_') && currentStripeCardId !== paymentMethod.id) {
558
+ await stripeClient.paymentMethods.detach(currentStripeCardId).catch(()=>null);
559
+ }
560
+ return updateUserBillingPaymentMethod(context, {
561
+ stripeCardBrand: String(paymentMethod.card.brand || '').trim(),
562
+ stripeCardId: paymentMethod.id,
563
+ stripeCardLast4: String(paymentMethod.card.last4 || '').trim()
564
+ });
619
565
  };
620
566
  export const deleteUserBillingCard = async (context)=>{
621
567
  const action = 'deleteUserBillingCard';
622
- const { databaseName, session: { userId: sessionId } = {} } = context;
568
+ const { session: { userId: sessionId } = {} } = context;
623
569
  const currentUser = await getUserById(context, {
624
570
  userId: sessionId
625
571
  });
@@ -628,16 +574,25 @@ export const deleteUserBillingCard = async (context)=>{
628
574
  const stripeClient = getStripeClient();
629
575
  try {
630
576
  if (stripeCustomerId && stripeCardId) {
631
- await stripeClient.customers.deleteSource(stripeCustomerId, stripeCardId).catch(()=>null);
577
+ if (stripeCardId.startsWith('pm_')) {
578
+ const customer = await stripeClient.customers.retrieve(stripeCustomerId);
579
+ if (!('deleted' in customer) && customer.invoice_settings.default_payment_method === stripeCardId) {
580
+ await stripeClient.customers.update(stripeCustomerId, {
581
+ invoice_settings: {
582
+ default_payment_method: null
583
+ }
584
+ });
585
+ }
586
+ await stripeClient.paymentMethods.detach(stripeCardId).catch(()=>null);
587
+ } else {
588
+ await stripeClient.customers.deleteSource(stripeCustomerId, stripeCardId).catch(()=>null);
589
+ }
632
590
  }
633
- const update = {
634
- modified: Date.now(),
591
+ return updateUserBillingPaymentMethod(context, {
635
592
  stripeCardBrand: '',
636
593
  stripeCardId: '',
637
594
  stripeCardLast4: ''
638
- };
639
- const aqlQry = aql`UPDATE ${sessionId} WITH ${update} IN users LIMIT 1 RETURN NEW`;
640
- return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).then((user)=>user);
595
+ });
641
596
  } catch (error) {
642
597
  await logError({
643
598
  action,
@@ -648,4 +603,4 @@ export const deleteUserBillingCard = async (context)=>{
648
603
  }
649
604
  };
650
605
 
651
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3Ivc3JjL2FjdGlvbnMvcGF5bWVudHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7cGFyc2VOdW19IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL251bWJlcnMnO1xuaW1wb3J0IHtjcmVhdGVIYXNoLCBwYXJzZUNoYXIsIHBhcnNlSWQsIHBhcnNlU3RyaW5nLCBwYXJzZVZhckNoYXJ9IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL3N0cmluZ3MnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQgc3RyaXBlIGZyb20gJ3N0cmlwZSc7XG5cbmltcG9ydCB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5pbXBvcnQge0Vycm9yVHlwZXN9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzLmpzJztcbmltcG9ydCB7UGF5bWVudEJhbmtBY2NvdW50LCBQYXltZW50Q2FyZFR5cGUsIFBheW1lbnRDaGFyZ2UsIFBheW1lbnRUcmFuc2Zlcn0gZnJvbSAnLi4vdHlwZXMvcGF5bWVudHMudHlwZXMuanMnO1xuaW1wb3J0IHtVc2VyVHlwZX0gZnJvbSAnLi4vdHlwZXMvdXNlcnMudHlwZXMuanMnO1xuaW1wb3J0IHtsb2dFcnJvciwgVXNlckVycm9yfSBmcm9tICcuLi91dGlscy9hbmFseXRpY3NVdGlscy5qcyc7XG5pbXBvcnQge3VzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzLmpzJztcbmltcG9ydCB7aGFzQWNjZXNzTGV2ZWx9IGZyb20gJy4uL3V0aWxzL3Nlc3Npb25VdGlscy5qcyc7XG5pbXBvcnQge2dldFN0cmlwZUNsaWVudH0gZnJvbSAnLi4vdXRpbHMvc3RyaXBlVXRpbHMuanMnO1xuaW1wb3J0IHtnZXRVc2VyQnlJZH0gZnJvbSAnLi91c2Vycy5qcyc7XG5cbmltcG9ydCB0eXBlIHtFZGdlQ29sbGVjdGlvbn0gZnJvbSAnYXJhbmdvanMvY29sbGVjdGlvbnMnO1xuXG5jb25zdCBldmVudENhdGVnb3J5ID0gJ3BheW1lbnRzJztcbmNvbnN0IFBMVVNfUExBTl9JRCA9ICdwaGFudGF6ZS1wbHVzLW1vbnRobHknO1xuY29uc3QgUExVU19QTEFOX0FNT1VOVCA9IDEwMDA7XG5jb25zdCBQTFVTX1BMQU5fQUNDRVNTID0gMTtcblxuZXhwb3J0IGNvbnN0IGFkZEN1c3RvbWVyQWNjb3VudCA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdhZGRDdXN0b21lckFjY291bnQnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWQsIHVzZXJuYW1lfSA9IHt9fSA9IGNvbnRleHQ7XG5cbiAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gZ2V0U3RyaXBlQ2xpZW50KCk7XG5cbiAgcmV0dXJuIHN0cmlwZUNsaWVudC5jdXN0b21lcnNcbiAgICAuY3JlYXRlKHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHVzZXJJZDogc2Vzc2lvbklkLFxuICAgICAgICB1c2VybmFtZVxuICAgICAgfVxuICAgIH0gYXMgYW55KVxuICAgIC50aGVuKChjdXN0b21lcikgPT4ge1xuICAgICAgLy8gQ3JlYXRlIHNlc3Npb25cbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB1cGRhdGU6IFVzZXJUeXBlID0ge1xuICAgICAgICBtb2RpZmllZDogbm93LFxuICAgICAgICBzdHJpcGVDdXN0b21lcklkOiBjdXN0b21lci5pZFxuICAgICAgfTtcblxuICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHtzZXNzaW9uSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzIExJTUlUIDEgUkVUVVJOIE5FV2A7XG5cbiAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgLnRoZW4oKHVwZGF0ZWRVc2VyOiBVc2VyVHlwZSkgPT4gISF1cGRhdGVkVXNlcilcbiAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZEJhbmtBY2NvdW50ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGJhbmtBY2NvdW50OiBQYXltZW50QmFua0FjY291bnQpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2FkZFBheW1lbnRBY2NvdW50QmFuayc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH0gPSB7fX0gPSBjb250ZXh0O1xuXG4gIC8vIFBhcmFtc1xuICBjb25zdCB7XG4gICAgYWNjb3VudE51bWJlcixcbiAgICBmdWxsTmFtZSxcbiAgICByb3V0aW5nXG4gIH0gPSBiYW5rQWNjb3VudDtcblxuICBjb25zdCBmb3JtYXRBY2NvdW50ID0gcGFyc2VTdHJpbmcoYWNjb3VudE51bWJlciwgMzIpO1xuXG4gIGlmKGZvcm1hdEFjY291bnQgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfYWNjb3VudF9udW1iZXInKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdEZ1bGxOYW1lID0gcGFyc2VWYXJDaGFyKGZ1bGxOYW1lLCAxMjgpO1xuXG4gIGlmKGZvcm1hdEZ1bGxOYW1lID09PSAnJykge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX2Z1bGxfbmFtZScpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0Um91dGluZyA9IHBhcnNlU3RyaW5nKHJvdXRpbmcsIDMyKTtcblxuICBpZihmb3JtYXRSb3V0aW5nID09PSAnJykge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX3JvdXRpbmdfbnVtYmVyJyk7XG4gIH1cblxuICByZXR1cm4gZ2V0VXNlckJ5SWQoY29udGV4dCwge3VzZXJJZDogc2Vzc2lvbklkfSlcbiAgICAudGhlbigodXNlcjogVXNlclR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHtzdHJpcGVBY2NvdW50SWR9ID0gdXNlcjtcbiAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IGdldFN0cmlwZUNsaWVudCgpO1xuXG4gICAgICAvLyBDcmVhdGUgYSB0b2tlbiBmaXJzdCwgdGhlbiB1c2UgdGhlIHRva2VuIGFzIHRoZSBzb3VyY2VcbiAgICAgIHJldHVybiBzdHJpcGVDbGllbnQudG9rZW5zLmNyZWF0ZSh7XG4gICAgICAgIGJhbmtfYWNjb3VudDoge1xuICAgICAgICAgIGFjY291bnRfaG9sZGVyX25hbWU6IGZvcm1hdEZ1bGxOYW1lLFxuICAgICAgICAgIGFjY291bnRfaG9sZGVyX3R5cGU6ICdpbmRpdmlkdWFsJyxcbiAgICAgICAgICBhY2NvdW50X251bWJlcjogZm9ybWF0QWNjb3VudCxcbiAgICAgICAgICBjb3VudHJ5OiAnVVMnLFxuICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgICByb3V0aW5nX251bWJlcjogZm9ybWF0Um91dGluZ1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgICAudGhlbigodG9rZW4pID0+IHN0cmlwZUNsaWVudC5jdXN0b21lcnMuY3JlYXRlU291cmNlKFxuICAgICAgICAgIHN0cmlwZUFjY291bnRJZCxcbiAgICAgICAgICB7c291cmNlOiB0b2tlbi5pZH1cbiAgICAgICAgKSlcbiAgICAgICAgLnRoZW4oKGFjY291bnQpID0+IHtcbiAgICAgICAgICAvLyBVc2UgdHlwZSBhc3NlcnRpb24gZm9yIGNhcmQgcHJvcGVydGllc1xuICAgICAgICAgIC8vIGNvbnN0IGNhcmRTb3VyY2UgPSBhY2NvdW50IGFzIHVua25vd24gYXMgQ2FyZDtcbiAgICAgICAgICAvLyBjb25zdCBicmFuZCA9IGNhcmRTb3VyY2UuYnJhbmQgfHwgJyc7XG4gICAgICAgICAgLy8gY29uc3QgY3ZjQ2hlY2sgPSBjYXJkU291cmNlLmN2Y19jaGVjayB8fCAnJztcbiAgICAgICAgICAvLyBjb25zdCBsYXN0NCA9IGNhcmRTb3VyY2UubGFzdDQgfHwgJyc7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgc2Vzc2lvblxuICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgdXBkYXRlID0ge1xuICAgICAgICAgICAgYmFua0FjY291bnQsXG4gICAgICAgICAgICBiYW5rRnVsbE5hbWU6IGZvcm1hdEZ1bGxOYW1lLFxuICAgICAgICAgICAgYmFua0lkOiBhY2NvdW50LmlkLFxuICAgICAgICAgICAgYmFua1JvdXRpbmc6IGZvcm1hdFJvdXRpbmcsXG4gICAgICAgICAgICBtb2RpZmllZDogbm93XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFICR7c2Vzc2lvbklkfSBXSVRIICR7dXBkYXRlfSBJTiB1c2VycyBMSU1JVCAxIFJFVFVSTiBORVdgO1xuXG4gICAgICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgICAgIC50aGVuKCh1cGRhdGVkVXNlcjogVXNlclR5cGUpID0+IHVwZGF0ZWRVc2VyKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zdCBtc2cgPSBlcnJvci5tZXNzYWdlO1xuXG4gICAgICAgICAgaWYobXNnID09PSAnQSBiYW5rIGFjY291bnQgd2l0aCB0aGF0IHJvdXRpbmcgbnVtYmVyIGFuZCBhY2NvdW50IG51bWJlciAnICtcbiAgICAgICAgICAgICdhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBjdXN0b21lci4nKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgICBsYWJlbDogJ2JhbmtfYWNjb3VudF9leGlzdHMnXG4gICAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgbGFiZWw6ICdwYXltZW50X2Vycm9yJ1xuICAgICAgICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRDcmVkaXRDYXJkID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGNhcmQ6IFBheW1lbnRDYXJkVHlwZSk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2FkZENyZWRpdENhcmQnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG5cbiAgcmV0dXJuIGdldFVzZXJCeUlkKGNvbnRleHQsIHt1c2VySWQ6IHNlc3Npb25JZH0pXG4gICAgLnRoZW4oKHVzZXI6IFVzZXJUeXBlKSA9PiB7XG4gICAgICAvLyBVc2VyXG4gICAgICBjb25zdCB7c3RyaXBlQWNjb3VudElkfSA9IHVzZXI7XG5cbiAgICAgIC8vIENhcmRcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWNjb3VudE51bWJlcixcbiAgICAgICAgY2l0eSxcbiAgICAgICAgY291bnRyeSxcbiAgICAgICAgY3ZjLFxuICAgICAgICBleHBNb250aCxcbiAgICAgICAgZXhwWWVhcixcbiAgICAgICAgZnVsbE5hbWUsXG4gICAgICAgIHN0cmVldDEsXG4gICAgICAgIHN0cmVldDIsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICB6aXBcbiAgICAgIH06IFBheW1lbnRDYXJkVHlwZSA9IGNhcmQ7XG5cbiAgICAgIGNvbnN0IGZvcm1hdE51bWJlciA9IHBhcnNlTnVtKGFjY291bnROdW1iZXIsIDE2KTtcblxuICAgICAgaWYoIWZvcm1hdE51bWJlcikge1xuICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdyZXF1aXJlZF9jcmVkaXRfY2FyZF9udW1iZXInKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0RXhwTW9udGggPSBwYXJzZU51bShleHBNb250aCwgMik7XG5cbiAgICAgIGlmKCFmb3JtYXRFeHBNb250aCkge1xuICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdyZXF1aXJlZF9jcmVkaXRfY2FyZF9leHBfbW9udGgnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0RXhwWWVhciA9IHBhcnNlTnVtKGV4cFllYXIsIDIpO1xuXG4gICAgICBpZighZm9ybWF0RXhwWWVhcikge1xuICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdyZXF1aXJlZF9jcmVkaXRfY2FyZF9leHBfeWVhcicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXRDdmMgPSBwYXJzZU51bShjdmMsIDMpO1xuXG4gICAgICAvLyBBZGRyZXNzXG4gICAgICBjb25zdCBwYXltZW50Q2FyZDogUGF5bWVudENhcmRUeXBlID0ge307XG4gICAgICBjb25zdCBmb3JtYXRDaXR5ID0gcGFyc2VWYXJDaGFyKGNpdHksIDMyKTtcblxuICAgICAgaWYoZm9ybWF0Q2l0eSkge1xuICAgICAgICBwYXltZW50Q2FyZC5jaXR5ID0gZm9ybWF0Q2l0eTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0Q291bnRyeSA9IHBhcnNlQ2hhcihjb3VudHJ5LCAyKTtcblxuICAgICAgaWYoZm9ybWF0Q291bnRyeSkge1xuICAgICAgICBwYXltZW50Q2FyZC5jb3VudHJ5ID0gZm9ybWF0Q291bnRyeTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0RnVsbE5hbWUgPSBwYXJzZVZhckNoYXIoZnVsbE5hbWUsIDMyKTtcblxuICAgICAgaWYoZm9ybWF0RnVsbE5hbWUpIHtcbiAgICAgICAgcGF5bWVudENhcmQuZnVsbE5hbWUgPSBmb3JtYXRGdWxsTmFtZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0U3RyZWV0MSA9IHBhcnNlVmFyQ2hhcihzdHJlZXQxLCAzMik7XG5cbiAgICAgIGlmKGZvcm1hdFN0cmVldDEpIHtcbiAgICAgICAgcGF5bWVudENhcmQuc3RyZWV0MSA9IGZvcm1hdFN0cmVldDE7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdFN0cmVldDIgPSBwYXJzZVZhckNoYXIoc3RyZWV0MiwgMzIpO1xuXG4gICAgICBpZihmb3JtYXRTdHJlZXQyKSB7XG4gICAgICAgIHBheW1lbnRDYXJkLnN0cmVldDIgPSBmb3JtYXRTdHJlZXQyO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXRTdGF0ZSA9IHBhcnNlQ2hhcihzdGF0ZSwgMik7XG5cbiAgICAgIGlmKGZvcm1hdFN0YXRlKSB7XG4gICAgICAgIHBheW1lbnRDYXJkLnN0YXRlID0gZm9ybWF0U3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdFppcCA9IHBhcnNlVmFyQ2hhcih6aXAsIDEwKTtcblxuICAgICAgaWYoZm9ybWF0WmlwKSB7XG4gICAgICAgIHBheW1lbnRDYXJkLnppcCA9IGZvcm1hdFppcDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gZ2V0U3RyaXBlQ2xpZW50KCk7XG5cbiAgICAgIC8vIENyZWF0ZSBhIHRva2VuIGZpcnN0LCB0aGVuIHVzZSB0aGUgdG9rZW4gYXMgdGhlIHNvdXJjZVxuICAgICAgcmV0dXJuIHN0cmlwZUNsaWVudC50b2tlbnMuY3JlYXRlKHtcbiAgICAgICAgY2FyZDoge1xuICAgICAgICAgIGFkZHJlc3NfY2l0eTogZm9ybWF0Q2l0eSxcbiAgICAgICAgICBhZGRyZXNzX2NvdW50cnk6IGZvcm1hdENvdW50cnksXG4gICAgICAgICAgYWRkcmVzc19saW5lMTogZm9ybWF0U3RyZWV0MSxcbiAgICAgICAgICBhZGRyZXNzX2xpbmUyOiBmb3JtYXRTdHJlZXQyLFxuICAgICAgICAgIGFkZHJlc3Nfc3RhdGU6IGZvcm1hdFN0YXRlLFxuICAgICAgICAgIGFkZHJlc3NfemlwOiBmb3JtYXRaaXAsXG4gICAgICAgICAgY3ZjOiBmb3JtYXRDdmMudG9TdHJpbmcoKSxcbiAgICAgICAgICBleHBfbW9udGg6IGZvcm1hdEV4cE1vbnRoLnRvU3RyaW5nKCksXG4gICAgICAgICAgZXhwX3llYXI6IGZvcm1hdEV4cFllYXIudG9TdHJpbmcoKSxcbiAgICAgICAgICBuYW1lOiBmdWxsTmFtZSxcbiAgICAgICAgICBudW1iZXI6IGZvcm1hdE51bWJlci50b1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAgIC50aGVuKCh0b2tlbikgPT4gc3RyaXBlQ2xpZW50LmN1c3RvbWVycy5jcmVhdGVTb3VyY2UoXG4gICAgICAgICAgc3RyaXBlQWNjb3VudElkLFxuICAgICAgICAgIHtzb3VyY2U6IHRva2VuLmlkfVxuICAgICAgICApKVxuICAgICAgICAudGhlbigobmV3U291cmNlKSA9PiB7XG4gICAgICAgICAgLy8gVXNlIHR5cGUgYXNzZXJ0aW9uIGZvciBjYXJkIHByb3BlcnRpZXNcbiAgICAgICAgICBjb25zdCBjYXJkU291cmNlID0gbmV3U291cmNlIGFzIHVua25vd24gYXMgQ2FyZDtcbiAgICAgICAgICBjb25zdCBicmFuZCA9IGNhcmRTb3VyY2UuYnJhbmQgfHwgJyc7XG4gICAgICAgICAgY29uc3QgY3ZjQ2hlY2sgPSBjYXJkU291cmNlLmN2Y19jaGVjayB8fCAnJztcbiAgICAgICAgICBjb25zdCBsYXN0NCA9IGNhcmRTb3VyY2UubGFzdDQgfHwgJyc7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgc2Vzc2lvblxuICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgaW5zZXJ0ID0ge1xuICAgICAgICAgICAgLi4ucGF5bWVudENhcmQsXG4gICAgICAgICAgICBfa2V5OiBjcmVhdGVIYXNoKGB1c2VyLXBheW1lbnQtJHtzZXNzaW9uSWR9YCksXG4gICAgICAgICAgICBhY2NvdW50TnVtYmVyOiBsYXN0NCxcbiAgICAgICAgICAgIGFkZGVkOiBub3csXG4gICAgICAgICAgICBicmFuZCxcbiAgICAgICAgICAgIGN2Y0NoZWNrLFxuICAgICAgICAgICAgZXhwTW9udGgsXG4gICAgICAgICAgICBleHBZZWFyLFxuICAgICAgICAgICAgbW9kaWZpZWQ6IG5vdyxcbiAgICAgICAgICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBpbnNlcnRBcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gY3JlZGl0Q2FyZHMgUkVUVVJOIE5FV2A7XG5cbiAgICAgICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShpbnNlcnRBcWxRcnkpXG4gICAgICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAgICAgLnRoZW4oKG5ld0NhcmQ6IFBheW1lbnRDYXJkVHlwZSkgPT4ge1xuICAgICAgICAgICAgICBpZihuZXdDYXJkKSB7XG4gICAgICAgICAgICAgICAgLy8gQWRkIGxpbmtlZCBlZGdlXG4gICAgICAgICAgICAgICAgY29uc3Qge19pZDogY2FyZElkLCBfa2V5OiBjYXJkS2V5fSA9IGNhcmQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRnZUNvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gdXNlRGIoZGF0YWJhc2VOYW1lKS5jb2xsZWN0aW9uKCdoYXNQYXltZW50Jyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRnZUlkID0gY3JlYXRlSGFzaChgcGF5bWVudC0ke2NhcmRLZXl9YCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRnZSA9IHtcbiAgICAgICAgICAgICAgICAgIF9mcm9tOiBgdXNlcnMvJHtzZXNzaW9uSWR9YCxcbiAgICAgICAgICAgICAgICAgIF9rZXk6IGVkZ2VJZCxcbiAgICAgICAgICAgICAgICAgIF90bzogY2FyZElkXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBlZGdlQ29sbGVjdGlvbi5zYXZlKGVkZ2UsIHtyZXR1cm5OZXc6IHRydWV9KS50aGVuKCgpID0+IGNhcmQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIG5ld0NhcmQ7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdwYXltZW50X2Vycm9yJ1xuICAgICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVDcmVkaXRDYXJkID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGNhcmQ6IFBheW1lbnRDYXJkVHlwZSk6IFByb21pc2U8UGF5bWVudENhcmRUeXBlPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcblxuICBjb25zdCB7XG4gICAgY2l0eSxcbiAgICBjb3VudHJ5LFxuICAgIGV4cE1vbnRoLFxuICAgIGV4cFllYXIsXG4gICAgZnVsbE5hbWUsXG4gICAgaWQsXG4gICAgc3RyZWV0MSxcbiAgICBzdGF0ZSxcbiAgICB6aXBcbiAgfTogUGF5bWVudENhcmRUeXBlID0gY2FyZDtcblxuICBjb25zdCBmb3JtYXRJZCA9IHBhcnNlSWQoaWQpO1xuXG4gIGlmKGZvcm1hdElkKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfY3JlZGl0X2NhcmRfaWQnKTtcbiAgfVxuXG4gIGNvbnN0IHBheW1lbnRDYXJkOiBQYXltZW50Q2FyZFR5cGUgPSB7fTtcbiAgY29uc3QgZm9ybWF0RXhwTW9udGggPSBwYXJzZU51bShleHBNb250aCwgMik7XG4gIGNvbnN0IGZvcm1hdEV4cFllYXIgPSBwYXJzZU51bShleHBZZWFyLCAyKTtcbiAgY29uc3QgZm9ybWF0Q2l0eSA9IHBhcnNlVmFyQ2hhcihjaXR5LCAzMik7XG4gIGNvbnN0IGZvcm1hdENvdW50cnkgPSBwYXJzZUNoYXIoY291bnRyeSwgMik7XG4gIGNvbnN0IGZvcm1hdEZ1bGxOYW1lID0gcGFyc2VWYXJDaGFyKGZ1bGxOYW1lLCAzMik7XG4gIGNvbnN0IGZvcm1hdFN0cmVldDEgPSBwYXJzZVN0cmluZyhzdHJlZXQxLCAzMik7XG4gIGNvbnN0IGZvcm1hdFN0YXRlID0gcGFyc2VDaGFyKHN0YXRlLCAyKTtcbiAgY29uc3QgZm9ybWF0WmlwID0gcGFyc2VWYXJDaGFyKHppcCwgMTApO1xuXG4gIGlmKGZvcm1hdEV4cE1vbnRoKSB7XG4gICAgcGF5bWVudENhcmQuZXhwTW9udGggPSBmb3JtYXRFeHBNb250aDtcbiAgfVxuXG4gIGlmKGZvcm1hdEV4cFllYXIpIHtcbiAgICBwYXltZW50Q2FyZC5leHBZZWFyID0gZm9ybWF0RXhwWWVhcjtcbiAgfVxuXG4gIGlmKGZvcm1hdENpdHkpIHtcbiAgICBwYXltZW50Q2FyZC5jaXR5ID0gZm9ybWF0Q2l0eTtcbiAgfVxuXG4gIGlmKGZvcm1hdENvdW50cnkpIHtcbiAgICBwYXltZW50Q2FyZC5jb3VudHJ5ID0gZm9ybWF0Q291bnRyeTtcbiAgfVxuXG4gIGlmKGZvcm1hdEZ1bGxOYW1lKSB7XG4gICAgcGF5bWVudENhcmQuZnVsbE5hbWUgPSBmb3JtYXRGdWxsTmFtZTtcbiAgfVxuXG4gIGlmKGZvcm1hdFN0cmVldDEpIHtcbiAgICBwYXltZW50Q2FyZC5zdHJlZXQxID0gZm9ybWF0U3RyZWV0MTtcbiAgfVxuXG4gIGlmKGZvcm1hdFN0YXRlKSB7XG4gICAgcGF5bWVudENhcmQuc3RhdGUgPSBmb3JtYXRTdGF0ZTtcbiAgfVxuXG4gIGlmKGZvcm1hdFppcCkge1xuICAgIHBheW1lbnRDYXJkLnppcCA9IGZvcm1hdFppcDtcbiAgfVxuXG4gIGNvbnN0IHVwZGF0ZSA9IHBheW1lbnRDYXJkO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgICAgTEVUIHVwZGF0ZWRDYXJkID0gRklSU1QoXG4gICAgICAgIEZPUiBjIElOIGNyZWRpdENhcmRzXG4gICAgICAgIEZJTFRFUiBjLl9rZXkgPT0gJHtmb3JtYXRJZH0gJiYgYy51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgICAgIFVQREFURSBjIFdJVEggJHt1cGRhdGV9IElOIGNyZWRpdENhcmRzXG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIE5FV1xuICAgICAgKVxuICAgICAgTEVUIHVzZXIgPSBGSVJTVChcbiAgICAgICAgRk9SIHUgSU4gdXNlcnNcbiAgICAgICAgRklMVEVSIHUuX2tleSA9PSAke3Nlc3Npb25JZH1cbiAgICAgICAgTElNSVQgMVxuICAgICAgICBSRVRVUk4gdVxuICAgICAgKVxuICAgICAgUkVUVVJOIHt1c2VyOiB1c2VyLCBjYXJkOiB1cGRhdGVkQ2FyZH1gO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChyZXN1bHRzID0ge2NhcmQ6IHt9LCB1c2VyOiB7fX0pID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRDYXJkOiBQYXltZW50Q2FyZFR5cGUgPSByZXN1bHRzLmNhcmQ7XG4gICAgICBjb25zdCB7dXNlcn0gPSByZXN1bHRzO1xuXG4gICAgICBpZighdXBkYXRlZENhcmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcignbm90X2ZvdW5kJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtzdHJpcGVDdXN0b21lcklkfSA9IHVzZXI7XG4gICAgICBjb25zdCB7c3RyaXBlSWR9ID0gY2FyZDtcbiAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IGdldFN0cmlwZUNsaWVudCgpO1xuICAgICAgY29uc3QgdXBkYXRlOiBzdHJpcGUuQ3VzdG9tZXJVcGRhdGVTb3VyY2VQYXJhbXMgPSB7XG4gICAgICAgIGFkZHJlc3NfY2l0eTogZm9ybWF0Q2l0eSxcbiAgICAgICAgYWRkcmVzc19jb3VudHJ5OiBmb3JtYXRDb3VudHJ5LFxuICAgICAgICBhZGRyZXNzX2xpbmUxOiBmb3JtYXRTdHJlZXQxLFxuICAgICAgICBhZGRyZXNzX3N0YXRlOiBmb3JtYXRTdGF0ZSxcbiAgICAgICAgYWRkcmVzc196aXA6IGZvcm1hdFppcCxcbiAgICAgICAgZXhwX21vbnRoOiBmb3JtYXRFeHBNb250aC50b1N0cmluZygpLFxuICAgICAgICBleHBfeWVhcjogZm9ybWF0RXhwWWVhci50b1N0cmluZygpLFxuICAgICAgICBuYW1lOiBmb3JtYXRGdWxsTmFtZVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHN0cmlwZUNsaWVudC5jdXN0b21lcnNcbiAgICAgICAgLnVwZGF0ZVNvdXJjZShzdHJpcGVDdXN0b21lcklkLCBzdHJpcGVJZCwgdXBkYXRlKVxuICAgICAgICAudGhlbigoKSA9PiBjYXJkKVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdwYXltZW50czo6dXBkYXRlQ2FyZDo6ZXJyb3InLCBlcnJvcik7XG4gICAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncGF5bWVudF9lcnJvcicpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDcmVkaXRDYXJkcyA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxQYXltZW50Q2FyZFR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0Q3JlZGl0Q2FyZHMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGMgSU4gY3JlZGl0Q2FyZHNcbiAgICBGSUxURVIgYy51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgUkVUVVJOIGNgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKGxpc3Q6IFBheW1lbnRDYXJkVHlwZVtdID0gW10pID0+IGxpc3QpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlQ3JlZGl0Q2FyZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBjYXJkSWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdENhcmRJZCA9IHBhcnNlSWQoY2FyZElkKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBMRVQgY2FyZCA9IEZJUlNUKFxuICAgICAgRk9SIGMgSU4gY3JlZGl0Q2FyZHNcbiAgICAgIEZJTFRFUiBjLl9rZXkgPT0gJHtmb3JtYXRDYXJkSWR9ICYmIGMudXNlcklkID09ICR7c2Vzc2lvbklkfVxuICAgICAgTElNSVQgMVxuICAgICAgUkVNT1ZFIGMgSU4gY3JlZGl0Q2FyZHNcbiAgICAgIFJFVFVSTiBPTERcbiAgICApXG4gICAgTEVUIHVzZXIgPSBGSVJTVChcbiAgICAgIEZPUiB1IElOIHVzZXJzXG4gICAgICBGSUxURVIgdS5fa2V5ID09ICR7c2Vzc2lvbklkfVxuICAgICAgTElNSVQgMVxuICAgICAgUkVUVVJOIHVcbiAgICApXG4gICAgUkVUVVJOIHt1c2VyOiB1c2VyLCBjYXJkOiBjYXJkfWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHJlc3VsdCA9IHtjYXJkOiB7fSwgdXNlcjoge319KSA9PiB7XG4gICAgICBpZighcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge2NhcmQsIHVzZXJ9ID0gcmVzdWx0O1xuICAgICAgY29uc3Qge19rZXk6IGNhcmRLZXl9ID0gY2FyZDtcblxuICAgICAgLy8gUmVtb3ZlIGxpbmtlZCBlZGdlc1xuICAgICAgY29uc3QgZWRnZUNvbGxlY3Rpb24gPSB1c2VEYihkYXRhYmFzZU5hbWUpLmNvbGxlY3Rpb24oJ2hhc1BheW1lbnQnKTtcblxuICAgICAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLm91dEVkZ2VzKGNhcmRLZXksIHt9KVxuICAgICAgICAudGhlbihhc3luYyAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAvLyBFeHRyYWN0IGVkZ2VzIGZyb20gdGhlIHJlc3BvbnNlXG4gICAgICAgICAgY29uc3QgZWRnZXMgPSBBcnJheS5pc0FycmF5KHJlc3BvbnNlKSA/IHJlc3BvbnNlIDogW107XG5cbiAgICAgICAgICBpZihlZGdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICBlZGdlcy5tYXAoKGVkZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7X2tleTogZWRnZUtleX0gPSBlZGdlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZUFxbFFyeTogQXFsUXVlcnkgPSBhcWxgUkVNT1ZFIHtfa2V5OiR7ZWRnZUtleX19IElOIGhhc1BheW1lbnRgO1xuICAgICAgICAgICAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KHJlbW92ZUFxbFFyeSk7XG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gU3RyaXBlXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gZ2V0U3RyaXBlQ2xpZW50KCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgICAgICAgICAgICAgICAgLmRlbGV0ZVNvdXJjZSh1c2VyLnN0cmlwZUN1c3RvbWVySWQsIGNhcmQuc3RyaXBlSWQpXG4gICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3BheW1lbnRzOjpkZWxldGVDYXJkOjplcnJvcicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncGF5bWVudF9lcnJvcicpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZUJhbmtBY2NvdW50ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGJhbmtJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcblxuICAvLyBDbGVhbiBkYlxuICBjb25zdCB1cGRhdGU6IFVzZXJUeXBlID0ge1xuICAgIGJhbmtBY2NvdW50OiAnJyxcbiAgICBiYW5rRnVsbE5hbWU6ICcnLFxuICAgIGJhbmtJZDogJycsXG4gICAgYmFua1JvdXRpbmc6ICcnLFxuICAgIG1vZGlmaWVkOiBEYXRlLm5vdygpXG4gIH07XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFICR7c2Vzc2lvbklkfSBXSVRIICR7dXBkYXRlfSBJTiB1c2VycyBMSU1JVCAxIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1c2VyOiBVc2VyVHlwZSkgPT4ge1xuICAgICAgY29uc3Qge3N0cmlwZUFjY291bnRJZH0gPSB1c2VyO1xuICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gZ2V0U3RyaXBlQ2xpZW50KCk7XG5cbiAgICAgIHJldHVybiBzdHJpcGVDbGllbnQuY3VzdG9tZXJzXG4gICAgICAgIC5kZWxldGVTb3VyY2Uoc3RyaXBlQWNjb3VudElkLCBiYW5rSWQpXG4gICAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAgIC5jYXRjaCgoKSA9PiBQcm9taXNlLnJlc29sdmUoZmFsc2UpKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVQYXltZW50VHJhbnNmZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdHJhbnNmZXI6IFBheW1lbnRUcmFuc2Zlcik6IFByb21pc2U8UGF5bWVudFRyYW5zZmVyPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2Ftb3VudCwgY3VycmVuY3l9ID0gdHJhbnNmZXI7XG4gIGNvbnN0IGZvcm1hdEFtb3VudCA9IHBhcnNlTnVtKGFtb3VudCk7XG4gIGNvbnN0IGZvcm1hdEN1cnJlbmN5ID0gcGFyc2VDaGFyKGN1cnJlbmN5LCAzLCAnVVNEJykudG9VcHBlckNhc2UoKTtcblxuICByZXR1cm4gZ2V0VXNlckJ5SWQoY29udGV4dCwge3VzZXJJZDogc2Vzc2lvbklkfSlcbiAgICAudGhlbigodXNlcjogVXNlclR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHtzdHJpcGVBY2NvdW50SWR9ID0gdXNlcjtcbiAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IGdldFN0cmlwZUNsaWVudCgpO1xuXG4gICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LnRyYW5zZmVyc1xuICAgICAgICAuY3JlYXRlKHtcbiAgICAgICAgICBhbW91bnQ6IGZvcm1hdEFtb3VudCxcbiAgICAgICAgICBjdXJyZW5jeTogZm9ybWF0Q3VycmVuY3ksXG4gICAgICAgICAgZGVzdGluYXRpb246IHN0cmlwZUFjY291bnRJZFxuICAgICAgICB9KVxuICAgICAgICAudGhlbigoc3RyaXBlVHJhbnNmZXIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhzdHJpcGVUcmFuc2Zlcik7XG4gICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCBpbnNlcnQ6IFBheW1lbnRUcmFuc2ZlciA9IHtcbiAgICAgICAgICAgIGFkZGVkOiBub3csXG4gICAgICAgICAgICBhbW91bnQ6IGZvcm1hdEFtb3VudCxcbiAgICAgICAgICAgIGN1cnJlbmN5OiBmb3JtYXRDdXJyZW5jeSxcbiAgICAgICAgICAgIG1vZGlmaWVkOiBub3csXG4gICAgICAgICAgICB1c2VySWQ6IHNlc3Npb25JZFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIHRyYW5zZmVycyBSRVRVUk4gTkVXYDtcblxuICAgICAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgICAgICAudGhlbigobmV3VHJhbnNmZXI6IFBheW1lbnRUcmFuc2ZlcikgPT4gbmV3VHJhbnNmZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVQYXltZW50SG9sZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBwYXltZW50OiBQYXltZW50Q2hhcmdlKTogUHJvbWlzZTxQYXltZW50Q2hhcmdlPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2Ftb3VudCwgY2FwdHVyZSwgY2FyZElkLCBjdXJyZW5jeSwgZGVzY3JpcHRpb259ID0gcGF5bWVudDtcbiAgY29uc3QgZm9ybWF0Q3VycmVuY3kgPSBwYXJzZUNoYXIoY3VycmVuY3ksIDMsICdVU0QnKS50b1VwcGVyQ2FzZSgpO1xuICBjb25zdCBzdHJpcGVDbGllbnQgPSBnZXRTdHJpcGVDbGllbnQoKTtcblxuICByZXR1cm4gc3RyaXBlQ2xpZW50LmNoYXJnZXNcbiAgICAuY3JlYXRlKHtcbiAgICAgIGFtb3VudCxcbiAgICAgIGNhcHR1cmUsXG4gICAgICBjdXJyZW5jeTogZm9ybWF0Q3VycmVuY3ksXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIHNvdXJjZTogY2FyZElkXG4gICAgfSlcbiAgICAudGhlbigoc3RyaXBlQ2hhcmdlKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgaW5zZXJ0OiBQYXltZW50Q2hhcmdlID0ge1xuICAgICAgICBhZGRlZDogbm93LFxuICAgICAgICBhbW91bnQsXG4gICAgICAgIGNhcHR1cmUsXG4gICAgICAgIGNhcmRJZCxcbiAgICAgICAgY2hhcmdlRmFpbENvZGU6IHN0cmlwZUNoYXJnZS5mYWlsdXJlX2NvZGUsXG4gICAgICAgIGNoYXJnZUZhaWxNc2c6IHN0cmlwZUNoYXJnZS5mYWlsdXJlX21lc3NhZ2UsXG4gICAgICAgIGNoYXJnZUlkOiBzdHJpcGVDaGFyZ2UuaWQsXG4gICAgICAgIGNoYXJnZVN0YXR1czogc3RyaXBlQ2hhcmdlLnN0YXR1cyxcbiAgICAgICAgY3VycmVuY3k6IGZvcm1hdEN1cnJlbmN5LFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgbW9kaWZpZWQ6IG5vdyxcbiAgICAgICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgICAgIH07XG4gICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gcGF5bWVudHMgUkVUVVJOIE5FV2A7XG5cbiAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgLnRoZW4oKG5ld1BheW1lbnQ6IFBheW1lbnRDaGFyZ2UpID0+IG5ld1BheW1lbnQpO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdwYXltZW50czo6Y3JlYXRlSG9sZDo6ZXJyb3InLCBlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdwYXltZW50X2Vycm9yJyk7XG4gICAgfSk7XG59O1xuXG5pbnRlcmZhY2UgQ2FyZCB7XG4gIGlkOiBzdHJpbmc7XG4gIGJyYW5kPzogc3RyaW5nO1xuICBjdmNfY2hlY2s/OiBzdHJpbmc7XG4gIGxhc3Q0Pzogc3RyaW5nO1xufVxuXG5jb25zdCBlbnN1cmVTdHJpcGVDdXN0b21lcklkID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBjb25zdCBzZXNzaW9uSWQgPSBTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKTtcbiAgbGV0IHVzZXIgPSBhd2FpdCBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiBzZXNzaW9uSWR9KTtcblxuICBpZighdXNlcj8uc3RyaXBlQ3VzdG9tZXJJZCkge1xuICAgIGF3YWl0IGFkZEN1c3RvbWVyQWNjb3VudChjb250ZXh0KTtcbiAgICB1c2VyID0gYXdhaXQgZ2V0VXNlckJ5SWQoY29udGV4dCwge3VzZXJJZDogc2Vzc2lvbklkfSk7XG4gIH1cblxuICByZXR1cm4gU3RyaW5nKHVzZXI/LnN0cmlwZUN1c3RvbWVySWQgfHwgJycpO1xufTtcblxuY29uc3QgcGFyc2VDYXJkTnVtYmVyID0gKGFjY291bnROdW1iZXI/OiBzdHJpbmcpOiBzdHJpbmcgPT4gU3RyaW5nKGFjY291bnROdW1iZXIgfHwgJycpLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG5cbmNvbnN0IHBhcnNlQ2FyZEV4cFllYXIgPSAoZXhwWWVhcj86IG51bWJlciB8IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGNvbnN0IHBhcnNlZFllYXIgPSBwYXJzZU51bShleHBZZWFyLCA0KTtcblxuICBpZighcGFyc2VkWWVhcikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlZFllYXIgPCAxMDAgPyAyMDAwICsgcGFyc2VkWWVhciA6IHBhcnNlZFllYXI7XG59O1xuXG5jb25zdCBlbnN1cmVQbHVzU3RyaXBlUGxhbiA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBjb25zdCBzdHJpcGVDbGllbnQgPSBnZXRTdHJpcGVDbGllbnQoKTtcblxuICB0cnkge1xuICAgIGF3YWl0IHN0cmlwZUNsaWVudC5wbGFucy5yZXRyaWV2ZShQTFVTX1BMQU5fSUQpO1xuICAgIHJldHVybiBQTFVTX1BMQU5fSUQ7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBhd2FpdCBzdHJpcGVDbGllbnQucGxhbnMuY3JlYXRlKHtcbiAgICAgIGFtb3VudDogUExVU19QTEFOX0FNT1VOVCxcbiAgICAgIGN1cnJlbmN5OiAndXNkJyxcbiAgICAgIGlkOiBQTFVTX1BMQU5fSUQsXG4gICAgICBpbnRlcnZhbDogJ21vbnRoJyxcbiAgICAgIGludGVydmFsX2NvdW50OiAxLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgcGxhbklkOiAncGx1cycsXG4gICAgICAgIHR5cGU6ICdhY2NvdW50J1xuICAgICAgfSxcbiAgICAgIHByb2R1Y3Q6IHtcbiAgICAgICAgbmFtZTogJ1BoYW50YXplIFBsdXMnXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gUExVU19QTEFOX0lEO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgdXBncmFkZVVzZXJUb1BsdXMgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3VwZ3JhZGVVc2VyVG9QbHVzJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfSA9IHt9fSA9IGNvbnRleHQ7XG5cbiAgaWYoIXNlc3Npb25JZCkge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ2ludmFsaWRfc2Vzc2lvbicpO1xuICB9XG5cbiAgY29uc3QgY3VycmVudFVzZXIgPSBhd2FpdCBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiBzZXNzaW9uSWR9KTtcblxuICBpZihoYXNBY2Nlc3NMZXZlbChjdXJyZW50VXNlciwgUExVU19QTEFOX0FDQ0VTUykgJiYgY3VycmVudFVzZXI/LnBsYW5TdWJzY3JpcHRpb25JZCkge1xuICAgIHJldHVybiBjdXJyZW50VXNlcjtcbiAgfVxuXG4gIGlmKCFjdXJyZW50VXNlcj8uc3RyaXBlQ2FyZElkKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfYmlsbGluZ19jYXJkJyk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHN0cmlwZUN1c3RvbWVySWQgPSBhd2FpdCBlbnN1cmVTdHJpcGVDdXN0b21lcklkKGNvbnRleHQpO1xuXG4gICAgaWYoIXN0cmlwZUN1c3RvbWVySWQpIHtcbiAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3BheW1lbnRfZXJyb3InKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHJpcGVQbGFuSWQgPSBhd2FpdCBlbnN1cmVQbHVzU3RyaXBlUGxhbigpO1xuICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IGdldFN0cmlwZUNsaWVudCgpO1xuICAgIGNvbnN0IHN0cmlwZVN1YnNjcmlwdGlvbiA9IGF3YWl0IHN0cmlwZUNsaWVudC5zdWJzY3JpcHRpb25zLmNyZWF0ZSh7XG4gICAgICBjdXN0b21lcjogc3RyaXBlQ3VzdG9tZXJJZCxcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwbGFuOiBzdHJpcGVQbGFuSWRcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHBsYW5JZDogJ3BsdXMnLFxuICAgICAgICB0eXBlOiAnYWNjb3VudCcsXG4gICAgICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3Qgc3RyaXBlUGVyaW9kRW5kID0gTnVtYmVyKChzdHJpcGVTdWJzY3JpcHRpb24gYXMgYW55KT8uY3VycmVudF9wZXJpb2RfZW5kIHx8IDApO1xuICAgIGNvbnN0IHVwZGF0ZTogUGFydGlhbDxVc2VyVHlwZT4gPSB7XG4gICAgICBtb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICAgIHBsYW5FeHBpcmVzOiBzdHJpcGVQZXJpb2RFbmQgPyBzdHJpcGVQZXJpb2RFbmQgKiAxMDAwIDogMCxcbiAgICAgIHBsYW5JZDogJ3BsdXMnLFxuICAgICAgcGxhblN0YXR1czogU3RyaW5nKHN0cmlwZVN1YnNjcmlwdGlvbi5zdGF0dXMgfHwgJ2FjdGl2ZScpLFxuICAgICAgcGxhblN1YnNjcmlwdGlvbklkOiBzdHJpcGVTdWJzY3JpcHRpb24uaWQsXG4gICAgICB1c2VyQWNjZXNzOiBQTFVTX1BMQU5fQUNDRVNTXG4gICAgfTtcbiAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke3Nlc3Npb25JZH0gV0lUSCAke3VwZGF0ZX0gSU4gdXNlcnMgTElNSVQgMSBSRVRVUk4gTkVXYDtcblxuICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAudGhlbigodXNlcjogVXNlclR5cGUpID0+IHVzZXIpO1xuICB9IGNhdGNoKGVycm9yOiBhbnkpIHtcbiAgICBhd2FpdCBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAncGF5bWVudF9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncGF5bWVudF9lcnJvcicpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2F2ZVVzZXJCaWxsaW5nQ2FyZCA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCBjYXJkOiBQYXltZW50Q2FyZFR5cGUpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdzYXZlVXNlckJpbGxpbmdDYXJkJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHN0cmlwZUN1c3RvbWVySWQgPSBhd2FpdCBlbnN1cmVTdHJpcGVDdXN0b21lcklkKGNvbnRleHQpO1xuXG4gIGlmKCFzdHJpcGVDdXN0b21lcklkIHx8ICFzZXNzaW9uSWQpIHtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdwYXltZW50X2Vycm9yJyk7XG4gIH1cblxuICBjb25zdCBmb3JtYXROdW1iZXIgPSBwYXJzZUNhcmROdW1iZXIoY2FyZD8uYWNjb3VudE51bWJlcik7XG5cbiAgaWYoZm9ybWF0TnVtYmVyLmxlbmd0aCA8IDEyIHx8IGZvcm1hdE51bWJlci5sZW5ndGggPiAxOSkge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX2NyZWRpdF9jYXJkX251bWJlcicpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0RXhwTW9udGggPSBwYXJzZU51bShjYXJkPy5leHBNb250aCwgMik7XG5cbiAgaWYoIWZvcm1hdEV4cE1vbnRoKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfY3JlZGl0X2NhcmRfZXhwX21vbnRoJyk7XG4gIH1cblxuICBjb25zdCBmb3JtYXRFeHBZZWFyID0gcGFyc2VDYXJkRXhwWWVhcihjYXJkPy5leHBZZWFyKTtcblxuICBpZighZm9ybWF0RXhwWWVhcikge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX2NyZWRpdF9jYXJkX2V4cF95ZWFyJyk7XG4gIH1cblxuICBjb25zdCBmb3JtYXRDdmMgPSBTdHJpbmcoY2FyZD8uY3ZjIHx8ICcnKS5yZXBsYWNlKC9cXEQvZywgJycpO1xuXG4gIGlmKGZvcm1hdEN2Yy5sZW5ndGggPCAzIHx8IGZvcm1hdEN2Yy5sZW5ndGggPiA0KSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfY3JlZGl0X2NhcmRfY3ZjJyk7XG4gIH1cblxuICBjb25zdCBzdHJpcGVDbGllbnQgPSBnZXRTdHJpcGVDbGllbnQoKTtcbiAgY29uc3QgY3VycmVudFVzZXIgPSBhd2FpdCBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiBzZXNzaW9uSWR9KTtcbiAgY29uc3QgY3VycmVudFN0cmlwZUNhcmRJZCA9IFN0cmluZyhjdXJyZW50VXNlcj8uc3RyaXBlQ2FyZElkIHx8ICcnKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgc3RyaXBlQ2xpZW50LnRva2Vucy5jcmVhdGUoe1xuICAgICAgY2FyZDoge1xuICAgICAgICBjdmM6IGZvcm1hdEN2YyxcbiAgICAgICAgZXhwX21vbnRoOiBTdHJpbmcoZm9ybWF0RXhwTW9udGgpLFxuICAgICAgICBleHBfeWVhcjogU3RyaW5nKGZvcm1hdEV4cFllYXIpLFxuICAgICAgICBuYW1lOiBTdHJpbmcoY2FyZD8uZnVsbE5hbWUgfHwgJycpLnRyaW0oKSB8fCB1bmRlZmluZWQsXG4gICAgICAgIG51bWJlcjogZm9ybWF0TnVtYmVyXG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgbmV3U291cmNlID0gYXdhaXQgc3RyaXBlQ2xpZW50LmN1c3RvbWVycy5jcmVhdGVTb3VyY2Uoc3RyaXBlQ3VzdG9tZXJJZCwge3NvdXJjZTogdG9rZW4uaWR9KTtcbiAgICBjb25zdCBjYXJkU291cmNlID0gbmV3U291cmNlIGFzIHVua25vd24gYXMgQ2FyZDtcbiAgICBjb25zdCBicmFuZCA9IFN0cmluZyhjYXJkU291cmNlLmJyYW5kIHx8ICcnKS50cmltKCk7XG4gICAgY29uc3QgbGFzdDQgPSBTdHJpbmcoY2FyZFNvdXJjZS5sYXN0NCB8fCAnJykudHJpbSgpO1xuICAgIGNvbnN0IHN0cmlwZUNhcmRJZCA9IFN0cmluZyhjYXJkU291cmNlLmlkIHx8ICcnKS50cmltKCk7XG5cbiAgICBhd2FpdCBzdHJpcGVDbGllbnQuY3VzdG9tZXJzLnVwZGF0ZShzdHJpcGVDdXN0b21lcklkLCB7ZGVmYXVsdF9zb3VyY2U6IHN0cmlwZUNhcmRJZH0pO1xuXG4gICAgaWYoY3VycmVudFN0cmlwZUNhcmRJZCAmJiBjdXJyZW50U3RyaXBlQ2FyZElkICE9PSBzdHJpcGVDYXJkSWQpIHtcbiAgICAgIGF3YWl0IHN0cmlwZUNsaWVudC5jdXN0b21lcnMuZGVsZXRlU291cmNlKHN0cmlwZUN1c3RvbWVySWQsIGN1cnJlbnRTdHJpcGVDYXJkSWQpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZTogUGFydGlhbDxVc2VyVHlwZT4gPSB7XG4gICAgICBtb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICAgIHN0cmlwZUNhcmRCcmFuZDogYnJhbmQsXG4gICAgICBzdHJpcGVDYXJkSWQsXG4gICAgICBzdHJpcGVDYXJkTGFzdDQ6IGxhc3Q0XG4gICAgfTtcbiAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke3Nlc3Npb25JZH0gV0lUSCAke3VwZGF0ZX0gSU4gdXNlcnMgTElNSVQgMSBSRVRVUk4gTkVXYDtcbiAgICBjb25zdCB1cGRhdGVkVXNlciA9IGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgIC50aGVuKCh1c2VyOiBVc2VyVHlwZSkgPT4gdXNlcik7XG5cbiAgICByZXR1cm4gdXBkYXRlZFVzZXI7XG4gIH0gY2F0Y2goZXJyb3I6IGFueSkge1xuICAgIGF3YWl0IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdwYXltZW50X2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdwYXltZW50X2Vycm9yJyk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVVc2VyQmlsbGluZ0NhcmQgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2RlbGV0ZVVzZXJCaWxsaW5nQ2FyZCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH0gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCBjdXJyZW50VXNlciA9IGF3YWl0IGdldFVzZXJCeUlkKGNvbnRleHQsIHt1c2VySWQ6IHNlc3Npb25JZH0pO1xuICBjb25zdCBzdHJpcGVDdXN0b21lcklkID0gU3RyaW5nKGN1cnJlbnRVc2VyPy5zdHJpcGVDdXN0b21lcklkIHx8ICcnKTtcbiAgY29uc3Qgc3RyaXBlQ2FyZElkID0gU3RyaW5nKGN1cnJlbnRVc2VyPy5zdHJpcGVDYXJkSWQgfHwgJycpO1xuICBjb25zdCBzdHJpcGVDbGllbnQgPSBnZXRTdHJpcGVDbGllbnQoKTtcblxuICB0cnkge1xuICAgIGlmKHN0cmlwZUN1c3RvbWVySWQgJiYgc3RyaXBlQ2FyZElkKSB7XG4gICAgICBhd2FpdCBzdHJpcGVDbGllbnQuY3VzdG9tZXJzLmRlbGV0ZVNvdXJjZShzdHJpcGVDdXN0b21lcklkLCBzdHJpcGVDYXJkSWQpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZTogUGFydGlhbDxVc2VyVHlwZT4gPSB7XG4gICAgICBtb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICAgIHN0cmlwZUNhcmRCcmFuZDogJycsXG4gICAgICBzdHJpcGVDYXJkSWQ6ICcnLFxuICAgICAgc3RyaXBlQ2FyZExhc3Q0OiAnJ1xuICAgIH07XG4gICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHtzZXNzaW9uSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzIExJTUlUIDEgUkVUVVJOIE5FV2A7XG5cbiAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgLnRoZW4oKHVzZXI6IFVzZXJUeXBlKSA9PiB1c2VyKTtcbiAgfSBjYXRjaChlcnJvcjogYW55KSB7XG4gICAgYXdhaXQgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ3BheW1lbnRfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3BheW1lbnRfZXJyb3InKTtcbiAgfVxufTtcbiJdLCJuYW1lcyI6WyJwYXJzZU51bSIsImNyZWF0ZUhhc2giLCJwYXJzZUNoYXIiLCJwYXJzZUlkIiwicGFyc2VTdHJpbmciLCJwYXJzZVZhckNoYXIiLCJhcWwiLCJFcnJvclR5cGVzIiwibG9nRXJyb3IiLCJVc2VyRXJyb3IiLCJ1c2VEYiIsImhhc0FjY2Vzc0xldmVsIiwiZ2V0U3RyaXBlQ2xpZW50IiwiZ2V0VXNlckJ5SWQiLCJldmVudENhdGVnb3J5IiwiUExVU19QTEFOX0lEIiwiUExVU19QTEFOX0FNT1VOVCIsIlBMVVNfUExBTl9BQ0NFU1MiLCJhZGRDdXN0b21lckFjY291bnQiLCJjb250ZXh0IiwiYWN0aW9uIiwiZGF0YWJhc2VOYW1lIiwic2Vzc2lvbiIsInVzZXJJZCIsInNlc3Npb25JZCIsInVzZXJuYW1lIiwic3RyaXBlQ2xpZW50IiwiY3VzdG9tZXJzIiwiY3JlYXRlIiwibWV0YWRhdGEiLCJ0aGVuIiwiY3VzdG9tZXIiLCJub3ciLCJEYXRlIiwidXBkYXRlIiwibW9kaWZpZWQiLCJzdHJpcGVDdXN0b21lcklkIiwiaWQiLCJhcWxRcnkiLCJxdWVyeSIsImN1cnNvciIsIm5leHQiLCJ1cGRhdGVkVXNlciIsImNhdGNoIiwiZXJyb3IiLCJjYXRlZ29yeSIsImxhYmVsIiwiREFUQUJBU0VfRVJST1IiLCJhZGRCYW5rQWNjb3VudCIsImJhbmtBY2NvdW50IiwiYWNjb3VudE51bWJlciIsImZ1bGxOYW1lIiwicm91dGluZyIsImZvcm1hdEFjY291bnQiLCJmb3JtYXRGdWxsTmFtZSIsImZvcm1hdFJvdXRpbmciLCJ1c2VyIiwic3RyaXBlQWNjb3VudElkIiwidG9rZW5zIiwiYmFua19hY2NvdW50IiwiYWNjb3VudF9ob2xkZXJfbmFtZSIsImFjY291bnRfaG9sZGVyX3R5cGUiLCJhY2NvdW50X251bWJlciIsImNvdW50cnkiLCJjdXJyZW5jeSIsInJvdXRpbmdfbnVtYmVyIiwidG9rZW4iLCJjcmVhdGVTb3VyY2UiLCJzb3VyY2UiLCJhY2NvdW50IiwiYmFua0Z1bGxOYW1lIiwiYmFua0lkIiwiYmFua1JvdXRpbmciLCJtc2ciLCJtZXNzYWdlIiwiYWRkQ3JlZGl0Q2FyZCIsImNhcmQiLCJjaXR5IiwiY3ZjIiwiZXhwTW9udGgiLCJleHBZZWFyIiwic3RyZWV0MSIsInN0cmVldDIiLCJzdGF0ZSIsInppcCIsImZvcm1hdE51bWJlciIsImZvcm1hdEV4cE1vbnRoIiwiZm9ybWF0RXhwWWVhciIsImZvcm1hdEN2YyIsInBheW1lbnRDYXJkIiwiZm9ybWF0Q2l0eSIsImZvcm1hdENvdW50cnkiLCJmb3JtYXRTdHJlZXQxIiwiZm9ybWF0U3RyZWV0MiIsImZvcm1hdFN0YXRlIiwiZm9ybWF0WmlwIiwiYWRkcmVzc19jaXR5IiwiYWRkcmVzc19jb3VudHJ5IiwiYWRkcmVzc19saW5lMSIsImFkZHJlc3NfbGluZTIiLCJhZGRyZXNzX3N0YXRlIiwiYWRkcmVzc196aXAiLCJ0b1N0cmluZyIsImV4cF9tb250aCIsImV4cF95ZWFyIiwibmFtZSIsIm51bWJlciIsIm5ld1NvdXJjZSIsImNhcmRTb3VyY2UiLCJicmFuZCIsImN2Y0NoZWNrIiwiY3ZjX2NoZWNrIiwibGFzdDQiLCJpbnNlcnQiLCJfa2V5IiwiYWRkZWQiLCJpbnNlcnRBcWxRcnkiLCJuZXdDYXJkIiwiX2lkIiwiY2FyZElkIiwiY2FyZEtleSIsImVkZ2VDb2xsZWN0aW9uIiwiY29sbGVjdGlvbiIsImVkZ2VJZCIsImVkZ2UiLCJfZnJvbSIsIl90byIsInNhdmUiLCJyZXR1cm5OZXciLCJ1cGRhdGVDcmVkaXRDYXJkIiwiZm9ybWF0SWQiLCJyZXN1bHRzIiwidXBkYXRlZENhcmQiLCJzdHJpcGVJZCIsInVwZGF0ZVNvdXJjZSIsImNvbnNvbGUiLCJsb2ciLCJnZXRDcmVkaXRDYXJkcyIsImFsbCIsImxpc3QiLCJkZWxldGVDcmVkaXRDYXJkIiwiZm9ybWF0Q2FyZElkIiwicmVzdWx0Iiwib3V0RWRnZXMiLCJyZXNwb25zZSIsImVkZ2VzIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiUHJvbWlzZSIsIm1hcCIsImVkZ2VLZXkiLCJyZW1vdmVBcWxRcnkiLCJkZWxldGVTb3VyY2UiLCJkZWxldGVCYW5rQWNjb3VudCIsInJlc29sdmUiLCJjcmVhdGVQYXltZW50VHJhbnNmZXIiLCJ0cmFuc2ZlciIsImFtb3VudCIsImZvcm1hdEFtb3VudCIsImZvcm1hdEN1cnJlbmN5IiwidG9VcHBlckNhc2UiLCJ0cmFuc2ZlcnMiLCJkZXN0aW5hdGlvbiIsInN0cmlwZVRyYW5zZmVyIiwibmV3VHJhbnNmZXIiLCJjcmVhdGVQYXltZW50SG9sZCIsInBheW1lbnQiLCJjYXB0dXJlIiwiZGVzY3JpcHRpb24iLCJjaGFyZ2VzIiwic3RyaXBlQ2hhcmdlIiwiY2hhcmdlRmFpbENvZGUiLCJmYWlsdXJlX2NvZGUiLCJjaGFyZ2VGYWlsTXNnIiwiZmFpbHVyZV9tZXNzYWdlIiwiY2hhcmdlSWQiLCJjaGFyZ2VTdGF0dXMiLCJzdGF0dXMiLCJuZXdQYXltZW50IiwiZW5zdXJlU3RyaXBlQ3VzdG9tZXJJZCIsIlN0cmluZyIsInBhcnNlQ2FyZE51bWJlciIsInJlcGxhY2UiLCJwYXJzZUNhcmRFeHBZZWFyIiwicGFyc2VkWWVhciIsImVuc3VyZVBsdXNTdHJpcGVQbGFuIiwicGxhbnMiLCJyZXRyaWV2ZSIsImludGVydmFsIiwiaW50ZXJ2YWxfY291bnQiLCJwbGFuSWQiLCJ0eXBlIiwicHJvZHVjdCIsInVwZ3JhZGVVc2VyVG9QbHVzIiwiY3VycmVudFVzZXIiLCJwbGFuU3Vic2NyaXB0aW9uSWQiLCJzdHJpcGVDYXJkSWQiLCJzdHJpcGVQbGFuSWQiLCJzdHJpcGVTdWJzY3JpcHRpb24iLCJzdWJzY3JpcHRpb25zIiwiaXRlbXMiLCJwbGFuIiwic3RyaXBlUGVyaW9kRW5kIiwiTnVtYmVyIiwiY3VycmVudF9wZXJpb2RfZW5kIiwicGxhbkV4cGlyZXMiLCJwbGFuU3RhdHVzIiwidXNlckFjY2VzcyIsInNhdmVVc2VyQmlsbGluZ0NhcmQiLCJjdXJyZW50U3RyaXBlQ2FyZElkIiwidHJpbSIsInVuZGVmaW5lZCIsImRlZmF1bHRfc291cmNlIiwic3RyaXBlQ2FyZEJyYW5kIiwic3RyaXBlQ2FyZExhc3Q0IiwiZGVsZXRlVXNlckJpbGxpbmdDYXJkIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxRQUFRLFFBQU8sK0JBQStCO0FBQ3RELFNBQVFDLFVBQVUsRUFBRUMsU0FBUyxFQUFFQyxPQUFPLEVBQUVDLFdBQVcsRUFBRUMsWUFBWSxRQUFPLCtCQUErQjtBQUN2RyxTQUFRQyxHQUFHLFFBQU8sV0FBVztBQUs3QixTQUFRQyxVQUFVLFFBQU8sMEJBQTBCO0FBR25ELFNBQVFDLFFBQVEsRUFBRUMsU0FBUyxRQUFPLDZCQUE2QjtBQUMvRCxTQUFRQyxLQUFLLFFBQU8sNEJBQTRCO0FBQ2hELFNBQVFDLGNBQWMsUUFBTywyQkFBMkI7QUFDeEQsU0FBUUMsZUFBZSxRQUFPLDBCQUEwQjtBQUN4RCxTQUFRQyxXQUFXLFFBQU8sYUFBYTtBQUl2QyxNQUFNQyxnQkFBZ0I7QUFDdEIsTUFBTUMsZUFBZTtBQUNyQixNQUFNQyxtQkFBbUI7QUFDekIsTUFBTUMsbUJBQW1CO0FBRXpCLE9BQU8sTUFBTUMscUJBQXFCLENBQUNDO0lBQ2pDLE1BQU1DLFNBQVM7SUFDZixNQUFNLEVBQUNDLFlBQVksRUFBRUMsU0FBUyxFQUFDQyxRQUFRQyxTQUFTLEVBQUVD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
606
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL3JlYWt0b3IvcmVha3Rvci9wYWNrYWdlcy9yZWFrdG9yL3NyYy9hY3Rpb25zL3BheW1lbnRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBpcyBzdWJqZWN0IHRvIHRoZSBhY2NvbXBhbnlpbmcgY29tbWVyY2lhbCBMSUNFTlNFLlxuICovXG5pbXBvcnQge3BhcnNlTnVtfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9udW1iZXJzJztcbmltcG9ydCB7cGFyc2VDaGFyLCBwYXJzZUlkLCBwYXJzZVN0cmluZywgcGFyc2VWYXJDaGFyfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuaW1wb3J0IHN0cmlwZSBmcm9tICdzdHJpcGUnO1xuXG5pbXBvcnQge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgudHlwZXMuanMnO1xuaW1wb3J0IHtFcnJvclR5cGVzfSBmcm9tICcuLi90eXBlcy9lcnJvci50eXBlcy5qcyc7XG5pbXBvcnQge0JpbGxpbmdTZXR1cFNlc3Npb25PcHRpb25zLCBQYXltZW50QmFua0FjY291bnQsIFBheW1lbnRDYXJkVHlwZSwgUGF5bWVudENoYXJnZSwgUGF5bWVudFRyYW5zZmVyfSBmcm9tICcuLi90eXBlcy9wYXltZW50cy50eXBlcy5qcyc7XG5pbXBvcnQge1VzZXJUeXBlfSBmcm9tICcuLi90eXBlcy91c2Vycy50eXBlcy5qcyc7XG5pbXBvcnQge2xvZ0Vycm9yLCBVc2VyRXJyb3J9IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljc1V0aWxzLmpzJztcbmltcG9ydCB7dXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMuanMnO1xuaW1wb3J0IHtoYXNBY2Nlc3NMZXZlbH0gZnJvbSAnLi4vdXRpbHMvc2Vzc2lvblV0aWxzLmpzJztcbmltcG9ydCB7Z2V0U3RyaXBlQ2xpZW50fSBmcm9tICcuLi91dGlscy9zdHJpcGVVdGlscy5qcyc7XG5pbXBvcnQge2dldFVzZXJCeUlkfSBmcm9tICcuL3VzZXJzLmpzJztcblxuXG5jb25zdCBldmVudENhdGVnb3J5ID0gJ3BheW1lbnRzJztcbmNvbnN0IFBMVVNfUExBTl9JRCA9ICdwaGFudGF6ZS1wbHVzLW1vbnRobHknO1xuY29uc3QgUExVU19QTEFOX0FNT1VOVCA9IDEwMDA7XG5jb25zdCBQTFVTX1BMQU5fQUNDRVNTID0gMTtcblxuZXhwb3J0IGNvbnN0IGFkZEN1c3RvbWVyQWNjb3VudCA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdhZGRDdXN0b21lckFjY291bnQnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWQsIHVzZXJuYW1lfSA9IHt9fSA9IGNvbnRleHQ7XG5cbiAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gZ2V0U3RyaXBlQ2xpZW50KCk7XG5cbiAgcmV0dXJuIHN0cmlwZUNsaWVudC5jdXN0b21lcnNcbiAgICAuY3JlYXRlKHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHVzZXJJZDogc2Vzc2lvbklkLFxuICAgICAgICB1c2VybmFtZVxuICAgICAgfVxuICAgIH0gYXMgYW55KVxuICAgIC50aGVuKChjdXN0b21lcikgPT4ge1xuICAgICAgLy8gQ3JlYXRlIHNlc3Npb25cbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB1cGRhdGU6IFVzZXJUeXBlID0ge1xuICAgICAgICBtb2RpZmllZDogbm93LFxuICAgICAgICBzdHJpcGVDdXN0b21lcklkOiBjdXN0b21lci5pZFxuICAgICAgfTtcblxuICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHtzZXNzaW9uSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzIExJTUlUIDEgUkVUVVJOIE5FV2A7XG5cbiAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgLnRoZW4oKHVwZGF0ZWRVc2VyOiBVc2VyVHlwZSkgPT4gISF1cGRhdGVkVXNlcilcbiAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZEJhbmtBY2NvdW50ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGJhbmtBY2NvdW50OiBQYXltZW50QmFua0FjY291bnQpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2FkZFBheW1lbnRBY2NvdW50QmFuayc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH0gPSB7fX0gPSBjb250ZXh0O1xuXG4gIC8vIFBhcmFtc1xuICBjb25zdCB7XG4gICAgYWNjb3VudE51bWJlcixcbiAgICBmdWxsTmFtZSxcbiAgICByb3V0aW5nXG4gIH0gPSBiYW5rQWNjb3VudDtcblxuICBjb25zdCBmb3JtYXRBY2NvdW50ID0gcGFyc2VTdHJpbmcoYWNjb3VudE51bWJlciwgMzIpO1xuXG4gIGlmKGZvcm1hdEFjY291bnQgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfYWNjb3VudF9udW1iZXInKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdEZ1bGxOYW1lID0gcGFyc2VWYXJDaGFyKGZ1bGxOYW1lLCAxMjgpO1xuXG4gIGlmKGZvcm1hdEZ1bGxOYW1lID09PSAnJykge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX2Z1bGxfbmFtZScpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0Um91dGluZyA9IHBhcnNlU3RyaW5nKHJvdXRpbmcsIDMyKTtcblxuICBpZihmb3JtYXRSb3V0aW5nID09PSAnJykge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX3JvdXRpbmdfbnVtYmVyJyk7XG4gIH1cblxuICByZXR1cm4gZ2V0VXNlckJ5SWQoY29udGV4dCwge3VzZXJJZDogc2Vzc2lvbklkfSlcbiAgICAudGhlbigodXNlcjogVXNlclR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHtzdHJpcGVBY2NvdW50SWR9ID0gdXNlcjtcbiAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IGdldFN0cmlwZUNsaWVudCgpO1xuXG4gICAgICAvLyBDcmVhdGUgYSB0b2tlbiBmaXJzdCwgdGhlbiB1c2UgdGhlIHRva2VuIGFzIHRoZSBzb3VyY2VcbiAgICAgIHJldHVybiBzdHJpcGVDbGllbnQudG9rZW5zLmNyZWF0ZSh7XG4gICAgICAgIGJhbmtfYWNjb3VudDoge1xuICAgICAgICAgIGFjY291bnRfaG9sZGVyX25hbWU6IGZvcm1hdEZ1bGxOYW1lLFxuICAgICAgICAgIGFjY291bnRfaG9sZGVyX3R5cGU6ICdpbmRpdmlkdWFsJyxcbiAgICAgICAgICBhY2NvdW50X251bWJlcjogZm9ybWF0QWNjb3VudCxcbiAgICAgICAgICBjb3VudHJ5OiAnVVMnLFxuICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgICByb3V0aW5nX251bWJlcjogZm9ybWF0Um91dGluZ1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgICAudGhlbigodG9rZW4pID0+IHN0cmlwZUNsaWVudC5jdXN0b21lcnMuY3JlYXRlU291cmNlKFxuICAgICAgICAgIHN0cmlwZUFjY291bnRJZCxcbiAgICAgICAgICB7c291cmNlOiB0b2tlbi5pZH1cbiAgICAgICAgKSlcbiAgICAgICAgLnRoZW4oKGFjY291bnQpID0+IHtcbiAgICAgICAgICAvLyBVc2UgdHlwZSBhc3NlcnRpb24gZm9yIGNhcmQgcHJvcGVydGllc1xuICAgICAgICAgIC8vIGNvbnN0IGNhcmRTb3VyY2UgPSBhY2NvdW50IGFzIHVua25vd24gYXMgQ2FyZDtcbiAgICAgICAgICAvLyBjb25zdCBicmFuZCA9IGNhcmRTb3VyY2UuYnJhbmQgfHwgJyc7XG4gICAgICAgICAgLy8gY29uc3QgY3ZjQ2hlY2sgPSBjYXJkU291cmNlLmN2Y19jaGVjayB8fCAnJztcbiAgICAgICAgICAvLyBjb25zdCBsYXN0NCA9IGNhcmRTb3VyY2UubGFzdDQgfHwgJyc7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgc2Vzc2lvblxuICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgdXBkYXRlID0ge1xuICAgICAgICAgICAgYmFua0FjY291bnQsXG4gICAgICAgICAgICBiYW5rRnVsbE5hbWU6IGZvcm1hdEZ1bGxOYW1lLFxuICAgICAgICAgICAgYmFua0lkOiBhY2NvdW50LmlkLFxuICAgICAgICAgICAgYmFua1JvdXRpbmc6IGZvcm1hdFJvdXRpbmcsXG4gICAgICAgICAgICBtb2RpZmllZDogbm93XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFICR7c2Vzc2lvbklkfSBXSVRIICR7dXBkYXRlfSBJTiB1c2VycyBMSU1JVCAxIFJFVFVSTiBORVdgO1xuXG4gICAgICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgICAgIC50aGVuKCh1cGRhdGVkVXNlcjogVXNlclR5cGUpID0+IHVwZGF0ZWRVc2VyKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zdCBtc2cgPSBlcnJvci5tZXNzYWdlO1xuXG4gICAgICAgICAgaWYobXNnID09PSAnQSBiYW5rIGFjY291bnQgd2l0aCB0aGF0IHJvdXRpbmcgbnVtYmVyIGFuZCBhY2NvdW50IG51bWJlciAnICtcbiAgICAgICAgICAgICdhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBjdXN0b21lci4nKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgICBsYWJlbDogJ2JhbmtfYWNjb3VudF9leGlzdHMnXG4gICAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgbGFiZWw6ICdwYXltZW50X2Vycm9yJ1xuICAgICAgICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVDcmVkaXRDYXJkID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGNhcmQ6IFBheW1lbnRDYXJkVHlwZSk6IFByb21pc2U8UGF5bWVudENhcmRUeXBlPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcblxuICBjb25zdCB7XG4gICAgY2l0eSxcbiAgICBjb3VudHJ5LFxuICAgIGV4cE1vbnRoLFxuICAgIGV4cFllYXIsXG4gICAgZnVsbE5hbWUsXG4gICAgaWQsXG4gICAgc3RyZWV0MSxcbiAgICBzdGF0ZSxcbiAgICB6aXBcbiAgfTogUGF5bWVudENhcmRUeXBlID0gY2FyZDtcblxuICBjb25zdCBmb3JtYXRJZCA9IHBhcnNlSWQoaWQpO1xuXG4gIGlmKGZvcm1hdElkKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfY3JlZGl0X2NhcmRfaWQnKTtcbiAgfVxuXG4gIGNvbnN0IHBheW1lbnRDYXJkOiBQYXltZW50Q2FyZFR5cGUgPSB7fTtcbiAgY29uc3QgZm9ybWF0RXhwTW9udGggPSBwYXJzZU51bShleHBNb250aCwgMik7XG4gIGNvbnN0IGZvcm1hdEV4cFllYXIgPSBwYXJzZU51bShleHBZZWFyLCAyKTtcbiAgY29uc3QgZm9ybWF0Q2l0eSA9IHBhcnNlVmFyQ2hhcihjaXR5LCAzMik7XG4gIGNvbnN0IGZvcm1hdENvdW50cnkgPSBwYXJzZUNoYXIoY291bnRyeSwgMik7XG4gIGNvbnN0IGZvcm1hdEZ1bGxOYW1lID0gcGFyc2VWYXJDaGFyKGZ1bGxOYW1lLCAzMik7XG4gIGNvbnN0IGZvcm1hdFN0cmVldDEgPSBwYXJzZVN0cmluZyhzdHJlZXQxLCAzMik7XG4gIGNvbnN0IGZvcm1hdFN0YXRlID0gcGFyc2VDaGFyKHN0YXRlLCAyKTtcbiAgY29uc3QgZm9ybWF0WmlwID0gcGFyc2VWYXJDaGFyKHppcCwgMTApO1xuXG4gIGlmKGZvcm1hdEV4cE1vbnRoKSB7XG4gICAgcGF5bWVudENhcmQuZXhwTW9udGggPSBmb3JtYXRFeHBNb250aDtcbiAgfVxuXG4gIGlmKGZvcm1hdEV4cFllYXIpIHtcbiAgICBwYXltZW50Q2FyZC5leHBZZWFyID0gZm9ybWF0RXhwWWVhcjtcbiAgfVxuXG4gIGlmKGZvcm1hdENpdHkpIHtcbiAgICBwYXltZW50Q2FyZC5jaXR5ID0gZm9ybWF0Q2l0eTtcbiAgfVxuXG4gIGlmKGZvcm1hdENvdW50cnkpIHtcbiAgICBwYXltZW50Q2FyZC5jb3VudHJ5ID0gZm9ybWF0Q291bnRyeTtcbiAgfVxuXG4gIGlmKGZvcm1hdEZ1bGxOYW1lKSB7XG4gICAgcGF5bWVudENhcmQuZnVsbE5hbWUgPSBmb3JtYXRGdWxsTmFtZTtcbiAgfVxuXG4gIGlmKGZvcm1hdFN0cmVldDEpIHtcbiAgICBwYXltZW50Q2FyZC5zdHJlZXQxID0gZm9ybWF0U3RyZWV0MTtcbiAgfVxuXG4gIGlmKGZvcm1hdFN0YXRlKSB7XG4gICAgcGF5bWVudENhcmQuc3RhdGUgPSBmb3JtYXRTdGF0ZTtcbiAgfVxuXG4gIGlmKGZvcm1hdFppcCkge1xuICAgIHBheW1lbnRDYXJkLnppcCA9IGZvcm1hdFppcDtcbiAgfVxuXG4gIGNvbnN0IHVwZGF0ZSA9IHBheW1lbnRDYXJkO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgICAgTEVUIHVwZGF0ZWRDYXJkID0gRklSU1QoXG4gICAgICAgIEZPUiBjIElOIGNyZWRpdENhcmRzXG4gICAgICAgIEZJTFRFUiBjLl9rZXkgPT0gJHtmb3JtYXRJZH0gJiYgYy51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgICAgIFVQREFURSBjIFdJVEggJHt1cGRhdGV9IElOIGNyZWRpdENhcmRzXG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIE5FV1xuICAgICAgKVxuICAgICAgTEVUIHVzZXIgPSBGSVJTVChcbiAgICAgICAgRk9SIHUgSU4gdXNlcnNcbiAgICAgICAgRklMVEVSIHUuX2tleSA9PSAke3Nlc3Npb25JZH1cbiAgICAgICAgTElNSVQgMVxuICAgICAgICBSRVRVUk4gdVxuICAgICAgKVxuICAgICAgUkVUVVJOIHt1c2VyOiB1c2VyLCBjYXJkOiB1cGRhdGVkQ2FyZH1gO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChyZXN1bHRzID0ge2NhcmQ6IHt9LCB1c2VyOiB7fX0pID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRDYXJkOiBQYXltZW50Q2FyZFR5cGUgPSByZXN1bHRzLmNhcmQ7XG4gICAgICBjb25zdCB7dXNlcn0gPSByZXN1bHRzO1xuXG4gICAgICBpZighdXBkYXRlZENhcmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcignbm90X2ZvdW5kJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtzdHJpcGVDdXN0b21lcklkfSA9IHVzZXI7XG4gICAgICBjb25zdCB7c3RyaXBlSWR9ID0gY2FyZDtcbiAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IGdldFN0cmlwZUNsaWVudCgpO1xuICAgICAgY29uc3QgdXBkYXRlOiBzdHJpcGUuQ3VzdG9tZXJVcGRhdGVTb3VyY2VQYXJhbXMgPSB7XG4gICAgICAgIGFkZHJlc3NfY2l0eTogZm9ybWF0Q2l0eSxcbiAgICAgICAgYWRkcmVzc19jb3VudHJ5OiBmb3JtYXRDb3VudHJ5LFxuICAgICAgICBhZGRyZXNzX2xpbmUxOiBmb3JtYXRTdHJlZXQxLFxuICAgICAgICBhZGRyZXNzX3N0YXRlOiBmb3JtYXRTdGF0ZSxcbiAgICAgICAgYWRkcmVzc196aXA6IGZvcm1hdFppcCxcbiAgICAgICAgZXhwX21vbnRoOiBmb3JtYXRFeHBNb250aC50b1N0cmluZygpLFxuICAgICAgICBleHBfeWVhcjogZm9ybWF0RXhwWWVhci50b1N0cmluZygpLFxuICAgICAgICBuYW1lOiBmb3JtYXRGdWxsTmFtZVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHN0cmlwZUNsaWVudC5jdXN0b21lcnNcbiAgICAgICAgLnVwZGF0ZVNvdXJjZShzdHJpcGVDdXN0b21lcklkLCBzdHJpcGVJZCwgdXBkYXRlKVxuICAgICAgICAudGhlbigoKSA9PiBjYXJkKVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdwYXltZW50czo6dXBkYXRlQ2FyZDo6ZXJyb3InLCBlcnJvcik7XG4gICAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncGF5bWVudF9lcnJvcicpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDcmVkaXRDYXJkcyA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxQYXltZW50Q2FyZFR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0Q3JlZGl0Q2FyZHMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGMgSU4gY3JlZGl0Q2FyZHNcbiAgICBGSUxURVIgYy51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgUkVUVVJOIGNgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKGxpc3Q6IFBheW1lbnRDYXJkVHlwZVtdID0gW10pID0+IGxpc3QpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlQ3JlZGl0Q2FyZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBjYXJkSWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdENhcmRJZCA9IHBhcnNlSWQoY2FyZElkKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBMRVQgY2FyZCA9IEZJUlNUKFxuICAgICAgRk9SIGMgSU4gY3JlZGl0Q2FyZHNcbiAgICAgIEZJTFRFUiBjLl9rZXkgPT0gJHtmb3JtYXRDYXJkSWR9ICYmIGMudXNlcklkID09ICR7c2Vzc2lvbklkfVxuICAgICAgTElNSVQgMVxuICAgICAgUkVNT1ZFIGMgSU4gY3JlZGl0Q2FyZHNcbiAgICAgIFJFVFVSTiBPTERcbiAgICApXG4gICAgTEVUIHVzZXIgPSBGSVJTVChcbiAgICAgIEZPUiB1IElOIHVzZXJzXG4gICAgICBGSUxURVIgdS5fa2V5ID09ICR7c2Vzc2lvbklkfVxuICAgICAgTElNSVQgMVxuICAgICAgUkVUVVJOIHVcbiAgICApXG4gICAgUkVUVVJOIHt1c2VyOiB1c2VyLCBjYXJkOiBjYXJkfWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHJlc3VsdCA9IHtjYXJkOiB7fSwgdXNlcjoge319KSA9PiB7XG4gICAgICBpZighcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge2NhcmQsIHVzZXJ9ID0gcmVzdWx0O1xuICAgICAgY29uc3Qge19rZXk6IGNhcmRLZXl9ID0gY2FyZDtcblxuICAgICAgLy8gUmVtb3ZlIGxpbmtlZCBlZGdlc1xuICAgICAgY29uc3QgZWRnZUNvbGxlY3Rpb24gPSB1c2VEYihkYXRhYmFzZU5hbWUpLmNvbGxlY3Rpb24oJ2hhc1BheW1lbnQnKTtcblxuICAgICAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLm91dEVkZ2VzKGNhcmRLZXksIHt9KVxuICAgICAgICAudGhlbihhc3luYyAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAvLyBFeHRyYWN0IGVkZ2VzIGZyb20gdGhlIHJlc3BvbnNlXG4gICAgICAgICAgY29uc3QgZWRnZXMgPSBBcnJheS5pc0FycmF5KHJlc3BvbnNlKSA/IHJlc3BvbnNlIDogW107XG5cbiAgICAgICAgICBpZihlZGdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICBlZGdlcy5tYXAoKGVkZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7X2tleTogZWRnZUtleX0gPSBlZGdlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZUFxbFFyeTogQXFsUXVlcnkgPSBhcWxgUkVNT1ZFIHtfa2V5OiR7ZWRnZUtleX19IElOIGhhc1BheW1lbnRgO1xuICAgICAgICAgICAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KHJlbW92ZUFxbFFyeSk7XG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gU3RyaXBlXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gZ2V0U3RyaXBlQ2xpZW50KCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgICAgICAgICAgICAgICAgLmRlbGV0ZVNvdXJjZSh1c2VyLnN0cmlwZUN1c3RvbWVySWQsIGNhcmQuc3RyaXBlSWQpXG4gICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3BheW1lbnRzOjpkZWxldGVDYXJkOjplcnJvcicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncGF5bWVudF9lcnJvcicpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZUJhbmtBY2NvdW50ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGJhbmtJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcblxuICAvLyBDbGVhbiBkYlxuICBjb25zdCB1cGRhdGU6IFVzZXJUeXBlID0ge1xuICAgIGJhbmtBY2NvdW50OiAnJyxcbiAgICBiYW5rRnVsbE5hbWU6ICcnLFxuICAgIGJhbmtJZDogJycsXG4gICAgYmFua1JvdXRpbmc6ICcnLFxuICAgIG1vZGlmaWVkOiBEYXRlLm5vdygpXG4gIH07XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFICR7c2Vzc2lvbklkfSBXSVRIICR7dXBkYXRlfSBJTiB1c2VycyBMSU1JVCAxIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1c2VyOiBVc2VyVHlwZSkgPT4ge1xuICAgICAgY29uc3Qge3N0cmlwZUFjY291bnRJZH0gPSB1c2VyO1xuICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gZ2V0U3RyaXBlQ2xpZW50KCk7XG5cbiAgICAgIHJldHVybiBzdHJpcGVDbGllbnQuY3VzdG9tZXJzXG4gICAgICAgIC5kZWxldGVTb3VyY2Uoc3RyaXBlQWNjb3VudElkLCBiYW5rSWQpXG4gICAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAgIC5jYXRjaCgoKSA9PiBQcm9taXNlLnJlc29sdmUoZmFsc2UpKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVQYXltZW50VHJhbnNmZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdHJhbnNmZXI6IFBheW1lbnRUcmFuc2Zlcik6IFByb21pc2U8UGF5bWVudFRyYW5zZmVyPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2Ftb3VudCwgY3VycmVuY3l9ID0gdHJhbnNmZXI7XG4gIGNvbnN0IGZvcm1hdEFtb3VudCA9IHBhcnNlTnVtKGFtb3VudCk7XG4gIGNvbnN0IGZvcm1hdEN1cnJlbmN5ID0gcGFyc2VDaGFyKGN1cnJlbmN5LCAzLCAnVVNEJykudG9VcHBlckNhc2UoKTtcblxuICByZXR1cm4gZ2V0VXNlckJ5SWQoY29udGV4dCwge3VzZXJJZDogc2Vzc2lvbklkfSlcbiAgICAudGhlbigodXNlcjogVXNlclR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHtzdHJpcGVBY2NvdW50SWR9ID0gdXNlcjtcbiAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IGdldFN0cmlwZUNsaWVudCgpO1xuXG4gICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LnRyYW5zZmVyc1xuICAgICAgICAuY3JlYXRlKHtcbiAgICAgICAgICBhbW91bnQ6IGZvcm1hdEFtb3VudCxcbiAgICAgICAgICBjdXJyZW5jeTogZm9ybWF0Q3VycmVuY3ksXG4gICAgICAgICAgZGVzdGluYXRpb246IHN0cmlwZUFjY291bnRJZFxuICAgICAgICB9KVxuICAgICAgICAudGhlbigoc3RyaXBlVHJhbnNmZXIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhzdHJpcGVUcmFuc2Zlcik7XG4gICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCBpbnNlcnQ6IFBheW1lbnRUcmFuc2ZlciA9IHtcbiAgICAgICAgICAgIGFkZGVkOiBub3csXG4gICAgICAgICAgICBhbW91bnQ6IGZvcm1hdEFtb3VudCxcbiAgICAgICAgICAgIGN1cnJlbmN5OiBmb3JtYXRDdXJyZW5jeSxcbiAgICAgICAgICAgIG1vZGlmaWVkOiBub3csXG4gICAgICAgICAgICB1c2VySWQ6IHNlc3Npb25JZFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIHRyYW5zZmVycyBSRVRVUk4gTkVXYDtcblxuICAgICAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgICAgICAudGhlbigobmV3VHJhbnNmZXI6IFBheW1lbnRUcmFuc2ZlcikgPT4gbmV3VHJhbnNmZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVQYXltZW50SG9sZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBwYXltZW50OiBQYXltZW50Q2hhcmdlKTogUHJvbWlzZTxQYXltZW50Q2hhcmdlPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2Ftb3VudCwgY2FwdHVyZSwgY2FyZElkLCBjdXJyZW5jeSwgZGVzY3JpcHRpb259ID0gcGF5bWVudDtcbiAgY29uc3QgZm9ybWF0Q3VycmVuY3kgPSBwYXJzZUNoYXIoY3VycmVuY3ksIDMsICdVU0QnKS50b1VwcGVyQ2FzZSgpO1xuICBjb25zdCBzdHJpcGVDbGllbnQgPSBnZXRTdHJpcGVDbGllbnQoKTtcblxuICByZXR1cm4gc3RyaXBlQ2xpZW50LmNoYXJnZXNcbiAgICAuY3JlYXRlKHtcbiAgICAgIGFtb3VudCxcbiAgICAgIGNhcHR1cmUsXG4gICAgICBjdXJyZW5jeTogZm9ybWF0Q3VycmVuY3ksXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIHNvdXJjZTogY2FyZElkXG4gICAgfSlcbiAgICAudGhlbigoc3RyaXBlQ2hhcmdlKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgaW5zZXJ0OiBQYXltZW50Q2hhcmdlID0ge1xuICAgICAgICBhZGRlZDogbm93LFxuICAgICAgICBhbW91bnQsXG4gICAgICAgIGNhcHR1cmUsXG4gICAgICAgIGNhcmRJZCxcbiAgICAgICAgY2hhcmdlRmFpbENvZGU6IHN0cmlwZUNoYXJnZS5mYWlsdXJlX2NvZGUsXG4gICAgICAgIGNoYXJnZUZhaWxNc2c6IHN0cmlwZUNoYXJnZS5mYWlsdXJlX21lc3NhZ2UsXG4gICAgICAgIGNoYXJnZUlkOiBzdHJpcGVDaGFyZ2UuaWQsXG4gICAgICAgIGNoYXJnZVN0YXR1czogc3RyaXBlQ2hhcmdlLnN0YXR1cyxcbiAgICAgICAgY3VycmVuY3k6IGZvcm1hdEN1cnJlbmN5LFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgbW9kaWZpZWQ6IG5vdyxcbiAgICAgICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgICAgIH07XG4gICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gcGF5bWVudHMgUkVUVVJOIE5FV2A7XG5cbiAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgLnRoZW4oKG5ld1BheW1lbnQ6IFBheW1lbnRDaGFyZ2UpID0+IG5ld1BheW1lbnQpO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdwYXltZW50czo6Y3JlYXRlSG9sZDo6ZXJyb3InLCBlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdwYXltZW50X2Vycm9yJyk7XG4gICAgfSk7XG59O1xuXG5jb25zdCBlbnN1cmVTdHJpcGVDdXN0b21lcklkID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBjb25zdCBzZXNzaW9uSWQgPSBTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKTtcbiAgbGV0IHVzZXIgPSBhd2FpdCBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiBzZXNzaW9uSWR9KTtcblxuICBpZighdXNlcj8uc3RyaXBlQ3VzdG9tZXJJZCkge1xuICAgIGF3YWl0IGFkZEN1c3RvbWVyQWNjb3VudChjb250ZXh0KTtcbiAgICB1c2VyID0gYXdhaXQgZ2V0VXNlckJ5SWQoY29udGV4dCwge3VzZXJJZDogc2Vzc2lvbklkfSk7XG4gIH1cblxuICByZXR1cm4gU3RyaW5nKHVzZXI/LnN0cmlwZUN1c3RvbWVySWQgfHwgJycpO1xufTtcblxuY29uc3QgZ2V0Q29uZmlndXJlZEJpbGxpbmdPcmlnaW5zID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBTZXQ8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IGNvbmZpZ3VyZWRPcmlnaW5zID0gU3RyaW5nKHByb2Nlc3MuZW52LlNUUklQRV9SRVRVUk5fVVJMX09SSUdJTlMgfHwgJycpXG4gICAgLnNwbGl0KCcsJylcbiAgICAubWFwKChvcmlnaW4pID0+IG9yaWdpbi50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgY29uc3QgYXBwVXJsID0gU3RyaW5nKGNvbnRleHQuY29uZmlnPy5kZXRhaWxzPy51cmwgfHwgJycpLnRyaW0oKTtcblxuICBpZihhcHBVcmwpIHtcbiAgICBjb25maWd1cmVkT3JpZ2lucy5wdXNoKGFwcFVybC5pbmNsdWRlcygnOi8vJykgPyBhcHBVcmwgOiBgaHR0cHM6Ly8ke2FwcFVybH1gKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2V0KGNvbmZpZ3VyZWRPcmlnaW5zLm1hcCgob3JpZ2luKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgVVJMKG9yaWdpbikub3JpZ2luO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfSkuZmlsdGVyKEJvb2xlYW4pKTtcbn07XG5cbmNvbnN0IHBhcnNlQmlsbGluZ1JldHVyblVybCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCByZXR1cm5Vcmw6IHN0cmluZyk6IFVSTCA9PiB7XG4gIGxldCBwYXJzZWRVcmw6IFVSTDtcblxuICB0cnkge1xuICAgIHBhcnNlZFVybCA9IG5ldyBVUkwoU3RyaW5nKHJldHVyblVybCB8fCAnJykudHJpbSgpKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcignaW52YWxpZF9iaWxsaW5nX3JldHVybl91cmwnKTtcbiAgfVxuXG4gIGNvbnN0IGlzTG9jYWxEZXZlbG9wbWVudFVybCA9IHBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ2h0dHA6J1xuICAgICYmIFsnMTI3LjAuMC4xJywgJ2xvY2FsaG9zdCddLmluY2x1ZGVzKHBhcnNlZFVybC5ob3N0bmFtZSk7XG4gIGNvbnN0IGlzU2VjdXJlVXJsID0gcGFyc2VkVXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgY29uc3QgYWxsb3dlZE9yaWdpbnMgPSBnZXRDb25maWd1cmVkQmlsbGluZ09yaWdpbnMoY29udGV4dCk7XG5cbiAgaWYoKCFpc1NlY3VyZVVybCAmJiAhaXNMb2NhbERldmVsb3BtZW50VXJsKSB8fCAoIWlzTG9jYWxEZXZlbG9wbWVudFVybCAmJiAhYWxsb3dlZE9yaWdpbnMuaGFzKHBhcnNlZFVybC5vcmlnaW4pKSkge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ2ludmFsaWRfYmlsbGluZ19yZXR1cm5fdXJsJyk7XG4gIH1cblxuICBwYXJzZWRVcmwuaGFzaCA9ICcnO1xuICByZXR1cm4gcGFyc2VkVXJsO1xufTtcblxuY29uc3QgZ2V0Q2hlY2tvdXRSZXR1cm5VcmwgPSAocmV0dXJuVXJsOiBVUkwsIHN0YXR1czogJ2NhbmNlbGVkJyB8ICdzdWNjZXNzJyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IG5leHRVcmwgPSBuZXcgVVJMKHJldHVyblVybC50b1N0cmluZygpKTtcblxuICBuZXh0VXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2JpbGxpbmcnLCBzdGF0dXMpO1xuICBpZihzdGF0dXMgPT09ICdzdWNjZXNzJykge1xuICAgIG5leHRVcmwuc2VhcmNoUGFyYW1zLnNldCgnc2Vzc2lvbl9pZCcsICd7Q0hFQ0tPVVRfU0VTU0lPTl9JRH0nKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0VXJsLnRvU3RyaW5nKCkucmVwbGFjZSgnJTdCQ0hFQ0tPVVRfU0VTU0lPTl9JRCU3RCcsICd7Q0hFQ0tPVVRfU0VTU0lPTl9JRH0nKTtcbn07XG5cbmNvbnN0IHVwZGF0ZVVzZXJCaWxsaW5nUGF5bWVudE1ldGhvZCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXBkYXRlOiBQYXJ0aWFsPFVzZXJUeXBlPlxuKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBzZXNzaW9uSWQgPSBTdHJpbmcoY29udGV4dC5zZXNzaW9uPy51c2VySWQgfHwgJycpLnRyaW0oKTtcbiAgY29uc3QgdXNlclVwZGF0ZTogUGFydGlhbDxVc2VyVHlwZT4gPSB7bW9kaWZpZWQ6IERhdGUubm93KCksIC4uLnVwZGF0ZX07XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFICR7c2Vzc2lvbklkfSBXSVRIICR7dXNlclVwZGF0ZX0gSU4gdXNlcnMgTElNSVQgMSBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1c2VyOiBVc2VyVHlwZSkgPT4gdXNlcik7XG59O1xuXG5jb25zdCBlbnN1cmVQbHVzU3RyaXBlUGxhbiA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBjb25zdCBzdHJpcGVDbGllbnQgPSBnZXRTdHJpcGVDbGllbnQoKTtcblxuICB0cnkge1xuICAgIGF3YWl0IHN0cmlwZUNsaWVudC5wbGFucy5yZXRyaWV2ZShQTFVTX1BMQU5fSUQpO1xuICAgIHJldHVybiBQTFVTX1BMQU5fSUQ7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBhd2FpdCBzdHJpcGVDbGllbnQucGxhbnMuY3JlYXRlKHtcbiAgICAgIGFtb3VudDogUExVU19QTEFOX0FNT1VOVCxcbiAgICAgIGN1cnJlbmN5OiAndXNkJyxcbiAgICAgIGlkOiBQTFVTX1BMQU5fSUQsXG4gICAgICBpbnRlcnZhbDogJ21vbnRoJyxcbiAgICAgIGludGVydmFsX2NvdW50OiAxLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgcGxhbklkOiAncGx1cycsXG4gICAgICAgIHR5cGU6ICdhY2NvdW50J1xuICAgICAgfSxcbiAgICAgIHByb2R1Y3Q6IHtcbiAgICAgICAgbmFtZTogJ1BoYW50YXplIFBsdXMnXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gUExVU19QTEFOX0lEO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgdXBncmFkZVVzZXJUb1BsdXMgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3VwZ3JhZGVVc2VyVG9QbHVzJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfSA9IHt9fSA9IGNvbnRleHQ7XG5cbiAgaWYoIXNlc3Npb25JZCkge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ2ludmFsaWRfc2Vzc2lvbicpO1xuICB9XG5cbiAgY29uc3QgY3VycmVudFVzZXIgPSBhd2FpdCBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiBzZXNzaW9uSWR9KTtcblxuICBpZihoYXNBY2Nlc3NMZXZlbChjdXJyZW50VXNlciwgUExVU19QTEFOX0FDQ0VTUykgJiYgY3VycmVudFVzZXI/LnBsYW5TdWJzY3JpcHRpb25JZCkge1xuICAgIHJldHVybiBjdXJyZW50VXNlcjtcbiAgfVxuXG4gIGlmKCFjdXJyZW50VXNlcj8uc3RyaXBlQ2FyZElkKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfYmlsbGluZ19jYXJkJyk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHN0cmlwZUN1c3RvbWVySWQgPSBhd2FpdCBlbnN1cmVTdHJpcGVDdXN0b21lcklkKGNvbnRleHQpO1xuXG4gICAgaWYoIXN0cmlwZUN1c3RvbWVySWQpIHtcbiAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3BheW1lbnRfZXJyb3InKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHJpcGVQbGFuSWQgPSBhd2FpdCBlbnN1cmVQbHVzU3RyaXBlUGxhbigpO1xuICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IGdldFN0cmlwZUNsaWVudCgpO1xuICAgIGNvbnN0IHN0cmlwZVN1YnNjcmlwdGlvbiA9IGF3YWl0IHN0cmlwZUNsaWVudC5zdWJzY3JpcHRpb25zLmNyZWF0ZSh7XG4gICAgICBjdXN0b21lcjogc3RyaXBlQ3VzdG9tZXJJZCxcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwbGFuOiBzdHJpcGVQbGFuSWRcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHBsYW5JZDogJ3BsdXMnLFxuICAgICAgICB0eXBlOiAnYWNjb3VudCcsXG4gICAgICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3Qgc3RyaXBlUGVyaW9kRW5kID0gTnVtYmVyKChzdHJpcGVTdWJzY3JpcHRpb24gYXMgYW55KT8uY3VycmVudF9wZXJpb2RfZW5kIHx8IDApO1xuICAgIGNvbnN0IHVwZGF0ZTogUGFydGlhbDxVc2VyVHlwZT4gPSB7XG4gICAgICBtb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICAgIHBsYW5FeHBpcmVzOiBzdHJpcGVQZXJpb2RFbmQgPyBzdHJpcGVQZXJpb2RFbmQgKiAxMDAwIDogMCxcbiAgICAgIHBsYW5JZDogJ3BsdXMnLFxuICAgICAgcGxhblN0YXR1czogU3RyaW5nKHN0cmlwZVN1YnNjcmlwdGlvbi5zdGF0dXMgfHwgJ2FjdGl2ZScpLFxuICAgICAgcGxhblN1YnNjcmlwdGlvbklkOiBzdHJpcGVTdWJzY3JpcHRpb24uaWQsXG4gICAgICB1c2VyQWNjZXNzOiBQTFVTX1BMQU5fQUNDRVNTXG4gICAgfTtcbiAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke3Nlc3Npb25JZH0gV0lUSCAke3VwZGF0ZX0gSU4gdXNlcnMgTElNSVQgMSBSRVRVUk4gTkVXYDtcblxuICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAudGhlbigodXNlcjogVXNlclR5cGUpID0+IHVzZXIpO1xuICB9IGNhdGNoKGVycm9yOiBhbnkpIHtcbiAgICBhd2FpdCBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAncGF5bWVudF9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncGF5bWVudF9lcnJvcicpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQmlsbGluZ1NldHVwU2Vzc2lvbiA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge3JldHVyblVybH06IEJpbGxpbmdTZXR1cFNlc3Npb25PcHRpb25zXG4pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBjb25zdCBzZXNzaW9uSWQgPSBTdHJpbmcoY29udGV4dC5zZXNzaW9uPy51c2VySWQgfHwgJycpLnRyaW0oKTtcblxuICBpZighc2Vzc2lvbklkKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcignaW52YWxpZF9zZXNzaW9uJyk7XG4gIH1cblxuICBjb25zdCBzdHJpcGVDdXN0b21lcklkID0gYXdhaXQgZW5zdXJlU3RyaXBlQ3VzdG9tZXJJZChjb250ZXh0KTtcblxuICBpZighc3RyaXBlQ3VzdG9tZXJJZCkge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3BheW1lbnRfZXJyb3InKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZFJldHVyblVybCA9IHBhcnNlQmlsbGluZ1JldHVyblVybChjb250ZXh0LCByZXR1cm5VcmwpO1xuICBjb25zdCBjaGVja291dFNlc3Npb24gPSBhd2FpdCBnZXRTdHJpcGVDbGllbnQoKS5jaGVja291dC5zZXNzaW9ucy5jcmVhdGUoe1xuICAgIGNhbmNlbF91cmw6IGdldENoZWNrb3V0UmV0dXJuVXJsKHBhcnNlZFJldHVyblVybCwgJ2NhbmNlbGVkJyksXG4gICAgY3VzdG9tZXI6IHN0cmlwZUN1c3RvbWVySWQsXG4gICAgbWV0YWRhdGE6IHtcbiAgICAgIHR5cGU6ICdiaWxsaW5nLXBheW1lbnQtbWV0aG9kJyxcbiAgICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gICAgfSxcbiAgICBtb2RlOiAnc2V0dXAnLFxuICAgIHBheW1lbnRfbWV0aG9kX3R5cGVzOiBbJ2NhcmQnXSxcbiAgICBzZXR1cF9pbnRlbnRfZGF0YToge1xuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgdHlwZTogJ2JpbGxpbmctcGF5bWVudC1tZXRob2QnLFxuICAgICAgICB1c2VySWQ6IHNlc3Npb25JZFxuICAgICAgfVxuICAgIH0sXG4gICAgc3VjY2Vzc191cmw6IGdldENoZWNrb3V0UmV0dXJuVXJsKHBhcnNlZFJldHVyblVybCwgJ3N1Y2Nlc3MnKVxuICB9KTtcbiAgY29uc3QgY2hlY2tvdXRVcmwgPSBTdHJpbmcoY2hlY2tvdXRTZXNzaW9uLnVybCB8fCAnJykudHJpbSgpO1xuXG4gIGlmKCFjaGVja291dFVybCkge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3BheW1lbnRfZXJyb3InKTtcbiAgfVxuXG4gIHJldHVybiBjaGVja291dFVybDtcbn07XG5cbmV4cG9ydCBjb25zdCBjb21wbGV0ZUJpbGxpbmdTZXR1cFNlc3Npb24gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGNoZWNrb3V0U2Vzc2lvbklkOiBzdHJpbmdcbik6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3Qgc2Vzc2lvbklkID0gU3RyaW5nKGNvbnRleHQuc2Vzc2lvbj8udXNlcklkIHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDaGVja291dFNlc3Npb25JZCA9IFN0cmluZyhjaGVja291dFNlc3Npb25JZCB8fCAnJykudHJpbSgpO1xuXG4gIGlmKCFzZXNzaW9uSWQpIHtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdpbnZhbGlkX3Nlc3Npb24nKTtcbiAgfVxuXG4gIGlmKCFub3JtYWxpemVkQ2hlY2tvdXRTZXNzaW9uSWQpIHtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdpbnZhbGlkX2JpbGxpbmdfc2V0dXBfc2Vzc2lvbicpO1xuICB9XG5cbiAgY29uc3QgY3VycmVudFVzZXIgPSBhd2FpdCBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiBzZXNzaW9uSWR9KTtcbiAgY29uc3Qgc3RyaXBlQ3VzdG9tZXJJZCA9IFN0cmluZyhjdXJyZW50VXNlcj8uc3RyaXBlQ3VzdG9tZXJJZCB8fCAnJykudHJpbSgpO1xuXG4gIGlmKCFzdHJpcGVDdXN0b21lcklkKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncGF5bWVudF9lcnJvcicpO1xuICB9XG5cbiAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gZ2V0U3RyaXBlQ2xpZW50KCk7XG4gIGNvbnN0IGNoZWNrb3V0U2Vzc2lvbiA9IGF3YWl0IHN0cmlwZUNsaWVudC5jaGVja291dC5zZXNzaW9ucy5yZXRyaWV2ZShcbiAgICBub3JtYWxpemVkQ2hlY2tvdXRTZXNzaW9uSWQsXG4gICAge2V4cGFuZDogWydzZXR1cF9pbnRlbnQucGF5bWVudF9tZXRob2QnXX1cbiAgKTtcbiAgY29uc3QgY2hlY2tvdXRDdXN0b21lcklkID0gdHlwZW9mIGNoZWNrb3V0U2Vzc2lvbi5jdXN0b21lciA9PT0gJ3N0cmluZydcbiAgICA/IGNoZWNrb3V0U2Vzc2lvbi5jdXN0b21lclxuICAgIDogY2hlY2tvdXRTZXNzaW9uLmN1c3RvbWVyPy5pZDtcblxuICBpZihcbiAgICBjaGVja291dFNlc3Npb24ubW9kZSAhPT0gJ3NldHVwJ1xuICAgIHx8IGNoZWNrb3V0U2Vzc2lvbi5zdGF0dXMgIT09ICdjb21wbGV0ZSdcbiAgICB8fCBjaGVja291dEN1c3RvbWVySWQgIT09IHN0cmlwZUN1c3RvbWVySWRcbiAgICB8fCBjaGVja291dFNlc3Npb24ubWV0YWRhdGE/LnVzZXJJZCAhPT0gc2Vzc2lvbklkXG4gICkge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ2ludmFsaWRfYmlsbGluZ19zZXR1cF9zZXNzaW9uJyk7XG4gIH1cblxuICBjb25zdCBzZXR1cEludGVudCA9IHR5cGVvZiBjaGVja291dFNlc3Npb24uc2V0dXBfaW50ZW50ID09PSAnc3RyaW5nJ1xuICAgID8gYXdhaXQgc3RyaXBlQ2xpZW50LnNldHVwSW50ZW50cy5yZXRyaWV2ZShjaGVja291dFNlc3Npb24uc2V0dXBfaW50ZW50LCB7ZXhwYW5kOiBbJ3BheW1lbnRfbWV0aG9kJ119KVxuICAgIDogY2hlY2tvdXRTZXNzaW9uLnNldHVwX2ludGVudDtcblxuICBpZighc2V0dXBJbnRlbnQgfHwgc2V0dXBJbnRlbnQuc3RhdHVzICE9PSAnc3VjY2VlZGVkJykge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ2JpbGxpbmdfc2V0dXBfaW5jb21wbGV0ZScpO1xuICB9XG5cbiAgY29uc3QgcGF5bWVudE1ldGhvZCA9IHR5cGVvZiBzZXR1cEludGVudC5wYXltZW50X21ldGhvZCA9PT0gJ3N0cmluZydcbiAgICA/IGF3YWl0IHN0cmlwZUNsaWVudC5wYXltZW50TWV0aG9kcy5yZXRyaWV2ZShzZXR1cEludGVudC5wYXltZW50X21ldGhvZClcbiAgICA6IHNldHVwSW50ZW50LnBheW1lbnRfbWV0aG9kO1xuICBjb25zdCBwYXltZW50TWV0aG9kQ3VzdG9tZXJJZCA9IHR5cGVvZiBwYXltZW50TWV0aG9kPy5jdXN0b21lciA9PT0gJ3N0cmluZydcbiAgICA/IHBheW1lbnRNZXRob2QuY3VzdG9tZXJcbiAgICA6IHBheW1lbnRNZXRob2Q/LmN1c3RvbWVyPy5pZDtcblxuICBpZighcGF5bWVudE1ldGhvZCB8fCBwYXltZW50TWV0aG9kLnR5cGUgIT09ICdjYXJkJyB8fCAhcGF5bWVudE1ldGhvZC5jYXJkIHx8IHBheW1lbnRNZXRob2RDdXN0b21lcklkICE9PSBzdHJpcGVDdXN0b21lcklkKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcignaW52YWxpZF9iaWxsaW5nX3BheW1lbnRfbWV0aG9kJyk7XG4gIH1cblxuICBhd2FpdCBzdHJpcGVDbGllbnQuY3VzdG9tZXJzLnVwZGF0ZShzdHJpcGVDdXN0b21lcklkLCB7XG4gICAgaW52b2ljZV9zZXR0aW5nczoge2RlZmF1bHRfcGF5bWVudF9tZXRob2Q6IHBheW1lbnRNZXRob2QuaWR9XG4gIH0pO1xuXG4gIGNvbnN0IGN1cnJlbnRTdHJpcGVDYXJkSWQgPSBTdHJpbmcoY3VycmVudFVzZXI/LnN0cmlwZUNhcmRJZCB8fCAnJykudHJpbSgpO1xuXG4gIGlmKGN1cnJlbnRTdHJpcGVDYXJkSWQuc3RhcnRzV2l0aCgncG1fJykgJiYgY3VycmVudFN0cmlwZUNhcmRJZCAhPT0gcGF5bWVudE1ldGhvZC5pZCkge1xuICAgIGF3YWl0IHN0cmlwZUNsaWVudC5wYXltZW50TWV0aG9kcy5kZXRhY2goY3VycmVudFN0cmlwZUNhcmRJZCkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlVXNlckJpbGxpbmdQYXltZW50TWV0aG9kKGNvbnRleHQsIHtcbiAgICBzdHJpcGVDYXJkQnJhbmQ6IFN0cmluZyhwYXltZW50TWV0aG9kLmNhcmQuYnJhbmQgfHwgJycpLnRyaW0oKSxcbiAgICBzdHJpcGVDYXJkSWQ6IHBheW1lbnRNZXRob2QuaWQsXG4gICAgc3RyaXBlQ2FyZExhc3Q0OiBTdHJpbmcocGF5bWVudE1ldGhvZC5jYXJkLmxhc3Q0IHx8ICcnKS50cmltKClcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlVXNlckJpbGxpbmdDYXJkID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdkZWxldGVVc2VyQmlsbGluZ0NhcmQnO1xuICBjb25zdCB7c2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGN1cnJlbnRVc2VyID0gYXdhaXQgZ2V0VXNlckJ5SWQoY29udGV4dCwge3VzZXJJZDogc2Vzc2lvbklkfSk7XG4gIGNvbnN0IHN0cmlwZUN1c3RvbWVySWQgPSBTdHJpbmcoY3VycmVudFVzZXI/LnN0cmlwZUN1c3RvbWVySWQgfHwgJycpO1xuICBjb25zdCBzdHJpcGVDYXJkSWQgPSBTdHJpbmcoY3VycmVudFVzZXI/LnN0cmlwZUNhcmRJZCB8fCAnJyk7XG4gIGNvbnN0IHN0cmlwZUNsaWVudCA9IGdldFN0cmlwZUNsaWVudCgpO1xuXG4gIHRyeSB7XG4gICAgaWYoc3RyaXBlQ3VzdG9tZXJJZCAmJiBzdHJpcGVDYXJkSWQpIHtcbiAgICAgIGlmKHN0cmlwZUNhcmRJZC5zdGFydHNXaXRoKCdwbV8nKSkge1xuICAgICAgICBjb25zdCBjdXN0b21lciA9IGF3YWl0IHN0cmlwZUNsaWVudC5jdXN0b21lcnMucmV0cmlldmUoc3RyaXBlQ3VzdG9tZXJJZCk7XG5cbiAgICAgICAgaWYoISgnZGVsZXRlZCcgaW4gY3VzdG9tZXIpICYmIGN1c3RvbWVyLmludm9pY2Vfc2V0dGluZ3MuZGVmYXVsdF9wYXltZW50X21ldGhvZCA9PT0gc3RyaXBlQ2FyZElkKSB7XG4gICAgICAgICAgYXdhaXQgc3RyaXBlQ2xpZW50LmN1c3RvbWVycy51cGRhdGUoc3RyaXBlQ3VzdG9tZXJJZCwge1xuICAgICAgICAgICAgaW52b2ljZV9zZXR0aW5nczoge2RlZmF1bHRfcGF5bWVudF9tZXRob2Q6IG51bGx9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBzdHJpcGVDbGllbnQucGF5bWVudE1ldGhvZHMuZGV0YWNoKHN0cmlwZUNhcmRJZCkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBzdHJpcGVDbGllbnQuY3VzdG9tZXJzLmRlbGV0ZVNvdXJjZShzdHJpcGVDdXN0b21lcklkLCBzdHJpcGVDYXJkSWQpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVVc2VyQmlsbGluZ1BheW1lbnRNZXRob2QoY29udGV4dCwge1xuICAgICAgc3RyaXBlQ2FyZEJyYW5kOiAnJyxcbiAgICAgIHN0cmlwZUNhcmRJZDogJycsXG4gICAgICBzdHJpcGVDYXJkTGFzdDQ6ICcnXG4gICAgfSk7XG4gIH0gY2F0Y2goZXJyb3I6IGFueSkge1xuICAgIGF3YWl0IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdwYXltZW50X2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdwYXltZW50X2Vycm9yJyk7XG4gIH1cbn07XG4iXSwibmFtZXMiOlsicGFyc2VOdW0iLCJwYXJzZUNoYXIiLCJwYXJzZUlkIiwicGFyc2VTdHJpbmciLCJwYXJzZVZhckNoYXIiLCJhcWwiLCJFcnJvclR5cGVzIiwibG9nRXJyb3IiLCJVc2VyRXJyb3IiLCJ1c2VEYiIsImhhc0FjY2Vzc0xldmVsIiwiZ2V0U3RyaXBlQ2xpZW50IiwiZ2V0VXNlckJ5SWQiLCJldmVudENhdGVnb3J5IiwiUExVU19QTEFOX0lEIiwiUExVU19QTEFOX0FNT1VOVCIsIlBMVVNfUExBTl9BQ0NFU1MiLCJhZGRDdXN0b21lckFjY291bnQiLCJjb250ZXh0IiwiYWN0aW9uIiwiZGF0YWJhc2VOYW1lIiwic2Vzc2lvbiIsInVzZXJJZCIsInNlc3Npb25JZCIsInVzZXJuYW1lIiwic3RyaXBlQ2xpZW50IiwiY3VzdG9tZXJzIiwiY3JlYXRlIiwibWV0YWRhdGEiLCJ0aGVuIiwiY3VzdG9tZXIiLCJub3ciLCJEYXRlIiwidXBkYXRlIiwibW9kaWZpZWQiLCJzdHJpcGVDdXN0b21lcklkIiwiaWQiLCJhcWxRcnkiLCJxdWVyeSIsImN1cnNvciIsIm5leHQiLCJ1cGRhdGVkVXNlciIsImNhdGNoIiwiZXJyb3IiLCJjYXRlZ29yeSIsImxhYmVsIiwiREFUQUJBU0VfRVJST1IiLCJhZGRCYW5rQWNjb3VudCIsImJhbmtBY2NvdW50IiwiYWNjb3VudE51bWJlciIsImZ1bGxOYW1lIiwicm91dGluZyIsImZvcm1hdEFjY291bnQiLCJmb3JtYXRGdWxsTmFtZSIsImZvcm1hdFJvdXRpbmciLCJ1c2VyIiwic3RyaXBlQWNjb3VudElkIiwidG9rZW5zIiwiYmFua19hY2NvdW50IiwiYWNjb3VudF9ob2xkZXJfbmFtZSIsImFjY291bnRfaG9sZGVyX3R5cGUiLCJhY2NvdW50X251bWJlciIsImNvdW50cnkiLCJjdXJyZW5jeSIsInJvdXRpbmdfbnVtYmVyIiwidG9rZW4iLCJjcmVhdGVTb3VyY2UiLCJzb3VyY2UiLCJhY2NvdW50IiwiYmFua0Z1bGxOYW1lIiwiYmFua0lkIiwiYmFua1JvdXRpbmciLCJtc2ciLCJtZXNzYWdlIiwidXBkYXRlQ3JlZGl0Q2FyZCIsImNhcmQiLCJjaXR5IiwiZXhwTW9udGgiLCJleHBZZWFyIiwic3RyZWV0MSIsInN0YXRlIiwiemlwIiwiZm9ybWF0SWQiLCJwYXltZW50Q2FyZCIsImZvcm1hdEV4cE1vbnRoIiwiZm9ybWF0RXhwWWVhciIsImZvcm1hdENpdHkiLCJmb3JtYXRDb3VudHJ5IiwiZm9ybWF0U3RyZWV0MSIsImZvcm1hdFN0YXRlIiwiZm9ybWF0WmlwIiwicmVzdWx0cyIsInVwZGF0ZWRDYXJkIiwic3RyaXBlSWQiLCJhZGRyZXNzX2NpdHkiLCJhZGRyZXNzX2NvdW50cnkiLCJhZGRyZXNzX2xpbmUxIiwiYWRkcmVzc19zdGF0ZSIsImFkZHJlc3NfemlwIiwiZXhwX21vbnRoIiwidG9TdHJpbmciLCJleHBfeWVhciIsIm5hbWUiLCJ1cGRhdGVTb3VyY2UiLCJjb25zb2xlIiwibG9nIiwiZ2V0Q3JlZGl0Q2FyZHMiLCJhbGwiLCJsaXN0IiwiZGVsZXRlQ3JlZGl0Q2FyZCIsImNhcmRJZCIsImZvcm1hdENhcmRJZCIsInJlc3VsdCIsIl9rZXkiLCJjYXJkS2V5IiwiZWRnZUNvbGxlY3Rpb24iLCJjb2xsZWN0aW9uIiwib3V0RWRnZXMiLCJyZXNwb25zZSIsImVkZ2VzIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiUHJvbWlzZSIsIm1hcCIsImVkZ2UiLCJlZGdlS2V5IiwicmVtb3ZlQXFsUXJ5IiwiZGVsZXRlU291cmNlIiwiZGVsZXRlQmFua0FjY291bnQiLCJyZXNvbHZlIiwiY3JlYXRlUGF5bWVudFRyYW5zZmVyIiwidHJhbnNmZXIiLCJhbW91bnQiLCJmb3JtYXRBbW91bnQiLCJmb3JtYXRDdXJyZW5jeSIsInRvVXBwZXJDYXNlIiwidHJhbnNmZXJzIiwiZGVzdGluYXRpb24iLCJzdHJpcGVUcmFuc2ZlciIsImluc2VydCIsImFkZGVkIiwibmV3VHJhbnNmZXIiLCJjcmVhdGVQYXltZW50SG9sZCIsInBheW1lbnQiLCJjYXB0dXJlIiwiZGVzY3JpcHRpb24iLCJjaGFyZ2VzIiwic3RyaXBlQ2hhcmdlIiwiY2hhcmdlRmFpbENvZGUiLCJmYWlsdXJlX2NvZGUiLCJjaGFyZ2VGYWlsTXNnIiwiZmFpbHVyZV9tZXNzYWdlIiwiY2hhcmdlSWQiLCJjaGFyZ2VTdGF0dXMiLCJzdGF0dXMiLCJuZXdQYXltZW50IiwiZW5zdXJlU3RyaXBlQ3VzdG9tZXJJZCIsIlN0cmluZyIsImdldENvbmZpZ3VyZWRCaWxsaW5nT3JpZ2lucyIsImNvbmZpZ3VyZWRPcmlnaW5zIiwicHJvY2VzcyIsImVudiIsIlNUUklQRV9SRVRVUk5fVVJMX09SSUdJTlMiLCJzcGxpdCIsIm9yaWdpbiIsInRyaW0iLCJmaWx0ZXIiLCJCb29sZWFuIiwiYXBwVXJsIiwiY29uZmlnIiwiZGV0YWlscyIsInVybCIsInB1c2giLCJpbmNsdWRlcyIsIlNldCIsIlVSTCIsInBhcnNlQmlsbGluZ1JldHVyblVybCIsInJldHVyblVybCIsInBhcnNlZFVybCIsImlzTG9jYWxEZXZlbG9wbWVudFVybCIsInByb3RvY29sIiwiaG9zdG5hbWUiLCJpc1NlY3VyZVVybCIsImFsbG93ZWRPcmlnaW5zIiwiaGFzIiwiaGFzaCIsImdldENoZWNrb3V0UmV0dXJuVXJsIiwibmV4dFVybCIsInNlYXJjaFBhcmFtcyIsInNldCIsInJlcGxhY2UiLCJ1cGRhdGVVc2VyQmlsbGluZ1BheW1lbnRNZXRob2QiLCJ1c2VyVXBkYXRlIiwiZW5zdXJlUGx1c1N0cmlwZVBsYW4iLCJwbGFucyIsInJldHJpZXZlIiwiaW50ZXJ2YWwiLCJpbnRlcnZhbF9jb3VudCIsInBsYW5JZCIsInR5cGUiLCJwcm9kdWN0IiwidXBncmFkZVVzZXJUb1BsdXMiLCJjdXJyZW50VXNlciIsInBsYW5TdWJzY3JpcHRpb25JZCIsInN0cmlwZUNhcmRJZCIsInN0cmlwZVBsYW5JZCIsInN0cmlwZVN1YnNjcmlwdGlvbiIsInN1YnNjcmlwdGlvbnMiLCJpdGVtcyIsInBsYW4iLCJzdHJpcGVQZXJpb2RFbmQiLCJOdW1iZXIiLCJjdXJyZW50X3BlcmlvZF9lbmQiLCJwbGFuRXhwaXJlcyIsInBsYW5TdGF0dXMiLCJ1c2VyQWNjZXNzIiwiY3JlYXRlQmlsbGluZ1NldHVwU2Vzc2lvbiIsInBhcnNlZFJldHVyblVybCIsImNoZWNrb3V0U2Vzc2lvbiIsImNoZWNrb3V0Iiwic2Vzc2lvbnMiLCJjYW5jZWxfdXJsIiwibW9kZSIsInBheW1lbnRfbWV0aG9kX3R5cGVzIiwic2V0dXBfaW50ZW50X2RhdGEiLCJzdWNjZXNzX3VybCIsImNoZWNrb3V0VXJsIiwiY29tcGxldGVCaWxsaW5nU2V0dXBTZXNzaW9uIiwiY2hlY2tvdXRTZXNzaW9uSWQiLCJub3JtYWxpemVkQ2hlY2tvdXRTZXNzaW9uSWQiLCJleHBhbmQiLCJjaGVja291dEN1c3RvbWVySWQiLCJzZXR1cEludGVudCIsInNldHVwX2ludGVudCIsInNldHVwSW50ZW50cyIsInBheW1lbnRNZXRob2QiLCJwYXltZW50X21ldGhvZCIsInBheW1lbnRNZXRob2RzIiwicGF5bWVudE1ldGhvZEN1c3RvbWVySWQiLCJpbnZvaWNlX3NldHRpbmdzIiwiZGVmYXVsdF9wYXltZW50X21ldGhvZCIsImN1cnJlbnRTdHJpcGVDYXJkSWQiLCJzdGFydHNXaXRoIiwiZGV0YWNoIiwic3RyaXBlQ2FyZEJyYW5kIiwiYnJhbmQiLCJzdHJpcGVDYXJkTGFzdDQiLCJsYXN0NCIsImRlbGV0ZVVzZXJCaWxsaW5nQ2FyZCJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsUUFBUSxRQUFPLCtCQUErQjtBQUN0RCxTQUFRQyxTQUFTLEVBQUVDLE9BQU8sRUFBRUMsV0FBVyxFQUFFQyxZQUFZLFFBQU8sK0JBQStCO0FBQzNGLFNBQVFDLEdBQUcsUUFBTyxXQUFXO0FBSzdCLFNBQVFDLFVBQVUsUUFBTywwQkFBMEI7QUFHbkQsU0FBUUMsUUFBUSxFQUFFQyxTQUFTLFFBQU8sNkJBQTZCO0FBQy9ELFNBQVFDLEtBQUssUUFBTyw0QkFBNEI7QUFDaEQsU0FBUUMsY0FBYyxRQUFPLDJCQUEyQjtBQUN4RCxTQUFRQyxlQUFlLFFBQU8sMEJBQTBCO0FBQ3hELFNBQVFDLFdBQVcsUUFBTyxhQUFhO0FBR3ZDLE1BQU1DLGdCQUFnQjtBQUN0QixNQUFNQyxlQUFlO0FBQ3JCLE1BQU1DLG1CQUFtQjtBQUN6QixNQUFNQyxtQkFBbUI7QUFFekIsT0FBTyxNQUFNQyxxQkFBcUIsQ0FBQ0M7SUFDakMsTUFBTUMsU0FBUztJQUNmLE1BQU0sRUFBQ0MsWUFBWSxFQUFFQyxTQUFTLEVBQUNDLFFBQVFDLFNBQVMsRUFBRUMsUUFBUSxFQUFDLEdBQUcsQ0FBQyxD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