payload-auth 1.8.4 → 1.9.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 (139) hide show
  1. package/dist/better-auth/adapter/index.d.ts.map +1 -1
  2. package/dist/better-auth/adapter/index.js +38 -21
  3. package/dist/better-auth/adapter/transform/index.d.ts +6 -6
  4. package/dist/better-auth/adapter/transform/index.d.ts.map +1 -1
  5. package/dist/better-auth/adapter/transform/index.js +160 -52
  6. package/dist/better-auth/generated-types.d.ts +14 -11
  7. package/dist/better-auth/generated-types.d.ts.map +1 -1
  8. package/dist/better-auth/generated-types.js +1 -1
  9. package/dist/better-auth/plugin/constants.d.ts +3 -7
  10. package/dist/better-auth/plugin/constants.d.ts.map +1 -1
  11. package/dist/better-auth/plugin/constants.js +5 -9
  12. package/dist/better-auth/plugin/index.d.ts.map +1 -1
  13. package/dist/better-auth/plugin/index.js +8 -12
  14. package/dist/better-auth/plugin/lib/{apply-disabled-default-auth-config.d.ts → apply-ba-admin-config.d.ts} +4 -3
  15. package/dist/better-auth/plugin/lib/apply-ba-admin-config.d.ts.map +1 -0
  16. package/dist/better-auth/plugin/lib/apply-ba-admin-config.js +88 -0
  17. package/dist/better-auth/plugin/lib/build-collections/accounts/index.js +7 -12
  18. package/dist/better-auth/plugin/lib/build-collections/api-keys.d.ts.map +1 -1
  19. package/dist/better-auth/plugin/lib/build-collections/api-keys.js +5 -5
  20. package/dist/better-auth/plugin/lib/build-collections/device-code.d.ts.map +1 -1
  21. package/dist/better-auth/plugin/lib/build-collections/device-code.js +8 -3
  22. package/dist/better-auth/plugin/lib/build-collections/jwks.d.ts.map +1 -1
  23. package/dist/better-auth/plugin/lib/build-collections/jwks.js +2 -1
  24. package/dist/better-auth/plugin/lib/build-collections/members.d.ts.map +1 -1
  25. package/dist/better-auth/plugin/lib/build-collections/members.js +4 -7
  26. package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.d.ts.map +1 -1
  27. package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.js +3 -3
  28. package/dist/better-auth/plugin/lib/build-collections/oauth-applications.d.ts.map +1 -1
  29. package/dist/better-auth/plugin/lib/build-collections/oauth-applications.js +4 -4
  30. package/dist/better-auth/plugin/lib/build-collections/oauth-consents.d.ts.map +1 -1
  31. package/dist/better-auth/plugin/lib/build-collections/oauth-consents.js +3 -3
  32. package/dist/better-auth/plugin/lib/build-collections/organizations.d.ts.map +1 -1
  33. package/dist/better-auth/plugin/lib/build-collections/organizations.js +10 -5
  34. package/dist/better-auth/plugin/lib/build-collections/sessions.d.ts.map +1 -1
  35. package/dist/better-auth/plugin/lib/build-collections/sessions.js +2 -2
  36. package/dist/better-auth/plugin/lib/build-collections/subscriptions.d.ts.map +1 -1
  37. package/dist/better-auth/plugin/lib/build-collections/subscriptions.js +2 -1
  38. package/dist/better-auth/plugin/lib/build-collections/teams.d.ts.map +1 -1
  39. package/dist/better-auth/plugin/lib/build-collections/teams.js +3 -3
  40. package/dist/better-auth/plugin/lib/build-collections/two-factors.js +2 -2
  41. package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.d.ts.map +1 -1
  42. package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.js +10 -2
  43. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/generate-invite-url.d.ts.map +1 -1
  44. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/generate-invite-url.js +36 -2
  45. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/index.d.ts +0 -1
  46. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/index.d.ts.map +1 -1
  47. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/index.js +1 -2
  48. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/refresh-token.d.ts.map +1 -1
  49. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/refresh-token.js +4 -3
  50. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/send-invite-url.d.ts.map +1 -1
  51. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/send-invite-url.js +36 -2
  52. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.js +4 -2
  53. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.d.ts.map +1 -1
  54. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.js +103 -33
  55. package/dist/better-auth/plugin/lib/build-collections/users/hooks/index.d.ts +0 -4
  56. package/dist/better-auth/plugin/lib/build-collections/users/hooks/index.d.ts.map +1 -1
  57. package/dist/better-auth/plugin/lib/build-collections/users/hooks/index.js +1 -5
  58. package/dist/better-auth/plugin/lib/build-collections/users/index.d.ts.map +1 -1
  59. package/dist/better-auth/plugin/lib/build-collections/users/index.js +6 -25
  60. package/dist/better-auth/plugin/lib/build-collections/utils/payload-access.d.ts.map +1 -1
  61. package/dist/better-auth/plugin/lib/build-collections/utils/payload-access.js +8 -3
  62. package/dist/better-auth/plugin/lib/build-collections/verifications.d.ts.map +1 -1
  63. package/dist/better-auth/plugin/lib/build-collections/verifications.js +3 -3
  64. package/dist/better-auth/plugin/lib/get-payload-auth.d.ts.map +1 -1
  65. package/dist/better-auth/plugin/lib/get-payload-auth.js +4 -1
  66. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.d.ts.map +1 -1
  67. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.js +3 -4
  68. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.d.ts +2 -3
  69. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.d.ts.map +1 -1
  70. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.js +7 -49
  71. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.d.ts.map +1 -1
  72. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.js +6 -1
  73. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.d.ts.map +1 -1
  74. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.js +5 -2
  75. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.d.ts.map +1 -1
  76. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.js +2 -1
  77. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-after-role-middleware.js +2 -2
  78. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-invite-after-signup-middleware.d.ts +16 -0
  79. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-invite-after-signup-middleware.d.ts.map +1 -0
  80. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-invite-after-signup-middleware.js +96 -0
  81. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/require-admin-invite-for-sign-up-middleware.d.ts.map +1 -1
  82. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/require-admin-invite-for-sign-up-middleware.js +2 -2
  83. package/dist/better-auth/plugin/lib/set-login-methods.d.ts.map +1 -1
  84. package/dist/better-auth/plugin/lib/set-login-methods.js +2 -2
  85. package/dist/better-auth/plugin/payload/components/login-form/alternative-methods.d.ts.map +1 -1
  86. package/dist/better-auth/plugin/payload/components/login-form/alternative-methods.js +8 -4
  87. package/dist/better-auth/plugin/payload/components/passkeys/index.d.ts.map +1 -1
  88. package/dist/better-auth/plugin/payload/components/passkeys/index.js +3 -2
  89. package/dist/better-auth/plugin/payload/utils/resolve-base-url.d.ts +9 -0
  90. package/dist/better-auth/plugin/payload/utils/resolve-base-url.d.ts.map +1 -0
  91. package/dist/better-auth/plugin/payload/utils/resolve-base-url.js +49 -0
  92. package/dist/better-auth/plugin/payload/views/admin-login/client.d.ts.map +1 -1
  93. package/dist/better-auth/plugin/payload/views/admin-login/client.js +1 -1
  94. package/dist/better-auth/plugin/payload/views/admin-login/index.d.ts.map +1 -1
  95. package/dist/better-auth/plugin/payload/views/admin-login/index.js +3 -2
  96. package/dist/better-auth/plugin/payload/views/admin-signup/client.d.ts.map +1 -1
  97. package/dist/better-auth/plugin/payload/views/admin-signup/client.js +2 -5
  98. package/dist/better-auth/plugin/payload/views/admin-signup/index.d.ts.map +1 -1
  99. package/dist/better-auth/plugin/payload/views/admin-signup/index.js +3 -2
  100. package/dist/better-auth/plugin/payload/views/forgot-password/index.d.ts.map +1 -1
  101. package/dist/better-auth/plugin/payload/views/forgot-password/index.js +4 -3
  102. package/dist/better-auth/plugin/payload/views/reset-password/index.d.ts.map +1 -1
  103. package/dist/better-auth/plugin/payload/views/reset-password/index.js +4 -3
  104. package/dist/better-auth/plugin/payload/views/two-factor-verify/index.d.ts.map +1 -1
  105. package/dist/better-auth/plugin/payload/views/two-factor-verify/index.js +3 -2
  106. package/dist/better-auth/plugin/types.d.ts +13 -56
  107. package/dist/better-auth/plugin/types.d.ts.map +1 -1
  108. package/dist/better-auth/plugin/types.js +1 -1
  109. package/dist/better-auth/scripts/generate-types.js +8 -6
  110. package/package.json +20 -17
  111. package/dist/better-auth/plugin/lib/apply-disabled-default-auth-config.d.ts.map +0 -1
  112. package/dist/better-auth/plugin/lib/apply-disabled-default-auth-config.js +0 -87
  113. package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.d.ts +0 -4
  114. package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.d.ts.map +0 -1
  115. package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.js +0 -51
  116. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.d.ts +0 -4
  117. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.d.ts.map +0 -1
  118. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.js +0 -90
  119. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.d.ts +0 -7
  120. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.d.ts.map +0 -1
  121. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.js +0 -80
  122. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.d.ts +0 -7
  123. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.d.ts.map +0 -1
  124. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.js +0 -15
  125. package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.d.ts +0 -3
  126. package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.d.ts.map +0 -1
  127. package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.js +0 -17
  128. package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.d.ts +0 -3
  129. package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.d.ts.map +0 -1
  130. package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.js +0 -90
  131. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/ensure-password-set-before-create.d.ts +0 -8
  132. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/ensure-password-set-before-create.d.ts.map +0 -1
  133. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/ensure-password-set-before-create.js +0 -23
  134. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/password.d.ts +0 -26
  135. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/password.d.ts.map +0 -1
  136. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/password.js +0 -62
  137. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/use-admin-invite-after-email-sign-up-middleware.d.ts +0 -10
  138. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/use-admin-invite-after-email-sign-up-middleware.d.ts.map +0 -1
  139. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/use-admin-invite-after-email-sign-up-middleware.js +0 -62
@@ -46,18 +46,50 @@ export const createTransform = (options, enableDebugLogs)=>{
46
46
  return collection;
47
47
  }
48
48
  /**
49
+ * Resolves a model identifier to its BA schema model key.
50
+ *
51
+ * Accepts either a BA model key ("user") or a Payload collection slug ("users"/"members")
52
+ * and returns the canonical BA model key used to index the schema.
53
+ *
54
+ * This enables adapter functions (transformInput, transformOutput, convertWhereClause)
55
+ * to work correctly regardless of whether callers pass a BA model key or a Payload slug.
56
+ */ const modelKeyCache = new Map();
57
+ function resolveModelKey(model) {
58
+ const cached = modelKeyCache.get(model);
59
+ if (cached) return cached;
60
+ // Direct match — already a BA model key
61
+ if (schema?.[model]) {
62
+ modelKeyCache.set(model, model);
63
+ return model;
64
+ }
65
+ // Reverse lookup — find the BA model key whose modelName matches this Payload slug
66
+ for (const [key, value] of Object.entries(schema)){
67
+ if (value.modelName === model) {
68
+ modelKeyCache.set(model, key);
69
+ return key;
70
+ }
71
+ }
72
+ // No match found — return as-is (custom collections not in the BA schema)
73
+ return model;
74
+ }
75
+ /**
49
76
  * Checks if a field in the Payload collection is a relationship or upload field.
50
77
  *
51
78
  * @param payload - The Payload client instance
52
79
  * @param collectionSlug - The slug of the collection
53
80
  * @param fieldName - The name of the field to check
54
81
  * @returns True if the field is a relationship or upload field, false otherwise
55
- */ function isPayloadRelationship(payload, collectionSlug, fieldName) {
82
+ */ const flattenedFieldsCache = new Map();
83
+ function isPayloadRelationship(payload, collectionSlug, fieldName) {
56
84
  const collection = payload.collections[collectionSlug];
57
85
  if (!collection) return false;
58
- const fields = flattenAllFields({
59
- fields: collection.config.fields
60
- });
86
+ let fields = flattenedFieldsCache.get(collectionSlug);
87
+ if (!fields) {
88
+ fields = flattenAllFields({
89
+ fields: collection.config.fields
90
+ });
91
+ flattenedFieldsCache.set(collectionSlug, fields);
92
+ }
61
93
  const field = fields.find((f)=>f.name === fieldName);
62
94
  return field?.type === "relationship" || field?.type === "upload";
63
95
  }
@@ -208,7 +240,7 @@ export const createTransform = (options, enableDebugLogs)=>{
208
240
  "_id"
209
241
  ].includes(key)) {
210
242
  if (typeof value === "string" && idType === "number") {
211
- const parsed = parseInt(value, 10);
243
+ const parsed = Number(value);
212
244
  if (!isNaN(parsed)) {
213
245
  debugLog([
214
246
  `ID conversion: ${key} converting string ID to number`,
@@ -236,7 +268,7 @@ export const createTransform = (options, enableDebugLogs)=>{
236
268
  if (isRelatedField) {
237
269
  // Handle single ID value conversion
238
270
  if (typeof value === "string" && idType === "number") {
239
- const parsed = parseInt(value, 10);
271
+ const parsed = Number(value);
240
272
  if (!isNaN(parsed)) {
241
273
  debugLog([
242
274
  `ID conversion: ${key} converting string ID to number`,
@@ -264,7 +296,7 @@ export const createTransform = (options, enableDebugLogs)=>{
264
296
  // Skip null/undefined values in arrays
265
297
  if (id === null || id === undefined) return id;
266
298
  if (idType === "number" && typeof id === "string") {
267
- const parsed = parseInt(id, 10);
299
+ const parsed = Number(id);
268
300
  return !isNaN(parsed) ? parsed : id;
269
301
  } else if (idType === "text" && typeof id === "number") {
270
302
  return String(id);
@@ -273,9 +305,15 @@ export const createTransform = (options, enableDebugLogs)=>{
273
305
  });
274
306
  }
275
307
  }
276
- // Handle role fields (Coming from better auth, will be a single string seperated by commas if theres multiple roles)
308
+ // Handle role fields (Coming from better auth, will be a single string separated by commas if there are multiple roles)
277
309
  if (key === "role" || key === "roles") {
278
- return value.split(",").map((role)=>role.trim().toLowerCase());
310
+ if (Array.isArray(value)) {
311
+ return value.map((role)=>typeof role === "string" ? role.trim().toLowerCase() : role);
312
+ }
313
+ if (typeof value === "string") {
314
+ return value.split(",").map((role)=>role.trim().toLowerCase());
315
+ }
316
+ return value;
279
317
  }
280
318
  // Return original value if no conversion was needed or applicable
281
319
  return value;
@@ -292,13 +330,14 @@ export const createTransform = (options, enableDebugLogs)=>{
292
330
  * @param model - The model name in the schema
293
331
  * @param idType - The expected ID type ('number' or 'text')
294
332
  * @returns Transformed data compatible with Payload CMS
295
- */ function transformInput({ data, model, idType, payload }) {
333
+ */ function transformInput({ data, model: rawModel, idType, payload }) {
334
+ const model = resolveModelKey(rawModel);
296
335
  const transformedData = {};
297
336
  const schemaFields = schema?.[model]?.fields ?? {};
298
337
  // Process each field in the input data
299
338
  Object.entries(data).forEach(([key, value])=>{
300
- // Skip null/undefined values
301
- if (value === null || value === undefined) {
339
+ // Skip undefined values (but allow null through to clear fields)
340
+ if (value === undefined) {
302
341
  return;
303
342
  }
304
343
  // Get the mapped field name from schema (if any)
@@ -359,8 +398,9 @@ export const createTransform = (options, enableDebugLogs)=>{
359
398
  * @param doc - The document returned from Payload CMS
360
399
  * @param model - The model name in the BetterAuth schema
361
400
  * @returns The transformed document compatible with BetterAuth
362
- */ function transformOutput({ doc, model, payload }) {
401
+ */ function transformOutput({ doc, model: rawModel, payload }) {
363
402
  if (!doc || typeof doc !== "object") return doc;
403
+ const model = resolveModelKey(rawModel);
364
404
  const result = {
365
405
  ...doc
366
406
  };
@@ -393,6 +433,10 @@ export const createTransform = (options, enableDebugLogs)=>{
393
433
  result[targetFieldKey] = String(value);
394
434
  return;
395
435
  }
436
+ // Convert role array to comma separated string
437
+ if ((targetFieldKey === "role" || targetFieldKey === "roles") && Array.isArray(value)) {
438
+ result[targetFieldKey] = value.join(",");
439
+ }
396
440
  // Flatten join results from { docs: [...] } to plain arrays
397
441
  if (isJoinResult(value)) {
398
442
  debugLog([
@@ -406,19 +450,57 @@ export const createTransform = (options, enableDebugLogs)=>{
406
450
  result[targetFieldKey] = flattenJoinResult(value);
407
451
  return;
408
452
  }
409
- // Handle relationship fields with renamed fieldNames
410
- const originalRelatedFieldKey = Object.keys(relationshipFields).find((k)=>relationshipFields[k].fieldName === key);
453
+ // Handle relationship fields (both renamed and non-renamed)
454
+ const originalRelatedFieldKey = Object.keys(relationshipFields).find((k)=>{
455
+ const mappedName = relationshipFields[k].fieldName || k;
456
+ return mappedName === key;
457
+ });
411
458
  if (originalRelatedFieldKey) {
412
459
  normalizeDocumentIds(result, originalRelatedFieldKey, key, value);
413
460
  return;
414
461
  }
415
- const originalDateFieldKey = Object.keys(dateFields).find((k)=>dateFields[k].fieldName === key);
462
+ // Handle date fields (both renamed and non-renamed)
463
+ const originalDateFieldKey = Object.keys(dateFields).find((k)=>{
464
+ const mappedName = dateFields[k].fieldName || k;
465
+ return mappedName === key;
466
+ });
416
467
  if (originalDateFieldKey) {
417
468
  // Convert ISO date strings to Date objects for BetterAuth
418
469
  result[targetFieldKey] = new Date(value);
419
470
  return;
420
471
  }
421
472
  });
473
+ // Strip Payload-internal fields that aren't part of the schema.
474
+ // Payload injects fields like `collection` and internal metadata
475
+ // that callers don't expect. We allow both BA schema fields AND
476
+ // Payload collection fields — this ensures plugin-added fields
477
+ // (e.g. role/token/url on admin-invitations) survive even when
478
+ // the BA schema doesn't declare them.
479
+ if (Object.keys(schemaFields).length > 0) {
480
+ const collectionSlug = getCollectionSlug(model);
481
+ let payloadFieldNames = flattenedFieldsCache.get(collectionSlug);
482
+ if (!payloadFieldNames) {
483
+ const collection = payload.collections[collectionSlug];
484
+ if (collection) {
485
+ payloadFieldNames = flattenAllFields({
486
+ fields: collection.config.fields
487
+ });
488
+ flattenedFieldsCache.set(collectionSlug, payloadFieldNames);
489
+ }
490
+ }
491
+ const payloadNames = new Set(payloadFieldNames?.map((f)=>f.name) ?? []);
492
+ const allowedKeys = new Set([
493
+ "id",
494
+ "_id",
495
+ ...Object.keys(schemaFields),
496
+ ...payloadNames
497
+ ]);
498
+ for (const key of Object.keys(result)){
499
+ if (!allowedKeys.has(key)) {
500
+ delete result[key];
501
+ }
502
+ }
503
+ }
422
504
  return result;
423
505
  }
424
506
  /**
@@ -546,44 +628,55 @@ export const createTransform = (options, enableDebugLogs)=>{
546
628
  /**
547
629
  * Converts a where clause value to the appropriate type based on field name and ID type configuration
548
630
  *
549
- * This function handles two main scenarios:
631
+ * This function handles three main scenarios:
550
632
  * 1. ID field conversion - ensures IDs match the database's expected type (number or string)
551
- * 2. Object with embedded ID - extracts and converts the ID property from objects
633
+ * 2. Relationship field conversion - ensures foreign key values match the expected ID type
634
+ * 3. Object with embedded ID - extracts and converts the ID property from objects
552
635
  *
553
636
  * @param value - The value to convert (can be primitive, object with ID, or array)
554
637
  * @param fieldName - The name of the field being queried
638
+ * @param model - The model/collection name for schema lookups
555
639
  * @param idType - The expected ID type in the database
556
640
  * @returns The converted value appropriate for the database query
557
- */ function convertWhereValue({ value, fieldName, idType }) {
558
- // Check if field is an ID field (supporting both MongoDB-style _id and standard id)
559
- if ([
641
+ */ function convertWhereValue({ value, fieldName, originalFieldKey, model, idType }) {
642
+ const schemaFields = schema?.[model]?.fields ?? {};
643
+ const lookupKey = originalFieldKey ?? fieldName;
644
+ const needsIdConversion = [
560
645
  "id",
561
646
  "_id"
562
- ].includes(fieldName)) {
563
- // Case 1: Value is an object containing an ID property
564
- if (typeof value === "object" && value !== null && "id" in value) {
565
- // Extract ID from object
566
- const id = value.id;
567
- // Use type conversion based on database configuration
568
- if (idType === "number" && typeof id === "string") {
569
- const numId = Number(id);
570
- return !isNaN(numId) ? numId : id;
571
- }
572
- if (idType === "text" && typeof id === "number") {
573
- return String(id);
574
- }
575
- return id;
647
+ ].includes(fieldName) || isRelationshipField(lookupKey, schemaFields);
648
+ if (!needsIdConversion) {
649
+ return value;
650
+ }
651
+ // Case 0: Value is an array (e.g. for the `in` operator) — convert each element
652
+ if (Array.isArray(value)) {
653
+ return value.map((v)=>convertWhereValue({
654
+ value: v,
655
+ fieldName,
656
+ originalFieldKey,
657
+ model,
658
+ idType
659
+ }));
660
+ }
661
+ // Case 1: Value is an object containing an ID property
662
+ if (typeof value === "object" && value !== null && "id" in value) {
663
+ const id = value.id;
664
+ if (idType === "number" && typeof id === "string") {
665
+ const numId = Number(id);
666
+ return !isNaN(numId) ? numId : id;
576
667
  }
577
- // Case 2: Value is a standalone ID that needs type conversion
578
- // Convert string ID to number if database expects numeric IDs
579
- if (idType === "number" && typeof value === "string" && !isNaN(Number(value))) {
580
- return Number(value);
581
- } else if (idType === "text" && typeof value === "number") {
582
- return String(value);
668
+ if (idType === "text" && typeof id === "number") {
669
+ return String(id);
583
670
  }
584
- return value;
671
+ return id;
672
+ }
673
+ // Case 2: Value is a standalone ID that needs type conversion
674
+ if (idType === "number" && typeof value === "string" && !isNaN(Number(value))) {
675
+ return Number(value);
676
+ }
677
+ if (idType === "text" && typeof value === "number") {
678
+ return String(value);
585
679
  }
586
- // For non-ID fields, return the value unchanged
587
680
  return value;
588
681
  }
589
682
  /**
@@ -601,7 +694,8 @@ export const createTransform = (options, enableDebugLogs)=>{
601
694
  * @param model - The model/collection name to query
602
695
  * @param where - Array of Better Auth where conditions
603
696
  * @returns A Payload-compatible where clause object
604
- */ function convertWhereClause({ idType, model, where, payload }) {
697
+ */ function convertWhereClause({ idType, model: rawModel, where, payload }) {
698
+ const model = resolveModelKey(rawModel);
605
699
  // Handle empty where clause
606
700
  if (!where) return {};
607
701
  function getPayloadFieldName(fieldKey) {
@@ -618,6 +712,8 @@ export const createTransform = (options, enableDebugLogs)=>{
618
712
  const value = convertWhereValue({
619
713
  value: w.value,
620
714
  fieldName,
715
+ originalFieldKey: w.field,
716
+ model,
621
717
  idType
622
718
  });
623
719
  // Create the Payload where condition with proper operator
@@ -636,6 +732,8 @@ export const createTransform = (options, enableDebugLogs)=>{
636
732
  const value = convertWhereValue({
637
733
  value: w.value,
638
734
  fieldName,
735
+ originalFieldKey: w.field,
736
+ model,
639
737
  idType
640
738
  });
641
739
  return {
@@ -648,6 +746,8 @@ export const createTransform = (options, enableDebugLogs)=>{
648
746
  const value = convertWhereValue({
649
747
  value: w.value,
650
748
  fieldName,
749
+ originalFieldKey: w.field,
750
+ model,
651
751
  idType
652
752
  });
653
753
  return {
@@ -681,15 +781,20 @@ export const createTransform = (options, enableDebugLogs)=>{
681
781
  * @example
682
782
  * // Input: ['email', 'name']
683
783
  * // Output: { email: true, name: true }
684
- */ function convertSelect(model, select) {
784
+ */ function convertSelect(rawModel, select, payload) {
785
+ const model = resolveModelKey(rawModel);
685
786
  // Return undefined if select is empty or not provided
686
787
  if (!select || select.length === 0) return undefined;
687
788
  // Transform the array of field names into a Payload select object
688
- // while also mapping any field names that might be different in Payload
689
- return select.reduce((acc, field)=>({
789
+ // applying both schema-level and collection-level field name mapping
790
+ return select.reduce((acc, field)=>{
791
+ const schemaFieldName = getFieldName(model, field);
792
+ const fieldName = payload ? getCollectionFieldNameByFieldKeyUntyped(getCollectionByModelKey(payload.collections, model), schemaFieldName) : schemaFieldName;
793
+ return {
690
794
  ...acc,
691
- [getFieldName(model, field)]: true
692
- }), {});
795
+ [fieldName]: true
796
+ };
797
+ }, {});
693
798
  }
694
799
  /**
695
800
  * Converts a better-auth sort object to a Payload sort string
@@ -708,9 +813,12 @@ export const createTransform = (options, enableDebugLogs)=>{
708
813
  * // Output: '-email'
709
814
  * // Input: { field: 'createdAt', direction: 'asc' }
710
815
  * // Output: 'createdAt'
711
- */ function convertSort(model, sortBy) {
816
+ */ function convertSort(rawModel, sortBy, payload) {
817
+ const model = resolveModelKey(rawModel);
712
818
  if (!sortBy) return undefined;
713
- const fieldName = getFieldName(model, sortBy.field);
819
+ const schemaFieldName = getFieldName(model, sortBy.field);
820
+ // Apply collection-level field name mapping if payload is available
821
+ const fieldName = payload ? getCollectionFieldNameByFieldKeyUntyped(getCollectionByModelKey(payload.collections, model), schemaFieldName) : schemaFieldName;
714
822
  const prefix = sortBy.direction === "desc" ? "-" : "";
715
823
  return `${prefix}${fieldName}`;
716
824
  }
@@ -726,4 +834,4 @@ export const createTransform = (options, enableDebugLogs)=>{
726
834
  };
727
835
  };
728
836
 
729
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iZXR0ZXItYXV0aC9hZGFwdGVyL3RyYW5zZm9ybS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJldHRlckF1dGhPcHRpb25zLCBXaGVyZSB9IGZyb20gXCJiZXR0ZXItYXV0aFwiO1xuaW1wb3J0IHR5cGUgeyBEQkZpZWxkQXR0cmlidXRlIH0gZnJvbSBcImJldHRlci1hdXRoL2RiXCI7XG5pbXBvcnQgeyBnZXRBdXRoVGFibGVzIH0gZnJvbSBcImJldHRlci1hdXRoL2RiXCI7XG5pbXBvcnQge1xuICB0eXBlIEJhc2VQYXlsb2FkLFxuICB0eXBlIENvbGxlY3Rpb25TbHVnLFxuICBmbGF0dGVuQWxsRmllbGRzLFxuICB0eXBlIFdoZXJlIGFzIFBheWxvYWRXaGVyZVxufSBmcm9tIFwicGF5bG9hZFwiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbEtleSB9IGZyb20gXCJAL2JldHRlci1hdXRoL2dlbmVyYXRlZC10eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0Q29sbGVjdGlvbkJ5TW9kZWxLZXksXG4gIGdldENvbGxlY3Rpb25GaWVsZE5hbWVCeUZpZWxkS2V5VW50eXBlZCxcbiAgZ2V0RmllbGRLZXlCeUNvbGxlY3Rpb25GaWVsZE5hbWVcbn0gZnJvbSBcIkAvYmV0dGVyLWF1dGgvcGx1Z2luL2hlbHBlcnMvZ2V0LWNvbGxlY3Rpb25cIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVRyYW5zZm9ybSA9IChcbiAgb3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMsXG4gIGVuYWJsZURlYnVnTG9nczogYm9vbGVhblxuKSA9PiB7XG4gIGNvbnN0IHNjaGVtYSA9IGdldEF1dGhUYWJsZXMob3B0aW9ucyk7XG5cbiAgZnVuY3Rpb24gZGVidWdMb2cobWVzc2FnZTogYW55W10pIHtcbiAgICBpZiAoZW5hYmxlRGVidWdMb2dzKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW3BheWxvYWQtZGItYWRhcHRlcl1gLCAuLi5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFwcyBhIEJldHRlckF1dGggc2NoZW1hIG1vZGVsIG5hbWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgUGF5bG9hZCBDTVMgY29sbGVjdGlvbiBzbHVnLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJlc29sdmVzIHRoZSBhcHByb3ByaWF0ZSBjb2xsZWN0aW9uIHNsdWcgYnk6XG4gICAqIDEuIExvb2tpbmcgdXAgdGhlIG1vZGVsIGluIHRoZSBCZXR0ZXJBdXRoIHNjaGVtYSB0byBmaW5kIGl0cyBjb25maWd1cmVkIG1vZGVsTmFtZVxuICAgKiAyLiBGYWxsaW5nIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG1vZGVsIG5hbWUgaWYgbm8gbWFwcGluZyBleGlzdHNcbiAgICpcbiAgICogQ29sbGVjdGlvbiBzbHVnIHJlc29sdXRpb24gZm9sbG93cyB0aGVzZSBydWxlczpcbiAgICogLSBGb3IgYmFzZSBjb2xsZWN0aW9uczogVGhlIHNhbml0aXplQmV0dGVyQXV0aE9wdGlvbnMgZnVuY3Rpb24gZW5zdXJlcyB0aGUgY29sbGVjdGlvbiBzbHVnXG4gICAqICAgZnJvbSBwbHVnaW4gb3B0aW9ucyBpcyBzZXQgYXMgdGhlIG1vZGVsIG5hbWUgaW4gdGhlIHNjaGVtYVxuICAgKiAtIEZvciBwbHVnaW5zOiBUaGUgYmV0dGVyQXV0aFBsdWdpblNsdWdzIGNvbnN0YW50IGlzIHVzZWQgYXMgdGhlIG1vZGVsTmFtZVxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgQmV0dGVyQXV0aCBtb2RlbCBuYW1lIHRvIHJlc29sdmVcbiAgICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgUGF5bG9hZCBDTVMgY29sbGVjdGlvbiBzbHVnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIHNjaGVtYVsndXNlciddLm1vZGVsTmFtZSBpcyAndXNlcnMnXG4gICAqIGdldENvbGxlY3Rpb25TbHVnKCd1c2VyJykgLy8gUmV0dXJucyAndXNlcnMnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIG1vZGVsIGRvZXNuJ3QgZXhpc3QgaW4gc2NoZW1hXG4gICAqIGdldENvbGxlY3Rpb25TbHVnKCdjdXN0b20nKSAvLyBSZXR1cm5zICdjdXN0b20nXG4gICAqXG4gICAqIEB3YXJuaW5nIElmIGEgY29sbGVjdGlvbiBpcyBvdmVycmlkZGVuIHVzaW5nIHRoZSBjb2xsZWN0aW9uT3ZlcnJpZGUgb3B0aW9uXG4gICAqIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHNjaGVtYSBtYXBwaW5nLCB0aGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gaW5jb3JyZWN0IHNsdWdzXG4gICAqL1xuICBmdW5jdGlvbiBnZXRDb2xsZWN0aW9uU2x1Zyhtb2RlbDogTW9kZWxLZXkpOiBDb2xsZWN0aW9uU2x1ZyB7XG4gICAgLy8gRmlyc3QgdHJ5IHRvIGdldCB0aGUgbW9kZWxOYW1lIGZyb20gc2NoZW1hLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtb2RlbCBuYW1lXG4gICAgY29uc3QgY29sbGVjdGlvbiA9IHNjaGVtYT8uW21vZGVsXT8ubW9kZWxOYW1lIHx8IG1vZGVsO1xuICAgIGRlYnVnTG9nKFtcImdldENvbGxlY3Rpb25TbHVnOlwiLCB7IG1vZGVsLCByZXNvbHZlZFNsdWc6IGNvbGxlY3Rpb24gfV0pO1xuICAgIHJldHVybiBjb2xsZWN0aW9uIGFzIENvbGxlY3Rpb25TbHVnO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGZpZWxkIGluIHRoZSBQYXlsb2FkIGNvbGxlY3Rpb24gaXMgYSByZWxhdGlvbnNoaXAgb3IgdXBsb2FkIGZpZWxkLlxuICAgKlxuICAgKiBAcGFyYW0gcGF5bG9hZCAtIFRoZSBQYXlsb2FkIGNsaWVudCBpbnN0YW5jZVxuICAgKiBAcGFyYW0gY29sbGVjdGlvblNsdWcgLSBUaGUgc2x1ZyBvZiB0aGUgY29sbGVjdGlvblxuICAgKiBAcGFyYW0gZmllbGROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIG9yIHVwbG9hZCBmaWVsZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBmdW5jdGlvbiBpc1BheWxvYWRSZWxhdGlvbnNoaXAoXG4gICAgcGF5bG9hZDogQmFzZVBheWxvYWQsXG4gICAgY29sbGVjdGlvblNsdWc6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZ1xuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gcGF5bG9hZC5jb2xsZWN0aW9uc1tjb2xsZWN0aW9uU2x1Z107XG4gICAgaWYgKCFjb2xsZWN0aW9uKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBmaWVsZHMgPSBmbGF0dGVuQWxsRmllbGRzKHsgZmllbGRzOiBjb2xsZWN0aW9uLmNvbmZpZy5maWVsZHMgfSk7XG4gICAgY29uc3QgZmllbGQgPSBmaWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBmaWVsZE5hbWUpO1xuXG4gICAgcmV0dXJuIGZpZWxkPy50eXBlID09PSBcInJlbGF0aW9uc2hpcFwiIHx8IGZpZWxkPy50eXBlID09PSBcInVwbG9hZFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgYSBCZXR0ZXJBdXRoIHNjaGVtYSBmaWVsZCB0byBpdHMgY29ycmVzcG9uZGluZyBQYXlsb2FkIENNUyBmaWVsZCBuYW1lLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJlc29sdmVzIHRoZSBhcHByb3ByaWF0ZSBmaWVsZCBuYW1lIGJ5OlxuICAgKiAxLiBQcmVzZXJ2aW5nICdpZCcgb3IgJ19pZCcgZmllbGRzIGFzLWlzIChzcGVjaWFsIGNhc2UgaGFuZGxpbmcpXG4gICAqIDIuIExvb2tpbmcgdXAgdGhlIGZpZWxkIGluIHRoZSBCZXR0ZXJBdXRoIHNjaGVtYSB0byBmaW5kIGl0cyBjb25maWd1cmVkIGZpZWxkTmFtZVxuICAgKiAzLiBGYWxsaW5nIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGZpZWxkIG5hbWUgaWYgbm8gbWFwcGluZyBleGlzdHNcbiAgICpcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIEJldHRlckF1dGggbW9kZWwgbmFtZSBjb250YWluaW5nIHRoZSBmaWVsZFxuICAgKiBAcGFyYW0gZmllbGQgLSBUaGUgb3JpZ2luYWwgZmllbGQgbmFtZSB0byByZXNvbHZlXG4gICAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIFBheWxvYWQgQ01TIGZpZWxkIG5hbWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgc2NoZW1hWyd1c2VyJ10uZmllbGRzWydlbWFpbCddLmZpZWxkTmFtZSBpcyAnZW1haWxBZGRyZXNzJ1xuICAgKiBnZXRGaWVsZE5hbWUoJ3VzZXInLCAnZW1haWwnKSAvLyBSZXR1cm5zICdlbWFpbEFkZHJlc3MnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFNwZWNpYWwgY2FzZSBmb3IgSUQgZmllbGRzXG4gICAqIGdldEZpZWxkTmFtZSgndXNlcicsICdpZCcpIC8vIEFsd2F5cyByZXR1cm5zICdpZCdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgZmllbGQgZG9lc24ndCBleGlzdCBpbiBzY2hlbWEgb3IgaGFzIG5vIGZpZWxkTmFtZSBtYXBwaW5nXG4gICAqIGdldEZpZWxkTmFtZSgndXNlcicsICdjdXN0b20nKSAvLyBSZXR1cm5zICdjdXN0b20nXG4gICAqXG4gICAqIEB3YXJuaW5nIElmIGEgZmllbGROYW1lIGlzIG92ZXJyaWRkZW4gaW4gdGhlIHBheWxvYWQgY29sbGVjdGlvbiBjb25maWcgdXNpbmcgdGhlIGNvbGxlY3Rpb25PdmVycmlkZSBvcHRpb25cbiAgICogd2l0aG91dCB1cGRhdGluZyB0aGUgc2NoZW1hIG1hcHBpbmcsIHRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBpbmNvcnJlY3QgZmllbGQgbmFtZXNcbiAgICovXG4gIGZ1bmN0aW9uIGdldEZpZWxkTmFtZShtb2RlbDogTW9kZWxLZXksIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogJ2lkJyBvciAnX2lkJyBpcyBhbHdheXMgcHJlc2VydmVkIGFzLWlzXG4gICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLmluY2x1ZGVzKGZpZWxkKSkge1xuICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8vIExvb2sgdXAgdGhlIGZpZWxkIGluIHRoZSBzY2hlbWFcbiAgICBjb25zdCBmaWVsZERlZmluaXRpb24gPSBzY2hlbWFbbW9kZWxdPy5maWVsZHNbZmllbGRdO1xuXG4gICAgLy8gVXNlIHRoZSBjb25maWd1cmVkIGZpZWxkTmFtZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gb3JpZ2luYWxcbiAgICBjb25zdCBmaWVsZE5hbWUgPSBmaWVsZERlZmluaXRpb24/LmZpZWxkTmFtZSB8fCBmaWVsZDtcblxuICAgIC8vIExvZyB0aGUgZmllbGQgcmVzb2x1dGlvbiBmb3IgZGVidWdnaW5nXG4gICAgZGVidWdMb2coW1wiZ2V0RmllbGQ6IFwiLCB7IG1vZGVsLCBvcmlnaW5hbEZpZWxkOiBmaWVsZCwgZmllbGROYW1lIH1dKTtcblxuICAgIHJldHVybiBmaWVsZE5hbWU7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkIGJ5IGNoZWNraW5nIGZvciBhIHJlZmVyZW5jZXMgcHJvcGVydHkuXG4gICAqXG4gICAqIFJlbGF0aW9uc2hpcCBmaWVsZHMgaW4gdGhlIHNjaGVtYSBoYXZlIGEgJ3JlZmVyZW5jZXMnIHByb3BlcnR5IHRoYXQgcG9pbnRzIHRvIGFub3RoZXIgbW9kZWwuXG4gICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoaXMgcHJvcGVydHkgZXhpc3RzIHRvIGlkZW50aWZ5IHJlbGF0aW9uc2hpcCBmaWVsZHMuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZEtleSAtIFRoZSBrZXkgb2YgdGhlIGZpZWxkIHRvIGNoZWNrIGluIHRoZSBzY2hlbWFcbiAgICogQHBhcmFtIHNjaGVtYUZpZWxkcyAtIE9iamVjdCBjb250YWluaW5nIGFsbCBmaWVsZHMgZnJvbSB0aGUgc2NoZW1hIGZvciBhIHNwZWNpZmljIG1vZGVsXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkIChoYXMgcmVmZXJlbmNlcyksIGZhbHNlIG90aGVyd2lzZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJZiBzY2hlbWEudXNlci5maWVsZHMucG9zdHMgaGFzIHsgcmVmZXJlbmNlczoge30gfVxuICAgKiBpc1JlbGF0aW9uc2hpcEZpZWxkKCdwb3N0cycsIHNjaGVtYS51c2VyLmZpZWxkcykgLy8gUmV0dXJucyB0cnVlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIHNjaGVtYS51c2VyLmZpZWxkcy5lbWFpbCBoYXMgbm8gcmVmZXJlbmNlcyBwcm9wZXJ0eVxuICAgKiBpc1JlbGF0aW9uc2hpcEZpZWxkKCdlbWFpbCcsIHNjaGVtYS51c2VyLmZpZWxkcykgLy8gUmV0dXJucyBmYWxzZVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSZWxhdGlvbnNoaXBGaWVsZChcbiAgICBmaWVsZEtleTogc3RyaW5nLFxuICAgIHNjaGVtYUZpZWxkczogUmVjb3JkPHN0cmluZywgREJGaWVsZEF0dHJpYnV0ZT5cbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gQSBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZCBpZiBpdCBoYXMgYSAncmVmZXJlbmNlcycgcHJvcGVydHkgZGVmaW5lZFxuICAgIHJldHVybiBzY2hlbWFGaWVsZHNbZmllbGRLZXldPy5yZWZlcmVuY2VzICE9PSB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqXG4gICAqIEV4dHJhY3RzIGEgc2luZ2xlIElEIHZhbHVlIGZyb20gYSBQYXlsb2FkIHdoZXJlIGNsYXVzZSBpZiBpdCByZXByZXNlbnRzIGEgc2ltcGxlIElEIHF1ZXJ5LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGFuYWx5emVzIGEgUGF5bG9hZCB3aGVyZSBjbGF1c2UgdG8gZGV0ZXJtaW5lIGlmIGl0J3MgYSBzaW1wbGUgcXVlcnkgZm9yIGFcbiAgICogc2luZ2xlIGRvY3VtZW50IGJ5IElELiBJdCBzdXBwb3J0cyBib3RoICdpZCcgYW5kICdfaWQnIGZpZWxkcyB3aXRoICdlcXVhbHMnIG9yICdjb250YWlucydcbiAgICogb3BlcmF0b3JzLiBUaGlzIGlzIHVzZWZ1bCBmb3Igb3B0aW1pemluZyBxdWVyaWVzIHdoZW4gd2Ugb25seSBuZWVkIHRvIGZldGNoIGEgc2luZ2xlIGRvY3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gd2hlcmUgLSBUaGUgUGF5bG9hZCB3aGVyZSBjbGF1c2UgdG8gYW5hbHl6ZVxuICAgKiBAcmV0dXJucyBUaGUgSUQgdmFsdWUgKHN0cmluZyBvciBudW1iZXIpIGlmIHRoZSB3aGVyZSBjbGF1c2UgaXMgYSBzaW1wbGUgSUQgcXVlcnksIG51bGwgb3RoZXJ3aXNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgJzEyMycgZm9yIGEgc2ltcGxlIGVxdWFscyBxdWVyeVxuICAgKiBzaW5nbGVJZFF1ZXJ5KHsgaWQ6IHsgZXF1YWxzOiAnMTIzJyB9IH0pIC8vICcxMjMnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgNDU2IGZvciBhIHNpbXBsZSBlcXVhbHMgcXVlcnkgd2l0aCBudW1iZXIgSURcbiAgICogc2luZ2xlSWRRdWVyeSh7IF9pZDogeyBlcXVhbHM6IDQ1NiB9IH0pIC8vIDQ1NlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXR1cm5zICc3ODknIGZvciBhIGNvbnRhaW5zIHF1ZXJ5IHdpdGggYSBzaW5nbGUgdmFsdWVcbiAgICogc2luZ2xlSWRRdWVyeSh7IGlkOiB7IGNvbnRhaW5zOiBbJzc4OSddIH0gfSkgLy8gJzc4OSdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyBudWxsIGZvciBjb21wbGV4IHF1ZXJpZXNcbiAgICogc2luZ2xlSWRRdWVyeSh7IGFuZDogW3sgaWQ6IHsgZXF1YWxzOiAnMTIzJyB9IH1dIH0pIC8vIG51bGxcbiAgICovXG4gIGZ1bmN0aW9uIHNpbmdsZUlkUXVlcnkod2hlcmU6IFBheWxvYWRXaGVyZSkge1xuICAgIC8vIFJldHVybiBudWxsIGZvciBlbXB0eSB3aGVyZSBjbGF1c2VzIG9yIGNvbXBsZXggcXVlcmllcyB3aXRoICdhbmQnLydvcicgb3BlcmF0b3JzXG4gICAgaWYgKCF3aGVyZSB8fCBcImFuZFwiIGluIHdoZXJlIHx8IFwib3JcIiBpbiB3aGVyZSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgd2hlcmUgY2xhdXNlIGNvbnRhaW5zIGVpdGhlciAnaWQnIG9yICdfaWQnIGZpZWxkXG4gICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLnNvbWUoKGZpZWxkKSA9PiBmaWVsZCBpbiB3aGVyZSkpIHtcbiAgICAgIC8vIERldGVybWluZSB3aGljaCBJRCBmaWVsZCBpcyBiZWluZyB1c2VkIChzdXBwb3J0IGJvdGggJ2lkJyBhbmQgJ19pZCcpXG4gICAgICBjb25zdCBpZEZpZWxkID0gXCJpZFwiIGluIHdoZXJlID8gXCJpZFwiIDogXCJfaWRcIjtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IHdoZXJlW2lkRmllbGRdO1xuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBlcXVhbHMgb3BlcmF0b3IgY2FzZVxuICAgICAgaWYgKFxuICAgICAgICBjb25kaXRpb24gJiZcbiAgICAgICAgdHlwZW9mIGNvbmRpdGlvbiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShjb25kaXRpb24pICYmXG4gICAgICAgIFwiZXF1YWxzXCIgaW4gY29uZGl0aW9uXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uZXF1YWxzO1xuICAgICAgICAvLyBPbmx5IHJldHVybiBzdHJpbmcgb3IgbnVtYmVyIElEIHZhbHVlc1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBjb250YWlucyBvcGVyYXRvciBjYXNlIHdpdGggYSBzaW5nbGUgdmFsdWVcbiAgICAgIGlmIChcbiAgICAgICAgY29uZGl0aW9uICYmXG4gICAgICAgIHR5cGVvZiBjb25kaXRpb24gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoY29uZGl0aW9uKSAmJlxuICAgICAgICBcImNvbnRhaW5zXCIgaW4gY29uZGl0aW9uICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoY29uZGl0aW9uLmNvbnRhaW5zKSAmJlxuICAgICAgICBjb25kaXRpb24uY29udGFpbnMubGVuZ3RoID09PSAxXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uY29udGFpbnNbMF07XG4gICAgICAgIC8vIE9ubHkgcmV0dXJuIHN0cmluZyBvciBudW1iZXIgSUQgdmFsdWVzXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIG51bGwgaWYgbm8gdmFsaWQgSUQgcXVlcnkgd2FzIGZvdW5kXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBkYXRhIHZhbHVlcyBiYXNlZCBvbiBmaWVsZCB0eXBlIGFuZCByZXF1aXJlZCBJRCB0eXBlXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0eXBlIGNvbnZlcnNpb24gZm9yIHJlbGF0aW9uc2hpcCBmaWVsZHMgdG8gZW5zdXJlXG4gICAqIElEcyBhcmUgaW4gdGhlIGNvcnJlY3QgZm9ybWF0IChzdHJpbmcgb3IgbnVtYmVyKSBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBmaWVsZCBrZXkvbmFtZVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gbm9ybWFsaXplXG4gICAqIEBwYXJhbSBpc1JlbGF0ZWRGaWVsZCAtIFdoZXRoZXIgdGhpcyBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZFxuICAgKiBAcGFyYW0gaWRUeXBlIC0gVGhlIGV4cGVjdGVkIElEIHR5cGUgKCdudW1iZXInIG9yICd0ZXh0JylcbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgdmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEoe1xuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICBpc1JlbGF0ZWRGaWVsZCxcbiAgICBpZFR5cGVcbiAgfToge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiBhbnk7XG4gICAgaXNSZWxhdGVkRmllbGQ6IGJvb2xlYW47XG4gICAgaWRUeXBlOiBcIm51bWJlclwiIHwgXCJ0ZXh0XCI7XG4gIH0pIHtcbiAgICAvLyBTa2lwIHByb2Nlc3NpbmcgZm9yIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgaWRUeXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgIGBJRCBjb252ZXJzaW9uOiAke2tleX0gY29udmVydGluZyBzdHJpbmcgSUQgdG8gbnVtYmVyYCxcbiAgICAgICAgICAgIHsgb3JpZ2luYWw6IHZhbHVlLCBjb252ZXJ0ZWQ6IHBhcnNlZCB9XG4gICAgICAgICAgXSk7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiBpZFR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ0lkID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgIGBJRCBjb252ZXJzaW9uOiAke2tleX0gY29udmVydGluZyBudW1iZXIgSUQgdG8gc3RyaW5nYCxcbiAgICAgICAgICB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBzdHJpbmdJZCB9XG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4gc3RyaW5nSWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT25seSBwcm9jZXNzIHJlbGF0aW9uc2hpcCBmaWVsZHMgdGhhdCBuZWVkIHR5cGUgY29udmVyc2lvblxuICAgIGlmIChpc1JlbGF0ZWRGaWVsZCkge1xuICAgICAgLy8gSGFuZGxlIHNpbmdsZSBJRCB2YWx1ZSBjb252ZXJzaW9uXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIGlkVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgICBgSUQgY29udmVyc2lvbjogJHtrZXl9IGNvbnZlcnRpbmcgc3RyaW5nIElEIHRvIG51bWJlcmAsXG4gICAgICAgICAgICB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBwYXJzZWQgfVxuICAgICAgICAgIF0pO1xuICAgICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIGlkVHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nSWQgPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgYElEIGNvbnZlcnNpb246ICR7a2V5fSBjb252ZXJ0aW5nIG51bWJlciBJRCB0byBzdHJpbmdgLFxuICAgICAgICAgIHsgb3JpZ2luYWw6IHZhbHVlLCBjb252ZXJ0ZWQ6IHN0cmluZ0lkIH1cbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiBzdHJpbmdJZDtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGFycmF5IG9mIElEcyAtIG1hcCBlYWNoIHZhbHVlIHRvIHRoZSBjb3JyZWN0IHR5cGVcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUubWFwKChpZCkgPT4ge1xuICAgICAgICAgIC8vIFNraXAgbnVsbC91bmRlZmluZWQgdmFsdWVzIGluIGFycmF5c1xuICAgICAgICAgIGlmIChpZCA9PT0gbnVsbCB8fCBpZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gaWQ7XG5cbiAgICAgICAgICBpZiAoaWRUeXBlID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQoaWQsIDEwKTtcbiAgICAgICAgICAgIHJldHVybiAhaXNOYU4ocGFyc2VkKSA/IHBhcnNlZCA6IGlkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaWRUeXBlID09PSBcInRleHRcIiAmJiB0eXBlb2YgaWQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSByb2xlIGZpZWxkcyAoQ29taW5nIGZyb20gYmV0dGVyIGF1dGgsIHdpbGwgYmUgYSBzaW5nbGUgc3RyaW5nIHNlcGVyYXRlZCBieSBjb21tYXMgaWYgdGhlcmVzIG11bHRpcGxlIHJvbGVzKVxuICAgIGlmIChrZXkgPT09IFwicm9sZVwiIHx8IGtleSA9PT0gXCJyb2xlc1wiKSB7XG4gICAgICByZXR1cm4gdmFsdWUuc3BsaXQoXCIsXCIpLm1hcCgocm9sZTogc3RyaW5nKSA9PiByb2xlLnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gb3JpZ2luYWwgdmFsdWUgaWYgbm8gY29udmVyc2lvbiB3YXMgbmVlZGVkIG9yIGFwcGxpY2FibGVcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtcyBpbnB1dCBkYXRhIGZyb20gYmV0dGVyLWF1dGggdG8gUGF5bG9hZCBDTVMgZm9ybWF0XG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlczpcbiAgICogMS4gRmllbGQgbmFtZSBtYXBwaW5nIGFjY29yZGluZyB0byBzY2hlbWEgZGVmaW5pdGlvbnNcbiAgICogMi4gSUQgdHlwZSBjb252ZXJzaW9uIGZvciByZWxhdGlvbnNoaXAgZmllbGRzXG4gICAqIDMuIFByb3BlciBkYXRhIG5vcm1hbGl6YXRpb24gYmFzZWQgb24gZmllbGQgdHlwZXNcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgaW5wdXQgZGF0YSBmcm9tIGJldHRlci1hdXRoXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbCBuYW1lIGluIHRoZSBzY2hlbWFcbiAgICogQHBhcmFtIGlkVHlwZSAtIFRoZSBleHBlY3RlZCBJRCB0eXBlICgnbnVtYmVyJyBvciAndGV4dCcpXG4gICAqIEByZXR1cm5zIFRyYW5zZm9ybWVkIGRhdGEgY29tcGF0aWJsZSB3aXRoIFBheWxvYWQgQ01TXG4gICAqL1xuICBmdW5jdGlvbiB0cmFuc2Zvcm1JbnB1dCh7XG4gICAgZGF0YSxcbiAgICBtb2RlbCxcbiAgICBpZFR5cGUsXG4gICAgcGF5bG9hZFxuICB9OiB7XG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBtb2RlbDogTW9kZWxLZXk7XG4gICAgaWRUeXBlOiBcIm51bWJlclwiIHwgXCJ0ZXh0XCI7XG4gICAgcGF5bG9hZDogQmFzZVBheWxvYWQ7XG4gIH0pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm1lZERhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBzY2hlbWFGaWVsZHMgPSBzY2hlbWE/Llttb2RlbF0/LmZpZWxkcyA/PyB7fTtcblxuICAgIC8vIFByb2Nlc3MgZWFjaCBmaWVsZCBpbiB0aGUgaW5wdXQgZGF0YVxuICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgLy8gU2tpcCBudWxsL3VuZGVmaW5lZCB2YWx1ZXNcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSBtYXBwZWQgZmllbGQgbmFtZSBmcm9tIHNjaGVtYSAoaWYgYW55KVxuICAgICAgY29uc3Qgc2NoZW1hRmllbGROYW1lID0gc2NoZW1hRmllbGRzW2tleV0/LmZpZWxkTmFtZTtcbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkTmFtZSA9IHNjaGVtYUZpZWxkTmFtZSB8fCBrZXk7XG5cbiAgICAgIC8vIENoZWNrIFBheWxvYWQgc2NoZW1hIGZvciByZWxhdGlvbnNoaXAgZmllbGRzXG4gICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldENvbGxlY3Rpb25TbHVnKG1vZGVsKTtcbiAgICAgIGNvbnN0IGlzUGF5bG9hZFJlbCA9IGlzUGF5bG9hZFJlbGF0aW9uc2hpcChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgY29sbGVjdGlvblNsdWcsXG4gICAgICAgIHRhcmdldEZpZWxkTmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSByZWxhdGlvbnNoaXAgZmllbGRcbiAgICAgIGNvbnN0IGlzUmVsYXRlZEZpZWxkID1cbiAgICAgICAgaXNSZWxhdGlvbnNoaXBGaWVsZChrZXksIHNjaGVtYUZpZWxkcykgfHwgaXNQYXlsb2FkUmVsO1xuXG4gICAgICAvLyBOb3JtYWxpemUgdGhlIGRhdGEgdmFsdWUgYmFzZWQgb24gZmllbGQgdHlwZSBhbmQgSUQgdHlwZVxuICAgICAgY29uc3Qgbm9ybWFsaXplZERhdGEgPSBub3JtYWxpemVEYXRhKHtcbiAgICAgICAgaWRUeXBlLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBpc1JlbGF0ZWRGaWVsZFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkS2V5ID0gZ2V0Q29sbGVjdGlvbkZpZWxkTmFtZUJ5RmllbGRLZXlVbnR5cGVkKFxuICAgICAgICBnZXRDb2xsZWN0aW9uQnlNb2RlbEtleShwYXlsb2FkLmNvbGxlY3Rpb25zLCBtb2RlbCksXG4gICAgICAgIHRhcmdldEZpZWxkTmFtZVxuICAgICAgKTtcbiAgICAgIHRyYW5zZm9ybWVkRGF0YVt0YXJnZXRGaWVsZEtleV0gPSBub3JtYWxpemVkRGF0YTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1lZERhdGE7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYSBQYXlsb2FkIGpvaW4gcmVzdWx0IChoYXMgZG9jcyBhcnJheSBzdHJ1Y3R1cmUpXG4gICAqL1xuICBmdW5jdGlvbiBpc0pvaW5SZXN1bHQoXG4gICAgdmFsdWU6IGFueVxuICApOiB2YWx1ZSBpcyB7IGRvY3M6IGFueVtdOyBoYXNOZXh0UGFnZT86IGJvb2xlYW47IHRvdGFsRG9jcz86IG51bWJlciB9IHtcbiAgICByZXR1cm4gKFxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgXCJkb2NzXCIgaW4gdmFsdWUgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUuZG9jcylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW5zIGEgUGF5bG9hZCBqb2luIHJlc3VsdCB0byBqdXN0IHRoZSBhcnJheSBvZiBkb2N1bWVudHMuXG4gICAqIEhhbmRsZXMgYm90aCBkaXJlY3QgZG9jdW1lbnRzIGFuZCBwb2x5bW9ycGhpYyB7IHJlbGF0aW9uVG8sIHZhbHVlIH0gZm9ybWF0LlxuICAgKi9cbiAgZnVuY3Rpb24gZmxhdHRlbkpvaW5SZXN1bHQoam9pblJlc3VsdDogeyBkb2NzOiBhbnlbXSB9KTogYW55W10ge1xuICAgIHJldHVybiBqb2luUmVzdWx0LmRvY3MubWFwKChpdGVtKSA9PiB7XG4gICAgICAvLyBIYW5kbGUgcG9seW1vcnBoaWMgam9pbiBmb3JtYXQ6IHsgcmVsYXRpb25Ubzogc3RyaW5nLCB2YWx1ZTogZG9jIH1cbiAgICAgIGlmIChcbiAgICAgICAgaXRlbSAmJlxuICAgICAgICB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBcInZhbHVlXCIgaW4gaXRlbSAmJlxuICAgICAgICBcInJlbGF0aW9uVG9cIiBpbiBpdGVtXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIFBheWxvYWQgQ01TIGRvY3VtZW50IG91dHB1dCB0byBtYXRjaCBCZXR0ZXJBdXRoIHNjaGVtYSBleHBlY3RhdGlvbnMuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBzZXZlcmFsIGNyaXRpY2FsIHRyYW5zZm9ybWF0aW9uczpcbiAgICpcbiAgICogMS4gSUQgQ29udmVyc2lvbjogRW5zdXJlcyBhbGwgSUQgZmllbGRzIGFyZSBzdHJpbmdzIGFzIHJlcXVpcmVkIGJ5IEJldHRlckF1dGhcbiAgICogICAgKHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JldHRlci1hdXRoL2JldHRlci1hdXRoL2Jsb2IvbWFpbi9wYWNrYWdlcy9iZXR0ZXItYXV0aC9zcmMvZGIvc2NoZW1hLnRzI0wxMjUpXG4gICAqXG4gICAqIDIuIFJlbGF0aW9uc2hpcCBGaWVsZCBNYXBwaW5nOiBBbGlnbnMgcmVsYXRpb25zaGlwIGZpZWxkcyB3aXRoIEJldHRlckF1dGggc2NoZW1hIG5hbWluZyBjb252ZW50aW9uc1xuICAgKiAgICBhbmQgZW5zdXJlcyBwcm9wZXIgSUQgdHlwZSBoYW5kbGluZ1xuICAgKlxuICAgKiAzLiBEYXRlIENvbnZlcnNpb246IFRyYW5zZm9ybXMgZGF0ZSBzdHJpbmdzIGZyb20gUGF5bG9hZCBpbnRvIERhdGUgb2JqZWN0cyBmb3IgQmV0dGVyQXV0aFxuICAgKlxuICAgKiA0LiBKb2luIFJlc3VsdCBGbGF0dGVuaW5nOiBDb252ZXJ0cyBQYXlsb2FkJ3MgeyBkb2NzOiBbLi4uXSB9IGpvaW4gZm9ybWF0IHRvIHBsYWluIGFycmF5c1xuICAgKlxuICAgKiBOb3RlOiBXaGlsZSBzZXR0aW5nIGRlcHRoOiAxIGluIFBheWxvYWQgb3BlcmF0aW9ucyBzaW1wbGlmaWVzIHRoaXMgcHJvY2VzcyBieSBhdm9pZGluZ1xuICAgKiBkZWVwbHkgbmVzdGVkIG9iamVjdHMsIHdlIG1haW50YWluIGNvbXByZWhlbnNpdmUgY2hlY2tzIGZvciByb2J1c3RuZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gZG9jIC0gVGhlIGRvY3VtZW50IHJldHVybmVkIGZyb20gUGF5bG9hZCBDTVNcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG1vZGVsIG5hbWUgaW4gdGhlIEJldHRlckF1dGggc2NoZW1hXG4gICAqIEByZXR1cm5zIFRoZSB0cmFuc2Zvcm1lZCBkb2N1bWVudCBjb21wYXRpYmxlIHdpdGggQmV0dGVyQXV0aFxuICAgKi9cbiAgZnVuY3Rpb24gdHJhbnNmb3JtT3V0cHV0PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD4oe1xuICAgIGRvYyxcbiAgICBtb2RlbCxcbiAgICBwYXlsb2FkXG4gIH06IHtcbiAgICBkb2M6IFQ7XG4gICAgbW9kZWw6IE1vZGVsS2V5O1xuICAgIHBheWxvYWQ6IEJhc2VQYXlsb2FkO1xuICB9KTogVCB7XG4gICAgaWYgKCFkb2MgfHwgdHlwZW9mIGRvYyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGRvYztcblxuICAgIGNvbnN0IHJlc3VsdCA9IHsgLi4uZG9jIH07XG4gICAgY29uc3Qgc2NoZW1hRmllbGRzID0gc2NoZW1hPy5bbW9kZWxdPy5maWVsZHMgPz8ge307XG5cbiAgICAvLyBJZGVudGlmeSByZWxhdGlvbnNoaXAgZmllbGRzIHdpdGggY3VzdG9tIGZpZWxkIG5hbWUgbWFwcGluZ3NcbiAgICBjb25zdCByZWxhdGlvbnNoaXBGaWVsZHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhzY2hlbWFGaWVsZHMpLmZpbHRlcigoW2tleV0pID0+IHtcbiAgICAgICAgaWYgKGlzUmVsYXRpb25zaGlwRmllbGQoa2V5LCBzY2hlbWFGaWVsZHMpKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBBbHNvIGNoZWNrIHBheWxvYWQgc2NoZW1hXG4gICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IHNjaGVtYUZpZWxkc1trZXldPy5maWVsZE5hbWUgfHwga2V5O1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldENvbGxlY3Rpb25TbHVnKG1vZGVsKTtcbiAgICAgICAgcmV0dXJuIGlzUGF5bG9hZFJlbGF0aW9uc2hpcChwYXlsb2FkLCBjb2xsZWN0aW9uU2x1ZywgZmllbGROYW1lKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBkYXRlRmllbGRzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoc2NoZW1hRmllbGRzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlLnR5cGUgPT09IFwiZGF0ZVwiKVxuICAgICk7XG5cbiAgICAvLyBGaXJzdCBtYWtlIHN1cmUgYWxsIHRoZSBmaWVsZHMga2V5cyBhcmUgY29ycmVjdFxuICAgIE9iamVjdC5rZXlzKHJlc3VsdCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXRGaWVsZEtleSA9IGdldEZpZWxkS2V5QnlDb2xsZWN0aW9uRmllbGROYW1lKFxuICAgICAgICBnZXRDb2xsZWN0aW9uQnlNb2RlbEtleShwYXlsb2FkLmNvbGxlY3Rpb25zLCBtb2RlbCksXG4gICAgICAgIGtleVxuICAgICAgKTtcbiAgICAgIGlmICh0YXJnZXRGaWVsZEtleSAhPT0ga2V5KSB7XG4gICAgICAgIHJlc3VsdFt0YXJnZXRGaWVsZEtleV0gPSByZXN1bHRba2V5XTtcbiAgICAgICAgZGVsZXRlIHJlc3VsdFtrZXldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmVudHJpZXMoZG9jKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkS2V5ID0gZ2V0RmllbGRLZXlCeUNvbGxlY3Rpb25GaWVsZE5hbWUoXG4gICAgICAgIGdldENvbGxlY3Rpb25CeU1vZGVsS2V5KHBheWxvYWQuY29sbGVjdGlvbnMsIG1vZGVsKSxcbiAgICAgICAga2V5XG4gICAgICApO1xuXG4gICAgICAvLyBDb252ZXJ0IElEIGZpZWxkcyB0byBzdHJpbmdzIGZvciBCZXR0ZXJBdXRoIGNvbXBhdGliaWxpdHlcbiAgICAgIGlmIChbXCJpZFwiLCBcIl9pZFwiXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJlc3VsdFt0YXJnZXRGaWVsZEtleV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEZsYXR0ZW4gam9pbiByZXN1bHRzIGZyb20geyBkb2NzOiBbLi4uXSB9IHRvIHBsYWluIGFycmF5c1xuICAgICAgaWYgKGlzSm9pblJlc3VsdCh2YWx1ZSkpIHtcbiAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgIFwidHJhbnNmb3JtT3V0cHV0OiBmbGF0dGVuaW5nIGpvaW4gcmVzdWx0XCIsXG4gICAgICAgICAgeyBrZXksIHRhcmdldEZpZWxkS2V5LCBpc0FycmF5OiBBcnJheS5pc0FycmF5KHZhbHVlLmRvY3MpIH1cbiAgICAgICAgXSk7XG4gICAgICAgIHJlc3VsdFt0YXJnZXRGaWVsZEtleV0gPSBmbGF0dGVuSm9pblJlc3VsdCh2YWx1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHJlbGF0aW9uc2hpcCBmaWVsZHMgd2l0aCByZW5hbWVkIGZpZWxkTmFtZXNcbiAgICAgIGNvbnN0IG9yaWdpbmFsUmVsYXRlZEZpZWxkS2V5ID0gT2JqZWN0LmtleXMocmVsYXRpb25zaGlwRmllbGRzKS5maW5kKFxuICAgICAgICAoaykgPT4gcmVsYXRpb25zaGlwRmllbGRzW2tdLmZpZWxkTmFtZSA9PT0ga2V5XG4gICAgICApO1xuICAgICAgaWYgKG9yaWdpbmFsUmVsYXRlZEZpZWxkS2V5KSB7XG4gICAgICAgIG5vcm1hbGl6ZURvY3VtZW50SWRzKHJlc3VsdCwgb3JpZ2luYWxSZWxhdGVkRmllbGRLZXksIGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsRGF0ZUZpZWxkS2V5ID0gT2JqZWN0LmtleXMoZGF0ZUZpZWxkcykuZmluZChcbiAgICAgICAgKGspID0+IGRhdGVGaWVsZHNba10uZmllbGROYW1lID09PSBrZXlcbiAgICAgICk7XG4gICAgICBpZiAob3JpZ2luYWxEYXRlRmllbGRLZXkpIHtcbiAgICAgICAgLy8gQ29udmVydCBJU08gZGF0ZSBzdHJpbmdzIHRvIERhdGUgb2JqZWN0cyBmb3IgQmV0dGVyQXV0aFxuICAgICAgICByZXN1bHRbdGFyZ2V0RmllbGRLZXldID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0IGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBJRCBmaWVsZHMgZm9yIGJvdGggcHJpbWFyeSBhbmQgcmVsYXRpb25zaGlwIGRvY3VtZW50cy5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBlbnN1cmVzIGNvbnNpc3RlbnQgSUQgaGFuZGxpbmcgYmV0d2VlbiBCZXR0ZXJBdXRoIGFuZCBQYXlsb2FkIENNUyBieTpcbiAgICogMS4gQ29udmVydGluZyBhbGwgSURzIHRvIHN0cmluZ3MgZm9yIEJldHRlckF1dGggKHN0b3JlZCBpbiBvcmlnaW5hbEtleSlcbiAgICogMi4gUHJlc2VydmluZyBvcmlnaW5hbCBJRCB0eXBlcyBmb3IgUGF5bG9hZCBDTVMgKHN0b3JlZCBpbiBmaWVsZE5hbWUpXG4gICAqXG4gICAqIFRoZSBmdW5jdGlvbiBoYW5kbGVzIHZhcmlvdXMgSUQgZm9ybWF0czpcbiAgICogLSBQcmltaXRpdmUgdmFsdWVzIChzdHJpbmcvbnVtYmVyIElEcylcbiAgICogLSBPYmplY3QgcmVmZXJlbmNlcyB3aXRoIElEIHByb3BlcnRpZXNcbiAgICogLSBBcnJheXMgb2YgZWl0aGVyIHByaW1pdGl2ZSBJRHMgb3Igb2JqZWN0IHJlZmVyZW5jZXNcbiAgICpcbiAgICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgb2JqZWN0IGJlaW5nIHRyYW5zZm9ybWVkXG4gICAqIEBwYXJhbSBvcmlnaW5hbEtleSAtIFRoZSBvcmlnaW5hbCBmaWVsZCBrZXkgZnJvbSBCZXR0ZXJBdXRoIHNjaGVtYVxuICAgKiBAcGFyYW0gZmllbGROYW1lIC0gVGhlIHJlbmFtZWQgZmllbGQgYXMgdXNlZCBpbiBQYXlsb2FkIENNU1xuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgSUQgdmFsdWUgdG8gbm9ybWFsaXplIChwcmltaXRpdmUsIG9iamVjdCwgb3IgYXJyYXkpXG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVEb2N1bWVudElkcyhcbiAgICByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgb3JpZ2luYWxLZXk6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55XG4gICk6IHZvaWQge1xuICAgIC8vIENhc2UgMTogUHJpbWl0aXZlIElEIHZhbHVlIChzdHJpbmcgb3IgbnVtYmVyKVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAvLyBGb3IgQmV0dGVyQXV0aDogQWx3YXlzIHVzZSBzdHJpbmcgSURzXG4gICAgICByZXN1bHRbb3JpZ2luYWxLZXldID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgIC8vIEZvciBQYXlsb2FkOiBLZWVwIG9yaWdpbmFsIHR5cGVcbiAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FzZSAyOiBPYmplY3Qgd2l0aCBJRCBwcm9wZXJ0eVxuICAgIGlmIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgXCJpZFwiIGluIHZhbHVlXG4gICAgKSB7XG4gICAgICAvLyBGb3IgQmV0dGVyQXV0aDogRXh0cmFjdCBhbmQgc3RyaW5naWZ5IHRoZSBJRFxuICAgICAgcmVzdWx0W29yaWdpbmFsS2V5XSA9IFN0cmluZyh2YWx1ZS5pZCk7XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgcG9wdWxhdGVkIHJlbGF0aW9uc2hpcCBvYmplY3Qgc28gam9pbnMgcmV0dXJuIGZ1bGwgZG9jdW1lbnRzXG4gICAgICByZXN1bHRbZmllbGROYW1lXSA9IHtcbiAgICAgICAgLi4udmFsdWUsXG4gICAgICAgIGlkOiBTdHJpbmcodmFsdWUuaWQpXG4gICAgICB9O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENhc2UgMzogQXJyYXkgb2YgSURzIG9yIHJlZmVyZW5jZXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2hlY2sgaWYgYXJyYXkgY29udGFpbnMgb2JqZWN0cyB3aXRoIElEIHByb3BlcnRpZXNcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUuZXZlcnkoXG4gICAgICAgICAgKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiICYmIGl0ZW0gIT09IG51bGwgJiYgXCJpZFwiIGluIGl0ZW1cbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIG9iamVjdHMgd2l0aCBJRHNcbiAgICAgICAgcmVzdWx0W29yaWdpbmFsS2V5XSA9IHZhbHVlLm1hcCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0uaWQpKTtcbiAgICAgICAgLy8gS2VlcCBqb2luZWQgZG9jdW1lbnRzIGludGFjdCB3aGlsZSBub3JtYWxpemluZyBJRCB0eXBlXG4gICAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWUubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgaWQ6IFN0cmluZyhpdGVtLmlkKVxuICAgICAgICB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBcnJheSBvZiBwcmltaXRpdmUgSURzXG4gICAgICAgIHJlc3VsdFtvcmlnaW5hbEtleV0gPSB2YWx1ZS5tYXAoKGl0ZW0pID0+IFN0cmluZyhpdGVtKSk7XG4gICAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWUubWFwKChpdGVtKSA9PiBpdGVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBOb3RlOiBJZiB2YWx1ZSBkb2Vzbid0IG1hdGNoIGFueSBleHBlY3RlZCBmb3JtYXQsIG5vIGNoYW5nZXMgYXJlIG1hZGVcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEJldHRlckF1dGggb3BlcmF0b3IgdG8gdGhlIGVxdWl2YWxlbnQgUGF5bG9hZCBDTVMgcXVlcnkgb3BlcmF0b3JcbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBtYXBzIHN0YW5kYXJkIHF1ZXJ5IG9wZXJhdG9ycyBmcm9tIEJldHRlckF1dGgncyBmb3JtYXQgdG9cbiAgICogdGhlIHNwZWNpZmljIGZvcm1hdCBleHBlY3RlZCBieSBQYXlsb2FkIENNUydzIHF1ZXJ5IGVuZ2luZS5cbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdG9yIC0gVGhlIEJldHRlckF1dGggb3BlcmF0b3Igc3RyaW5nIChlLmcuLCAnZXEnLCAnZ3QnLCAnY29udGFpbnMnKVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgdXNlZCB3aXRoIHRoZSBvcGVyYXRvclxuICAgKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgUGF5bG9hZC1jb21wYXRpYmxlIG9wZXJhdG9yIGFuZCB2YWx1ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXR1cm5zIHsgZXF1YWxzOiAndGVzdEBleGFtcGxlLmNvbScgfVxuICAgKiBvcGVyYXRvclRvUGF5bG9hZCgnZXEnLCAndGVzdEBleGFtcGxlLmNvbScpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgeyBncmVhdGVyX3RoYW46IDEwMCB9XG4gICAqIG9wZXJhdG9yVG9QYXlsb2FkKCdndCcsIDEwMClcbiAgICovXG4gIGZ1bmN0aW9uIG9wZXJhdG9yVG9QYXlsb2FkKFxuICAgIG9wZXJhdG9yOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueVxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICBjYXNlIFwiZXFcIjpcbiAgICAgICAgcmV0dXJuIHsgZXF1YWxzOiB2YWx1ZSB9O1xuICAgICAgY2FzZSBcIm5lXCI6XG4gICAgICAgIHJldHVybiB7IG5vdF9lcXVhbHM6IHZhbHVlIH07XG4gICAgICBjYXNlIFwiZ3RcIjpcbiAgICAgICAgcmV0dXJuIHsgZ3JlYXRlcl90aGFuOiB2YWx1ZSB9O1xuICAgICAgY2FzZSBcImd0ZVwiOlxuICAgICAgICByZXR1cm4geyBncmVhdGVyX3RoYW5fZXF1YWw6IHZhbHVlIH07XG4gICAgICBjYXNlIFwibHRcIjpcbiAgICAgICAgcmV0dXJuIHsgbGVzc190aGFuOiB2YWx1ZSB9O1xuICAgICAgY2FzZSBcImx0ZVwiOlxuICAgICAgICByZXR1cm4geyBsZXNzX3RoYW5fZXF1YWw6IHZhbHVlIH07XG4gICAgICBjYXNlIFwiY29udGFpbnNcIjpcbiAgICAgICAgcmV0dXJuIHsgY29udGFpbnM6IHZhbHVlIH07XG4gICAgICBjYXNlIFwiaW5cIjpcbiAgICAgICAgcmV0dXJuIHsgaW46IHZhbHVlIH07XG4gICAgICBjYXNlIFwic3RhcnRzX3dpdGhcIjpcbiAgICAgICAgcmV0dXJuIHsgbGlrZTogYCR7dmFsdWV9JWAgfTtcbiAgICAgIGNhc2UgXCJlbmRzX3dpdGhcIjpcbiAgICAgICAgcmV0dXJuIHsgbGlrZTogYCUke3ZhbHVlfWAgfTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBlcXVhbHMgZm9yIHVucmVjb2duaXplZCBvcGVyYXRvcnNcbiAgICAgICAgcmV0dXJuIHsgZXF1YWxzOiB2YWx1ZSB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHdoZXJlIGNsYXVzZSB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZSBiYXNlZCBvbiBmaWVsZCBuYW1lIGFuZCBJRCB0eXBlIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHR3byBtYWluIHNjZW5hcmlvczpcbiAgICogMS4gSUQgZmllbGQgY29udmVyc2lvbiAtIGVuc3VyZXMgSURzIG1hdGNoIHRoZSBkYXRhYmFzZSdzIGV4cGVjdGVkIHR5cGUgKG51bWJlciBvciBzdHJpbmcpXG4gICAqIDIuIE9iamVjdCB3aXRoIGVtYmVkZGVkIElEIC0gZXh0cmFjdHMgYW5kIGNvbnZlcnRzIHRoZSBJRCBwcm9wZXJ0eSBmcm9tIG9iamVjdHNcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgKGNhbiBiZSBwcmltaXRpdmUsIG9iamVjdCB3aXRoIElELCBvciBhcnJheSlcbiAgICogQHBhcmFtIGZpZWxkTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBiZWluZyBxdWVyaWVkXG4gICAqIEBwYXJhbSBpZFR5cGUgLSBUaGUgZXhwZWN0ZWQgSUQgdHlwZSBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCB2YWx1ZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGRhdGFiYXNlIHF1ZXJ5XG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0V2hlcmVWYWx1ZSh7XG4gICAgdmFsdWUsXG4gICAgZmllbGROYW1lLFxuICAgIGlkVHlwZVxuICB9OiB7XG4gICAgdmFsdWU6IGFueTtcbiAgICBmaWVsZE5hbWU6IHN0cmluZztcbiAgICBpZFR5cGU6IFwibnVtYmVyXCIgfCBcInRleHRcIjtcbiAgfSkge1xuICAgIC8vIENoZWNrIGlmIGZpZWxkIGlzIGFuIElEIGZpZWxkIChzdXBwb3J0aW5nIGJvdGggTW9uZ29EQi1zdHlsZSBfaWQgYW5kIHN0YW5kYXJkIGlkKVxuICAgIGlmIChbXCJpZFwiLCBcIl9pZFwiXS5pbmNsdWRlcyhmaWVsZE5hbWUpKSB7XG4gICAgICAvLyBDYXNlIDE6IFZhbHVlIGlzIGFuIG9iamVjdCBjb250YWluaW5nIGFuIElEIHByb3BlcnR5XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmIFwiaWRcIiBpbiB2YWx1ZSkge1xuICAgICAgICAvLyBFeHRyYWN0IElEIGZyb20gb2JqZWN0XG4gICAgICAgIGNvbnN0IGlkID0gdmFsdWUuaWQ7XG5cbiAgICAgICAgLy8gVXNlIHR5cGUgY29udmVyc2lvbiBiYXNlZCBvbiBkYXRhYmFzZSBjb25maWd1cmF0aW9uXG4gICAgICAgIGlmIChpZFR5cGUgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgY29uc3QgbnVtSWQgPSBOdW1iZXIoaWQpO1xuICAgICAgICAgIHJldHVybiAhaXNOYU4obnVtSWQpID8gbnVtSWQgOiBpZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZFR5cGUgPT09IFwidGV4dFwiICYmIHR5cGVvZiBpZCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcoaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgfVxuICAgICAgLy8gQ2FzZSAyOiBWYWx1ZSBpcyBhIHN0YW5kYWxvbmUgSUQgdGhhdCBuZWVkcyB0eXBlIGNvbnZlcnNpb25cbiAgICAgIC8vIENvbnZlcnQgc3RyaW5nIElEIHRvIG51bWJlciBpZiBkYXRhYmFzZSBleHBlY3RzIG51bWVyaWMgSURzXG4gICAgICBpZiAoXG4gICAgICAgIGlkVHlwZSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgIWlzTmFOKE51bWJlcih2YWx1ZSkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gICAgICB9XG4gICAgICAvLyBDb252ZXJ0IG51bWVyaWMgSUQgdG8gc3RyaW5nIGlmIGRhdGFiYXNlIGV4cGVjdHMgdGV4dCBJRHNcbiAgICAgIGVsc2UgaWYgKGlkVHlwZSA9PT0gXCJ0ZXh0XCIgJiYgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIEZvciBub24tSUQgZmllbGRzLCByZXR1cm4gdGhlIHZhbHVlIHVuY2hhbmdlZFxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBCZXR0ZXIgQXV0aCB3aGVyZSBjbGF1c2VzIHRvIFBheWxvYWQgQ01TIGNvbXBhdGlibGUgd2hlcmUgY29uZGl0aW9uc1xuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHRyYW5zZm9ybXMgdGhlIEJldHRlciBBdXRoIHF1ZXJ5IGZvcm1hdCBpbnRvIFBheWxvYWQncyBxdWVyeSBmb3JtYXQsXG4gICAqIGhhbmRsaW5nIGZpZWxkIG5hbWUgbWFwcGluZywgdmFsdWUgdHlwZSBjb252ZXJzaW9uLCBhbmQgbG9naWNhbCBvcGVyYXRvcnMgKEFORC9PUikuXG4gICAqXG4gICAqIFRoZSBmdW5jdGlvbiBoYW5kbGVzIHRocmVlIG1haW4gY2FzZXM6XG4gICAqIDEuIEVtcHR5IG9yIHVuZGVmaW5lZCB3aGVyZSBjbGF1c2UgLSByZXR1cm5zIGVtcHR5IG9iamVjdFxuICAgKiAyLiBTaW5nbGUgY29uZGl0aW9uIC0gY29udmVydHMgdG8gYSBzaW1wbGUgZmllbGQtdmFsdWUgcGFpclxuICAgKiAzLiBNdWx0aXBsZSBjb25kaXRpb25zIC0gZ3JvdXBzIGJ5IEFORC9PUiBjb25uZWN0b3JzIGFuZCBidWlsZHMgYSBjb21wbGV4IHF1ZXJ5XG4gICAqXG4gICAqIEBwYXJhbSBpZFR5cGUgLSBUaGUgZGF0YWJhc2UgSUQgdHlwZSAoJ251bWJlcicgb3IgJ3RleHQnKVxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwvY29sbGVjdGlvbiBuYW1lIHRvIHF1ZXJ5XG4gICAqIEBwYXJhbSB3aGVyZSAtIEFycmF5IG9mIEJldHRlciBBdXRoIHdoZXJlIGNvbmRpdGlvbnNcbiAgICogQHJldHVybnMgQSBQYXlsb2FkLWNvbXBhdGlibGUgd2hlcmUgY2xhdXNlIG9iamVjdFxuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydFdoZXJlQ2xhdXNlKHtcbiAgICBpZFR5cGUsXG4gICAgbW9kZWwsXG4gICAgd2hlcmUsXG4gICAgcGF5bG9hZFxuICB9OiB7XG4gICAgaWRUeXBlOiBcIm51bWJlclwiIHwgXCJ0ZXh0XCI7XG4gICAgbW9kZWw6IE1vZGVsS2V5O1xuICAgIHdoZXJlPzogV2hlcmVbXTtcbiAgICBwYXlsb2FkOiBCYXNlUGF5bG9hZDtcbiAgfSk6IFBheWxvYWRXaGVyZSB7XG4gICAgLy8gSGFuZGxlIGVtcHR5IHdoZXJlIGNsYXVzZVxuICAgIGlmICghd2hlcmUpIHJldHVybiB7fTtcblxuICAgIGZ1bmN0aW9uIGdldFBheWxvYWRGaWVsZE5hbWUoZmllbGRLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gZ2V0Q29sbGVjdGlvbkZpZWxkTmFtZUJ5RmllbGRLZXlVbnR5cGVkKFxuICAgICAgICBnZXRDb2xsZWN0aW9uQnlNb2RlbEtleShwYXlsb2FkLmNvbGxlY3Rpb25zLCBtb2RlbCksXG4gICAgICAgIGZpZWxkS2V5XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzaW5nbGUgY29uZGl0aW9uIGNhc2UgZm9yIG9wdGltaXphdGlvblxuICAgIGlmICh3aGVyZS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IHcgPSB3aGVyZVswXTtcbiAgICAgIGlmICghdykge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG5cbiAgICAgIC8vIE1hcCBmaWVsZCBuYW1lIGFjY29yZGluZyB0byBzY2hlbWEgYW5kIGNvbnZlcnQgdmFsdWUgdG8gYXBwcm9wcmlhdGUgdHlwZVxuICAgICAgY29uc3QgZmllbGROYW1lID0gZ2V0RmllbGROYW1lKG1vZGVsLCB3LmZpZWxkKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udmVydFdoZXJlVmFsdWUoe1xuICAgICAgICB2YWx1ZTogdy52YWx1ZSxcbiAgICAgICAgZmllbGROYW1lLFxuICAgICAgICBpZFR5cGVcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIFBheWxvYWQgd2hlcmUgY29uZGl0aW9uIHdpdGggcHJvcGVyIG9wZXJhdG9yXG4gICAgICBjb25zdCByZXMgPSB7XG4gICAgICAgIFtnZXRQYXlsb2FkRmllbGROYW1lKGZpZWxkTmFtZSldOiBvcGVyYXRvclRvUGF5bG9hZChcbiAgICAgICAgICB3Lm9wZXJhdG9yID8/IFwiXCIsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgKVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbXVsdGlwbGUgY29uZGl0aW9ucyBieSBzZXBhcmF0aW5nIEFORC9PUiBjbGF1c2VzXG4gICAgLy8gRGVmYXVsdCB0byBBTkQgaWYgbm8gY29ubmVjdG9yIGlzIHNwZWNpZmllZFxuICAgIGNvbnN0IGFuZCA9IHdoZXJlLmZpbHRlcigodykgPT4gdy5jb25uZWN0b3IgPT09IFwiQU5EXCIgfHwgIXcuY29ubmVjdG9yKTtcbiAgICBjb25zdCBvciA9IHdoZXJlLmZpbHRlcigodykgPT4gdy5jb25uZWN0b3IgPT09IFwiT1JcIik7XG5cbiAgICAvLyBQcm9jZXNzIEFORCBjb25kaXRpb25zXG4gICAgY29uc3QgYW5kQ2xhdXNlID0gYW5kLm1hcCgodykgPT4ge1xuICAgICAgY29uc3QgZmllbGROYW1lID0gZ2V0RmllbGROYW1lKG1vZGVsLCB3LmZpZWxkKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udmVydFdoZXJlVmFsdWUoe1xuICAgICAgICB2YWx1ZTogdy52YWx1ZSxcbiAgICAgICAgZmllbGROYW1lLFxuICAgICAgICBpZFR5cGVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2dldFBheWxvYWRGaWVsZE5hbWUoZmllbGROYW1lKV06IG9wZXJhdG9yVG9QYXlsb2FkKFxuICAgICAgICAgIHcub3BlcmF0b3IgPz8gXCJcIixcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICApXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gUHJvY2VzcyBPUiBjb25kaXRpb25zXG4gICAgY29uc3Qgb3JDbGF1c2UgPSBvci5tYXAoKHcpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShtb2RlbCwgdy5maWVsZCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRXaGVyZVZhbHVlKHtcbiAgICAgICAgdmFsdWU6IHcudmFsdWUsXG4gICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgaWRUeXBlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtnZXRQYXlsb2FkRmllbGROYW1lKGZpZWxkTmFtZSldOiBvcGVyYXRvclRvUGF5bG9hZChcbiAgICAgICAgICB3Lm9wZXJhdG9yID8/IFwiXCIsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgKVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIENvbWJpbmUgQU5EIGFuZCBPUiBjbGF1c2VzIGludG8gZmluYWwgUGF5bG9hZCB3aGVyZSBvYmplY3RcbiAgICAvLyBPbmx5IGluY2x1ZGUgbm9uLWVtcHR5IGNsYXVzZSBhcnJheXNcbiAgICByZXR1cm4ge1xuICAgICAgLi4uKGFuZENsYXVzZS5sZW5ndGggPyB7IEFORDogYW5kQ2xhdXNlIH0gOiB7fSksXG4gICAgICAuLi4ob3JDbGF1c2UubGVuZ3RoID8geyBPUjogb3JDbGF1c2UgfSA6IHt9KVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBiZXR0ZXItYXV0aCBzZWxlY3QgYXJyYXkgdG8gYSBQYXlsb2FkIHNlbGVjdCBvYmplY3RcbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB0cmFuc2Zvcm1zIHRoZSBiZXR0ZXItYXV0aCBzZWxlY3QgYXJyYXkgKHdoaWNoIGNvbnRhaW5zIGZpZWxkIG5hbWVzKVxuICAgKiBpbnRvIHRoZSBmb3JtYXQgZXhwZWN0ZWQgYnkgUGF5bG9hZCBDTVMncyBxdWVyeSBBUEkgKGFuIG9iamVjdCB3aXRoIGZpZWxkIG5hbWVzIGFzIGtleXNcbiAgICogYW5kIGJvb2xlYW4gdHJ1ZSBhcyB2YWx1ZXMpLlxuICAgKlxuICAgKiBJdCBhbHNvIGhhbmRsZXMgZmllbGQgbmFtZSBtYXBwaW5nIGJldHdlZW4gYmV0dGVyLWF1dGggc2NoZW1hIGFuZCBQYXlsb2FkIGNvbGxlY3Rpb25zXG4gICAqIGJ5IHVzaW5nIHRoZSBnZXRGaWVsZE5hbWUgaGVscGVyIHRvIHJlc29sdmUgdGhlIGNvcnJlY3QgZmllbGQgbmFtZXMuXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbC9jb2xsZWN0aW9uIG5hbWUgdG8gZ2V0IGZpZWxkIG1hcHBpbmdzIGZyb21cbiAgICogQHBhcmFtIHNlbGVjdCAtIE9wdGlvbmFsIGFycmF5IG9mIGZpZWxkIG5hbWVzIHRvIHNlbGVjdFxuICAgKiBAcmV0dXJucyBBIFBheWxvYWQtY29tcGF0aWJsZSBzZWxlY3Qgb2JqZWN0IG9yIHVuZGVmaW5lZCBpZiBubyBmaWVsZHMgdG8gc2VsZWN0XG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElucHV0OiBbJ2VtYWlsJywgJ25hbWUnXVxuICAgKiAvLyBPdXRwdXQ6IHsgZW1haWw6IHRydWUsIG5hbWU6IHRydWUgfVxuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydFNlbGVjdChtb2RlbDogTW9kZWxLZXksIHNlbGVjdD86IHN0cmluZ1tdKSB7XG4gICAgLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBzZWxlY3QgaXMgZW1wdHkgb3Igbm90IHByb3ZpZGVkXG4gICAgaWYgKCFzZWxlY3QgfHwgc2VsZWN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIC8vIFRyYW5zZm9ybSB0aGUgYXJyYXkgb2YgZmllbGQgbmFtZXMgaW50byBhIFBheWxvYWQgc2VsZWN0IG9iamVjdFxuICAgIC8vIHdoaWxlIGFsc28gbWFwcGluZyBhbnkgZmllbGQgbmFtZXMgdGhhdCBtaWdodCBiZSBkaWZmZXJlbnQgaW4gUGF5bG9hZFxuICAgIHJldHVybiBzZWxlY3QucmVkdWNlKFxuICAgICAgKGFjYywgZmllbGQpID0+ICh7IC4uLmFjYywgW2dldEZpZWxkTmFtZShtb2RlbCwgZmllbGQpXTogdHJ1ZSB9KSxcbiAgICAgIHt9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGJldHRlci1hdXRoIHNvcnQgb2JqZWN0IHRvIGEgUGF5bG9hZCBzb3J0IHN0cmluZ1xuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHRyYW5zZm9ybXMgdGhlIGJldHRlci1hdXRoIHNvcnQgb2JqZWN0ICh3aGljaCBjb250YWlucyBmaWVsZCBuYW1lIGFuZCBkaXJlY3Rpb24pXG4gICAqIGludG8gdGhlIGZvcm1hdCBleHBlY3RlZCBieSBQYXlsb2FkIENNUydzIHF1ZXJ5IEFQSSAoYSBzdHJpbmcgd2l0aCBvcHRpb25hbCAnLScgcHJlZml4IGZvciBkZXNjZW5kaW5nIG9yZGVyKS5cbiAgICpcbiAgICogSXQgYWxzbyBoYW5kbGVzIGZpZWxkIG5hbWUgbWFwcGluZyBiZXR3ZWVuIGJldHRlci1hdXRoIHNjaGVtYSBhbmQgUGF5bG9hZCBjb2xsZWN0aW9uc1xuICAgKiBieSB1c2luZyB0aGUgZ2V0RmllbGROYW1lIGhlbHBlciB0byByZXNvbHZlIHRoZSBjb3JyZWN0IGZpZWxkIG5hbWVzLlxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwvY29sbGVjdGlvbiBuYW1lIHRvIGdldCBmaWVsZCBtYXBwaW5ncyBmcm9tXG4gICAqIEBwYXJhbSBzb3J0QnkgLSBPcHRpb25hbCBvYmplY3QgY29udGFpbmluZyBmaWVsZCBuYW1lIGFuZCBzb3J0IGRpcmVjdGlvblxuICAgKiBAcmV0dXJucyBBIFBheWxvYWQtY29tcGF0aWJsZSBzb3J0IHN0cmluZyBvciB1bmRlZmluZWQgaWYgbm8gc29ydCBzcGVjaWZpZWRcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSW5wdXQ6IHsgZmllbGQ6ICdlbWFpbCcsIGRpcmVjdGlvbjogJ2Rlc2MnIH1cbiAgICogLy8gT3V0cHV0OiAnLWVtYWlsJ1xuICAgKiAvLyBJbnB1dDogeyBmaWVsZDogJ2NyZWF0ZWRBdCcsIGRpcmVjdGlvbjogJ2FzYycgfVxuICAgKiAvLyBPdXRwdXQ6ICdjcmVhdGVkQXQnXG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0U29ydChcbiAgICBtb2RlbDogTW9kZWxLZXksXG4gICAgc29ydEJ5PzogeyBmaWVsZDogc3RyaW5nOyBkaXJlY3Rpb246IFwiYXNjXCIgfCBcImRlc2NcIiB9XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFzb3J0QnkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZmllbGROYW1lID0gZ2V0RmllbGROYW1lKG1vZGVsLCBzb3J0QnkuZmllbGQpO1xuICAgIGNvbnN0IHByZWZpeCA9IHNvcnRCeS5kaXJlY3Rpb24gPT09IFwiZGVzY1wiID8gXCItXCIgOiBcIlwiO1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHtmaWVsZE5hbWV9YDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2V0RmllbGROYW1lLFxuICAgIGdldENvbGxlY3Rpb25TbHVnLFxuICAgIHNpbmdsZUlkUXVlcnksXG4gICAgdHJhbnNmb3JtSW5wdXQsXG4gICAgdHJhbnNmb3JtT3V0cHV0LFxuICAgIGNvbnZlcnRXaGVyZUNsYXVzZSxcbiAgICBjb252ZXJ0U2VsZWN0LFxuICAgIGNvbnZlcnRTb3J0XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbImdldEF1dGhUYWJsZXMiLCJmbGF0dGVuQWxsRmllbGRzIiwiZ2V0Q29sbGVjdGlvbkJ5TW9kZWxLZXkiLCJnZXRDb2xsZWN0aW9uRmllbGROYW1lQnlGaWVsZEtleVVudHlwZWQiLCJnZXRGaWVsZEtleUJ5Q29sbGVjdGlvbkZpZWxkTmFtZSIsImNyZWF0ZVRyYW5zZm9ybSIsIm9wdGlvbnMiLCJlbmFibGVEZWJ1Z0xvZ3MiLCJzY2hlbWEiLCJkZWJ1Z0xvZyIsIm1lc3NhZ2UiLCJjb25zb2xlIiwibG9nIiwiZ2V0Q29sbGVjdGlvblNsdWciLCJtb2RlbCIsImNvbGxlY3Rpb24iLCJtb2RlbE5hbWUiLCJyZXNvbHZlZFNsdWciLCJpc1BheWxvYWRSZWxhdGlvbnNoaXAiLCJwYXlsb2FkIiwiY29sbGVjdGlvblNsdWciLCJmaWVsZE5hbWUiLCJjb2xsZWN0aW9ucyIsImZpZWxkcyIsImNvbmZpZyIsImZpZWxkIiwiZmluZCIsImYiLCJuYW1lIiwidHlwZSIsImdldEZpZWxkTmFtZSIsImluY2x1ZGVzIiwiZmllbGREZWZpbml0aW9uIiwib3JpZ2luYWxGaWVsZCIsImlzUmVsYXRpb25zaGlwRmllbGQiLCJmaWVsZEtleSIsInNjaGVtYUZpZWxkcyIsInJlZmVyZW5jZXMiLCJ1bmRlZmluZWQiLCJzaW5nbGVJZFF1ZXJ5Iiwid2hlcmUiLCJzb21lIiwiaWRGaWVsZCIsImNvbmRpdGlvbiIsIkFycmF5IiwiaXNBcnJheSIsInZhbHVlIiwiZXF1YWxzIiwiY29udGFpbnMiLCJsZW5ndGgiLCJub3JtYWxpemVEYXRhIiwia2V5IiwiaXNSZWxhdGVkRmllbGQiLCJpZFR5cGUiLCJwYXJzZWQiLCJwYXJzZUludCIsImlzTmFOIiwib3JpZ2luYWwiLCJjb252ZXJ0ZWQiLCJzdHJpbmdJZCIsIlN0cmluZyIsIm1hcCIsImlkIiwic3BsaXQiLCJyb2xlIiwidHJpbSIsInRvTG93ZXJDYXNlIiwidHJhbnNmb3JtSW5wdXQiLCJkYXRhIiwidHJhbnNmb3JtZWREYXRhIiwiT2JqZWN0IiwiZW50cmllcyIsImZvckVhY2giLCJzY2hlbWFGaWVsZE5hbWUiLCJ0YXJnZXRGaWVsZE5hbWUiLCJpc1BheWxvYWRSZWwiLCJub3JtYWxpemVkRGF0YSIsInRhcmdldEZpZWxkS2V5IiwiaXNKb2luUmVzdWx0IiwiZG9jcyIsImZsYXR0ZW5Kb2luUmVzdWx0Iiwiam9pblJlc3VsdCIsIml0ZW0iLCJ0cmFuc2Zvcm1PdXRwdXQiLCJkb2MiLCJyZXN1bHQiLCJyZWxhdGlvbnNoaXBGaWVsZHMiLCJmcm9tRW50cmllcyIsImZpbHRlciIsImRhdGVGaWVsZHMiLCJfIiwia2V5cyIsIm9yaWdpbmFsUmVsYXRlZEZpZWxkS2V5IiwiayIsIm5vcm1hbGl6ZURvY3VtZW50SWRzIiwib3JpZ2luYWxEYXRlRmllbGRLZXkiLCJEYXRlIiwib3JpZ2luYWxLZXkiLCJldmVyeSIsIm9wZXJhdG9yVG9QYXlsb2FkIiwib3BlcmF0b3IiLCJub3RfZXF1YWxzIiwiZ3JlYXRlcl90aGFuIiwiZ3JlYXRlcl90aGFuX2VxdWFsIiwibGVzc190aGFuIiwibGVzc190aGFuX2VxdWFsIiwiaW4iLCJsaWtlIiwiY29udmVydFdoZXJlVmFsdWUiLCJudW1JZCIsIk51bWJlciIsImNvbnZlcnRXaGVyZUNsYXVzZSIsImdldFBheWxvYWRGaWVsZE5hbWUiLCJ3IiwicmVzIiwiYW5kIiwiY29ubmVjdG9yIiwib3IiLCJhbmRDbGF1c2UiLCJvckNsYXVzZSIsIkFORCIsIk9SIiwiY29udmVydFNlbGVjdCIsInNlbGVjdCIsInJlZHVjZSIsImFjYyIsImNvbnZlcnRTb3J0Iiwic29ydEJ5IiwicHJlZml4IiwiZGlyZWN0aW9uIl0sIm1hcHBpbmdzIjoiQUFFQSxTQUFTQSxhQUFhLFFBQVEsaUJBQWlCO0FBQy9DLFNBR0VDLGdCQUFnQixRQUVYLFVBQVU7QUFFakIsU0FDRUMsdUJBQXVCLEVBQ3ZCQyx1Q0FBdUMsRUFDdkNDLGdDQUFnQyxRQUMzQixzQ0FBOEM7QUFFckQsT0FBTyxNQUFNQyxrQkFBa0IsQ0FDN0JDLFNBQ0FDO0lBRUEsTUFBTUMsU0FBU1IsY0FBY007SUFFN0IsU0FBU0csU0FBU0MsT0FBYztRQUM5QixJQUFJSCxpQkFBaUI7WUFDbkJJLFFBQVFDLEdBQUcsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEtBQUtGO1FBQ3pDO0lBQ0Y7SUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCQyxH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
837
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iZXR0ZXItYXV0aC9hZGFwdGVyL3RyYW5zZm9ybS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJldHRlckF1dGhPcHRpb25zLCBXaGVyZSB9IGZyb20gXCJiZXR0ZXItYXV0aFwiO1xuaW1wb3J0IHR5cGUgeyBEQkZpZWxkQXR0cmlidXRlIH0gZnJvbSBcImJldHRlci1hdXRoL2RiXCI7XG5pbXBvcnQgeyBnZXRBdXRoVGFibGVzIH0gZnJvbSBcImJldHRlci1hdXRoL2RiXCI7XG5pbXBvcnQge1xuICB0eXBlIEJhc2VQYXlsb2FkLFxuICB0eXBlIENvbGxlY3Rpb25TbHVnLFxuICBmbGF0dGVuQWxsRmllbGRzLFxuICB0eXBlIFdoZXJlIGFzIFBheWxvYWRXaGVyZVxufSBmcm9tIFwicGF5bG9hZFwiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbEtleSB9IGZyb20gXCJAL2JldHRlci1hdXRoL2dlbmVyYXRlZC10eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0Q29sbGVjdGlvbkJ5TW9kZWxLZXksXG4gIGdldENvbGxlY3Rpb25GaWVsZE5hbWVCeUZpZWxkS2V5VW50eXBlZCxcbiAgZ2V0RmllbGRLZXlCeUNvbGxlY3Rpb25GaWVsZE5hbWVcbn0gZnJvbSBcIkAvYmV0dGVyLWF1dGgvcGx1Z2luL2hlbHBlcnMvZ2V0LWNvbGxlY3Rpb25cIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVRyYW5zZm9ybSA9IChcbiAgb3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMsXG4gIGVuYWJsZURlYnVnTG9nczogYm9vbGVhblxuKSA9PiB7XG4gIGNvbnN0IHNjaGVtYSA9IGdldEF1dGhUYWJsZXMob3B0aW9ucyk7XG5cbiAgZnVuY3Rpb24gZGVidWdMb2cobWVzc2FnZTogYW55W10pIHtcbiAgICBpZiAoZW5hYmxlRGVidWdMb2dzKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW3BheWxvYWQtZGItYWRhcHRlcl1gLCAuLi5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFwcyBhIEJldHRlckF1dGggc2NoZW1hIG1vZGVsIG5hbWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgUGF5bG9hZCBDTVMgY29sbGVjdGlvbiBzbHVnLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJlc29sdmVzIHRoZSBhcHByb3ByaWF0ZSBjb2xsZWN0aW9uIHNsdWcgYnk6XG4gICAqIDEuIExvb2tpbmcgdXAgdGhlIG1vZGVsIGluIHRoZSBCZXR0ZXJBdXRoIHNjaGVtYSB0byBmaW5kIGl0cyBjb25maWd1cmVkIG1vZGVsTmFtZVxuICAgKiAyLiBGYWxsaW5nIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG1vZGVsIG5hbWUgaWYgbm8gbWFwcGluZyBleGlzdHNcbiAgICpcbiAgICogQ29sbGVjdGlvbiBzbHVnIHJlc29sdXRpb24gZm9sbG93cyB0aGVzZSBydWxlczpcbiAgICogLSBGb3IgYmFzZSBjb2xsZWN0aW9uczogVGhlIHNhbml0aXplQmV0dGVyQXV0aE9wdGlvbnMgZnVuY3Rpb24gZW5zdXJlcyB0aGUgY29sbGVjdGlvbiBzbHVnXG4gICAqICAgZnJvbSBwbHVnaW4gb3B0aW9ucyBpcyBzZXQgYXMgdGhlIG1vZGVsIG5hbWUgaW4gdGhlIHNjaGVtYVxuICAgKiAtIEZvciBwbHVnaW5zOiBUaGUgYmV0dGVyQXV0aFBsdWdpblNsdWdzIGNvbnN0YW50IGlzIHVzZWQgYXMgdGhlIG1vZGVsTmFtZVxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgQmV0dGVyQXV0aCBtb2RlbCBuYW1lIHRvIHJlc29sdmVcbiAgICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgUGF5bG9hZCBDTVMgY29sbGVjdGlvbiBzbHVnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIHNjaGVtYVsndXNlciddLm1vZGVsTmFtZSBpcyAndXNlcnMnXG4gICAqIGdldENvbGxlY3Rpb25TbHVnKCd1c2VyJykgLy8gUmV0dXJucyAndXNlcnMnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIG1vZGVsIGRvZXNuJ3QgZXhpc3QgaW4gc2NoZW1hXG4gICAqIGdldENvbGxlY3Rpb25TbHVnKCdjdXN0b20nKSAvLyBSZXR1cm5zICdjdXN0b20nXG4gICAqXG4gICAqIEB3YXJuaW5nIElmIGEgY29sbGVjdGlvbiBpcyBvdmVycmlkZGVuIHVzaW5nIHRoZSBjb2xsZWN0aW9uT3ZlcnJpZGUgb3B0aW9uXG4gICAqIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHNjaGVtYSBtYXBwaW5nLCB0aGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gaW5jb3JyZWN0IHNsdWdzXG4gICAqL1xuICBmdW5jdGlvbiBnZXRDb2xsZWN0aW9uU2x1Zyhtb2RlbDogTW9kZWxLZXkpOiBDb2xsZWN0aW9uU2x1ZyB7XG4gICAgLy8gRmlyc3QgdHJ5IHRvIGdldCB0aGUgbW9kZWxOYW1lIGZyb20gc2NoZW1hLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtb2RlbCBuYW1lXG4gICAgY29uc3QgY29sbGVjdGlvbiA9IHNjaGVtYT8uW21vZGVsXT8ubW9kZWxOYW1lIHx8IG1vZGVsO1xuICAgIGRlYnVnTG9nKFtcImdldENvbGxlY3Rpb25TbHVnOlwiLCB7IG1vZGVsLCByZXNvbHZlZFNsdWc6IGNvbGxlY3Rpb24gfV0pO1xuICAgIHJldHVybiBjb2xsZWN0aW9uIGFzIENvbGxlY3Rpb25TbHVnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgbW9kZWwgaWRlbnRpZmllciB0byBpdHMgQkEgc2NoZW1hIG1vZGVsIGtleS5cbiAgICpcbiAgICogQWNjZXB0cyBlaXRoZXIgYSBCQSBtb2RlbCBrZXkgKFwidXNlclwiKSBvciBhIFBheWxvYWQgY29sbGVjdGlvbiBzbHVnIChcInVzZXJzXCIvXCJtZW1iZXJzXCIpXG4gICAqIGFuZCByZXR1cm5zIHRoZSBjYW5vbmljYWwgQkEgbW9kZWwga2V5IHVzZWQgdG8gaW5kZXggdGhlIHNjaGVtYS5cbiAgICpcbiAgICogVGhpcyBlbmFibGVzIGFkYXB0ZXIgZnVuY3Rpb25zICh0cmFuc2Zvcm1JbnB1dCwgdHJhbnNmb3JtT3V0cHV0LCBjb252ZXJ0V2hlcmVDbGF1c2UpXG4gICAqIHRvIHdvcmsgY29ycmVjdGx5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBjYWxsZXJzIHBhc3MgYSBCQSBtb2RlbCBrZXkgb3IgYSBQYXlsb2FkIHNsdWcuXG4gICAqL1xuICBjb25zdCBtb2RlbEtleUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE1vZGVsS2V5PigpO1xuXG4gIGZ1bmN0aW9uIHJlc29sdmVNb2RlbEtleShtb2RlbDogc3RyaW5nKTogTW9kZWxLZXkge1xuICAgIGNvbnN0IGNhY2hlZCA9IG1vZGVsS2V5Q2FjaGUuZ2V0KG1vZGVsKTtcbiAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gICAgLy8gRGlyZWN0IG1hdGNoIOKAlCBhbHJlYWR5IGEgQkEgbW9kZWwga2V5XG4gICAgaWYgKHNjaGVtYT8uW21vZGVsXSkge1xuICAgICAgbW9kZWxLZXlDYWNoZS5zZXQobW9kZWwsIG1vZGVsIGFzIE1vZGVsS2V5KTtcbiAgICAgIHJldHVybiBtb2RlbCBhcyBNb2RlbEtleTtcbiAgICB9XG5cbiAgICAvLyBSZXZlcnNlIGxvb2t1cCDigJQgZmluZCB0aGUgQkEgbW9kZWwga2V5IHdob3NlIG1vZGVsTmFtZSBtYXRjaGVzIHRoaXMgUGF5bG9hZCBzbHVnXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hKSkge1xuICAgICAgaWYgKHZhbHVlLm1vZGVsTmFtZSA9PT0gbW9kZWwpIHtcbiAgICAgICAgbW9kZWxLZXlDYWNoZS5zZXQobW9kZWwsIGtleSBhcyBNb2RlbEtleSk7XG4gICAgICAgIHJldHVybiBrZXkgYXMgTW9kZWxLZXk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm8gbWF0Y2ggZm91bmQg4oCUIHJldHVybiBhcy1pcyAoY3VzdG9tIGNvbGxlY3Rpb25zIG5vdCBpbiB0aGUgQkEgc2NoZW1hKVxuICAgIHJldHVybiBtb2RlbCBhcyBNb2RlbEtleTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBmaWVsZCBpbiB0aGUgUGF5bG9hZCBjb2xsZWN0aW9uIGlzIGEgcmVsYXRpb25zaGlwIG9yIHVwbG9hZCBmaWVsZC5cbiAgICpcbiAgICogQHBhcmFtIHBheWxvYWQgLSBUaGUgUGF5bG9hZCBjbGllbnQgaW5zdGFuY2VcbiAgICogQHBhcmFtIGNvbGxlY3Rpb25TbHVnIC0gVGhlIHNsdWcgb2YgdGhlIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIGZpZWxkTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBjaGVja1xuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBvciB1cGxvYWQgZmllbGQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgY29uc3QgZmxhdHRlbmVkRmllbGRzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgZmxhdHRlbkFsbEZpZWxkcz4+KCk7XG5cbiAgZnVuY3Rpb24gaXNQYXlsb2FkUmVsYXRpb25zaGlwKFxuICAgIHBheWxvYWQ6IEJhc2VQYXlsb2FkLFxuICAgIGNvbGxlY3Rpb25TbHVnOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IHBheWxvYWQuY29sbGVjdGlvbnNbY29sbGVjdGlvblNsdWddO1xuICAgIGlmICghY29sbGVjdGlvbikgcmV0dXJuIGZhbHNlO1xuXG4gICAgbGV0IGZpZWxkcyA9IGZsYXR0ZW5lZEZpZWxkc0NhY2hlLmdldChjb2xsZWN0aW9uU2x1Zyk7XG4gICAgaWYgKCFmaWVsZHMpIHtcbiAgICAgIGZpZWxkcyA9IGZsYXR0ZW5BbGxGaWVsZHMoeyBmaWVsZHM6IGNvbGxlY3Rpb24uY29uZmlnLmZpZWxkcyB9KTtcbiAgICAgIGZsYXR0ZW5lZEZpZWxkc0NhY2hlLnNldChjb2xsZWN0aW9uU2x1ZywgZmllbGRzKTtcbiAgICB9XG4gICAgY29uc3QgZmllbGQgPSBmaWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBmaWVsZE5hbWUpO1xuXG4gICAgcmV0dXJuIGZpZWxkPy50eXBlID09PSBcInJlbGF0aW9uc2hpcFwiIHx8IGZpZWxkPy50eXBlID09PSBcInVwbG9hZFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgYSBCZXR0ZXJBdXRoIHNjaGVtYSBmaWVsZCB0byBpdHMgY29ycmVzcG9uZGluZyBQYXlsb2FkIENNUyBmaWVsZCBuYW1lLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJlc29sdmVzIHRoZSBhcHByb3ByaWF0ZSBmaWVsZCBuYW1lIGJ5OlxuICAgKiAxLiBQcmVzZXJ2aW5nICdpZCcgb3IgJ19pZCcgZmllbGRzIGFzLWlzIChzcGVjaWFsIGNhc2UgaGFuZGxpbmcpXG4gICAqIDIuIExvb2tpbmcgdXAgdGhlIGZpZWxkIGluIHRoZSBCZXR0ZXJBdXRoIHNjaGVtYSB0byBmaW5kIGl0cyBjb25maWd1cmVkIGZpZWxkTmFtZVxuICAgKiAzLiBGYWxsaW5nIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGZpZWxkIG5hbWUgaWYgbm8gbWFwcGluZyBleGlzdHNcbiAgICpcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIEJldHRlckF1dGggbW9kZWwgbmFtZSBjb250YWluaW5nIHRoZSBmaWVsZFxuICAgKiBAcGFyYW0gZmllbGQgLSBUaGUgb3JpZ2luYWwgZmllbGQgbmFtZSB0byByZXNvbHZlXG4gICAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIFBheWxvYWQgQ01TIGZpZWxkIG5hbWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgc2NoZW1hWyd1c2VyJ10uZmllbGRzWydlbWFpbCddLmZpZWxkTmFtZSBpcyAnZW1haWxBZGRyZXNzJ1xuICAgKiBnZXRGaWVsZE5hbWUoJ3VzZXInLCAnZW1haWwnKSAvLyBSZXR1cm5zICdlbWFpbEFkZHJlc3MnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFNwZWNpYWwgY2FzZSBmb3IgSUQgZmllbGRzXG4gICAqIGdldEZpZWxkTmFtZSgndXNlcicsICdpZCcpIC8vIEFsd2F5cyByZXR1cm5zICdpZCdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgZmllbGQgZG9lc24ndCBleGlzdCBpbiBzY2hlbWEgb3IgaGFzIG5vIGZpZWxkTmFtZSBtYXBwaW5nXG4gICAqIGdldEZpZWxkTmFtZSgndXNlcicsICdjdXN0b20nKSAvLyBSZXR1cm5zICdjdXN0b20nXG4gICAqXG4gICAqIEB3YXJuaW5nIElmIGEgZmllbGROYW1lIGlzIG92ZXJyaWRkZW4gaW4gdGhlIHBheWxvYWQgY29sbGVjdGlvbiBjb25maWcgdXNpbmcgdGhlIGNvbGxlY3Rpb25PdmVycmlkZSBvcHRpb25cbiAgICogd2l0aG91dCB1cGRhdGluZyB0aGUgc2NoZW1hIG1hcHBpbmcsIHRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBpbmNvcnJlY3QgZmllbGQgbmFtZXNcbiAgICovXG4gIGZ1bmN0aW9uIGdldEZpZWxkTmFtZShtb2RlbDogTW9kZWxLZXksIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogJ2lkJyBvciAnX2lkJyBpcyBhbHdheXMgcHJlc2VydmVkIGFzLWlzXG4gICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLmluY2x1ZGVzKGZpZWxkKSkge1xuICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8vIExvb2sgdXAgdGhlIGZpZWxkIGluIHRoZSBzY2hlbWFcbiAgICBjb25zdCBmaWVsZERlZmluaXRpb24gPSBzY2hlbWFbbW9kZWxdPy5maWVsZHNbZmllbGRdO1xuXG4gICAgLy8gVXNlIHRoZSBjb25maWd1cmVkIGZpZWxkTmFtZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gb3JpZ2luYWxcbiAgICBjb25zdCBmaWVsZE5hbWUgPSBmaWVsZERlZmluaXRpb24/LmZpZWxkTmFtZSB8fCBmaWVsZDtcblxuICAgIC8vIExvZyB0aGUgZmllbGQgcmVzb2x1dGlvbiBmb3IgZGVidWdnaW5nXG4gICAgZGVidWdMb2coW1wiZ2V0RmllbGQ6IFwiLCB7IG1vZGVsLCBvcmlnaW5hbEZpZWxkOiBmaWVsZCwgZmllbGROYW1lIH1dKTtcblxuICAgIHJldHVybiBmaWVsZE5hbWU7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkIGJ5IGNoZWNraW5nIGZvciBhIHJlZmVyZW5jZXMgcHJvcGVydHkuXG4gICAqXG4gICAqIFJlbGF0aW9uc2hpcCBmaWVsZHMgaW4gdGhlIHNjaGVtYSBoYXZlIGEgJ3JlZmVyZW5jZXMnIHByb3BlcnR5IHRoYXQgcG9pbnRzIHRvIGFub3RoZXIgbW9kZWwuXG4gICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoaXMgcHJvcGVydHkgZXhpc3RzIHRvIGlkZW50aWZ5IHJlbGF0aW9uc2hpcCBmaWVsZHMuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZEtleSAtIFRoZSBrZXkgb2YgdGhlIGZpZWxkIHRvIGNoZWNrIGluIHRoZSBzY2hlbWFcbiAgICogQHBhcmFtIHNjaGVtYUZpZWxkcyAtIE9iamVjdCBjb250YWluaW5nIGFsbCBmaWVsZHMgZnJvbSB0aGUgc2NoZW1hIGZvciBhIHNwZWNpZmljIG1vZGVsXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkIChoYXMgcmVmZXJlbmNlcyksIGZhbHNlIG90aGVyd2lzZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJZiBzY2hlbWEudXNlci5maWVsZHMucG9zdHMgaGFzIHsgcmVmZXJlbmNlczoge30gfVxuICAgKiBpc1JlbGF0aW9uc2hpcEZpZWxkKCdwb3N0cycsIHNjaGVtYS51c2VyLmZpZWxkcykgLy8gUmV0dXJucyB0cnVlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIHNjaGVtYS51c2VyLmZpZWxkcy5lbWFpbCBoYXMgbm8gcmVmZXJlbmNlcyBwcm9wZXJ0eVxuICAgKiBpc1JlbGF0aW9uc2hpcEZpZWxkKCdlbWFpbCcsIHNjaGVtYS51c2VyLmZpZWxkcykgLy8gUmV0dXJucyBmYWxzZVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSZWxhdGlvbnNoaXBGaWVsZChcbiAgICBmaWVsZEtleTogc3RyaW5nLFxuICAgIHNjaGVtYUZpZWxkczogUmVjb3JkPHN0cmluZywgREJGaWVsZEF0dHJpYnV0ZT5cbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gQSBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZCBpZiBpdCBoYXMgYSAncmVmZXJlbmNlcycgcHJvcGVydHkgZGVmaW5lZFxuICAgIHJldHVybiBzY2hlbWFGaWVsZHNbZmllbGRLZXldPy5yZWZlcmVuY2VzICE9PSB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqXG4gICAqIEV4dHJhY3RzIGEgc2luZ2xlIElEIHZhbHVlIGZyb20gYSBQYXlsb2FkIHdoZXJlIGNsYXVzZSBpZiBpdCByZXByZXNlbnRzIGEgc2ltcGxlIElEIHF1ZXJ5LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGFuYWx5emVzIGEgUGF5bG9hZCB3aGVyZSBjbGF1c2UgdG8gZGV0ZXJtaW5lIGlmIGl0J3MgYSBzaW1wbGUgcXVlcnkgZm9yIGFcbiAgICogc2luZ2xlIGRvY3VtZW50IGJ5IElELiBJdCBzdXBwb3J0cyBib3RoICdpZCcgYW5kICdfaWQnIGZpZWxkcyB3aXRoICdlcXVhbHMnIG9yICdjb250YWlucydcbiAgICogb3BlcmF0b3JzLiBUaGlzIGlzIHVzZWZ1bCBmb3Igb3B0aW1pemluZyBxdWVyaWVzIHdoZW4gd2Ugb25seSBuZWVkIHRvIGZldGNoIGEgc2luZ2xlIGRvY3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gd2hlcmUgLSBUaGUgUGF5bG9hZCB3aGVyZSBjbGF1c2UgdG8gYW5hbHl6ZVxuICAgKiBAcmV0dXJucyBUaGUgSUQgdmFsdWUgKHN0cmluZyBvciBudW1iZXIpIGlmIHRoZSB3aGVyZSBjbGF1c2UgaXMgYSBzaW1wbGUgSUQgcXVlcnksIG51bGwgb3RoZXJ3aXNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgJzEyMycgZm9yIGEgc2ltcGxlIGVxdWFscyBxdWVyeVxuICAgKiBzaW5nbGVJZFF1ZXJ5KHsgaWQ6IHsgZXF1YWxzOiAnMTIzJyB9IH0pIC8vICcxMjMnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgNDU2IGZvciBhIHNpbXBsZSBlcXVhbHMgcXVlcnkgd2l0aCBudW1iZXIgSURcbiAgICogc2luZ2xlSWRRdWVyeSh7IF9pZDogeyBlcXVhbHM6IDQ1NiB9IH0pIC8vIDQ1NlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXR1cm5zICc3ODknIGZvciBhIGNvbnRhaW5zIHF1ZXJ5IHdpdGggYSBzaW5nbGUgdmFsdWVcbiAgICogc2luZ2xlSWRRdWVyeSh7IGlkOiB7IGNvbnRhaW5zOiBbJzc4OSddIH0gfSkgLy8gJzc4OSdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyBudWxsIGZvciBjb21wbGV4IHF1ZXJpZXNcbiAgICogc2luZ2xlSWRRdWVyeSh7IGFuZDogW3sgaWQ6IHsgZXF1YWxzOiAnMTIzJyB9IH1dIH0pIC8vIG51bGxcbiAgICovXG4gIGZ1bmN0aW9uIHNpbmdsZUlkUXVlcnkod2hlcmU6IFBheWxvYWRXaGVyZSkge1xuICAgIC8vIFJldHVybiBudWxsIGZvciBlbXB0eSB3aGVyZSBjbGF1c2VzIG9yIGNvbXBsZXggcXVlcmllcyB3aXRoICdhbmQnLydvcicgb3BlcmF0b3JzXG4gICAgaWYgKCF3aGVyZSB8fCBcImFuZFwiIGluIHdoZXJlIHx8IFwib3JcIiBpbiB3aGVyZSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgd2hlcmUgY2xhdXNlIGNvbnRhaW5zIGVpdGhlciAnaWQnIG9yICdfaWQnIGZpZWxkXG4gICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLnNvbWUoKGZpZWxkKSA9PiBmaWVsZCBpbiB3aGVyZSkpIHtcbiAgICAgIC8vIERldGVybWluZSB3aGljaCBJRCBmaWVsZCBpcyBiZWluZyB1c2VkIChzdXBwb3J0IGJvdGggJ2lkJyBhbmQgJ19pZCcpXG4gICAgICBjb25zdCBpZEZpZWxkID0gXCJpZFwiIGluIHdoZXJlID8gXCJpZFwiIDogXCJfaWRcIjtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IHdoZXJlW2lkRmllbGRdO1xuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBlcXVhbHMgb3BlcmF0b3IgY2FzZVxuICAgICAgaWYgKFxuICAgICAgICBjb25kaXRpb24gJiZcbiAgICAgICAgdHlwZW9mIGNvbmRpdGlvbiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShjb25kaXRpb24pICYmXG4gICAgICAgIFwiZXF1YWxzXCIgaW4gY29uZGl0aW9uXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uZXF1YWxzO1xuICAgICAgICAvLyBPbmx5IHJldHVybiBzdHJpbmcgb3IgbnVtYmVyIElEIHZhbHVlc1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBjb250YWlucyBvcGVyYXRvciBjYXNlIHdpdGggYSBzaW5nbGUgdmFsdWVcbiAgICAgIGlmIChcbiAgICAgICAgY29uZGl0aW9uICYmXG4gICAgICAgIHR5cGVvZiBjb25kaXRpb24gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoY29uZGl0aW9uKSAmJlxuICAgICAgICBcImNvbnRhaW5zXCIgaW4gY29uZGl0aW9uICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoY29uZGl0aW9uLmNvbnRhaW5zKSAmJlxuICAgICAgICBjb25kaXRpb24uY29udGFpbnMubGVuZ3RoID09PSAxXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uY29udGFpbnNbMF07XG4gICAgICAgIC8vIE9ubHkgcmV0dXJuIHN0cmluZyBvciBudW1iZXIgSUQgdmFsdWVzXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIG51bGwgaWYgbm8gdmFsaWQgSUQgcXVlcnkgd2FzIGZvdW5kXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBkYXRhIHZhbHVlcyBiYXNlZCBvbiBmaWVsZCB0eXBlIGFuZCByZXF1aXJlZCBJRCB0eXBlXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0eXBlIGNvbnZlcnNpb24gZm9yIHJlbGF0aW9uc2hpcCBmaWVsZHMgdG8gZW5zdXJlXG4gICAqIElEcyBhcmUgaW4gdGhlIGNvcnJlY3QgZm9ybWF0IChzdHJpbmcgb3IgbnVtYmVyKSBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBmaWVsZCBrZXkvbmFtZVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gbm9ybWFsaXplXG4gICAqIEBwYXJhbSBpc1JlbGF0ZWRGaWVsZCAtIFdoZXRoZXIgdGhpcyBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZFxuICAgKiBAcGFyYW0gaWRUeXBlIC0gVGhlIGV4cGVjdGVkIElEIHR5cGUgKCdudW1iZXInIG9yICd0ZXh0JylcbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgdmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEoe1xuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICBpc1JlbGF0ZWRGaWVsZCxcbiAgICBpZFR5cGVcbiAgfToge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiBhbnk7XG4gICAgaXNSZWxhdGVkRmllbGQ6IGJvb2xlYW47XG4gICAgaWRUeXBlOiBcIm51bWJlclwiIHwgXCJ0ZXh0XCI7XG4gIH0pIHtcbiAgICAvLyBTa2lwIHByb2Nlc3NpbmcgZm9yIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgaWRUeXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgIGBJRCBjb252ZXJzaW9uOiAke2tleX0gY29udmVydGluZyBzdHJpbmcgSUQgdG8gbnVtYmVyYCxcbiAgICAgICAgICAgIHsgb3JpZ2luYWw6IHZhbHVlLCBjb252ZXJ0ZWQ6IHBhcnNlZCB9XG4gICAgICAgICAgXSk7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiBpZFR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ0lkID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgIGBJRCBjb252ZXJzaW9uOiAke2tleX0gY29udmVydGluZyBudW1iZXIgSUQgdG8gc3RyaW5nYCxcbiAgICAgICAgICB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBzdHJpbmdJZCB9XG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4gc3RyaW5nSWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT25seSBwcm9jZXNzIHJlbGF0aW9uc2hpcCBmaWVsZHMgdGhhdCBuZWVkIHR5cGUgY29udmVyc2lvblxuICAgIGlmIChpc1JlbGF0ZWRGaWVsZCkge1xuICAgICAgLy8gSGFuZGxlIHNpbmdsZSBJRCB2YWx1ZSBjb252ZXJzaW9uXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIGlkVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgICBgSUQgY29udmVyc2lvbjogJHtrZXl9IGNvbnZlcnRpbmcgc3RyaW5nIElEIHRvIG51bWJlcmAsXG4gICAgICAgICAgICB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBwYXJzZWQgfVxuICAgICAgICAgIF0pO1xuICAgICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIGlkVHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nSWQgPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgYElEIGNvbnZlcnNpb246ICR7a2V5fSBjb252ZXJ0aW5nIG51bWJlciBJRCB0byBzdHJpbmdgLFxuICAgICAgICAgIHsgb3JpZ2luYWw6IHZhbHVlLCBjb252ZXJ0ZWQ6IHN0cmluZ0lkIH1cbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiBzdHJpbmdJZDtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGFycmF5IG9mIElEcyAtIG1hcCBlYWNoIHZhbHVlIHRvIHRoZSBjb3JyZWN0IHR5cGVcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUubWFwKChpZCkgPT4ge1xuICAgICAgICAgIC8vIFNraXAgbnVsbC91bmRlZmluZWQgdmFsdWVzIGluIGFycmF5c1xuICAgICAgICAgIGlmIChpZCA9PT0gbnVsbCB8fCBpZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gaWQ7XG5cbiAgICAgICAgICBpZiAoaWRUeXBlID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gTnVtYmVyKGlkKTtcbiAgICAgICAgICAgIHJldHVybiAhaXNOYU4ocGFyc2VkKSA/IHBhcnNlZCA6IGlkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaWRUeXBlID09PSBcInRleHRcIiAmJiB0eXBlb2YgaWQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSByb2xlIGZpZWxkcyAoQ29taW5nIGZyb20gYmV0dGVyIGF1dGgsIHdpbGwgYmUgYSBzaW5nbGUgc3RyaW5nIHNlcGFyYXRlZCBieSBjb21tYXMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHJvbGVzKVxuICAgIGlmIChrZXkgPT09IFwicm9sZVwiIHx8IGtleSA9PT0gXCJyb2xlc1wiKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLm1hcCgocm9sZTogc3RyaW5nKSA9PlxuICAgICAgICAgIHR5cGVvZiByb2xlID09PSBcInN0cmluZ1wiID8gcm9sZS50cmltKCkudG9Mb3dlckNhc2UoKSA6IHJvbGVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNwbGl0KFwiLFwiKS5tYXAoKHJvbGU6IHN0cmluZykgPT4gcm9sZS50cmltKCkudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIG9yaWdpbmFsIHZhbHVlIGlmIG5vIGNvbnZlcnNpb24gd2FzIG5lZWRlZCBvciBhcHBsaWNhYmxlXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybXMgaW5wdXQgZGF0YSBmcm9tIGJldHRlci1hdXRoIHRvIFBheWxvYWQgQ01TIGZvcm1hdFxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXM6XG4gICAqIDEuIEZpZWxkIG5hbWUgbWFwcGluZyBhY2NvcmRpbmcgdG8gc2NoZW1hIGRlZmluaXRpb25zXG4gICAqIDIuIElEIHR5cGUgY29udmVyc2lvbiBmb3IgcmVsYXRpb25zaGlwIGZpZWxkc1xuICAgKiAzLiBQcm9wZXIgZGF0YSBub3JtYWxpemF0aW9uIGJhc2VkIG9uIGZpZWxkIHR5cGVzXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIGlucHV0IGRhdGEgZnJvbSBiZXR0ZXItYXV0aFxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwgbmFtZSBpbiB0aGUgc2NoZW1hXG4gICAqIEBwYXJhbSBpZFR5cGUgLSBUaGUgZXhwZWN0ZWQgSUQgdHlwZSAoJ251bWJlcicgb3IgJ3RleHQnKVxuICAgKiBAcmV0dXJucyBUcmFuc2Zvcm1lZCBkYXRhIGNvbXBhdGlibGUgd2l0aCBQYXlsb2FkIENNU1xuICAgKi9cbiAgZnVuY3Rpb24gdHJhbnNmb3JtSW5wdXQoe1xuICAgIGRhdGEsXG4gICAgbW9kZWw6IHJhd01vZGVsLFxuICAgIGlkVHlwZSxcbiAgICBwYXlsb2FkXG4gIH06IHtcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIG1vZGVsOiBNb2RlbEtleTtcbiAgICBpZFR5cGU6IFwibnVtYmVyXCIgfCBcInRleHRcIjtcbiAgICBwYXlsb2FkOiBCYXNlUGF5bG9hZDtcbiAgfSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IG1vZGVsID0gcmVzb2x2ZU1vZGVsS2V5KHJhd01vZGVsKTtcbiAgICBjb25zdCB0cmFuc2Zvcm1lZERhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBzY2hlbWFGaWVsZHMgPSBzY2hlbWE/Llttb2RlbF0/LmZpZWxkcyA/PyB7fTtcblxuICAgIC8vIFByb2Nlc3MgZWFjaCBmaWVsZCBpbiB0aGUgaW5wdXQgZGF0YVxuICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgLy8gU2tpcCB1bmRlZmluZWQgdmFsdWVzIChidXQgYWxsb3cgbnVsbCB0aHJvdWdoIHRvIGNsZWFyIGZpZWxkcylcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSBtYXBwZWQgZmllbGQgbmFtZSBmcm9tIHNjaGVtYSAoaWYgYW55KVxuICAgICAgY29uc3Qgc2NoZW1hRmllbGROYW1lID0gc2NoZW1hRmllbGRzW2tleV0/LmZpZWxkTmFtZTtcbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkTmFtZSA9IHNjaGVtYUZpZWxkTmFtZSB8fCBrZXk7XG5cbiAgICAgIC8vIENoZWNrIFBheWxvYWQgc2NoZW1hIGZvciByZWxhdGlvbnNoaXAgZmllbGRzXG4gICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldENvbGxlY3Rpb25TbHVnKG1vZGVsKTtcbiAgICAgIGNvbnN0IGlzUGF5bG9hZFJlbCA9IGlzUGF5bG9hZFJlbGF0aW9uc2hpcChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgY29sbGVjdGlvblNsdWcsXG4gICAgICAgIHRhcmdldEZpZWxkTmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSByZWxhdGlvbnNoaXAgZmllbGRcbiAgICAgIGNvbnN0IGlzUmVsYXRlZEZpZWxkID1cbiAgICAgICAgaXNSZWxhdGlvbnNoaXBGaWVsZChrZXksIHNjaGVtYUZpZWxkcykgfHwgaXNQYXlsb2FkUmVsO1xuXG4gICAgICAvLyBOb3JtYWxpemUgdGhlIGRhdGEgdmFsdWUgYmFzZWQgb24gZmllbGQgdHlwZSBhbmQgSUQgdHlwZVxuICAgICAgY29uc3Qgbm9ybWFsaXplZERhdGEgPSBub3JtYWxpemVEYXRhKHtcbiAgICAgICAgaWRUeXBlLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBpc1JlbGF0ZWRGaWVsZFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkS2V5ID0gZ2V0Q29sbGVjdGlvbkZpZWxkTmFtZUJ5RmllbGRLZXlVbnR5cGVkKFxuICAgICAgICBnZXRDb2xsZWN0aW9uQnlNb2RlbEtleShwYXlsb2FkLmNvbGxlY3Rpb25zLCBtb2RlbCksXG4gICAgICAgIHRhcmdldEZpZWxkTmFtZVxuICAgICAgKTtcbiAgICAgIHRyYW5zZm9ybWVkRGF0YVt0YXJnZXRGaWVsZEtleV0gPSBub3JtYWxpemVkRGF0YTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1lZERhdGE7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYSBQYXlsb2FkIGpvaW4gcmVzdWx0IChoYXMgZG9jcyBhcnJheSBzdHJ1Y3R1cmUpXG4gICAqL1xuICBmdW5jdGlvbiBpc0pvaW5SZXN1bHQoXG4gICAgdmFsdWU6IGFueVxuICApOiB2YWx1ZSBpcyB7IGRvY3M6IGFueVtdOyBoYXNOZXh0UGFnZT86IGJvb2xlYW47IHRvdGFsRG9jcz86IG51bWJlciB9IHtcbiAgICByZXR1cm4gKFxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgXCJkb2NzXCIgaW4gdmFsdWUgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUuZG9jcylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW5zIGEgUGF5bG9hZCBqb2luIHJlc3VsdCB0byBqdXN0IHRoZSBhcnJheSBvZiBkb2N1bWVudHMuXG4gICAqIEhhbmRsZXMgYm90aCBkaXJlY3QgZG9jdW1lbnRzIGFuZCBwb2x5bW9ycGhpYyB7IHJlbGF0aW9uVG8sIHZhbHVlIH0gZm9ybWF0LlxuICAgKi9cbiAgZnVuY3Rpb24gZmxhdHRlbkpvaW5SZXN1bHQoam9pblJlc3VsdDogeyBkb2NzOiBhbnlbXSB9KTogYW55W10ge1xuICAgIHJldHVybiBqb2luUmVzdWx0LmRvY3MubWFwKChpdGVtKSA9PiB7XG4gICAgICAvLyBIYW5kbGUgcG9seW1vcnBoaWMgam9pbiBmb3JtYXQ6IHsgcmVsYXRpb25Ubzogc3RyaW5nLCB2YWx1ZTogZG9jIH1cbiAgICAgIGlmIChcbiAgICAgICAgaXRlbSAmJlxuICAgICAgICB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBcInZhbHVlXCIgaW4gaXRlbSAmJlxuICAgICAgICBcInJlbGF0aW9uVG9cIiBpbiBpdGVtXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIFBheWxvYWQgQ01TIGRvY3VtZW50IG91dHB1dCB0byBtYXRjaCBCZXR0ZXJBdXRoIHNjaGVtYSBleHBlY3RhdGlvbnMuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBzZXZlcmFsIGNyaXRpY2FsIHRyYW5zZm9ybWF0aW9uczpcbiAgICpcbiAgICogMS4gSUQgQ29udmVyc2lvbjogRW5zdXJlcyBhbGwgSUQgZmllbGRzIGFyZSBzdHJpbmdzIGFzIHJlcXVpcmVkIGJ5IEJldHRlckF1dGhcbiAgICogICAgKHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JldHRlci1hdXRoL2JldHRlci1hdXRoL2Jsb2IvbWFpbi9wYWNrYWdlcy9iZXR0ZXItYXV0aC9zcmMvZGIvc2NoZW1hLnRzI0wxMjUpXG4gICAqXG4gICAqIDIuIFJlbGF0aW9uc2hpcCBGaWVsZCBNYXBwaW5nOiBBbGlnbnMgcmVsYXRpb25zaGlwIGZpZWxkcyB3aXRoIEJldHRlckF1dGggc2NoZW1hIG5hbWluZyBjb252ZW50aW9uc1xuICAgKiAgICBhbmQgZW5zdXJlcyBwcm9wZXIgSUQgdHlwZSBoYW5kbGluZ1xuICAgKlxuICAgKiAzLiBEYXRlIENvbnZlcnNpb246IFRyYW5zZm9ybXMgZGF0ZSBzdHJpbmdzIGZyb20gUGF5bG9hZCBpbnRvIERhdGUgb2JqZWN0cyBmb3IgQmV0dGVyQXV0aFxuICAgKlxuICAgKiA0LiBKb2luIFJlc3VsdCBGbGF0dGVuaW5nOiBDb252ZXJ0cyBQYXlsb2FkJ3MgeyBkb2NzOiBbLi4uXSB9IGpvaW4gZm9ybWF0IHRvIHBsYWluIGFycmF5c1xuICAgKlxuICAgKiBOb3RlOiBXaGlsZSBzZXR0aW5nIGRlcHRoOiAxIGluIFBheWxvYWQgb3BlcmF0aW9ucyBzaW1wbGlmaWVzIHRoaXMgcHJvY2VzcyBieSBhdm9pZGluZ1xuICAgKiBkZWVwbHkgbmVzdGVkIG9iamVjdHMsIHdlIG1haW50YWluIGNvbXByZWhlbnNpdmUgY2hlY2tzIGZvciByb2J1c3RuZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gZG9jIC0gVGhlIGRvY3VtZW50IHJldHVybmVkIGZyb20gUGF5bG9hZCBDTVNcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG1vZGVsIG5hbWUgaW4gdGhlIEJldHRlckF1dGggc2NoZW1hXG4gICAqIEByZXR1cm5zIFRoZSB0cmFuc2Zvcm1lZCBkb2N1bWVudCBjb21wYXRpYmxlIHdpdGggQmV0dGVyQXV0aFxuICAgKi9cbiAgZnVuY3Rpb24gdHJhbnNmb3JtT3V0cHV0PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD4oe1xuICAgIGRvYyxcbiAgICBtb2RlbDogcmF3TW9kZWwsXG4gICAgcGF5bG9hZFxuICB9OiB7XG4gICAgZG9jOiBUO1xuICAgIG1vZGVsOiBNb2RlbEtleTtcbiAgICBwYXlsb2FkOiBCYXNlUGF5bG9hZDtcbiAgfSk6IFQge1xuICAgIGlmICghZG9jIHx8IHR5cGVvZiBkb2MgIT09IFwib2JqZWN0XCIpIHJldHVybiBkb2M7XG5cbiAgICBjb25zdCBtb2RlbCA9IHJlc29sdmVNb2RlbEtleShyYXdNb2RlbCk7XG4gICAgY29uc3QgcmVzdWx0ID0geyAuLi5kb2MgfTtcbiAgICBjb25zdCBzY2hlbWFGaWVsZHMgPSBzY2hlbWE/Llttb2RlbF0/LmZpZWxkcyA/PyB7fTtcblxuICAgIC8vIElkZW50aWZ5IHJlbGF0aW9uc2hpcCBmaWVsZHMgd2l0aCBjdXN0b20gZmllbGQgbmFtZSBtYXBwaW5nc1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcEZpZWxkcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHNjaGVtYUZpZWxkcykuZmlsdGVyKChba2V5XSkgPT4ge1xuICAgICAgICBpZiAoaXNSZWxhdGlvbnNoaXBGaWVsZChrZXksIHNjaGVtYUZpZWxkcykpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIEFsc28gY2hlY2sgcGF5bG9hZCBzY2hlbWFcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gc2NoZW1hRmllbGRzW2tleV0/LmZpZWxkTmFtZSB8fCBrZXk7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25TbHVnID0gZ2V0Q29sbGVjdGlvblNsdWcobW9kZWwpO1xuICAgICAgICByZXR1cm4gaXNQYXlsb2FkUmVsYXRpb25zaGlwKHBheWxvYWQsIGNvbGxlY3Rpb25TbHVnLCBmaWVsZE5hbWUpO1xuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IGRhdGVGaWVsZHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhzY2hlbWFGaWVsZHMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUudHlwZSA9PT0gXCJkYXRlXCIpXG4gICAgKTtcblxuICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSBhbGwgdGhlIGZpZWxkcyBrZXlzIGFyZSBjb3JyZWN0XG4gICAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkS2V5ID0gZ2V0RmllbGRLZXlCeUNvbGxlY3Rpb25GaWVsZE5hbWUoXG4gICAgICAgIGdldENvbGxlY3Rpb25CeU1vZGVsS2V5KHBheWxvYWQuY29sbGVjdGlvbnMsIG1vZGVsKSxcbiAgICAgICAga2V5XG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldEZpZWxkS2V5ICE9PSBrZXkpIHtcbiAgICAgICAgcmVzdWx0W3RhcmdldEZpZWxkS2V5XSA9IHJlc3VsdFtrZXldO1xuICAgICAgICBkZWxldGUgcmVzdWx0W2tleV07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZW50cmllcyhkb2MpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdGFyZ2V0RmllbGRLZXkgPSBnZXRGaWVsZEtleUJ5Q29sbGVjdGlvbkZpZWxkTmFtZShcbiAgICAgICAgZ2V0Q29sbGVjdGlvbkJ5TW9kZWxLZXkocGF5bG9hZC5jb2xsZWN0aW9ucywgbW9kZWwpLFxuICAgICAgICBrZXlcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbnZlcnQgSUQgZmllbGRzIHRvIHN0cmluZ3MgZm9yIEJldHRlckF1dGggY29tcGF0aWJpbGl0eVxuICAgICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgcmVzdWx0W3RhcmdldEZpZWxkS2V5XSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblx0ICAgIFxuICAgICAgLy8gQ29udmVydCByb2xlIGFycmF5IHRvIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmdcbiAgICAgIGlmICgodGFyZ2V0RmllbGRLZXkgPT09IFwicm9sZVwiIHx8IHRhcmdldEZpZWxkS2V5ID09PSBcInJvbGVzXCIpICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRcdHJlc3VsdFt0YXJnZXRGaWVsZEtleV0gPSB2YWx1ZS5qb2luKFwiLFwiKVxuXHRcdFx0fVxuICAgICAgXG4gICAgICAvLyBGbGF0dGVuIGpvaW4gcmVzdWx0cyBmcm9tIHsgZG9jczogWy4uLl0gfSB0byBwbGFpbiBhcnJheXNcbiAgICAgIGlmIChpc0pvaW5SZXN1bHQodmFsdWUpKSB7XG4gICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICBcInRyYW5zZm9ybU91dHB1dDogZmxhdHRlbmluZyBqb2luIHJlc3VsdFwiLFxuICAgICAgICAgIHsga2V5LCB0YXJnZXRGaWVsZEtleSwgaXNBcnJheTogQXJyYXkuaXNBcnJheSh2YWx1ZS5kb2NzKSB9XG4gICAgICAgIF0pO1xuICAgICAgICByZXN1bHRbdGFyZ2V0RmllbGRLZXldID0gZmxhdHRlbkpvaW5SZXN1bHQodmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSByZWxhdGlvbnNoaXAgZmllbGRzIChib3RoIHJlbmFtZWQgYW5kIG5vbi1yZW5hbWVkKVxuICAgICAgY29uc3Qgb3JpZ2luYWxSZWxhdGVkRmllbGRLZXkgPSBPYmplY3Qua2V5cyhyZWxhdGlvbnNoaXBGaWVsZHMpLmZpbmQoXG4gICAgICAgIChrKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWFwcGVkTmFtZSA9IHJlbGF0aW9uc2hpcEZpZWxkc1trXS5maWVsZE5hbWUgfHwgaztcbiAgICAgICAgICByZXR1cm4gbWFwcGVkTmFtZSA9PT0ga2V5O1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgaWYgKG9yaWdpbmFsUmVsYXRlZEZpZWxkS2V5KSB7XG4gICAgICAgIG5vcm1hbGl6ZURvY3VtZW50SWRzKHJlc3VsdCwgb3JpZ2luYWxSZWxhdGVkRmllbGRLZXksIGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBkYXRlIGZpZWxkcyAoYm90aCByZW5hbWVkIGFuZCBub24tcmVuYW1lZClcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGF0ZUZpZWxkS2V5ID0gT2JqZWN0LmtleXMoZGF0ZUZpZWxkcykuZmluZCgoaykgPT4ge1xuICAgICAgICBjb25zdCBtYXBwZWROYW1lID0gZGF0ZUZpZWxkc1trXS5maWVsZE5hbWUgfHwgaztcbiAgICAgICAgcmV0dXJuIG1hcHBlZE5hbWUgPT09IGtleTtcbiAgICAgIH0pO1xuICAgICAgaWYgKG9yaWdpbmFsRGF0ZUZpZWxkS2V5KSB7XG4gICAgICAgIC8vIENvbnZlcnQgSVNPIGRhdGUgc3RyaW5ncyB0byBEYXRlIG9iamVjdHMgZm9yIEJldHRlckF1dGhcbiAgICAgICAgcmVzdWx0W3RhcmdldEZpZWxkS2V5XSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU3RyaXAgUGF5bG9hZC1pbnRlcm5hbCBmaWVsZHMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgc2NoZW1hLlxuICAgIC8vIFBheWxvYWQgaW5qZWN0cyBmaWVsZHMgbGlrZSBgY29sbGVjdGlvbmAgYW5kIGludGVybmFsIG1ldGFkYXRhXG4gICAgLy8gdGhhdCBjYWxsZXJzIGRvbid0IGV4cGVjdC4gV2UgYWxsb3cgYm90aCBCQSBzY2hlbWEgZmllbGRzIEFORFxuICAgIC8vIFBheWxvYWQgY29sbGVjdGlvbiBmaWVsZHMg4oCUIHRoaXMgZW5zdXJlcyBwbHVnaW4tYWRkZWQgZmllbGRzXG4gICAgLy8gKGUuZy4gcm9sZS90b2tlbi91cmwgb24gYWRtaW4taW52aXRhdGlvbnMpIHN1cnZpdmUgZXZlbiB3aGVuXG4gICAgLy8gdGhlIEJBIHNjaGVtYSBkb2Vzbid0IGRlY2xhcmUgdGhlbS5cbiAgICBpZiAoT2JqZWN0LmtleXMoc2NoZW1hRmllbGRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldENvbGxlY3Rpb25TbHVnKG1vZGVsKTtcbiAgICAgIGxldCBwYXlsb2FkRmllbGROYW1lcyA9IGZsYXR0ZW5lZEZpZWxkc0NhY2hlLmdldChjb2xsZWN0aW9uU2x1Zyk7XG4gICAgICBpZiAoIXBheWxvYWRGaWVsZE5hbWVzKSB7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBwYXlsb2FkLmNvbGxlY3Rpb25zW2NvbGxlY3Rpb25TbHVnXTtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBwYXlsb2FkRmllbGROYW1lcyA9IGZsYXR0ZW5BbGxGaWVsZHMoeyBmaWVsZHM6IGNvbGxlY3Rpb24uY29uZmlnLmZpZWxkcyB9KTtcbiAgICAgICAgICBmbGF0dGVuZWRGaWVsZHNDYWNoZS5zZXQoY29sbGVjdGlvblNsdWcsIHBheWxvYWRGaWVsZE5hbWVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgcGF5bG9hZE5hbWVzID0gbmV3IFNldChwYXlsb2FkRmllbGROYW1lcz8ubWFwKChmKSA9PiBmLm5hbWUpID8/IFtdKTtcbiAgICAgIGNvbnN0IGFsbG93ZWRLZXlzID0gbmV3IFNldChbXCJpZFwiLCBcIl9pZFwiLCAuLi5PYmplY3Qua2V5cyhzY2hlbWFGaWVsZHMpLCAuLi5wYXlsb2FkTmFtZXNdKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3VsdCkpIHtcbiAgICAgICAgaWYgKCFhbGxvd2VkS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgIGRlbGV0ZSByZXN1bHRba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIElEIGZpZWxkcyBmb3IgYm90aCBwcmltYXJ5IGFuZCByZWxhdGlvbnNoaXAgZG9jdW1lbnRzLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGVuc3VyZXMgY29uc2lzdGVudCBJRCBoYW5kbGluZyBiZXR3ZWVuIEJldHRlckF1dGggYW5kIFBheWxvYWQgQ01TIGJ5OlxuICAgKiAxLiBDb252ZXJ0aW5nIGFsbCBJRHMgdG8gc3RyaW5ncyBmb3IgQmV0dGVyQXV0aCAoc3RvcmVkIGluIG9yaWdpbmFsS2V5KVxuICAgKiAyLiBQcmVzZXJ2aW5nIG9yaWdpbmFsIElEIHR5cGVzIGZvciBQYXlsb2FkIENNUyAoc3RvcmVkIGluIGZpZWxkTmFtZSlcbiAgICpcbiAgICogVGhlIGZ1bmN0aW9uIGhhbmRsZXMgdmFyaW91cyBJRCBmb3JtYXRzOlxuICAgKiAtIFByaW1pdGl2ZSB2YWx1ZXMgKHN0cmluZy9udW1iZXIgSURzKVxuICAgKiAtIE9iamVjdCByZWZlcmVuY2VzIHdpdGggSUQgcHJvcGVydGllc1xuICAgKiAtIEFycmF5cyBvZiBlaXRoZXIgcHJpbWl0aXZlIElEcyBvciBvYmplY3QgcmVmZXJlbmNlc1xuICAgKlxuICAgKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHJlc3VsdCBvYmplY3QgYmVpbmcgdHJhbnNmb3JtZWRcbiAgICogQHBhcmFtIG9yaWdpbmFsS2V5IC0gVGhlIG9yaWdpbmFsIGZpZWxkIGtleSBmcm9tIEJldHRlckF1dGggc2NoZW1hXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgLSBUaGUgcmVuYW1lZCBmaWVsZCBhcyB1c2VkIGluIFBheWxvYWQgQ01TXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBJRCB2YWx1ZSB0byBub3JtYWxpemUgKHByaW1pdGl2ZSwgb2JqZWN0LCBvciBhcnJheSlcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZURvY3VtZW50SWRzKFxuICAgIHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBvcmlnaW5hbEtleTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiBhbnlcbiAgKTogdm9pZCB7XG4gICAgLy8gQ2FzZSAxOiBQcmltaXRpdmUgSUQgdmFsdWUgKHN0cmluZyBvciBudW1iZXIpXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIC8vIEZvciBCZXR0ZXJBdXRoOiBBbHdheXMgdXNlIHN0cmluZyBJRHNcbiAgICAgIHJlc3VsdFtvcmlnaW5hbEtleV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgLy8gRm9yIFBheWxvYWQ6IEtlZXAgb3JpZ2luYWwgdHlwZVxuICAgICAgcmVzdWx0W2ZpZWxkTmFtZV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDYXNlIDI6IE9iamVjdCB3aXRoIElEIHByb3BlcnR5XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICBcImlkXCIgaW4gdmFsdWVcbiAgICApIHtcbiAgICAgIC8vIEZvciBCZXR0ZXJBdXRoOiBFeHRyYWN0IGFuZCBzdHJpbmdpZnkgdGhlIElEXG4gICAgICByZXN1bHRbb3JpZ2luYWxLZXldID0gU3RyaW5nKHZhbHVlLmlkKTtcbiAgICAgIC8vIFByZXNlcnZlIHRoZSBwb3B1bGF0ZWQgcmVsYXRpb25zaGlwIG9iamVjdCBzbyBqb2lucyByZXR1cm4gZnVsbCBkb2N1bWVudHNcbiAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0ge1xuICAgICAgICAuLi52YWx1ZSxcbiAgICAgICAgaWQ6IFN0cmluZyh2YWx1ZS5pZClcbiAgICAgIH07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FzZSAzOiBBcnJheSBvZiBJRHMgb3IgcmVmZXJlbmNlc1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDaGVjayBpZiBhcnJheSBjb250YWlucyBvYmplY3RzIHdpdGggSUQgcHJvcGVydGllc1xuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZS5ldmVyeShcbiAgICAgICAgICAoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIgJiYgaXRlbSAhPT0gbnVsbCAmJiBcImlkXCIgaW4gaXRlbVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgLy8gQXJyYXkgb2Ygb2JqZWN0cyB3aXRoIElEc1xuICAgICAgICByZXN1bHRbb3JpZ2luYWxLZXldID0gdmFsdWUubWFwKChpdGVtKSA9PiBTdHJpbmcoaXRlbS5pZCkpO1xuICAgICAgICAvLyBLZWVwIGpvaW5lZCBkb2N1bWVudHMgaW50YWN0IHdoaWxlIG5vcm1hbGl6aW5nIElEIHR5cGVcbiAgICAgICAgcmVzdWx0W2ZpZWxkTmFtZV0gPSB2YWx1ZS5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBpZDogU3RyaW5nKGl0ZW0uaWQpXG4gICAgICAgIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFycmF5IG9mIHByaW1pdGl2ZSBJRHNcbiAgICAgICAgcmVzdWx0W29yaWdpbmFsS2V5XSA9IHZhbHVlLm1hcCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgcmVzdWx0W2ZpZWxkTmFtZV0gPSB2YWx1ZS5tYXAoKGl0ZW0pID0+IGl0ZW0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE5vdGU6IElmIHZhbHVlIGRvZXNuJ3QgbWF0Y2ggYW55IGV4cGVjdGVkIGZvcm1hdCwgbm8gY2hhbmdlcyBhcmUgbWFkZVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgQmV0dGVyQXV0aCBvcGVyYXRvciB0byB0aGUgZXF1aXZhbGVudCBQYXlsb2FkIENNUyBxdWVyeSBvcGVyYXRvclxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIG1hcHMgc3RhbmRhcmQgcXVlcnkgb3BlcmF0b3JzIGZyb20gQmV0dGVyQXV0aCdzIGZvcm1hdCB0b1xuICAgKiB0aGUgc3BlY2lmaWMgZm9ybWF0IGV4cGVjdGVkIGJ5IFBheWxvYWQgQ01TJ3MgcXVlcnkgZW5naW5lLlxuICAgKlxuICAgKiBAcGFyYW0gb3BlcmF0b3IgLSBUaGUgQmV0dGVyQXV0aCBvcGVyYXRvciBzdHJpbmcgKGUuZy4sICdlcScsICdndCcsICdjb250YWlucycpXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSB1c2VkIHdpdGggdGhlIG9wZXJhdG9yXG4gICAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBQYXlsb2FkLWNvbXBhdGlibGUgb3BlcmF0b3IgYW5kIHZhbHVlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgeyBlcXVhbHM6ICd0ZXN0QGV4YW1wbGUuY29tJyB9XG4gICAqIG9wZXJhdG9yVG9QYXlsb2FkKCdlcScsICd0ZXN0QGV4YW1wbGUuY29tJylcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyB7IGdyZWF0ZXJfdGhhbjogMTAwIH1cbiAgICogb3BlcmF0b3JUb1BheWxvYWQoJ2d0JywgMTAwKVxuICAgKi9cbiAgZnVuY3Rpb24gb3BlcmF0b3JUb1BheWxvYWQoXG4gICAgb3BlcmF0b3I6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55XG4gICk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgIGNhc2UgXCJlcVwiOlxuICAgICAgICByZXR1cm4geyBlcXVhbHM6IHZhbHVlIH07XG4gICAgICBjYXNlIFwibmVcIjpcbiAgICAgICAgcmV0dXJuIHsgbm90X2VxdWFsczogdmFsdWUgfTtcbiAgICAgIGNhc2UgXCJndFwiOlxuICAgICAgICByZXR1cm4geyBncmVhdGVyX3RoYW46IHZhbHVlIH07XG4gICAgICBjYXNlIFwiZ3RlXCI6XG4gICAgICAgIHJldHVybiB7IGdyZWF0ZXJfdGhhbl9lcXVhbDogdmFsdWUgfTtcbiAgICAgIGNhc2UgXCJsdFwiOlxuICAgICAgICByZXR1cm4geyBsZXNzX3RoYW46IHZhbHVlIH07XG4gICAgICBjYXNlIFwibHRlXCI6XG4gICAgICAgIHJldHVybiB7IGxlc3NfdGhhbl9lcXVhbDogdmFsdWUgfTtcbiAgICAgIGNhc2UgXCJjb250YWluc1wiOlxuICAgICAgICByZXR1cm4geyBjb250YWluczogdmFsdWUgfTtcbiAgICAgIGNhc2UgXCJpblwiOlxuICAgICAgICByZXR1cm4geyBpbjogdmFsdWUgfTtcbiAgICAgIGNhc2UgXCJzdGFydHNfd2l0aFwiOlxuICAgICAgICByZXR1cm4geyBsaWtlOiBgJHt2YWx1ZX0lYCB9O1xuICAgICAgY2FzZSBcImVuZHNfd2l0aFwiOlxuICAgICAgICByZXR1cm4geyBsaWtlOiBgJSR7dmFsdWV9YCB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGVxdWFscyBmb3IgdW5yZWNvZ25pemVkIG9wZXJhdG9yc1xuICAgICAgICByZXR1cm4geyBlcXVhbHM6IHZhbHVlIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgd2hlcmUgY2xhdXNlIHZhbHVlIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGJhc2VkIG9uIGZpZWxkIG5hbWUgYW5kIElEIHR5cGUgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhyZWUgbWFpbiBzY2VuYXJpb3M6XG4gICAqIDEuIElEIGZpZWxkIGNvbnZlcnNpb24gLSBlbnN1cmVzIElEcyBtYXRjaCB0aGUgZGF0YWJhc2UncyBleHBlY3RlZCB0eXBlIChudW1iZXIgb3Igc3RyaW5nKVxuICAgKiAyLiBSZWxhdGlvbnNoaXAgZmllbGQgY29udmVyc2lvbiAtIGVuc3VyZXMgZm9yZWlnbiBrZXkgdmFsdWVzIG1hdGNoIHRoZSBleHBlY3RlZCBJRCB0eXBlXG4gICAqIDMuIE9iamVjdCB3aXRoIGVtYmVkZGVkIElEIC0gZXh0cmFjdHMgYW5kIGNvbnZlcnRzIHRoZSBJRCBwcm9wZXJ0eSBmcm9tIG9iamVjdHNcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgKGNhbiBiZSBwcmltaXRpdmUsIG9iamVjdCB3aXRoIElELCBvciBhcnJheSlcbiAgICogQHBhcmFtIGZpZWxkTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBiZWluZyBxdWVyaWVkXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbC9jb2xsZWN0aW9uIG5hbWUgZm9yIHNjaGVtYSBsb29rdXBzXG4gICAqIEBwYXJhbSBpZFR5cGUgLSBUaGUgZXhwZWN0ZWQgSUQgdHlwZSBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCB2YWx1ZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGRhdGFiYXNlIHF1ZXJ5XG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0V2hlcmVWYWx1ZSh7XG4gICAgdmFsdWUsXG4gICAgZmllbGROYW1lLFxuICAgIG9yaWdpbmFsRmllbGRLZXksXG4gICAgbW9kZWwsXG4gICAgaWRUeXBlXG4gIH06IHtcbiAgICB2YWx1ZTogYW55O1xuICAgIGZpZWxkTmFtZTogc3RyaW5nO1xuICAgIG9yaWdpbmFsRmllbGRLZXk/OiBzdHJpbmc7XG4gICAgbW9kZWw6IE1vZGVsS2V5O1xuICAgIGlkVHlwZTogXCJudW1iZXJcIiB8IFwidGV4dFwiO1xuICB9KTogYW55IHtcbiAgICBjb25zdCBzY2hlbWFGaWVsZHMgPSBzY2hlbWE/Llttb2RlbF0/LmZpZWxkcyA/PyB7fTtcbiAgICBjb25zdCBsb29rdXBLZXkgPSBvcmlnaW5hbEZpZWxkS2V5ID8/IGZpZWxkTmFtZTtcbiAgICBjb25zdCBuZWVkc0lkQ29udmVyc2lvbiA9XG4gICAgICBbXCJpZFwiLCBcIl9pZFwiXS5pbmNsdWRlcyhmaWVsZE5hbWUpIHx8XG4gICAgICBpc1JlbGF0aW9uc2hpcEZpZWxkKGxvb2t1cEtleSwgc2NoZW1hRmllbGRzKTtcblxuICAgIGlmICghbmVlZHNJZENvbnZlcnNpb24pIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBDYXNlIDA6IFZhbHVlIGlzIGFuIGFycmF5IChlLmcuIGZvciB0aGUgYGluYCBvcGVyYXRvcikg4oCUIGNvbnZlcnQgZWFjaCBlbGVtZW50XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUubWFwKCh2KSA9PlxuICAgICAgICBjb252ZXJ0V2hlcmVWYWx1ZSh7XG4gICAgICAgICAgdmFsdWU6IHYsXG4gICAgICAgICAgZmllbGROYW1lLFxuICAgICAgICAgIG9yaWdpbmFsRmllbGRLZXksXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgaWRUeXBlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENhc2UgMTogVmFsdWUgaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYW4gSUQgcHJvcGVydHlcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmIFwiaWRcIiBpbiB2YWx1ZSkge1xuICAgICAgY29uc3QgaWQgPSB2YWx1ZS5pZDtcbiAgICAgIGlmIChpZFR5cGUgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IG51bUlkID0gTnVtYmVyKGlkKTtcbiAgICAgICAgcmV0dXJuICFpc05hTihudW1JZCkgPyBudW1JZCA6IGlkO1xuICAgICAgfVxuICAgICAgaWYgKGlkVHlwZSA9PT0gXCJ0ZXh0XCIgJiYgdHlwZW9mIGlkID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoaWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cblxuICAgIC8vIENhc2UgMjogVmFsdWUgaXMgYSBzdGFuZGFsb25lIElEIHRoYXQgbmVlZHMgdHlwZSBjb252ZXJzaW9uXG4gICAgaWYgKFxuICAgICAgaWRUeXBlID09PSBcIm51bWJlclwiICYmXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICFpc05hTihOdW1iZXIodmFsdWUpKVxuICAgICkge1xuICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChpZFR5cGUgPT09IFwidGV4dFwiICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIEJldHRlciBBdXRoIHdoZXJlIGNsYXVzZXMgdG8gUGF5bG9hZCBDTVMgY29tcGF0aWJsZSB3aGVyZSBjb25kaXRpb25zXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdHJhbnNmb3JtcyB0aGUgQmV0dGVyIEF1dGggcXVlcnkgZm9ybWF0IGludG8gUGF5bG9hZCdzIHF1ZXJ5IGZvcm1hdCxcbiAgICogaGFuZGxpbmcgZmllbGQgbmFtZSBtYXBwaW5nLCB2YWx1ZSB0eXBlIGNvbnZlcnNpb24sIGFuZCBsb2dpY2FsIG9wZXJhdG9ycyAoQU5EL09SKS5cbiAgICpcbiAgICogVGhlIGZ1bmN0aW9uIGhhbmRsZXMgdGhyZWUgbWFpbiBjYXNlczpcbiAgICogMS4gRW1wdHkgb3IgdW5kZWZpbmVkIHdoZXJlIGNsYXVzZSAtIHJldHVybnMgZW1wdHkgb2JqZWN0XG4gICAqIDIuIFNpbmdsZSBjb25kaXRpb24gLSBjb252ZXJ0cyB0byBhIHNpbXBsZSBmaWVsZC12YWx1ZSBwYWlyXG4gICAqIDMuIE11bHRpcGxlIGNvbmRpdGlvbnMgLSBncm91cHMgYnkgQU5EL09SIGNvbm5lY3RvcnMgYW5kIGJ1aWxkcyBhIGNvbXBsZXggcXVlcnlcbiAgICpcbiAgICogQHBhcmFtIGlkVHlwZSAtIFRoZSBkYXRhYmFzZSBJRCB0eXBlICgnbnVtYmVyJyBvciAndGV4dCcpXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbC9jb2xsZWN0aW9uIG5hbWUgdG8gcXVlcnlcbiAgICogQHBhcmFtIHdoZXJlIC0gQXJyYXkgb2YgQmV0dGVyIEF1dGggd2hlcmUgY29uZGl0aW9uc1xuICAgKiBAcmV0dXJucyBBIFBheWxvYWQtY29tcGF0aWJsZSB3aGVyZSBjbGF1c2Ugb2JqZWN0XG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0V2hlcmVDbGF1c2Uoe1xuICAgIGlkVHlwZSxcbiAgICBtb2RlbDogcmF3TW9kZWwsXG4gICAgd2hlcmUsXG4gICAgcGF5bG9hZFxuICB9OiB7XG4gICAgaWRUeXBlOiBcIm51bWJlclwiIHwgXCJ0ZXh0XCI7XG4gICAgbW9kZWw6IE1vZGVsS2V5O1xuICAgIHdoZXJlPzogV2hlcmVbXTtcbiAgICBwYXlsb2FkOiBCYXNlUGF5bG9hZDtcbiAgfSk6IFBheWxvYWRXaGVyZSB7XG4gICAgY29uc3QgbW9kZWwgPSByZXNvbHZlTW9kZWxLZXkocmF3TW9kZWwpO1xuICAgIC8vIEhhbmRsZSBlbXB0eSB3aGVyZSBjbGF1c2VcbiAgICBpZiAoIXdoZXJlKSByZXR1cm4ge307XG5cbiAgICBmdW5jdGlvbiBnZXRQYXlsb2FkRmllbGROYW1lKGZpZWxkS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGdldENvbGxlY3Rpb25GaWVsZE5hbWVCeUZpZWxkS2V5VW50eXBlZChcbiAgICAgICAgZ2V0Q29sbGVjdGlvbkJ5TW9kZWxLZXkocGF5bG9hZC5jb2xsZWN0aW9ucywgbW9kZWwpLFxuICAgICAgICBmaWVsZEtleVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc2luZ2xlIGNvbmRpdGlvbiBjYXNlIGZvciBvcHRpbWl6YXRpb25cbiAgICBpZiAod2hlcmUubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCB3ID0gd2hlcmVbMF07XG4gICAgICBpZiAoIXcpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuXG4gICAgICAvLyBNYXAgZmllbGQgbmFtZSBhY2NvcmRpbmcgdG8gc2NoZW1hIGFuZCBjb252ZXJ0IHZhbHVlIHRvIGFwcHJvcHJpYXRlIHR5cGVcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShtb2RlbCwgdy5maWVsZCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRXaGVyZVZhbHVlKHtcbiAgICAgICAgdmFsdWU6IHcudmFsdWUsXG4gICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgb3JpZ2luYWxGaWVsZEtleTogdy5maWVsZCxcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIGlkVHlwZVxuICAgICAgfSk7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgUGF5bG9hZCB3aGVyZSBjb25kaXRpb24gd2l0aCBwcm9wZXIgb3BlcmF0b3JcbiAgICAgIGNvbnN0IHJlcyA9IHtcbiAgICAgICAgW2dldFBheWxvYWRGaWVsZE5hbWUoZmllbGROYW1lKV06IG9wZXJhdG9yVG9QYXlsb2FkKFxuICAgICAgICAgIHcub3BlcmF0b3IgPz8gXCJcIixcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICApXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBtdWx0aXBsZSBjb25kaXRpb25zIGJ5IHNlcGFyYXRpbmcgQU5EL09SIGNsYXVzZXNcbiAgICAvLyBEZWZhdWx0IHRvIEFORCBpZiBubyBjb25uZWN0b3IgaXMgc3BlY2lmaWVkXG4gICAgY29uc3QgYW5kID0gd2hlcmUuZmlsdGVyKCh3KSA9PiB3LmNvbm5lY3RvciA9PT0gXCJBTkRcIiB8fCAhdy5jb25uZWN0b3IpO1xuICAgIGNvbnN0IG9yID0gd2hlcmUuZmlsdGVyKCh3KSA9PiB3LmNvbm5lY3RvciA9PT0gXCJPUlwiKTtcblxuICAgIC8vIFByb2Nlc3MgQU5EIGNvbmRpdGlvbnNcbiAgICBjb25zdCBhbmRDbGF1c2UgPSBhbmQubWFwKCh3KSA9PiB7XG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBnZXRGaWVsZE5hbWUobW9kZWwsIHcuZmllbGQpO1xuICAgICAgY29uc3QgdmFsdWUgPSBjb252ZXJ0V2hlcmVWYWx1ZSh7XG4gICAgICAgIHZhbHVlOiB3LnZhbHVlLFxuICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgIG9yaWdpbmFsRmllbGRLZXk6IHcuZmllbGQsXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBpZFR5cGVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2dldFBheWxvYWRGaWVsZE5hbWUoZmllbGROYW1lKV06IG9wZXJhdG9yVG9QYXlsb2FkKFxuICAgICAgICAgIHcub3BlcmF0b3IgPz8gXCJcIixcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICApXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gUHJvY2VzcyBPUiBjb25kaXRpb25zXG4gICAgY29uc3Qgb3JDbGF1c2UgPSBvci5tYXAoKHcpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShtb2RlbCwgdy5maWVsZCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRXaGVyZVZhbHVlKHtcbiAgICAgICAgdmFsdWU6IHcudmFsdWUsXG4gICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgb3JpZ2luYWxGaWVsZEtleTogdy5maWVsZCxcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIGlkVHlwZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbZ2V0UGF5bG9hZEZpZWxkTmFtZShmaWVsZE5hbWUpXTogb3BlcmF0b3JUb1BheWxvYWQoXG4gICAgICAgICAgdy5vcGVyYXRvciA/PyBcIlwiLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIClcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBDb21iaW5lIEFORCBhbmQgT1IgY2xhdXNlcyBpbnRvIGZpbmFsIFBheWxvYWQgd2hlcmUgb2JqZWN0XG4gICAgLy8gT25seSBpbmNsdWRlIG5vbi1lbXB0eSBjbGF1c2UgYXJyYXlzXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihhbmRDbGF1c2UubGVuZ3RoID8geyBBTkQ6IGFuZENsYXVzZSB9IDoge30pLFxuICAgICAgLi4uKG9yQ2xhdXNlLmxlbmd0aCA/IHsgT1I6IG9yQ2xhdXNlIH0gOiB7fSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgYmV0dGVyLWF1dGggc2VsZWN0IGFycmF5IHRvIGEgUGF5bG9hZCBzZWxlY3Qgb2JqZWN0XG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdHJhbnNmb3JtcyB0aGUgYmV0dGVyLWF1dGggc2VsZWN0IGFycmF5ICh3aGljaCBjb250YWlucyBmaWVsZCBuYW1lcylcbiAgICogaW50byB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IFBheWxvYWQgQ01TJ3MgcXVlcnkgQVBJIChhbiBvYmplY3Qgd2l0aCBmaWVsZCBuYW1lcyBhcyBrZXlzXG4gICAqIGFuZCBib29sZWFuIHRydWUgYXMgdmFsdWVzKS5cbiAgICpcbiAgICogSXQgYWxzbyBoYW5kbGVzIGZpZWxkIG5hbWUgbWFwcGluZyBiZXR3ZWVuIGJldHRlci1hdXRoIHNjaGVtYSBhbmQgUGF5bG9hZCBjb2xsZWN0aW9uc1xuICAgKiBieSB1c2luZyB0aGUgZ2V0RmllbGROYW1lIGhlbHBlciB0byByZXNvbHZlIHRoZSBjb3JyZWN0IGZpZWxkIG5hbWVzLlxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwvY29sbGVjdGlvbiBuYW1lIHRvIGdldCBmaWVsZCBtYXBwaW5ncyBmcm9tXG4gICAqIEBwYXJhbSBzZWxlY3QgLSBPcHRpb25hbCBhcnJheSBvZiBmaWVsZCBuYW1lcyB0byBzZWxlY3RcbiAgICogQHJldHVybnMgQSBQYXlsb2FkLWNvbXBhdGlibGUgc2VsZWN0IG9iamVjdCBvciB1bmRlZmluZWQgaWYgbm8gZmllbGRzIHRvIHNlbGVjdFxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJbnB1dDogWydlbWFpbCcsICduYW1lJ11cbiAgICogLy8gT3V0cHV0OiB7IGVtYWlsOiB0cnVlLCBuYW1lOiB0cnVlIH1cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnZlcnRTZWxlY3QoXG4gICAgcmF3TW9kZWw6IE1vZGVsS2V5LFxuICAgIHNlbGVjdD86IHN0cmluZ1tdLFxuICAgIHBheWxvYWQ/OiBCYXNlUGF5bG9hZFxuICApIHtcbiAgICBjb25zdCBtb2RlbCA9IHJlc29sdmVNb2RlbEtleShyYXdNb2RlbCk7XG4gICAgLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBzZWxlY3QgaXMgZW1wdHkgb3Igbm90IHByb3ZpZGVkXG4gICAgaWYgKCFzZWxlY3QgfHwgc2VsZWN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIC8vIFRyYW5zZm9ybSB0aGUgYXJyYXkgb2YgZmllbGQgbmFtZXMgaW50byBhIFBheWxvYWQgc2VsZWN0IG9iamVjdFxuICAgIC8vIGFwcGx5aW5nIGJvdGggc2NoZW1hLWxldmVsIGFuZCBjb2xsZWN0aW9uLWxldmVsIGZpZWxkIG5hbWUgbWFwcGluZ1xuICAgIHJldHVybiBzZWxlY3QucmVkdWNlKChhY2MsIGZpZWxkKSA9PiB7XG4gICAgICBjb25zdCBzY2hlbWFGaWVsZE5hbWUgPSBnZXRGaWVsZE5hbWUobW9kZWwsIGZpZWxkKTtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IHBheWxvYWRcbiAgICAgICAgPyBnZXRDb2xsZWN0aW9uRmllbGROYW1lQnlGaWVsZEtleVVudHlwZWQoXG4gICAgICAgICAgICBnZXRDb2xsZWN0aW9uQnlNb2RlbEtleShwYXlsb2FkLmNvbGxlY3Rpb25zLCBtb2RlbCksXG4gICAgICAgICAgICBzY2hlbWFGaWVsZE5hbWVcbiAgICAgICAgICApXG4gICAgICAgIDogc2NoZW1hRmllbGROYW1lO1xuICAgICAgcmV0dXJuIHsgLi4uYWNjLCBbZmllbGROYW1lXTogdHJ1ZSB9O1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGJldHRlci1hdXRoIHNvcnQgb2JqZWN0IHRvIGEgUGF5bG9hZCBzb3J0IHN0cmluZ1xuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHRyYW5zZm9ybXMgdGhlIGJldHRlci1hdXRoIHNvcnQgb2JqZWN0ICh3aGljaCBjb250YWlucyBmaWVsZCBuYW1lIGFuZCBkaXJlY3Rpb24pXG4gICAqIGludG8gdGhlIGZvcm1hdCBleHBlY3RlZCBieSBQYXlsb2FkIENNUydzIHF1ZXJ5IEFQSSAoYSBzdHJpbmcgd2l0aCBvcHRpb25hbCAnLScgcHJlZml4IGZvciBkZXNjZW5kaW5nIG9yZGVyKS5cbiAgICpcbiAgICogSXQgYWxzbyBoYW5kbGVzIGZpZWxkIG5hbWUgbWFwcGluZyBiZXR3ZWVuIGJldHRlci1hdXRoIHNjaGVtYSBhbmQgUGF5bG9hZCBjb2xsZWN0aW9uc1xuICAgKiBieSB1c2luZyB0aGUgZ2V0RmllbGROYW1lIGhlbHBlciB0byByZXNvbHZlIHRoZSBjb3JyZWN0IGZpZWxkIG5hbWVzLlxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwvY29sbGVjdGlvbiBuYW1lIHRvIGdldCBmaWVsZCBtYXBwaW5ncyBmcm9tXG4gICAqIEBwYXJhbSBzb3J0QnkgLSBPcHRpb25hbCBvYmplY3QgY29udGFpbmluZyBmaWVsZCBuYW1lIGFuZCBzb3J0IGRpcmVjdGlvblxuICAgKiBAcmV0dXJucyBBIFBheWxvYWQtY29tcGF0aWJsZSBzb3J0IHN0cmluZyBvciB1bmRlZmluZWQgaWYgbm8gc29ydCBzcGVjaWZpZWRcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSW5wdXQ6IHsgZmllbGQ6ICdlbWFpbCcsIGRpcmVjdGlvbjogJ2Rlc2MnIH1cbiAgICogLy8gT3V0cHV0OiAnLWVtYWlsJ1xuICAgKiAvLyBJbnB1dDogeyBmaWVsZDogJ2NyZWF0ZWRBdCcsIGRpcmVjdGlvbjogJ2FzYycgfVxuICAgKiAvLyBPdXRwdXQ6ICdjcmVhdGVkQXQnXG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0U29ydChcbiAgICByYXdNb2RlbDogTW9kZWxLZXksXG4gICAgc29ydEJ5PzogeyBmaWVsZDogc3RyaW5nOyBkaXJlY3Rpb246IFwiYXNjXCIgfCBcImRlc2NcIiB9LFxuICAgIHBheWxvYWQ/OiBCYXNlUGF5bG9hZFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1vZGVsID0gcmVzb2x2ZU1vZGVsS2V5KHJhd01vZGVsKTtcbiAgICBpZiAoIXNvcnRCeSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBzY2hlbWFGaWVsZE5hbWUgPSBnZXRGaWVsZE5hbWUobW9kZWwsIHNvcnRCeS5maWVsZCk7XG4gICAgLy8gQXBwbHkgY29sbGVjdGlvbi1sZXZlbCBmaWVsZCBuYW1lIG1hcHBpbmcgaWYgcGF5bG9hZCBpcyBhdmFpbGFibGVcbiAgICBjb25zdCBmaWVsZE5hbWUgPSBwYXlsb2FkXG4gICAgICA/IGdldENvbGxlY3Rpb25GaWVsZE5hbWVCeUZpZWxkS2V5VW50eXBlZChcbiAgICAgICAgICBnZXRDb2xsZWN0aW9uQnlNb2RlbEtleShwYXlsb2FkLmNvbGxlY3Rpb25zLCBtb2RlbCksXG4gICAgICAgICAgc2NoZW1hRmllbGROYW1lXG4gICAgICAgIClcbiAgICAgIDogc2NoZW1hRmllbGROYW1lO1xuICAgIGNvbnN0IHByZWZpeCA9IHNvcnRCeS5kaXJlY3Rpb24gPT09IFwiZGVzY1wiID8gXCItXCIgOiBcIlwiO1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHtmaWVsZE5hbWV9YDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2V0RmllbGROYW1lLFxuICAgIGdldENvbGxlY3Rpb25TbHVnLFxuICAgIHNpbmdsZUlkUXVlcnksXG4gICAgdHJhbnNmb3JtSW5wdXQsXG4gICAgdHJhbnNmb3JtT3V0cHV0LFxuICAgIGNvbnZlcnRXaGVyZUNsYXVzZSxcbiAgICBjb252ZXJ0U2VsZWN0LFxuICAgIGNvbnZlcnRTb3J0XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbImdldEF1dGhUYWJsZXMiLCJmbGF0dGVuQWxsRmllbGRzIiwiZ2V0Q29sbGVjdGlvbkJ5TW9kZWxLZXkiLCJnZXRDb2xsZWN0aW9uRmllbGROYW1lQnlGaWVsZEtleVVudHlwZWQiLCJnZXRGaWVsZEtleUJ5Q29sbGVjdGlvbkZpZWxkTmFtZSIsImNyZWF0ZVRyYW5zZm9ybSIsIm9wdGlvbnMiLCJlbmFibGVEZWJ1Z0xvZ3MiLCJzY2hlbWEiLCJkZWJ1Z0xvZyIsIm1lc3NhZ2UiLCJjb25zb2xlIiwibG9nIiwiZ2V0Q29sbGVjdGlvblNsdWciLCJtb2RlbCIsImNvbGxlY3Rpb24iLCJtb2RlbE5hbWUiLCJyZXNvbHZlZFNsdWciLCJtb2RlbEtleUNhY2hlIiwiTWFwIiwicmVzb2x2ZU1vZGVsS2V5IiwiY2FjaGVkIiwiZ2V0Iiwic2V0Iiwia2V5IiwidmFsdWUiLCJPYmplY3QiLCJlbnRyaWVzIiwiZmxhdHRlbmVkRmllbGRzQ2FjaGUiLCJpc1BheWxvYWRSZWxhdGlvbnNoaXAiLCJwYXlsb2FkIiwiY29sbGVjdGlvblNsdWciLCJmaWVsZE5hbWUiLCJjb2xsZWN0aW9ucyIsImZpZWxkcyIsImNvbmZpZyIsImZpZWxkIiwiZmluZCIsImYiLCJuYW1lIiwidHlwZSIsImdldEZpZWxkTmFtZSIsImluY2x1ZGVzIiwiZmllbGREZWZpbml0aW9uIiwib3JpZ2luYWxGaWVsZCIsImlzUmVsYXRpb25zaGlwRmllbGQiLCJmaWVsZEtleSIsInNjaGVtYUZpZWxkcyIsInJlZmVyZW5jZXMiLCJ1bmRlZmluZWQiLCJzaW5nbGVJZFF1ZXJ5Iiwid2hlcmUiLCJzb21lIiwiaWRGaWVsZCIsImNvbmRpdGlvbiIsIkFycmF5IiwiaXNBcnJheSIsImVxdWFscyIsImNvbnRhaW5zIiwibGVuZ3RoIiwibm9ybWFsaXplRGF0YSIsImlzUmVsYXRlZEZpZWxkIiwiaWRUeXBlIiwicGFyc2VkIiwiTnVtYmVyIiwiaXNOYU4iLCJvcmlnaW5hbCIsImNvbnZlcnRlZCIsInN0cmluZ0lkIiwiU3RyaW5nIiwibWFwIiwiaWQiLCJyb2xlIiwidHJpbSIsInRvTG93ZXJDYXNlIiwic3BsaXQiLCJ0cmFuc2Zvcm1JbnB1dCIsImRhdGEiLCJyYXdNb2RlbCIsInRyYW5zZm9ybWVkRGF0YSIsImZvckVhY2giLCJzY2hlbWFGaWVsZE5hbWUiLCJ0YXJnZXRGaWVsZE5hbWUiLCJpc1BheWxvYWRSZWwiLCJub3JtYWxpemVkRGF0YSIsInRhcmdldEZpZWxkS2V5IiwiaXNKb2luUmVzdWx0IiwiZG9jcyIsImZsYXR0ZW5Kb2luUmVzdWx0Iiwiam9pblJlc3VsdCIsIml0ZW0iLCJ0cmFuc2Zvcm1PdXRwdXQiLCJkb2MiLCJyZXN1bHQiLCJyZWxhdGlvbnNoaXBGaWVsZHMiLCJmcm9tRW50cmllcyIsImZpbHRlciIsImRhdGVGaWVsZHMiLCJfIiwia2V5cyIsImpvaW4iLCJvcmlnaW5hbFJlbGF0ZWRGaWVsZEtleSIsImsiLCJtYXBwZWROYW1lIiwibm9ybWFsaXplRG9jdW1lbnRJZHMiLCJvcmlnaW5hbERhdGVGaWVsZEtleSIsIkRhdGUiLCJwYXlsb2FkRmllbGROYW1lcyIsInBheWxvYWROYW1lcyIsIlNldCIsImFsbG93ZWRLZXlzIiwiaGFzIiwib3JpZ2luYWxLZXkiLCJldmVyeSIsIm9wZXJhdG9yVG9QYXlsb2FkIiwib3BlcmF0b3IiLCJub3RfZXF1YWxzIiwiZ3JlYXRlcl90aGFuIiwiZ3JlYXRlcl90aGFuX2VxdWFsIiwibGVzc190aGFuIiwibGVzc190aGFuX2VxdWFsIiwiaW4iLCJsaWtlIiwiY29udmVydFdoZXJlVmFsdWUiLCJvcmlnaW5hbEZpZWxkS2V5IiwibG9va3VwS2V5IiwibmVlZHNJZENvbnZlcnNpb24iLCJ2IiwibnVtSWQiLCJjb252ZXJ0V2hlcmVDbGF1c2UiLCJnZXRQYXlsb2FkRmllbGROYW1lIiwidyIsInJlcyIsImFuZCIsImNvbm5lY3RvciIsIm9yIiwiYW5kQ2xhdXNlIiwib3JDbGF1c2UiLCJBTkQiLCJPUiIsImNvbnZlcnRTZWxlY3QiLCJzZWxlY3QiLCJyZWR1Y2UiLCJhY2MiLCJjb252ZXJ0U29ydCIsInNvcnRCeSIsInByZWZpeCIsImRpcmVjdGlvbiJdLCJtYXBwaW5ncyI6IkFBRUEsU0FBU0EsYUFBYSxRQUFRLGlCQUFpQjtBQUMvQyxTQUdFQyxnQkFBZ0IsUUFFWCxVQUFVO0FBRWpCLFNBQ0VDLHVCQUF1QixFQUN2QkMsdUNBQXVDLEVBQ3ZDQyxnQ0FBZ0MsUUFDM0Isc0NBQThDO0FBRXJELE9BQU8sTUFBTUMsa0JBQWtCLENBQzdCQyxTQUNBQztJQUVBLE1BQU1DLFNBQVNSLGNBQWNNO0lBRTdCLFNBQVNHLFNBQVNDLE9BQWM7UUFDOUIsSUFBSUgsaUJBQWlCO1lBQ25CSSxRQUFRQyxHQUFHLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLRjtRQUN6QztJQUNGO0lBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5QkMsR0FDRCxTQUFTRyxrQkFBa0JDLEtBQWU7UUFDeEMsNkZBQTZGO1FBQzdGLE1BQU1DLGFBQWFQLFFBQVEsQ0FBQ00sTUFBTSxFQUFFRSxhQUFhRjtRQUNqREwsU0FBUztZQUFDO1lBQXNCO2dCQUFFSztnQkFBT0csY0FBY0Y7WUFBVztTQUFFO1FBQ3BFLE9BQU9BO0lBQ1Q7SUFFQTs7Ozs7Ozs7R0FRQyxHQUNELE1BQU1HLGdCQUFnQixJQUFJQztJQUUxQixTQUFTQyxnQkFBZ0JOLEtBQWE7UUFDcEMsTUFBTU8sU0FBU0gsY0FBY0ksR0FBRyxDQUFDUjtRQUNqQyxJQUFJTyxRQUFRLE9BQU9BO1FBRW5CLHdDQUF3QztRQUN4QyxJQUFJYixRQUFRLENBQUNNLE1BQU0sRUFBRTtZQUNuQkksY0FBY0ssR0FBRyxDQUFDVCxPQUFPQTtZQUN6QixPQUFPQTtRQUNUO1FBRUEsbUZBQW1GO1FBQ25GLEtBQUssTUFBTSxDQUFDVSxLQUFLQyxNQUFNLElBQUlDLE9BQU9DLE9BQU8sQ0FB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