velocious 1.0.563 → 1.0.564

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 (211) hide show
  1. package/README.md +2 -0
  2. package/build/background-jobs/cron-expression.js +12 -13
  3. package/build/background-jobs/main.js +6 -6
  4. package/build/background-jobs/runner-graceful-shutdown.js +2 -3
  5. package/build/background-jobs/scheduler.js +3 -3
  6. package/build/background-jobs/worker.js +8 -9
  7. package/build/beacon/client.js +3 -4
  8. package/build/database/drivers/sqlite/web-persistence.js +2 -5
  9. package/build/database/pool/async-tracked-multi-connection.js +65 -15
  10. package/build/database/pool/base.js +23 -7
  11. package/build/database/query/index.js +21 -22
  12. package/build/database/query/model-class-query.js +5 -6
  13. package/build/database/record/attachments/normalize-input.js +9 -10
  14. package/build/database/record/attachments/store.js +2 -2
  15. package/build/database/record/auditing.js +7 -8
  16. package/build/database/record/index.js +4 -5
  17. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +1 -2
  18. package/build/frontend-model-controller.js +49 -56
  19. package/build/frontend-models/base.js +17 -19
  20. package/build/frontend-models/outgoing-event-buffer.js +3 -4
  21. package/build/frontend-models/query.js +40 -44
  22. package/build/frontend-models/resource-definition.js +7 -8
  23. package/build/frontend-models/transport-serialization.js +10 -12
  24. package/build/frontend-models/websocket-channel.js +12 -13
  25. package/build/http-server/client/websocket-session.js +4 -5
  26. package/build/http-server/client-delivery-queue.js +7 -8
  27. package/build/http-server/websocket-event-log-store.js +4 -6
  28. package/build/plugins/sqljs-wasm-route.js +3 -5
  29. package/build/src/background-jobs/cron-expression.d.ts +0 -12
  30. package/build/src/background-jobs/cron-expression.d.ts.map +1 -1
  31. package/build/src/background-jobs/cron-expression.js +13 -13
  32. package/build/src/background-jobs/main.d.ts.map +1 -1
  33. package/build/src/background-jobs/main.js +7 -7
  34. package/build/src/background-jobs/runner-graceful-shutdown.d.ts +0 -6
  35. package/build/src/background-jobs/runner-graceful-shutdown.d.ts.map +1 -1
  36. package/build/src/background-jobs/runner-graceful-shutdown.js +3 -3
  37. package/build/src/background-jobs/scheduler.d.ts +0 -3
  38. package/build/src/background-jobs/scheduler.d.ts.map +1 -1
  39. package/build/src/background-jobs/scheduler.js +4 -4
  40. package/build/src/background-jobs/worker.d.ts +0 -8
  41. package/build/src/background-jobs/worker.d.ts.map +1 -1
  42. package/build/src/background-jobs/worker.js +9 -9
  43. package/build/src/beacon/client.d.ts +0 -4
  44. package/build/src/beacon/client.d.ts.map +1 -1
  45. package/build/src/beacon/client.js +4 -4
  46. package/build/src/database/drivers/sqlite/web-persistence.d.ts +0 -14
  47. package/build/src/database/drivers/sqlite/web-persistence.d.ts.map +1 -1
  48. package/build/src/database/drivers/sqlite/web-persistence.js +3 -3
  49. package/build/src/database/pool/async-tracked-multi-connection.d.ts +29 -1
  50. package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
  51. package/build/src/database/pool/async-tracked-multi-connection.js +57 -15
  52. package/build/src/database/pool/base.d.ts +53 -4
  53. package/build/src/database/pool/base.d.ts.map +1 -1
  54. package/build/src/database/pool/base.js +23 -6
  55. package/build/src/database/query/index.d.ts +18 -39
  56. package/build/src/database/query/index.d.ts.map +1 -1
  57. package/build/src/database/query/index.js +22 -22
  58. package/build/src/database/query/model-class-query.d.ts +0 -5
  59. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  60. package/build/src/database/query/model-class-query.js +6 -6
  61. package/build/src/database/record/attachments/normalize-input.d.ts +0 -9
  62. package/build/src/database/record/attachments/normalize-input.d.ts.map +1 -1
  63. package/build/src/database/record/attachments/normalize-input.js +10 -10
  64. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  65. package/build/src/database/record/attachments/store.js +2 -2
  66. package/build/src/database/record/auditing.d.ts +17 -24
  67. package/build/src/database/record/auditing.d.ts.map +1 -1
  68. package/build/src/database/record/auditing.js +8 -8
  69. package/build/src/database/record/index.d.ts +4 -4
  70. package/build/src/database/record/index.d.ts.map +1 -1
  71. package/build/src/database/record/index.js +5 -5
  72. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +0 -39
  73. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  74. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +2 -2
  75. package/build/src/frontend-model-controller.d.ts +1 -1
  76. package/build/src/frontend-model-controller.d.ts.map +1 -1
  77. package/build/src/frontend-model-controller.js +50 -50
  78. package/build/src/frontend-models/base.d.ts.map +1 -1
  79. package/build/src/frontend-models/base.js +18 -18
  80. package/build/src/frontend-models/outgoing-event-buffer.d.ts.map +1 -1
  81. package/build/src/frontend-models/outgoing-event-buffer.js +3 -3
  82. package/build/src/frontend-models/query.d.ts +56 -37
  83. package/build/src/frontend-models/query.d.ts.map +1 -1
  84. package/build/src/frontend-models/query.js +39 -39
  85. package/build/src/frontend-models/resource-definition.d.ts +0 -7
  86. package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
  87. package/build/src/frontend-models/resource-definition.js +8 -8
  88. package/build/src/frontend-models/transport-serialization.d.ts +0 -10
  89. package/build/src/frontend-models/transport-serialization.d.ts.map +1 -1
  90. package/build/src/frontend-models/transport-serialization.js +11 -11
  91. package/build/src/frontend-models/websocket-channel.d.ts +0 -12
  92. package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
  93. package/build/src/frontend-models/websocket-channel.js +13 -13
  94. package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
  95. package/build/src/http-server/client/websocket-session.js +5 -5
  96. package/build/src/http-server/client-delivery-queue.d.ts +7 -7
  97. package/build/src/http-server/client-delivery-queue.d.ts.map +1 -1
  98. package/build/src/http-server/client-delivery-queue.js +8 -8
  99. package/build/src/http-server/websocket-event-log-store.d.ts +0 -14
  100. package/build/src/http-server/websocket-event-log-store.d.ts.map +1 -1
  101. package/build/src/http-server/websocket-event-log-store.js +5 -5
  102. package/build/src/plugins/sqljs-wasm-route.d.ts.map +1 -1
  103. package/build/src/plugins/sqljs-wasm-route.js +4 -4
  104. package/build/src/sync/conflict-strategy.d.ts +0 -15
  105. package/build/src/sync/conflict-strategy.d.ts.map +1 -1
  106. package/build/src/sync/conflict-strategy.js +3 -3
  107. package/build/src/sync/device-identity.d.ts +0 -45
  108. package/build/src/sync/device-identity.d.ts.map +1 -1
  109. package/build/src/sync/device-identity.js +4 -4
  110. package/build/src/sync/local-mutation-log.d.ts +0 -41
  111. package/build/src/sync/local-mutation-log.d.ts.map +1 -1
  112. package/build/src/sync/local-mutation-log.js +9 -9
  113. package/build/src/sync/offline-grant.d.ts +0 -26
  114. package/build/src/sync/offline-grant.d.ts.map +1 -1
  115. package/build/src/sync/offline-grant.js +4 -4
  116. package/build/src/sync/peer-mutation-bundle.d.ts +0 -14
  117. package/build/src/sync/peer-mutation-bundle.d.ts.map +1 -1
  118. package/build/src/sync/peer-mutation-bundle.js +3 -3
  119. package/build/src/sync/server-change-feed.d.ts.map +1 -1
  120. package/build/src/sync/server-change-feed.js +33 -33
  121. package/build/src/sync/sync-api-client.d.ts +0 -9
  122. package/build/src/sync/sync-api-client.d.ts.map +1 -1
  123. package/build/src/sync/sync-api-client.js +2 -2
  124. package/build/src/sync/sync-envelope-replay-service.d.ts +38 -21
  125. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  126. package/build/src/sync/sync-envelope-replay-service.js +18 -18
  127. package/build/src/sync/sync-resource-base.d.ts +0 -7
  128. package/build/src/sync/sync-resource-base.d.ts.map +1 -1
  129. package/build/src/sync/sync-resource-base.js +2 -2
  130. package/build/src/sync/sync-scope-store.d.ts +0 -9
  131. package/build/src/sync/sync-scope-store.d.ts.map +1 -1
  132. package/build/src/sync/sync-scope-store.js +10 -10
  133. package/build/src/testing/test-filter-parser.d.ts +0 -10
  134. package/build/src/testing/test-filter-parser.d.ts.map +1 -1
  135. package/build/src/testing/test-filter-parser.js +11 -11
  136. package/build/src/testing/test-runner.d.ts +25 -91
  137. package/build/src/testing/test-runner.d.ts.map +1 -1
  138. package/build/src/testing/test-runner.js +113 -98
  139. package/build/src/testing/test.d.ts +8 -0
  140. package/build/src/testing/test.d.ts.map +1 -1
  141. package/build/src/testing/test.js +9 -9
  142. package/build/src/utils/backtrace-cleaner.d.ts.map +1 -1
  143. package/build/src/utils/backtrace-cleaner.js +9 -9
  144. package/build/src/utils/model-scope.d.ts +0 -8
  145. package/build/src/utils/model-scope.d.ts.map +1 -1
  146. package/build/src/utils/model-scope.js +3 -3
  147. package/build/src/utils/ransack.d.ts +52 -19
  148. package/build/src/utils/ransack.d.ts.map +1 -1
  149. package/build/src/utils/ransack.js +26 -26
  150. package/build/sync/conflict-strategy.js +3 -6
  151. package/build/sync/device-identity.js +4 -9
  152. package/build/sync/local-mutation-log.js +9 -14
  153. package/build/sync/offline-grant.js +4 -7
  154. package/build/sync/peer-mutation-bundle.js +2 -4
  155. package/build/sync/server-change-feed.js +32 -34
  156. package/build/sync/sync-api-client.js +1 -2
  157. package/build/sync/sync-envelope-replay-service.js +17 -19
  158. package/build/sync/sync-resource-base.js +1 -2
  159. package/build/sync/sync-scope-store.js +9 -10
  160. package/build/testing/test-filter-parser.js +10 -11
  161. package/build/testing/test-runner.js +116 -108
  162. package/build/testing/test.js +8 -9
  163. package/build/utils/backtrace-cleaner.js +8 -9
  164. package/build/utils/model-scope.js +3 -4
  165. package/build/utils/ransack.js +27 -34
  166. package/package.json +2 -1
  167. package/scripts/eslint-rules/typedefs-first.js +67 -0
  168. package/scripts/prewarm-chromedriver.js +26 -0
  169. package/src/background-jobs/cron-expression.js +12 -13
  170. package/src/background-jobs/main.js +6 -6
  171. package/src/background-jobs/runner-graceful-shutdown.js +2 -3
  172. package/src/background-jobs/scheduler.js +3 -3
  173. package/src/background-jobs/worker.js +8 -9
  174. package/src/beacon/client.js +3 -4
  175. package/src/database/drivers/sqlite/web-persistence.js +2 -5
  176. package/src/database/pool/async-tracked-multi-connection.js +65 -15
  177. package/src/database/pool/base.js +23 -7
  178. package/src/database/query/index.js +21 -22
  179. package/src/database/query/model-class-query.js +5 -6
  180. package/src/database/record/attachments/normalize-input.js +9 -10
  181. package/src/database/record/attachments/store.js +2 -2
  182. package/src/database/record/auditing.js +7 -8
  183. package/src/database/record/index.js +4 -5
  184. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +1 -2
  185. package/src/frontend-model-controller.js +49 -56
  186. package/src/frontend-models/base.js +17 -19
  187. package/src/frontend-models/outgoing-event-buffer.js +3 -4
  188. package/src/frontend-models/query.js +40 -44
  189. package/src/frontend-models/resource-definition.js +7 -8
  190. package/src/frontend-models/transport-serialization.js +10 -12
  191. package/src/frontend-models/websocket-channel.js +12 -13
  192. package/src/http-server/client/websocket-session.js +4 -5
  193. package/src/http-server/client-delivery-queue.js +7 -8
  194. package/src/http-server/websocket-event-log-store.js +4 -6
  195. package/src/plugins/sqljs-wasm-route.js +3 -5
  196. package/src/sync/conflict-strategy.js +3 -6
  197. package/src/sync/device-identity.js +4 -9
  198. package/src/sync/local-mutation-log.js +9 -14
  199. package/src/sync/offline-grant.js +4 -7
  200. package/src/sync/peer-mutation-bundle.js +2 -4
  201. package/src/sync/server-change-feed.js +32 -34
  202. package/src/sync/sync-api-client.js +1 -2
  203. package/src/sync/sync-envelope-replay-service.js +17 -19
  204. package/src/sync/sync-resource-base.js +1 -2
  205. package/src/sync/sync-scope-store.js +9 -10
  206. package/src/testing/test-filter-parser.js +10 -11
  207. package/src/testing/test-runner.js +116 -108
  208. package/src/testing/test.js +8 -9
  209. package/src/utils/backtrace-cleaner.js +8 -9
  210. package/src/utils/model-scope.js +3 -4
  211. package/src/utils/ransack.js +27 -34
@@ -1,6 +1,3 @@
1
- // @ts-check
2
- const ECDSA_P256_SHA256_ALGORITHM = "ECDSA-P256-SHA256";
3
- const ECDSA_P256_SHA256_SIGNATURE_PREFIX = "ecdsa-p256-sha256-";
4
1
  /**
5
2
  * JSON Web Key used by the sync signing helpers.
6
3
  * @typedef {import("node:crypto").webcrypto.JsonWebKey} SyncJsonWebKey
@@ -46,6 +43,9 @@ const ECDSA_P256_SHA256_SIGNATURE_PREFIX = "ecdsa-p256-sha256-";
46
43
  * @property {SyncMutation} mutation - Mutation payload.
47
44
  * @property {string} signature - Device signature over the mutation envelope.
48
45
  */
46
+ // @ts-check
47
+ const ECDSA_P256_SHA256_ALGORITHM = "ECDSA-P256-SHA256";
48
+ const ECDSA_P256_SHA256_SIGNATURE_PREFIX = "ecdsa-p256-sha256-";
49
49
  /**
50
50
  * Generates an ECDSA P-256 keypair exported as JWKs.
51
51
  * @returns {Promise<{privateKey: SyncJsonWebKey, publicKey: SyncJsonWebKey}>} - Exported keypair.
@@ -451,4 +451,4 @@ function deterministicJson({ label, value }) {
451
451
  }
452
452
  throw new Error(`Sync ${label} must be deterministic JSON`);
453
453
  }
454
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLWlkZW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvZGV2aWNlLWlkZW50aXR5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixNQUFNLDJCQUEyQixHQUFHLG1CQUFtQixDQUFBO0FBQ3ZELE1BQU0sa0NBQWtDLEdBQUcsb0JBQW9CLENBQUE7QUFFL0Q7OztHQUdHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsMEJBQTBCO0lBQzlDLE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBWSxFQUFFLENBQUMsV0FBVyxDQUM5QyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBQyxFQUNwQyxJQUFJLEVBQ0osQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQ25CLENBQUE7SUFFRCxPQUFPO1FBQ0wsVUFBVSxFQUFFLE1BQU0sWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3JFLFNBQVMsRUFBRSxNQUFNLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQztLQUNwRSxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCLENBQUMsRUFBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUM7SUFDNUUsTUFBTSxxQkFBcUIsR0FBRyxpQ0FBaUMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUU1RSxPQUFPO1FBQ0wsU0FBUyxFQUFFLDJCQUEyQjtRQUN0QyxXQUFXLEVBQUUscUJBQXFCO1FBQ2xDLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztZQUM5QixVQUFVLEVB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QU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUM1QyxNQUFNLFVBQVUsR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBRXRFLElBQUksVUFBVSxLQUFLLFNBQVM7Z0JBQUUsU0FBUTtZQUN0QyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsRUFBQyxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUE7UUFDcEYsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFBO0lBQ25CLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyw2QkFBNkIsQ0FBQyxDQUFBO0FBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuY29uc3QgRUNEU0FfUDI1Nl9TSEEyNTZfQUxHT1JJVEhNID0gXCJFQ0RTQS1QMjU2LVNIQTI1NlwiXG5jb25zdCBFQ0RTQV9QMjU2X1NIQTI1Nl9TSUdOQVRVUkVfUFJFRklYID0gXCJlY2RzYS1wMjU2LXNoYTI1Ni1cIlxuXG4vKipcbiAqIEpTT04gV2ViIEtleSB1c2VkIGJ5IHRoZSBzeW5jIHNpZ25pbmcgaGVscGVycy5cbiAqIEB0eXBlZGVmIHtpbXBvcnQoXCJub2RlOmNyeXB0b1wiKS53ZWJjcnlwdG8uSnNvbldlYktleX0gU3luY0pzb25XZWJLZXlcbiAqL1xuXG4vKipcbiAqIEJhY2tlbmQtc2lnbmVkIGRldmljZSBjZXJ0aWZpY2F0ZSBwYXlsb2FkLlxuICogQHR5cGVkZWYge29iamVjdH0gRGV2aWNlQ2VydGlmaWNhdGVQYXlsb2FkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0b3JEZXZpY2VJZCAtIERldmljZSBpZCBhbGxvd2VkIHRvIHNpZ24gbXV0YXRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdG9yVXNlcklkIC0gVXNlciBpZCByZXByZXNlbnRlZCBieSB0aGUgZGV2aWNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNlcnRpZmljYXRlSWQgLSBDZXJ0aWZpY2F0ZSBpZC5cbiAqIEBwcm9wZXJ0eSB7U3luY0pzb25XZWJLZXl9IGRldmljZVB1YmxpY0tleSAtIERldmljZSBwdWJsaWMga2V5IHBlZXJzL2JhY2tlbmRzIHVzZSB0byB2ZXJpZnkgbXV0YXRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4cGlyZXNBdCAtIElTTyB0aW1lc3RhbXAgYWZ0ZXIgd2hpY2ggdGhlIGNlcnRpZmljYXRlIGlzIGludmFsaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaXNzdWVkQXQgLSBJU08gdGltZXN0YW1wIHdoZW4gdGhlIGJhY2tlbmQgaXNzdWVkIHRoZSBjZXJ0aWZpY2F0ZS5cbiAqL1xuXG4vKipcbiAqIEJhY2tlbmQtc2lnbmVkIGRldmljZSBjZXJ0aWZpY2F0ZSBlbnZlbG9wZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERldmljZUNlcnRpZmljYXRlXG4gKiBAcHJvcGVydHkge1wiRUNEU0EtUDI1Ni1TSEEyNTZcIn0gYWxnb3JpdGhtIC0gU2lnbmF0dXJlIGFsZ29yaXRobS5cbiAqIEBwcm9wZXJ0eSB7RGV2aWNlQ2VydGlmaWNhdGVQYXlsb2FkfSBjZXJ0aWZpY2F0ZSAtIENlcnRpZmljYXRlIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2lnbmF0dXJlIC0gQmFja2VuZCBzaWduYXR1cmUgb3ZlciB0aGUgY2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqL1xuXG4vKipcbiAqIFN5bmMgbXV0YXRpb24gcGF5bG9hZCBzaWduZWQgYnkgYSBkZXZpY2UuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jTXV0YXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3RvckRldmljZUlkIC0gRGV2aWNlIHRoYXQgc2lnbmVkIHRoZSBtdXRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3RvclVzZXJJZCAtIFVzZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHNpZ25pbmcgZGV2aWNlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gW2F0dHJpYnV0ZXNdIC0gTW9kZWwgYXR0cmlidXRlcyBmb3IgQ1JVRCBtdXRhdGlvbnMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bWJlciB8IG51bGx9IFtiYXNlVmVyc2lvbl0gLSBCYXNlIHNlcnZlci9jbGllbnQgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjbGllbnRNdXRhdGlvbklkIC0gRGV2aWNlLWxvY2FsIGlkZW1wb3RlbmN5IGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb21tYW5kXSAtIERvbWFpbiBjb21tYW5kIG5hbWUgZm9yIGNvbW1hbmQgbXV0YXRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZGVsIC0gU3luYyBtb2RlbC9yZXNvdXJjZSBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9jY3VycmVkQXQgLSBJU08gdGltZXN0YW1wIHdoZW4gdGhlIG11dGF0aW9uIG9jY3VycmVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9mZmxpbmVHcmFudElkIC0gT2ZmbGluZSBncmFudCBpZCBhdXRob3JpemluZyB0aGUgbXV0YXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uIC0gQ1JVRCBvcGVyYXRpb24gb3IgY29tbWFuZCBvcGVyYXRpb24uXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSBbcGF5bG9hZF0gLSBEb21haW4gY29tbWFuZCBwYXlsb2FkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBvbGljeUhhc2ggLSBTeW5jIHBvbGljeSBoYXNoIHRoZSBtdXRhdGlvbiB3YXMgY2hlY2tlZCBhZ2FpbnN0LlxuICovXG5cbi8qKlxuICogRGV2aWNlLXNpZ25lZCBtdXRhdGlvbiBlbnZlbG9wZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNpZ25lZFN5bmNNdXRhdGlvblxuICogQHByb3BlcnR5IHtcIkVDRFNBLVAyNTYtU0hBMjU2XCJ9IGFsZ29yaXRobSAtIFNpZ25hdHVyZSBhbGdvcml0aG0uXG4gKiBAcHJvcGVydHkge0RldmljZUNlcnRpZmljYXRlfSBkZXZpY2VDZXJ0aWZpY2F0ZSAtIEJhY2tlbmQtc2lnbmVkIGRldmljZSBjZXJ0aWZpY2F0ZS5cbiAqIEBwcm9wZXJ0eSB7U3luY011dGF0aW9ufSBtdXRhdGlvbiAtIE11dGF0aW9uIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2lnbmF0dXJlIC0gRGV2aWNlIHNpZ25hdHVyZSBvdmVyIHRoZSBtdXRhdGlvbiBlbnZlbG9wZS5cbiAqL1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhbiBFQ0RTQSBQLTI1NiBrZXlwYWlyIGV4cG9ydGVkIGFzIEpXS3MuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7cHJpdmF0ZUtleTogU3luY0pzb25XZWJLZXksIHB1YmxpY0tleTogU3luY0pzb25XZWJLZXl9Pn0gLSBFeHBvcnRlZCBrZXlwYWlyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTeW5jU2lnbmluZ0tleVBhaXIoKSB7XG4gIGNvbnN0IGtleVBhaXIgPSBhd2FpdCBjcnlwdG9TdWJ0bGUoKS5nZW5lcmF0ZUtleShcbiAgICB7bmFtZTogXCJFQ0RTQVwiLCBuYW1lZEN1cnZlOiBcIlAtMjU2XCJ9LFxuICAgIHRydWUsXG4gICAgW1wic2lnblwiLCBcInZlcmlmeVwiXVxuICApXG5cbiAgcmV0dXJuIHtcbiAgICBwcml2YXRlS2V5OiBhd2FpdCBjcnlwdG9TdWJ0bGUoKS5leHBvcnRLZXkoXCJqd2tcIiwga2V5UGFpci5wcml2YXRlS2V5KSxcbiAgICBwdWJsaWNLZXk6IGF3YWl0IGNyeXB0b1N1YnRsZSgpLmV4cG9ydEtleShcImp3a1wiLCBrZXlQYWlyLnB1YmxpY0tleSlcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBiYWNrZW5kLXNpZ25lZCBkZXZpY2UgY2VydGlmaWNhdGUuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7U3luY0pzb25XZWJLZXl9IGFyZ3MuYmFja2VuZFByaXZhdGVLZXkgLSBCYWNrZW5kIHByaXZhdGUgc2lnbmluZyBrZXkuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlUGF5bG9hZH0gYXJncy5jZXJ0aWZpY2F0ZSAtIENlcnRpZmljYXRlIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxEZXZpY2VDZXJ0aWZpY2F0ZT59IC0gU2lnbmVkIGNlcnRpZmljYXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRGV2aWNlQ2VydGlmaWNhdGUoe2JhY2tlbmRQcml2YXRlS2V5LCBjZXJ0aWZpY2F0ZX0pIHtcbiAgY29uc3Qgbm9ybWFsaXplZENlcnRpZmljYXRlID0gbm9ybWFsaXplRGV2aWNlQ2VydGlmaWNhdGVQYXlsb2FkKGNlcnRpZmljYXRlKVxuXG4gIHJldHVybiB7XG4gICAgYWxnb3JpdGhtOiBFQ0RTQV9QMjU2X1NIQTI1Nl9BTEdPUklUSE0sXG4gICAgY2VydGlmaWNhdGU6IG5vcm1hbGl6ZWRDZXJ0aWZpY2F0ZSxcbiAgICBzaWduYXR1cmU6IGF3YWl0IHNpZ25TdGFibGVKc29uKHtcbiAgICAgIHByaXZhdGVLZXk6IGJhY2tlbmRQcml2YXRlS2V5LFxuICAgICAgdmFsdWU6IGRldmljZUNlcnRpZmljYXRlU2lnbmF0dXJlVmFsdWUobm9ybWFsaXplZENlcnRpZmljYXRlKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZmllcyBhIGJhY2tlbmQtc2lnbmVkIGRldmljZSBjZXJ0aWZpY2F0ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0gYXJncy5iYWNrZW5kUHVibGljS2V5IC0gQmFja2VuZCBwdWJsaWMga2V5LlxuICogQHBhcmFtIHtEZXZpY2VDZXJ0aWZpY2F0ZX0gYXJncy5jZXJ0aWZpY2F0ZSAtIFNpZ25lZCBjZXJ0aWZpY2F0ZS5cbiAqIEBwYXJhbSB7RGF0ZX0gW2FyZ3Mubm93XSAtIFZlcmlmaWNhdGlvbiB0aW1lLiBEZWZhdWx0cyB0byBjdXJyZW50IHRpbWUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWQ+fSAtIFZlcmlmaWVkIGNlcnRpZmljYXRlIHBheWxvYWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlEZXZpY2VDZXJ0aWZpY2F0ZSh7YmFja2VuZFB1YmxpY0tleSwgY2VydGlmaWNhdGUsIG5vdyA9IG5ldyBEYXRlKCl9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDZXJ0aWZpY2F0ZSA9IG5vcm1hbGl6ZURldmljZUNlcnRpZmljYXRlKGNlcnRpZmljYXRlKVxuICBjb25zdCB2ZXJpZmllZCA9IGF3YWl0IHZlcmlmeVN0YWJsZUpzb25TaWduYXR1cmUoe1xuICAgIHB1YmxpY0tleTogYmFja2VuZFB1YmxpY0tleSxcbiAgICBzaWduYXR1cmU6IG5vcm1hbGl6ZWRDZXJ0aWZpY2F0ZS5zaWduYXR1cmUsXG4gICAgdmFsdWU6IGRldmljZUNlcnRpZmljYXRlU2lnbmF0dXJlVmFsdWUobm9ybWFsaXplZENlcnRpZmljYXRlLmNlcnRpZmljYXRlKVxuICB9KVxuXG4gIGlmICghdmVyaWZpZWQpIHRocm93IG5ldyBFcnJvcihcIkRldmljZSBjZXJ0aWZpY2F0ZSBzaWduYXR1cmUgZGlkIG5vdCBtYXRjaFwiKVxuICBhc3NlcnROb3RFeHBpcmVkKHtleHBpcmVzQXQ6IG5vcm1hbGl6ZWRDZXJ0aWZpY2F0ZS5jZXJ0aWZpY2F0ZS5leHBpcmVzQXQsIGxhYmVsOiBcIkRldmljZSBjZXJ0aWZpY2F0ZVwiLCBub3d9KVxuXG4gIHJldHVybiBub3JtYWxpemVkQ2VydGlmaWNhdGUuY2VydGlmaWNhdGVcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGV2aWNlLXNpZ25lZCBtdXRhdGlvbiBlbnZlbG9wZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtEZXZpY2VDZXJ0aWZpY2F0ZX0gYXJncy5kZXZpY2VDZXJ0aWZpY2F0ZSAtIEJhY2tlbmQtc2lnbmVkIGRldmljZSBjZXJ0aWZpY2F0ZS5cbiAqIEBwYXJhbSB7U3luY0pzb25XZWJLZXl9IGFyZ3MuZGV2aWNlUHJpdmF0ZUtleSAtIERldmljZSBwcml2YXRlIHNpZ25pbmcga2V5LlxuICogQHBhcmFtIHtTeW5jTXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBNdXRhdGlvbiBwYXlsb2FkLlxuICogQHJldHVybnMge1Byb21pc2U8U2lnbmVkU3luY011dGF0aW9uPn0gLSBTaWduZWQgbXV0YXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTaWduZWRNdXRhdGlvbih7ZGV2aWNlQ2VydGlmaWNhdGUsIGRldmljZVByaXZhdGVLZXksIG11dGF0aW9ufSkge1xuICBjb25zdCBub3JtYWxpemVkRGV2aWNlQ2VydGlmaWNhdGUgPSBub3JtYWxpemVEZXZpY2VDZXJ0aWZpY2F0ZShkZXZpY2VDZXJ0aWZpY2F0ZSlcbiAgY29uc3Qgbm9ybWFsaXplZE11dGF0aW9uID0gbm9ybWFsaXplU3luY011dGF0aW9uKG11dGF0aW9uKVxuXG4gIGFzc2VydE11dGF0aW9uTWF0Y2hlc0NlcnRpZmljYXRlKHtjZXJ0aWZpY2F0ZTogbm9ybWFsaXplZERldmljZUNlcnRpZmljYXRlLmNlcnRpZmljYXRlLCBtdXRhdGlvbjogbm9ybWFsaXplZE11dGF0aW9ufSlcblxuICByZXR1cm4ge1xuICAgIGFsZ29yaXRobTogRUNEU0FfUDI1Nl9TSEEyNTZfQUxHT1JJVEhNLFxuICAgIGRldmljZUNlcnRpZmljYXRlOiBub3JtYWxpemVkRGV2aWNlQ2VydGlmaWNhdGUsXG4gICAgbXV0YXRpb246IG5vcm1hbGl6ZWRNdXRhdGlvbixcbiAgICBzaWduYXR1cmU6IGF3YWl0IHNpZ25TdGFibGVKc29uKHtcbiAgICAgIHByaXZhdGVLZXk6IGRldmljZVByaXZhdGVLZXksXG4gICAgICB2YWx1ZTogc2lnbmVkTXV0YXRpb25TaWduYXR1cmVWYWx1ZSh7XG4gICAgICAgIGRldmljZUNlcnRpZmljYXRlOiBub3JtYWxpemVkRGV2aWNlQ2VydGlmaWNhdGUsXG4gICAgICAgIG11dGF0aW9uOiBub3JtYWxpemVkTXV0YXRpb25cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmaWVzIGEgc2lnbmVkIHN5bmMgbXV0YXRpb24gYW5kIGl0cyBkZXZpY2UgY2VydGlmaWNhdGUuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7U3luY0pzb25XZWJLZXl9IGFyZ3MuYmFja2VuZFB1YmxpY0tleSAtIEJhY2tlbmQgcHVibGljIGtleSB1c2VkIHRvIHZlcmlmeSB0aGUgZGV2aWNlIGNlcnRpZmljYXRlLlxuICogQHBhcmFtIHtEYXRlfSBbYXJncy5ub3ddIC0gVmVyaWZpY2F0aW9uIHRpbWUuIERlZmF1bHRzIHRvIGN1cnJlbnQgdGltZS5cbiAqIEBwYXJhbSB7U2lnbmVkU3luY011dGF0aW9ufSBhcmdzLnNpZ25lZE11dGF0aW9uIC0gU2lnbmVkIG11dGF0aW9uIGVudmVsb3BlLlxuICogQHJldHVybnMge1Byb21pc2U8U3luY011dGF0aW9uPn0gLSBWZXJpZmllZCBtdXRhdGlvbiBwYXlsb2FkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5U2lnbmVkTXV0YXRpb24oe2JhY2tlbmRQdWJsaWNLZXksIG5vdyA9IG5ldyBEYXRlKCksIHNpZ25lZE11dGF0aW9ufSkge1xuICBjb25zdCBub3JtYWxpemVkU2lnbmVkTXV0YXRpb24gPSBub3JtYWxpemVTaWduZWRTeW5jTXV0YXRpb24oc2lnbmVkTXV0YXRpb24pXG4gIGNvbnN0IGNlcnRpZmljYXRlUGF5bG9hZCA9IGF3YWl0IHZlcmlmeURldmljZUNlcnRpZmljYXRlKHtcbiAgICBiYWNrZW5kUHVibGljS2V5LFxuICAgIGNlcnRpZmljYXRlOiBub3JtYWxpemVkU2lnbmVkTXV0YXRpb24uZGV2aWNlQ2VydGlmaWNhdGUsXG4gICAgbm93XG4gIH0pXG5cbiAgYXNzZXJ0TXV0YXRpb25NYXRjaGVzQ2VydGlmaWNhdGUoe2NlcnRpZmljYXRlOiBjZXJ0aWZpY2F0ZVBheWxvYWQsIG11dGF0aW9uOiBub3JtYWxpemVkU2lnbmVkTXV0YXRpb24ubXV0YXRpb259KVxuXG4gIGNvbnN0IHZlcmlmaWVkID0gYXdhaXQgdmVyaWZ5U3RhYmxlSnNvblNpZ25hdHVyZSh7XG4gICAgcHVibGljS2V5OiBjZXJ0aWZpY2F0ZVBheWxvYWQuZGV2aWNlUHVibGljS2V5LFxuICAgIHNpZ25hdHVyZTogbm9ybWFsaXplZFNpZ25lZE11dGF0aW9uLnNpZ25hdHVyZSxcbiAgICB2YWx1ZTogc2lnbmVkTXV0YXRpb25TaWduYXR1cmVWYWx1ZSh7XG4gICAgICBkZXZpY2VDZXJ0aWZpY2F0ZTogbm9ybWFsaXplZFNpZ25lZE11dGF0aW9uLmRldmljZUNlcnRpZmljYXRlLFxuICAgICAgbXV0YXRpb246IG5vcm1hbGl6ZWRTaWduZWRNdXRhdGlvbi5tdXRhdGlvblxuICAgIH0pXG4gIH0pXG5cbiAgaWYgKCF2ZXJpZmllZCkgdGhyb3cgbmV3IEVycm9yKFwiU3luYyBtdXRhdGlvbiBzaWduYXR1cmUgZGlkIG5vdCBtYXRjaFwiKVxuXG4gIHJldHVybiBub3JtYWxpemVkU2lnbmVkTXV0YXRpb24ubXV0YXRpb25cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZXBsYXkvaWRlbXBvdGVuY3kga2V5IGZvciBhIHNpZ25lZCBtdXRhdGlvbi5cbiAqIEBwYXJhbSB7e211dGF0aW9uOiB7YWN0b3JEZXZpY2VJZD86IHVua25vd24sIGFjdG9yVXNlcklkPzogdW5rbm93biwgY2xpZW50TXV0YXRpb25JZD86IHVua25vd259fX0gc2lnbmVkTXV0YXRpb24gLSBTaWduZWQgbXV0YXRpb24tbGlrZSBvYmplY3QuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIElkZW1wb3RlbmN5IGtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11dGF0aW9uSWRlbXBvdGVuY3lLZXkoc2lnbmVkTXV0YXRpb24pIHtcbiAgY29uc3QgbXV0YXRpb24gPSBzaWduZWRNdXRhdGlvbi5tdXRhdGlvblxuXG4gIHJldHVybiBbXG4gICAgcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uYWN0b3JVc2VySWQsIFwiYWN0b3JVc2VySWRcIiksXG4gICAgcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uYWN0b3JEZXZpY2VJZCwgXCJhY3RvckRldmljZUlkXCIpLFxuICAgIHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsIFwiY2xpZW50TXV0YXRpb25JZFwiKVxuICBdLmpvaW4oXCI6XCIpXG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBzdGFibGUgdmFsdWUgc2lnbmVkIGJ5IGJhY2tlbmQgZGV2aWNlIGNlcnRpZmljYXRlcy5cbiAqIEBwYXJhbSB7RGV2aWNlQ2VydGlmaWNhdGVQYXlsb2FkfSBjZXJ0aWZpY2F0ZSAtIENlcnRpZmljYXRlIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IC0gU3RhYmxlIHNpZ25hdHVyZSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZGV2aWNlQ2VydGlmaWNhdGVTaWduYXR1cmVWYWx1ZShjZXJ0aWZpY2F0ZSkge1xuICByZXR1cm4ge1xuICAgIGFsZ29yaXRobTogRUNEU0FfUDI1Nl9TSEEyNTZfQUxHT1JJVEhNLFxuICAgIGNlcnRpZmljYXRlOiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAqLyAoZGV0ZXJtaW5pc3RpY0pzb25PYmplY3Qoe2xhYmVsOiBcImNlcnRpZmljYXRlXCIsIHZhbHVlOiBjZXJ0aWZpY2F0ZX0pKVxuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBzdGFibGUgdmFsdWUgc2lnbmVkIGJ5IHN5bmMgbXV0YXRpb25zLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlfSBhcmdzLmRldmljZUNlcnRpZmljYXRlIC0gRGV2aWNlIGNlcnRpZmljYXRlLlxuICogQHBhcmFtIHtTeW5jTXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBNdXRhdGlvbiBwYXlsb2FkLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAtIFN0YWJsZSBzaWduYXR1cmUgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHNpZ25lZE11dGF0aW9uU2lnbmF0dXJlVmFsdWUoe2RldmljZUNlcnRpZmljYXRlLCBtdXRhdGlvbn0pIHtcbiAgcmV0dXJuIHtcbiAgICBhbGdvcml0aG06IEVDRFNBX1AyNTZfU0hBMjU2X0FMR09SSVRITSxcbiAgICBkZXZpY2VDZXJ0aWZpY2F0ZTogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gKi8gKGRldGVybWluaXN0aWNKc29uT2JqZWN0KHtsYWJlbDogXCJkZXZpY2VDZXJ0aWZpY2F0ZVwiLCB2YWx1ZTogZGV2aWNlQ2VydGlmaWNhdGV9KSksXG4gICAgbXV0YXRpb246IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59ICovIChkZXRlcm1pbmlzdGljSnNvbk9iamVjdCh7bGFiZWw6IFwibXV0YXRpb25cIiwgdmFsdWU6IG11dGF0aW9ufSkpXG4gIH1cbn1cblxuLyoqXG4gKiBTaWducyBhIGRldGVybWluaXN0aWMgSlNPTiB2YWx1ZSB3aXRoIEVDRFNBIFAtMjU2L1NIQS0yNTYuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7U3luY0pzb25XZWJLZXl9IGFyZ3MucHJpdmF0ZUtleSAtIFByaXZhdGUgSldLLlxuICogQHBhcmFtIHt1bmtub3dufSBhcmdzLnZhbHVlIC0gVmFsdWUgdG8gc2lnbi5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gUHJlZml4ZWQgYmFzZTY0dXJsIHNpZ25hdHVyZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2lnblN0YWJsZUpzb24oe3ByaXZhdGVLZXksIHZhbHVlfSkge1xuICBjb25zdCBrZXkgPSBhd2FpdCBjcnlwdG9TdWJ0bGUoKS5pbXBvcnRLZXkoXCJqd2tcIiwgcHJpdmF0ZUtleSwge25hbWU6IFwiRUNEU0FcIiwgbmFtZWRDdXJ2ZTogXCJQLTI1NlwifSwgZmFsc2UsIFtcInNpZ25cIl0pXG4gIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IGNyeXB0b1N1YnRsZSgpLnNpZ24oe2hhc2g6IFwiU0hBLTI1NlwiLCBuYW1lOiBcIkVDRFNBXCJ9LCBrZXksIC8qKiBAdHlwZSB7VWludDhBcnJheTxBcnJheUJ1ZmZlcj59ICovICh1dGY4KHN0YWJsZUpzb25TdHJpbmdpZnkodmFsdWUpKSkpXG5cbiAgcmV0dXJuIGAke0VDRFNBX1AyNTZfU0hBMjU2X1NJR05BVFVSRV9QUkVGSVh9JHtiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlKSl9YFxufVxuXG4vKipcbiAqIFZlcmlmaWVzIGEgZGV0ZXJtaW5pc3RpYyBKU09OIHZhbHVlIHdpdGggRUNEU0EgUC0yNTYvU0hBLTI1Ni5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0gYXJncy5wdWJsaWNLZXkgLSBQdWJsaWMgSldLLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc2lnbmF0dXJlIC0gUHJlZml4ZWQgYmFzZTY0dXJsIHNpZ25hdHVyZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJncy52YWx1ZSAtIFZhbHVlIHRvIHZlcmlmeS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgdGhlIHNpZ25hdHVyZSBtYXRjaGVzLlxuICovXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlTdGFibGVKc29uU2lnbmF0dXJlKHtwdWJsaWNLZXksIHNpZ25hdHVyZSwgdmFsdWV9KSB7XG4gIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0b1N1YnRsZSgpLmltcG9ydEtleShcImp3a1wiLCBwdWJsaWNLZXksIHtuYW1lOiBcIkVDRFNBXCIsIG5hbWVkQ3VydmU6IFwiUC0yNTZcIn0sIGZhbHNlLCBbXCJ2ZXJpZnlcIl0pXG4gIGNvbnN0IHNpZ25hdHVyZUJ5dGVzID0gYmFzZTY0VXJsRGVjb2RlKHNpZ25hdHVyZVdpdGhvdXRQcmVmaXgoc2lnbmF0dXJlKSlcblxuICByZXR1cm4gYXdhaXQgY3J5cHRvU3VidGxlKCkudmVyaWZ5KHtoYXNoOiBcIlNIQS0yNTZcIiwgbmFtZTogXCJFQ0RTQVwifSwga2V5LCAvKiogQHR5cGUge1VpbnQ4QXJyYXk8QXJyYXlCdWZmZXI+fSAqLyAoc2lnbmF0dXJlQnl0ZXMpLCAvKiogQHR5cGUge1VpbnQ4QXJyYXk8QXJyYXlCdWZmZXI+fSAqLyAodXRmOChzdGFibGVKc29uU3RyaW5naWZ5KHZhbHVlKSkpKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBzaWduZWQgZGV2aWNlIGNlcnRpZmljYXRlIGVudmVsb3BlLlxuICogQHBhcmFtIHtEZXZpY2VDZXJ0aWZpY2F0ZX0gY2VydGlmaWNhdGUgLSBTaWduZWQgY2VydGlmaWNhdGUuXG4gKiBAcmV0dXJucyB7RGV2aWNlQ2VydGlmaWNhdGV9IC0gTm9ybWFsaXplZCBjZXJ0aWZpY2F0ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRGV2aWNlQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpIHtcbiAgaWYgKCFjZXJ0aWZpY2F0ZSB8fCB0eXBlb2YgY2VydGlmaWNhdGUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShjZXJ0aWZpY2F0ZSkpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGRldmljZSBjZXJ0aWZpY2F0ZSBvYmplY3RcIilcbiAgaWYgKGNlcnRpZmljYXRlLmFsZ29yaXRobSAhPT0gRUNEU0FfUDI1Nl9TSEEyNTZfQUxHT1JJVEhNKSB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRldmljZSBjZXJ0aWZpY2F0ZSBhbGdvcml0aG0gJyR7U3RyaW5nKGNlcnRpZmljYXRlLmFsZ29yaXRobSl9J2ApXG5cbiAgcmV0dXJuIHtcbiAgICBhbGdvcml0aG06IGNlcnRpZmljYXRlLmFsZ29yaXRobSxcbiAgICBjZXJ0aWZpY2F0ZTogbm9ybWFsaXplRGV2aWNlQ2VydGlmaWNhdGVQYXlsb2FkKGNlcnRpZmljYXRlLmNlcnRpZmljYXRlKSxcbiAgICBzaWduYXR1cmU6IG5vcm1hbGl6ZVNpZ25hdHVyZShjZXJ0aWZpY2F0ZS5zaWduYXR1cmUsIFwiZGV2aWNlIGNlcnRpZmljYXRlIHNpZ25hdHVyZVwiKVxuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIGRldmljZSBjZXJ0aWZpY2F0ZSBwYXlsb2FkLlxuICogQHBhcmFtIHtEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWR9IGNlcnRpZmljYXRlIC0gQ2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWR9IC0gTm9ybWFsaXplZCBjZXJ0aWZpY2F0ZSBwYXlsb2FkLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWQoY2VydGlmaWNhdGUpIHtcbiAgaWYgKCFjZXJ0aWZpY2F0ZSB8fCB0eXBlb2YgY2VydGlmaWNhdGUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShjZXJ0aWZpY2F0ZSkpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGRldmljZSBjZXJ0aWZpY2F0ZSBwYXlsb2FkIG9iamVjdFwiKVxuXG4gIHJldHVybiB7XG4gICAgYWN0b3JEZXZpY2VJZDogcmVxdWlyZWRTdHJpbmcoY2VydGlmaWNhdGUuYWN0b3JEZXZpY2VJZCwgXCJhY3RvckRldmljZUlkXCIpLFxuICAgIGFjdG9yVXNlcklkOiByZXF1aXJlZFN0cmluZyhjZXJ0aWZpY2F0ZS5hY3RvclVzZXJJZCwgXCJhY3RvclVzZXJJZFwiKSxcbiAgICBjZXJ0aWZpY2F0ZUlkOiByZXF1aXJlZFN0cmluZyhjZXJ0aWZpY2F0ZS5jZXJ0aWZpY2F0ZUlkLCBcImNlcnRpZmljYXRlSWRcIiksXG4gICAgZGV2aWNlUHVibGljS2V5OiBub3JtYWxpemVKd2soY2VydGlmaWNhdGUuZGV2aWNlUHVibGljS2V5LCBcImRldmljZVB1YmxpY0tleVwiKSxcbiAgICBleHBpcmVzQXQ6IGlzb0RhdGVTdHJpbmcobmV3IERhdGUocmVxdWlyZWRTdHJpbmcoY2VydGlmaWNhdGUuZXhwaXJlc0F0LCBcImV4cGlyZXNBdFwiKSksIFwiZXhwaXJlc0F0XCIpLFxuICAgIGlzc3VlZEF0OiBpc29EYXRlU3RyaW5nKG5ldyBEYXRlKHJlcXVpcmVkU3RyaW5nKGNlcnRpZmljYXRlLmlzc3VlZEF0LCBcImlzc3VlZEF0XCIpKSwgXCJpc3N1ZWRBdFwiKVxuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHNpZ25lZCBzeW5jIG11dGF0aW9uIGVudmVsb3BlLlxuICogQHBhcmFtIHtTaWduZWRTeW5jTXV0YXRpb259IHNpZ25lZE11dGF0aW9uIC0gU2lnbmVkIG11dGF0aW9uLlxuICogQHJldHVybnMge1NpZ25lZFN5bmNNdXRhdGlvbn0gLSBOb3JtYWxpemVkIHNpZ25lZCBtdXRhdGlvbi5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2lnbmVkU3luY011dGF0aW9uKHNpZ25lZE11dGF0aW9uKSB7XG4gIGlmICghc2lnbmVkTXV0YXRpb24gfHwgdHlwZW9mIHNpZ25lZE11dGF0aW9uICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoc2lnbmVkTXV0YXRpb24pKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBzaWduZWQgc3luYyBtdXRhdGlvbiBvYmplY3RcIilcbiAgaWYgKHNpZ25lZE11dGF0aW9uLmFsZ29yaXRobSAhPT0gRUNEU0FfUDI1Nl9TSEEyNTZfQUxHT1JJVEhNKSB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHN5bmMgbXV0YXRpb24gYWxnb3JpdGhtICcke1N0cmluZyhzaWduZWRNdXRhdGlvbi5hbGdvcml0aG0pfSdgKVxuXG4gIHJldHVybiB7XG4gICAgYWxnb3JpdGhtOiBzaWduZWRNdXRhdGlvbi5hbGdvcml0aG0sXG4gICAgZGV2aWNlQ2VydGlmaWNhdGU6IG5vcm1hbGl6ZURldmljZUNlcnRpZmljYXRlKHNpZ25lZE11dGF0aW9uLmRldmljZUNlcnRpZmljYXRlKSxcbiAgICBtdXRhdGlvbjogbm9ybWFsaXplU3luY011dGF0aW9uKHNpZ25lZE11dGF0aW9uLm11dGF0aW9uKSxcbiAgICBzaWduYXR1cmU6IG5vcm1hbGl6ZVNpZ25hdHVyZShzaWduZWRNdXRhdGlvbi5zaWduYXR1cmUsIFwic3luYyBtdXRhdGlvbiBzaWduYXR1cmVcIilcbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBzeW5jIG11dGF0aW9uIHBheWxvYWQuXG4gKiBAcGFyYW0ge1N5bmNNdXRhdGlvbn0gbXV0YXRpb24gLSBNdXRhdGlvbiBwYXlsb2FkLlxuICogQHJldHVybnMge1N5bmNNdXRhdGlvbn0gLSBOb3JtYWxpemVkIG11dGF0aW9uIHBheWxvYWQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN5bmNNdXRhdGlvbihtdXRhdGlvbikge1xuICBpZiAoIW11dGF0aW9uIHx8IHR5cGVvZiBtdXRhdGlvbiAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG11dGF0aW9uKSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgc3luYyBtdXRhdGlvbiBvYmplY3RcIilcblxuICAvKiogQHR5cGUge1N5bmNNdXRhdGlvbn0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHtcbiAgICBhY3RvckRldmljZUlkOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5hY3RvckRldmljZUlkLCBcImFjdG9yRGV2aWNlSWRcIiksXG4gICAgYWN0b3JVc2VySWQ6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLmFjdG9yVXNlcklkLCBcImFjdG9yVXNlcklkXCIpLFxuICAgIGNsaWVudE11dGF0aW9uSWQ6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsIFwiY2xpZW50TXV0YXRpb25JZFwiKSxcbiAgICBtb2RlbDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24ubW9kZWwsIFwibW9kZWxcIiksXG4gICAgb2NjdXJyZWRBdDogaXNvRGF0ZVN0cmluZyhuZXcgRGF0ZShyZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5vY2N1cnJlZEF0LCBcIm9jY3VycmVkQXRcIikpLCBcIm9jY3VycmVkQXRcIiksXG4gICAgb2ZmbGluZUdyYW50SWQ6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLm9mZmxpbmVHcmFudElkLCBcIm9mZmxpbmVHcmFudElkXCIpLFxuICAgIG9wZXJhdGlvbjogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24ub3BlcmF0aW9uLCBcIm9wZXJhdGlvblwiKSxcbiAgICBwb2xpY3lIYXNoOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5wb2xpY3lIYXNoLCBcInBvbGljeUhhc2hcIilcbiAgfVxuXG4gIGlmIChtdXRhdGlvbi5hdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQuYXR0cmlidXRlcyA9IGRldGVybWluaXN0aWNKc29uT2JqZWN0KHtsYWJlbDogXCJhdHRyaWJ1dGVzXCIsIHZhbHVlOiBtdXRhdGlvbi5hdHRyaWJ1dGVzfSlcbiAgaWYgKG11dGF0aW9uLmJhc2VWZXJzaW9uICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQuYmFzZVZlcnNpb24gPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlciB8IG51bGx9ICovIChkZXRlcm1pbmlzdGljSnNvbih7bGFiZWw6IFwiYmFzZVZlcnNpb25cIiwgdmFsdWU6IG11dGF0aW9uLmJhc2VWZXJzaW9ufSkpXG4gIGlmIChtdXRhdGlvbi5jb21tYW5kICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQuY29tbWFuZCA9IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLmNvbW1hbmQsIFwiY29tbWFuZFwiKVxuICBpZiAobXV0YXRpb24ucGF5bG9hZCAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLnBheWxvYWQgPSBkZXRlcm1pbmlzdGljSnNvbk9iamVjdCh7bGFiZWw6IFwicGF5bG9hZFwiLCB2YWx1ZTogbXV0YXRpb24ucGF5bG9hZH0pXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRcbn1cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgbXV0YXRpb24gYWN0b3IgZmllbGRzIG1hdGNoIHRoZSBjZXJ0aWZpY2F0ZSBhY3Rvci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWR9IGFyZ3MuY2VydGlmaWNhdGUgLSBEZXZpY2UgY2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqIEBwYXJhbSB7U3luY011dGF0aW9ufSBhcmdzLm11dGF0aW9uIC0gTXV0YXRpb24gcGF5bG9hZC5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0TXV0YXRpb25NYXRjaGVzQ2VydGlmaWNhdGUoe2NlcnRpZmljYXRlLCBtdXRhdGlvbn0pIHtcbiAgaWYgKG11dGF0aW9uLmFjdG9yRGV2aWNlSWQgIT09IGNlcnRpZmljYXRlLmFjdG9yRGV2aWNlSWQgfHwgbXV0YXRpb24uYWN0b3JVc2VySWQgIT09IGNlcnRpZmljYXRlLmFjdG9yVXNlcklkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3luYyBtdXRhdGlvbiBhY3RvciBkb2VzIG5vdCBtYXRjaCBkZXZpY2UgY2VydGlmaWNhdGVcIilcbiAgfVxufVxuXG4vKipcbiAqIEFzc2VydHMgYSB0aW1lc3RhbXAgaXMgbm90IGV4cGlyZWQuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmV4cGlyZXNBdCAtIEV4cGlyeSB0aW1lc3RhbXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5sYWJlbCAtIEVycm9yIGxhYmVsLlxuICogQHBhcmFtIHtEYXRlfSBhcmdzLm5vdyAtIFZlcmlmaWNhdGlvbiB0aW1lLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBhc3NlcnROb3RFeHBpcmVkKHtleHBpcmVzQXQsIGxhYmVsLCBub3d9KSB7XG4gIGlmIChOdW1iZXIuaXNOYU4obm93LmdldFRpbWUoKSkpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc3luYyB2ZXJpZmljYXRpb24gdGltZVwiKVxuICBpZiAobmV3IERhdGUoZXhwaXJlc0F0KS5nZXRUaW1lKCkgPD0gbm93LmdldFRpbWUoKSkgdGhyb3cgbmV3IEVycm9yKGAke2xhYmVsfSBleHBpcmVkYClcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgSlNPTiBXZWIgS2V5IG9iamVjdC5cbiAqIEBwYXJhbSB7U3luY0pzb25XZWJLZXl9IGtleSAtIEpXSy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIEtleSBsYWJlbC5cbiAqIEByZXR1cm5zIHtTeW5jSnNvbldlYktleX0gLSBOb3JtYWxpemVkIEpXSy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplSndrKGtleSwgbGFiZWwpIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGRldGVybWluaXN0aWNKc29uT2JqZWN0KHtsYWJlbCwgdmFsdWU6IGtleX0pXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7U3luY0pzb25XZWJLZXl9ICovIChub3JtYWxpemVkKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBwcmVmaXhlZCBzaWduYXR1cmUgc3RyaW5nLlxuICogQHBhcmFtIHt1bmtub3dufSBzaWduYXR1cmUgLSBTaWduYXR1cmUgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBFcnJvciBsYWJlbC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU2lnbmF0dXJlIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2lnbmF0dXJlKHNpZ25hdHVyZSwgbGFiZWwpIHtcbiAgaWYgKHR5cGVvZiBzaWduYXR1cmUgIT09IFwic3RyaW5nXCIgfHwgIXNpZ25hdHVyZS5zdGFydHNXaXRoKEVDRFNBX1AyNTZfU0hBMjU2X1NJR05BVFVSRV9QUkVGSVgpKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7bGFiZWx9YClcblxuICByZXR1cm4gc2lnbmF0dXJlXG59XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgc2lnbmF0dXJlIHByZWZpeC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzaWduYXR1cmUgLSBQcmVmaXhlZCBzaWduYXR1cmUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEJhc2U2NHVybCBzaWduYXR1cmUgYm9keS5cbiAqL1xuZnVuY3Rpb24gc2lnbmF0dXJlV2l0aG91dFByZWZpeChzaWduYXR1cmUpIHtcbiAgcmV0dXJuIHNpZ25hdHVyZS5zbGljZShFQ0RTQV9QMjU2X1NIQTI1Nl9TSUdOQVRVUkVfUFJFRklYLmxlbmd0aClcbn1cblxuLyoqXG4gKiBSZXF1aXJlcyBhIG5vbi1lbXB0eSBzdHJpbmcgZmllbGQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gVmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIEZpZWxkIG5hbWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFN0cmluZyB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcmVxdWlyZWRTdHJpbmcodmFsdWUsIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiB8fCB2YWx1ZS5sZW5ndGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHN5bmMgJHtuYW1lfWApXG5cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIERhdGUgdG8gYW4gSVNPIHRpbWVzdGFtcC5cbiAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSAtIERhdGUgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBGaWVsZCBsYWJlbC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSVNPIHRpbWVzdGFtcC5cbiAqL1xuZnVuY3Rpb24gaXNvRGF0ZVN0cmluZyhkYXRlLCBsYWJlbCkge1xuICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHN5bmMgJHtsYWJlbH1gKVxuXG4gIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGVuY29kZWQgVVRGLTggYnl0ZXMgZm9yIGEgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gU3RyaW5nIHZhbHVlLlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IC0gVVRGLTggYnl0ZXMuXG4gKi9cbmZ1bmN0aW9uIHV0ZjgodmFsdWUpIHtcbiAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh2YWx1ZSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIFdlYkNyeXB0byBzdWJ0bGUgQVBJLlxuICogQHJldHVybnMge1N1YnRsZUNyeXB0b30gLSBTdWJ0bGVDcnlwdG8gaW1wbGVtZW50YXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNyeXB0b1N1YnRsZSgpIHtcbiAgaWYgKCFnbG9iYWxUaGlzLmNyeXB0bz8uc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJXZWJDcnlwdG8gc3VidGxlIEFQSSBpcyByZXF1aXJlZCBmb3Igc3luYyBzaWduaW5nXCIpXG5cbiAgcmV0dXJuIGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZVxufVxuXG4vKipcbiAqIEJhc2U2NHVybC1lbmNvZGVzIGJ5dGVzLlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlcyAtIEJ5dGVzLlxuICogQHJldHVybnMge3N0cmluZ30gLSBCYXNlNjR1cmwgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlNjRVcmxFbmNvZGUoYnl0ZXMpIHtcbiAgbGV0IGJpbmFyeSA9IFwiXCJcblxuICBmb3IgKGNvbnN0IGJ5dGUgb2YgYnl0ZXMpIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGUpXG5cbiAgcmV0dXJuIGJ0b2EoYmluYXJ5KS5yZXBsYWNlQWxsKFwiK1wiLCBcIi1cIikucmVwbGFjZUFsbChcIi9cIiwgXCJfXCIpLnJlcGxhY2VBbGwoXCI9XCIsIFwiXCIpXG59XG5cbi8qKlxuICogQmFzZTY0dXJsLWRlY29kZXMgYnl0ZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBCYXNlNjR1cmwgc3RyaW5nLlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IC0gQnl0ZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2U2NFVybERlY29kZSh2YWx1ZSkge1xuICBjb25zdCBiYXNlNjQgPSB2YWx1ZS5yZXBsYWNlQWxsKFwiLVwiLCBcIitcIikucmVwbGFjZUFsbChcIl9cIiwgXCIvXCIpLnBhZEVuZChNYXRoLmNlaWwodmFsdWUubGVuZ3RoIC8gNCkgKiA0LCBcIj1cIilcbiAgY29uc3QgYmluYXJ5ID0gYXRvYihiYXNlNjQpXG5cbiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShiaW5hcnksIChjaGFyKSA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpXG59XG5cbi8qKlxuICogU3RhYmxlIEpTT04gc3RyaW5naWZpZXIgd2l0aCBzb3J0ZWQgb2JqZWN0IGtleXMuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEpTT04gc3RyaW5nLlxuICovXG5mdW5jdGlvbiBzdGFibGVKc29uU3RyaW5naWZ5KHZhbHVlKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShkZXRlcm1pbmlzdGljSnNvbih7bGFiZWw6IFwicm9vdFwiLCB2YWx1ZX0pKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSB2YWx1ZSBhcyBhIEpTT04gb2JqZWN0LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5sYWJlbCAtIERpYWdub3N0aWMgbGFiZWwuXG4gKiBAcGFyYW0ge3Vua25vd259IGFyZ3MudmFsdWUgLSBWYWx1ZS5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gLSBKU09OIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5pc3RpY0pzb25PYmplY3Qoe2xhYmVsLCB2YWx1ZX0pIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGRldGVybWluaXN0aWNKc29uKHtsYWJlbCwgdmFsdWV9KVxuXG4gIGlmICghbm9ybWFsaXplZCB8fCB0eXBlb2Ygbm9ybWFsaXplZCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWQpKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHN5bmMgJHtsYWJlbH0gb2JqZWN0YClcblxuICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gKi8gKG5vcm1hbGl6ZWQpXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBkZXRlcm1pbmlzdGljIEpTT04gd2l0aCBzb3J0ZWQgb2JqZWN0IGtleXMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmxhYmVsIC0gRGlhZ25vc3RpYyBsYWJlbC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJncy52YWx1ZSAtIFZhbHVlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWV9IC0gTm9ybWFsaXplZCBKU09OIHZhbHVlLlxuICovXG5mdW5jdGlvbiBkZXRlcm1pbmlzdGljSnNvbih7bGFiZWwsIHZhbHVlfSkge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gdmFsdWVcblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5tYXAoKGVudHJ5LCBpbmRleCkgPT4gZGV0ZXJtaW5pc3RpY0pzb24oe2xhYmVsOiBgJHtsYWJlbH0vJHtpbmRleH1gLCB2YWx1ZTogZW50cnl9KSlcblxuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAqL1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB7fVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpLnNvcnQoKSkge1xuICAgICAgY29uc3QgY2hpbGRWYWx1ZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSlba2V5XVxuXG4gICAgICBpZiAoY2hpbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgbm9ybWFsaXplZFtrZXldID0gZGV0ZXJtaW5pc3RpY0pzb24oe2xhYmVsOiBgJHtsYWJlbH0vJHtrZXl9YCwgdmFsdWU6IGNoaWxkVmFsdWV9KVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgJHtsYWJlbH0gbXVzdCBiZSBkZXRlcm1pbmlzdGljIEpTT05gKVxufVxuIl19
454
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLWlkZW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvZGV2aWNlLWlkZW50aXR5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNIOzs7Ozs7Ozs7R0FTRztBQUNIOzs7Ozs7R0FNRztBQUNIOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNIOzs7Ozs7O0dBT0c7QUFDSCxZQUFZO0FBRVosTUFBTSwyQkFBMkIsR0FBRyxtQkFBbUIsQ0FBQTtBQUN2RCxNQUFNLGtDQUFrQyxHQUFHLG9CQUFvQixDQUFBO0FBRS9EOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsMEJBQTBCO0lBQzlDLE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBWSxFQUFFLENBQUMsV0FBVyxDQUM5QyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBQyxFQUNwQyxJQUFJLEVBQ0osQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQ25CLENBQUE7SUFFRCxPQUFPO1FBQ0wsVUFBVSxFQUFFLE1BQU0sWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3JFLFNBQVMsRUFBRSxNQUFNLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQztLQUNwRSxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCLENBQUMsRUFBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUM7SUFDNUUsTUFBTSxxQkFBcUIsR0FBRyxpQ0FBaUMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUU1RSxPQUFPO1FBQ0wsU0FBUyxFQUFFLDJCQUEyQjtRQUN0QyxXQUFXLEVBQUUscUJBQXFCO1FBQ2xDLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztZQUM5QixVQUFVLEVB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QU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUM1QyxNQUFNLFVBQVUsR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBRXRFLElBQUksVUFBVSxLQUFLLFNBQVM7Z0JBQUUsU0FBUTtZQUN0QyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsRUFBQyxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUE7UUFDcEYsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFBO0lBQ25CLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyw2QkFBNkIsQ0FBQyxDQUFBO0FBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEpTT04gV2ViIEtleSB1c2VkIGJ5IHRoZSBzeW5jIHNpZ25pbmcgaGVscGVycy5cbiAqIEB0eXBlZGVmIHtpbXBvcnQoXCJub2RlOmNyeXB0b1wiKS53ZWJjcnlwdG8uSnNvbldlYktleX0gU3luY0pzb25XZWJLZXlcbiAqL1xuLyoqXG4gKiBCYWNrZW5kLXNpZ25lZCBkZXZpY2UgY2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERldmljZUNlcnRpZmljYXRlUGF5bG9hZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdG9yRGV2aWNlSWQgLSBEZXZpY2UgaWQgYWxsb3dlZCB0byBzaWduIG11dGF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3RvclVzZXJJZCAtIFVzZXIgaWQgcmVwcmVzZW50ZWQgYnkgdGhlIGRldmljZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjZXJ0aWZpY2F0ZUlkIC0gQ2VydGlmaWNhdGUgaWQuXG4gKiBAcHJvcGVydHkge1N5bmNKc29uV2ViS2V5fSBkZXZpY2VQdWJsaWNLZXkgLSBEZXZpY2UgcHVibGljIGtleSBwZWVycy9iYWNrZW5kcyB1c2UgdG8gdmVyaWZ5IG11dGF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHBpcmVzQXQgLSBJU08gdGltZXN0YW1wIGFmdGVyIHdoaWNoIHRoZSBjZXJ0aWZpY2F0ZSBpcyBpbnZhbGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlzc3VlZEF0IC0gSVNPIHRpbWVzdGFtcCB3aGVuIHRoZSBiYWNrZW5kIGlzc3VlZCB0aGUgY2VydGlmaWNhdGUuXG4gKi9cbi8qKlxuICogQmFja2VuZC1zaWduZWQgZGV2aWNlIGNlcnRpZmljYXRlIGVudmVsb3BlLlxuICogQHR5cGVkZWYge29iamVjdH0gRGV2aWNlQ2VydGlmaWNhdGVcbiAqIEBwcm9wZXJ0eSB7XCJFQ0RTQS1QMjU2LVNIQTI1NlwifSBhbGdvcml0aG0gLSBTaWduYXR1cmUgYWxnb3JpdGhtLlxuICogQHByb3BlcnR5IHtEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWR9IGNlcnRpZmljYXRlIC0gQ2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzaWduYXR1cmUgLSBCYWNrZW5kIHNpZ25hdHVyZSBvdmVyIHRoZSBjZXJ0aWZpY2F0ZSBwYXlsb2FkLlxuICovXG4vKipcbiAqIFN5bmMgbXV0YXRpb24gcGF5bG9hZCBzaWduZWQgYnkgYSBkZXZpY2UuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jTXV0YXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3RvckRldmljZUlkIC0gRGV2aWNlIHRoYXQgc2lnbmVkIHRoZSBtdXRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3RvclVzZXJJZCAtIFVzZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHNpZ25pbmcgZGV2aWNlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gW2F0dHJpYnV0ZXNdIC0gTW9kZWwgYXR0cmlidXRlcyBmb3IgQ1JVRCBtdXRhdGlvbnMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bWJlciB8IG51bGx9IFtiYXNlVmVyc2lvbl0gLSBCYXNlIHNlcnZlci9jbGllbnQgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjbGllbnRNdXRhdGlvbklkIC0gRGV2aWNlLWxvY2FsIGlkZW1wb3RlbmN5IGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb21tYW5kXSAtIERvbWFpbiBjb21tYW5kIG5hbWUgZm9yIGNvbW1hbmQgbXV0YXRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZGVsIC0gU3luYyBtb2RlbC9yZXNvdXJjZSBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9jY3VycmVkQXQgLSBJU08gdGltZXN0YW1wIHdoZW4gdGhlIG11dGF0aW9uIG9jY3VycmVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9mZmxpbmVHcmFudElkIC0gT2ZmbGluZSBncmFudCBpZCBhdXRob3JpemluZyB0aGUgbXV0YXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uIC0gQ1JVRCBvcGVyYXRpb24gb3IgY29tbWFuZCBvcGVyYXRpb24uXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSBbcGF5bG9hZF0gLSBEb21haW4gY29tbWFuZCBwYXlsb2FkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBvbGljeUhhc2ggLSBTeW5jIHBvbGljeSBoYXNoIHRoZSBtdXRhdGlvbiB3YXMgY2hlY2tlZCBhZ2FpbnN0LlxuICovXG4vKipcbiAqIERldmljZS1zaWduZWQgbXV0YXRpb24gZW52ZWxvcGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTaWduZWRTeW5jTXV0YXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFQ0RTQS1QMjU2LVNIQTI1NlwifSBhbGdvcml0aG0gLSBTaWduYXR1cmUgYWxnb3JpdGhtLlxuICogQHByb3BlcnR5IHtEZXZpY2VDZXJ0aWZpY2F0ZX0gZGV2aWNlQ2VydGlmaWNhdGUgLSBCYWNrZW5kLXNpZ25lZCBkZXZpY2UgY2VydGlmaWNhdGUuXG4gKiBAcHJvcGVydHkge1N5bmNNdXRhdGlvbn0gbXV0YXRpb24gLSBNdXRhdGlvbiBwYXlsb2FkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNpZ25hdHVyZSAtIERldmljZSBzaWduYXR1cmUgb3ZlciB0aGUgbXV0YXRpb24gZW52ZWxvcGUuXG4gKi9cbi8vIEB0cy1jaGVja1xuXG5jb25zdCBFQ0RTQV9QMjU2X1NIQTI1Nl9BTEdPUklUSE0gPSBcIkVDRFNBLVAyNTYtU0hBMjU2XCJcbmNvbnN0IEVDRFNBX1AyNTZfU0hBMjU2X1NJR05BVFVSRV9QUkVGSVggPSBcImVjZHNhLXAyNTYtc2hhMjU2LVwiXG5cbi8qKlxuICogR2VuZXJhdGVzIGFuIEVDRFNBIFAtMjU2IGtleXBhaXIgZXhwb3J0ZWQgYXMgSldLcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHtwcml2YXRlS2V5OiBTeW5jSnNvbldlYktleSwgcHVibGljS2V5OiBTeW5jSnNvbldlYktleX0+fSAtIEV4cG9ydGVkIGtleXBhaXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVN5bmNTaWduaW5nS2V5UGFpcigpIHtcbiAgY29uc3Qga2V5UGFpciA9IGF3YWl0IGNyeXB0b1N1YnRsZSgpLmdlbmVyYXRlS2V5KFxuICAgIHtuYW1lOiBcIkVDRFNBXCIsIG5hbWVkQ3VydmU6IFwiUC0yNTZcIn0sXG4gICAgdHJ1ZSxcbiAgICBbXCJzaWduXCIsIFwidmVyaWZ5XCJdXG4gIClcblxuICByZXR1cm4ge1xuICAgIHByaXZhdGVLZXk6IGF3YWl0IGNyeXB0b1N1YnRsZSgpLmV4cG9ydEtleShcImp3a1wiLCBrZXlQYWlyLnByaXZhdGVLZXkpLFxuICAgIHB1YmxpY0tleTogYXdhaXQgY3J5cHRvU3VidGxlKCkuZXhwb3J0S2V5KFwiandrXCIsIGtleVBhaXIucHVibGljS2V5KVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJhY2tlbmQtc2lnbmVkIGRldmljZSBjZXJ0aWZpY2F0ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0gYXJncy5iYWNrZW5kUHJpdmF0ZUtleSAtIEJhY2tlbmQgcHJpdmF0ZSBzaWduaW5nIGtleS5cbiAqIEBwYXJhbSB7RGV2aWNlQ2VydGlmaWNhdGVQYXlsb2FkfSBhcmdzLmNlcnRpZmljYXRlIC0gQ2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPERldmljZUNlcnRpZmljYXRlPn0gLSBTaWduZWQgY2VydGlmaWNhdGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVEZXZpY2VDZXJ0aWZpY2F0ZSh7YmFja2VuZFByaXZhdGVLZXksIGNlcnRpZmljYXRlfSkge1xuICBjb25zdCBub3JtYWxpemVkQ2VydGlmaWNhdGUgPSBub3JtYWxpemVEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWQoY2VydGlmaWNhdGUpXG5cbiAgcmV0dXJuIHtcbiAgICBhbGdvcml0aG06IEVDRFNBX1AyNTZfU0hBMjU2X0FMR09SSVRITSxcbiAgICBjZXJ0aWZpY2F0ZTogbm9ybWFsaXplZENlcnRpZmljYXRlLFxuICAgIHNpZ25hdHVyZTogYXdhaXQgc2lnblN0YWJsZUpzb24oe1xuICAgICAgcHJpdmF0ZUtleTogYmFja2VuZFByaXZhdGVLZXksXG4gICAgICB2YWx1ZTogZGV2aWNlQ2VydGlmaWNhdGVTaWduYXR1cmVWYWx1ZShub3JtYWxpemVkQ2VydGlmaWNhdGUpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmaWVzIGEgYmFja2VuZC1zaWduZWQgZGV2aWNlIGNlcnRpZmljYXRlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge1N5bmNKc29uV2ViS2V5fSBhcmdzLmJhY2tlbmRQdWJsaWNLZXkgLSBCYWNrZW5kIHB1YmxpYyBrZXkuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlfSBhcmdzLmNlcnRpZmljYXRlIC0gU2lnbmVkIGNlcnRpZmljYXRlLlxuICogQHBhcmFtIHtEYXRlfSBbYXJncy5ub3ddIC0gVmVyaWZpY2F0aW9uIHRpbWUuIERlZmF1bHRzIHRvIGN1cnJlbnQgdGltZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPERldmljZUNlcnRpZmljYXRlUGF5bG9hZD59IC0gVmVyaWZpZWQgY2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeURldmljZUNlcnRpZmljYXRlKHtiYWNrZW5kUHVibGljS2V5LCBjZXJ0aWZpY2F0ZSwgbm93ID0gbmV3IERhdGUoKX0pIHtcbiAgY29uc3Qgbm9ybWFsaXplZENlcnRpZmljYXRlID0gbm9ybWFsaXplRGV2aWNlQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpXG4gIGNvbnN0IHZlcmlmaWVkID0gYXdhaXQgdmVyaWZ5U3RhYmxlSnNvblNpZ25hdHVyZSh7XG4gICAgcHVibGljS2V5OiBiYWNrZW5kUHVibGljS2V5LFxuICAgIHNpZ25hdHVyZTogbm9ybWFsaXplZENlcnRpZmljYXRlLnNpZ25hdHVyZSxcbiAgICB2YWx1ZTogZGV2aWNlQ2VydGlmaWNhdGVTaWduYXR1cmVWYWx1ZShub3JtYWxpemVkQ2VydGlmaWNhdGUuY2VydGlmaWNhdGUpXG4gIH0pXG5cbiAgaWYgKCF2ZXJpZmllZCkgdGhyb3cgbmV3IEVycm9yKFwiRGV2aWNlIGNlcnRpZmljYXRlIHNpZ25hdHVyZSBkaWQgbm90IG1hdGNoXCIpXG4gIGFzc2VydE5vdEV4cGlyZWQoe2V4cGlyZXNBdDogbm9ybWFsaXplZENlcnRpZmljYXRlLmNlcnRpZmljYXRlLmV4cGlyZXNBdCwgbGFiZWw6IFwiRGV2aWNlIGNlcnRpZmljYXRlXCIsIG5vd30pXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRDZXJ0aWZpY2F0ZS5jZXJ0aWZpY2F0ZVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkZXZpY2Utc2lnbmVkIG11dGF0aW9uIGVudmVsb3BlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlfSBhcmdzLmRldmljZUNlcnRpZmljYXRlIC0gQmFja2VuZC1zaWduZWQgZGV2aWNlIGNlcnRpZmljYXRlLlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0gYXJncy5kZXZpY2VQcml2YXRlS2V5IC0gRGV2aWNlIHByaXZhdGUgc2lnbmluZyBrZXkuXG4gKiBAcGFyYW0ge1N5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE11dGF0aW9uIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTaWduZWRTeW5jTXV0YXRpb24+fSAtIFNpZ25lZCBtdXRhdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNpZ25lZE11dGF0aW9uKHtkZXZpY2VDZXJ0aWZpY2F0ZSwgZGV2aWNlUHJpdmF0ZUtleSwgbXV0YXRpb259KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWREZXZpY2VDZXJ0aWZpY2F0ZSA9IG5vcm1hbGl6ZURldmljZUNlcnRpZmljYXRlKGRldmljZUNlcnRpZmljYXRlKVxuICBjb25zdCBub3JtYWxpemVkTXV0YXRpb24gPSBub3JtYWxpemVTeW5jTXV0YXRpb24obXV0YXRpb24pXG5cbiAgYXNzZXJ0TXV0YXRpb25NYXRjaGVzQ2VydGlmaWNhdGUoe2NlcnRpZmljYXRlOiBub3JtYWxpemVkRGV2aWNlQ2VydGlmaWNhdGUuY2VydGlmaWNhdGUsIG11dGF0aW9uOiBub3JtYWxpemVkTXV0YXRpb259KVxuXG4gIHJldHVybiB7XG4gICAgYWxnb3JpdGhtOiBFQ0RTQV9QMjU2X1NIQTI1Nl9BTEdPUklUSE0sXG4gICAgZGV2aWNlQ2VydGlmaWNhdGU6IG5vcm1hbGl6ZWREZXZpY2VDZXJ0aWZpY2F0ZSxcbiAgICBtdXRhdGlvbjogbm9ybWFsaXplZE11dGF0aW9uLFxuICAgIHNpZ25hdHVyZTogYXdhaXQgc2lnblN0YWJsZUpzb24oe1xuICAgICAgcHJpdmF0ZUtleTogZGV2aWNlUHJpdmF0ZUtleSxcbiAgICAgIHZhbHVlOiBzaWduZWRNdXRhdGlvblNpZ25hdHVyZVZhbHVlKHtcbiAgICAgICAgZGV2aWNlQ2VydGlmaWNhdGU6IG5vcm1hbGl6ZWREZXZpY2VDZXJ0aWZpY2F0ZSxcbiAgICAgICAgbXV0YXRpb246IG5vcm1hbGl6ZWRNdXRhdGlvblxuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogVmVyaWZpZXMgYSBzaWduZWQgc3luYyBtdXRhdGlvbiBhbmQgaXRzIGRldmljZSBjZXJ0aWZpY2F0ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0gYXJncy5iYWNrZW5kUHVibGljS2V5IC0gQmFja2VuZCBwdWJsaWMga2V5IHVzZWQgdG8gdmVyaWZ5IHRoZSBkZXZpY2UgY2VydGlmaWNhdGUuXG4gKiBAcGFyYW0ge0RhdGV9IFthcmdzLm5vd10gLSBWZXJpZmljYXRpb24gdGltZS4gRGVmYXVsdHMgdG8gY3VycmVudCB0aW1lLlxuICogQHBhcmFtIHtTaWduZWRTeW5jTXV0YXRpb259IGFyZ3Muc2lnbmVkTXV0YXRpb24gLSBTaWduZWQgbXV0YXRpb24gZW52ZWxvcGUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTeW5jTXV0YXRpb24+fSAtIFZlcmlmaWVkIG11dGF0aW9uIHBheWxvYWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlTaWduZWRNdXRhdGlvbih7YmFja2VuZFB1YmxpY0tleSwgbm93ID0gbmV3IERhdGUoKSwgc2lnbmVkTXV0YXRpb259KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTaWduZWRNdXRhdGlvbiA9IG5vcm1hbGl6ZVNpZ25lZFN5bmNNdXRhdGlvbihzaWduZWRNdXRhdGlvbilcbiAgY29uc3QgY2VydGlmaWNhdGVQYXlsb2FkID0gYXdhaXQgdmVyaWZ5RGV2aWNlQ2VydGlmaWNhdGUoe1xuICAgIGJhY2tlbmRQdWJsaWNLZXksXG4gICAgY2VydGlmaWNhdGU6IG5vcm1hbGl6ZWRTaWduZWRNdXRhdGlvbi5kZXZpY2VDZXJ0aWZpY2F0ZSxcbiAgICBub3dcbiAgfSlcblxuICBhc3NlcnRNdXRhdGlvbk1hdGNoZXNDZXJ0aWZpY2F0ZSh7Y2VydGlmaWNhdGU6IGNlcnRpZmljYXRlUGF5bG9hZCwgbXV0YXRpb246IG5vcm1hbGl6ZWRTaWduZWRNdXRhdGlvbi5tdXRhdGlvbn0pXG5cbiAgY29uc3QgdmVyaWZpZWQgPSBhd2FpdCB2ZXJpZnlTdGFibGVKc29uU2lnbmF0dXJlKHtcbiAgICBwdWJsaWNLZXk6IGNlcnRpZmljYXRlUGF5bG9hZC5kZXZpY2VQdWJsaWNLZXksXG4gICAgc2lnbmF0dXJlOiBub3JtYWxpemVkU2lnbmVkTXV0YXRpb24uc2lnbmF0dXJlLFxuICAgIHZhbHVlOiBzaWduZWRNdXRhdGlvblNpZ25hdHVyZVZhbHVlKHtcbiAgICAgIGRldmljZUNlcnRpZmljYXRlOiBub3JtYWxpemVkU2lnbmVkTXV0YXRpb24uZGV2aWNlQ2VydGlmaWNhdGUsXG4gICAgICBtdXRhdGlvbjogbm9ybWFsaXplZFNpZ25lZE11dGF0aW9uLm11dGF0aW9uXG4gICAgfSlcbiAgfSlcblxuICBpZiAoIXZlcmlmaWVkKSB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIG11dGF0aW9uIHNpZ25hdHVyZSBkaWQgbm90IG1hdGNoXCIpXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRTaWduZWRNdXRhdGlvbi5tdXRhdGlvblxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlcGxheS9pZGVtcG90ZW5jeSBrZXkgZm9yIGEgc2lnbmVkIG11dGF0aW9uLlxuICogQHBhcmFtIHt7bXV0YXRpb246IHthY3RvckRldmljZUlkPzogdW5rbm93biwgYWN0b3JVc2VySWQ/OiB1bmtub3duLCBjbGllbnRNdXRhdGlvbklkPzogdW5rbm93bn19fSBzaWduZWRNdXRhdGlvbiAtIFNpZ25lZCBtdXRhdGlvbi1saWtlIG9iamVjdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSWRlbXBvdGVuY3kga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbXV0YXRpb25JZGVtcG90ZW5jeUtleShzaWduZWRNdXRhdGlvbikge1xuICBjb25zdCBtdXRhdGlvbiA9IHNpZ25lZE11dGF0aW9uLm11dGF0aW9uXG5cbiAgcmV0dXJuIFtcbiAgICByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5hY3RvclVzZXJJZCwgXCJhY3RvclVzZXJJZFwiKSxcbiAgICByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5hY3RvckRldmljZUlkLCBcImFjdG9yRGV2aWNlSWRcIiksXG4gICAgcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCwgXCJjbGllbnRNdXRhdGlvbklkXCIpXG4gIF0uam9pbihcIjpcIilcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHN0YWJsZSB2YWx1ZSBzaWduZWQgYnkgYmFja2VuZCBkZXZpY2UgY2VydGlmaWNhdGVzLlxuICogQHBhcmFtIHtEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWR9IGNlcnRpZmljYXRlIC0gQ2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gLSBTdGFibGUgc2lnbmF0dXJlIHZhbHVlLlxuICovXG5mdW5jdGlvbiBkZXZpY2VDZXJ0aWZpY2F0ZVNpZ25hdHVyZVZhbHVlKGNlcnRpZmljYXRlKSB7XG4gIHJldHVybiB7XG4gICAgYWxnb3JpdGhtOiBFQ0RTQV9QMjU2X1NIQTI1Nl9BTEdPUklUSE0sXG4gICAgY2VydGlmaWNhdGU6IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59ICovIChkZXRlcm1pbmlzdGljSnNvbk9iamVjdCh7bGFiZWw6IFwiY2VydGlmaWNhdGVcIiwgdmFsdWU6IGNlcnRpZmljYXRlfSkpXG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHN0YWJsZSB2YWx1ZSBzaWduZWQgYnkgc3luYyBtdXRhdGlvbnMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7RGV2aWNlQ2VydGlmaWNhdGV9IGFyZ3MuZGV2aWNlQ2VydGlmaWNhdGUgLSBEZXZpY2UgY2VydGlmaWNhdGUuXG4gKiBAcGFyYW0ge1N5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE11dGF0aW9uIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IC0gU3RhYmxlIHNpZ25hdHVyZSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc2lnbmVkTXV0YXRpb25TaWduYXR1cmVWYWx1ZSh7ZGV2aWNlQ2VydGlmaWNhdGUsIG11dGF0aW9ufSkge1xuICByZXR1cm4ge1xuICAgIGFsZ29yaXRobTogRUNEU0FfUDI1Nl9TSEEyNTZfQUxHT1JJVEhNLFxuICAgIGRldmljZUNlcnRpZmljYXRlOiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAqLyAoZGV0ZXJtaW5pc3RpY0pzb25PYmplY3Qoe2xhYmVsOiBcImRldmljZUNlcnRpZmljYXRlXCIsIHZhbHVlOiBkZXZpY2VDZXJ0aWZpY2F0ZX0pKSxcbiAgICBtdXRhdGlvbjogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gKi8gKGRldGVybWluaXN0aWNKc29uT2JqZWN0KHtsYWJlbDogXCJtdXRhdGlvblwiLCB2YWx1ZTogbXV0YXRpb259KSlcbiAgfVxufVxuXG4vKipcbiAqIFNpZ25zIGEgZGV0ZXJtaW5pc3RpYyBKU09OIHZhbHVlIHdpdGggRUNEU0EgUC0yNTYvU0hBLTI1Ni5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0gYXJncy5wcml2YXRlS2V5IC0gUHJpdmF0ZSBKV0suXG4gKiBAcGFyYW0ge3Vua25vd259IGFyZ3MudmFsdWUgLSBWYWx1ZSB0byBzaWduLlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBQcmVmaXhlZCBiYXNlNjR1cmwgc2lnbmF0dXJlLlxuICovXG5hc3luYyBmdW5jdGlvbiBzaWduU3RhYmxlSnNvbih7cHJpdmF0ZUtleSwgdmFsdWV9KSB7XG4gIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0b1N1YnRsZSgpLmltcG9ydEtleShcImp3a1wiLCBwcml2YXRlS2V5LCB7bmFtZTogXCJFQ0RTQVwiLCBuYW1lZEN1cnZlOiBcIlAtMjU2XCJ9LCBmYWxzZSwgW1wic2lnblwiXSlcbiAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgY3J5cHRvU3VidGxlKCkuc2lnbih7aGFzaDogXCJTSEEtMjU2XCIsIG5hbWU6IFwiRUNEU0FcIn0sIGtleSwgLyoqIEB0eXBlIHtVaW50OEFycmF5PEFycmF5QnVmZmVyPn0gKi8gKHV0Zjgoc3RhYmxlSnNvblN0cmluZ2lmeSh2YWx1ZSkpKSlcblxuICByZXR1cm4gYCR7RUNEU0FfUDI1Nl9TSEEyNTZfU0lHTkFUVVJFX1BSRUZJWH0ke2Jhc2U2NFVybEVuY29kZShuZXcgVWludDhBcnJheShzaWduYXR1cmUpKX1gXG59XG5cbi8qKlxuICogVmVyaWZpZXMgYSBkZXRlcm1pbmlzdGljIEpTT04gdmFsdWUgd2l0aCBFQ0RTQSBQLTI1Ni9TSEEtMjU2LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge1N5bmNKc29uV2ViS2V5fSBhcmdzLnB1YmxpY0tleSAtIFB1YmxpYyBKV0suXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zaWduYXR1cmUgLSBQcmVmaXhlZCBiYXNlNjR1cmwgc2lnbmF0dXJlLlxuICogQHBhcmFtIHt1bmtub3dufSBhcmdzLnZhbHVlIC0gVmFsdWUgdG8gdmVyaWZ5LlxuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgc2lnbmF0dXJlIG1hdGNoZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeVN0YWJsZUpzb25TaWduYXR1cmUoe3B1YmxpY0tleSwgc2lnbmF0dXJlLCB2YWx1ZX0pIHtcbiAgY29uc3Qga2V5ID0gYXdhaXQgY3J5cHRvU3VidGxlKCkuaW1wb3J0S2V5KFwiandrXCIsIHB1YmxpY0tleSwge25hbWU6IFwiRUNEU0FcIiwgbmFtZWRDdXJ2ZTogXCJQLTI1NlwifSwgZmFsc2UsIFtcInZlcmlmeVwiXSlcbiAgY29uc3Qgc2lnbmF0dXJlQnl0ZXMgPSBiYXNlNjRVcmxEZWNvZGUoc2lnbmF0dXJlV2l0aG91dFByZWZpeChzaWduYXR1cmUpKVxuXG4gIHJldHVybiBhd2FpdCBjcnlwdG9TdWJ0bGUoKS52ZXJpZnkoe2hhc2g6IFwiU0hBLTI1NlwiLCBuYW1lOiBcIkVDRFNBXCJ9LCBrZXksIC8qKiBAdHlwZSB7VWludDhBcnJheTxBcnJheUJ1ZmZlcj59ICovIChzaWduYXR1cmVCeXRlcyksIC8qKiBAdHlwZSB7VWludDhBcnJheTxBcnJheUJ1ZmZlcj59ICovICh1dGY4KHN0YWJsZUpzb25TdHJpbmdpZnkodmFsdWUpKSkpXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHNpZ25lZCBkZXZpY2UgY2VydGlmaWNhdGUgZW52ZWxvcGUuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlfSBjZXJ0aWZpY2F0ZSAtIFNpZ25lZCBjZXJ0aWZpY2F0ZS5cbiAqIEByZXR1cm5zIHtEZXZpY2VDZXJ0aWZpY2F0ZX0gLSBOb3JtYWxpemVkIGNlcnRpZmljYXRlLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVEZXZpY2VDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSkge1xuICBpZiAoIWNlcnRpZmljYXRlIHx8IHR5cGVvZiBjZXJ0aWZpY2F0ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGNlcnRpZmljYXRlKSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgZGV2aWNlIGNlcnRpZmljYXRlIG9iamVjdFwiKVxuICBpZiAoY2VydGlmaWNhdGUuYWxnb3JpdGhtICE9PSBFQ0RTQV9QMjU2X1NIQTI1Nl9BTEdPUklUSE0pIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGV2aWNlIGNlcnRpZmljYXRlIGFsZ29yaXRobSAnJHtTdHJpbmcoY2VydGlmaWNhdGUuYWxnb3JpdGhtKX0nYClcblxuICByZXR1cm4ge1xuICAgIGFsZ29yaXRobTogY2VydGlmaWNhdGUuYWxnb3JpdGhtLFxuICAgIGNlcnRpZmljYXRlOiBub3JtYWxpemVEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWQoY2VydGlmaWNhdGUuY2VydGlmaWNhdGUpLFxuICAgIHNpZ25hdHVyZTogbm9ybWFsaXplU2lnbmF0dXJlKGNlcnRpZmljYXRlLnNpZ25hdHVyZSwgXCJkZXZpY2UgY2VydGlmaWNhdGUgc2lnbmF0dXJlXCIpXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgZGV2aWNlIGNlcnRpZmljYXRlIHBheWxvYWQuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlUGF5bG9hZH0gY2VydGlmaWNhdGUgLSBDZXJ0aWZpY2F0ZSBwYXlsb2FkLlxuICogQHJldHVybnMge0RldmljZUNlcnRpZmljYXRlUGF5bG9hZH0gLSBOb3JtYWxpemVkIGNlcnRpZmljYXRlIHBheWxvYWQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZURldmljZUNlcnRpZmljYXRlUGF5bG9hZChjZXJ0aWZpY2F0ZSkge1xuICBpZiAoIWNlcnRpZmljYXRlIHx8IHR5cGVvZiBjZXJ0aWZpY2F0ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGNlcnRpZmljYXRlKSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgZGV2aWNlIGNlcnRpZmljYXRlIHBheWxvYWQgb2JqZWN0XCIpXG5cbiAgcmV0dXJuIHtcbiAgICBhY3RvckRldmljZUlkOiByZXF1aXJlZFN0cmluZyhjZXJ0aWZpY2F0ZS5hY3RvckRldmljZUlkLCBcImFjdG9yRGV2aWNlSWRcIiksXG4gICAgYWN0b3JVc2VySWQ6IHJlcXVpcmVkU3RyaW5nKGNlcnRpZmljYXRlLmFjdG9yVXNlcklkLCBcImFjdG9yVXNlcklkXCIpLFxuICAgIGNlcnRpZmljYXRlSWQ6IHJlcXVpcmVkU3RyaW5nKGNlcnRpZmljYXRlLmNlcnRpZmljYXRlSWQsIFwiY2VydGlmaWNhdGVJZFwiKSxcbiAgICBkZXZpY2VQdWJsaWNLZXk6IG5vcm1hbGl6ZUp3ayhjZXJ0aWZpY2F0ZS5kZXZpY2VQdWJsaWNLZXksIFwiZGV2aWNlUHVibGljS2V5XCIpLFxuICAgIGV4cGlyZXNBdDogaXNvRGF0ZVN0cmluZyhuZXcgRGF0ZShyZXF1aXJlZFN0cmluZyhjZXJ0aWZpY2F0ZS5leHBpcmVzQXQsIFwiZXhwaXJlc0F0XCIpKSwgXCJleHBpcmVzQXRcIiksXG4gICAgaXNzdWVkQXQ6IGlzb0RhdGVTdHJpbmcobmV3IERhdGUocmVxdWlyZWRTdHJpbmcoY2VydGlmaWNhdGUuaXNzdWVkQXQsIFwiaXNzdWVkQXRcIikpLCBcImlzc3VlZEF0XCIpXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgc2lnbmVkIHN5bmMgbXV0YXRpb24gZW52ZWxvcGUuXG4gKiBAcGFyYW0ge1NpZ25lZFN5bmNNdXRhdGlvbn0gc2lnbmVkTXV0YXRpb24gLSBTaWduZWQgbXV0YXRpb24uXG4gKiBAcmV0dXJucyB7U2lnbmVkU3luY011dGF0aW9ufSAtIE5vcm1hbGl6ZWQgc2lnbmVkIG11dGF0aW9uLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTaWduZWRTeW5jTXV0YXRpb24oc2lnbmVkTXV0YXRpb24pIHtcbiAgaWYgKCFzaWduZWRNdXRhdGlvbiB8fCB0eXBlb2Ygc2lnbmVkTXV0YXRpb24gIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShzaWduZWRNdXRhdGlvbikpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIHNpZ25lZCBzeW5jIG11dGF0aW9uIG9iamVjdFwiKVxuICBpZiAoc2lnbmVkTXV0YXRpb24uYWxnb3JpdGhtICE9PSBFQ0RTQV9QMjU2X1NIQTI1Nl9BTEdPUklUSE0pIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc3luYyBtdXRhdGlvbiBhbGdvcml0aG0gJyR7U3RyaW5nKHNpZ25lZE11dGF0aW9uLmFsZ29yaXRobSl9J2ApXG5cbiAgcmV0dXJuIHtcbiAgICBhbGdvcml0aG06IHNpZ25lZE11dGF0aW9uLmFsZ29yaXRobSxcbiAgICBkZXZpY2VDZXJ0aWZpY2F0ZTogbm9ybWFsaXplRGV2aWNlQ2VydGlmaWNhdGUoc2lnbmVkTXV0YXRpb24uZGV2aWNlQ2VydGlmaWNhdGUpLFxuICAgIG11dGF0aW9uOiBub3JtYWxpemVTeW5jTXV0YXRpb24oc2lnbmVkTXV0YXRpb24ubXV0YXRpb24pLFxuICAgIHNpZ25hdHVyZTogbm9ybWFsaXplU2lnbmF0dXJlKHNpZ25lZE11dGF0aW9uLnNpZ25hdHVyZSwgXCJzeW5jIG11dGF0aW9uIHNpZ25hdHVyZVwiKVxuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHN5bmMgbXV0YXRpb24gcGF5bG9hZC5cbiAqIEBwYXJhbSB7U3luY011dGF0aW9ufSBtdXRhdGlvbiAtIE11dGF0aW9uIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7U3luY011dGF0aW9ufSAtIE5vcm1hbGl6ZWQgbXV0YXRpb24gcGF5bG9hZC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU3luY011dGF0aW9uKG11dGF0aW9uKSB7XG4gIGlmICghbXV0YXRpb24gfHwgdHlwZW9mIG11dGF0aW9uICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobXV0YXRpb24pKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBzeW5jIG11dGF0aW9uIG9iamVjdFwiKVxuXG4gIC8qKiBAdHlwZSB7U3luY011dGF0aW9ufSAqL1xuICBjb25zdCBub3JtYWxpemVkID0ge1xuICAgIGFjdG9yRGV2aWNlSWQ6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLmFjdG9yRGV2aWNlSWQsIFwiYWN0b3JEZXZpY2VJZFwiKSxcbiAgICBhY3RvclVzZXJJZDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uYWN0b3JVc2VySWQsIFwiYWN0b3JVc2VySWRcIiksXG4gICAgY2xpZW50TXV0YXRpb25JZDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCwgXCJjbGllbnRNdXRhdGlvbklkXCIpLFxuICAgIG1vZGVsOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5tb2RlbCwgXCJtb2RlbFwiKSxcbiAgICBvY2N1cnJlZEF0OiBpc29EYXRlU3RyaW5nKG5ldyBEYXRlKHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLm9jY3VycmVkQXQsIFwib2NjdXJyZWRBdFwiKSksIFwib2NjdXJyZWRBdFwiKSxcbiAgICBvZmZsaW5lR3JhbnRJZDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24ub2ZmbGluZUdyYW50SWQsIFwib2ZmbGluZUdyYW50SWRcIiksXG4gICAgb3BlcmF0aW9uOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5vcGVyYXRpb24sIFwib3BlcmF0aW9uXCIpLFxuICAgIHBvbGljeUhhc2g6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLnBvbGljeUhhc2gsIFwicG9saWN5SGFzaFwiKVxuICB9XG5cbiAgaWYgKG11dGF0aW9uLmF0dHJpYnV0ZXMgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5hdHRyaWJ1dGVzID0gZGV0ZXJtaW5pc3RpY0pzb25PYmplY3Qoe2xhYmVsOiBcImF0dHJpYnV0ZXNcIiwgdmFsdWU6IG11dGF0aW9uLmF0dHJpYnV0ZXN9KVxuICBpZiAobXV0YXRpb24uYmFzZVZlcnNpb24gIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5iYXNlVmVyc2lvbiA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyIHwgbnVsbH0gKi8gKGRldGVybWluaXN0aWNKc29uKHtsYWJlbDogXCJiYXNlVmVyc2lvblwiLCB2YWx1ZTogbXV0YXRpb24uYmFzZVZlcnNpb259KSlcbiAgaWYgKG11dGF0aW9uLmNvbW1hbmQgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5jb21tYW5kID0gcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uY29tbWFuZCwgXCJjb21tYW5kXCIpXG4gIGlmIChtdXRhdGlvbi5wYXlsb2FkICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQucGF5bG9hZCA9IGRldGVybWluaXN0aWNKc29uT2JqZWN0KHtsYWJlbDogXCJwYXlsb2FkXCIsIHZhbHVlOiBtdXRhdGlvbi5wYXlsb2FkfSlcblxuICByZXR1cm4gbm9ybWFsaXplZFxufVxuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBtdXRhdGlvbiBhY3RvciBmaWVsZHMgbWF0Y2ggdGhlIGNlcnRpZmljYXRlIGFjdG9yLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlUGF5bG9hZH0gYXJncy5jZXJ0aWZpY2F0ZSAtIERldmljZSBjZXJ0aWZpY2F0ZSBwYXlsb2FkLlxuICogQHBhcmFtIHtTeW5jTXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBNdXRhdGlvbiBwYXlsb2FkLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBhc3NlcnRNdXRhdGlvbk1hdGNoZXNDZXJ0aWZpY2F0ZSh7Y2VydGlmaWNhdGUsIG11dGF0aW9ufSkge1xuICBpZiAobXV0YXRpb24uYWN0b3JEZXZpY2VJZCAhPT0gY2VydGlmaWNhdGUuYWN0b3JEZXZpY2VJZCB8fCBtdXRhdGlvbi5hY3RvclVzZXJJZCAhPT0gY2VydGlmaWNhdGUuYWN0b3JVc2VySWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIG11dGF0aW9uIGFjdG9yIGRvZXMgbm90IG1hdGNoIGRldmljZSBjZXJ0aWZpY2F0ZVwiKVxuICB9XG59XG5cbi8qKlxuICogQXNzZXJ0cyBhIHRpbWVzdGFtcCBpcyBub3QgZXhwaXJlZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZXhwaXJlc0F0IC0gRXhwaXJ5IHRpbWVzdGFtcC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmxhYmVsIC0gRXJyb3IgbGFiZWwuXG4gKiBAcGFyYW0ge0RhdGV9IGFyZ3Mubm93IC0gVmVyaWZpY2F0aW9uIHRpbWUuXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vdEV4cGlyZWQoe2V4cGlyZXNBdCwgbGFiZWwsIG5vd30pIHtcbiAgaWYgKE51bWJlci5pc05hTihub3cuZ2V0VGltZSgpKSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzeW5jIHZlcmlmaWNhdGlvbiB0aW1lXCIpXG4gIGlmIChuZXcgRGF0ZShleHBpcmVzQXQpLmdldFRpbWUoKSA8PSBub3cuZ2V0VGltZSgpKSB0aHJvdyBuZXcgRXJyb3IoYCR7bGFiZWx9IGV4cGlyZWRgKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBKU09OIFdlYiBLZXkgb2JqZWN0LlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0ga2V5IC0gSldLLlxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIC0gS2V5IGxhYmVsLlxuICogQHJldHVybnMge1N5bmNKc29uV2ViS2V5fSAtIE5vcm1hbGl6ZWQgSldLLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVKd2soa2V5LCBsYWJlbCkge1xuICBjb25zdCBub3JtYWxpemVkID0gZGV0ZXJtaW5pc3RpY0pzb25PYmplY3Qoe2xhYmVsLCB2YWx1ZToga2V5fSlcblxuICByZXR1cm4gLyoqIEB0eXBlIHtTeW5jSnNvbldlYktleX0gKi8gKG5vcm1hbGl6ZWQpXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHByZWZpeGVkIHNpZ25hdHVyZSBzdHJpbmcuXG4gKiBAcGFyYW0ge3Vua25vd259IHNpZ25hdHVyZSAtIFNpZ25hdHVyZSB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIEVycm9yIGxhYmVsLlxuICogQHJldHVybnMge3N0cmluZ30gLSBTaWduYXR1cmUgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTaWduYXR1cmUoc2lnbmF0dXJlLCBsYWJlbCkge1xuICBpZiAodHlwZW9mIHNpZ25hdHVyZSAhPT0gXCJzdHJpbmdcIiB8fCAhc2lnbmF0dXJlLnN0YXJ0c1dpdGgoRUNEU0FfUDI1Nl9TSEEyNTZfU0lHTkFUVVJFX1BSRUZJWCkpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtsYWJlbH1gKVxuXG4gIHJldHVybiBzaWduYXR1cmVcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBzaWduYXR1cmUgcHJlZml4LlxuICogQHBhcmFtIHtzdHJpbmd9IHNpZ25hdHVyZSAtIFByZWZpeGVkIHNpZ25hdHVyZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQmFzZTY0dXJsIHNpZ25hdHVyZSBib2R5LlxuICovXG5mdW5jdGlvbiBzaWduYXR1cmVXaXRob3V0UHJlZml4KHNpZ25hdHVyZSkge1xuICByZXR1cm4gc2lnbmF0dXJlLnNsaWNlKEVDRFNBX1AyNTZfU0hBMjU2X1NJR05BVFVSRV9QUkVGSVgubGVuZ3RoKVxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGEgbm9uLWVtcHR5IHN0cmluZyBmaWVsZC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBWYWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gRmllbGQgbmFtZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RyaW5nIHZhbHVlLlxuICovXG5mdW5jdGlvbiByZXF1aXJlZFN0cmluZyh2YWx1ZSwgbmFtZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8IHZhbHVlLmxlbmd0aCA8IDEpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgc3luYyAke25hbWV9YClcblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgRGF0ZSB0byBhbiBJU08gdGltZXN0YW1wLlxuICogQHBhcmFtIHtEYXRlfSBkYXRlIC0gRGF0ZSB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIEZpZWxkIGxhYmVsLlxuICogQHJldHVybnMge3N0cmluZ30gLSBJU08gdGltZXN0YW1wLlxuICovXG5mdW5jdGlvbiBpc29EYXRlU3RyaW5nKGRhdGUsIGxhYmVsKSB7XG4gIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3luYyAke2xhYmVsfWApXG5cbiAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKVxufVxuXG4vKipcbiAqIFJldHVybnMgZW5jb2RlZCBVVEYtOCBieXRlcyBmb3IgYSBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBTdHJpbmcgdmFsdWUuXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gLSBVVEYtOCBieXRlcy5cbiAqL1xuZnVuY3Rpb24gdXRmOCh2YWx1ZSkge1xuICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHZhbHVlKVxufVxuXG4vKipcbiAqIFJldHVybnMgV2ViQ3J5cHRvIHN1YnRsZSBBUEkuXG4gKiBAcmV0dXJucyB7U3VidGxlQ3J5cHRvfSAtIFN1YnRsZUNyeXB0byBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3J5cHRvU3VidGxlKCkge1xuICBpZiAoIWdsb2JhbFRoaXMuY3J5cHRvPy5zdWJ0bGUpIHRocm93IG5ldyBFcnJvcihcIldlYkNyeXB0byBzdWJ0bGUgQVBJIGlzIHJlcXVpcmVkIGZvciBzeW5jIHNpZ25pbmdcIilcblxuICByZXR1cm4gZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlXG59XG5cbi8qKlxuICogQmFzZTY0dXJsLWVuY29kZXMgYnl0ZXMuXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzIC0gQnl0ZXMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEJhc2U2NHVybCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGJhc2U2NFVybEVuY29kZShieXRlcykge1xuICBsZXQgYmluYXJ5ID0gXCJcIlxuXG4gIGZvciAoY29uc3QgYnl0ZSBvZiBieXRlcykgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZSlcblxuICByZXR1cm4gYnRvYShiaW5hcnkpLnJlcGxhY2VBbGwoXCIrXCIsIFwiLVwiKS5yZXBsYWNlQWxsKFwiL1wiLCBcIl9cIikucmVwbGFjZUFsbChcIj1cIiwgXCJcIilcbn1cblxuLyoqXG4gKiBCYXNlNjR1cmwtZGVjb2RlcyBieXRlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIEJhc2U2NHVybCBzdHJpbmcuXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gLSBCeXRlcy5cbiAqL1xuZnVuY3Rpb24gYmFzZTY0VXJsRGVjb2RlKHZhbHVlKSB7XG4gIGNvbnN0IGJhc2U2NCA9IHZhbHVlLnJlcGxhY2VBbGwoXCItXCIsIFwiK1wiKS5yZXBsYWNlQWxsKFwiX1wiLCBcIi9cIikucGFkRW5kKE1hdGguY2VpbCh2YWx1ZS5sZW5ndGggLyA0KSAqIDQsIFwiPVwiKVxuICBjb25zdCBiaW5hcnkgPSBhdG9iKGJhc2U2NClcblxuICByZXR1cm4gVWludDhBcnJheS5mcm9tKGJpbmFyeSwgKGNoYXIpID0+IGNoYXIuY2hhckNvZGVBdCgwKSlcbn1cblxuLyoqXG4gKiBTdGFibGUgSlNPTiBzdHJpbmdpZmllciB3aXRoIHNvcnRlZCBvYmplY3Qga2V5cy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBWYWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSlNPTiBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHN0YWJsZUpzb25TdHJpbmdpZnkodmFsdWUpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRldGVybWluaXN0aWNKc29uKHtsYWJlbDogXCJyb290XCIsIHZhbHVlfSkpXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHZhbHVlIGFzIGEgSlNPTiBvYmplY3QuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmxhYmVsIC0gRGlhZ25vc3RpYyBsYWJlbC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJncy52YWx1ZSAtIFZhbHVlLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAtIEpTT04gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBkZXRlcm1pbmlzdGljSnNvbk9iamVjdCh7bGFiZWwsIHZhbHVlfSkge1xuICBjb25zdCBub3JtYWxpemVkID0gZGV0ZXJtaW5pc3RpY0pzb24oe2xhYmVsLCB2YWx1ZX0pXG5cbiAgaWYgKCFub3JtYWxpemVkIHx8IHR5cGVvZiBub3JtYWxpemVkICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobm9ybWFsaXplZCkpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgc3luYyAke2xhYmVsfSBvYmplY3RgKVxuXG4gIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAqLyAobm9ybWFsaXplZClcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGRldGVybWluaXN0aWMgSlNPTiB3aXRoIHNvcnRlZCBvYmplY3Qga2V5cy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubGFiZWwgLSBEaWFnbm9zdGljIGxhYmVsLlxuICogQHBhcmFtIHt1bmtub3dufSBhcmdzLnZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZX0gLSBOb3JtYWxpemVkIEpTT04gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGRldGVybWluaXN0aWNKc29uKHtsYWJlbCwgdmFsdWV9KSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB2YWx1ZVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLm1hcCgoZW50cnksIGluZGV4KSA9PiBkZXRlcm1pbmlzdGljSnNvbih7bGFiZWw6IGAke2xhYmVsfS8ke2luZGV4fWAsIHZhbHVlOiBlbnRyeX0pKVxuXG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59ICovXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpKSB7XG4gICAgICBjb25zdCBjaGlsZFZhbHVlID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHZhbHVlKVtrZXldXG5cbiAgICAgIGlmIChjaGlsZFZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICBub3JtYWxpemVkW2tleV0gPSBkZXRlcm1pbmlzdGljSnNvbih7bGFiZWw6IGAke2xhYmVsfS8ke2tleX1gLCB2YWx1ZTogY2hpbGRWYWx1ZX0pXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgU3luYyAke2xhYmVsfSBtdXN0IGJlIGRldGVybWluaXN0aWMgSlNPTmApXG59XG4iXX0=
@@ -1,44 +1,3 @@
1
- /**
2
- * Local mutation log record query options.
3
- * @typedef {object} LocalMutationLogRecordsOptions
4
- * @property {LocalMutationStatus[]} [statuses] - Optional status filter.
5
- */
6
- /**
7
- * Local mutation log row-oriented storage adapter.
8
- *
9
- * Implementations should store each mutation log record as its own row/entry.
10
- * Native apps should back this with SQLite and indexes on storage key, status,
11
- * and sequence. Avoid storing the whole log as one JSON blob.
12
- * @typedef {object} LocalMutationLogStorage
13
- * @property {(storageKey: string, record: LocalMutationLogRecord) => Promise<void> | void} appendRecord - Appends one log record.
14
- * @property {(storageKey: string, ids: string[]) => Promise<void> | void} deleteRecords - Deletes log records by id.
15
- * @property {(storageKey: string) => Promise<number> | number} nextSequence - Returns the next local sequence number.
16
- * @property {(storageKey: string, id: string) => Promise<LocalMutationLogRecord | null | undefined> | LocalMutationLogRecord | null | undefined} record - Reads one log record by id.
17
- * @property {(storageKey: string, options?: LocalMutationLogRecordsOptions) => Promise<LocalMutationLogRecord[]> | LocalMutationLogRecord[]} records - Reads log records.
18
- * @property {(storageKey: string, record: LocalMutationLogRecord) => Promise<void> | void} updateRecord - Replaces one log record.
19
- */
20
- /**
21
- * Local sync mutation dependency metadata.
22
- * @typedef {object} LocalMutationDependency
23
- * @property {string} clientMutationId - Client mutation id this mutation depends on.
24
- * @property {string} model - Dependent model/resource name.
25
- */
26
- /**
27
- * Local mutation log status.
28
- * @typedef {"pending" | "applied-locally" | "peer-applied" | "conflict" | "rejected" | "synced"} LocalMutationStatus
29
- * */
30
- /**
31
- * Local mutation log record.
32
- * @typedef {object} LocalMutationLogRecord
33
- * @property {string} createdAt - ISO timestamp when the record was created locally.
34
- * @property {LocalMutationDependency[]} dependencies - Other local mutations that must replay first.
35
- * @property {string} id - Local log record id.
36
- * @property {import("./device-identity.js").SyncMutation} mutation - Device mutation payload.
37
- * @property {number} sequence - Monotonic local sequence.
38
- * @property {LocalMutationStatus} status - Local replay/apply status.
39
- * @property {Record<string, import("../configuration-types.js").FrontendModelSyncJsonValue>} [syncResult] - Backend replay/result metadata.
40
- * @property {string} updatedAt - ISO timestamp when the record was last changed.
41
- */
42
1
  /** Client-side append-only sync mutation log with pluggable persistent storage. */
43
2
  export default class LocalMutationLog {
44
3
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"local-mutation-log.d.ts","sourceRoot":"","sources":["../../../src/sync/local-mutation-log.js"],"names":[],"mappings":"AAUA;;;;GAIG;AAEH;;;;;;;;;;;;;GAaG;AAEH;;;;;GAKG;AAEH;;;KAGK;AAEL;;;;;;;;;;;GAWG;AAEH,mFAAmF;AACnF;IACE;;;;;;;OAOG;IACH,uDALG;QAA4B,WAAW,UAAzB,MAAM;QACM,GAAG,UAAf,IAAI;QACoB,OAAO,EAArC,uBAAuB;QACT,UAAU;KAClC,EAUA;IAJC,mBAVe,MAAM,CAUS;IAC9B,WAVe,IAAI,CAUL;IACd,iCAAsB;IACtB,mBAA4B;IAG9B;;;;;;OAMG;IACH,mCAJG;QAAyC,YAAY;QACK,QAAQ,EAA1D,OAAO,sBAAsB,EAAE,YAAY;KACnD,GAAU,OAAO,CAAC,sBAAsB,CAAC,CAmB3C;IAED;;;OAGG;IACH,WAFa,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAI7C;IAED;;;OAGG;IACH,kBAFa,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAI7C;IAED;;;;;;;OAOG;IACH,yCALG;QAAqB,EAAE,EAAf,MAAM;QACoB,MAAM,EAAhC,mBAAmB;QACmE,UAAU;KACxG,GAAU,OAAO,CAAC,sBAAsB,CAAC,CAmB3C;IAED;;;;;;OAMG;IACH,sDAJG;QAAsB,kBAAkB;QAClB,mBAAmB;KACzC,GAAU,OAAO,CAAC;QAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;KAAC,CAAC,CAkCjD;IAED;;;OAGG;IACH,oBAFa,MAAM,CAQlB;CACF;;;;;;;;;;;;;;;;;;;;;kBA/Ka,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;;;;mBAC5E,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;;;;kBAC3D,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM;;;;YAChD,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,sBAAsB,GAAG,IAAI,GAAG,SAAS;;;;aAClI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,8BAA8B,KAAK,OAAO,CAAC,sBAAsB,EAAE,CAAC,GAAG,sBAAsB,EAAE;;;;kBAC9H,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;;;;;;;;;sBAM5E,MAAM;;;;WACN,MAAM;;;;;kCAKP,SAAS,GAAG,iBAAiB,GAAG,cAAc,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ;;;;;;;;eAMlF,MAAM;;;;kBACN,uBAAuB,EAAE;;;;QACzB,MAAM;;;;cACN,OAAO,sBAAsB,EAAE,YAAY;;;;cAC3C,MAAM;;;;YACN,mBAAmB;;;;;;;;eAEnB,MAAM"}
1
+ {"version":3,"file":"local-mutation-log.d.ts","sourceRoot":"","sources":["../../../src/sync/local-mutation-log.js"],"names":[],"mappings":"AAmDA,mFAAmF;AACnF;IACE;;;;;;;OAOG;IACH,uDALG;QAA4B,WAAW,UAAzB,MAAM;QACM,GAAG,UAAf,IAAI;QACoB,OAAO,EAArC,uBAAuB;QACT,UAAU;KAClC,EAUA;IAJC,mBAVe,MAAM,CAUS;IAC9B,WAVe,IAAI,CAUL;IACd,iCAAsB;IACtB,mBAA4B;IAG9B;;;;;;OAMG;IACH,mCAJG;QAAyC,YAAY;QACK,QAAQ,EAA1D,OAAO,sBAAsB,EAAE,YAAY;KACnD,GAAU,OAAO,CAAC,sBAAsB,CAAC,CAmB3C;IAED;;;OAGG;IACH,WAFa,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAI7C;IAED;;;OAGG;IACH,kBAFa,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAI7C;IAED;;;;;;;OAOG;IACH,yCALG;QAAqB,EAAE,EAAf,MAAM;QACoB,MAAM,EAAhC,mBAAmB;QACmE,UAAU;KACxG,GAAU,OAAO,CAAC,sBAAsB,CAAC,CAmB3C;IAED;;;;;;OAMG;IACH,sDAJG;QAAsB,kBAAkB;QAClB,mBAAmB;KACzC,GAAU,OAAO,CAAC;QAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;KAAC,CAAC,CAkCjD;IAED;;;OAGG;IACH,oBAFa,MAAM,CAQlB;CACF;;;;;;;;;;;;;;;;;;;;;kBArLa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;;;;mBAC5E,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;;;;kBAC3D,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM;;;;YAChD,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,sBAAsB,GAAG,IAAI,GAAG,SAAS;;;;aAClI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,8BAA8B,KAAK,OAAO,CAAC,sBAAsB,EAAE,CAAC,GAAG,sBAAsB,EAAE;;;;kBAC9H,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;;;;;;;;;sBAK5E,MAAM;;;;WACN,MAAM;;;;;kCAIP,SAAS,GAAG,iBAAiB,GAAG,cAAc,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ;;;;;;;;eAKlF,MAAM;;;;kBACN,uBAAuB,EAAE;;;;QACzB,MAAM;;;;cACN,OAAO,sBAAsB,EAAE,YAAY;;;;cAC3C,MAAM;;;;YACN,mBAAmB;;;;;;;;eAEnB,MAAM"}
@@ -1,11 +1,3 @@
1
- // @ts-check
2
- const DEFAULT_STORAGE_KEY = "velocious.sync.localMutationLog";
3
- const PENDING_STATUS_VALUES = /** @type {LocalMutationStatus[]} */ (["pending", "applied-locally", "peer-applied"]);
4
- const PENDING_STATUSES = new Set(PENDING_STATUS_VALUES);
5
- const MUTATION_STATUSES = new Set([...PENDING_STATUSES, "conflict", "rejected", "synced"]);
6
- const TERMINAL_STATUSES = new Set(["rejected", "synced"]);
7
- /** @type {Map<string, Promise<unknown>>} */
8
- const STORAGE_KEY_LOCKS = new Map();
9
1
  /**
10
2
  * Local mutation log record query options.
11
3
  * @typedef {object} LocalMutationLogRecordsOptions
@@ -47,6 +39,14 @@ const STORAGE_KEY_LOCKS = new Map();
47
39
  * @property {Record<string, import("../configuration-types.js").FrontendModelSyncJsonValue>} [syncResult] - Backend replay/result metadata.
48
40
  * @property {string} updatedAt - ISO timestamp when the record was last changed.
49
41
  */
42
+ // @ts-check
43
+ const DEFAULT_STORAGE_KEY = "velocious.sync.localMutationLog";
44
+ const PENDING_STATUS_VALUES = /** @type {LocalMutationStatus[]} */ (["pending", "applied-locally", "peer-applied"]);
45
+ const PENDING_STATUSES = new Set(PENDING_STATUS_VALUES);
46
+ const MUTATION_STATUSES = new Set([...PENDING_STATUSES, "conflict", "rejected", "synced"]);
47
+ const TERMINAL_STATUSES = new Set(["rejected", "synced"]);
48
+ /** @type {Map<string, Promise<unknown>>} */
49
+ const STORAGE_KEY_LOCKS = new Map();
50
50
  /** Client-side append-only sync mutation log with pluggable persistent storage. */
51
51
  export default class LocalMutationLog {
52
52
  /**
@@ -400,4 +400,4 @@ function randomRecordId() {
400
400
  return cryptoProvider.randomUUID();
401
401
  return `local-mutation-${Date.now()}-${Math.random().toString(16).slice(2)}`;
402
402
  }
403
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtbXV0YXRpb24tbG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvbG9jYWwtbXV0YXRpb24tbG9nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixNQUFNLG1CQUFtQixHQUFHLGlDQUFpQyxDQUFBO0FBQzdELE1BQU0scUJBQXFCLEdBQUcsb0NBQW9DLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFBO0FBQ25ILE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQTtBQUN2RCxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7QUFDMUYsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO0FBQ3pELDRDQUE0QztBQUM1QyxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7QUFFbkM7Ozs7R0FJRztBQUVIOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7S0FHSztBQUVMOzs7Ozs7Ozs7OztHQVdHO0FBRUgsbUZBQW1GO0FBQ25GLE1BQU0sQ0FBQyxPQUFPLE9BQU8sZ0JBQWdCO0lBQ25DOzs7Ozs7O09BT0c7SUFDSCxZQUFZLEVBQUMsV0FBVyxHQUFHLGNBQWMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxHQUFHLG1CQUFtQixFQUFDO1FBQzNHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLGdIQUFnSCxDQUFDLENBQUE7UUFD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QU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmNvbnN0IERFRkFVTFRfU1RPUkFHRV9LRVkgPSBcInZlbG9jaW91cy5zeW5jLmxvY2FsTXV0YXRpb25Mb2dcIlxuY29uc3QgUEVORElOR19TVEFUVVNfVkFMVUVTID0gLyoqIEB0eXBlIHtMb2NhbE11dGF0aW9uU3RhdHVzW119ICovIChbXCJwZW5kaW5nXCIsIFwiYXBwbGllZC1sb2NhbGx5XCIsIFwicGVlci1hcHBsaWVkXCJdKVxuY29uc3QgUEVORElOR19TVEFUVVNFUyA9IG5ldyBTZXQoUEVORElOR19TVEFUVVNfVkFMVUVTKVxuY29uc3QgTVVUQVRJT05fU1RBVFVTRVMgPSBuZXcgU2V0KFsuLi5QRU5ESU5HX1NUQVRVU0VTLCBcImNvbmZsaWN0XCIsIFwicmVqZWN0ZWRcIiwgXCJzeW5jZWRcIl0pXG5jb25zdCBURVJNSU5BTF9TVEFUVVNFUyA9IG5ldyBTZXQoW1wicmVqZWN0ZWRcIiwgXCJzeW5jZWRcIl0pXG4vKiogQHR5cGUge01hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+fSAqL1xuY29uc3QgU1RPUkFHRV9LRVlfTE9DS1MgPSBuZXcgTWFwKClcblxuLyoqXG4gKiBMb2NhbCBtdXRhdGlvbiBsb2cgcmVjb3JkIHF1ZXJ5IG9wdGlvbnMuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2NhbE11dGF0aW9uTG9nUmVjb3Jkc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7TG9jYWxNdXRhdGlvblN0YXR1c1tdfSBbc3RhdHVzZXNdIC0gT3B0aW9uYWwgc3RhdHVzIGZpbHRlci5cbiAqL1xuXG4vKipcbiAqIExvY2FsIG11dGF0aW9uIGxvZyByb3ctb3JpZW50ZWQgc3RvcmFnZSBhZGFwdGVyLlxuICpcbiAqIEltcGxlbWVudGF0aW9ucyBzaG91bGQgc3RvcmUgZWFjaCBtdXRhdGlvbiBsb2cgcmVjb3JkIGFzIGl0cyBvd24gcm93L2VudHJ5LlxuICogTmF0aXZlIGFwcHMgc2hvdWxkIGJhY2sgdGhpcyB3aXRoIFNRTGl0ZSBhbmQgaW5kZXhlcyBvbiBzdG9yYWdlIGtleSwgc3RhdHVzLFxuICogYW5kIHNlcXVlbmNlLiBBdm9pZCBzdG9yaW5nIHRoZSB3aG9sZSBsb2cgYXMgb25lIEpTT04gYmxvYi5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IExvY2FsTXV0YXRpb25Mb2dTdG9yYWdlXG4gKiBAcHJvcGVydHkgeyhzdG9yYWdlS2V5OiBzdHJpbmcsIHJlY29yZDogTG9jYWxNdXRhdGlvbkxvZ1JlY29yZCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWR9IGFwcGVuZFJlY29yZCAtIEFwcGVuZHMgb25lIGxvZyByZWNvcmQuXG4gKiBAcHJvcGVydHkgeyhzdG9yYWdlS2V5OiBzdHJpbmcsIGlkczogc3RyaW5nW10pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkfSBkZWxldGVSZWNvcmRzIC0gRGVsZXRlcyBsb2cgcmVjb3JkcyBieSBpZC5cbiAqIEBwcm9wZXJ0eSB7KHN0b3JhZ2VLZXk6IHN0cmluZykgPT4gUHJvbWlzZTxudW1iZXI+IHwgbnVtYmVyfSBuZXh0U2VxdWVuY2UgLSBSZXR1cm5zIHRoZSBuZXh0IGxvY2FsIHNlcXVlbmNlIG51bWJlci5cbiAqIEBwcm9wZXJ0eSB7KHN0b3JhZ2VLZXk6IHN0cmluZywgaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxMb2NhbE11dGF0aW9uTG9nUmVjb3JkIHwgbnVsbCB8IHVuZGVmaW5lZD4gfCBMb2NhbE11dGF0aW9uTG9nUmVjb3JkIHwgbnVsbCB8IHVuZGVmaW5lZH0gcmVjb3JkIC0gUmVhZHMgb25lIGxvZyByZWNvcmQgYnkgaWQuXG4gKiBAcHJvcGVydHkgeyhzdG9yYWdlS2V5OiBzdHJpbmcsIG9wdGlvbnM/OiBMb2NhbE11dGF0aW9uTG9nUmVjb3Jkc09wdGlvbnMpID0+IFByb21pc2U8TG9jYWxNdXRhdGlvbkxvZ1JlY29yZFtdPiB8IExvY2FsTXV0YXRpb25Mb2dSZWNvcmRbXX0gcmVjb3JkcyAtIFJlYWRzIGxvZyByZWNvcmRzLlxuICogQHByb3BlcnR5IHsoc3RvcmFnZUtleTogc3RyaW5nLCByZWNvcmQ6IExvY2FsTXV0YXRpb25Mb2dSZWNvcmQpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkfSB1cGRhdGVSZWNvcmQgLSBSZXBsYWNlcyBvbmUgbG9nIHJlY29yZC5cbiAqL1xuXG4vKipcbiAqIExvY2FsIHN5bmMgbXV0YXRpb24gZGVwZW5kZW5jeSBtZXRhZGF0YS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IExvY2FsTXV0YXRpb25EZXBlbmRlbmN5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2xpZW50TXV0YXRpb25JZCAtIENsaWVudCBtdXRhdGlvbiBpZCB0aGlzIG11dGF0aW9uIGRlcGVuZHMgb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kZWwgLSBEZXBlbmRlbnQgbW9kZWwvcmVzb3VyY2UgbmFtZS5cbiAqL1xuXG4vKipcbiAqIExvY2FsIG11dGF0aW9uIGxvZyBzdGF0dXMuXG4gKiBAdHlwZWRlZiB7XCJwZW5kaW5nXCIgfCBcImFwcGxpZWQtbG9jYWxseVwiIHwgXCJwZWVyLWFwcGxpZWRcIiB8IFwiY29uZmxpY3RcIiB8IFwicmVqZWN0ZWRcIiB8IFwic3luY2VkXCJ9IExvY2FsTXV0YXRpb25TdGF0dXNcbiAqICovXG5cbi8qKlxuICogTG9jYWwgbXV0YXRpb24gbG9nIHJlY29yZC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IExvY2FsTXV0YXRpb25Mb2dSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjcmVhdGVkQXQgLSBJU08gdGltZXN0YW1wIHdoZW4gdGhlIHJlY29yZCB3YXMgY3JlYXRlZCBsb2NhbGx5LlxuICogQHByb3BlcnR5IHtMb2NhbE11dGF0aW9uRGVwZW5kZW5jeVtdfSBkZXBlbmRlbmNpZXMgLSBPdGhlciBsb2NhbCBtdXRhdGlvbnMgdGhhdCBtdXN0IHJlcGxheSBmaXJzdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIExvY2FsIGxvZyByZWNvcmQgaWQuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gbXV0YXRpb24gLSBEZXZpY2UgbXV0YXRpb24gcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzZXF1ZW5jZSAtIE1vbm90b25pYyBsb2NhbCBzZXF1ZW5jZS5cbiAqIEBwcm9wZXJ0eSB7TG9jYWxNdXRhdGlvblN0YXR1c30gc3RhdHVzIC0gTG9jYWwgcmVwbGF5L2FwcGx5IHN0YXR1cy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IFtzeW5jUmVzdWx0XSAtIEJhY2tlbmQgcmVwbGF5L3Jlc3VsdCBtZXRhZGF0YS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cGRhdGVkQXQgLSBJU08gdGltZXN0YW1wIHdoZW4gdGhlIHJlY29yZCB3YXMgbGFzdCBjaGFuZ2VkLlxuICovXG5cbi8qKiBDbGllbnQtc2lkZSBhcHBlbmQtb25seSBzeW5jIG11dGF0aW9uIGxvZyB3aXRoIHBsdWdnYWJsZSBwZXJzaXN0ZW50IHN0b3JhZ2UuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2NhbE11dGF0aW9uTG9nIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBsb2NhbCBtdXRhdGlvbiBsb2cuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0geygpID0+IHN0cmluZ30gW2FyZ3MuaWRHZW5lcmF0b3JdIC0gUmVjb3JkIGlkIGdlbmVyYXRvci5cbiAgICogQHBhcmFtIHsoKSA9PiBEYXRlfSBbYXJncy5ub3ddIC0gQ2xvY2sgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7TG9jYWxNdXRhdGlvbkxvZ1N0b3JhZ2V9IGFyZ3Muc3RvcmFnZSAtIFBlcnNpc3RlbnQgc3RvcmFnZSBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3Muc3RvcmFnZUtleV0gLSBTdG9yYWdlIGtleS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtpZEdlbmVyYXRvciA9IHJhbmRvbVJlY29yZElkLCBub3cgPSAoKSA9PiBuZXcgRGF0ZSgpLCBzdG9yYWdlLCBzdG9yYWdlS2V5ID0gREVGQVVMVF9TVE9SQUdFX0tFWX0pIHtcbiAgICBpZiAoIXZhbGlkU3RvcmFnZShzdG9yYWdlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9jYWxNdXRhdGlvbkxvZyByZXF1aXJlcyByb3cgc3RvcmFnZSB3aXRoIGFwcGVuZFJlY29yZC9kZWxldGVSZWNvcmRzL25leHRTZXF1ZW5jZS9yZWNvcmQvcmVjb3Jkcy91cGRhdGVSZWNvcmRcIilcbiAgICB9XG5cbiAgICB0aGlzLmlkR2VuZXJhdG9yID0gaWRHZW5lcmF0b3JcbiAgICB0aGlzLm5vdyA9IG5vd1xuICAgIHRoaXMuc3RvcmFnZSA9IHN0b3JhZ2VcbiAgICB0aGlzLnN0b3JhZ2VLZXkgPSBzdG9yYWdlS2V5XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIHBlbmRpbmcgbXV0YXRpb24gcmVjb3JkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtMb2NhbE11dGF0aW9uRGVwZW5kZW5jeVtdfSBbYXJncy5kZXBlbmRlbmNpZXNdIC0gTXV0YXRpb24gZGVwZW5kZW5jaWVzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE11dGF0aW9uIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvY2FsTXV0YXRpb25Mb2dSZWNvcmQ+fSAtIENyZWF0ZWQgbG9nIHJlY29yZC5cbiAgICovXG4gIGFzeW5jIGFwcGVuZCh7ZGVwZW5kZW5jaWVzID0gW10sIG11dGF0aW9ufSkge1xuICAgIHJldHVybiBhd2FpdCB3aXRoU3RvcmFnZUtleUxvY2sodGhpcy5zdG9yYWdlS2V5LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSB0aGlzLmN1cnJlbnRUaW1lc3RhbXAoKVxuICAgICAgY29uc3QgcmVjb3JkID0gbm9ybWFsaXplUmVjb3JkKHtcbiAgICAgICAgY3JlYXRlZEF0OiB0aW1lc3RhbXAsXG4gICAgICAgIGRlcGVuZGVuY2llcyxcbiAgICAgICAgaWQ6IHRoaXMuaWRHZW5lcmF0b3IoKSxcbiAgICAgICAgbXV0YXRpb24sXG4gICAgICAgIHNlcXVlbmNlOiBhd2FpdCB0aGlzLnN0b3JhZ2UubmV4dFNlcXVlbmNlKHRoaXMuc3RvcmFnZUtleSksXG4gICAgICAgIHN0YXR1czogXCJwZW5kaW5nXCIsXG4gICAgICAgIHVwZGF0ZWRBdDogdGltZXN0YW1wXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0aGlzLnN0b3JhZ2UuYXBwZW5kUmVjb3JkKHRoaXMuc3RvcmFnZUtleSwgY2xvbmVSZWNvcmQocmVjb3JkKSlcblxuICAgICAgcmV0dXJuIGNsb25lUmVjb3JkKHJlY29yZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIHJlY29yZHMgb3JkZXJlZCBieSBsb2NhbCBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8TG9jYWxNdXRhdGlvbkxvZ1JlY29yZFtdPn0gLSBMb2cgcmVjb3Jkcy5cbiAgICovXG4gIGFzeW5jIHJlY29yZHMoKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVJlY29yZExpc3QoYXdhaXQgdGhpcy5zdG9yYWdlLnJlY29yZHModGhpcy5zdG9yYWdlS2V5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHJlY29yZHMgdGhhdCBzdGlsbCBuZWVkIGxvY2FsL3NlcnZlciByZWNvbmNpbGlhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8TG9jYWxNdXRhdGlvbkxvZ1JlY29yZFtdPn0gLSBQZW5kaW5nIHJlY29yZHMuXG4gICAqL1xuICBhc3luYyBwZW5kaW5nUmVjb3JkcygpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplUmVjb3JkTGlzdChhd2FpdCB0aGlzLnN0b3JhZ2UucmVjb3Jkcyh0aGlzLnN0b3JhZ2VLZXksIHtzdGF0dXNlczogUEVORElOR19TVEFUVVNfVkFMVUVTfSkpXG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBhIHJlY29yZCBzdGF0dXMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5pZCAtIFJlY29yZCBpZC5cbiAgICogQHBhcmFtIHtMb2NhbE11dGF0aW9uU3RhdHVzfSBhcmdzLnN0YXR1cyAtIE5ldyBzdGF0dXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IFthcmdzLnN5bmNSZXN1bHRdIC0gUmVzdWx0IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2NhbE11dGF0aW9uTG9nUmVjb3JkPn0gLSBVcGRhdGVkIHJlY29yZC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZVN0YXR1cyh7aWQsIHN0YXR1cywgc3luY1Jlc3VsdH0pIHtcbiAgICBpZiAoIU1VVEFUSU9OX1NUQVRVU0VTLmhhcyhzdGF0dXMpKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbG9jYWwgbXV0YXRpb24gc3RhdHVzICcke3N0YXR1c30nYClcblxuICAgIHJldHVybiBhd2FpdCB3aXRoU3RvcmFnZUtleUxvY2sodGhpcy5zdG9yYWdlS2V5LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByYXdSZWNvcmQgPSBhd2FpdCB0aGlzLnN0b3JhZ2UucmVjb3JkKHRoaXMuc3RvcmFnZUtleSwgaWQpXG5cbiAgICAgIGlmICghcmF3UmVjb3JkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIGxvY2FsIG11dGF0aW9uIGxvZyByZWNvcmQgJyR7aWR9J2ApXG5cbiAgICAgIGNvbnN0IHJlY29yZCA9IG5vcm1hbGl6ZVJlY29yZChyYXdSZWNvcmQpXG5cbiAgICAgIHJlY29yZC5zdGF0dXMgPSAvKiogQHR5cGUge0xvY2FsTXV0YXRpb25TdGF0dXN9ICovIChzdGF0dXMpXG4gICAgICBpZiAoc3luY1Jlc3VsdCAhPT0gdW5kZWZpbmVkKSByZWNvcmQuc3luY1Jlc3VsdCA9IGNsb25lSnNvbk9iamVjdChzeW5jUmVzdWx0LCBcInN5bmNSZXN1bHRcIilcbiAgICAgIHJlY29yZC51cGRhdGVkQXQgPSB0aGlzLmN1cnJlbnRUaW1lc3RhbXAoKVxuICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlLnVwZGF0ZVJlY29yZCh0aGlzLnN0b3JhZ2VLZXksIGNsb25lUmVjb3JkKHJlY29yZCkpXG5cbiAgICAgIHJldHVybiBjbG9uZVJlY29yZChyZWNvcmQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQcnVuZXMgdGVybWluYWwgcmVjb3JkcyB0aGF0IGFyZSBubyBsb25nZXIgbmVlZGVkIGZvciByZXBsYXkgZGVwZW5kZW5jaWVzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gQ29tcGFjdGlvbiBvcHRpb25zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MubWF4VGVybWluYWxSZWNvcmRzXSAtIE1heGltdW0gdGVybWluYWwgcmVjb3JkcyB0byByZXRhaW4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy50ZXJtaW5hbFJldGVudGlvbk1zXSAtIE1pbmltdW0gYWdlIGJlZm9yZSBwcnVuaW5nIHRlcm1pbmFsIHJlY29yZHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtkZWxldGVkUmVjb3JkSWRzOiBzdHJpbmdbXX0+fSAtIENvbXBhY3Rpb24gcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgY29tcGFjdCh7bWF4VGVybWluYWxSZWNvcmRzLCB0ZXJtaW5hbFJldGVudGlvbk1zfSA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHdpdGhTdG9yYWdlS2V5TG9jayh0aGlzLnN0b3JhZ2VLZXksIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLnJlY29yZHMoKVxuICAgICAgY29uc3QgcHJvdGVjdGVkQ2xpZW50TXV0YXRpb25JZHMgPSBuZXcgU2V0KFxuICAgICAgICByZWNvcmRzXG4gICAgICAgICAgLmZpbHRlcigocmVjb3JkKSA9PiBQRU5ESU5HX1NUQVRVU0VTLmhhcyhyZWNvcmQuc3RhdHVzKSB8fCByZWNvcmQuc3RhdHVzID09PSBcImNvbmZsaWN0XCIpXG4gICAgICAgICAgLmZsYXRNYXAoKHJlY29yZCkgPT4gcmVjb3JkLmRlcGVuZGVuY2llcy5tYXAoKGRlcGVuZGVuY3kpID0+IGRlcGVuZGVuY3kuY2xpZW50TXV0YXRpb25JZCkpXG4gICAgICApXG4gICAgICBjb25zdCB0ZXJtaW5hbFJlY29yZHMgPSByZWNvcmRzXG4gICAgICAgIC5maWx0ZXIoKHJlY29yZCkgPT4gVEVSTUlOQUxfU1RBVFVTRVMuaGFzKHJlY29yZC5zdGF0dXMpKVxuICAgICAgICAuZmlsdGVyKChyZWNvcmQpID0+ICFwcm90ZWN0ZWRDbGllbnRNdXRhdGlvbklkcy5oYXMocmVjb3JkLm11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQpKVxuICAgICAgICAuc29ydChjb21wYXJlUmVjb3Jkc05ld2VzdEZpcnN0KVxuICAgICAgY29uc3QgZGVsZXRlSWRzID0gbmV3IFNldCgpXG5cbiAgICAgIGlmICh0eXBlb2YgbWF4VGVybWluYWxSZWNvcmRzID09PSBcIm51bWJlclwiICYmIG1heFRlcm1pbmFsUmVjb3JkcyA+PSAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHRlcm1pbmFsUmVjb3Jkcy5zbGljZShtYXhUZXJtaW5hbFJlY29yZHMpKSBkZWxldGVJZHMuYWRkKHJlY29yZC5pZClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0ZXJtaW5hbFJldGVudGlvbk1zID09PSBcIm51bWJlclwiICYmIHRlcm1pbmFsUmV0ZW50aW9uTXMgPj0gMCkge1xuICAgICAgICBjb25zdCBjdXRvZmYgPSB0aGlzLm5vdygpLmdldFRpbWUoKSAtIHRlcm1pbmFsUmV0ZW50aW9uTXNcblxuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiB0ZXJtaW5hbFJlY29yZHMpIHtcbiAgICAgICAgICBpZiAobmV3IERhdGUocmVjb3JkLnVwZGF0ZWRBdCkuZ2V0VGltZSgpIDwgY3V0b2ZmKSBkZWxldGVJZHMuYWRkKHJlY29yZC5pZClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWxldGVkUmVjb3JkSWRzID0gQXJyYXkuZnJvbShkZWxldGVJZHMpXG5cbiAgICAgIGlmIChkZWxldGVkUmVjb3JkSWRzLmxlbmd0aCA+IDApIGF3YWl0IHRoaXMuc3RvcmFnZS5kZWxldGVSZWNvcmRzKHRoaXMuc3RvcmFnZUtleSwgZGVsZXRlZFJlY29yZElkcylcblxuICAgICAgcmV0dXJuIHtkZWxldGVkUmVjb3JkSWRzfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBsb2cgdGltZXN0YW1wLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEN1cnJlbnQgSVNPIHRpbWVzdGFtcC5cbiAgICovXG4gIGN1cnJlbnRUaW1lc3RhbXAoKSB7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMubm93KClcblxuICAgIGlmICghKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSB8fCBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB0aHJvdyBuZXcgRXJyb3IoXCJMb2NhbE11dGF0aW9uTG9nIG5vdygpIG11c3QgcmV0dXJuIGEgdmFsaWQgRGF0ZVwiKVxuXG4gICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBzdG9yYWdlIGFkYXB0ZXIgaGFzIGFsbCByZXF1aXJlZCByb3ctc3RvcmUgbWV0aG9kcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gc3RvcmFnZSAtIFN0b3JhZ2UgYWRhcHRlciBjYW5kaWRhdGUuXG4gKiBAcmV0dXJucyB7c3RvcmFnZSBpcyBMb2NhbE11dGF0aW9uTG9nU3RvcmFnZX0gLSBXaGV0aGVyIHN0b3JhZ2UgaXMgdmFsaWQuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkU3RvcmFnZShzdG9yYWdlKSB7XG4gIGlmICghc3RvcmFnZSB8fCB0eXBlb2Ygc3RvcmFnZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3Qgc3RvcmFnZU9iamVjdCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChzdG9yYWdlKVxuXG4gIHJldHVybiB0eXBlb2Ygc3RvcmFnZU9iamVjdC5hcHBlbmRSZWNvcmQgPT09IFwiZnVuY3Rpb25cIlxuICAgICYmIHR5cGVvZiBzdG9yYWdlT2JqZWN0LmRlbGV0ZVJlY29yZHMgPT09IFwiZnVuY3Rpb25cIlxuICAgICYmIHR5cGVvZiBzdG9yYWdlT2JqZWN0Lm5leHRTZXF1ZW5jZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgJiYgdHlwZW9mIHN0b3JhZ2VPYmplY3QucmVjb3JkID09PSBcImZ1bmN0aW9uXCJcbiAgICAmJiB0eXBlb2Ygc3RvcmFnZU9iamVjdC5yZWNvcmRzID09PSBcImZ1bmN0aW9uXCJcbiAgICAmJiB0eXBlb2Ygc3RvcmFnZU9iamVjdC51cGRhdGVSZWNvcmQgPT09IFwiZnVuY3Rpb25cIlxufVxuXG4vKipcbiAqIFNvcnRzIHJlY29yZHMgYnkgbmV3ZXN0IHVwZGF0ZS9zZXF1ZW5jZSBmaXJzdC5cbiAqIEBwYXJhbSB7TG9jYWxNdXRhdGlvbkxvZ1JlY29yZH0gbGVmdCAtIExlZnQgcmVjb3JkLlxuICogQHBhcmFtIHtMb2NhbE11dGF0aW9uTG9nUmVjb3JkfSByaWdodCAtIFJpZ2h0IHJlY29yZC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gU29ydCByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVSZWNvcmRzTmV3ZXN0Rmlyc3QobGVmdCwgcmlnaHQpIHtcbiAgY29uc3QgdXBkYXRlZEF0Q29tcGFyaXNvbiA9IHJpZ2h0LnVwZGF0ZWRBdC5sb2NhbGVDb21wYXJlKGxlZnQudXBkYXRlZEF0KVxuXG4gIGlmICh1cGRhdGVkQXRDb21wYXJpc29uICE9PSAwKSByZXR1cm4gdXBkYXRlZEF0Q29tcGFyaXNvblxuXG4gIHJldHVybiByaWdodC5zZXF1ZW5jZSAtIGxlZnQuc2VxdWVuY2Vcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGFuZCBzb3J0cyBhIGxpc3Qgb2YgcmVjb3Jkcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gcmVjb3JkcyAtIFJhdyByZWNvcmRzLlxuICogQHJldHVybnMge0xvY2FsTXV0YXRpb25Mb2dSZWNvcmRbXX0gLSBOb3JtYWxpemVkIHJlY29yZHMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlY29yZExpc3QocmVjb3Jkcykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkocmVjb3JkcykpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGxvY2FsIG11dGF0aW9uIGxvZyBzdG9yYWdlIHJlY29yZHMgYXJyYXlcIilcblxuICByZXR1cm4gcmVjb3Jkc1xuICAgIC5tYXAobm9ybWFsaXplUmVjb3JkKVxuICAgIC5zb3J0KChsZWZ0LCByaWdodCkgPT4gbGVmdC5zZXF1ZW5jZSAtIHJpZ2h0LnNlcXVlbmNlKVxuICAgIC5tYXAoKHJlY29yZCkgPT4gY2xvbmVSZWNvcmQocmVjb3JkKSlcbn1cblxuLyoqXG4gKiBSdW5zIGEgY2FsbGJhY2sgYWZ0ZXIgZWFybGllciB3cml0ZXMgZm9yIHRoZSBzYW1lIHN0b3JhZ2Uga2V5IGhhdmUgY29tcGxldGVkLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdG9yYWdlS2V5IC0gU3RvcmFnZSBrZXkgdG8gc2VyaWFsaXplLlxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHJ1biB1bmRlciB0aGUgc3RvcmFnZS1rZXkgbG9jay5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2l0aFN0b3JhZ2VLZXlMb2NrKHN0b3JhZ2VLZXksIGNhbGxiYWNrKSB7XG4gIGNvbnN0IHByZXZpb3VzID0gU1RPUkFHRV9LRVlfTE9DS1MuZ2V0KHN0b3JhZ2VLZXkpIHx8IFByb21pc2UucmVzb2x2ZSgpXG4gIGxldCByZWxlYXNlID0gKCkgPT4ge31cbiAgY29uc3QgY3VycmVudCA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7IHJlbGVhc2UgPSAoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkgfSlcbiAgY29uc3QgY2hhaW5lZCA9IHByZXZpb3VzLmNhdGNoKChfZXJyb3IpID0+IHt9KS50aGVuKCgpID0+IGN1cnJlbnQpXG5cbiAgU1RPUkFHRV9LRVlfTE9DS1Muc2V0KHN0b3JhZ2VLZXksIGNoYWluZWQpXG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBwcmV2aW91cy5jYXRjaCgoX2Vycm9yKSA9PiB7fSlcblxuICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpXG4gIH0gZmluYWxseSB7XG4gICAgcmVsZWFzZSgpXG4gICAgaWYgKFNUT1JBR0VfS0VZX0xPQ0tTLmdldChzdG9yYWdlS2V5KSA9PT0gY2hhaW5lZCkgU1RPUkFHRV9LRVlfTE9DS1MuZGVsZXRlKHN0b3JhZ2VLZXkpXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgcGVyc2lzdGVkIGxvZyByZWNvcmQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmF3IHJlY29yZC5cbiAqIEByZXR1cm5zIHtMb2NhbE11dGF0aW9uTG9nUmVjb3JkfSAtIE5vcm1hbGl6ZWQgcmVjb3JkLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSZWNvcmQodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGxvY2FsIG11dGF0aW9uIGxvZyByZWNvcmQgb2JqZWN0XCIpXG5cbiAgY29uc3QgcmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHZhbHVlKVxuICBjb25zdCBzdGF0dXMgPSByZXF1aXJlZFN0cmluZyhyZWNvcmQuc3RhdHVzLCBcInN0YXR1c1wiKVxuXG4gIGlmICghTVVUQVRJT05fU1RBVFVTRVMuaGFzKHN0YXR1cykpIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBsb2NhbCBtdXRhdGlvbiBzdGF0dXMgJyR7c3RhdHVzfSdgKVxuXG4gIGNvbnN0IGJhc2VSZWNvcmQgPSB7XG4gICAgY3JlYXRlZEF0OiByZXF1aXJlZElzb1RpbWVzdGFtcChyZWNvcmQuY3JlYXRlZEF0LCBcImNyZWF0ZWRBdFwiKSxcbiAgICBkZXBlbmRlbmNpZXM6IG5vcm1hbGl6ZURlcGVuZGVuY2llcyhyZWNvcmQuZGVwZW5kZW5jaWVzKSxcbiAgICBpZDogcmVxdWlyZWRTdHJpbmcocmVjb3JkLmlkLCBcImlkXCIpLFxuICAgIG11dGF0aW9uOiBub3JtYWxpemVNdXRhdGlvbihyZWNvcmQubXV0YXRpb24pLFxuICAgIHNlcXVlbmNlOiByZXF1aXJlZFBvc2l0aXZlSW50ZWdlcihyZWNvcmQuc2VxdWVuY2UsIFwic2VxdWVuY2VcIiksXG4gICAgc3RhdHVzOiAvKiogQHR5cGUge0xvY2FsTXV0YXRpb25TdGF0dXN9ICovIChzdGF0dXMpLFxuICAgIHVwZGF0ZWRBdDogcmVxdWlyZWRJc29UaW1lc3RhbXAocmVjb3JkLnVwZGF0ZWRBdCwgXCJ1cGRhdGVkQXRcIilcbiAgfVxuXG4gIGlmIChyZWNvcmQuc3luY1Jlc3VsdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYmFzZVJlY29yZFxuXG4gIHJldHVybiB7XG4gICAgLi4uYmFzZVJlY29yZCxcbiAgICBzeW5jUmVzdWx0OiBjbG9uZUpzb25PYmplY3QocmVjb3JkLnN5bmNSZXN1bHQsIFwic3luY1Jlc3VsdFwiKVxuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBkZXBlbmRlbmN5IG1ldGFkYXRhIGVudHJpZXMuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmF3IGRlcGVuZGVuY2llcy5cbiAqIEByZXR1cm5zIHtMb2NhbE11dGF0aW9uRGVwZW5kZW5jeVtdfSAtIE5vcm1hbGl6ZWQgZGVwZW5kZW5jaWVzLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVEZXBlbmRlbmNpZXModmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBbXVxuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBsb2NhbCBtdXRhdGlvbiBkZXBlbmRlbmNpZXMgYXJyYXlcIilcblxuICByZXR1cm4gdmFsdWUubWFwKChkZXBlbmRlbmN5KSA9PiB7XG4gICAgaWYgKCFkZXBlbmRlbmN5IHx8IHR5cGVvZiBkZXBlbmRlbmN5ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZGVwZW5kZW5jeSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGxvY2FsIG11dGF0aW9uIGRlcGVuZGVuY3kgb2JqZWN0XCIpXG4gICAgfVxuXG4gICAgY29uc3QgZGVwZW5kZW5jeU9iamVjdCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChkZXBlbmRlbmN5KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNsaWVudE11dGF0aW9uSWQ6IHJlcXVpcmVkU3RyaW5nKGRlcGVuZGVuY3lPYmplY3QuY2xpZW50TXV0YXRpb25JZCwgXCJkZXBlbmRlbmN5IGNsaWVudE11dGF0aW9uSWRcIiksXG4gICAgICBtb2RlbDogcmVxdWlyZWRTdHJpbmcoZGVwZW5kZW5jeU9iamVjdC5tb2RlbCwgXCJkZXBlbmRlbmN5IG1vZGVsXCIpXG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBzeW5jIG11dGF0aW9uIHBheWxvYWQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmF3IG11dGF0aW9uLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gLSBOb3JtYWxpemVkIG11dGF0aW9uLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVNdXRhdGlvbih2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbG9jYWwgc3luYyBtdXRhdGlvbiBvYmplY3RcIilcblxuICBjb25zdCBtdXRhdGlvbiA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSlcbiAgY29uc3Qgbm9ybWFsaXplZCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuU3luY011dGF0aW9ufSAqLyAoe1xuICAgIGFjdG9yRGV2aWNlSWQ6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLmFjdG9yRGV2aWNlSWQsIFwiYWN0b3JEZXZpY2VJZFwiKSxcbiAgICBhY3RvclVzZXJJZDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uYWN0b3JVc2VySWQsIFwiYWN0b3JVc2VySWRcIiksXG4gICAgY2xpZW50TXV0YXRpb25JZDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCwgXCJjbGllbnRNdXRhdGlvbklkXCIpLFxuICAgIG1vZGVsOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5tb2RlbCwgXCJtb2RlbFwiKSxcbiAgICBvY2N1cnJlZEF0OiByZXF1aXJlZElzb1RpbWVzdGFtcChtdXRhdGlvbi5vY2N1cnJlZEF0LCBcIm9jY3VycmVkQXRcIiksXG4gICAgb2ZmbGluZUdyYW50SWQ6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLm9mZmxpbmVHcmFudElkLCBcIm9mZmxpbmVHcmFudElkXCIpLFxuICAgIG9wZXJhdGlvbjogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24ub3BlcmF0aW9uLCBcIm9wZXJhdGlvblwiKSxcbiAgICBwb2xpY3lIYXNoOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5wb2xpY3lIYXNoLCBcInBvbGljeUhhc2hcIilcbiAgfSlcblxuICBpZiAobXV0YXRpb24uYXR0cmlidXRlcyAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLmF0dHJpYnV0ZXMgPSBjbG9uZUpzb25PYmplY3QobXV0YXRpb24uYXR0cmlidXRlcywgXCJhdHRyaWJ1dGVzXCIpXG4gIGlmIChtdXRhdGlvbi5iYXNlVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLmJhc2VWZXJzaW9uID0gY2xvbmVCYXNlVmVyc2lvbihtdXRhdGlvbi5iYXNlVmVyc2lvbilcbiAgaWYgKG11dGF0aW9uLmNvbW1hbmQgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5jb21tYW5kID0gcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uY29tbWFuZCwgXCJjb21tYW5kXCIpXG4gIGlmIChtdXRhdGlvbi5wYXlsb2FkICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQucGF5bG9hZCA9IGNsb25lSnNvbk9iamVjdChtdXRhdGlvbi5wYXlsb2FkLCBcInBheWxvYWRcIilcblxuICByZXR1cm4gbm9ybWFsaXplZFxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGEgbm9uLWVtcHR5IHN0cmluZyB2YWx1ZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBSYXcgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBGaWVsZCBsYWJlbC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUmVxdWlyZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiByZXF1aXJlZFN0cmluZyh2YWx1ZSwgbGFiZWwpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiB8fCB2YWx1ZS5sZW5ndGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGxvY2FsIG11dGF0aW9uICR7bGFiZWx9YClcblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBSZXF1aXJlcyBhbiBJU08gdGltZXN0YW1wIHN0cmluZy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBSYXcgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBGaWVsZCBsYWJlbC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSVNPIHRpbWVzdGFtcC5cbiAqL1xuZnVuY3Rpb24gcmVxdWlyZWRJc29UaW1lc3RhbXAodmFsdWUsIGxhYmVsKSB7XG4gIGNvbnN0IHN0cmluZ1ZhbHVlID0gcmVxdWlyZWRTdHJpbmcodmFsdWUsIGxhYmVsKVxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoc3RyaW5nVmFsdWUpXG5cbiAgaWYgKE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgfHwgZGF0ZS50b0lTT1N0cmluZygpICE9PSBzdHJpbmdWYWx1ZSkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBsb2NhbCBtdXRhdGlvbiAke2xhYmVsfSBJU08gdGltZXN0YW1wYClcblxuICByZXR1cm4gc3RyaW5nVmFsdWVcbn1cblxuLyoqXG4gKiBSZXF1aXJlcyBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWUuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmF3IHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIC0gRmllbGQgbGFiZWwuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIFBvc2l0aXZlIGludGVnZXIuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVkUG9zaXRpdmVJbnRlZ2VyKHZhbHVlLCBsYWJlbCkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSB8fCB2YWx1ZSA8IDEpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbG9jYWwgbXV0YXRpb24gJHtsYWJlbH0gcG9zaXRpdmUgaW50ZWdlcmApXG5cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogQ2xvbmVzIGEgc3VwcG9ydGVkIGJhc2UtdmVyc2lvbiB2YWx1ZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBSYXcgYmFzZSB2ZXJzaW9uLlxuICogQHJldHVybnMge3N0cmluZyB8IG51bWJlciB8IG51bGx9IC0gTm9ybWFsaXplZCBiYXNlIHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGNsb25lQmFzZVZlcnNpb24odmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiB2YWx1ZVxuXG4gIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGxvY2FsIG11dGF0aW9uIGJhc2VWZXJzaW9uIHN0cmluZywgbnVtYmVyLCBvciBudWxsXCIpXG59XG5cbi8qKlxuICogQ2xvbmVzIGEgSlNPTi1jb21wYXRpYmxlIHZhbHVlLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFJhdyBKU09OIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIC0gRmllbGQgbGFiZWwuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZX0gLSBDbG9uZWQgSlNPTiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gY2xvbmVKc29uVmFsdWUodmFsdWUsIGxhYmVsKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIEpTT04tY29tcGF0aWJsZSBsb2NhbCBtdXRhdGlvbiAke2xhYmVsfWApXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZX0gKi8gKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWUpKSlcbn1cblxuLyoqXG4gKiBDbG9uZXMgYSBKU09OLWNvbXBhdGlibGUgb2JqZWN0LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFJhdyBKU09OIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIEZpZWxkIGxhYmVsLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAtIENsb25lZCBKU09OIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gY2xvbmVKc29uT2JqZWN0KHZhbHVlLCBsYWJlbCkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBsb2NhbCBtdXRhdGlvbiAke2xhYmVsfSBvYmplY3RgKVxuXG4gIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAqLyAoY2xvbmVKc29uVmFsdWUodmFsdWUsIGxhYmVsKSlcbn1cblxuLyoqXG4gKiBDbG9uZXMgYSBsb2NhbCBtdXRhdGlvbiBsb2cgcmVjb3JkLlxuICogQHBhcmFtIHtMb2NhbE11dGF0aW9uTG9nUmVjb3JkfSByZWNvcmQgLSBSZWNvcmQgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7TG9jYWxNdXRhdGlvbkxvZ1JlY29yZH0gLSBDbG9uZWQgcmVjb3JkLlxuICovXG5mdW5jdGlvbiBjbG9uZVJlY29yZChyZWNvcmQpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7TG9jYWxNdXRhdGlvbkxvZ1JlY29yZH0gKi8gKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVjb3JkKSkpXG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIGxvY2FsIG11dGF0aW9uIHJlY29yZCBpZC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUmFuZG9tIHJlY29yZCBpZC5cbiAqL1xuZnVuY3Rpb24gcmFuZG9tUmVjb3JkSWQoKSB7XG4gIGNvbnN0IGNyeXB0b1Byb3ZpZGVyID0gZ2xvYmFsVGhpcy5jcnlwdG9cblxuICBpZiAoY3J5cHRvUHJvdmlkZXIgJiYgdHlwZW9mIGNyeXB0b1Byb3ZpZGVyLnJhbmRvbVVVSUQgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGNyeXB0b1Byb3ZpZGVyLnJhbmRvbVVVSUQoKVxuXG4gIHJldHVybiBgbG9jYWwtbXV0YXRpb24tJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpLnNsaWNlKDIpfWBcbn1cbiJdfQ==
403
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtbXV0YXRpb24tbG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvbG9jYWwtbXV0YXRpb24tbG9nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0g7Ozs7O0dBS0c7QUFDSDs7O0tBR0s7QUFDTDs7Ozs7Ozs7Ozs7R0FXRztBQUNILFlBQVk7QUFFWixNQUFNLG1CQUFtQixHQUFHLGlDQUFpQyxDQUFBO0FBQzdELE1BQU0scUJBQXFCLEdBQUcsb0NBQW9DLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFBO0FBQ25ILE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQTtBQUN2RCxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7QUFDMUYsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO0FBQ3pELDRDQUE0QztBQUM1QyxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7QUFFbkMsbUZBQW1GO0FBQ25GLE1BQU0sQ0FBQyxPQUFPLE9BQU8sZ0JBQWdCO0lBQ25DOzs7Ozs7O09BT0c7SUFDSCxZQUFZLEVBQUMsV0FBVyxHQUFHLGNBQWMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxHQUFHLG1CQUFtQixFQUFDO1FBQzNHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLGdIQUFnSCxDQUFDLENBQUE7UUFD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QU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMb2NhbCBtdXRhdGlvbiBsb2cgcmVjb3JkIHF1ZXJ5IG9wdGlvbnMuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2NhbE11dGF0aW9uTG9nUmVjb3Jkc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7TG9jYWxNdXRhdGlvblN0YXR1c1tdfSBbc3RhdHVzZXNdIC0gT3B0aW9uYWwgc3RhdHVzIGZpbHRlci5cbiAqL1xuLyoqXG4gKiBMb2NhbCBtdXRhdGlvbiBsb2cgcm93LW9yaWVudGVkIHN0b3JhZ2UgYWRhcHRlci5cbiAqXG4gKiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHN0b3JlIGVhY2ggbXV0YXRpb24gbG9nIHJlY29yZCBhcyBpdHMgb3duIHJvdy9lbnRyeS5cbiAqIE5hdGl2ZSBhcHBzIHNob3VsZCBiYWNrIHRoaXMgd2l0aCBTUUxpdGUgYW5kIGluZGV4ZXMgb24gc3RvcmFnZSBrZXksIHN0YXR1cyxcbiAqIGFuZCBzZXF1ZW5jZS4gQXZvaWQgc3RvcmluZyB0aGUgd2hvbGUgbG9nIGFzIG9uZSBKU09OIGJsb2IuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2NhbE11dGF0aW9uTG9nU3RvcmFnZVxuICogQHByb3BlcnR5IHsoc3RvcmFnZUtleTogc3RyaW5nLCByZWNvcmQ6IExvY2FsTXV0YXRpb25Mb2dSZWNvcmQpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkfSBhcHBlbmRSZWNvcmQgLSBBcHBlbmRzIG9uZSBsb2cgcmVjb3JkLlxuICogQHByb3BlcnR5IHsoc3RvcmFnZUtleTogc3RyaW5nLCBpZHM6IHN0cmluZ1tdKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZH0gZGVsZXRlUmVjb3JkcyAtIERlbGV0ZXMgbG9nIHJlY29yZHMgYnkgaWQuXG4gKiBAcHJvcGVydHkgeyhzdG9yYWdlS2V5OiBzdHJpbmcpID0+IFByb21pc2U8bnVtYmVyPiB8IG51bWJlcn0gbmV4dFNlcXVlbmNlIC0gUmV0dXJucyB0aGUgbmV4dCBsb2NhbCBzZXF1ZW5jZSBudW1iZXIuXG4gKiBAcHJvcGVydHkgeyhzdG9yYWdlS2V5OiBzdHJpbmcsIGlkOiBzdHJpbmcpID0+IFByb21pc2U8TG9jYWxNdXRhdGlvbkxvZ1JlY29yZCB8IG51bGwgfCB1bmRlZmluZWQ+IHwgTG9jYWxNdXRhdGlvbkxvZ1JlY29yZCB8IG51bGwgfCB1bmRlZmluZWR9IHJlY29yZCAtIFJlYWRzIG9uZSBsb2cgcmVjb3JkIGJ5IGlkLlxuICogQHByb3BlcnR5IHsoc3RvcmFnZUtleTogc3RyaW5nLCBvcHRpb25zPzogTG9jYWxNdXRhdGlvbkxvZ1JlY29yZHNPcHRpb25zKSA9PiBQcm9taXNlPExvY2FsTXV0YXRpb25Mb2dSZWNvcmRbXT4gfCBMb2NhbE11dGF0aW9uTG9nUmVjb3JkW119IHJlY29yZHMgLSBSZWFkcyBsb2cgcmVjb3Jkcy5cbiAqIEBwcm9wZXJ0eSB7KHN0b3JhZ2VLZXk6IHN0cmluZywgcmVjb3JkOiBMb2NhbE11dGF0aW9uTG9nUmVjb3JkKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZH0gdXBkYXRlUmVjb3JkIC0gUmVwbGFjZXMgb25lIGxvZyByZWNvcmQuXG4gKi9cbi8qKlxuICogTG9jYWwgc3luYyBtdXRhdGlvbiBkZXBlbmRlbmN5IG1ldGFkYXRhLlxuICogQHR5cGVkZWYge29iamVjdH0gTG9jYWxNdXRhdGlvbkRlcGVuZGVuY3lcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjbGllbnRNdXRhdGlvbklkIC0gQ2xpZW50IG11dGF0aW9uIGlkIHRoaXMgbXV0YXRpb24gZGVwZW5kcyBvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2RlbCAtIERlcGVuZGVudCBtb2RlbC9yZXNvdXJjZSBuYW1lLlxuICovXG4vKipcbiAqIExvY2FsIG11dGF0aW9uIGxvZyBzdGF0dXMuXG4gKiBAdHlwZWRlZiB7XCJwZW5kaW5nXCIgfCBcImFwcGxpZWQtbG9jYWxseVwiIHwgXCJwZWVyLWFwcGxpZWRcIiB8IFwiY29uZmxpY3RcIiB8IFwicmVqZWN0ZWRcIiB8IFwic3luY2VkXCJ9IExvY2FsTXV0YXRpb25TdGF0dXNcbiAqICovXG4vKipcbiAqIExvY2FsIG11dGF0aW9uIGxvZyByZWNvcmQuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2NhbE11dGF0aW9uTG9nUmVjb3JkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY3JlYXRlZEF0IC0gSVNPIHRpbWVzdGFtcCB3aGVuIHRoZSByZWNvcmQgd2FzIGNyZWF0ZWQgbG9jYWxseS5cbiAqIEBwcm9wZXJ0eSB7TG9jYWxNdXRhdGlvbkRlcGVuZGVuY3lbXX0gZGVwZW5kZW5jaWVzIC0gT3RoZXIgbG9jYWwgbXV0YXRpb25zIHRoYXQgbXVzdCByZXBsYXkgZmlyc3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBMb2NhbCBsb2cgcmVjb3JkIGlkLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2RldmljZS1pZGVudGl0eS5qc1wiKS5TeW5jTXV0YXRpb259IG11dGF0aW9uIC0gRGV2aWNlIG11dGF0aW9uIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gc2VxdWVuY2UgLSBNb25vdG9uaWMgbG9jYWwgc2VxdWVuY2UuXG4gKiBAcHJvcGVydHkge0xvY2FsTXV0YXRpb25TdGF0dXN9IHN0YXR1cyAtIExvY2FsIHJlcGxheS9hcHBseSBzdGF0dXMuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSBbc3luY1Jlc3VsdF0gLSBCYWNrZW5kIHJlcGxheS9yZXN1bHQgbWV0YWRhdGEuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdXBkYXRlZEF0IC0gSVNPIHRpbWVzdGFtcCB3aGVuIHRoZSByZWNvcmQgd2FzIGxhc3QgY2hhbmdlZC5cbiAqL1xuLy8gQHRzLWNoZWNrXG5cbmNvbnN0IERFRkFVTFRfU1RPUkFHRV9LRVkgPSBcInZlbG9jaW91cy5zeW5jLmxvY2FsTXV0YXRpb25Mb2dcIlxuY29uc3QgUEVORElOR19TVEFUVVNfVkFMVUVTID0gLyoqIEB0eXBlIHtMb2NhbE11dGF0aW9uU3RhdHVzW119ICovIChbXCJwZW5kaW5nXCIsIFwiYXBwbGllZC1sb2NhbGx5XCIsIFwicGVlci1hcHBsaWVkXCJdKVxuY29uc3QgUEVORElOR19TVEFUVVNFUyA9IG5ldyBTZXQoUEVORElOR19TVEFUVVNfVkFMVUVTKVxuY29uc3QgTVVUQVRJT05fU1RBVFVTRVMgPSBuZXcgU2V0KFsuLi5QRU5ESU5HX1NUQVRVU0VTLCBcImNvbmZsaWN0XCIsIFwicmVqZWN0ZWRcIiwgXCJzeW5jZWRcIl0pXG5jb25zdCBURVJNSU5BTF9TVEFUVVNFUyA9IG5ldyBTZXQoW1wicmVqZWN0ZWRcIiwgXCJzeW5jZWRcIl0pXG4vKiogQHR5cGUge01hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+fSAqL1xuY29uc3QgU1RPUkFHRV9LRVlfTE9DS1MgPSBuZXcgTWFwKClcblxuLyoqIENsaWVudC1zaWRlIGFwcGVuZC1vbmx5IHN5bmMgbXV0YXRpb24gbG9nIHdpdGggcGx1Z2dhYmxlIHBlcnNpc3RlbnQgc3RvcmFnZS4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvY2FsTXV0YXRpb25Mb2cge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGxvY2FsIG11dGF0aW9uIGxvZy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7KCkgPT4gc3RyaW5nfSBbYXJncy5pZEdlbmVyYXRvcl0gLSBSZWNvcmQgaWQgZ2VuZXJhdG9yLlxuICAgKiBAcGFyYW0geygpID0+IERhdGV9IFthcmdzLm5vd10gLSBDbG9jayBjYWxsYmFjay5cbiAgICogQHBhcmFtIHtMb2NhbE11dGF0aW9uTG9nU3RvcmFnZX0gYXJncy5zdG9yYWdlIC0gUGVyc2lzdGVudCBzdG9yYWdlIGFkYXB0ZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5zdG9yYWdlS2V5XSAtIFN0b3JhZ2Uga2V5LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2lkR2VuZXJhdG9yID0gcmFuZG9tUmVjb3JkSWQsIG5vdyA9ICgpID0+IG5ldyBEYXRlKCksIHN0b3JhZ2UsIHN0b3JhZ2VLZXkgPSBERUZBVUxUX1NUT1JBR0VfS0VZfSkge1xuICAgIGlmICghdmFsaWRTdG9yYWdlKHN0b3JhZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2NhbE11dGF0aW9uTG9nIHJlcXVpcmVzIHJvdyBzdG9yYWdlIHdpdGggYXBwZW5kUmVjb3JkL2RlbGV0ZVJlY29yZHMvbmV4dFNlcXVlbmNlL3JlY29yZC9yZWNvcmRzL3VwZGF0ZVJlY29yZFwiKVxuICAgIH1cblxuICAgIHRoaXMuaWRHZW5lcmF0b3IgPSBpZEdlbmVyYXRvclxuICAgIHRoaXMubm93ID0gbm93XG4gICAgdGhpcy5zdG9yYWdlID0gc3RvcmFnZVxuICAgIHRoaXMuc3RvcmFnZUtleSA9IHN0b3JhZ2VLZXlcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgcGVuZGluZyBtdXRhdGlvbiByZWNvcmQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge0xvY2FsTXV0YXRpb25EZXBlbmRlbmN5W119IFthcmdzLmRlcGVuZGVuY2llc10gLSBNdXRhdGlvbiBkZXBlbmRlbmNpZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuU3luY011dGF0aW9ufSBhcmdzLm11dGF0aW9uIC0gTXV0YXRpb24gcGF5bG9hZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8TG9jYWxNdXRhdGlvbkxvZ1JlY29yZD59IC0gQ3JlYXRlZCBsb2cgcmVjb3JkLlxuICAgKi9cbiAgYXN5bmMgYXBwZW5kKHtkZXBlbmRlbmNpZXMgPSBbXSwgbXV0YXRpb259KSB7XG4gICAgcmV0dXJuIGF3YWl0IHdpdGhTdG9yYWdlS2V5TG9jayh0aGlzLnN0b3JhZ2VLZXksIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IHRoaXMuY3VycmVudFRpbWVzdGFtcCgpXG4gICAgICBjb25zdCByZWNvcmQgPSBub3JtYWxpemVSZWNvcmQoe1xuICAgICAgICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCxcbiAgICAgICAgZGVwZW5kZW5jaWVzLFxuICAgICAgICBpZDogdGhpcy5pZEdlbmVyYXRvcigpLFxuICAgICAgICBtdXRhdGlvbixcbiAgICAgICAgc2VxdWVuY2U6IGF3YWl0IHRoaXMuc3RvcmFnZS5uZXh0U2VxdWVuY2UodGhpcy5zdG9yYWdlS2V5KSxcbiAgICAgICAgc3RhdHVzOiBcInBlbmRpbmdcIixcbiAgICAgICAgdXBkYXRlZEF0OiB0aW1lc3RhbXBcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZS5hcHBlbmRSZWNvcmQodGhpcy5zdG9yYWdlS2V5LCBjbG9uZVJlY29yZChyZWNvcmQpKVxuXG4gICAgICByZXR1cm4gY2xvbmVSZWNvcmQocmVjb3JkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgcmVjb3JkcyBvcmRlcmVkIGJ5IGxvY2FsIHNlcXVlbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2NhbE11dGF0aW9uTG9nUmVjb3JkW10+fSAtIExvZyByZWNvcmRzLlxuICAgKi9cbiAgYXN5bmMgcmVjb3JkcygpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplUmVjb3JkTGlzdChhd2FpdCB0aGlzLnN0b3JhZ2UucmVjb3Jkcyh0aGlzLnN0b3JhZ2VLZXkpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcmVjb3JkcyB0aGF0IHN0aWxsIG5lZWQgbG9jYWwvc2VydmVyIHJlY29uY2lsaWF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2NhbE11dGF0aW9uTG9nUmVjb3JkW10+fSAtIFBlbmRpbmcgcmVjb3Jkcy5cbiAgICovXG4gIGFzeW5jIHBlbmRpbmdSZWNvcmRzKCkge1xuICAgIHJldHVybiBub3JtYWxpemVSZWNvcmRMaXN0KGF3YWl0IHRoaXMuc3RvcmFnZS5yZWNvcmRzKHRoaXMuc3RvcmFnZUtleSwge3N0YXR1c2VzOiBQRU5ESU5HX1NUQVRVU19WQUxVRVN9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGEgcmVjb3JkIHN0YXR1cy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmlkIC0gUmVjb3JkIGlkLlxuICAgKiBAcGFyYW0ge0xvY2FsTXV0YXRpb25TdGF0dXN9IGFyZ3Muc3RhdHVzIC0gTmV3IHN0YXR1cy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gW2FyZ3Muc3luY1Jlc3VsdF0gLSBSZXN1bHQgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvY2FsTXV0YXRpb25Mb2dSZWNvcmQ+fSAtIFVwZGF0ZWQgcmVjb3JkLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlU3RhdHVzKHtpZCwgc3RhdHVzLCBzeW5jUmVzdWx0fSkge1xuICAgIGlmICghTVVUQVRJT05fU1RBVFVTRVMuaGFzKHN0YXR1cykpIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBsb2NhbCBtdXRhdGlvbiBzdGF0dXMgJyR7c3RhdHVzfSdgKVxuXG4gICAgcmV0dXJuIGF3YWl0IHdpdGhTdG9yYWdlS2V5TG9jayh0aGlzLnN0b3JhZ2VLZXksIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJhd1JlY29yZCA9IGF3YWl0IHRoaXMuc3RvcmFnZS5yZWNvcmQodGhpcy5zdG9yYWdlS2V5LCBpZClcblxuICAgICAgaWYgKCFyYXdSZWNvcmQpIHRocm93IG5ldyBFcnJvcihgTm8gbG9jYWwgbXV0YXRpb24gbG9nIHJlY29yZCAnJHtpZH0nYClcblxuICAgICAgY29uc3QgcmVjb3JkID0gbm9ybWFsaXplUmVjb3JkKHJhd1JlY29yZClcblxuICAgICAgcmVjb3JkLnN0YXR1cyA9IC8qKiBAdHlwZSB7TG9jYWxNdXRhdGlvblN0YXR1c30gKi8gKHN0YXR1cylcbiAgICAgIGlmIChzeW5jUmVzdWx0ICE9PSB1bmRlZmluZWQpIHJlY29yZC5zeW5jUmVzdWx0ID0gY2xvbmVKc29uT2JqZWN0KHN5bmNSZXN1bHQsIFwic3luY1Jlc3VsdFwiKVxuICAgICAgcmVjb3JkLnVwZGF0ZWRBdCA9IHRoaXMuY3VycmVudFRpbWVzdGFtcCgpXG4gICAgICBhd2FpdCB0aGlzLnN0b3JhZ2UudXBkYXRlUmVjb3JkKHRoaXMuc3RvcmFnZUtleSwgY2xvbmVSZWNvcmQocmVjb3JkKSlcblxuICAgICAgcmV0dXJuIGNsb25lUmVjb3JkKHJlY29yZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFBydW5lcyB0ZXJtaW5hbCByZWNvcmRzIHRoYXQgYXJlIG5vIGxvbmdlciBuZWVkZWQgZm9yIHJlcGxheSBkZXBlbmRlbmNpZXMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBDb21wYWN0aW9uIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5tYXhUZXJtaW5hbFJlY29yZHNdIC0gTWF4aW11bSB0ZXJtaW5hbCByZWNvcmRzIHRvIHJldGFpbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnRlcm1pbmFsUmV0ZW50aW9uTXNdIC0gTWluaW11bSBhZ2UgYmVmb3JlIHBydW5pbmcgdGVybWluYWwgcmVjb3Jkcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8e2RlbGV0ZWRSZWNvcmRJZHM6IHN0cmluZ1tdfT59IC0gQ29tcGFjdGlvbiByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjb21wYWN0KHttYXhUZXJtaW5hbFJlY29yZHMsIHRlcm1pbmFsUmV0ZW50aW9uTXN9ID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgd2l0aFN0b3JhZ2VLZXlMb2NrKHRoaXMuc3RvcmFnZUtleSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMucmVjb3JkcygpXG4gICAgICBjb25zdCBwcm90ZWN0ZWRDbGllbnRNdXRhdGlvbklkcyA9IG5ldyBTZXQoXG4gICAgICAgIHJlY29yZHNcbiAgICAgICAgICAuZmlsdGVyKChyZWNvcmQpID0+IFBFTkRJTkdfU1RBVFVTRVMuaGFzKHJlY29yZC5zdGF0dXMpIHx8IHJlY29yZC5zdGF0dXMgPT09IFwiY29uZmxpY3RcIilcbiAgICAgICAgICAuZmxhdE1hcCgocmVjb3JkKSA9PiByZWNvcmQuZGVwZW5kZW5jaWVzLm1hcCgoZGVwZW5kZW5jeSkgPT4gZGVwZW5kZW5jeS5jbGllbnRNdXRhdGlvbklkKSlcbiAgICAgIClcbiAgICAgIGNvbnN0IHRlcm1pbmFsUmVjb3JkcyA9IHJlY29yZHNcbiAgICAgICAgLmZpbHRlcigocmVjb3JkKSA9PiBURVJNSU5BTF9TVEFUVVNFUy5oYXMocmVjb3JkLnN0YXR1cykpXG4gICAgICAgIC5maWx0ZXIoKHJlY29yZCkgPT4gIXByb3RlY3RlZENsaWVudE11dGF0aW9uSWRzLmhhcyhyZWNvcmQubXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCkpXG4gICAgICAgIC5zb3J0KGNvbXBhcmVSZWNvcmRzTmV3ZXN0Rmlyc3QpXG4gICAgICBjb25zdCBkZWxldGVJZHMgPSBuZXcgU2V0KClcblxuICAgICAgaWYgKHR5cGVvZiBtYXhUZXJtaW5hbFJlY29yZHMgPT09IFwibnVtYmVyXCIgJiYgbWF4VGVybWluYWxSZWNvcmRzID49IDApIHtcbiAgICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgdGVybWluYWxSZWNvcmRzLnNsaWNlKG1heFRlcm1pbmFsUmVjb3JkcykpIGRlbGV0ZUlkcy5hZGQocmVjb3JkLmlkKVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHRlcm1pbmFsUmV0ZW50aW9uTXMgPT09IFwibnVtYmVyXCIgJiYgdGVybWluYWxSZXRlbnRpb25NcyA+PSAwKSB7XG4gICAgICAgIGNvbnN0IGN1dG9mZiA9IHRoaXMubm93KCkuZ2V0VGltZSgpIC0gdGVybWluYWxSZXRlbnRpb25Nc1xuXG4gICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHRlcm1pbmFsUmVjb3Jkcykge1xuICAgICAgICAgIGlmIChuZXcgRGF0ZShyZWNvcmQudXBkYXRlZEF0KS5nZXRUaW1lKCkgPCBjdXRvZmYpIGRlbGV0ZUlkcy5hZGQocmVjb3JkLmlkKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlbGV0ZWRSZWNvcmRJZHMgPSBBcnJheS5mcm9tKGRlbGV0ZUlkcylcblxuICAgICAgaWYgKGRlbGV0ZWRSZWNvcmRJZHMubGVuZ3RoID4gMCkgYXdhaXQgdGhpcy5zdG9yYWdlLmRlbGV0ZVJlY29yZHModGhpcy5zdG9yYWdlS2V5LCBkZWxldGVkUmVjb3JkSWRzKVxuXG4gICAgICByZXR1cm4ge2RlbGV0ZWRSZWNvcmRJZHN9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxvZyB0aW1lc3RhbXAuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQ3VycmVudCBJU08gdGltZXN0YW1wLlxuICAgKi9cbiAgY3VycmVudFRpbWVzdGFtcCgpIHtcbiAgICBjb25zdCBkYXRlID0gdGhpcy5ub3coKVxuXG4gICAgaWYgKCEoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHx8IE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkpIHRocm93IG5ldyBFcnJvcihcIkxvY2FsTXV0YXRpb25Mb2cgbm93KCkgbXVzdCByZXR1cm4gYSB2YWxpZCBEYXRlXCIpXG5cbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHN0b3JhZ2UgYWRhcHRlciBoYXMgYWxsIHJlcXVpcmVkIHJvdy1zdG9yZSBtZXRob2RzLlxuICogQHBhcmFtIHt1bmtub3dufSBzdG9yYWdlIC0gU3RvcmFnZSBhZGFwdGVyIGNhbmRpZGF0ZS5cbiAqIEByZXR1cm5zIHtzdG9yYWdlIGlzIExvY2FsTXV0YXRpb25Mb2dTdG9yYWdlfSAtIFdoZXRoZXIgc3RvcmFnZSBpcyB2YWxpZC5cbiAqL1xuZnVuY3Rpb24gdmFsaWRTdG9yYWdlKHN0b3JhZ2UpIHtcbiAgaWYgKCFzdG9yYWdlIHx8IHR5cGVvZiBzdG9yYWdlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBzdG9yYWdlT2JqZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHN0b3JhZ2UpXG5cbiAgcmV0dXJuIHR5cGVvZiBzdG9yYWdlT2JqZWN0LmFwcGVuZFJlY29yZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgJiYgdHlwZW9mIHN0b3JhZ2VPYmplY3QuZGVsZXRlUmVjb3JkcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgJiYgdHlwZW9mIHN0b3JhZ2VPYmplY3QubmV4dFNlcXVlbmNlID09PSBcImZ1bmN0aW9uXCJcbiAgICAmJiB0eXBlb2Ygc3RvcmFnZU9iamVjdC5yZWNvcmQgPT09IFwiZnVuY3Rpb25cIlxuICAgICYmIHR5cGVvZiBzdG9yYWdlT2JqZWN0LnJlY29yZHMgPT09IFwiZnVuY3Rpb25cIlxuICAgICYmIHR5cGVvZiBzdG9yYWdlT2JqZWN0LnVwZGF0ZVJlY29yZCA9PT0gXCJmdW5jdGlvblwiXG59XG5cbi8qKlxuICogU29ydHMgcmVjb3JkcyBieSBuZXdlc3QgdXBkYXRlL3NlcXVlbmNlIGZpcnN0LlxuICogQHBhcmFtIHtMb2NhbE11dGF0aW9uTG9nUmVjb3JkfSBsZWZ0IC0gTGVmdCByZWNvcmQuXG4gKiBAcGFyYW0ge0xvY2FsTXV0YXRpb25Mb2dSZWNvcmR9IHJpZ2h0IC0gUmlnaHQgcmVjb3JkLlxuICogQHJldHVybnMge251bWJlcn0gLSBTb3J0IHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZVJlY29yZHNOZXdlc3RGaXJzdChsZWZ0LCByaWdodCkge1xuICBjb25zdCB1cGRhdGVkQXRDb21wYXJpc29uID0gcmlnaHQudXBkYXRlZEF0LmxvY2FsZUNvbXBhcmUobGVmdC51cGRhdGVkQXQpXG5cbiAgaWYgKHVwZGF0ZWRBdENvbXBhcmlzb24gIT09IDApIHJldHVybiB1cGRhdGVkQXRDb21wYXJpc29uXG5cbiAgcmV0dXJuIHJpZ2h0LnNlcXVlbmNlIC0gbGVmdC5zZXF1ZW5jZVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYW5kIHNvcnRzIGEgbGlzdCBvZiByZWNvcmRzLlxuICogQHBhcmFtIHt1bmtub3dufSByZWNvcmRzIC0gUmF3IHJlY29yZHMuXG4gKiBAcmV0dXJucyB7TG9jYWxNdXRhdGlvbkxvZ1JlY29yZFtdfSAtIE5vcm1hbGl6ZWQgcmVjb3Jkcy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmVjb3JkTGlzdChyZWNvcmRzKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShyZWNvcmRzKSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbG9jYWwgbXV0YXRpb24gbG9nIHN0b3JhZ2UgcmVjb3JkcyBhcnJheVwiKVxuXG4gIHJldHVybiByZWNvcmRzXG4gICAgLm1hcChub3JtYWxpemVSZWNvcmQpXG4gICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LnNlcXVlbmNlIC0gcmlnaHQuc2VxdWVuY2UpXG4gICAgLm1hcCgocmVjb3JkKSA9PiBjbG9uZVJlY29yZChyZWNvcmQpKVxufVxuXG4vKipcbiAqIFJ1bnMgYSBjYWxsYmFjayBhZnRlciBlYXJsaWVyIHdyaXRlcyBmb3IgdGhlIHNhbWUgc3RvcmFnZSBrZXkgaGF2ZSBjb21wbGV0ZWQuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtzdHJpbmd9IHN0b3JhZ2VLZXkgLSBTdG9yYWdlIGtleSB0byBzZXJpYWxpemUuXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gcnVuIHVuZGVyIHRoZSBzdG9yYWdlLWtleSBsb2NrLlxuICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICovXG5hc3luYyBmdW5jdGlvbiB3aXRoU3RvcmFnZUtleUxvY2soc3RvcmFnZUtleSwgY2FsbGJhY2spIHtcbiAgY29uc3QgcHJldmlvdXMgPSBTVE9SQUdFX0tFWV9MT0NLUy5nZXQoc3RvcmFnZUtleSkgfHwgUHJvbWlzZS5yZXNvbHZlKClcbiAgbGV0IHJlbGVhc2UgPSAoKSA9PiB7fVxuICBjb25zdCBjdXJyZW50ID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsgcmVsZWFzZSA9ICgpID0+IHJlc29sdmUodW5kZWZpbmVkKSB9KVxuICBjb25zdCBjaGFpbmVkID0gcHJldmlvdXMuY2F0Y2goKF9lcnJvcikgPT4ge30pLnRoZW4oKCkgPT4gY3VycmVudClcblxuICBTVE9SQUdFX0tFWV9MT0NLUy5zZXQoc3RvcmFnZUtleSwgY2hhaW5lZClcblxuICB0cnkge1xuICAgIGF3YWl0IHByZXZpb3VzLmNhdGNoKChfZXJyb3IpID0+IHt9KVxuXG4gICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgfSBmaW5hbGx5IHtcbiAgICByZWxlYXNlKClcbiAgICBpZiAoU1RPUkFHRV9LRVlfTE9DS1MuZ2V0KHN0b3JhZ2VLZXkpID09PSBjaGFpbmVkKSBTVE9SQUdFX0tFWV9MT0NLUy5kZWxldGUoc3RvcmFnZUtleSlcbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBwZXJzaXN0ZWQgbG9nIHJlY29yZC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBSYXcgcmVjb3JkLlxuICogQHJldHVybnMge0xvY2FsTXV0YXRpb25Mb2dSZWNvcmR9IC0gTm9ybWFsaXplZCByZWNvcmQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlY29yZCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbG9jYWwgbXV0YXRpb24gbG9nIHJlY29yZCBvYmplY3RcIilcblxuICBjb25zdCByZWNvcmQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodmFsdWUpXG4gIGNvbnN0IHN0YXR1cyA9IHJlcXVpcmVkU3RyaW5nKHJlY29yZC5zdGF0dXMsIFwic3RhdHVzXCIpXG5cbiAgaWYgKCFNVVRBVElPTl9TVEFUVVNFUy5oYXMoc3RhdHVzKSkgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGxvY2FsIG11dGF0aW9uIHN0YXR1cyAnJHtzdGF0dXN9J2ApXG5cbiAgY29uc3QgYmFzZVJlY29yZCA9IHtcbiAgICBjcmVhdGVkQXQ6IHJlcXVpcmVkSXNvVGltZXN0YW1wKHJlY29yZC5jcmVhdGVkQXQsIFwiY3JlYXRlZEF0XCIpLFxuICAgIGRlcGVuZGVuY2llczogbm9ybWFsaXplRGVwZW5kZW5jaWVzKHJlY29yZC5kZXBlbmRlbmNpZXMpLFxuICAgIGlkOiByZXF1aXJlZFN0cmluZyhyZWNvcmQuaWQsIFwiaWRcIiksXG4gICAgbXV0YXRpb246IG5vcm1hbGl6ZU11dGF0aW9uKHJlY29yZC5tdXRhdGlvbiksXG4gICAgc2VxdWVuY2U6IHJlcXVpcmVkUG9zaXRpdmVJbnRlZ2VyKHJlY29yZC5zZXF1ZW5jZSwgXCJzZXF1ZW5jZVwiKSxcbiAgICBzdGF0dXM6IC8qKiBAdHlwZSB7TG9jYWxNdXRhdGlvblN0YXR1c30gKi8gKHN0YXR1cyksXG4gICAgdXBkYXRlZEF0OiByZXF1aXJlZElzb1RpbWVzdGFtcChyZWNvcmQudXBkYXRlZEF0LCBcInVwZGF0ZWRBdFwiKVxuICB9XG5cbiAgaWYgKHJlY29yZC5zeW5jUmVzdWx0ID09PSB1bmRlZmluZWQpIHJldHVybiBiYXNlUmVjb3JkXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5iYXNlUmVjb3JkLFxuICAgIHN5bmNSZXN1bHQ6IGNsb25lSnNvbk9iamVjdChyZWNvcmQuc3luY1Jlc3VsdCwgXCJzeW5jUmVzdWx0XCIpXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGRlcGVuZGVuY3kgbWV0YWRhdGEgZW50cmllcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBSYXcgZGVwZW5kZW5jaWVzLlxuICogQHJldHVybnMge0xvY2FsTXV0YXRpb25EZXBlbmRlbmN5W119IC0gTm9ybWFsaXplZCBkZXBlbmRlbmNpZXMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZURlcGVuZGVuY2llcyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdXG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGxvY2FsIG11dGF0aW9uIGRlcGVuZGVuY2llcyBhcnJheVwiKVxuXG4gIHJldHVybiB2YWx1ZS5tYXAoKGRlcGVuZGVuY3kpID0+IHtcbiAgICBpZiAoIWRlcGVuZGVuY3kgfHwgdHlwZW9mIGRlcGVuZGVuY3kgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkZXBlbmRlbmN5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbG9jYWwgbXV0YXRpb24gZGVwZW5kZW5jeSBvYmplY3RcIilcbiAgICB9XG5cbiAgICBjb25zdCBkZXBlbmRlbmN5T2JqZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKGRlcGVuZGVuY3kpXG5cbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50TXV0YXRpb25JZDogcmVxdWlyZWRTdHJpbmcoZGVwZW5kZW5jeU9iamVjdC5jbGllbnRNdXRhdGlvbklkLCBcImRlcGVuZGVuY3kgY2xpZW50TXV0YXRpb25JZFwiKSxcbiAgICAgIG1vZGVsOiByZXF1aXJlZFN0cmluZyhkZXBlbmRlbmN5T2JqZWN0Lm1vZGVsLCBcImRlcGVuZGVuY3kgbW9kZWxcIilcbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHN5bmMgbXV0YXRpb24gcGF5bG9hZC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBSYXcgbXV0YXRpb24uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuU3luY011dGF0aW9ufSAtIE5vcm1hbGl6ZWQgbXV0YXRpb24uXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU11dGF0aW9uKHZhbHVlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBsb2NhbCBzeW5jIG11dGF0aW9uIG9iamVjdFwiKVxuXG4gIGNvbnN0IG11dGF0aW9uID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHZhbHVlKVxuICBjb25zdCBub3JtYWxpemVkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2RldmljZS1pZGVudGl0eS5qc1wiKS5TeW5jTXV0YXRpb259ICovICh7XG4gICAgYWN0b3JEZXZpY2VJZDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uYWN0b3JEZXZpY2VJZCwgXCJhY3RvckRldmljZUlkXCIpLFxuICAgIGFjdG9yVXNlcklkOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5hY3RvclVzZXJJZCwgXCJhY3RvclVzZXJJZFwiKSxcbiAgICBjbGllbnRNdXRhdGlvbklkOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkLCBcImNsaWVudE11dGF0aW9uSWRcIiksXG4gICAgbW9kZWw6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLm1vZGVsLCBcIm1vZGVsXCIpLFxuICAgIG9jY3VycmVkQXQ6IHJlcXVpcmVkSXNvVGltZXN0YW1wKG11dGF0aW9uLm9jY3VycmVkQXQsIFwib2NjdXJyZWRBdFwiKSxcbiAgICBvZmZsaW5lR3JhbnRJZDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24ub2ZmbGluZUdyYW50SWQsIFwib2ZmbGluZUdyYW50SWRcIiksXG4gICAgb3BlcmF0aW9uOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5vcGVyYXRpb24sIFwib3BlcmF0aW9uXCIpLFxuICAgIHBvbGljeUhhc2g6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLnBvbGljeUhhc2gsIFwicG9saWN5SGFzaFwiKVxuICB9KVxuXG4gIGlmIChtdXRhdGlvbi5hdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQuYXR0cmlidXRlcyA9IGNsb25lSnNvbk9iamVjdChtdXRhdGlvbi5hdHRyaWJ1dGVzLCBcImF0dHJpYnV0ZXNcIilcbiAgaWYgKG11dGF0aW9uLmJhc2VWZXJzaW9uICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQuYmFzZVZlcnNpb24gPSBjbG9uZUJhc2VWZXJzaW9uKG11dGF0aW9uLmJhc2VWZXJzaW9uKVxuICBpZiAobXV0YXRpb24uY29tbWFuZCAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLmNvbW1hbmQgPSByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5jb21tYW5kLCBcImNvbW1hbmRcIilcbiAgaWYgKG11dGF0aW9uLnBheWxvYWQgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5wYXlsb2FkID0gY2xvbmVKc29uT2JqZWN0KG11dGF0aW9uLnBheWxvYWQsIFwicGF5bG9hZFwiKVxuXG4gIHJldHVybiBub3JtYWxpemVkXG59XG5cbi8qKlxuICogUmVxdWlyZXMgYSBub24tZW1wdHkgc3RyaW5nIHZhbHVlLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFJhdyB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIEZpZWxkIGxhYmVsLlxuICogQHJldHVybnMge3N0cmluZ30gLSBSZXF1aXJlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVkU3RyaW5nKHZhbHVlLCBsYWJlbCkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8IHZhbHVlLmxlbmd0aCA8IDEpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbG9jYWwgbXV0YXRpb24gJHtsYWJlbH1gKVxuXG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGFuIElTTyB0aW1lc3RhbXAgc3RyaW5nLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFJhdyB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIEZpZWxkIGxhYmVsLlxuICogQHJldHVybnMge3N0cmluZ30gLSBJU08gdGltZXN0YW1wLlxuICovXG5mdW5jdGlvbiByZXF1aXJlZElzb1RpbWVzdGFtcCh2YWx1ZSwgbGFiZWwpIHtcbiAgY29uc3Qgc3RyaW5nVmFsdWUgPSByZXF1aXJlZFN0cmluZyh2YWx1ZSwgbGFiZWwpXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShzdHJpbmdWYWx1ZSlcblxuICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSB8fCBkYXRlLnRvSVNPU3RyaW5nKCkgIT09IHN0cmluZ1ZhbHVlKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGxvY2FsIG11dGF0aW9uICR7bGFiZWx9IElTTyB0aW1lc3RhbXBgKVxuXG4gIHJldHVybiBzdHJpbmdWYWx1ZVxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGEgcG9zaXRpdmUgaW50ZWdlciB2YWx1ZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBSYXcgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBGaWVsZCBsYWJlbC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gUG9zaXRpdmUgaW50ZWdlci5cbiAqL1xuZnVuY3Rpb24gcmVxdWlyZWRQb3NpdGl2ZUludGVnZXIodmFsdWUsIGxhYmVsKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc0ludGVnZXIodmFsdWUpIHx8IHZhbHVlIDwgMSkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBsb2NhbCBtdXRhdGlvbiAke2xhYmVsfSBwb3NpdGl2ZSBpbnRlZ2VyYClcblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBDbG9uZXMgYSBzdXBwb3J0ZWQgYmFzZS12ZXJzaW9uIHZhbHVlLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFJhdyBiYXNlIHZlcnNpb24uXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVtYmVyIHwgbnVsbH0gLSBOb3JtYWxpemVkIGJhc2UgdmVyc2lvbi5cbiAqL1xuZnVuY3Rpb24gY2xvbmVCYXNlVmVyc2lvbih2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHZhbHVlXG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbG9jYWwgbXV0YXRpb24gYmFzZVZlcnNpb24gc3RyaW5nLCBudW1iZXIsIG9yIG51bGxcIilcbn1cblxuLyoqXG4gKiBDbG9uZXMgYSBKU09OLWNvbXBhdGlibGUgdmFsdWUuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmF3IEpTT04gdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBGaWVsZCBsYWJlbC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlfSAtIENsb25lZCBKU09OIHZhbHVlLlxuICovXG5mdW5jdGlvbiBjbG9uZUpzb25WYWx1ZSh2YWx1ZSwgbGFiZWwpIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgSlNPTi1jb21wYXRpYmxlIGxvY2FsIG11dGF0aW9uICR7bGFiZWx9YClcblxuICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlfSAqLyAoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpKVxufVxuXG4vKipcbiAqIENsb25lcyBhIEpTT04tY29tcGF0aWJsZSBvYmplY3QuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmF3IEpTT04gb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIC0gRmllbGQgbGFiZWwuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IC0gQ2xvbmVkIEpTT04gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBjbG9uZUpzb25PYmplY3QodmFsdWUsIGxhYmVsKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGxvY2FsIG11dGF0aW9uICR7bGFiZWx9IG9iamVjdGApXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59ICovIChjbG9uZUpzb25WYWx1ZSh2YWx1ZSwgbGFiZWwpKVxufVxuXG4vKipcbiAqIENsb25lcyBhIGxvY2FsIG11dGF0aW9uIGxvZyByZWNvcmQuXG4gKiBAcGFyYW0ge0xvY2FsTXV0YXRpb25Mb2dSZWNvcmR9IHJlY29yZCAtIFJlY29yZCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtMb2NhbE11dGF0aW9uTG9nUmVjb3JkfSAtIENsb25lZCByZWNvcmQuXG4gKi9cbmZ1bmN0aW9uIGNsb25lUmVjb3JkKHJlY29yZCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtMb2NhbE11dGF0aW9uTG9nUmVjb3JkfSAqLyAoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZWNvcmQpKSlcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gbG9jYWwgbXV0YXRpb24gcmVjb3JkIGlkLlxuICogQHJldHVybnMge3N0cmluZ30gLSBSYW5kb20gcmVjb3JkIGlkLlxuICovXG5mdW5jdGlvbiByYW5kb21SZWNvcmRJZCgpIHtcbiAgY29uc3QgY3J5cHRvUHJvdmlkZXIgPSBnbG9iYWxUaGlzLmNyeXB0b1xuXG4gIGlmIChjcnlwdG9Qcm92aWRlciAmJiB0eXBlb2YgY3J5cHRvUHJvdmlkZXIucmFuZG9tVVVJRCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gY3J5cHRvUHJvdmlkZXIucmFuZG9tVVVJRCgpXG5cbiAgcmV0dXJuIGBsb2NhbC1tdXRhdGlvbi0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMil9YFxufVxuIl19
@@ -1,29 +1,3 @@
1
- /**
2
- * Signed offline grant envelope.
3
- * @typedef {object} SignedOfflineGrant
4
- * @property {"HS256"} algorithm - Signature algorithm.
5
- * @property {OfflineGrant} grant - Signed grant payload.
6
- * @property {string} keyId - Signing key id.
7
- * @property {string} signature - Hex HMAC signature with a hmac-sha256 prefix.
8
- */
9
- /**
10
- * Backend-issued offline grant payload.
11
- * @typedef {object} OfflineGrant
12
- * @property {string} deviceId - Device id allowed to use the grant.
13
- * @property {string} expiresAt - ISO timestamp after which replay must reject the grant.
14
- * @property {string} grantId - Stable grant id.
15
- * @property {string} issuedAt - ISO timestamp when the backend issued the grant.
16
- * @property {Record<string, import("../configuration-types.js").FrontendModelSyncJsonValue>} resources - Sync manifest/materialized resource metadata.
17
- * @property {Record<string, import("../configuration-types.js").FrontendModelSyncJsonValue>} scopes - Materialized grant scopes.
18
- * @property {string} userId - Actor user id allowed to use the grant.
19
- */
20
- /**
21
- * Offline grant signing key.
22
- * @typedef {object} OfflineGrantSigningKey
23
- * @property {boolean} [current] - Whether this is the active key for new grants.
24
- * @property {string} id - Public key id included in signed grant envelopes.
25
- * @property {string} secret - Private HMAC secret. Never expose this to clients.
26
- */
27
1
  /**
28
2
  * Creates a signed offline grant envelope.
29
3
  * @param {object} args - Arguments.
@@ -1 +1 @@
1
- {"version":3,"file":"offline-grant.d.ts","sourceRoot":"","sources":["../../../src/sync/offline-grant.js"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AAEH;;;;;;;;;;GAUG;AAEH;;;;;;GAMG;AAEH;;;;;;GAMG;AACH,0DAJG;IAA2B,KAAK,EAAxB,YAAY;IACiB,UAAU,EAAvC,sBAAsB;CAC9B,GAAU,OAAO,CAAC,kBAAkB,CAAC,CAiBvC;AAED;;;;;;;GAOG;AACH,sEALG;IAAoB,GAAG;IACU,WAAW,EAApC,kBAAkB;IACa,WAAW,EAA1C,sBAAsB,EAAE;CAChC,GAAU,OAAO,CAAC,YAAY,CAAC,CA4BjC;AAED;;;;;;;;;;;;GAYG;AACH,+HAVG;IAAqB,QAAQ,EAArB,MAAM;IACoB,OAAO,GAAjC,MAAM,GAAG,SAAS;IACQ,UAAU,GAApC,MAAM,GAAG,SAAS;IACP,GAAG,EAAd,IAAI;IACiF,SAAS,EAA9F,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,0BAA0B,CAAC;IACO,MAAM,EAA3F,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,0BAA0B,CAAC;IACjD,UAAU,EAAvC,sBAAsB;IACT,MAAM,EAAnB,MAAM;CACd,GAAU,OAAO,CAAC,kBAAkB,CAAC,CAoBvC;AAqDD;;;;GAIG;AACH,4DAHW,sBAAsB,GACpB,sBAAsB,CAUlC;AAED;;;;GAIG;AACH,2DAHW,sBAAsB,EAAE,GACtB,sBAAsB,CAUlC;;;;;;;;eAtMa,OAAO;;;;WACP,YAAY;;;;WACZ,MAAM;;;;eACN,MAAM;;;;;;;;;cAMN,MAAM;;;;eACN,MAAM;;;;aACN,MAAM;;;;cACN,MAAM;;;;eACN,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,0BAA0B,CAAC;;;;YAC9E,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,0BAA0B,CAAC;;;;YAC9E,MAAM;;;;;;;;;;;;;QAON,MAAM;;;;YACN,MAAM"}
1
+ {"version":3,"file":"offline-grant.d.ts","sourceRoot":"","sources":["../../../src/sync/offline-grant.js"],"names":[],"mappings":"AA+BA;;;;;;GAMG;AACH,0DAJG;IAA2B,KAAK,EAAxB,YAAY;IACiB,UAAU,EAAvC,sBAAsB;CAC9B,GAAU,OAAO,CAAC,kBAAkB,CAAC,CAiBvC;AAED;;;;;;;GAOG;AACH,sEALG;IAAoB,GAAG;IACU,WAAW,EAApC,kBAAkB;IACa,WAAW,EAA1C,sBAAsB,EAAE;CAChC,GAAU,OAAO,CAAC,YAAY,CAAC,CA4BjC;AAED;;;;;;;;;;;;GAYG;AACH,+HAVG;IAAqB,QAAQ,EAArB,MAAM;IACoB,OAAO,GAAjC,MAAM,GAAG,SAAS;IACQ,UAAU,GAApC,MAAM,GAAG,SAAS;IACP,GAAG,EAAd,IAAI;IACiF,SAAS,EAA9F,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,0BAA0B,CAAC;IACO,MAAM,EAA3F,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,0BAA0B,CAAC;IACjD,UAAU,EAAvC,sBAAsB;IACT,MAAM,EAAnB,MAAM;CACd,GAAU,OAAO,CAAC,kBAAkB,CAAC,CAoBvC;AAqDD;;;;GAIG;AACH,4DAHW,sBAAsB,GACpB,sBAAsB,CAUlC;AAED;;;;GAIG;AACH,2DAHW,sBAAsB,EAAE,GACtB,sBAAsB,CAUlC;;;;;;;;eAxMa,OAAO;;;;WACP,YAAY;;;;WACZ,MAAM;;;;eACN,MAAM;;;;;;;;;cAKN,MAAM;;;;eACN,MAAM;;;;aACN,MAAM;;;;cACN,MAAM;;;;eACN,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,0BAA0B,CAAC;;;;YAC9E,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,0BAA0B,CAAC;;;;YAC9E,MAAM;;;;;;;;;;;;;QAMN,MAAM;;;;YACN,MAAM"}