footprintjs 10.2.1 → 10.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/dist/esm/index.d.ts +3 -0
  2. package/dist/esm/index.js +1 -1
  3. package/dist/esm/lib/capture/absentEntries.d.ts +7 -0
  4. package/dist/esm/lib/capture/absentEntries.js +81 -0
  5. package/dist/esm/lib/capture/checkpointCapture.d.ts +11 -0
  6. package/dist/esm/lib/capture/checkpointCapture.js +104 -0
  7. package/dist/esm/lib/capture/historyData.d.ts +9 -0
  8. package/dist/esm/lib/capture/historyData.js +79 -0
  9. package/dist/esm/lib/capture/historyNote.d.ts +4 -0
  10. package/dist/esm/lib/capture/historyNote.js +52 -0
  11. package/dist/esm/lib/capture/historyTarget.d.ts +5 -0
  12. package/dist/esm/lib/capture/historyTarget.js +35 -0
  13. package/dist/esm/lib/capture/historyTypes.d.ts +39 -0
  14. package/dist/esm/lib/capture/historyTypes.js +4 -0
  15. package/dist/esm/lib/capture/nativeCoverage.d.ts +69 -0
  16. package/dist/esm/lib/capture/nativeCoverage.js +140 -0
  17. package/dist/esm/lib/capture/noteShape.d.ts +10 -0
  18. package/dist/esm/lib/capture/noteShape.js +93 -0
  19. package/dist/esm/lib/capture/readSources.d.ts +43 -0
  20. package/dist/esm/lib/capture/readSources.js +78 -0
  21. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +5 -2
  22. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
  23. package/dist/esm/lib/engine/types.d.ts +3 -0
  24. package/dist/esm/lib/engine/types.js +1 -1
  25. package/dist/esm/lib/memory/StageContext.d.ts +13 -0
  26. package/dist/esm/lib/memory/StageContext.js +110 -14
  27. package/dist/esm/lib/memory/attention.d.ts +2 -0
  28. package/dist/esm/lib/memory/attention.js +12 -5
  29. package/dist/esm/lib/memory/runPolicy.d.ts +5 -1
  30. package/dist/esm/lib/memory/runPolicy.js +2 -1
  31. package/dist/esm/lib/pause/record.js +8 -2
  32. package/dist/esm/lib/pause/types.d.ts +2 -0
  33. package/dist/esm/lib/pause/types.js +1 -1
  34. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +12 -1
  35. package/dist/esm/lib/recorder/ControlDepRecorder.js +23 -1
  36. package/dist/esm/lib/recorder/snapshot.d.ts +1 -1
  37. package/dist/esm/lib/recorder/snapshot.js +7 -2
  38. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +24 -1
  39. package/dist/esm/lib/runner/ExecutionRuntime.js +45 -4
  40. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +5 -0
  41. package/dist/esm/lib/runner/FlowChartExecutor.js +74 -7
  42. package/dist/esm/lib/runner/attach.js +6 -2
  43. package/dist/esm/lib/runner/captureHistory.d.ts +8 -0
  44. package/dist/esm/lib/runner/captureHistory.js +106 -0
  45. package/dist/esm/lib/runner/checkpoint.d.ts +2 -0
  46. package/dist/esm/lib/runner/checkpoint.js +3 -1
  47. package/dist/esm/lib/runner/index.d.ts +1 -0
  48. package/dist/esm/lib/runner/index.js +1 -1
  49. package/dist/esm/lib/runner/options.d.ts +3 -0
  50. package/dist/esm/lib/runner/options.js +46 -3
  51. package/dist/esm/lib/runner/readStoredCapture.d.ts +39 -0
  52. package/dist/esm/lib/runner/readStoredCapture.js +36 -0
  53. package/dist/esm/lib/runner/recordSink.d.ts +11 -0
  54. package/dist/esm/lib/runner/recordSink.js +47 -4
  55. package/dist/esm/lib/runner/snapshot.d.ts +3 -1
  56. package/dist/esm/lib/runner/snapshot.js +35 -4
  57. package/dist/esm/lib/runner/storedCaptureAdmission.d.ts +4 -0
  58. package/dist/esm/lib/runner/storedCaptureAdmission.js +97 -0
  59. package/dist/esm/lib/scope/ScopeFacade.js +4 -2
  60. package/dist/esm/lib/scope/runtime.d.ts +2 -0
  61. package/dist/esm/lib/scope/runtime.js +9 -1
  62. package/dist/esm/lib/sinks/fileSink.d.ts +2 -1
  63. package/dist/esm/lib/sinks/fileSink.js +8 -2
  64. package/dist/esm/trace.d.ts +2 -0
  65. package/dist/esm/trace.js +2 -1
  66. package/dist/index.js +1 -1
  67. package/dist/lib/capture/absentEntries.js +86 -0
  68. package/dist/lib/capture/checkpointCapture.js +110 -0
  69. package/dist/lib/capture/historyData.js +85 -0
  70. package/dist/lib/capture/historyNote.js +56 -0
  71. package/dist/lib/capture/historyTarget.js +40 -0
  72. package/dist/lib/capture/historyTypes.js +7 -0
  73. package/dist/lib/capture/nativeCoverage.js +146 -0
  74. package/dist/lib/capture/noteShape.js +103 -0
  75. package/dist/lib/capture/readSources.js +83 -0
  76. package/dist/lib/engine/handlers/SubflowExecutor.js +5 -2
  77. package/dist/lib/engine/types.js +1 -1
  78. package/dist/lib/memory/StageContext.js +110 -14
  79. package/dist/lib/memory/attention.js +12 -5
  80. package/dist/lib/memory/runPolicy.js +2 -1
  81. package/dist/lib/pause/record.js +8 -2
  82. package/dist/lib/pause/types.js +1 -1
  83. package/dist/lib/recorder/ControlDepRecorder.js +23 -1
  84. package/dist/lib/recorder/snapshot.js +7 -2
  85. package/dist/lib/runner/ExecutionRuntime.js +44 -3
  86. package/dist/lib/runner/FlowChartExecutor.js +77 -10
  87. package/dist/lib/runner/attach.js +5 -1
  88. package/dist/lib/runner/captureHistory.js +110 -0
  89. package/dist/lib/runner/checkpoint.js +3 -1
  90. package/dist/lib/runner/index.js +1 -1
  91. package/dist/lib/runner/options.js +46 -3
  92. package/dist/lib/runner/readStoredCapture.js +40 -0
  93. package/dist/lib/runner/recordSink.js +47 -4
  94. package/dist/lib/runner/snapshot.js +35 -4
  95. package/dist/lib/runner/storedCaptureAdmission.js +101 -0
  96. package/dist/lib/scope/ScopeFacade.js +3 -1
  97. package/dist/lib/scope/runtime.js +12 -2
  98. package/dist/lib/sinks/fileSink.js +8 -2
  99. package/dist/trace.js +4 -2
  100. package/dist/types/index.d.ts +3 -0
  101. package/dist/types/lib/capture/absentEntries.d.ts +7 -0
  102. package/dist/types/lib/capture/checkpointCapture.d.ts +11 -0
  103. package/dist/types/lib/capture/historyData.d.ts +9 -0
  104. package/dist/types/lib/capture/historyNote.d.ts +4 -0
  105. package/dist/types/lib/capture/historyTarget.d.ts +5 -0
  106. package/dist/types/lib/capture/historyTypes.d.ts +39 -0
  107. package/dist/types/lib/capture/nativeCoverage.d.ts +69 -0
  108. package/dist/types/lib/capture/noteShape.d.ts +10 -0
  109. package/dist/types/lib/capture/readSources.d.ts +43 -0
  110. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
  111. package/dist/types/lib/engine/types.d.ts +3 -0
  112. package/dist/types/lib/memory/StageContext.d.ts +13 -0
  113. package/dist/types/lib/memory/attention.d.ts +2 -0
  114. package/dist/types/lib/memory/runPolicy.d.ts +5 -1
  115. package/dist/types/lib/pause/types.d.ts +2 -0
  116. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +12 -1
  117. package/dist/types/lib/recorder/snapshot.d.ts +1 -1
  118. package/dist/types/lib/runner/ExecutionRuntime.d.ts +24 -1
  119. package/dist/types/lib/runner/FlowChartExecutor.d.ts +5 -0
  120. package/dist/types/lib/runner/captureHistory.d.ts +8 -0
  121. package/dist/types/lib/runner/checkpoint.d.ts +2 -0
  122. package/dist/types/lib/runner/index.d.ts +1 -0
  123. package/dist/types/lib/runner/options.d.ts +3 -0
  124. package/dist/types/lib/runner/readStoredCapture.d.ts +39 -0
  125. package/dist/types/lib/runner/recordSink.d.ts +11 -0
  126. package/dist/types/lib/runner/snapshot.d.ts +3 -1
  127. package/dist/types/lib/runner/storedCaptureAdmission.d.ts +4 -0
  128. package/dist/types/lib/scope/runtime.d.ts +2 -0
  129. package/dist/types/lib/sinks/fileSink.d.ts +2 -1
  130. package/dist/types/trace.d.ts +2 -0
  131. package/package.json +2 -2
@@ -167,7 +167,9 @@ export class SubflowExecutor {
167
167
  const record = mountRuntimeStageId === undefined
168
168
  ? undefined
169
169
  : this.deps.executionRuntime.recordFor?.(mountRuntimeStageId, { subflowId });
170
- const nestedRuntime = new ExecutionRuntimeClass(firstNode.name, firstNode.id, undefined, undefined, policy, record);
170
+ const nestedRuntime = new ExecutionRuntimeClass(firstNode.name, firstNode.id, undefined, undefined, policy, record, parentTraversalContext?.runId
171
+ ? { runId: parentTraversalContext.runId, unavailable: 'child-source-ownership' }
172
+ : undefined);
171
173
  // Seed GlobalStore with the right shape for the path:
172
174
  // • Resume into THIS subflow → seed from the captured pre-pause
173
175
  // scope so resume handlers see history, pausedToolCallId, etc.
@@ -360,6 +362,7 @@ export class SubflowExecutor {
360
362
  globalContext: subflowTreeContext.sharedState,
361
363
  stageContexts: subflowTreeContext.executionTree,
362
364
  history: subflowTreeContext.commitLog,
365
+ ...(subflowTreeContext.readSources && { readSources: subflowTreeContext.readSources }),
363
366
  ...(subflowTreeContext.logAddress === undefined ? {} : { logAddress: subflowTreeContext.logAddress }),
364
367
  // The subflow's own fold base travels with its own log — same
365
368
  // contract as the run-level `RuntimeSnapshot.initialState`.
@@ -416,4 +419,4 @@ export class SubflowExecutor {
416
419
  return subflowOutput;
417
420
  }
418
421
  }
419
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQVVyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVyRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUc1Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQThCO0lBQ3ZELElBQUksR0FBd0MsQ0FBQztJQUM3QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1lBQUUsU0FBUztRQUNuQyxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNELE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQztBQUN0QixDQUFDO0FBRUQseUdBQXlHO0FBQ3pHLFNBQVMsWUFBWSxDQUFDLEtBQWM7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QUM3RSxXQUFXLEVBQUUsU0FBUztTQUN2QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXRHLDJFQUEyRTtRQUMzRSxzRUFBc0U7UUFDdEUsaUJBQWlCLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXpDLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsYUFBYSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEcsTUFBTSxZQUFZLENBQUMsS0FBSyxDQUFDO1FBQzNCLENBQUM7UUFFRCxhQUFhLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXZELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3ViZmxvd0V4ZWN1dG9yIOKAlCBJc29sYXRpb24gYm91bmRhcnkgZm9yIHN1YmZsb3cgZXhlY3V0aW9uLlxuICpcbiAqIFJlc3BvbnNpYmlsaXRpZXM6XG4gKiAtIENyZWF0ZSBpc29sYXRlZCBFeGVjdXRpb25SdW50aW1lIGZvciBlYWNoIHN1YmZsb3dcbiAqIC0gQXBwbHkgaW5wdXQvb3V0cHV0IG1hcHBpbmcgdmlhIFN1YmZsb3dJbnB1dE1hcHBlclxuICogLSBEZWxlZ2F0ZSB0cmF2ZXJzYWwgdG8gYSBmYWN0b3J5LWNyZWF0ZWQgRmxvd2NoYXJ0VHJhdmVyc2VyXG4gKiAtIFRyYWNrIHN1YmZsb3cgcmVzdWx0cyBmb3IgZGVidWdnaW5nL3Zpc3VhbGl6YXRpb25cbiAqXG4gKiBFYWNoIHN1YmZsb3cgZ2V0cyBpdHMgb3duIEdsb2JhbFN0b3JlIGZvciBpc29sYXRpb24uXG4gKiBUcmF2ZXJzYWwgdXNlcyB0aGUgU0FNRSA3LXBoYXNlIGFsZ29yaXRobSBhcyB0aGUgdG9wLWxldmVsIHRyYXZlcnNlclxuICogKHZpYSBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeSksIHNvIGRlY2lkZXJzLCBzZWxlY3RvcnMsIGxvb3BzLCBsYXp5IHN1YmZsb3dzLFxuICogYW5kIGFib3J0IHNpZ25hbHMgYWxsIHdvcmsgaW5zaWRlIHN1YmZsb3dzIGF1dG9tYXRpY2FsbHkuXG4gKi9cblxuaW1wb3J0IHsgTE9HX1BMQUNFSE9MREVSIH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcblxuaW1wb3J0IHsgdGhyb3duVGV4dCB9IGZyb20gJy4uLy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5Qb2xpY3kgfSBmcm9tICcuLi8uLi9tZW1vcnkvcnVuUG9saWN5LmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgSGFuZGxlckRlcHMsXG4gIElFeGVjdXRpb25SdW50aW1lLFxuICBTdWJmbG93UmVzdWx0LFxuICBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeSxcbiAgU3ViZmxvd1RyYXZlcnNlckhhbmRsZSxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgY29tbWl0U3RhZ2VXcml0ZXMgfSBmcm9tICcuL2NvbW1pdFN0YWdlLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzdW1lRW50cnkgfSBmcm9tICcuL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB7IHJlbWVtYmVyUmVkYWN0ZWRTdWJmbG93U3RhdGUgfSBmcm9tICcuL3NlcnZlZFN1YmZsb3dSZXN1bHRzLmpzJztcbmltcG9ydCB7IGxvZ2dhYmxlU3RhZ2VFcnJvciB9IGZyb20gJy4vc3RhZ2VFcnJvci5qcyc7XG5pbXBvcnQgeyBhcHBseU91dHB1dE1hcHBpbmcsIGdldEluaXRpYWxTY29wZVZhbHVlcywgc2VlZFN1YmZsb3dHbG9iYWxTdG9yZSB9IGZyb20gJy4vU3ViZmxvd0lucHV0TWFwcGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQnJlYWtGbGFnIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogVGhlIG1hcHBlZCBpbnB1dCwgZGV0YWNoZWQgZnJvbSB0aGUgcGFyZW50J3Mgc3RhdGUgT05DRSBwZXIgbW91bnQgKEQxLFxuICogOS4yOS4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24td3JpdGUtY29tbWl0Lm1kKS5cbiAqXG4gKiBUaGUgaW5wdXRNYXBwZXIgcmVhZHMgdGhlIHBhcmVudCdzIExJVkUgc3RhdGUgKGBnZXRTY29wZSgpYCksIHNvIGEgdmFsdWUgaXRcbiAqIHBhc3NlcyB0aHJvdWdoIChgKHApID0+ICh7IGNmZzogcC5jZmcgfSlgKSBpcyB0aGUgcGFyZW50J3MgY29tbWl0dGVkXG4gKiBvYmplY3Qg4oCUIGFuZCB0aGUgc3ViZmxvdydzIGFyZ3MgYXJlIGRlZXAtRlJPWkVOIGluIHBsYWNlXG4gKiAoYHJlYWRvbmx5SW5wdXQgwrcgY3JlYXRlRnJvemVuQXJnc2ApLiBUaGUgdHlwZWQgc2NvcGUgZG9lcyBub3QgcHJveHkgYVxuICogZnJvemVuIHZhbHVlIChgYWxsb3dsaXN0IMK3IHNob3VsZFdyYXBXaXRoUHJveHlgKSwgc28gYSBsYXRlclxuICogYHNjb3BlLmNmZy54ID0gMWAgaW4gdGhlIHBhcmVudCBtZXQgdGhlIHJhdyBmcm96ZW4gb2JqZWN0OiBhIFR5cGVFcnJvciBpblxuICogc3RyaWN0IGNvZGUuIEJlZm9yZSA5LjI5LjAgdGhlIHBhcmVudCdzIG5leHQgd2hvbGUtc3RhdGUgY2xvbmUgcmVwbGFjZWQgdGhlXG4gKiBmcm96ZW4gb2JqZWN0IChhIG1vdW50IHRoYXQgY29tbWl0dGVkIG5vdGhpbmcgbGVmdCBpdCBpbiBwbGFjZSDigJQgdGhlIGJ1Z1xuICogZXhpc3RlZCwgaXQgd2FzIG9ubHkgc2hvcnQtbGl2ZWQpOyB1bmRlciBjb3B5LW9uLXdyaXRlIG5vdGhpbmcgcmUtY2xvbmVzLFxuICogc28gdGhlIGZyZWV6ZSB3b3VsZCBsYXN0IHVudGlsIHRoZSBrZXkgaXMgcmV3cml0dGVuLiBBIG1vdW50IG11c3QgbmV2ZXJcbiAqIGVkaXQg4oCUIG9yIGZyZWV6ZSDigJQgdGhlIHBhcmVudCdzIGNvbW1pdHRlZCBvYmplY3RzOiBldmVyeSBwbGFpbiBvYmplY3QsXG4gKiBhcnJheSwgYERhdGVgLCBgTWFwYCBhbmQgYFNldGAgdGhlIG1hcHBlciByZXR1cm5zIGlzIGNsb25lZCBoZXJlLCBiZWZvcmUgaXRcbiAqIGJlY29tZXMgdGhlIGFyZ3MuIEEgY2xhc3MgaW5zdGFuY2UgcGFzc2VzIGJ5IHJlZmVyZW5jZSwgYXMgYmVmb3JlIChpdFxuICogY2Fubm90IGNvbWUgZnJvbSBjb21taXR0ZWQgc3RhdGUsIGFuZCBhIGNsb25lIHdvdWxkIGRyb3AgaXRzIHByb3RvdHlwZSkuXG4gKiBUaGUgc2VlZCBpcyBjbG9uZWQgYWdhaW4gYXQgaXRzIGNvbW1pdCwgc28gdGhlIHN1YmZsb3cncyBzdGF0ZSBpc1xuICogdW5jaGFuZ2VkLlxuICovXG5mdW5jdGlvbiBkZXRhY2hNYXBwZWRJbnB1dChpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGxldCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbnB1dCkpIHtcbiAgICBpZiAoIWlzRGV0YWNoYWJsZSh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgIChvdXQgPz89IHsgLi4uaW5wdXQgfSlba2V5XSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIG91dCA/PyBpbnB1dDtcbn1cblxuLyoqIEEgdmFsdWUgYHN0cnVjdHVyZWRDbG9uZWAgcmVwcm9kdWNlcyB3aXRoIGl0cyBvd24gdHlwZTogcGxhaW4gb2JqZWN0LCBhcnJheSwgYERhdGVgLCBgTWFwYCwgYFNldGAuICovXG5mdW5jdGlvbiBpc0RldGFjaGFibGUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fCB2YWx1ZSBpbnN0YW5jZW9mIE1hcCB8fCB2YWx1ZSBpbnN0YW5jZW9mIFNldCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgU3ViZmxvd0V4ZWN1dG9yPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IChgZGVwcy5yZXN1bWVgKS4gVW5kZWZpbmVkIG9uIGEgbm9ybWFsXG4gICAqIHJ1bi4gQXNrZWQgb25jZSBwZXIgc3ViZmxvdyBlbnRyeSDigJQgc2VlIHtAbGluayBSZXN1bWVFbnRyeX0uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc3VtZTogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4sXG4gICAgcHJpdmF0ZSB0cmF2ZXJzZXJGYWN0b3J5OiBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeTxUT3V0LCBUU2NvcGU+LFxuICApIHtcbiAgICB0aGlzLnJlc3VtZSA9IGRlcHMucmVzdW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBzdWJmbG93IHdpdGggaXNvbGF0ZWQgY29udGV4dC5cbiAgICpcbiAgICogMS4gQ3JlYXRlcyBhIGZyZXNoIEV4ZWN1dGlvblJ1bnRpbWUgZm9yIHRoZSBzdWJmbG93XG4gICAqIDIuIEFwcGxpZXMgaW5wdXQgbWFwcGluZyB0byBzZWVkIHRoZSBzdWJmbG93J3MgR2xvYmFsU3RvcmVcbiAgICogMy4gRGVsZWdhdGVzIHRyYXZlcnNhbCB0byBhIGZhY3RvcnktY3JlYXRlZCBGbG93Y2hhcnRUcmF2ZXJzZXJcbiAgICogNC4gQXBwbGllcyBvdXRwdXQgbWFwcGluZyB0byB3cml0ZSByZXN1bHRzIGJhY2sgdG8gcGFyZW50IHNjb3BlXG4gICAqIDUuIFN0b3JlcyBleGVjdXRpb24gZGF0YSBmb3IgZGVidWdnaW5nL3Zpc3VhbGl6YXRpb25cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVTdWJmbG93KFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHBhcmVudENvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3ViZmxvd1Jlc3VsdHNNYXA6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+LFxuICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHN1YmZsb3dJZCA9IG5vZGUuc3ViZmxvd0lkITtcbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG5vZGUuc3ViZmxvd05hbWUgPz8gbm9kZS5uYW1lO1xuXG4gICAgcGFyZW50Q29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzdWJmbG93JywgYEVudGVyaW5nICR7c3ViZmxvd05hbWV9IHN1YmZsb3dgLCB7XG4gICAgICB0YXJnZXRTdGFnZTogc3ViZmxvd0lkLFxuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSA4pSAIFJlc3VtZSByZS1lbnRyeSAob25lLXNob3QpIOKUgOKUgOKUgFxuICAgIC8vXG4gICAgLy8gV2hlbiB0aGlzIGVudHJ5IGlzIHRoZSByZXN1bWUncyB3YXkgYmFjayBpbnRvIGEgcGF1c2VkIHN1YmZsb3csIHRoZVxuICAgIC8vIGhvcCBuYW1lcyB3aGVyZSB0aGUgc3ViZmxvdydzIHRyYXZlcnNhbCBzdGFydHMgKHRoZSBuZXh0IG1vdW50IG9uIHRoZVxuICAgIC8vIHBhdXNlIHBhdGgsIG9yIHRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiksIGNhcnJpZXMgdGhlIHN1YmZsb3cnc1xuICAgIC8vIGNhcHR1cmVkIHByZS1wYXVzZSBzdGF0ZSwgYW5kIGFueSBzaWJsaW5nIHBhdXNlcyB3YWl0aW5nIGluIGl0LiBUYWtlblxuICAgIC8vIE9OQ0U6IGFueSBsYXRlciBlbnRyeSBpbnRvIHRoaXMgc3ViZmxvdyDigJQgYSBsb29wIHBhc3NpbmcgaXRzIG1vdW50XG4gICAgLy8gYWdhaW4g4oCUIGdldHMgYHVuZGVmaW5lZGAgYW5kIHJ1bnMgdGhlIHJlYWwgc3ViZmxvdyBmcm9tIGl0cyByZWFsIHJvb3QsXG4gICAgLy8gaW5wdXRNYXBwZXIgYW5kIGFsbC5cbiAgICBjb25zdCByZXN1bWVIb3AgPSB0aGlzLnJlc3VtZT8uZW50ZXJTdWJmbG93KHN1YmZsb3dJZCk7XG5cbiAgICAvLyDilIDilIDilIAgSW5wdXQgTWFwcGluZyDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFRoZSBtYXBwZXIgcnVucyBvbiBFVkVSWSBlbnRyeTogaXRzIHJlc3VsdCBpcyB0aGUgc3RhZ2VzJyByZWFkLW9ubHlcbiAgICAvLyBhcmdzIChgJGdldEFyZ3MoKWApLCBhbmQgYSByZS1lbnRlcmVkIHN1YmZsb3cncyBzdGFnZXMgcmVhZCB0aGUgc2FtZVxuICAgIC8vIGFyZ3MgdGhleSByZWFkIGJlZm9yZSB0aGUgcGF1c2UgKHRoZSBwYXJlbnQncyB2aWV3IGlzIHRoZSBzYW1lIG9uZSDigJRcbiAgICAvLyBpdCB3YXMgYmxvY2tlZCBpbiB0aGlzIG1vdW50KS4gV2hhdCBhIHJlc3VtZSBjaGFuZ2VzIGlzIG9ubHkgdGhlIFNFRUQ6XG4gICAgLy8gd2hlbiB0aGUgaG9wIGNhcnJpZXMgYSBjYXB0dXJlLCB0aGUgbmVzdGVkIG1lbW9yeSBpcyBzZWVkZWQgZnJvbSB0aGVcbiAgICAvLyBjYXB0dXJlLCBub3QgZnJvbSB0aGUgbWFwcGVyIOKAlCB0aGUgY2FwdHVyZSBpcyB0aGUgcG9zdC1pbnB1dCBwcmUtcGF1c2VcbiAgICAvLyBtZW1vcnksIGFuZCBzZWVkaW5nIHRoZSBtYXBwZXIncyB2YWx1ZXMgd291bGQgY2xvYmJlciBwb3N0LWlucHV0XG4gICAgLy8gd3JpdGVzIChoaXN0b3J5LCBwYXVzZWRUb29sQ2FsbElkLCBldGMuKSB3aXRoIHRoZSBzdGFydC1vZi1zdWJmbG93IHZpZXcuXG4gICAgY29uc3QgbW91bnRPcHRpb25zID0gbm9kZS5zdWJmbG93TW91bnRPcHRpb25zO1xuICAgIGxldCBtYXBwZWRJbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBjb25zdCByZXN1bWVDYXB0dXJlID0gcmVzdW1lSG9wPy5zZWVkO1xuICAgIGNvbnN0IGlzUmVzdW1lRm9yVGhpc1N1YmZsb3cgPSByZXN1bWVDYXB0dXJlICE9PSB1bmRlZmluZWQ7XG5cbiAgICAvLyBUaGUgcnVuJ3MgcG9saWN5IChGNSkg4oCUIHRoZSBmb3VyIGRpYWxzLCB0aGUgcmVkYWN0aW9uIHJ1bGUsIHRoZSBtaXJyb3JcbiAgICAvLyBmbGFnIOKAlCByZWFkIG9mZiB0aGUgcGFyZW50LW1vdW50IGZyYW1lLCB3aGljaCBob2xkcyBpdCBieSByZWZlcmVuY2UuXG4gICAgLy8gVGhlIG5lc3RlZCBydW50aW1lIGlzIGNvbnN0cnVjdGVkIFdJVEggaXQsIHNvIHRoZSBzZWVkIGNvbW1pdCBiZWxvd1xuICAgIC8vIChgaGlzdG9yeVswXWApIGFuZCBldmVyeSBsYXRlciBjb21taXQgb2YgdGhlIHN1YmZsb3cgcnVuIHVuZGVyIHRoZSBzYW1lXG4gICAgLy8gb2JqZWN0LCBhbmQgdGhlIG5lc3RlZCBydW50aW1lIGtlZXBzIGEgbWlycm9yIG9mIGl0cyBvd24gZXhhY3RseSB3aGVuXG4gICAgLy8gdGhlIHJ1biBkb2VzIChpdHMgU0VSVkVEIHN0YXRlIGlzIHRoZW4gdGhlIGZvbGQgb2YgaXRzIG93biBzY3J1YmJlZFxuICAgIC8vIGxvZywgbmV2ZXIgYSBzZWNvbmQgc2NydWIpLlxuICAgIGNvbnN0IHBvbGljeTogUnVuUG9saWN5ID0gcGFyZW50Q29udGV4dC5nZXRQb2xpY3koKTtcbiAgICBjb25zdCByZWRhY3Rpb25SdWxlID0gcG9saWN5LnJlZGFjdGlvbjtcblxuICAgIGlmIChtb3VudE9wdGlvbnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFNjb3BlID0gcGFyZW50Q29udGV4dC5nZXRTY29wZSgpO1xuICAgICAgICAvLyBUaGUgcnVsZSByaWRlcyBhbG9uZzogYSBrZXkgdGhlIG1hcHBlciBjb3BpZXMgYSBzZWxlY3RlZCB2YWx1ZSBpbnRvXG4gICAgICAgIC8vIGluaGVyaXRzIGl0cyByZWRhY3Rpb24gYmVmb3JlIHRoZSBzZWVkIGlzIHdyaXR0ZW4gKHRoZSB0YWludCBydWxlKS5cbiAgICAgICAgbWFwcGVkSW5wdXQgPSBkZXRhY2hNYXBwZWRJbnB1dChnZXRJbml0aWFsU2NvcGVWYWx1ZXMocGFyZW50U2NvcGUsIG1vdW50T3B0aW9ucywgcmVkYWN0aW9uUnVsZSkpO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMobWFwcGVkSW5wdXQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBtYXBwZWRJbnB1dCBpcyBjYXB0dXJlZCBpbiBTdWJmbG93UmVzdWx0LnRyZWVDb250ZXh0IGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdpbnB1dE1hcHBlckVycm9yJywgdGhyb3duVGV4dChlcnJvcikpO1xuICAgICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBpbnB1dE1hcHBlciBmb3Igc3ViZmxvdyAoJHtzdWJmbG93SWR9KTpgLCB7XG4gICAgICAgICAgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihwYXJlbnRDb250ZXh0LCBlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBOYXJyYXRpdmUgcmVjZWl2ZXMgdGhlIFJFVEFJTkVEIGZvcm0gb2YgdGhlIG1hcHBlZCBpbnB1dCDigJQgYW5cbiAgICAvLyBpbnB1dE1hcHBlciBtYXkgaW5qZWN0IHZhbHVlcyBmcm9tIGFueXdoZXJlLCBzbyB0aGUgc2VlZCBpcyBzY3J1YmJlZFxuICAgIC8vIHVuZGVyIHRoZSBwb2xpY3kgYmVmb3JlIGFueSByZWNvcmRlciBzZWVzIGl0LiBTYW1lIG9iamVjdCB3aGVuIG5vdGhpbmdcbiAgICAvLyBpbiBpdCBpcyByZWRhY3RlZCAodGhlIG5vLXBvbGljeSBwYXRoIGFsbG9jYXRlcyBub3RoaW5nKS5cbiAgICBjb25zdCBuYXJyYXRpdmVJbnB1dCA9IHJlZGFjdGlvblJ1bGUgPyByZWRhY3Rpb25SdWxlLnJldGFpbkJvdW5kYXJ5KG1hcHBlZElucHV0KSA6IG1hcHBlZElucHV0O1xuICAgIC8vIGBGbG93U3ViZmxvd0V2ZW50LmRlc2NyaXB0aW9uYCBpcyBzZW1hbnRpY2FsbHkgXCJ3aGF0IHRoaXMgc3ViZmxvdyBkb2VzXCIg4oCUIHNvdXJjZWQgZnJvbVxuICAgIC8vIHRoZSBzdWJmbG93J3Mgb3duIHJvb3Qgc3RhZ2UsIG5vdCB0aGUgcGFyZW50IG1vdW50IHBvaW50LiBUaGUgbW91bnQgbm9kZSBuZXZlciBjYXJyaWVzXG4gICAgLy8gYSBkZXNjcmlwdGlvbiAoYnVpbGRlcnMgZG9uJ3QgY29weSBpdCksIHNvIHJlYWRpbmcgYG5vZGUuZGVzY3JpcHRpb25gIGhlcmUgcmV0dXJuc1xuICAgIC8vIGB1bmRlZmluZWRgIGFuZCB0YXhvbm9teSBtYXJrZXJzIHNldCBvbiB0aGUgc3ViZmxvdyByb290IChlLmcuIGFnZW50Zm9vdHByaW50J3NcbiAgICAvLyBgJ0FnZW50OiBSZUFjdCBsb29wJ2AgLyBgJ0xMTUNhbGw6IG9uZS1zaG90J2ApIG5ldmVyIHJlYWNoIGRvd25zdHJlYW0gY29uc3VtZXJzLlxuICAgIGNvbnN0IHJvb3REZXNjcmlwdGlvbiA9IHRoaXMuZGVwcy5zdWJmbG93cz8uW3N1YmZsb3dJZF0/LnJvb3Q/LmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdWJmbG93RW50cnkoXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHN1YmZsb3dJZCxcbiAgICAgIHJvb3REZXNjcmlwdGlvbiA/PyBub2RlLmRlc2NyaXB0aW9uLFxuICAgICAgcGFyZW50VHJhdmVyc2FsQ29udGV4dCxcbiAgICAgIG5hcnJhdGl2ZUlucHV0LFxuICAgICk7XG4gICAgLy8gUHJvcG9zYWwgIzAwMzogZmlyZSBvblN0YWdlRXhlY3V0ZWQgZm9yIHRoZSBtb3VudCBub2RlIEFGVEVSXG4gICAgLy8gb25TdWJmbG93RW50cnkgc28gY29uc3VtZXJzIHRyYWNraW5nIFwiZGlkIHRoaXMgc3RhZ2UgcnVuXCIgd29ya1xuICAgIC8vIHVuaWZvcm1seSBhY3Jvc3MgbGluZWFyIC8gZGVjaWRlciAvIGZvcmsgLyBzZWxlY3RvciAvIHN1YmZsb3ctbW91bnQuXG4gICAgLy8gRmlyZXMgb24gRU5UUlkgKG5vdCBleGl0KSDigJQgZW50cnkgPSBcInRoaXMgbW91bnQgcmFuXCI7IHRoZVxuICAgIC8vIHN1YmZsb3cncyBjaGlsZHJlbiBleGVjdXRlIGFmdGVyIGFzIHNlcGFyYXRlIHN0YWdlcy5cbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChcbiAgICAgIG5vZGUubmFtZSxcbiAgICAgIHJvb3REZXNjcmlwdGlvbiA/PyBub2RlLmRlc2NyaXB0aW9uLFxuICAgICAgcGFyZW50VHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICdzdWJmbG93LW1vdW50JyxcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIGlzb2xhdGVkIHJ1bnRpbWUgdmlhIGR5bmFtaWMgY29uc3RydWN0aW9uIChhdm9pZHMgY2lyY3VsYXIgaW1wb3J0KS5cbiAgICAvLyBJdHMgcm9vdCBjb250ZXh0IGlzIHRoZSBmaXJzdCBzdGFnZSB0aGUgc3ViZmxvdyB0cmF2ZXJzYWwgcnVucyDigJQgdGhlXG4gICAgLy8gcmVzdW1lIGhvcCdzIGVudHJ5IG9uIGEgcmUtZW50cnksIHRoZSBzdWJmbG93J3Mgcm9vdCBvdGhlcndpc2UuXG4gICAgY29uc3QgRXhlY3V0aW9uUnVudGltZUNsYXNzID0gdGhpcy5kZXBzLmV4ZWN1dGlvblJ1bnRpbWUuY29uc3RydWN0b3IgYXMgbmV3IChcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIGlkOiBzdHJpbmcsXG4gICAgICBkZWZhdWx0VmFsdWVzOiB1bmRlZmluZWQsXG4gICAgICBpbml0aWFsU3RhdGU6IHVuZGVmaW5lZCxcbiAgICAgIHBvbGljeTogUnVuUG9saWN5LFxuICAgICAgcmVjb3JkPzogdW5rbm93bixcbiAgICApID0+IElFeGVjdXRpb25SdW50aW1lO1xuICAgIGNvbnN0IGZpcnN0Tm9kZSA9IHJlc3VtZUhvcD8uZW50cnkgPz8gbm9kZTtcbiAgICAvLyBUaGUgY3Jhc2gtc2FmZSByZWNvcmQgKDEwLjEsIFA2KTogd2hlbiB0aGUgcnVuIHdyaXRlcyB0byBhIHNpbmssIHRoZSBtb3VudCdzIG93biBsb2cgZG9lcyB0b28sIGF0IHRoZVxuICAgIC8vIHBhcmVudCBsb2cncyBhZGRyZXNzIHBsdXMgdGhpcyBtb3VudCdzIHJ1bnRpbWVTdGFnZUlkIOKAlCBvcGVuZWQgaGVyZSwgaXRzIHNlZWQgYW5kIGV2ZXJ5IGNvbW1pdCBhcyB0aGV5IGxhbmQsXG4gICAgLy8gY2xvc2VkIGF0IHRoZSBtb3VudCdzIGV4aXQgKG9yIGl0cyBwYXVzZSwgb3IgaXRzIGZhaWx1cmUpLiBXaXRob3V0IGEgc2luazogdW5kZWZpbmVkLCB0aGUgcGxhaW4gbG9nLlxuICAgIGNvbnN0IG1vdW50UnVudGltZVN0YWdlSWQgPSBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCByZWNvcmQgPVxuICAgICAgbW91bnRSdW50aW1lU3RhZ2VJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogdGhpcy5kZXBzLmV4ZWN1dGlvblJ1bnRpbWUucmVjb3JkRm9yPy4obW91bnRSdW50aW1lU3RhZ2VJZCwgeyBzdWJmbG93SWQgfSk7XG4gICAgY29uc3QgbmVzdGVkUnVudGltZSA9IG5ldyBFeGVjdXRpb25SdW50aW1lQ2xhc3MoZmlyc3ROb2RlLm5hbWUsIGZpcnN0Tm9kZS5pZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHBvbGljeSwgcmVjb3JkKTtcblxuICAgIC8vIFNlZWQgR2xvYmFsU3RvcmUgd2l0aCB0aGUgcmlnaHQgc2hhcGUgZm9yIHRoZSBwYXRoOlxuICAgIC8vICAg4oCiIFJlc3VtZSBpbnRvIFRISVMgc3ViZmxvdyDihpIgc2VlZCBmcm9tIHRoZSBjYXB0dXJlZCBwcmUtcGF1c2VcbiAgICAvLyAgICAgc2NvcGUgc28gcmVzdW1lIGhhbmRsZXJzIHNlZSBoaXN0b3J5LCBwYXVzZWRUb29sQ2FsbElkLCBldGMuXG4gICAgLy8gICAgIChgbWFwcGVkSW5wdXRgIHN0aWxsIHJlYWNoZXMgdGhlIHN0YWdlcywgYXMgdGhlaXIgcmVhZC1vbmx5IGFyZ3MuKVxuICAgIC8vICAg4oCiIE5vcm1hbCBlbnRyeSDihpIgc2VlZCBmcm9tIHRoZSBpbnB1dE1hcHBlcidzIG1hcHBlZElucHV0LlxuICAgIGNvbnN0IHNlZWRWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gaXNSZXN1bWVGb3JUaGlzU3ViZmxvdyA/IHJlc3VtZUNhcHR1cmUhIDogbWFwcGVkSW5wdXQ7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNlZWRWYWx1ZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFRoZSBzZWVkIGlzIGNvbW1pdHRlZCBhcyB0aGUgc3ViZmxvdydzIGBoaXN0b3J5WzBdYCBieSBpdHMgcm9vdFxuICAgICAgLy8gY29udGV4dCwgbm90IGJ5IGEgZmFjYWRlIOKAlCB0aGF0IGZyYW1lIGFscmVhZHkgaG9sZHMgdGhlIHJ1bidzIHBvbGljeVxuICAgICAgLy8gKHRoZSBydW50aW1lIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIGl0KSwgc28gdGhlIHNlZWQgcmV0YWlucyB1bmRlciB0aGVcbiAgICAgIC8vIHJ1bGUsIGxhbmRzIGluIHRoZSBtaXJyb3IgYXMgdGhlIHBsYWNlaG9sZGVyLCBhbmQgY29tbWl0cyB1bmRlciB0aGVcbiAgICAgIC8vIHJ1bidzIGRpYWxzIGxpa2UgZXZlcnkgb3RoZXIgd3JpdGUgKEMtRjU6IHVuZGVyIGB3cml0ZVByb3ZlbmFuY2U6XG4gICAgICAvLyAncmVhZHMtcHJlZml4J2AgaXRzIHJvd3MgY2FycnkgYHJlYWRLZXlzOiBbXWApLlxuICAgICAgLy8gVGhlIHNlZWQgaXMgdGhlIG1vdW50J3MgYWN0IHRvbzogaXRzIGJ1bmRsZSDigJQgYGhpc3RvcnlbMF1gIG9mIHRoZVxuICAgICAgLy8gc3ViZmxvdydzIG93biBsb2cg4oCUIGNhcnJpZXMgdGhlIG1vdW50J3Mgc3RhZ2UsIHN0YWdlSWQgYW5kXG4gICAgICAvLyBydW50aW1lU3RhZ2VJZCAoUjEzOyB0aHJvdWdoIDkuMzMuMCBpdCBjYXJyaWVkIHJ1bnRpbWVTdGFnZUlkICcnIGFuZFxuICAgICAgLy8gdGhlIGZpcnN0IHN0YWdlJ3MgbmFtZXMsIHdoaWNoIG9uIGEgcmVzdW1lIHdhcyB0aGUgcmUtZW50cnkgcG9pbnQpLlxuICAgICAgdHJ5IHtcbiAgICAgICAgc2VlZFN1YmZsb3dHbG9iYWxTdG9yZShuZXN0ZWRSdW50aW1lLCBzZWVkVmFsdWVzLCBwYXJlbnRDb250ZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIFRoZSBtb3VudCdzIG93biBsb2cgb3BlbmVkIGFib3ZlOiBhIHNlZWQgdGhhdCBmYWlscyBjbG9zZXMgaXQsIG5ldmVyIGxlYXZlcyBpdCBsb29raW5nIGNyYXNoZWQuXG4gICAgICAgIG5lc3RlZFJ1bnRpbWUuY2xvc2VSZWNvcmQ/LignZmFpbGVkJyk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgLy8gUmVmcmVzaCByb290U3RhZ2VDb250ZXh0IHNvIFdyaXRlQnVmZmVyIHNlZXMgY29tbWl0dGVkIGRhdGEuIE5hbWVkXG4gICAgICAvLyBhZnRlciB0aGUgZmlyc3Qgbm9kZSBhZ2FpbiDigJQgdGhlIHNlZWQgY29udGV4dCBub3cgY2FycmllcyB0aGUgbW91bnQnc1xuICAgICAgLy8gbmFtZXMgKFIxMyksIHdoaWNoIGJlbG9uZyB0byB0aGUgc2VlZCBidW5kbGUgb25seS4gYG5ld1Jvb3RgIGdpdmVzIGl0XG4gICAgICAvLyB0aGUgc2FtZSBwb2xpY3kgYW5kIG1pcnJvci5cbiAgICAgIG5lc3RlZFJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dCA9IG5lc3RlZFJ1bnRpbWUubmV3Um9vdChmaXJzdE5vZGUubmFtZSwgZmlyc3ROb2RlLmlkKTtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIHN1YmZsb3cgcm9vdCBub2RlIOKAlCBzdHJpcCBpc1N1YmZsb3dSb290IHRvIHByZXZlbnQgcmUtZGVsZWdhdGlvbi5cbiAgICAvL1xuICAgIC8vIFBSRVNFUlZFIGBuZXh0YC4gRWFybGllciByZXZpc2lvbnMgc3RyaXBwZWQgYG5leHRgIHdoZW5ldmVyIHRoZVxuICAgIC8vIHN1YmZsb3cgcm9vdCBoYWQgY2hpbGRyZW4sIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgYG5leHRgIHdhc1xuICAgIC8vIGFsd2F5cyB0aGUgT1VURVIgbW91bnQncyBjb250aW51YXRpb24gbGVha2luZyBpbnRvIHRoZSBpbm5lclxuICAgIC8vIHRyZWUuIFRoYXQgYXNzdW1wdGlvbiB3YXMgd3Jvbmc6IHRoZSByZXNvbHZlZCBzdWJmbG93IHJvb3Qnc1xuICAgIC8vIGBuZXh0YCBpcyB0aGUgSU5ORVIgam9pbiBzdGFnZSAoZS5nLiwgUGFyYWxsZWwncyBNZXJnZSBhZnRlciBhXG4gICAgLy8gZmFuLW91dCwgVG9UJ3MgUHJ1bmVyKS4gU3RyaXBwaW5nIGl0IGJyb2tlIGNvbXBvc2l0ZSBzdWJmbG93cyDigJRcbiAgICAvLyB0aGUgam9pbiBzdGFnZSBuZXZlciByYW4sIHNvIHRoZSBzdWJmbG93IHJldHVybmVkIHBhcnRpYWwgc3RhdGUuXG4gICAgLy9cbiAgICAvLyBUaGUgb3V0ZXIgbW91bnQncyBwb3N0LXN1YmZsb3cgY29udGludWF0aW9uIGlzIGhhbmRsZWQgc2VwYXJhdGVseVxuICAgIC8vIGJ5IHRoZSBwYXJlbnQgdHJhdmVyc2VyIHZpYSBgcGFyZW50Q29udGV4dC5uZXh0Tm9kZWAgYW5kIGlzIG5ldmVyXG4gICAgLy8gY29uZmxhdGVkIHdpdGggdGhlIGlubmVyIHN1YmZsb3cncyBgbmV4dGAgY2hhaW4uXG4gICAgY29uc3Qgc3ViZmxvd05vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgLi4ubm9kZSxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyDilIDilIDilIAgRXhlY3V0ZSB2aWEgZmFjdG9yeSB0cmF2ZXJzZXIg4pSA4pSA4pSAXG4gICAgLy8gVGhlIGZhY3RvcnkgY3JlYXRlcyBhIGZ1bGwgRmxvd2NoYXJ0VHJhdmVyc2VyIHdpdGggdGhlIHNhbWUgNy1waGFzZSBhbGdvcml0aG0sXG4gICAgLy8gc2hhcmluZyB0aGUgcGFyZW50J3Mgc3RhZ2VNYXAsIHN1YmZsb3dzIGRpY3QsIGFuZCBuYXJyYXRpdmUgZ2VuZXJhdG9yLlxuICAgIGxldCBzdWJmbG93T3V0cHV0OiBhbnk7XG4gICAgLy8gQm94ZWQ6IGEgc3RhZ2UgbWF5IHRocm93IEFOWSB2YWx1ZSwgYG51bGxgIGFuZCBgdW5kZWZpbmVkYCBpbmNsdWRlZCDigJRcbiAgICAvLyBhIGZhbHN5IHRocm93biB2YWx1ZSBtdXN0IHN0aWxsIGZhaWwgdGhlIG1vdW50LlxuICAgIGxldCBzdWJmbG93RXJyb3I6IHsgZXJyb3I6IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdHJhdmVyc2VySGFuZGxlOiBTdWJmbG93VHJhdmVyc2VySGFuZGxlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgdHJhdmVyc2VySGFuZGxlID0gdGhpcy50cmF2ZXJzZXJGYWN0b3J5KHtcbiAgICAgICAgLy8gVGhlIFJFQUwgc3ViZmxvdyBncmFwaCDigJQgZXZlcnkgaWQgaW5zaWRlIHRoZSBzdWJmbG93IChsb29wIHRhcmdldHMsXG4gICAgICAgIC8vIGEgcmUtdmlzaXQgb2YgdGhlIHBhdXNlZCBzdGFnZSkgcmVzb2x2ZXMgYWdhaW5zdCBpdCwgcmUtZW50cnkgb3Igbm90LlxuICAgICAgICByb290OiBzdWJmbG93Tm9kZSxcbiAgICAgICAgLy8gV2hlcmUgdGhpcyB0cmF2ZXJzYWwgc3RhcnRzIG9uIGEgcmVzdW1lIHJlLWVudHJ5OyB2aXNpdGVkIG9uY2Ug4oCUXG4gICAgICAgIC8vIGFuZCB0aGUgc2libGluZyBwYXVzZXMgaXQgcmFpc2VzIG9uY2UgdGhhdCBlbnRyeSdzIGNoYWluIGVuZHMuXG4gICAgICAgIC4uLihyZXN1bWVIb3A/LmVudHJ5ICYmIHsgZW50cnk6IHJlc3VtZUhvcC5lbnRyeSB9KSxcbiAgICAgICAgLi4uKHJlc3VtZUhvcD8ucGVuZGluZ1BhdXNlcyAmJiB7IHBlbmRpbmdQYXVzZXM6IHJlc3VtZUhvcC5wZW5kaW5nUGF1c2VzIH0pLFxuICAgICAgICBleGVjdXRpb25SdW50aW1lOiBuZXN0ZWRSdW50aW1lLFxuICAgICAgICByZWFkT25seUNvbnRleHQ6IG1hcHBlZElucHV0LFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIC8vIFJGQy0wMDMgRDE6IHRoZSBtb3VudCBzdGFnZSdzIHJ1bnRpbWVTdGFnZUlkIOKAlCB0aGUgc3ViZmxvdyByb290XG4gICAgICAgIC8vIHN0YWdlJ3MgYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBzbyBhbmNlc3RvciBjaGFpbnMgY3Jvc3MgdGhlIG1vdW50LlxuICAgICAgICBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkOiBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIH0pO1xuXG4gICAgICBzdWJmbG93T3V0cHV0ID0gYXdhaXQgdHJhdmVyc2VySGFuZGxlLmV4ZWN1dGUoKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBQYXVzZVNpZ25hbCBpcyBub3QgYW4gZXJyb3Ig4oCUIHByZXBlbmQgc3ViZmxvdyBJRCBhbmQgcmUtdGhyb3dcbiAgICAgIC8vIGltbWVkaWF0ZWx5LiBObyBlcnJvciBsb2dnaW5nLCBubyBzdWJmbG93UmVzdWx0IHJlY29yZGluZyDigJRcbiAgICAgIC8vIHRoZSBwYXVzZSBpcyBjb250cm9sIGZsb3cuXG4gICAgICAvL1xuICAgICAgLy8gQkVGT1JFIHJlLXRocm93LCBjYXB0dXJlIHRoZSBuZXN0ZWQgcnVudGltZSdzIHN0YXRlIG9udG8gdGhlXG4gICAgICAvLyBzaWduYWwuIFRoaXMgaXMgdGhlIG9ubHkgY2hhbmNlIOKAlCBvbmNlIHdlIHJlLXRocm93LCB0aGUgb3V0ZXJcbiAgICAgIC8vIHRyYXZlcnNlciB1bndpbmRzIGFuZCB0aGUgbmVzdGVkIHJ1bnRpbWUgaXMgR0MnZC4gT24gcmVzdW1lLCB3ZSdsbFxuICAgICAgLy8gcmUtc2VlZCBhIGZyZXNoIG5lc3RlZCBydW50aW1lIGZyb20gdGhpcyBjYXB0dXJlIHNvIHJlc3VtZSBoYW5kbGVyc1xuICAgICAgLy8gY2FuIHJlYWQgdGhlIHByZS1wYXVzZSBzdWJmbG93IHNjb3BlLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBTVEFURSBvbmx5IOKAlCB0aGUgc3ViZmxvdydzIHdvcmtpbmcgbWVtb3J5IGF0IHBhdXNlIHRpbWUgKGV2ZXJ5XG4gICAgICAvLyBjb21taXR0ZWQgd3JpdGUgdXAgdG8gdGhlIHBhdXNlKSwgcmVhZCBzdHJhaWdodCBvZmYgaXRzIHN0b3JlLiBOb1xuICAgICAgLy8gc25hcHNob3QgaXMgYnVpbHQ6IGEgc25hcHNob3Qgd291bGQgYWxzbyBidWlsZCB0aGUgc3ViZmxvdydzXG4gICAgICAvLyBleGVjdXRpb24gdHJlZSBhbmQgY29weSBpdHMgY29tbWl0IGxvZyDigJQgd29yayBwcm9wb3J0aW9uYWwgdG8gaG93XG4gICAgICAvLyBsb25nIHRoZSBzdWJmbG93IHJhbiDigJQgdGhhdCB0aGUgbGVhbiBjaGVja3BvaW50IG5ldmVyIGNhcnJpZXNcbiAgICAgIC8vIChgcnVubmVyL2NoZWNrcG9pbnQudHNgKS5cbiAgICAgIC8vXG4gICAgICAvLyBDYXB0dXJlIGlzIGtleWVkIGJ5IHRoZSBTQU1FIHBhdGgtcHJlZml4ZWQgYHN1YmZsb3dJZGAgdXNlZCBpblxuICAgICAgLy8gYHN1YmZsb3dQYXRoYCwgc28gcmVzdW1lIGNhbiBsb29rIHVwIFwic2NvcGUgZm9yIHNmLWZvb1wiIGJ5IGlkLlxuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIGVycm9yLmNhcHR1cmVTdWJmbG93U2NvcGUoc3ViZmxvd0lkLCBuZXN0ZWRSdW50aW1lLmdsb2JhbFN0b3JlLmdldFN0YXRlKCkpO1xuICAgICAgICBlcnJvci5wcmVwZW5kU3ViZmxvdyhzdWJmbG93SWQpO1xuICAgICAgICBuZXN0ZWRSdW50aW1lLmNsb3NlUmVjb3JkPy4oJ3BhdXNlZCcpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIHN1YmZsb3dFcnJvciA9IHsgZXJyb3IgfTtcbiAgICAgIHBhcmVudENvbnRleHQuYWRkRXJyb3IoJ3N1YmZsb3dFcnJvcicsIHRocm93blRleHQoZXJyb3IpKTtcbiAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHN1YmZsb3cgKCR7c3ViZmxvd0lkfSk6YCwgeyBlcnJvcjogbG9nZ2FibGVTdGFnZUVycm9yKHBhcmVudENvbnRleHQsIGVycm9yKSB9KTtcbiAgICB9XG5cbiAgICAvLyBUaGUgbW91bnQncyBvd24gbG9nIGVuZGVkIOKAlCBiZWZvcmUgdGhlIG1lcmdlLWJhY2ssIHdoaWNoIGNvbW1pdHMgb24gdGhlIFBBUkVOVCdzIGxvZy5cbiAgICBuZXN0ZWRSdW50aW1lLmNsb3NlUmVjb3JkPy4oc3ViZmxvd0Vycm9yID8gJ2ZhaWxlZCcgOiAnb2snKTtcblxuICAgIC8vIEFsd2F5cyBtZXJnZSBuZXN0ZWQgc3ViZmxvdyByZXN1bHRzIChldmVuIG9uIGVycm9yIOKAlCBwYXJ0aWFsIHJlc3VsdHMgYWlkIGRlYnVnZ2luZylcbiAgICBpZiAodHJhdmVyc2VySGFuZGxlKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmF2ZXJzZXJIYW5kbGUuZ2V0U3ViZmxvd1Jlc3VsdHMoKSkge1xuICAgICAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIEJyZWFrIHByb3BhZ2F0aW9uIChvcHQtaW4gdmlhIFN1YmZsb3dNb3VudE9wdGlvbnMucHJvcGFnYXRlQnJlYWspIOKUgOKUgFxuICAgIC8vXG4gICAgLy8gSWYgdGhlIHN1YmZsb3cncyBpbm5lciB0cmF2ZXJzYWwgYnJva2UgKGJlY2F1c2UgYSBzdGFnZSBjYWxsZWRcbiAgICAvLyBgc2NvcGUuJGJyZWFrKHJlYXNvbilgKSBBTkQgdGhlIG1vdW50IGRlY2xhcmVkIGBwcm9wYWdhdGVCcmVhazogdHJ1ZWAsXG4gICAgLy8gZm9yd2FyZCB0aGUgYnJlYWsgc3RhdGUgdG8gdGhlIFBBUkVOVCdzIGJyZWFrRmxhZy4gVGhlIHBhcmVudFxuICAgIC8vIHRyYXZlcnNlciB3aWxsIHNlZSBgc2hvdWxkQnJlYWtgIG9uIGl0cyBuZXh0IHN0ZXAgYW5kIHN0b3AuXG4gICAgLy9cbiAgICAvLyBXaXRob3V0IHRoaXMsIGlubmVyIGJyZWFrcyBhcmUgbG9jYWxseSBzY29wZWQgdG8gdGhlIHN1YmZsb3cg4oCUIHRoZVxuICAgIC8vIHBhcmVudCBjb250aW51ZXMgYXMgaWYgdGhlIHN1YmZsb3cgcmV0dXJuZWQgbm9ybWFsbHkuXG4gICAgLy9cbiAgICAvLyBJTVBPUlRBTlQ6IHRoaXMgcnVucyBCRUZPUkUgYG91dHB1dE1hcHBpbmdgIGJlbG93LCBpbnRlbnRpb25hbGx5LiBUaGVcbiAgICAvLyBvdXRwdXRNYXBwZXIgc3RpbGwgZXhlY3V0ZXMsIHNvIHRoZSBzdWJmbG93J3MgcGFydGlhbCByZXN1bHQgc3RpbGxcbiAgICAvLyBsYW5kcyBpbiB0aGUgcGFyZW50IHNjb3BlLiBDb25zdW1lcnMgd2hvIG5lZWQgdG8gc3VwcHJlc3Mgb3V0cHV0IG9uXG4gICAgLy8gYnJlYWsgY2hlY2sgdGhlIGJyZWFrIHN0YXRlIGluc2lkZSB0aGVpciBvdXRwdXRNYXBwZXIgYW5kIGVhcmx5LXJldHVybi5cbiAgICAvLyBTZWUgYFN1YmZsb3dNb3VudE9wdGlvbnMucHJvcGFnYXRlQnJlYWtgIEpTRG9jIGZvciByYXRpb25hbGUuXG4gICAgaWYgKHRyYXZlcnNlckhhbmRsZSAmJiBtb3VudE9wdGlvbnM/LnByb3BhZ2F0ZUJyZWFrID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBpbm5lckJyZWFrID0gdHJhdmVyc2VySGFuZGxlLmdldEJyZWFrU3RhdGUoKTtcbiAgICAgIGlmIChpbm5lckJyZWFrLnNob3VsZEJyZWFrKSB7XG4gICAgICAgIGJyZWFrRmxhZy5zaG91bGRCcmVhayA9IHRydWU7XG4gICAgICAgIGlmIChpbm5lckJyZWFrLnJlYXNvbiAhPT0gdW5kZWZpbmVkICYmIGJyZWFrRmxhZy5yZWFzb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGJyZWFrRmxhZy5yZWFzb24gPSBpbm5lckJyZWFrLnJlYXNvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBSYWlzZSBhIHBhcmVudC1sZXZlbCBvbkJyZWFrIGV2ZW50IHNvIHJlY29yZGVycyBjYW4gZGlzdGluZ3Vpc2hcbiAgICAgICAgLy8gdGhlIGlubmVyIG9yaWdpbmF0aW5nIGJyZWFrIChmaXJlZCBpbnNpZGUgdGhlIHN1YmZsb3cpIGZyb20gdGhpc1xuICAgICAgICAvLyBwcm9wYWdhdGVkIG9uZSAoZmlyZWQgYXQgdGhlIG1vdW50IGxldmVsIG9uIHRoZSBwYXJlbnQpLlxuICAgICAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uQnJlYWsoc3ViZmxvd05hbWUsIHBhcmVudFRyYXZlcnNhbENvbnRleHQsIGlubmVyQnJlYWsucmVhc29uLCBzdWJmbG93SWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN1YmZsb3dUcmVlQ29udGV4dCA9IG5lc3RlZFJ1bnRpbWUuZ2V0U25hcHNob3QoKTtcblxuICAgIC8vIOKUgOKUgOKUgCBPdXRwdXQgTWFwcGluZyDilIDilIDilIBcbiAgICBpZiAoIXN1YmZsb3dFcnJvciAmJiBtb3VudE9wdGlvbnM/Lm91dHB1dE1hcHBlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhlIG1lcmdlLWJhY2sgaXMgdGhlIE1PVU5UJ3MgYWN0LCBzbyB0aGUgbW91bnQncyBmcmFtZSBzdGFnZXMgYW5kXG4gICAgICAgIC8vIGNvbW1pdHMgaXQg4oCUIGl0cyBidW5kbGUgY2FycmllcyB0aGUgbW91bnQncyBydW50aW1lU3RhZ2VJZCAoUjEzKS5cbiAgICAgICAgLy8gQSBicmFuY2ggb3IgZm9yay1jaGlsZCBtb3VudCBzdGlsbCBsYW5kcyBpdHMgdmFsdWVzIHdoZXJlIGl0c1xuICAgICAgICAvLyBwYXJlbnQgd3JpdGVzICh0aGUgcGFyZW50J3MgcnVuIG5hbWVzcGFjZSksIGFzIGJlZm9yZTsgdW50aWwgOS4zMy4wXG4gICAgICAgIC8vIGl0IGNvbW1pdHRlZCBPTiB0aGUgcGFyZW50J3MgZnJhbWUsIHNvIHRoZSBidW5kbGUgbmFtZWQgdGhlIHN0YWdlXG4gICAgICAgIC8vIGJlZm9yZSB0aGUgbW91bnQsIG9yIHRoZSBicmFuY2hpbmcgZGVjaWRlci5cbiAgICAgICAgY29uc3Qgb3V0cHV0Q29udGV4dCA9IHBhcmVudENvbnRleHQ7XG4gICAgICAgIGlmIChwYXJlbnRDb250ZXh0LmJyYW5jaElkICYmIHBhcmVudENvbnRleHQucGFyZW50KSB7XG4gICAgICAgICAgb3V0cHV0Q29udGV4dC51c2VBZGRyZXNzT2YocGFyZW50Q29udGV4dC5wYXJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50U2NvcGUgPSBvdXRwdXRDb250ZXh0LmdldFNjb3BlKCk7XG4gICAgICAgIC8vIEZvciBUeXBlZFNjb3BlIHN1YmZsb3dzLCBzdGFnZSBmdW5jdGlvbnMgcmV0dXJuIHZvaWQg4oCUIGZhbGwgYmFjayB0byBhIHNoYWxsb3cgY2xvbmVcbiAgICAgICAgLy8gb2YgdGhlIHN1YmZsb3cncyBzaGFyZWQgc3RhdGUgc28gb3V0cHV0TWFwcGVyIGNhbiBhY2Nlc3MgYWxsIHNjb3BlIHZhbHVlcyB3cml0dGVuXG4gICAgICAgIC8vIGR1cmluZyB0aGUgc3ViZmxvdy4gV2Ugc2hhbGxvdy1jbG9uZSB0byBhdm9pZCBhbGlhc2luZyB0aGUgbGl2ZSBTaGFyZWRNZW1vcnkgY29udGV4dC5cbiAgICAgICAgLy8gTk9URTogdGhlIGZ1bGwgc2NvcGUgaXMgcGFzc2VkIChub3QganVzdCBkZWNsYXJlZCBvdXRwdXRzKSDigJQgb3V0cHV0TWFwcGVyIG11c3RcbiAgICAgICAgLy8gZXhwbGljaXRseSBzZWxlY3Qgd2hhdCB0byBwcm9wYWdhdGUgdG8gdGhlIHBhcmVudC5cbiAgICAgICAgLy8gUmVkYWN0aW9uOiBgYXBwbHlPdXRwdXRNYXBwaW5nYCB3cml0ZXMgdGhyb3VnaCBgb3V0cHV0Q29udGV4dGAgKGFcbiAgICAgICAgLy8gU3RhZ2VDb250ZXh0LCBub3QgYSBmYWNhZGUpLiBUaGUgY29udGV4dCdzIHdyaXRlIGZ1bm5lbCBhc2tzIHRoZVxuICAgICAgICAvLyBydW4ncyByZWRhY3Rpb24gcnVsZSDigJQgc2hhcmVkIHdpdGggdGhlIHN1YmZsb3cncyBjb250ZXh0cywgc28gYSBrZXlcbiAgICAgICAgLy8gdGhlIHBvbGljeSBuYW1lcyBPUiBhIGtleSBtYXJrZWQgcGVyLWNhbGwgaW5zaWRlIHRoZSBzdWJmbG93IGlzXG4gICAgICAgIC8vIHNjcnViYmVkIGluIHRoZSBQQVJFTlQncyBsb2cgYW5kIG1pcnJvciB0b28gKDkuMTkuMDsgYmVmb3JlLCB0aGlzXG4gICAgICAgIC8vIG1lcmdlLWJhY2sgcmV0YWluZWQgcGxhaW50ZXh0KS5cbiAgICAgICAgY29uc3QgZWZmZWN0aXZlT3V0cHV0ID0gc3ViZmxvd091dHB1dCA/PyB7IC4uLnN1YmZsb3dUcmVlQ29udGV4dC5zaGFyZWRTdGF0ZSB9O1xuICAgICAgICBjb25zdCBtYXBwZWRPdXRwdXQgPSBhcHBseU91dHB1dE1hcHBpbmcoXG4gICAgICAgICAgZWZmZWN0aXZlT3V0cHV0LFxuICAgICAgICAgIHBhcmVudFNjb3BlLFxuICAgICAgICAgIG91dHB1dENvbnRleHQsXG4gICAgICAgICAgbW91bnRPcHRpb25zLFxuICAgICAgICAgIHJlZGFjdGlvblJ1bGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgb3V0cHV0Q29udGV4dC5jb21taXQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgLy8gQSBtZXJnZS1iYWNrIHRoYXQgZmFpbGVkIHRvIGNvbW1pdCAoYW4gdW5jbG9uZWFibGUgdmFsdWUpIGxlYXZlcyBpdHNcbiAgICAgICAgLy8gd3JpdGVzIHN0YWdlZCBvbiB0aGUgbW91bnQncyBmcmFtZTsgdGhlIG1vdW50J3MgZXhpdCBjb21taXQgYmVsb3dcbiAgICAgICAgLy8gd291bGQgdGhyb3cgdGhlbSBhZ2Fpbiwgb3V0c2lkZSB0aGlzIGNhdGNoLiBUaHJvdWdoIDkuMzMuMCB0aGV5XG4gICAgICAgIC8vIHdlcmUgc3RhZ2VkIG9uIHRoZSBwYXJlbnQncyBmcmFtZSwgd2hpY2ggd2FzIG5vdCBjb21taXR0ZWQgYWdhaW4sXG4gICAgICAgIC8vIHNvIHRoZSBydW4gd2VudCBvbiDigJQgZHJvcCB0aGVtLCBhcyBpdCBkaWQuIEEgbGluZWFyIG1vdW50J3MgZnJhbWVcbiAgICAgICAgLy8gaXMgbGVmdCBhcyBpdCBhbHdheXMgd2FzLlxuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5icmFuY2hJZCAmJiBwYXJlbnRDb250ZXh0LnBhcmVudCkgcGFyZW50Q29udGV4dC5kaXNjYXJkU3RhZ2VkKCk7XG4gICAgICAgIHBhcmVudENvbnRleHQuYWRkRXJyb3IoJ291dHB1dE1hcHBlckVycm9yJywgdGhyb3duVGV4dChlcnJvcikpO1xuICAgICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBvdXRwdXRNYXBwZXIgZm9yIHN1YmZsb3cgKCR7c3ViZmxvd0lkfSk6YCwge1xuICAgICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IocGFyZW50Q29udGV4dCwgZXJyb3IpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdWJmbG93UmVzdWx0OiBTdWJmbG93UmVzdWx0ID0ge1xuICAgICAgc3ViZmxvd0lkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICB0cmVlQ29udGV4dDoge1xuICAgICAgICBnbG9iYWxDb250ZXh0OiBzdWJmbG93VHJlZUNvbnRleHQuc2hhcmVkU3RhdGUsXG4gICAgICAgIHN0YWdlQ29udGV4dHM6IHN1YmZsb3dUcmVlQ29udGV4dC5leGVjdXRpb25UcmVlIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIGhpc3Rvcnk6IHN1YmZsb3dUcmVlQ29udGV4dC5jb21taXRMb2csXG4gICAgICAgIC4uLihzdWJmbG93VHJlZUNvbnRleHQubG9nQWRkcmVzcyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGxvZ0FkZHJlc3M6IHN1YmZsb3dUcmVlQ29udGV4dC5sb2dBZGRyZXNzIH0pLFxuICAgICAgICAvLyBUaGUgc3ViZmxvdydzIG93biBmb2xkIGJhc2UgdHJhdmVscyB3aXRoIGl0cyBvd24gbG9nIOKAlCBzYW1lXG4gICAgICAgIC8vIGNvbnRyYWN0IGFzIHRoZSBydW4tbGV2ZWwgYFJ1bnRpbWVTbmFwc2hvdC5pbml0aWFsU3RhdGVgLlxuICAgICAgICBpbml0aWFsU3RhdGU6IHN1YmZsb3dUcmVlQ29udGV4dC5pbml0aWFsU3RhdGUsXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhZ2VJZDogcGFyZW50Q29udGV4dC5nZXRTdGFnZUlkKCksXG4gICAgfTtcblxuICAgIGNvbnN0IHN1YmZsb3dEZWYgPSB0aGlzLmRlcHMuc3ViZmxvd3M/LltzdWJmbG93SWRdO1xuICAgIGlmIChzdWJmbG93RGVmICYmIChzdWJmbG93RGVmIGFzIGFueSkuYnVpbGRUaW1lU3RydWN0dXJlKSB7XG4gICAgICBzdWJmbG93UmVzdWx0LnBpcGVsaW5lU3RydWN0dXJlID0gKHN1YmZsb3dEZWYgYXMgYW55KS5idWlsZFRpbWVTdHJ1Y3R1cmU7XG4gICAgfVxuXG4gICAgLy8gVGhlIHNlcnZlZCBzdGF0ZSAoOS4yMC4wKTogdGhlIG5lc3RlZCBtaXJyb3IncyBmaW5hbCBzdGF0ZSwgcmVtZW1iZXJlZFxuICAgIC8vIEJFU0lERSB0aGUgcmVzdWx0IOKAlCBgdHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dGAgc3RheXMgdGhlIGxpdmUgaGVhcCBmb3JcbiAgICAvLyB0aGUgcGxhaW4gc25hcHNob3QgYW5kIHRoZSBjaGVja3BvaW50OyBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgXG4gICAgLy8gc3Vic3RpdHV0ZXMgdGhlIG1pcnJvciB0aHJvdWdoIGBzZXJ2ZWRTdWJmbG93UmVzdWx0c2AuIEFic2VudCB3aXRob3V0XG4gICAgLy8gYSBwb2xpY3kuIFRoZSBleGl0IGV2ZW50IGJlbG93IGNhcnJpZXMgdGhlIHNhbWUgc2VydmVkIHZpZXc7IHdpdGhvdXQgYVxuICAgIC8vIG1pcnJvciBpdCBjYXJyaWVzIHRoZSBoZWFwIHJldGFpbmVkIHVuZGVyIHRoZSBydWxlIChwZXItY2FsbCBtYXJrc1xuICAgIC8vIGFsb25lIGtlZXAgbm8gbWlycm9yKSDigJQgdGhlIHNhbWUgb2JqZWN0IHdoZW4gbm90aGluZyBpcyByZWRhY3RlZC5cbiAgICBjb25zdCByYXdTdGF0ZSA9IHN1YmZsb3dSZXN1bHQudHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dDtcbiAgICBjb25zdCBtaXJyb3JTdGF0ZSA9IG5lc3RlZFJ1bnRpbWUucmVkYWN0ZWRTdG9yZT8uZ2V0U3RhdGUoKTtcbiAgICBpZiAobWlycm9yU3RhdGUgIT09IHVuZGVmaW5lZCkgcmVtZW1iZXJSZWRhY3RlZFN1YmZsb3dTdGF0ZShzdWJmbG93UmVzdWx0LCBtaXJyb3JTdGF0ZSk7XG4gICAgLy8gSGFuZGVkIG91dCB3aG9sZSwgc28gaXQgaXMgYSBib3VuZGFyeSByZWNvcmQ6IG5lc3RlZCBwb2xpY3kga2V5cyBhcmUgc2NydWJiZWQgdG9vXG4gICAgLy8gKHRoZSBtaXJyb3IncyBvd24gcGxhY2Vob2xkZXIsIHNvIGl0cyB0b3Aga2V5cyBrZWVwIHRoZWlyIGJ5dGVzKS5cbiAgICBjb25zdCBleGl0U3RhdGUgPSAhcmVkYWN0aW9uUnVsZVxuICAgICAgPyBtaXJyb3JTdGF0ZSA/PyByYXdTdGF0ZVxuICAgICAgOiBtaXJyb3JTdGF0ZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnkobWlycm9yU3RhdGUsIExPR19QTEFDRUhPTERFUilcbiAgICAgIDogcmVkYWN0aW9uUnVsZS5yZXRhaW5Cb3VuZGFyeShyYXdTdGF0ZSk7XG5cbiAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQoc3ViZmxvd0lkLCBzdWJmbG93UmVzdWx0KTtcbiAgICAvLyBBZGRpdGl2ZSBwZXItZXhlY3V0aW9uIGtleSAoZGVzaWduOiBkb2NzL2Rlc2lnbi9zdWJmbG93LWNvbW1pdC12aXNpYmlsaXR5Lm1kKS4gQSBMT09QSU5HXG4gICAgLy8gc3ViZmxvdyByZS1lbnRlcnMgd2l0aCB0aGUgU0FNRSBzdWJmbG93SWQsIHNvIHRoZSBwYXRoIGtleSBhYm92ZSBpcyBPVkVSV1JJVFRFTiBlYWNoXG4gICAgLy8gaXRlcmF0aW9uIChiYWNrLWNvbXBhdDogaXQgaG9sZHMgdGhlIExBU1QgaXRlcmF0aW9uIOKAlCB3aGF0IGdldFN1YnRyZWVTbmFwc2hvdC9saXN0U3ViZmxvd1BhdGhzXG4gICAgLy8gYW5kIHRoZSBldWkgZmFsbGJhY2sgc2VlLCB1bmNoYW5nZWQpLiBBTFNPIGtleSBieSB0aGUgbW91bnQncyBVTklRVUUgcnVudGltZVN0YWdlSWQgc28gRVZFUllcbiAgICAvLyBpdGVyYXRpb24ncyByZXN1bHQgaXMgcmV0YWluZWQgYW5kIGFkZHJlc3NhYmxlIChldWkgcGVyLWxvb3AgZHJpbGwtZG93biwgcGVyLXNjb3BlIGxvY2FsaXphdGlvbikuXG4gICAgLy8gcnVudGltZVN0YWdlSWQgYWx3YXlzIGNvbnRhaW5zICcjJzsgc3ViZmxvd0lkIG5ldmVyIGRvZXMg4oCUIHNvIHRoZXkgbmV2ZXIgY29sbGlkZSwgYW5kXG4gICAgLy8gbGlzdFN1YmZsb3dQYXRocyBmaWx0ZXJzICcjJyBrZXlzIHRvIGtlZXAgaXRzIHBhdGgtb25seSBjb250cmFjdC4gVGhlIHBhdXNlIGNoZWNrcG9pbnQgZmlsdGVyc1xuICAgIC8vIHRoZXNlIG91dCAoYnVpbGRQYXVzZUNoZWNrcG9pbnQpIHNvIGl0IHN0YXlzIGxlYW4uXG4gICAgaWYgKG1vdW50UnVudGltZVN0YWdlSWQgJiYgbW91bnRSdW50aW1lU3RhZ2VJZCAhPT0gc3ViZmxvd0lkKSB7XG4gICAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQobW91bnRSdW50aW1lU3RhZ2VJZCwgc3ViZmxvd1Jlc3VsdCk7XG4gICAgfVxuXG4gICAgcGFyZW50Q29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzdWJmbG93JywgYEV4aXRpbmcgJHtzdWJmbG93TmFtZX0gc3ViZmxvd2AsIHtcbiAgICAgIHRhcmdldFN0YWdlOiBzdWJmbG93SWQsXG4gICAgfSk7XG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN1YmZsb3dFeGl0KHN1YmZsb3dOYW1lLCBzdWJmbG93SWQsIHBhcmVudFRyYXZlcnNhbENvbnRleHQsIGV4aXRTdGF0ZSk7XG5cbiAgICAvLyBUaGUgbW91bnQncyBFWElUIOKAlCBhIGNvbnRpbnVhdGlvbiBvZiB0aGUgbW91bnQncyBleGVjdXRpb24sIG5hbWVkIGFzIG9uZVxuICAgIC8vIG9uIHRoZSByZWNvcmQgKDkuMzkuMCkgc28gbm8gcmVhZGVyIGluZmVycyBpdCBmcm9tIHRoZSBsb2cncyBzaGFwZS5cbiAgICBjb21taXRTdGFnZVdyaXRlcyhwYXJlbnRDb250ZXh0LCAnZXhpdCcpO1xuXG4gICAgaWYgKHN1YmZsb3dFcnJvcikge1xuICAgICAgcGFyZW50Q29udGV4dC5mYWlsdXJlU3RhdGUuYWRvcHQobmVzdGVkUnVudGltZS5yb290U3RhZ2VDb250ZXh0LmZhaWx1cmVTdGF0ZSwgc3ViZmxvd0Vycm9yLmVycm9yKTtcbiAgICAgIHRocm93IHN1YmZsb3dFcnJvci5lcnJvcjtcbiAgICB9XG5cbiAgICBuZXN0ZWRSdW50aW1lLnJvb3RTdGFnZUNvbnRleHQuZmFpbHVyZVN0YXRlLmNvbXBsZXRlKCk7XG5cbiAgICByZXR1cm4gc3ViZmxvd091dHB1dDtcbiAgfVxufVxuIl19
422
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQVVyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVyRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUc1Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQThCO0lBQ3ZELElBQUksR0FBd0MsQ0FBQztJQUM3QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1lBQUUsU0FBUztRQUNuQyxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNELE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQztBQUN0QixDQUFDO0FBRUQseUdBQXlHO0FBQ3pHLFNBQVMsWUFBWSxDQUFDLEtBQWM7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QUN4RixpR0FBaUc7UUFDakcscURBQXFEO1FBQ3JELElBQUksbUJBQW1CLElBQUksbUJBQW1CLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0QsaUJBQWlCLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxhQUFhLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLFdBQVcsV0FBVyxVQUFVLEVBQUU7WUFDN0UsV0FBVyxFQUFFLFNBQVM7U0FDdkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUV0RywyRUFBMkU7UUFDM0Usc0VBQXNFO1FBQ3RFLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV6QyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLGFBQWEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xHLE1BQU0sWUFBWSxDQUFDLEtBQUssQ0FBQztRQUMzQixDQUFDO1FBRUQsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUV2RCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN1YmZsb3dFeGVjdXRvciDigJQgSXNvbGF0aW9uIGJvdW5kYXJ5IGZvciBzdWJmbG93IGV4ZWN1dGlvbi5cbiAqXG4gKiBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBDcmVhdGUgaXNvbGF0ZWQgRXhlY3V0aW9uUnVudGltZSBmb3IgZWFjaCBzdWJmbG93XG4gKiAtIEFwcGx5IGlucHV0L291dHB1dCBtYXBwaW5nIHZpYSBTdWJmbG93SW5wdXRNYXBwZXJcbiAqIC0gRGVsZWdhdGUgdHJhdmVyc2FsIHRvIGEgZmFjdG9yeS1jcmVhdGVkIEZsb3djaGFydFRyYXZlcnNlclxuICogLSBUcmFjayBzdWJmbG93IHJlc3VsdHMgZm9yIGRlYnVnZ2luZy92aXN1YWxpemF0aW9uXG4gKlxuICogRWFjaCBzdWJmbG93IGdldHMgaXRzIG93biBHbG9iYWxTdG9yZSBmb3IgaXNvbGF0aW9uLlxuICogVHJhdmVyc2FsIHVzZXMgdGhlIFNBTUUgNy1waGFzZSBhbGdvcml0aG0gYXMgdGhlIHRvcC1sZXZlbCB0cmF2ZXJzZXJcbiAqICh2aWEgU3ViZmxvd1RyYXZlcnNlckZhY3RvcnkpLCBzbyBkZWNpZGVycywgc2VsZWN0b3JzLCBsb29wcywgbGF6eSBzdWJmbG93cyxcbiAqIGFuZCBhYm9ydCBzaWduYWxzIGFsbCB3b3JrIGluc2lkZSBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LlxuICovXG5cbmltcG9ydCB7IExPR19QTEFDRUhPTERFUiB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB7IHRocm93blRleHQgfSBmcm9tICcuLi8uLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuUG9saWN5IH0gZnJvbSAnLi4vLi4vbWVtb3J5L3J1blBvbGljeS5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEhhbmRsZXJEZXBzLFxuICBJRXhlY3V0aW9uUnVudGltZSxcbiAgU3ViZmxvd1Jlc3VsdCxcbiAgU3ViZmxvd1RyYXZlcnNlckZhY3RvcnksXG4gIFN1YmZsb3dUcmF2ZXJzZXJIYW5kbGUsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGNvbW1pdFN0YWdlV3JpdGVzIH0gZnJvbSAnLi9jb21taXRTdGFnZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc3VtZUVudHJ5IH0gZnJvbSAnLi9SZXN1bWVFbnRyeS5qcyc7XG5pbXBvcnQgeyByZW1lbWJlclJlZGFjdGVkU3ViZmxvd1N0YXRlIH0gZnJvbSAnLi9zZXJ2ZWRTdWJmbG93UmVzdWx0cy5qcyc7XG5pbXBvcnQgeyBsb2dnYWJsZVN0YWdlRXJyb3IgfSBmcm9tICcuL3N0YWdlRXJyb3IuanMnO1xuaW1wb3J0IHsgYXBwbHlPdXRwdXRNYXBwaW5nLCBnZXRJbml0aWFsU2NvcGVWYWx1ZXMsIHNlZWRTdWJmbG93R2xvYmFsU3RvcmUgfSBmcm9tICcuL1N1YmZsb3dJbnB1dE1hcHBlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJyZWFrRmxhZyB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFRoZSBtYXBwZWQgaW5wdXQsIGRldGFjaGVkIGZyb20gdGhlIHBhcmVudCdzIHN0YXRlIE9OQ0UgcGVyIG1vdW50IChEMSxcbiAqIDkuMjkuMCDigJQgZG9jcy9kZXNpZ24vMjAyNi0xMC1jb3B5LW9uLXdyaXRlLWNvbW1pdC5tZCkuXG4gKlxuICogVGhlIGlucHV0TWFwcGVyIHJlYWRzIHRoZSBwYXJlbnQncyBMSVZFIHN0YXRlIChgZ2V0U2NvcGUoKWApLCBzbyBhIHZhbHVlIGl0XG4gKiBwYXNzZXMgdGhyb3VnaCAoYChwKSA9PiAoeyBjZmc6IHAuY2ZnIH0pYCkgaXMgdGhlIHBhcmVudCdzIGNvbW1pdHRlZFxuICogb2JqZWN0IOKAlCBhbmQgdGhlIHN1YmZsb3cncyBhcmdzIGFyZSBkZWVwLUZST1pFTiBpbiBwbGFjZVxuICogKGByZWFkb25seUlucHV0IMK3IGNyZWF0ZUZyb3plbkFyZ3NgKS4gVGhlIHR5cGVkIHNjb3BlIGRvZXMgbm90IHByb3h5IGFcbiAqIGZyb3plbiB2YWx1ZSAoYGFsbG93bGlzdCDCtyBzaG91bGRXcmFwV2l0aFByb3h5YCksIHNvIGEgbGF0ZXJcbiAqIGBzY29wZS5jZmcueCA9IDFgIGluIHRoZSBwYXJlbnQgbWV0IHRoZSByYXcgZnJvemVuIG9iamVjdDogYSBUeXBlRXJyb3IgaW5cbiAqIHN0cmljdCBjb2RlLiBCZWZvcmUgOS4yOS4wIHRoZSBwYXJlbnQncyBuZXh0IHdob2xlLXN0YXRlIGNsb25lIHJlcGxhY2VkIHRoZVxuICogZnJvemVuIG9iamVjdCAoYSBtb3VudCB0aGF0IGNvbW1pdHRlZCBub3RoaW5nIGxlZnQgaXQgaW4gcGxhY2Ug4oCUIHRoZSBidWdcbiAqIGV4aXN0ZWQsIGl0IHdhcyBvbmx5IHNob3J0LWxpdmVkKTsgdW5kZXIgY29weS1vbi13cml0ZSBub3RoaW5nIHJlLWNsb25lcyxcbiAqIHNvIHRoZSBmcmVlemUgd291bGQgbGFzdCB1bnRpbCB0aGUga2V5IGlzIHJld3JpdHRlbi4gQSBtb3VudCBtdXN0IG5ldmVyXG4gKiBlZGl0IOKAlCBvciBmcmVlemUg4oCUIHRoZSBwYXJlbnQncyBjb21taXR0ZWQgb2JqZWN0czogZXZlcnkgcGxhaW4gb2JqZWN0LFxuICogYXJyYXksIGBEYXRlYCwgYE1hcGAgYW5kIGBTZXRgIHRoZSBtYXBwZXIgcmV0dXJucyBpcyBjbG9uZWQgaGVyZSwgYmVmb3JlIGl0XG4gKiBiZWNvbWVzIHRoZSBhcmdzLiBBIGNsYXNzIGluc3RhbmNlIHBhc3NlcyBieSByZWZlcmVuY2UsIGFzIGJlZm9yZSAoaXRcbiAqIGNhbm5vdCBjb21lIGZyb20gY29tbWl0dGVkIHN0YXRlLCBhbmQgYSBjbG9uZSB3b3VsZCBkcm9wIGl0cyBwcm90b3R5cGUpLlxuICogVGhlIHNlZWQgaXMgY2xvbmVkIGFnYWluIGF0IGl0cyBjb21taXQsIHNvIHRoZSBzdWJmbG93J3Mgc3RhdGUgaXNcbiAqIHVuY2hhbmdlZC5cbiAqL1xuZnVuY3Rpb24gZGV0YWNoTWFwcGVkSW5wdXQoaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBsZXQgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXQpKSB7XG4gICAgaWYgKCFpc0RldGFjaGFibGUodmFsdWUpKSBjb250aW51ZTtcbiAgICAob3V0ID8/PSB7IC4uLmlucHV0IH0pW2tleV0gPSBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICB9XG4gIHJldHVybiBvdXQgPz8gaW5wdXQ7XG59XG5cbi8qKiBBIHZhbHVlIGBzdHJ1Y3R1cmVkQ2xvbmVgIHJlcHJvZHVjZXMgd2l0aCBpdHMgb3duIHR5cGU6IHBsYWluIG9iamVjdCwgYXJyYXksIGBEYXRlYCwgYE1hcGAsIGBTZXRgLiAqL1xuZnVuY3Rpb24gaXNEZXRhY2hhYmxlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHwgdmFsdWUgaW5zdGFuY2VvZiBNYXAgfHwgdmFsdWUgaW5zdGFuY2VvZiBTZXQpIHJldHVybiB0cnVlO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIFN1YmZsb3dFeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqXG4gICAqIFRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSAoYGRlcHMucmVzdW1lYCkuIFVuZGVmaW5lZCBvbiBhIG5vcm1hbFxuICAgKiBydW4uIEFza2VkIG9uY2UgcGVyIHN1YmZsb3cgZW50cnkg4oCUIHNlZSB7QGxpbmsgUmVzdW1lRW50cnl9LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXN1bWU6IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LFxuICAgIHByaXZhdGUgdHJhdmVyc2VyRmFjdG9yeTogU3ViZmxvd1RyYXZlcnNlckZhY3Rvcnk8VE91dCwgVFNjb3BlPixcbiAgKSB7XG4gICAgdGhpcy5yZXN1bWUgPSBkZXBzLnJlc3VtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgc3ViZmxvdyB3aXRoIGlzb2xhdGVkIGNvbnRleHQuXG4gICAqXG4gICAqIDEuIENyZWF0ZXMgYSBmcmVzaCBFeGVjdXRpb25SdW50aW1lIGZvciB0aGUgc3ViZmxvd1xuICAgKiAyLiBBcHBsaWVzIGlucHV0IG1hcHBpbmcgdG8gc2VlZCB0aGUgc3ViZmxvdydzIEdsb2JhbFN0b3JlXG4gICAqIDMuIERlbGVnYXRlcyB0cmF2ZXJzYWwgdG8gYSBmYWN0b3J5LWNyZWF0ZWQgRmxvd2NoYXJ0VHJhdmVyc2VyXG4gICAqIDQuIEFwcGxpZXMgb3V0cHV0IG1hcHBpbmcgdG8gd3JpdGUgcmVzdWx0cyBiYWNrIHRvIHBhcmVudCBzY29wZVxuICAgKiA1LiBTdG9yZXMgZXhlY3V0aW9uIGRhdGEgZm9yIGRlYnVnZ2luZy92aXN1YWxpemF0aW9uXG4gICAqL1xuICBhc3luYyBleGVjdXRlU3ViZmxvdyhcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBwYXJlbnRDb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbGFnOiBCcmVha0ZsYWcsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHN1YmZsb3dSZXN1bHRzTWFwOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PixcbiAgICBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBzdWJmbG93SWQgPSBub2RlLnN1YmZsb3dJZCE7XG4gICAgY29uc3Qgc3ViZmxvd05hbWUgPSBub2RlLnN1YmZsb3dOYW1lID8/IG5vZGUubmFtZTtcblxuICAgIHBhcmVudENvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnc3ViZmxvdycsIGBFbnRlcmluZyAke3N1YmZsb3dOYW1lfSBzdWJmbG93YCwge1xuICAgICAgdGFyZ2V0U3RhZ2U6IHN1YmZsb3dJZCxcbiAgICB9KTtcblxuICAgIC8vIOKUgOKUgOKUgCBSZXN1bWUgcmUtZW50cnkgKG9uZS1zaG90KSDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFdoZW4gdGhpcyBlbnRyeSBpcyB0aGUgcmVzdW1lJ3Mgd2F5IGJhY2sgaW50byBhIHBhdXNlZCBzdWJmbG93LCB0aGVcbiAgICAvLyBob3AgbmFtZXMgd2hlcmUgdGhlIHN1YmZsb3cncyB0cmF2ZXJzYWwgc3RhcnRzICh0aGUgbmV4dCBtb3VudCBvbiB0aGVcbiAgICAvLyBwYXVzZSBwYXRoLCBvciB0aGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4pLCBjYXJyaWVzIHRoZSBzdWJmbG93J3NcbiAgICAvLyBjYXB0dXJlZCBwcmUtcGF1c2Ugc3RhdGUsIGFuZCBhbnkgc2libGluZyBwYXVzZXMgd2FpdGluZyBpbiBpdC4gVGFrZW5cbiAgICAvLyBPTkNFOiBhbnkgbGF0ZXIgZW50cnkgaW50byB0aGlzIHN1YmZsb3cg4oCUIGEgbG9vcCBwYXNzaW5nIGl0cyBtb3VudFxuICAgIC8vIGFnYWluIOKAlCBnZXRzIGB1bmRlZmluZWRgIGFuZCBydW5zIHRoZSByZWFsIHN1YmZsb3cgZnJvbSBpdHMgcmVhbCByb290LFxuICAgIC8vIGlucHV0TWFwcGVyIGFuZCBhbGwuXG4gICAgY29uc3QgcmVzdW1lSG9wID0gdGhpcy5yZXN1bWU/LmVudGVyU3ViZmxvdyhzdWJmbG93SWQpO1xuXG4gICAgLy8g4pSA4pSA4pSAIElucHV0IE1hcHBpbmcg4pSA4pSA4pSAXG4gICAgLy9cbiAgICAvLyBUaGUgbWFwcGVyIHJ1bnMgb24gRVZFUlkgZW50cnk6IGl0cyByZXN1bHQgaXMgdGhlIHN0YWdlcycgcmVhZC1vbmx5XG4gICAgLy8gYXJncyAoYCRnZXRBcmdzKClgKSwgYW5kIGEgcmUtZW50ZXJlZCBzdWJmbG93J3Mgc3RhZ2VzIHJlYWQgdGhlIHNhbWVcbiAgICAvLyBhcmdzIHRoZXkgcmVhZCBiZWZvcmUgdGhlIHBhdXNlICh0aGUgcGFyZW50J3MgdmlldyBpcyB0aGUgc2FtZSBvbmUg4oCUXG4gICAgLy8gaXQgd2FzIGJsb2NrZWQgaW4gdGhpcyBtb3VudCkuIFdoYXQgYSByZXN1bWUgY2hhbmdlcyBpcyBvbmx5IHRoZSBTRUVEOlxuICAgIC8vIHdoZW4gdGhlIGhvcCBjYXJyaWVzIGEgY2FwdHVyZSwgdGhlIG5lc3RlZCBtZW1vcnkgaXMgc2VlZGVkIGZyb20gdGhlXG4gICAgLy8gY2FwdHVyZSwgbm90IGZyb20gdGhlIG1hcHBlciDigJQgdGhlIGNhcHR1cmUgaXMgdGhlIHBvc3QtaW5wdXQgcHJlLXBhdXNlXG4gICAgLy8gbWVtb3J5LCBhbmQgc2VlZGluZyB0aGUgbWFwcGVyJ3MgdmFsdWVzIHdvdWxkIGNsb2JiZXIgcG9zdC1pbnB1dFxuICAgIC8vIHdyaXRlcyAoaGlzdG9yeSwgcGF1c2VkVG9vbENhbGxJZCwgZXRjLikgd2l0aCB0aGUgc3RhcnQtb2Ytc3ViZmxvdyB2aWV3LlxuICAgIGNvbnN0IG1vdW50T3B0aW9ucyA9IG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucztcbiAgICBsZXQgbWFwcGVkSW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgY29uc3QgcmVzdW1lQ2FwdHVyZSA9IHJlc3VtZUhvcD8uc2VlZDtcbiAgICBjb25zdCBpc1Jlc3VtZUZvclRoaXNTdWJmbG93ID0gcmVzdW1lQ2FwdHVyZSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgLy8gVGhlIHJ1bidzIHBvbGljeSAoRjUpIOKAlCB0aGUgZm91ciBkaWFscywgdGhlIHJlZGFjdGlvbiBydWxlLCB0aGUgbWlycm9yXG4gICAgLy8gZmxhZyDigJQgcmVhZCBvZmYgdGhlIHBhcmVudC1tb3VudCBmcmFtZSwgd2hpY2ggaG9sZHMgaXQgYnkgcmVmZXJlbmNlLlxuICAgIC8vIFRoZSBuZXN0ZWQgcnVudGltZSBpcyBjb25zdHJ1Y3RlZCBXSVRIIGl0LCBzbyB0aGUgc2VlZCBjb21taXQgYmVsb3dcbiAgICAvLyAoYGhpc3RvcnlbMF1gKSBhbmQgZXZlcnkgbGF0ZXIgY29tbWl0IG9mIHRoZSBzdWJmbG93IHJ1biB1bmRlciB0aGUgc2FtZVxuICAgIC8vIG9iamVjdCwgYW5kIHRoZSBuZXN0ZWQgcnVudGltZSBrZWVwcyBhIG1pcnJvciBvZiBpdHMgb3duIGV4YWN0bHkgd2hlblxuICAgIC8vIHRoZSBydW4gZG9lcyAoaXRzIFNFUlZFRCBzdGF0ZSBpcyB0aGVuIHRoZSBmb2xkIG9mIGl0cyBvd24gc2NydWJiZWRcbiAgICAvLyBsb2csIG5ldmVyIGEgc2Vjb25kIHNjcnViKS5cbiAgICBjb25zdCBwb2xpY3k6IFJ1blBvbGljeSA9IHBhcmVudENvbnRleHQuZ2V0UG9saWN5KCk7XG4gICAgY29uc3QgcmVkYWN0aW9uUnVsZSA9IHBvbGljeS5yZWRhY3Rpb247XG5cbiAgICBpZiAobW91bnRPcHRpb25zKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJlbnRTY29wZSA9IHBhcmVudENvbnRleHQuZ2V0U2NvcGUoKTtcbiAgICAgICAgLy8gVGhlIHJ1bGUgcmlkZXMgYWxvbmc6IGEga2V5IHRoZSBtYXBwZXIgY29waWVzIGEgc2VsZWN0ZWQgdmFsdWUgaW50b1xuICAgICAgICAvLyBpbmhlcml0cyBpdHMgcmVkYWN0aW9uIGJlZm9yZSB0aGUgc2VlZCBpcyB3cml0dGVuICh0aGUgdGFpbnQgcnVsZSkuXG4gICAgICAgIG1hcHBlZElucHV0ID0gZGV0YWNoTWFwcGVkSW5wdXQoZ2V0SW5pdGlhbFNjb3BlVmFsdWVzKHBhcmVudFNjb3BlLCBtb3VudE9wdGlvbnMsIHJlZGFjdGlvblJ1bGUpKTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1hcHBlZElucHV0KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gbWFwcGVkSW5wdXQgaXMgY2FwdHVyZWQgaW4gU3ViZmxvd1Jlc3VsdC50cmVlQ29udGV4dCBmb3IgZGVidWdnaW5nXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgcGFyZW50Q29udGV4dC5hZGRFcnJvcignaW5wdXRNYXBwZXJFcnJvcicsIHRocm93blRleHQoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gaW5wdXRNYXBwZXIgZm9yIHN1YmZsb3cgKCR7c3ViZmxvd0lkfSk6YCwge1xuICAgICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IocGFyZW50Q29udGV4dCwgZXJyb3IpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTmFycmF0aXZlIHJlY2VpdmVzIHRoZSBSRVRBSU5FRCBmb3JtIG9mIHRoZSBtYXBwZWQgaW5wdXQg4oCUIGFuXG4gICAgLy8gaW5wdXRNYXBwZXIgbWF5IGluamVjdCB2YWx1ZXMgZnJvbSBhbnl3aGVyZSwgc28gdGhlIHNlZWQgaXMgc2NydWJiZWRcbiAgICAvLyB1bmRlciB0aGUgcG9saWN5IGJlZm9yZSBhbnkgcmVjb3JkZXIgc2VlcyBpdC4gU2FtZSBvYmplY3Qgd2hlbiBub3RoaW5nXG4gICAgLy8gaW4gaXQgaXMgcmVkYWN0ZWQgKHRoZSBuby1wb2xpY3kgcGF0aCBhbGxvY2F0ZXMgbm90aGluZykuXG4gICAgY29uc3QgbmFycmF0aXZlSW5wdXQgPSByZWRhY3Rpb25SdWxlID8gcmVkYWN0aW9uUnVsZS5yZXRhaW5Cb3VuZGFyeShtYXBwZWRJbnB1dCkgOiBtYXBwZWRJbnB1dDtcbiAgICAvLyBgRmxvd1N1YmZsb3dFdmVudC5kZXNjcmlwdGlvbmAgaXMgc2VtYW50aWNhbGx5IFwid2hhdCB0aGlzIHN1YmZsb3cgZG9lc1wiIOKAlCBzb3VyY2VkIGZyb21cbiAgICAvLyB0aGUgc3ViZmxvdydzIG93biByb290IHN0YWdlLCBub3QgdGhlIHBhcmVudCBtb3VudCBwb2ludC4gVGhlIG1vdW50IG5vZGUgbmV2ZXIgY2Fycmllc1xuICAgIC8vIGEgZGVzY3JpcHRpb24gKGJ1aWxkZXJzIGRvbid0IGNvcHkgaXQpLCBzbyByZWFkaW5nIGBub2RlLmRlc2NyaXB0aW9uYCBoZXJlIHJldHVybnNcbiAgICAvLyBgdW5kZWZpbmVkYCBhbmQgdGF4b25vbXkgbWFya2VycyBzZXQgb24gdGhlIHN1YmZsb3cgcm9vdCAoZS5nLiBhZ2VudGZvb3RwcmludCdzXG4gICAgLy8gYCdBZ2VudDogUmVBY3QgbG9vcCdgIC8gYCdMTE1DYWxsOiBvbmUtc2hvdCdgKSBuZXZlciByZWFjaCBkb3duc3RyZWFtIGNvbnN1bWVycy5cbiAgICBjb25zdCByb290RGVzY3JpcHRpb24gPSB0aGlzLmRlcHMuc3ViZmxvd3M/LltzdWJmbG93SWRdPy5yb290Py5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3ViZmxvd0VudHJ5KFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93SWQsXG4gICAgICByb290RGVzY3JpcHRpb24gPz8gbm9kZS5kZXNjcmlwdGlvbixcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQsXG4gICAgICBuYXJyYXRpdmVJbnB1dCxcbiAgICApO1xuICAgIC8vIFByb3Bvc2FsICMwMDM6IGZpcmUgb25TdGFnZUV4ZWN1dGVkIGZvciB0aGUgbW91bnQgbm9kZSBBRlRFUlxuICAgIC8vIG9uU3ViZmxvd0VudHJ5IHNvIGNvbnN1bWVycyB0cmFja2luZyBcImRpZCB0aGlzIHN0YWdlIHJ1blwiIHdvcmtcbiAgICAvLyB1bmlmb3JtbHkgYWNyb3NzIGxpbmVhciAvIGRlY2lkZXIgLyBmb3JrIC8gc2VsZWN0b3IgLyBzdWJmbG93LW1vdW50LlxuICAgIC8vIEZpcmVzIG9uIEVOVFJZIChub3QgZXhpdCkg4oCUIGVudHJ5ID0gXCJ0aGlzIG1vdW50IHJhblwiOyB0aGVcbiAgICAvLyBzdWJmbG93J3MgY2hpbGRyZW4gZXhlY3V0ZSBhZnRlciBhcyBzZXBhcmF0ZSBzdGFnZXMuXG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN0YWdlRXhlY3V0ZWQoXG4gICAgICBub2RlLm5hbWUsXG4gICAgICByb290RGVzY3JpcHRpb24gPz8gbm9kZS5kZXNjcmlwdGlvbixcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQsXG4gICAgICAnc3ViZmxvdy1tb3VudCcsXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBpc29sYXRlZCBydW50aW1lIHZpYSBkeW5hbWljIGNvbnN0cnVjdGlvbiAoYXZvaWRzIGNpcmN1bGFyIGltcG9ydCkuXG4gICAgLy8gSXRzIHJvb3QgY29udGV4dCBpcyB0aGUgZmlyc3Qgc3RhZ2UgdGhlIHN1YmZsb3cgdHJhdmVyc2FsIHJ1bnMg4oCUIHRoZVxuICAgIC8vIHJlc3VtZSBob3AncyBlbnRyeSBvbiBhIHJlLWVudHJ5LCB0aGUgc3ViZmxvdydzIHJvb3Qgb3RoZXJ3aXNlLlxuICAgIGNvbnN0IEV4ZWN1dGlvblJ1bnRpbWVDbGFzcyA9IHRoaXMuZGVwcy5leGVjdXRpb25SdW50aW1lLmNvbnN0cnVjdG9yIGFzIG5ldyAoXG4gICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICBpZDogc3RyaW5nLFxuICAgICAgZGVmYXVsdFZhbHVlczogdW5kZWZpbmVkLFxuICAgICAgaW5pdGlhbFN0YXRlOiB1bmRlZmluZWQsXG4gICAgICBwb2xpY3k6IFJ1blBvbGljeSxcbiAgICAgIHJlY29yZD86IHVua25vd24sXG4gICAgICBzb3VyY2U/OiB7IHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7IHJlYWRvbmx5IHVuYXZhaWxhYmxlOiAnY2hpbGQtc291cmNlLW93bmVyc2hpcCcgfSxcbiAgICApID0+IElFeGVjdXRpb25SdW50aW1lO1xuICAgIGNvbnN0IGZpcnN0Tm9kZSA9IHJlc3VtZUhvcD8uZW50cnkgPz8gbm9kZTtcbiAgICAvLyBUaGUgY3Jhc2gtc2FmZSByZWNvcmQgKDEwLjEsIFA2KTogd2hlbiB0aGUgcnVuIHdyaXRlcyB0byBhIHNpbmssIHRoZSBtb3VudCdzIG93biBsb2cgZG9lcyB0b28sIGF0IHRoZVxuICAgIC8vIHBhcmVudCBsb2cncyBhZGRyZXNzIHBsdXMgdGhpcyBtb3VudCdzIHJ1bnRpbWVTdGFnZUlkIOKAlCBvcGVuZWQgaGVyZSwgaXRzIHNlZWQgYW5kIGV2ZXJ5IGNvbW1pdCBhcyB0aGV5IGxhbmQsXG4gICAgLy8gY2xvc2VkIGF0IHRoZSBtb3VudCdzIGV4aXQgKG9yIGl0cyBwYXVzZSwgb3IgaXRzIGZhaWx1cmUpLiBXaXRob3V0IGEgc2luazogdW5kZWZpbmVkLCB0aGUgcGxhaW4gbG9nLlxuICAgIGNvbnN0IG1vdW50UnVudGltZVN0YWdlSWQgPSBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCByZWNvcmQgPVxuICAgICAgbW91bnRSdW50aW1lU3RhZ2VJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogdGhpcy5kZXBzLmV4ZWN1dGlvblJ1bnRpbWUucmVjb3JkRm9yPy4obW91bnRSdW50aW1lU3RhZ2VJZCwgeyBzdWJmbG93SWQgfSk7XG4gICAgY29uc3QgbmVzdGVkUnVudGltZSA9IG5ldyBFeGVjdXRpb25SdW50aW1lQ2xhc3MoXG4gICAgICBmaXJzdE5vZGUubmFtZSxcbiAgICAgIGZpcnN0Tm9kZS5pZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHBvbGljeSxcbiAgICAgIHJlY29yZCxcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQ/LnJ1bklkXG4gICAgICAgID8geyBydW5JZDogcGFyZW50VHJhdmVyc2FsQ29udGV4dC5ydW5JZCwgdW5hdmFpbGFibGU6ICdjaGlsZC1zb3VyY2Utb3duZXJzaGlwJyB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICk7XG5cbiAgICAvLyBTZWVkIEdsb2JhbFN0b3JlIHdpdGggdGhlIHJpZ2h0IHNoYXBlIGZvciB0aGUgcGF0aDpcbiAgICAvLyAgIOKAoiBSZXN1bWUgaW50byBUSElTIHN1YmZsb3cg4oaSIHNlZWQgZnJvbSB0aGUgY2FwdHVyZWQgcHJlLXBhdXNlXG4gICAgLy8gICAgIHNjb3BlIHNvIHJlc3VtZSBoYW5kbGVycyBzZWUgaGlzdG9yeSwgcGF1c2VkVG9vbENhbGxJZCwgZXRjLlxuICAgIC8vICAgICAoYG1hcHBlZElucHV0YCBzdGlsbCByZWFjaGVzIHRoZSBzdGFnZXMsIGFzIHRoZWlyIHJlYWQtb25seSBhcmdzLilcbiAgICAvLyAgIOKAoiBOb3JtYWwgZW50cnkg4oaSIHNlZWQgZnJvbSB0aGUgaW5wdXRNYXBwZXIncyBtYXBwZWRJbnB1dC5cbiAgICBjb25zdCBzZWVkVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IGlzUmVzdW1lRm9yVGhpc1N1YmZsb3cgPyByZXN1bWVDYXB0dXJlISA6IG1hcHBlZElucHV0O1xuICAgIGlmIChPYmplY3Qua2V5cyhzZWVkVmFsdWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGUgc2VlZCBpcyBjb21taXR0ZWQgYXMgdGhlIHN1YmZsb3cncyBgaGlzdG9yeVswXWAgYnkgaXRzIHJvb3RcbiAgICAgIC8vIGNvbnRleHQsIG5vdCBieSBhIGZhY2FkZSDigJQgdGhhdCBmcmFtZSBhbHJlYWR5IGhvbGRzIHRoZSBydW4ncyBwb2xpY3lcbiAgICAgIC8vICh0aGUgcnVudGltZSB3YXMgY29uc3RydWN0ZWQgd2l0aCBpdCksIHNvIHRoZSBzZWVkIHJldGFpbnMgdW5kZXIgdGhlXG4gICAgICAvLyBydWxlLCBsYW5kcyBpbiB0aGUgbWlycm9yIGFzIHRoZSBwbGFjZWhvbGRlciwgYW5kIGNvbW1pdHMgdW5kZXIgdGhlXG4gICAgICAvLyBydW4ncyBkaWFscyBsaWtlIGV2ZXJ5IG90aGVyIHdyaXRlIChDLUY1OiB1bmRlciBgd3JpdGVQcm92ZW5hbmNlOlxuICAgICAgLy8gJ3JlYWRzLXByZWZpeCdgIGl0cyByb3dzIGNhcnJ5IGByZWFkS2V5czogW11gKS5cbiAgICAgIC8vIFRoZSBzZWVkIGlzIHRoZSBtb3VudCdzIGFjdCB0b286IGl0cyBidW5kbGUg4oCUIGBoaXN0b3J5WzBdYCBvZiB0aGVcbiAgICAgIC8vIHN1YmZsb3cncyBvd24gbG9nIOKAlCBjYXJyaWVzIHRoZSBtb3VudCdzIHN0YWdlLCBzdGFnZUlkIGFuZFxuICAgICAgLy8gcnVudGltZVN0YWdlSWQgKFIxMzsgdGhyb3VnaCA5LjMzLjAgaXQgY2FycmllZCBydW50aW1lU3RhZ2VJZCAnJyBhbmRcbiAgICAgIC8vIHRoZSBmaXJzdCBzdGFnZSdzIG5hbWVzLCB3aGljaCBvbiBhIHJlc3VtZSB3YXMgdGhlIHJlLWVudHJ5IHBvaW50KS5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNlZWRTdWJmbG93R2xvYmFsU3RvcmUobmVzdGVkUnVudGltZSwgc2VlZFZhbHVlcywgcGFyZW50Q29udGV4dCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBUaGUgbW91bnQncyBvd24gbG9nIG9wZW5lZCBhYm92ZTogYSBzZWVkIHRoYXQgZmFpbHMgY2xvc2VzIGl0LCBuZXZlciBsZWF2ZXMgaXQgbG9va2luZyBjcmFzaGVkLlxuICAgICAgICBuZXN0ZWRSdW50aW1lLmNsb3NlUmVjb3JkPy4oJ2ZhaWxlZCcpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIFJlZnJlc2ggcm9vdFN0YWdlQ29udGV4dCBzbyBXcml0ZUJ1ZmZlciBzZWVzIGNvbW1pdHRlZCBkYXRhLiBOYW1lZFxuICAgICAgLy8gYWZ0ZXIgdGhlIGZpcnN0IG5vZGUgYWdhaW4g4oCUIHRoZSBzZWVkIGNvbnRleHQgbm93IGNhcnJpZXMgdGhlIG1vdW50J3NcbiAgICAgIC8vIG5hbWVzIChSMTMpLCB3aGljaCBiZWxvbmcgdG8gdGhlIHNlZWQgYnVuZGxlIG9ubHkuIGBuZXdSb290YCBnaXZlcyBpdFxuICAgICAgLy8gdGhlIHNhbWUgcG9saWN5IGFuZCBtaXJyb3IuXG4gICAgICBuZXN0ZWRSdW50aW1lLnJvb3RTdGFnZUNvbnRleHQgPSBuZXN0ZWRSdW50aW1lLm5ld1Jvb3QoZmlyc3ROb2RlLm5hbWUsIGZpcnN0Tm9kZS5pZCk7XG4gICAgfVxuXG4gICAgLy8gUHJlcGFyZSBzdWJmbG93IHJvb3Qgbm9kZSDigJQgc3RyaXAgaXNTdWJmbG93Um9vdCB0byBwcmV2ZW50IHJlLWRlbGVnYXRpb24uXG4gICAgLy9cbiAgICAvLyBQUkVTRVJWRSBgbmV4dGAuIEVhcmxpZXIgcmV2aXNpb25zIHN0cmlwcGVkIGBuZXh0YCB3aGVuZXZlciB0aGVcbiAgICAvLyBzdWJmbG93IHJvb3QgaGFkIGNoaWxkcmVuLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGBuZXh0YCB3YXNcbiAgICAvLyBhbHdheXMgdGhlIE9VVEVSIG1vdW50J3MgY29udGludWF0aW9uIGxlYWtpbmcgaW50byB0aGUgaW5uZXJcbiAgICAvLyB0cmVlLiBUaGF0IGFzc3VtcHRpb24gd2FzIHdyb25nOiB0aGUgcmVzb2x2ZWQgc3ViZmxvdyByb290J3NcbiAgICAvLyBgbmV4dGAgaXMgdGhlIElOTkVSIGpvaW4gc3RhZ2UgKGUuZy4sIFBhcmFsbGVsJ3MgTWVyZ2UgYWZ0ZXIgYVxuICAgIC8vIGZhbi1vdXQsIFRvVCdzIFBydW5lcikuIFN0cmlwcGluZyBpdCBicm9rZSBjb21wb3NpdGUgc3ViZmxvd3Mg4oCUXG4gICAgLy8gdGhlIGpvaW4gc3RhZ2UgbmV2ZXIgcmFuLCBzbyB0aGUgc3ViZmxvdyByZXR1cm5lZCBwYXJ0aWFsIHN0YXRlLlxuICAgIC8vXG4gICAgLy8gVGhlIG91dGVyIG1vdW50J3MgcG9zdC1zdWJmbG93IGNvbnRpbnVhdGlvbiBpcyBoYW5kbGVkIHNlcGFyYXRlbHlcbiAgICAvLyBieSB0aGUgcGFyZW50IHRyYXZlcnNlciB2aWEgYHBhcmVudENvbnRleHQubmV4dE5vZGVgIGFuZCBpcyBuZXZlclxuICAgIC8vIGNvbmZsYXRlZCB3aXRoIHRoZSBpbm5lciBzdWJmbG93J3MgYG5leHRgIGNoYWluLlxuICAgIGNvbnN0IHN1YmZsb3dOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIC4uLm5vZGUsXG4gICAgICBpc1N1YmZsb3dSb290OiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8g4pSA4pSA4pSAIEV4ZWN1dGUgdmlhIGZhY3RvcnkgdHJhdmVyc2VyIOKUgOKUgOKUgFxuICAgIC8vIFRoZSBmYWN0b3J5IGNyZWF0ZXMgYSBmdWxsIEZsb3djaGFydFRyYXZlcnNlciB3aXRoIHRoZSBzYW1lIDctcGhhc2UgYWxnb3JpdGhtLFxuICAgIC8vIHNoYXJpbmcgdGhlIHBhcmVudCdzIHN0YWdlTWFwLCBzdWJmbG93cyBkaWN0LCBhbmQgbmFycmF0aXZlIGdlbmVyYXRvci5cbiAgICBsZXQgc3ViZmxvd091dHB1dDogYW55O1xuICAgIC8vIEJveGVkOiBhIHN0YWdlIG1heSB0aHJvdyBBTlkgdmFsdWUsIGBudWxsYCBhbmQgYHVuZGVmaW5lZGAgaW5jbHVkZWQg4oCUXG4gICAgLy8gYSBmYWxzeSB0aHJvd24gdmFsdWUgbXVzdCBzdGlsbCBmYWlsIHRoZSBtb3VudC5cbiAgICBsZXQgc3ViZmxvd0Vycm9yOiB7IGVycm9yOiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gICAgbGV0IHRyYXZlcnNlckhhbmRsZTogU3ViZmxvd1RyYXZlcnNlckhhbmRsZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRyYXZlcnNlckhhbmRsZSA9IHRoaXMudHJhdmVyc2VyRmFjdG9yeSh7XG4gICAgICAgIC8vIFRoZSBSRUFMIHN1YmZsb3cgZ3JhcGgg4oCUIGV2ZXJ5IGlkIGluc2lkZSB0aGUgc3ViZmxvdyAobG9vcCB0YXJnZXRzLFxuICAgICAgICAvLyBhIHJlLXZpc2l0IG9mIHRoZSBwYXVzZWQgc3RhZ2UpIHJlc29sdmVzIGFnYWluc3QgaXQsIHJlLWVudHJ5IG9yIG5vdC5cbiAgICAgICAgcm9vdDogc3ViZmxvd05vZGUsXG4gICAgICAgIC8vIFdoZXJlIHRoaXMgdHJhdmVyc2FsIHN0YXJ0cyBvbiBhIHJlc3VtZSByZS1lbnRyeTsgdmlzaXRlZCBvbmNlIOKAlFxuICAgICAgICAvLyBhbmQgdGhlIHNpYmxpbmcgcGF1c2VzIGl0IHJhaXNlcyBvbmNlIHRoYXQgZW50cnkncyBjaGFpbiBlbmRzLlxuICAgICAgICAuLi4ocmVzdW1lSG9wPy5lbnRyeSAmJiB7IGVudHJ5OiByZXN1bWVIb3AuZW50cnkgfSksXG4gICAgICAgIC4uLihyZXN1bWVIb3A/LnBlbmRpbmdQYXVzZXMgJiYgeyBwZW5kaW5nUGF1c2VzOiByZXN1bWVIb3AucGVuZGluZ1BhdXNlcyB9KSxcbiAgICAgICAgZXhlY3V0aW9uUnVudGltZTogbmVzdGVkUnVudGltZSxcbiAgICAgICAgcmVhZE9ubHlDb250ZXh0OiBtYXBwZWRJbnB1dCxcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICAvLyBSRkMtMDAzIEQxOiB0aGUgbW91bnQgc3RhZ2UncyBydW50aW1lU3RhZ2VJZCDigJQgdGhlIHN1YmZsb3cgcm9vdFxuICAgICAgICAvLyBzdGFnZSdzIGBwYXJlbnRSdW50aW1lU3RhZ2VJZGAgc28gYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHRoZSBtb3VudC5cbiAgICAgICAgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDogcGFyZW50VHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICB9KTtcblxuICAgICAgc3ViZmxvd091dHB1dCA9IGF3YWl0IHRyYXZlcnNlckhhbmRsZS5leGVjdXRlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gUGF1c2VTaWduYWwgaXMgbm90IGFuIGVycm9yIOKAlCBwcmVwZW5kIHN1YmZsb3cgSUQgYW5kIHJlLXRocm93XG4gICAgICAvLyBpbW1lZGlhdGVseS4gTm8gZXJyb3IgbG9nZ2luZywgbm8gc3ViZmxvd1Jlc3VsdCByZWNvcmRpbmcg4oCUXG4gICAgICAvLyB0aGUgcGF1c2UgaXMgY29udHJvbCBmbG93LlxuICAgICAgLy9cbiAgICAgIC8vIEJFRk9SRSByZS10aHJvdywgY2FwdHVyZSB0aGUgbmVzdGVkIHJ1bnRpbWUncyBzdGF0ZSBvbnRvIHRoZVxuICAgICAgLy8gc2lnbmFsLiBUaGlzIGlzIHRoZSBvbmx5IGNoYW5jZSDigJQgb25jZSB3ZSByZS10aHJvdywgdGhlIG91dGVyXG4gICAgICAvLyB0cmF2ZXJzZXIgdW53aW5kcyBhbmQgdGhlIG5lc3RlZCBydW50aW1lIGlzIEdDJ2QuIE9uIHJlc3VtZSwgd2UnbGxcbiAgICAgIC8vIHJlLXNlZWQgYSBmcmVzaCBuZXN0ZWQgcnVudGltZSBmcm9tIHRoaXMgY2FwdHVyZSBzbyByZXN1bWUgaGFuZGxlcnNcbiAgICAgIC8vIGNhbiByZWFkIHRoZSBwcmUtcGF1c2Ugc3ViZmxvdyBzY29wZS5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgU1RBVEUgb25seSDigJQgdGhlIHN1YmZsb3cncyB3b3JraW5nIG1lbW9yeSBhdCBwYXVzZSB0aW1lIChldmVyeVxuICAgICAgLy8gY29tbWl0dGVkIHdyaXRlIHVwIHRvIHRoZSBwYXVzZSksIHJlYWQgc3RyYWlnaHQgb2ZmIGl0cyBzdG9yZS4gTm9cbiAgICAgIC8vIHNuYXBzaG90IGlzIGJ1aWx0OiBhIHNuYXBzaG90IHdvdWxkIGFsc28gYnVpbGQgdGhlIHN1YmZsb3cnc1xuICAgICAgLy8gZXhlY3V0aW9uIHRyZWUgYW5kIGNvcHkgaXRzIGNvbW1pdCBsb2cg4oCUIHdvcmsgcHJvcG9ydGlvbmFsIHRvIGhvd1xuICAgICAgLy8gbG9uZyB0aGUgc3ViZmxvdyByYW4g4oCUIHRoYXQgdGhlIGxlYW4gY2hlY2twb2ludCBuZXZlciBjYXJyaWVzXG4gICAgICAvLyAoYHJ1bm5lci9jaGVja3BvaW50LnRzYCkuXG4gICAgICAvL1xuICAgICAgLy8gQ2FwdHVyZSBpcyBrZXllZCBieSB0aGUgU0FNRSBwYXRoLXByZWZpeGVkIGBzdWJmbG93SWRgIHVzZWQgaW5cbiAgICAgIC8vIGBzdWJmbG93UGF0aGAsIHNvIHJlc3VtZSBjYW4gbG9vayB1cCBcInNjb3BlIGZvciBzZi1mb29cIiBieSBpZC5cbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICBlcnJvci5jYXB0dXJlU3ViZmxvd1Njb3BlKHN1YmZsb3dJZCwgbmVzdGVkUnVudGltZS5nbG9iYWxTdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICAgICAgZXJyb3IucHJlcGVuZFN1YmZsb3coc3ViZmxvd0lkKTtcbiAgICAgICAgbmVzdGVkUnVudGltZS5jbG9zZVJlY29yZD8uKCdwYXVzZWQnKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBzdWJmbG93RXJyb3IgPSB7IGVycm9yIH07XG4gICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdzdWJmbG93RXJyb3InLCB0aHJvd25UZXh0KGVycm9yKSk7XG4gICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBzdWJmbG93ICgke3N1YmZsb3dJZH0pOmAsIHsgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihwYXJlbnRDb250ZXh0LCBlcnJvcikgfSk7XG4gICAgfVxuXG4gICAgLy8gVGhlIG1vdW50J3Mgb3duIGxvZyBlbmRlZCDigJQgYmVmb3JlIHRoZSBtZXJnZS1iYWNrLCB3aGljaCBjb21taXRzIG9uIHRoZSBQQVJFTlQncyBsb2cuXG4gICAgbmVzdGVkUnVudGltZS5jbG9zZVJlY29yZD8uKHN1YmZsb3dFcnJvciA/ICdmYWlsZWQnIDogJ29rJyk7XG5cbiAgICAvLyBBbHdheXMgbWVyZ2UgbmVzdGVkIHN1YmZsb3cgcmVzdWx0cyAoZXZlbiBvbiBlcnJvciDigJQgcGFydGlhbCByZXN1bHRzIGFpZCBkZWJ1Z2dpbmcpXG4gICAgaWYgKHRyYXZlcnNlckhhbmRsZSkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdHJhdmVyc2VySGFuZGxlLmdldFN1YmZsb3dSZXN1bHRzKCkpIHtcbiAgICAgICAgc3ViZmxvd1Jlc3VsdHNNYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBCcmVhayBwcm9wYWdhdGlvbiAob3B0LWluIHZpYSBTdWJmbG93TW91bnRPcHRpb25zLnByb3BhZ2F0ZUJyZWFrKSDilIDilIBcbiAgICAvL1xuICAgIC8vIElmIHRoZSBzdWJmbG93J3MgaW5uZXIgdHJhdmVyc2FsIGJyb2tlIChiZWNhdXNlIGEgc3RhZ2UgY2FsbGVkXG4gICAgLy8gYHNjb3BlLiRicmVhayhyZWFzb24pYCkgQU5EIHRoZSBtb3VudCBkZWNsYXJlZCBgcHJvcGFnYXRlQnJlYWs6IHRydWVgLFxuICAgIC8vIGZvcndhcmQgdGhlIGJyZWFrIHN0YXRlIHRvIHRoZSBQQVJFTlQncyBicmVha0ZsYWcuIFRoZSBwYXJlbnRcbiAgICAvLyB0cmF2ZXJzZXIgd2lsbCBzZWUgYHNob3VsZEJyZWFrYCBvbiBpdHMgbmV4dCBzdGVwIGFuZCBzdG9wLlxuICAgIC8vXG4gICAgLy8gV2l0aG91dCB0aGlzLCBpbm5lciBicmVha3MgYXJlIGxvY2FsbHkgc2NvcGVkIHRvIHRoZSBzdWJmbG93IOKAlCB0aGVcbiAgICAvLyBwYXJlbnQgY29udGludWVzIGFzIGlmIHRoZSBzdWJmbG93IHJldHVybmVkIG5vcm1hbGx5LlxuICAgIC8vXG4gICAgLy8gSU1QT1JUQU5UOiB0aGlzIHJ1bnMgQkVGT1JFIGBvdXRwdXRNYXBwaW5nYCBiZWxvdywgaW50ZW50aW9uYWxseS4gVGhlXG4gICAgLy8gb3V0cHV0TWFwcGVyIHN0aWxsIGV4ZWN1dGVzLCBzbyB0aGUgc3ViZmxvdydzIHBhcnRpYWwgcmVzdWx0IHN0aWxsXG4gICAgLy8gbGFuZHMgaW4gdGhlIHBhcmVudCBzY29wZS4gQ29uc3VtZXJzIHdobyBuZWVkIHRvIHN1cHByZXNzIG91dHB1dCBvblxuICAgIC8vIGJyZWFrIGNoZWNrIHRoZSBicmVhayBzdGF0ZSBpbnNpZGUgdGhlaXIgb3V0cHV0TWFwcGVyIGFuZCBlYXJseS1yZXR1cm4uXG4gICAgLy8gU2VlIGBTdWJmbG93TW91bnRPcHRpb25zLnByb3BhZ2F0ZUJyZWFrYCBKU0RvYyBmb3IgcmF0aW9uYWxlLlxuICAgIGlmICh0cmF2ZXJzZXJIYW5kbGUgJiYgbW91bnRPcHRpb25zPy5wcm9wYWdhdGVCcmVhayA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgaW5uZXJCcmVhayA9IHRyYXZlcnNlckhhbmRsZS5nZXRCcmVha1N0YXRlKCk7XG4gICAgICBpZiAoaW5uZXJCcmVhay5zaG91bGRCcmVhaykge1xuICAgICAgICBicmVha0ZsYWcuc2hvdWxkQnJlYWsgPSB0cnVlO1xuICAgICAgICBpZiAoaW5uZXJCcmVhay5yZWFzb24gIT09IHVuZGVmaW5lZCAmJiBicmVha0ZsYWcucmVhc29uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBicmVha0ZsYWcucmVhc29uID0gaW5uZXJCcmVhay5yZWFzb247XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmFpc2UgYSBwYXJlbnQtbGV2ZWwgb25CcmVhayBldmVudCBzbyByZWNvcmRlcnMgY2FuIGRpc3Rpbmd1aXNoXG4gICAgICAgIC8vIHRoZSBpbm5lciBvcmlnaW5hdGluZyBicmVhayAoZmlyZWQgaW5zaWRlIHRoZSBzdWJmbG93KSBmcm9tIHRoaXNcbiAgICAgICAgLy8gcHJvcGFnYXRlZCBvbmUgKGZpcmVkIGF0IHRoZSBtb3VudCBsZXZlbCBvbiB0aGUgcGFyZW50KS5cbiAgICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkJyZWFrKHN1YmZsb3dOYW1lLCBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0LCBpbm5lckJyZWFrLnJlYXNvbiwgc3ViZmxvd0lkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdWJmbG93VHJlZUNvbnRleHQgPSBuZXN0ZWRSdW50aW1lLmdldFNuYXBzaG90KCk7XG5cbiAgICAvLyDilIDilIDilIAgT3V0cHV0IE1hcHBpbmcg4pSA4pSA4pSAXG4gICAgaWYgKCFzdWJmbG93RXJyb3IgJiYgbW91bnRPcHRpb25zPy5vdXRwdXRNYXBwZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoZSBtZXJnZS1iYWNrIGlzIHRoZSBNT1VOVCdzIGFjdCwgc28gdGhlIG1vdW50J3MgZnJhbWUgc3RhZ2VzIGFuZFxuICAgICAgICAvLyBjb21taXRzIGl0IOKAlCBpdHMgYnVuZGxlIGNhcnJpZXMgdGhlIG1vdW50J3MgcnVudGltZVN0YWdlSWQgKFIxMykuXG4gICAgICAgIC8vIEEgYnJhbmNoIG9yIGZvcmstY2hpbGQgbW91bnQgc3RpbGwgbGFuZHMgaXRzIHZhbHVlcyB3aGVyZSBpdHNcbiAgICAgICAgLy8gcGFyZW50IHdyaXRlcyAodGhlIHBhcmVudCdzIHJ1biBuYW1lc3BhY2UpLCBhcyBiZWZvcmU7IHVudGlsIDkuMzMuMFxuICAgICAgICAvLyBpdCBjb21taXR0ZWQgT04gdGhlIHBhcmVudCdzIGZyYW1lLCBzbyB0aGUgYnVuZGxlIG5hbWVkIHRoZSBzdGFnZVxuICAgICAgICAvLyBiZWZvcmUgdGhlIG1vdW50LCBvciB0aGUgYnJhbmNoaW5nIGRlY2lkZXIuXG4gICAgICAgIGNvbnN0IG91dHB1dENvbnRleHQgPSBwYXJlbnRDb250ZXh0O1xuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5icmFuY2hJZCAmJiBwYXJlbnRDb250ZXh0LnBhcmVudCkge1xuICAgICAgICAgIG91dHB1dENvbnRleHQudXNlQWRkcmVzc09mKHBhcmVudENvbnRleHQucGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmVudFNjb3BlID0gb3V0cHV0Q29udGV4dC5nZXRTY29wZSgpO1xuICAgICAgICAvLyBGb3IgVHlwZWRTY29wZSBzdWJmbG93cywgc3RhZ2UgZnVuY3Rpb25zIHJldHVybiB2b2lkIOKAlCBmYWxsIGJhY2sgdG8gYSBzaGFsbG93IGNsb25lXG4gICAgICAgIC8vIG9mIHRoZSBzdWJmbG93J3Mgc2hhcmVkIHN0YXRlIHNvIG91dHB1dE1hcHBlciBjYW4gYWNjZXNzIGFsbCBzY29wZSB2YWx1ZXMgd3JpdHRlblxuICAgICAgICAvLyBkdXJpbmcgdGhlIHN1YmZsb3cuIFdlIHNoYWxsb3ctY2xvbmUgdG8gYXZvaWQgYWxpYXNpbmcgdGhlIGxpdmUgU2hhcmVkTWVtb3J5IGNvbnRleHQuXG4gICAgICAgIC8vIE5PVEU6IHRoZSBmdWxsIHNjb3BlIGlzIHBhc3NlZCAobm90IGp1c3QgZGVjbGFyZWQgb3V0cHV0cykg4oCUIG91dHB1dE1hcHBlciBtdXN0XG4gICAgICAgIC8vIGV4cGxpY2l0bHkgc2VsZWN0IHdoYXQgdG8gcHJvcGFnYXRlIHRvIHRoZSBwYXJlbnQuXG4gICAgICAgIC8vIFJlZGFjdGlvbjogYGFwcGx5T3V0cHV0TWFwcGluZ2Agd3JpdGVzIHRocm91Z2ggYG91dHB1dENvbnRleHRgIChhXG4gICAgICAgIC8vIFN0YWdlQ29udGV4dCwgbm90IGEgZmFjYWRlKS4gVGhlIGNvbnRleHQncyB3cml0ZSBmdW5uZWwgYXNrcyB0aGVcbiAgICAgICAgLy8gcnVuJ3MgcmVkYWN0aW9uIHJ1bGUg4oCUIHNoYXJlZCB3aXRoIHRoZSBzdWJmbG93J3MgY29udGV4dHMsIHNvIGEga2V5XG4gICAgICAgIC8vIHRoZSBwb2xpY3kgbmFtZXMgT1IgYSBrZXkgbWFya2VkIHBlci1jYWxsIGluc2lkZSB0aGUgc3ViZmxvdyBpc1xuICAgICAgICAvLyBzY3J1YmJlZCBpbiB0aGUgUEFSRU5UJ3MgbG9nIGFuZCBtaXJyb3IgdG9vICg5LjE5LjA7IGJlZm9yZSwgdGhpc1xuICAgICAgICAvLyBtZXJnZS1iYWNrIHJldGFpbmVkIHBsYWludGV4dCkuXG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZU91dHB1dCA9IHN1YmZsb3dPdXRwdXQgPz8geyAuLi5zdWJmbG93VHJlZUNvbnRleHQuc2hhcmVkU3RhdGUgfTtcbiAgICAgICAgY29uc3QgbWFwcGVkT3V0cHV0ID0gYXBwbHlPdXRwdXRNYXBwaW5nKFxuICAgICAgICAgIGVmZmVjdGl2ZU91dHB1dCxcbiAgICAgICAgICBwYXJlbnRTY29wZSxcbiAgICAgICAgICBvdXRwdXRDb250ZXh0LFxuICAgICAgICAgIG1vdW50T3B0aW9ucyxcbiAgICAgICAgICByZWRhY3Rpb25SdWxlLFxuICAgICAgICApO1xuXG4gICAgICAgIG91dHB1dENvbnRleHQuY29tbWl0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIC8vIEEgbWVyZ2UtYmFjayB0aGF0IGZhaWxlZCB0byBjb21taXQgKGFuIHVuY2xvbmVhYmxlIHZhbHVlKSBsZWF2ZXMgaXRzXG4gICAgICAgIC8vIHdyaXRlcyBzdGFnZWQgb24gdGhlIG1vdW50J3MgZnJhbWU7IHRoZSBtb3VudCdzIGV4aXQgY29tbWl0IGJlbG93XG4gICAgICAgIC8vIHdvdWxkIHRocm93IHRoZW0gYWdhaW4sIG91dHNpZGUgdGhpcyBjYXRjaC4gVGhyb3VnaCA5LjMzLjAgdGhleVxuICAgICAgICAvLyB3ZXJlIHN0YWdlZCBvbiB0aGUgcGFyZW50J3MgZnJhbWUsIHdoaWNoIHdhcyBub3QgY29tbWl0dGVkIGFnYWluLFxuICAgICAgICAvLyBzbyB0aGUgcnVuIHdlbnQgb24g4oCUIGRyb3AgdGhlbSwgYXMgaXQgZGlkLiBBIGxpbmVhciBtb3VudCdzIGZyYW1lXG4gICAgICAgIC8vIGlzIGxlZnQgYXMgaXQgYWx3YXlzIHdhcy5cbiAgICAgICAgaWYgKHBhcmVudENvbnRleHQuYnJhbmNoSWQgJiYgcGFyZW50Q29udGV4dC5wYXJlbnQpIHBhcmVudENvbnRleHQuZGlzY2FyZFN0YWdlZCgpO1xuICAgICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdvdXRwdXRNYXBwZXJFcnJvcicsIHRocm93blRleHQoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gb3V0cHV0TWFwcGVyIGZvciBzdWJmbG93ICgke3N1YmZsb3dJZH0pOmAsIHtcbiAgICAgICAgICBlcnJvcjogbG9nZ2FibGVTdGFnZUVycm9yKHBhcmVudENvbnRleHQsIGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViZmxvd1Jlc3VsdDogU3ViZmxvd1Jlc3VsdCA9IHtcbiAgICAgIHN1YmZsb3dJZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgdHJlZUNvbnRleHQ6IHtcbiAgICAgICAgZ2xvYmFsQ29udGV4dDogc3ViZmxvd1RyZWVDb250ZXh0LnNoYXJlZFN0YXRlLFxuICAgICAgICBzdGFnZUNvbnRleHRzOiBzdWJmbG93VHJlZUNvbnRleHQuZXhlY3V0aW9uVHJlZSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBoaXN0b3J5OiBzdWJmbG93VHJlZUNvbnRleHQuY29tbWl0TG9nLFxuICAgICAgICAuLi4oc3ViZmxvd1RyZWVDb250ZXh0LnJlYWRTb3VyY2VzICYmIHsgcmVhZFNvdXJjZXM6IHN1YmZsb3dUcmVlQ29udGV4dC5yZWFkU291cmNlcyB9KSxcbiAgICAgICAgLi4uKHN1YmZsb3dUcmVlQ29udGV4dC5sb2dBZGRyZXNzID09PSB1bmRlZmluZWQgPyB7fSA6IHsgbG9nQWRkcmVzczogc3ViZmxvd1RyZWVDb250ZXh0LmxvZ0FkZHJlc3MgfSksXG4gICAgICAgIC8vIFRoZSBzdWJmbG93J3Mgb3duIGZvbGQgYmFzZSB0cmF2ZWxzIHdpdGggaXRzIG93biBsb2cg4oCUIHNhbWVcbiAgICAgICAgLy8gY29udHJhY3QgYXMgdGhlIHJ1bi1sZXZlbCBgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZWAuXG4gICAgICAgIGluaXRpYWxTdGF0ZTogc3ViZmxvd1RyZWVDb250ZXh0LmluaXRpYWxTdGF0ZSxcbiAgICAgIH0sXG4gICAgICBwYXJlbnRTdGFnZUlkOiBwYXJlbnRDb250ZXh0LmdldFN0YWdlSWQoKSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc3ViZmxvd0RlZiA9IHRoaXMuZGVwcy5zdWJmbG93cz8uW3N1YmZsb3dJZF07XG4gICAgaWYgKHN1YmZsb3dEZWYgJiYgKHN1YmZsb3dEZWYgYXMgYW55KS5idWlsZFRpbWVTdHJ1Y3R1cmUpIHtcbiAgICAgIHN1YmZsb3dSZXN1bHQucGlwZWxpbmVTdHJ1Y3R1cmUgPSAoc3ViZmxvd0RlZiBhcyBhbnkpLmJ1aWxkVGltZVN0cnVjdHVyZTtcbiAgICB9XG5cbiAgICAvLyBUaGUgc2VydmVkIHN0YXRlICg5LjIwLjApOiB0aGUgbmVzdGVkIG1pcnJvcidzIGZpbmFsIHN0YXRlLCByZW1lbWJlcmVkXG4gICAgLy8gQkVTSURFIHRoZSByZXN1bHQg4oCUIGB0cmVlQ29udGV4dC5nbG9iYWxDb250ZXh0YCBzdGF5cyB0aGUgbGl2ZSBoZWFwIGZvclxuICAgIC8vIHRoZSBwbGFpbiBzbmFwc2hvdCBhbmQgdGhlIGNoZWNrcG9pbnQ7IGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWBcbiAgICAvLyBzdWJzdGl0dXRlcyB0aGUgbWlycm9yIHRocm91Z2ggYHNlcnZlZFN1YmZsb3dSZXN1bHRzYC4gQWJzZW50IHdpdGhvdXRcbiAgICAvLyBhIHBvbGljeS4gVGhlIGV4aXQgZXZlbnQgYmVsb3cgY2FycmllcyB0aGUgc2FtZSBzZXJ2ZWQgdmlldzsgd2l0aG91dCBhXG4gICAgLy8gbWlycm9yIGl0IGNhcnJpZXMgdGhlIGhlYXAgcmV0YWluZWQgdW5kZXIgdGhlIHJ1bGUgKHBlci1jYWxsIG1hcmtzXG4gICAgLy8gYWxvbmUga2VlcCBubyBtaXJyb3IpIOKAlCB0aGUgc2FtZSBvYmplY3Qgd2hlbiBub3RoaW5nIGlzIHJlZGFjdGVkLlxuICAgIGNvbnN0IHJhd1N0YXRlID0gc3ViZmxvd1Jlc3VsdC50cmVlQ29udGV4dC5nbG9iYWxDb250ZXh0O1xuICAgIGNvbnN0IG1pcnJvclN0YXRlID0gbmVzdGVkUnVudGltZS5yZWRhY3RlZFN0b3JlPy5nZXRTdGF0ZSgpO1xuICAgIGlmIChtaXJyb3JTdGF0ZSAhPT0gdW5kZWZpbmVkKSByZW1lbWJlclJlZGFjdGVkU3ViZmxvd1N0YXRlKHN1YmZsb3dSZXN1bHQsIG1pcnJvclN0YXRlKTtcbiAgICAvLyBIYW5kZWQgb3V0IHdob2xlLCBzbyBpdCBpcyBhIGJvdW5kYXJ5IHJlY29yZDogbmVzdGVkIHBvbGljeSBrZXlzIGFyZSBzY3J1YmJlZCB0b29cbiAgICAvLyAodGhlIG1pcnJvcidzIG93biBwbGFjZWhvbGRlciwgc28gaXRzIHRvcCBrZXlzIGtlZXAgdGhlaXIgYnl0ZXMpLlxuICAgIGNvbnN0IGV4aXRTdGF0ZSA9ICFyZWRhY3Rpb25SdWxlXG4gICAgICA/IG1pcnJvclN0YXRlID8/IHJhd1N0YXRlXG4gICAgICA6IG1pcnJvclN0YXRlICE9PSB1bmRlZmluZWRcbiAgICAgID8gcmVkYWN0aW9uUnVsZS5yZXRhaW5Cb3VuZGFyeShtaXJyb3JTdGF0ZSwgTE9HX1BMQUNFSE9MREVSKVxuICAgICAgOiByZWRhY3Rpb25SdWxlLnJldGFpbkJvdW5kYXJ5KHJhd1N0YXRlKTtcblxuICAgIHN1YmZsb3dSZXN1bHRzTWFwLnNldChzdWJmbG93SWQsIHN1YmZsb3dSZXN1bHQpO1xuICAgIC8vIEFkZGl0aXZlIHBlci1leGVjdXRpb24ga2V5IChkZXNpZ246IGRvY3MvZGVzaWduL3N1YmZsb3ctY29tbWl0LXZpc2liaWxpdHkubWQpLiBBIExPT1BJTkdcbiAgICAvLyBzdWJmbG93IHJlLWVudGVycyB3aXRoIHRoZSBTQU1FIHN1YmZsb3dJZCwgc28gdGhlIHBhdGgga2V5IGFib3ZlIGlzIE9WRVJXUklUVEVOIGVhY2hcbiAgICAvLyBpdGVyYXRpb24gKGJhY2stY29tcGF0OiBpdCBob2xkcyB0aGUgTEFTVCBpdGVyYXRpb24g4oCUIHdoYXQgZ2V0U3VidHJlZVNuYXBzaG90L2xpc3RTdWJmbG93UGF0aHNcbiAgICAvLyBhbmQgdGhlIGV1aSBmYWxsYmFjayBzZWUsIHVuY2hhbmdlZCkuIEFMU08ga2V5IGJ5IHRoZSBtb3VudCdzIFVOSVFVRSBydW50aW1lU3RhZ2VJZCBzbyBFVkVSWVxuICAgIC8vIGl0ZXJhdGlvbidzIHJlc3VsdCBpcyByZXRhaW5lZCBhbmQgYWRkcmVzc2FibGUgKGV1aSBwZXItbG9vcCBkcmlsbC1kb3duLCBwZXItc2NvcGUgbG9jYWxpemF0aW9uKS5cbiAgICAvLyBydW50aW1lU3RhZ2VJZCBhbHdheXMgY29udGFpbnMgJyMnOyBzdWJmbG93SWQgbmV2ZXIgZG9lcyDigJQgc28gdGhleSBuZXZlciBjb2xsaWRlLCBhbmRcbiAgICAvLyBsaXN0U3ViZmxvd1BhdGhzIGZpbHRlcnMgJyMnIGtleXMgdG8ga2VlcCBpdHMgcGF0aC1vbmx5IGNvbnRyYWN0LiBUaGUgcGF1c2UgY2hlY2twb2ludCBmaWx0ZXJzXG4gICAgLy8gdGhlc2Ugb3V0IChidWlsZFBhdXNlQ2hlY2twb2ludCkgc28gaXQgc3RheXMgbGVhbi5cbiAgICBpZiAobW91bnRSdW50aW1lU3RhZ2VJZCAmJiBtb3VudFJ1bnRpbWVTdGFnZUlkICE9PSBzdWJmbG93SWQpIHtcbiAgICAgIHN1YmZsb3dSZXN1bHRzTWFwLnNldChtb3VudFJ1bnRpbWVTdGFnZUlkLCBzdWJmbG93UmVzdWx0KTtcbiAgICB9XG5cbiAgICBwYXJlbnRDb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ3N1YmZsb3cnLCBgRXhpdGluZyAke3N1YmZsb3dOYW1lfSBzdWJmbG93YCwge1xuICAgICAgdGFyZ2V0U3RhZ2U6IHN1YmZsb3dJZCxcbiAgICB9KTtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3ViZmxvd0V4aXQoc3ViZmxvd05hbWUsIHN1YmZsb3dJZCwgcGFyZW50VHJhdmVyc2FsQ29udGV4dCwgZXhpdFN0YXRlKTtcblxuICAgIC8vIFRoZSBtb3VudCdzIEVYSVQg4oCUIGEgY29udGludWF0aW9uIG9mIHRoZSBtb3VudCdzIGV4ZWN1dGlvbiwgbmFtZWQgYXMgb25lXG4gICAgLy8gb24gdGhlIHJlY29yZCAoOS4zOS4wKSBzbyBubyByZWFkZXIgaW5mZXJzIGl0IGZyb20gdGhlIGxvZydzIHNoYXBlLlxuICAgIGNvbW1pdFN0YWdlV3JpdGVzKHBhcmVudENvbnRleHQsICdleGl0Jyk7XG5cbiAgICBpZiAoc3ViZmxvd0Vycm9yKSB7XG4gICAgICBwYXJlbnRDb250ZXh0LmZhaWx1cmVTdGF0ZS5hZG9wdChuZXN0ZWRSdW50aW1lLnJvb3RTdGFnZUNvbnRleHQuZmFpbHVyZVN0YXRlLCBzdWJmbG93RXJyb3IuZXJyb3IpO1xuICAgICAgdGhyb3cgc3ViZmxvd0Vycm9yLmVycm9yO1xuICAgIH1cblxuICAgIG5lc3RlZFJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dC5mYWlsdXJlU3RhdGUuY29tcGxldGUoKTtcblxuICAgIHJldHVybiBzdWJmbG93T3V0cHV0O1xuICB9XG59XG4iXX0=
@@ -346,6 +346,7 @@ export declare class FlowchartTraverser<TOut = any, TScope = any> {
346
346
  executionTree: unknown;
347
347
  initialState?: Record<string, unknown> | undefined;
348
348
  commitLog: unknown[];
349
+ readSources?: import("../../capture/readSources.js").EngineReadSources | undefined;
349
350
  logAddress?: import("foottrace").LogAddress | undefined;
350
351
  subflowResults?: Record<string, unknown> | undefined;
351
352
  recorders?: {
@@ -261,6 +261,8 @@ export interface SubflowResult {
261
261
  globalContext: Record<string, unknown>;
262
262
  stageContexts: Record<string, unknown>;
263
263
  history: unknown[];
264
+ /** Unknown until each child invocation has its own source ownership protocol. */
265
+ readonly readSources?: import('../capture/readSources.js').EngineReadSources;
264
266
  /** Identity of the local history, not its parent's log. */
265
267
  readonly logAddress?: LogAddress;
266
268
  /**
@@ -376,6 +378,7 @@ export interface IExecutionRuntime {
376
378
  /** The commit log's fold base — see `RuntimeSnapshot.initialState`. */
377
379
  initialState?: Record<string, unknown>;
378
380
  commitLog: unknown[];
381
+ readonly readSources?: import('../capture/readSources.js').EngineReadSources;
379
382
  readonly logAddress?: LogAddress;
380
383
  /** Dual-keyed by subflow path (last iteration) AND per-execution mount runtimeStageId
381
384
  * (each iteration) — see RuntimeSnapshot.subflowResults / subflow-commit-visibility. */
@@ -27,4 +27,4 @@ export var ArrayMergeMode;
27
27
  /** Overwrite parent array with subflow output. Use for Dynamic loops. */
28
28
  ArrayMergeMode["Replace"] = "replace";
29
29
  })(ArrayMergeMode || (ArrayMergeMode = {}));
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQWlCSCxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQWU5RSxvQ0FBb0M7QUFDcEMsd0RBQXdEO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBWTtJQUNwQyxJQUFJLEVBQUUsQ0FBQyxPQUFhLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ3ZFLEdBQUcsRUFBRSxDQUFDLE9BQWEsRUFBRSxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDckUsS0FBSyxFQUFFLENBQUMsT0FBYSxFQUFFLEdBQUcsSUFBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQztJQUN6RSxLQUFLLEVBQUUsQ0FBQyxPQUFhLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ3pFLElBQUksRUFBRSxDQUFDLE9BQWEsRUFBRSxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUM7Q0FDeEUsQ0FBQztBQXVIRiw4RUFBOEU7QUFDOUUsVUFBVTtBQUNWLDhFQUE4RTtBQUU5RTs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLGNBS1g7QUFMRCxXQUFZLGNBQWM7SUFDeEIsd0ZBQXdGO0lBQ3hGLG1DQUFpQixDQUFBO0lBQ2pCLHlFQUF5RTtJQUN6RSxxQ0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTFcsY0FBYyxLQUFkLGNBQWMsUUFLekIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHR5cGVzLnRzIOKAlCBBbGwgdHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIGVuZ2luZSBsaWJyYXJ5LlxuICpcbiAqIENlbnRyYWxpemVzIHR5cGUgZGVmaW5pdGlvbnMgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLlxuICogRXZlcnkgaGFuZGxlciByZWNlaXZlcyBIYW5kbGVyRGVwcyAodGhlIERJIGJhZykgaW5zdGVhZCBvZiBpbXBvcnRpbmcgdGhlIHRyYXZlcnNlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExvZ0FkZHJlc3MsIExvZ091dGNvbWUsIE1ldGEgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHR5cGUgeyBTaGFyZWRNZW1vcnkgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgdHlwZSB7IEZsb3dDb250cm9sVHlwZSwgRmxvd01lc3NhZ2UgfSBmcm9tICcuLi9tZW1vcnkvZnJhbWVUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVByb3RlY3Rpb25Nb2RlIH0gZnJvbSAnLi4vc2NvcGUvcHJvdGVjdGlvbi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IERlY2lkZXIsIFNlbGVjdG9yLCBTdGFnZU5vZGUgfSBmcm9tICcuL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1ZXVlZFBhdXNlLCBSZXN1bWVFbnRyeSB9IGZyb20gJy4vaGFuZGxlcnMvUmVzdW1lRW50cnkuanMnO1xuaW1wb3J0IHR5cGUgeyBJQ29udHJvbEZsb3dOYXJyYXRpdmUgfSBmcm9tICcuL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5cbi8vIFJlLWV4cG9ydCBTdGFnZU5vZGUgdHlwZXMgZm9yIGNvbnZlbmllbmNlXG5leHBvcnQgdHlwZSB7IERlY2lkZXIsIFNlbGVjdG9yLCBTdGFnZU5vZGUgfSBmcm9tICcuL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5cbi8vIFJlLWV4cG9ydCBwYXVzZSB0eXBlcyBmcm9tIHBhdXNlLyBsaWJyYXJ5XG5leHBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQsIFBhdXNhYmxlSGFuZGxlciwgUGF1c2VSZXN1bHQgfSBmcm9tICcuLi9wYXVzZS9pbmRleC5qcyc7XG5leHBvcnQgeyBpc1BhdXNlUmVzdWx0LCBpc1BhdXNlU2lnbmFsLCBQYXVzZVNpZ25hbCB9IGZyb20gJy4uL3BhdXNlL2luZGV4LmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMb2dnZXJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTWluaW1hbCBsb2dnaW5nIGNvbnRyYWN0LiBNaXJyb3JzIENvbnNvbGUgQVBJIHN1YnNldC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUxvZ2dlciB7XG4gIGluZm8obWVzc2FnZT86IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgbG9nKG1lc3NhZ2U/OiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGRlYnVnKG1lc3NhZ2U/OiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGVycm9yKG1lc3NhZ2U/OiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIHdhcm4obWVzc2FnZT86IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbn1cblxuLyoqIERlZmF1bHQgY29uc29sZS1iYXNlZCBsb2dnZXIuICovXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtLSB0cml2aWFsIGNvbnNvbGUgZGVsZWdhdGlvbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRMb2dnZXI6IElMb2dnZXIgPSB7XG4gIGluZm86IChtZXNzYWdlPzogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gY29uc29sZS5pbmZvKG1lc3NhZ2UsIC4uLmFyZ3MpLFxuICBsb2c6IChtZXNzYWdlPzogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gY29uc29sZS5sb2cobWVzc2FnZSwgLi4uYXJncyksXG4gIGRlYnVnOiAobWVzc2FnZT86IGFueSwgLi4uYXJnczogYW55W10pID0+IGNvbnNvbGUuZGVidWcobWVzc2FnZSwgLi4uYXJncyksXG4gIGVycm9yOiAobWVzc2FnZT86IGFueSwgLi4uYXJnczogYW55W10pID0+IGNvbnNvbGUuZXJyb3IobWVzc2FnZSwgLi4uYXJncyksXG4gIHdhcm46IChtZXNzYWdlPzogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gY29uc29sZS53YXJuKG1lc3NhZ2UsIC4uLmFyZ3MpLFxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdGFnZSBGdW5jdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBDYWxsYmFjayB0aGF0IHJlY2VpdmVzIHRva2VucyBkdXJpbmcgc3RyZWFtaW5nLiAqL1xuZXhwb3J0IHR5cGUgU3RyZWFtQ2FsbGJhY2sgPSAodG9rZW46IHN0cmluZykgPT4gdm9pZDtcblxuLyoqXG4gKiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIGZvciBzdGFnZSBoYW5kbGVycy5cbiAqIC0gVE91dDogcmV0dXJuIHR5cGUgcHJvZHVjZWQgYnkgdGhlIHN0YWdlXG4gKiAtIFRTY29wZTogdGhlIHNjb3BlIG9iamVjdCBwYXNzZWQgdG8gdGhlIHN0YWdlXG4gKiAtIE9wdGlvbmFsIDNyZCBwYXJhbWV0ZXIgYHN0cmVhbUNhbGxiYWNrYCBpbmplY3RlZCBmb3Igc3RyZWFtaW5nIHN0YWdlcy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RhZ2VGdW5jdGlvbjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+ID0gKFxuICBzY29wZTogVFNjb3BlLFxuICBicmVha1BpcGVsaW5lOiAoKSA9PiB2b2lkLFxuICBzdHJlYW1DYWxsYmFjaz86IFN0cmVhbUNhbGxiYWNrLFxuKSA9PiBQcm9taXNlPFRPdXQgfCB2b2lkPiB8IFRPdXQgfCB2b2lkO1xuXG4vKipcbiAqIFN0YWdlIGZ1bmN0aW9uIGZvciBwYXVzYWJsZSBzdGFnZXMg4oCUIHJldHVybiB2YWx1ZSBpcyB0aGUgcGF1c2UgZGF0YSAoYW55IHR5cGUpLlxuICogUmV0dXJuIG5vbi12b2lkIHRvIHBhdXNlLCByZXR1cm4gdm9pZCB0byBjb250aW51ZSBub3JtYWxseS5cbiAqL1xuZXhwb3J0IHR5cGUgUGF1c2FibGVTdGFnZUZ1bmN0aW9uPFRTY29wZSA9IGFueT4gPSAoXG4gIHNjb3BlOiBUU2NvcGUsXG4gIGJyZWFrUGlwZWxpbmU6ICgpID0+IHZvaWQsXG4pID0+IFByb21pc2U8dW5rbm93bj4gfCB1bmtub3duO1xuXG4vKiogRmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSBzY29wZSBpbnN0YW5jZSBmb3IgZWFjaCBzdGFnZS4gKi9cbmV4cG9ydCB0eXBlIFNjb3BlRmFjdG9yeTxUU2NvcGUgPSBhbnk+ID0gKFxuICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gIHN0YWdlTmFtZTogc3RyaW5nLFxuICByZWFkT25seUNvbnRleHQ/OiB1bmtub3duLFxuICBleGVjdXRpb25FbnY/OiBFeGVjdXRpb25FbnYsXG4pID0+IFRTY29wZTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdHJlYW1pbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgdHlwZSBTdHJlYW1Ub2tlbkhhbmRsZXIgPSAoc3RyZWFtSWQ6IHN0cmluZywgdG9rZW46IHN0cmluZykgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIFN0cmVhbUxpZmVjeWNsZUhhbmRsZXIgPSAoc3RyZWFtSWQ6IHN0cmluZywgZnVsbFRleHQ/OiBzdHJpbmcpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtSGFuZGxlcnMge1xuICBvblRva2VuPzogU3RyZWFtVG9rZW5IYW5kbGVyO1xuICBvblN0YXJ0PzogU3RyZWFtTGlmZWN5Y2xlSGFuZGxlcjtcbiAgb25FbmQ/OiBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBhcmFsbGVsLWZvci1lYWNoIChkeW5hbWljIGZhbi1vdXQpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBBIGJ1aWx0IGNoYXJ0LCBhcyBgYWRkUGFyYWxsZWxGb3JFYWNoYCdzIGBicmFuY2hgIGZhY3RvcnkgcmV0dXJucyBpdC5cbiAqXG4gKiBTdHJ1Y3R1cmFsbHkgdGhlIHN1YnNldCBvZiBgRmxvd0NoYXJ0YCB0aGUgZW5naW5lIG5lZWRzIHRvIG1vdW50IGEgYnJhbmNoIOKAlFxuICogZGVjbGFyZWQgaGVyZSByYXRoZXIgdGhhbiBpbXBvcnRlZCBzbyBgZW5naW5lL2Aga2VlcHMgaXRzIG9uZS13YXkgZGVwZW5kZW5jeVxuICogb24gYGJ1aWxkZXIvYC4gQW55IGBmbG93Q2hhcnQoLi4uKS5idWlsZCgpYCByZXN1bHQgc2F0aXNmaWVzIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyYW5jaENoYXJ0PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgc3RhZ2VNYXA6IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj47XG4gIHN1YmZsb3dzPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgYnVpbGRUaW1lU3RydWN0dXJlPzogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBSdW50aW1lIGZhbi1vdXQgY29uZmlnIOKAlCBvbmUgYnJhbmNoIHBlciBpdGVtLCBicmFuY2ggQ09VTlQgZGVjaWRlZCBhdFxuICogcnVudGltZSBmcm9tIHRoZSBwYXlsb2FkLiBEZXNpZ246IGRvY3MvZGVzaWduL2V4ZWN1dGlvbi1jb250cm9sLm1kIChEMikuXG4gKlxuICogRWFjaCBicmFuY2ggcnVucyBhcyBhIGdlbmVyYXRlZCBTVUJGTE9XIChpc29sYXRlZCBydW50aW1lLCBvd24gY29tbWl0IGxvZyxcbiAqIGFkZHJlc3NhYmxlIGF0IGA8c3RhZ2VJZD5+PGluZGV4PmAgaW4gZXZlcnkgdHJhY2UgcXVlcnkpLCB3aGljaCBpcyB3aGF0XG4gKiBtYWtlcyBicmFuY2hlcyB1bmFibGUgdG8gY29ycnVwdCBlYWNoIG90aGVyJ3MgaW4tZmxpZ2h0IHN0YXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmFsbGVsRm9yRWFjaENvbmZpZzxUSXRlbSA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIC8qKlxuICAgKiBQaWNrcyB0aGUgaXRlbXMgdG8gZmFuIG91dCBvdmVyLCBmcm9tIHRoZSBsaXZlIHNjb3BlLiBSZWFkcyBoZXJlIGFyZVxuICAgKiB0cmFja2VkIGxpa2UgYW55IG90aGVyIHN0YWdlIHJlYWQsIHNvIHRoZSBmYW4tb3V0J3Mgb3duIGlucHV0cyBzaG93IHVwIGluXG4gICAqIHRoZSB0cmFjZSBhbmQgaW4gYSBiYWNrd2FyZCBzbGljZS5cbiAgICovXG4gIGl0ZW1zOiAoc2NvcGU6IFRTY29wZSkgPT4gcmVhZG9ubHkgVEl0ZW1bXTtcbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgY2hhcnQgZm9yIE9ORSBpdGVtLiBDYWxsZWQgb25jZSBwZXIgZXhlY3V0ZWQgYnJhbmNoLCB3aXRoIHRoZVxuICAgKiBpdGVtIGFuZCBpdHMgaW5kZXgg4oCUIGNsb3NlIG92ZXIgdGhlbSwgb3IgcmVhZCB0aGUgYGl0ZW1gIC8gYGluZGV4YCB2YWx1ZXNcbiAgICogc2VlZGVkIGludG8gdGhlIGJyYW5jaCdzIG93biBzY29wZS5cbiAgICovXG4gIGJyYW5jaDogKGl0ZW06IFRJdGVtLCBpbmRleDogbnVtYmVyKSA9PiBCcmFuY2hDaGFydDtcbiAgLyoqXG4gICAqIEhhcmQgY2VpbGluZyBvbiBicmFuY2hlcyBwZXIgZXhlY3V0aW9uLiBSRVFVSVJFRDogYW4gdW5ib3VuZGVkIGZhbi1vdXRcbiAgICogZHJpdmVuIGJ5IG1vZGVsIG91dHB1dCBpcyBhIHJlc291cmNlIGF0dGFjaywgc28gdGhlcmUgaXMgbm8gZGVmYXVsdCB0b1xuICAgKiBmb3JnZXQuIEV4dHJhIGl0ZW1zIGRvIG5vdCBydW4g4oCUIHRoZSB0cnVuY2F0aW9uIGlzIHJlY29yZGVkLCBuZXZlciBzaWxlbnQuXG4gICAqL1xuICBtYXhCcmFuY2hlczogbnVtYmVyO1xuICAvKipcbiAgICogU3RhdGUga2V5IHRoZSBvcmRlcmVkIHJlc3VsdHMgYXJyYXkgaXMgd3JpdHRlbiB0byBvbiB0aGUgcGFyZW50IHNjb3BlLlxuICAgKiBSRVFVSVJFRCDigJQgYSBrZXkgZGVyaXZlZCBmcm9tIHRoZSBzdGFnZSBpZCBjb3VsZCBzaWxlbnRseSBvdmVyd3JpdGUgc3RhdGVcbiAgICogdGhlIGNoYXJ0IGFscmVhZHkgb3ducy5cbiAgICovXG4gIGludG86IHN0cmluZztcbiAgLyoqXG4gICAqIEZhbi1vdXQgZXJyb3IgcG9saWN5IOKAlCB0aGUgU0FNRSBwb2xpY3kgdGhlIGV4aXN0aW5nIHBhcmFsbGVsIGZhbi1vdXQgdXNlcy5cbiAgICogYHRydWVgID0gYFByb21pc2UuYWxsYCAodGhlIGZpcnN0IGZhaWxpbmcgYnJhbmNoIHJlamVjdHMgdGhlIHN0YWdlKTtcbiAgICogb21pdHRlZC9mYWxzZSA9IGJlc3QtZWZmb3J0IGBQcm9taXNlLmFsbFNldHRsZWRgIChldmVyeSBicmFuY2ggcnVuczsgYVxuICAgKiBmYWlsZWQgYnJhbmNoJ3Mgc2xvdCBpbiB0aGUgcmVzdWx0cyBhcnJheSBpcyBgdW5kZWZpbmVkYCkuXG4gICAqL1xuICBmYWlsRmFzdD86IGJvb2xlYW47XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmV0cnkgKHBlci1zdGFnZSBkZWNsYXJhdGl2ZSBwb2xpY3kpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gVGhlIHBvbGljeSB0aGUgYXR0ZW1wdCBydW5uZXIgcnVuczogZGVjbGFyZWQgb25jZSwgaW4gdGhlIGF0dGVtcHQgbGVhZiAoYGF0dGVtcHQvdHlwZXMudHNgLCAxMC4xKSwgYW5kIG5hbWVkXG4vLyBoZXJlIHNvIGV2ZXJ5IGVuZ2luZSBhbmQgYnVpbGRlciBzaXRlIGtlZXBzIGl0cyBpbXBvcnQuXG5leHBvcnQgdHlwZSB7IFJldHJ5UG9saWN5LCBTdGFnZVRvdWNoZXMgfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdWJmbG93XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDb250cm9scyBob3cgYXJyYXkgdmFsdWVzIGZyb20gb3V0cHV0TWFwcGVyIGFyZSBtZXJnZWQgaW50byBwYXJlbnQgc2NvcGUuXG4gKi9cbmV4cG9ydCBlbnVtIEFycmF5TWVyZ2VNb2RlIHtcbiAgLyoqIEFwcGVuZCBzdWJmbG93IG91dHB1dCB0byBleGlzdGluZyBwYXJlbnQgYXJyYXk6IFsuLi5leGlzdGluZywgLi4udmFsdWVdLiBEZWZhdWx0LiAqL1xuICBDb25jYXQgPSAnY29uY2F0JyxcbiAgLyoqIE92ZXJ3cml0ZSBwYXJlbnQgYXJyYXkgd2l0aCBzdWJmbG93IG91dHB1dC4gVXNlIGZvciBEeW5hbWljIGxvb3BzLiAqL1xuICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN1YmZsb3dNb3VudE9wdGlvbnM8VFBhcmVudFNjb3BlID0gYW55LCBUU3ViZmxvd0lucHV0ID0gYW55LCBUU3ViZmxvd091dHB1dCA9IGFueT4ge1xuICBpbnB1dE1hcHBlcj86IChwYXJlbnRTY29wZTogVFBhcmVudFNjb3BlKSA9PiBUU3ViZmxvd0lucHV0O1xuICAvKipcbiAgICogTWFwcyBzdWJmbG93IG91dHB1dCBiYWNrIGludG8gcGFyZW50IHNjb3BlLlxuICAgKlxuICAgKiAqKkFycmF5IG1lcmdlIGJlaGF2aW9yKiogaXMgY29udHJvbGxlZCBieSBgYXJyYXlNZXJnZWA6XG4gICAqIC0gYCdjb25jYXQnYCAoZGVmYXVsdCk6IGBbLi4uZXhpc3RpbmcsIC4uLnZhbHVlXWAg4oCUIHJldHVybiBvbmx5ICoqZGVsdGEqKiBpdGVtc1xuICAgKiAtIGAncmVwbGFjZSdgOiBvdmVyd3JpdGVzIHRoZSBwYXJlbnQgdmFsdWUg4oCUIHJldHVybiB0aGUgZnVsbCBhcnJheVxuICAgKlxuICAgKiBTY2FsYXIgdmFsdWVzIGFyZSBhbHdheXMgcmVwbGFjZWQgcmVnYXJkbGVzcyBvZiBgYXJyYXlNZXJnZWAuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gRGVsdGEgbW9kZSAoZGVmYXVsdCkg4oCUIHJldHVybiBvbmx5IG5ldyBpdGVtcywgY29uY2F0IGFwcGVuZHNcbiAgICogb3V0cHV0TWFwcGVyOiAoc2YpID0+ICh7IG1lc3NhZ2VzOiBzZi5uZXdNZXNzYWdlcyB9KVxuICAgKlxuICAgKiAvLyBSZXBsYWNlIG1vZGUg4oCUIHJldHVybiBmdWxsIGFycmF5LCBwYXJlbnQgdmFsdWUgaXMgb3ZlcndyaXR0ZW5cbiAgICogLy8gVXNlZnVsIGluIER5bmFtaWMgbG9vcHMgd2hlcmUgdGhlIHN1YmZsb3cgcmVjb21wdXRlcyB0aGUgZnVsbCB2YWx1ZSBlYWNoIGl0ZXJhdGlvblxuICAgKiBvdXRwdXRNYXBwZXI6IChzZikgPT4gKHsgdG9vbERlc2NyaXB0aW9uczogc2YudG9vbERlc2NyaXB0aW9ucyB9KSxcbiAgICogYXJyYXlNZXJnZTogQXJyYXlNZXJnZU1vZGUuUmVwbGFjZSxcbiAgICpcbiAgICogLy8gU2NhbGFycyBhcmUgZmluZSBpbiBib3RoIG1vZGVzIOKAlCBhbHdheXMgcmVwbGFjZWRcbiAgICogb3V0cHV0TWFwcGVyOiAoc2YpID0+ICh7IHN0YXR1czogc2YucmVzdWx0LCBjb3VudDogc2YudG90YWwgfSlcbiAgICogYGBgXG4gICAqL1xuICBvdXRwdXRNYXBwZXI/OiAoc3ViZmxvd091dHB1dDogVFN1YmZsb3dPdXRwdXQsIHBhcmVudFNjb3BlOiBUUGFyZW50U2NvcGUpID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKipcbiAgICogQ29udHJvbHMgaG93IGFycmF5IHZhbHVlcyBmcm9tIG91dHB1dE1hcHBlciBhcmUgbWVyZ2VkIGludG8gcGFyZW50IHNjb3BlLlxuICAgKiBBcHBsaWVzIG9ubHkgdG8gdG9wLWxldmVsIGFycmF5IGtleXMuIE5lc3RlZCBhcnJheXMgaW5zaWRlIG9iamVjdHNcbiAgICogYWx3YXlzIHVzZSBhcHBlbmQgKGFwcGVuZFRvQXJyYXkpIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBcnJheU1lcmdlTW9kZS5Db25jYXRcbiAgICovXG4gIGFycmF5TWVyZ2U/OiBBcnJheU1lcmdlTW9kZTtcblxuICAvKipcbiAgICogU1RSVUNUVVJFLU9OTFk6IHRoZSBkb3duc3RyZWFtIHN0YWdlIGlkIHRoaXMgYnJhbmNoJ3MgY29udmVyZ2VuY2UgZWRnZVxuICAgKiBwb2ludHMgdG8sIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgXCJjb252ZXJnZSBhdCB0aGUgbmV4dCBsaW5lYXIgc3RhZ2UuXCJcbiAgICpcbiAgICogV2hlbiBhIGZvcmsvc2VsZWN0b3IvZGVjaWRlciBicmFuY2ggY2FycmllcyBgY29udmVyZ2VBdGAsIGl0cyB2aXN1YWxpemVkXG4gICAqIGBuZXh0YCBlZGdlIGlzIGZpcmVkIHRvIHRoZSBuYW1lZCBzdGFnZSBpbnN0ZWFkIG9mIHRvIHRoZSBzaGFyZWRcbiAgICogY29udmVyZ2VuY2Ugbm9kZSBpdHMgc2libGluZ3MgdXNlLiBUaGlzIGV4cHJlc3NlcyBhbiB1bmVxdWFsLWRlcHRoIG1lcmdlXG4gICAqIOKAlCBlLmcuIGEgYHRvb2xzYCBzbG90IHRoYXQgYnlwYXNzZXMgdGhlIGBtZXNzYWdlQVBJYCBhc3NlbWJseSBub2RlIGFuZFxuICAgKiBwYWlycyB3aXRoIGl0cyBvdXRwdXQgYXQgYGNhbGwtbGxtYCAoc28gYGNhbGwtbGxtYCByZWFkcyBhcyBhIDItcGFyZW50XG4gICAqIG1lcmdlKSwgZmFpdGhmdWwgdG8gdGhlIEFudGhyb3BpYyB3aXJlIHByb3RvY29sIChzeXN0ZW0rbWVzc2FnZXMgPSB0aGVcbiAgICogbWVzc2FnZSBwYXlsb2FkOyB0b29scyA9IGEgc2VwYXJhdGUgdG9wLWxldmVsIGZpZWxkKS5cbiAgICpcbiAgICogKipUaGlzIGFmZmVjdHMgdGhlIFNUUlVDVFVSRS90b3BvbG9neSBncmFwaCBvbmx5Kiog4oCUIHRoZSBydW50aW1lIGlzXG4gICAqIHVuY2hhbmdlZCAodGhlIGJyYW5jaCdzIG91dHB1dHMgcmlkZSBzaGFyZWQgc2NvcGU7IHRoZSBuYW1lZCB0YXJnZXQgcmVhZHNcbiAgICogdGhlbSB3aGVuIGl0IHJ1bnMpLiBJdCBkb2VzIE5PVCBpbnRyb2R1Y2UgYSBqb2luIGJhcnJpZXIuIFRoZSB0YXJnZXQgaXMgYVxuICAgKiBGT1JXQVJEIHN0YWdlIChhZGRlZCBsYXRlciBpbiB0aGUgY2hhaW4pLCBzbyBpdCBpcyBub3QgdmFsaWRhdGVkIGF0XG4gICAqIGJyYW5jaC1kZWNsYXJhdGlvbiB0aW1lLlxuICAgKi9cbiAgY29udmVyZ2VBdD86IHN0cmluZztcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIGFuIGlubmVyIGBzY29wZS4kYnJlYWsocmVhc29uKWAgY2FsbCBpbnNpZGUgdGhpcyBzdWJmbG93XG4gICAqIHByb3BhZ2F0ZXMgdXAgdG8gdGhlIHBhcmVudCDigJQgaS5lLiwgdGhlIHBhcmVudCdzIGBicmVha0ZsYWdgIGlzIHNldFxuICAgKiBhZnRlciB0aGUgc3ViZmxvdyBleGl0cywgdGVybWluYXRpbmcgdGhlIHBhcmVudCdzIG91dGVyIGxvb3AgdG9vLlxuICAgKlxuICAgKiAqKkRlZmF1bHQ6IGBmYWxzZWAqKiAoY3VycmVudCBiZWhhdmlvdXIg4oCUIGlubmVyIGJyZWFrIHN0b3BzIG9ubHkgdGhlXG4gICAqIHN1YmZsb3c7IHBhcmVudCBjb250aW51ZXMpLlxuICAgKlxuICAgKiAjIyBXaGVuIHRvIHVzZVxuICAgKlxuICAgKiBTZXQgYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYCBvbiBzdWJmbG93IG1vdW50cyB0aGF0IHJlcHJlc2VudFxuICAgKiAqKnRlcm1pbmFsKiogYnJhbmNoZXMg4oCUIFwiaWYgdGhpcyBzdWJmbG93IGZpcmVzLCB0aGUgb3V0ZXIgbG9vcCBpc1xuICAgKiBkb25lXCIuIEV4YW1wbGVzOlxuICAgKlxuICAgKiAtIEEgaHVtYW4tcmV2aWV3IHJ1bm5lciB0aGF0IHRha2VzIG92ZXIgZnJvbSBhbiBhZ2VudCdzIHRvb2wtY2FsbGluZ1xuICAgKiAgIGxvb3AgYW5kIHByb2R1Y2VzIHRoZSBmaW5hbCByZXNwb25zZS5cbiAgICogLSBBIHNhZmV0eS1nYXRlIHN1YmZsb3cgdGhhdCBoYWx0cyB0aGUgb3V0ZXIgd29ya2Zsb3cgd2hlbiBhIHBvbGljeVxuICAgKiAgIHZpb2xhdGlvbiBpcyBkZXRlY3RlZC5cbiAgICogLSBBbiBlcnJvci1yZWNvdmVyeSBzdWJmbG93IHRoYXQgcmVzdG9yZXMgc3RhdGUgYW5kIHRoZW4gdGVybWluYXRlcy5cbiAgICpcbiAgICogIyMgU2VtYW50aWNzXG4gICAqXG4gICAqIDEuIEluc2lkZSB0aGUgc3ViZmxvdywgYSBzdGFnZSBjYWxscyBgc2NvcGUuJGJyZWFrKHJlYXNvbilgLlxuICAgKiAyLiBUaGUgc3ViZmxvdydzIG93biBleGVjdXRpb24gc3RvcHMgKG5vcm1hbCBgJGJyZWFrYCBiZWhhdmlvdXIpLlxuICAgKiAzLiBgU3ViZmxvd0V4ZWN1dG9yYCBpbnNwZWN0cyB0aGUgc3ViZmxvdydzIGV4aXQgc3RhdGUuIElmXG4gICAqICAgIGBwcm9wYWdhdGVCcmVhayA9PT0gdHJ1ZWAgQU5EIHRoZSBpbm5lciBicmVhayBmaXJlZCwgaXQgZm9yd2FyZHNcbiAgICogICAgdGhlIGJyZWFrIChhbmQgaXRzIHJlYXNvbikgdG8gdGhlIHBhcmVudCdzIGBicmVha0ZsYWdgLlxuICAgKiA0LiBUaGUgcGFyZW50IHRyYXZlcnNlciBzZWVzIGBzaG91bGRCcmVha2Agb24gaXRzIG5leHQgc3RlcCBhbmQgZXhpdHMuXG4gICAqIDUuIEEgYEZsb3dSZWNvcmRlci5vbkJyZWFrYCBldmVudCBmaXJlcyBhdCB0aGUgcGFyZW50LW1vdW50IGxldmVsIHdpdGhcbiAgICogICAgYHByb3BhZ2F0ZWRGcm9tU3ViZmxvd2AgPSB0aGUgc3ViZmxvdydzIGlkIGFuZCB0aGUgaW5uZXIgcmVhc29uLlxuICAgKlxuICAgKiAjIyBQYXJhbGxlbC9mYW4tb3V0XG4gICAqXG4gICAqIEZvbGxvd3MgdGhlIGV4aXN0aW5nIGxpYnJhcnkgcnVsZSBpbiBgQ2hpbGRyZW5FeGVjdXRvcmA6IHRoZSBwYXJlbnRcbiAgICogYnJlYWtzIG9ubHkgd2hlbiAqKmV2ZXJ5KiogY2hpbGQgb2YgYSBmb3JrIGJyb2tlLiBBIHNpbmdsZVxuICAgKiBgcHJvcGFnYXRlQnJlYWs6IHRydWVgIHN1YmZsb3cgY29udHJpYnV0aW5nIGl0cyBicmVhayB0byB0aGUgY291bnRcbiAgICogZG9lcyBub3Qgb24gaXRzIG93biB0ZXJtaW5hdGUgdGhlIHBhcmVudCBmYW4tb3V0LlxuICAgKlxuICAgKiAjIyBvdXRwdXRNYXBwZXIgc3RpbGwgcnVuc1xuICAgKlxuICAgKiBUaGUgc3ViZmxvdydzIGBvdXRwdXRNYXBwZXJgIChpZiBzdXBwbGllZCkgQUxXQVlTIHJ1bnMgYmVmb3JlIHRoZVxuICAgKiBicmVhayBwcm9wYWdhdGVzLCBzbyB0aGUgc3ViZmxvdydzIHBhcnRpYWwgc3RhdGUgaXMgc3RpbGwgd3JpdHRlbiB0b1xuICAgKiB0aGUgcGFyZW50IHNjb3BlLiBUaGlzIGlzIGludGVudGlvbmFsIOKAlCB0aGUgdHlwaWNhbCB1c2UgY2FzZSBpcyBhblxuICAgKiBcImVzY2FsYXRpb25cIiBzdWJmbG93IHdob3NlIG91dHB1dCBJUyB0aGUgZmluYWwgYW5zd2VyIHRoYXQgbmVlZHMgdG9cbiAgICogbGFuZCBpbiB0aGUgcGFyZW50IHNjb3BlIGJlZm9yZSB0aGUgb3V0ZXIgbG9vcCB0ZXJtaW5hdGVzLiBJZiB5b3VcbiAgICogd2FudCB0byBzdXBwcmVzcyBvdXRwdXQgbWFwcGluZyBvbiBicmVhaywgY2hlY2sgdGhlIGJyZWFrIHN0YXRlXG4gICAqIGluc2lkZSB5b3VyIGBvdXRwdXRNYXBwZXJgIGFuZCByZXR1cm4gYHt9YCBlYXJseS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHByb3BhZ2F0ZUJyZWFrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGVjbGFyZWQgdGFncyAoOS4yMS4xKSBmb3IgdGhlIE1PVU5UIGl0c2VsZiDigJQgdGhlIE5BTUVTIHRoZSBhdXRob3IgcHV0c1xuICAgKiBvbiB0aGlzIG1vdW50IGF0IGJ1aWxkIHRpbWUsIGxhbmRlZCBieSB0aGUgc2FtZSBgYXBwbHlUYWdzYCBldmVyeSBvdGhlclxuICAgKiBgb3B0aW9ucy50YWdzYCBzaXRlIHVzZXMsIHdpdGggdGhlIHNhbWUgcmVmdXNhbHMgKGVtcHR5LCBub24tc3RyaW5nLCB0aGVcbiAgICogcmVzZXJ2ZWQgYH5gIG1hcmtlciwgYSBkdXBsaWNhdGUsIGEgc2Vjb25kIGRlY2xhcmF0aW9uKS5cbiAgICpcbiAgICogQSBtb3VudCBpcyBhIHN0YWdlIHRoYXQgY29tbWl0czogaXRzIGZpcnN0IGJ1bmRsZSBpbiB0aGUgUEFSRU5UIGxvZyBpcyBhXG4gICAqIHN0b3AgaW4gYGNvbW1pdFN0b3BzYCwgc28gYHRhZ1N0b3BzYCBrZWVwcyBpdCBsaWtlIGFueSB0YWdnZWQgc3RhZ2UgYW5kXG4gICAqIGNhcnJpZXMgdGhlc2UgbmFtZXMgYXMgYFN0b3AubWV0YWAuIFN0YW1wZWQgb24gdGhhdCBmaXJzdCBidW5kbGUgb25seVxuICAgKiAodGhlIG1vdW50J3MgZXhpdCBidW5kbGUgY2FycmllcyBub25lIOKAlCB0aGUgb25jZS1wZXItZXhlY3V0aW9uIGxhdykuXG4gICAqIFRoZSBzdWJmbG93J3MgT1dOIGxvZyBpcyB1bnRvdWNoZWQ6IGl0cyBpbm5lciBzdGFnZXMgZGVjbGFyZSB0aGVpciBvd25cbiAgICogdGFncywgYW5kIGBkcmlsbChtb3VudClgIHJlYWRzIHRob3NlIG9mZiB0aGUgaW5uZXIgbG9nLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBPTkxZIHRhZyBzaXRlIGZvciBhIGZvcmstY2hpbGQgbW91bnQgKGBhZGRTdWJGbG93Q2hhcnRgKSBvclxuICAgKiBhIGJyYW5jaCBtb3VudCAoYGFkZFN1YkZsb3dDaGFydEJyYW5jaGApIOKAlCBhZnRlciB0aG9zZSB0aGUgY3Vyc29yIHN0aWxsXG4gICAqIHBvaW50cyBhdCB0aGUgcGFyZW50LCBzbyBgLnRhZygpYCByZWZ1c2VzIHJhdGhlciB0aGFuIG1pcy1hdHRyaWJ1dGUuIEFcbiAgICogbGluZWFyIG1vdW50IChgYWRkU3ViRmxvd0NoYXJ0TmV4dGApIG1vdmVzIHRoZSBjdXJzb3IsIHNvIGAudGFnKClgIHdvcmtzXG4gICAqIHRoZXJlIHRvbzsgZGVjbGFyZSBpbiBvbmUgcGxhY2UsIG5vdCBib3RoLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC5hZGRTZWxlY3RvckZ1bmN0aW9uKCdTbG90cycsIHBpY2tTbG90cywgJ3Nsb3RzJylcbiAgICogICAuYWRkU3ViRmxvd0NoYXJ0QnJhbmNoKCdtZW1vcnknLCBtZW1vcnlDaGFydCwgJ01lbW9yeScsIHsgdGFnczogWydzbG90Om1lbW9yeSddIH0pXG4gICAqICAgLmFkZFN1YkZsb3dDaGFydEJyYW5jaCgndG9vbHMnLCB0b29sc0NoYXJ0LCAnVG9vbHMnLCB7IHRhZ3M6IFsnc2xvdDp0b29scyddIH0pXG4gICAqIC5lbmQoKVxuICAgKiBgYGBcbiAgICovXG4gIHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdWJmbG93UmVzdWx0IHtcbiAgc3ViZmxvd0lkOiBzdHJpbmc7XG4gIHN1YmZsb3dOYW1lOiBzdHJpbmc7XG4gIHRyZWVDb250ZXh0OiB7XG4gICAgLyoqXG4gICAgICogVGhlIHN1YmZsb3cncyBmaW5hbCBzdGF0ZS4gVGhlIHRyYXZlcnNlcidzIHJlY29yZCBob2xkcyB0aGUgTElWRSBoZWFwXG4gICAgICog4oCUIHdoYXQgYSBwbGFpbiBgZ2V0U25hcHNob3QoKWAgYW5kIHRoZSBjaGVja3BvaW50IHNlZS4gVW5kZXJcbiAgICAgKiBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgIHRoZSBleGVjdXRvciBzZXJ2ZXMgdGhlIHN1YmZsb3cncyBvd25cbiAgICAgKiByZWRhY3RlZCBtaXJyb3IgaGVyZSBpbnN0ZWFkICg5LjIwLjA7IGBoYW5kbGVycy9zZXJ2ZWRTdWJmbG93UmVzdWx0c2ApLFxuICAgICAqIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCBgc3RhdGVBdGAgZm9sZHMgYGhpc3RvcnlgIHRvLlxuICAgICAqL1xuICAgIGdsb2JhbENvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHN0YWdlQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGhpc3Rvcnk6IHVua25vd25bXTtcbiAgICAvKiogSWRlbnRpdHkgb2YgdGhlIGxvY2FsIGhpc3RvcnksIG5vdCBpdHMgcGFyZW50J3MgbG9nLiAqL1xuICAgIHJlYWRvbmx5IGxvZ0FkZHJlc3M/OiBMb2dBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdWJmbG93J3MgT1dOIGZvbGQgYmFzZSDigJQgdGhlIHN0YXRlIGl0cyBpc29sYXRlZCBydW50aW1lIHN0YXJ0ZWRcbiAgICAgKiBmcm9tLCBiZWZvcmUgaXRzIGZpcnN0IGNvbW1pdC4gVGhlIHNpYmxpbmcgb2ZcbiAgICAgKiBgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZWAsIGNhcnJpZWQgaGVyZSBzbyBhIHN1YmZsb3cncyBgaGlzdG9yeWBcbiAgICAgKiBjYW4gYmUgZm9sZGVkIG9mZmxpbmUgZXhhY3RseSBsaWtlIHRoZSBydW4ncyBsb2cgKGBzdGF0ZUF0YCxcbiAgICAgKiBgdGltZVRyYXZlbCguLi4pLmRyaWxsKG1vdW50KWApLiBGcm96ZW4gYW5kIGRldGFjaGVkLlxuICAgICAqXG4gICAgICogTm9ybWFsbHkgYHt9YDogYSBzdWJmbG93J3MgYGlucHV0TWFwcGVyYCBzZWVkIGlzIGl0c2VsZiB0aGUgZmlyc3RcbiAgICAgKiBDT01NSVQgaW4gYGhpc3RvcnlgICh0aGUgcm9vdCBjb250ZXh0IGNvbW1pdHMgaXQpLCBub3QgYSBwcmUtcnVuIGJhc2UuXG4gICAgICovXG4gICAgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH07XG4gIHBhcmVudFN0YWdlSWQ6IHN0cmluZztcbiAgcGlwZWxpbmVTdHJ1Y3R1cmU/OiB1bmtub3duO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFN1YmZsb3cgVHJhdmVyc2VyIEZhY3Rvcnlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5IOKAlCBDcmVhdGVzIGEgRmxvd2NoYXJ0VHJhdmVyc2VyIGZvciBzdWJmbG93IGV4ZWN1dGlvbi5cbiAqXG4gKiBJbmplY3RlZCBpbnRvIFN1YmZsb3dFeGVjdXRvciB0byBicmVhayB0aGUgY2lyY3VsYXIgZGVwZW5kZW5jeTpcbiAqIEZsb3djaGFydFRyYXZlcnNlciDihpIgU3ViZmxvd0V4ZWN1dG9yIOKGkiBGbG93Y2hhcnRUcmF2ZXJzZXIuXG4gKlxuICogVGhlIGZhY3RvcnkgY2FwdHVyZXMgcGFyZW50IHRyYXZlcnNlciBjb25maWcgKHN0YWdlTWFwLCBzY29wZUZhY3RvcnksIG5hcnJhdGl2ZSwgZXRjLilcbiAqIGluIGEgY2xvc3VyZS4gU3ViZmxvd0V4ZWN1dG9yIGNhbGxzIGl0IHdpdGggc3ViZmxvdy1zcGVjaWZpYyBvdmVycmlkZXMgKHJvb3QsIHJ1bnRpbWUsIGlucHV0KS5cbiAqIFRoZSByZXR1cm5lZCB0cmF2ZXJzZXIgdXNlcyB0aGUgU0FNRSA3LXBoYXNlIGFsZ29yaXRobSBhcyB0aGUgdG9wLWxldmVsIHRyYXZlcnNlcixcbiAqIHNvIGRlY2lkZXJzLCBzZWxlY3RvcnMsIGxvb3BzLCBsYXp5IHN1YmZsb3dzLCBhbmQgYWJvcnQgc2lnbmFscyBhbGwgd29yayBpbnNpZGUgc3ViZmxvd3MuXG4gKi9cbmV4cG9ydCB0eXBlIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4gPSAob3B0aW9uczoge1xuICAvKiogUm9vdCBub2RlIG9mIHRoZSBzdWJmbG93ICh3aXRoIGlzU3ViZmxvd1Jvb3Qgc3RyaXBwZWQpIOKAlCB0aGUgZ3JhcGggZXZlcnkgaWQgaW5zaWRlIHRoZSBzdWJmbG93IHJlc29sdmVzIGFnYWluc3QuICovXG4gIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogV2hlcmUgdGhlIHN1YmZsb3cncyB0cmF2ZXJzYWwgc3RhcnRzIHdoZW4gbm90IGF0IGByb290YCDigJQgYSByZXN1bWUnc1xuICAgKiBvbmUtc2hvdCByZS1lbnRyeSAoYFJlc3VtZUhvcC5lbnRyeWApOiB0aGUgbmV4dCBtb3VudCBvbiB0aGUgcGF1c2UgcGF0aCxcbiAgICogb3IgdGhlIHBhdXNlZCBzdGFnZSdzIHN0YW5kLWluLCBlYWNoIHdpdGggaXRzIGRpc3BhdGNoZXIncyBjb250aW51YXRpb25cbiAgICogYXR0YWNoZWQuIFZpc2l0ZWQgb25jZSwgZmlyc3Q7IG5ldmVyIHJlc29sdmFibGUgYnkgaWQuXG4gICAqL1xuICBlbnRyeT86IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogUGFyYWxsZWwgc2libGluZ3MnIHBhdXNlcyB3YWl0aW5nIGluIHRoaXMgc3ViZmxvdyAoYFJlc3VtZUhvcC5wZW5kaW5nUGF1c2VzYCxcbiAgICogOS4yOC4wKSDigJQgcmFpc2VkIGluIG9yZGVyIG9uY2UgYGVudHJ5YCdzIGNoYWluIGVuZHMuXG4gICAqL1xuICBwZW5kaW5nUGF1c2VzPzogcmVhZG9ubHkgUXVldWVkUGF1c2VbXTtcbiAgLyoqIElzb2xhdGVkIGV4ZWN1dGlvbiBydW50aW1lIGZvciB0aGUgc3ViZmxvdy4gKi9cbiAgZXhlY3V0aW9uUnVudGltZTogSUV4ZWN1dGlvblJ1bnRpbWU7XG4gIC8qKiBNYXBwZWQgaW5wdXQgZnJvbSBwYXJlbnQgc2NvcGUgKGJlY29tZXMgcmVhZE9ubHlDb250ZXh0IGZvciBzdGFnZXMpLiAqL1xuICByZWFkT25seUNvbnRleHQ/OiB1bmtub3duO1xuICAvKiogU3ViZmxvdyBpZGVudGlmaWVyIOKAlCB1c2VkIGFzIGJyYW5jaFBhdGggZm9yIG5hcnJhdGl2ZSBjb250ZXh0LiAqL1xuICBzdWJmbG93SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQxOiBydW50aW1lU3RhZ2VJZCBvZiB0aGUgc3ViZmxvdyBNT1VOVCBzdGFnZSBpbiB0aGUgcGFyZW50XG4gICAqIHRyYXZlcnNlci4gQmVjb21lcyB0aGUgYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBmYWxsYmFjayBmb3IgdGhlIHN1YmZsb3cnc1xuICAgKiByb290IHN0YWdlIHNvIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHN1YmZsb3cgYm91bmRhcmllcy5cbiAgICovXG4gIHBhcmVudE1vdW50UnVudGltZVN0YWdlSWQ/OiBzdHJpbmc7XG59KSA9PiBTdWJmbG93VHJhdmVyc2VySGFuZGxlPFRPdXQsIFRTY29wZT47XG5cbi8qKlxuICogSGFuZGxlIHJldHVybmVkIGJ5IFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5LlxuICogUHJvdmlkZXMgZXhlY3V0ZSgpICsgYWNjZXNzIHRvIG5lc3RlZCBzdWJmbG93IHJlc3VsdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3ViZmxvd1RyYXZlcnNlckhhbmRsZTxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqIEV4ZWN1dGUgdGhlIHN1YmZsb3cncyBncmFwaCB1c2luZyB0aGUgZnVsbCA3LXBoYXNlIHRyYXZlcnNhbCBhbGdvcml0aG0uICovXG4gIGV4ZWN1dGUoKTogUHJvbWlzZTxUcmF2ZXJzYWxSZXN1bHQ+O1xuICAvKiogQ29sbGVjdCBuZXN0ZWQgc3ViZmxvdyByZXN1bHRzIChmcm9tIHN1YmZsb3dzIG1vdW50ZWQgaW5zaWRlIHRoaXMgc3ViZmxvdykuICovXG4gIGdldFN1YmZsb3dSZXN1bHRzKCk6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+O1xuICAvKipcbiAgICogRmluYWwgYnJlYWsgc3RhdGUgb2YgdGhlIHN1YmZsb3cgYWZ0ZXIgYGV4ZWN1dGUoKWAgcmV0dXJucy5cbiAgICpcbiAgICogICAtIGBzaG91bGRCcmVhazogdHJ1ZWAgIOKGkiBhIHN0YWdlIGluc2lkZSB0aGUgc3ViZmxvdyBjYWxsZWRcbiAgICogICAgIGBzY29wZS4kYnJlYWsocmVhc29uKWAsIHN0b3BwaW5nIHRoZSBzdWJmbG93J3Mgb3duIHRyYXZlcnNhbC5cbiAgICogICAtIGByZWFzb25gICAgICAgICAgICAgIOKGkiB0aGUgb3B0aW9uYWwgc3RyaW5nIHBhc3NlZCB0byBgJGJyZWFrYC5cbiAgICpcbiAgICogVXNlZCBieSBgU3ViZmxvd0V4ZWN1dG9yYCB0byBpbXBsZW1lbnQgYFN1YmZsb3dNb3VudE9wdGlvbnMucHJvcGFnYXRlQnJlYWtgOlxuICAgKiBpZiB0aGUgbW91bnQgb3B0cyBpbiBBTkQgdGhlIHN1YmZsb3cgYnJva2UsIHRoZSBwYXJlbnQncyBicmVhayBmbGFnIGlzXG4gICAqIGZvcndhcmRlZC5cbiAgICovXG4gIGdldEJyZWFrU3RhdGUoKTogeyBzaG91bGRCcmVhazogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRXhlY3V0aW9uIFJ1bnRpbWUgSW50ZXJmYWNlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBJRXhlY3V0aW9uUnVudGltZSDigJQgSW50ZXJmYWNlIGZvciB0aGUgcnVudGltZSBlbnZpcm9ubWVudC5cbiAqXG4gKiBEZWZpbmVzIHRoZSBjb250cmFjdCB0aGF0IGVuZ2luZSBoYW5kbGVycyBuZWVkIGZyb20gdGhlIHJ1bm5lciBsYXllcixcbiAqIGF2b2lkaW5nIGNpcmN1bGFyIGltcG9ydHMgYmV0d2VlbiBlbmdpbmUvIGFuZCBydW5uZXIvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeGVjdXRpb25SdW50aW1lIHtcbiAgZ2xvYmFsU3RvcmU6IHsgZ2V0U3RhdGUoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcbiAgLyoqXG4gICAqIFRoZSByZWRhY3RlZCBtaXJyb3Igb2YgYGdsb2JhbFN0b3JlYCDigJQgcHJlc2VudCB3aGVuIHRoZSBydW4ncyBwb2xpY3lcbiAgICoga2VlcHMgb25lIChgUnVuUG9saWN5Lm1pcnJvcmA6IGEgcnVuIHdpdGggYSByZWRhY3Rpb24gcG9saWN5KSwgZWxzZSBhYnNlbnQuXG4gICAqIGBTdWJmbG93RXhlY3V0b3JgIHJlYWRzIGl0IHRvIHNlcnZlIGEgc3ViZmxvdydzIHN0YXRlICg5LjIwLjApLlxuICAgKi9cbiAgcmVkYWN0ZWRTdG9yZT86IFNoYXJlZE1lbW9yeTtcbiAgcm9vdFN0YWdlQ29udGV4dDogU3RhZ2VDb250ZXh0O1xuICBleGVjdXRpb25IaXN0b3J5OiB7IGxpc3QoKTogdW5rbm93bltdIH07XG4gIC8qKlxuICAgKiBBIGZyZXNoIHJvb3QgZnJhbWUgb24gdGhpcyBydW50aW1lIOKAlCBpdHMgc3RvcmUsIGl0cyBsb2csIHRoZSBydW4ncyBwb2xpY3lcbiAgICogYW5kIG1pcnJvciAoYEV4ZWN1dGlvblJ1bnRpbWUubmV3Um9vdGApLiBgU3ViZmxvd0V4ZWN1dG9yYCBzd2FwcyBhXG4gICAqIHN1YmZsb3cncyBzZWVkIGZyYW1lIGZvciB0aGUgZnJhbWUgaXRzIGZpcnN0IHN0YWdlIHJ1bnMgb24gd2l0aCBpdC5cbiAgICovXG4gIG5ld1Jvb3QobmFtZTogc3RyaW5nLCBpZDogc3RyaW5nKTogU3RhZ2VDb250ZXh0O1xuICBnZXRTbmFwc2hvdChvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0pOiB7XG4gICAgc2hhcmVkU3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGV4ZWN1dGlvblRyZWU6IHVua25vd247XG4gICAgLyoqIFRoZSBjb21taXQgbG9nJ3MgZm9sZCBiYXNlIOKAlCBzZWUgYFJ1bnRpbWVTbmFwc2hvdC5pbml0aWFsU3RhdGVgLiAqL1xuICAgIGluaXRpYWxTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbW1pdExvZzogdW5rbm93bltdO1xuICAgIHJlYWRvbmx5IGxvZ0FkZHJlc3M/OiBMb2dBZGRyZXNzO1xuICAgIC8qKiBEdWFsLWtleWVkIGJ5IHN1YmZsb3cgcGF0aCAobGFzdCBpdGVyYXRpb24pIEFORCBwZXItZXhlY3V0aW9uIG1vdW50IHJ1bnRpbWVTdGFnZUlkXG4gICAgICogIChlYWNoIGl0ZXJhdGlvbikg4oCUIHNlZSBSdW50aW1lU25hcHNob3Quc3ViZmxvd1Jlc3VsdHMgLyBzdWJmbG93LWNvbW1pdC12aXNpYmlsaXR5LiAqL1xuICAgIHN1YmZsb3dSZXN1bHRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcmVjb3JkZXJzPzogQXJyYXk8eyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IGRhdGE6IHVua25vd24gfT47XG4gIH07XG4gIHNldFJvb3RPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gIGdldFBpcGVsaW5lcygpOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFdoZXJlIGEgbW91bnQncyBvd24gbG9nIHdyaXRlcyBhcyBpdCBsYW5kcyAoMTAuMSwgUDYpIOKAlCB0aGUgcnVuJ3Mgc2luayBhdCB0aGlzIGxvZydzIGFkZHJlc3MgcGx1cyB0aGUgbW91bnQnc1xuICAgKiBgcnVudGltZVN0YWdlSWRgLiBgdW5kZWZpbmVkYCB3aGVuIHRoaXMgcnVudGltZSdzIGxvZyB3cml0ZXMgdG8gbm8gc2luay4gYFN1YmZsb3dFeGVjdXRvcmAgaGFuZHMgaXQgdG8gdGhlXG4gICAqIG5lc3RlZCBydW50aW1lIGl0IGNvbnN0cnVjdHMuXG4gICAqL1xuICByZWNvcmRGb3I/KG1vdW50UnVudGltZVN0YWdlSWQ6IHN0cmluZywgbWV0YT86IE1ldGEpOiB1bmtub3duO1xuICAvKiogVGVsbCB0aGUgc2luayB0aGlzIHJ1bnRpbWUncyBsb2cgZW5kZWQgKDEwLjEsIFA2KSDigJQgYSBtb3VudCdzIGF0IGl0cyBleGl0LiBOby1vcCB3aXRob3V0IGEgc2luay4gKi9cbiAgY2xvc2VSZWNvcmQ/KG91dGNvbWU6IExvZ091dGNvbWUsIG1ldGE/OiBNZXRhKTogdm9pZDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeGVjdXRpb24gRW52aXJvbm1lbnQg4oCUIHJlYWQtb25seSwgcHJvcGFnYXRlcyB0aHJvdWdoIG5lc3RlZCBleGVjdXRvcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEV4ZWN1dGlvbkVudiDigJQgaW5mcmFzdHJ1Y3R1cmUgdmFsdWVzIHRoYXQgcHJvcGFnYXRlIHRocm91Z2ggbmVzdGVkIGV4ZWN1dG9ycy5cbiAqXG4gKiBMaWtlIGBwcm9jZXNzLmVudmAgZm9yIGZsb3djaGFydHM6IHJlYWQtb25seSwgaW5oZXJpdGVkIGJ5IGNoaWxkIGV4ZWN1dG9ycyxcbiAqIGluZnJhc3RydWN0dXJlLW9ubHkgKG5vdCBidXNpbmVzcyBsb2dpYykuXG4gKlxuICogTGl0bXVzIHRlc3Q6IENyZWF0ZWQgZXh0ZXJuYWwgdG8gdGhlIGZsb3djaGFydCArIHBhc3NlZCBpbiBmb3IgZXhlY3V0aW9uID0gZW52LlxuICogQnVzaW5lc3MgY29uZmlnIGZvciBhIHNwZWNpZmljIGZsb3djaGFydCA9IGFyZ3MgKGdldEFyZ3MoKSkuXG4gKlxuICogSW50ZW50aW9uYWxseSBhIGNsb3NlZCB0eXBlIOKAlCBub3QgZXh0ZW5zaWJsZSB0byBwcmV2ZW50IGNvdXBsaW5nIGJldHdlZW5cbiAqIHBhcmVudCBhbmQgY2hpbGQgZmxvd2NoYXJ0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25FbnYge1xuICAvKipcbiAgICogQWJvcnRTaWduYWwgZm9yIGNvb3BlcmF0aXZlIGNhbmNlbGxhdGlvbiBhY3Jvc3MgbmVzdGVkIGV4ZWN1dG9ycy4gSG9ub3VyZWQgYnkgdGhlIGVuZ2luZSAoMTAuMSk6IGl0IGVuZHMgdGhlXG4gICAqIHJ1biBsaWtlIGBSdW5PcHRpb25zLnNpZ25hbGAuIFVuZGVyIGEgcnVuIHRoYXQgaGFzIGEgc2lnbmFsIG9yIGEgZGVhZGxpbmUgQU5EIGFuIGVudiwgYSBzdGFnZSByZWFkcyB0aGUgcnVuJ3NcbiAgICogT05FIGVmZmVjdGl2ZSBzaWduYWwgaGVyZSDigJQgYFJ1bk9wdGlvbnMuc2lnbmFsYCwgdGhpcyBvbmUgYW5kIHRoZSBkZWFkbGluZSdzIHRpbWVyLCBjb21wb3NlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKiogVGltZW91dCBidWRnZXQgaW4gbWlsbGlzZWNvbmRzLiBSZWFkYWJsZSBvbmx5IOKAlCB0aGUgcnVuJ3MgZGVhZGxpbmUgaXMge0BsaW5rIGRlYWRsaW5lfS4gKi9cbiAgcmVhZG9ubHkgdGltZW91dE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogVHJhY2UgaWRlbnRpZmllciBmb3IgZGlzdHJpYnV0ZWQgdHJhY2luZyAvIG9ic2VydmFiaWxpdHkuIFdpdGggYG9wZXJhdGlvbklkYCAob3IgYWxvbmUpIGl0IGJlY29tZXMgdGhlIHJ1bidzXG4gICAqIGBSdW5Db3JyZWxhdGlvbmA7IGl0IHdpbnMgb3ZlciB0aGUgdHJhY2UgaWQgb2YgYHRyYWNlcGFyZW50YC4gMeKAkzI1NiBwcmludGFibGUgQVNDSUkgY2hhcmFjdGVycyB3aXRoIG5vIHNwYWNlXG4gICAqIChzaW5jZSAxMC4xIGFueXRoaW5nIGVsc2UgcmVqZWN0cyB0aGUgcnVuIHdpdGggYSBgVHlwZUVycm9yYCBuYW1pbmcgdGhlIGZpZWxkIOKAlCB0aGUgaWQgcmlkZXMgZXZlcnkgZXZlbnQpO1xuICAgKiBhbiBlbXB0eSBzdHJpbmcgaXMgbm8gaWQuXG4gICAqL1xuICByZWFkb25seSB0cmFjZUlkPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGNhbGxlcidzIHVuaXQgb2Ygd29yayAoVzNDJ3MgcGFyZW50LWlkKSDigJQgcGFydCBvZiB0aGUgcnVuJ3MgYFJ1bkNvcnJlbGF0aW9uYDsgd2lucyBvdmVyIHRoZSBoZWFkZXInc1xuICAgKiBwYXJlbnQtaWQuIE5lZWRzIGEgdHJhY2U6IGB0cmFjZUlkYCBvciBgdHJhY2VwYXJlbnRgIChyZWZ1c2VkIGFsb25lKS4gU2FtZSBjaGFyYWN0ZXIgcnVsZSBhcyBgdHJhY2VJZGAuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25JZD86IHN0cmluZztcbiAgLyoqXG4gICAqIEEgVzNDIGB0cmFjZXBhcmVudGAgaGVhZGVyLCB1c3VhbGx5IHN0cmFpZ2h0IGZyb20gYW4gaW5ib3VuZCByZXF1ZXN0LiBQYXJzZWQgU1RSSUNUTFkgb25jZSBwZXIgcnVuIOKAlCBhXG4gICAqIG1hbGZvcm1lZCBvbmUgcmVmdXNlcyB0aGUgcnVuIHdpdGggYSBgVHJhY2VwYXJlbnRFcnJvcmAgbmFtaW5nIHRoZSByZWFzb24gKG5ldmVyIHRoZSBoZWFkZXIpLiBTdGFnZXMgcmVhZFxuICAgKiBiYWNrIChgJGdldEVudigpYCkgZXhhY3RseSBgUnVuQ29ycmVsYXRpb24udHJhY2VwYXJlbnRgIOKAlCB0aGUgY2Fub25pY2FsIGhlYWRlciBvZiB0aGUgZWZmZWN0aXZlIGlkcyDigJQgb3Igbm9cbiAgICoga2V5IHdoZW4gdGhlIHJ1bidzIGNvcnJlbGF0aW9uIGNhcnJpZXMgbm9uZS4gQ29ycmVsYXRpb24gb25seTogbmV2ZXIgaWRlbnRpdHkgb3IgYXV0aG9yaXNhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHRyYWNlcGFyZW50Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJ1bidzIGRlYWRsaW5lLCBlcG9jaCBtaWxsaXNlY29uZHMgKDEwLjEpIOKAlCB0aGUgZWFybGllc3Qgb2YgYFJ1bk9wdGlvbnMuZGVhZGxpbmVgLCBgbm93ICsgUnVuT3B0aW9ucy50aW1lb3V0TXNgXG4gICAqIGFuZCBhIGRlYWRsaW5lIGdpdmVuIGhlcmUuIFRoZSBydW4ncyBzaWduYWwgYWJvcnRzIHdoZW4gaXQgcGFzc2VzOyBldmVyeSBhdHRlbXB0IGlzIGNhcHBlZCBieSB0aGUgdGltZSBsZWZ0LlxuICAgKiBJbmhlcml0ZWQgYnkgc3ViZmxvd3MuIFJlYWQgaXQgdGhyb3VnaCBgc2NvcGUuJGF0dGVtcHQoKS50aW1lTGVmdE1zKClgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVhZGxpbmU/OiBudW1iZXI7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSGFuZGxlciBEZXBlbmRlbmNpZXMgKERJIGJhZykg4oCUIHdhcyBQaXBlbGluZUNvbnRleHRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEhhbmRsZXJEZXBzIOKAlCBEZXBlbmRlbmN5IGluamVjdGlvbiBiYWcgcGFzc2VkIHRvIGFsbCBoYW5kbGVyIG1vZHVsZXMuXG4gKlxuICogUHJvdmlkZXMgc2hhcmVkIHN0YXRlIChzdGFnZU1hcCwgcnVudGltZSwgc2NvcGVGYWN0b3J5LCBldGMuKSB3aXRob3V0XG4gKiBoYW5kbGVycyBuZWVkaW5nIHRvIGltcG9ydCB0aGUgdHJhdmVyc2VyIGRpcmVjdGx5LiBBdm9pZHMgY2lyY3VsYXIgZGVwcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVyRGVwczxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgc3RhZ2VNYXA6IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj47XG4gIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcbiAgc3ViZmxvd3M/OiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+O1xuICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyPzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzO1xuICBzY29wZVByb3RlY3Rpb25Nb2RlOiBTY29wZVByb3RlY3Rpb25Nb2RlO1xuICByZWFkT25seUNvbnRleHQ/OiB1bmtub3duO1xuICAvKiogRXhlY3V0aW9uIGVudmlyb25tZW50IOKAlCBwcm9wYWdhdGVzIHRvIHN1YmZsb3dzIGF1dG9tYXRpY2FsbHkuICovXG4gIGV4ZWN1dGlvbkVudj86IEV4ZWN1dGlvbkVudjtcbiAgbmFycmF0aXZlR2VuZXJhdG9yOiBJQ29udHJvbEZsb3dOYXJyYXRpdmU7XG4gIGxvZ2dlcjogSUxvZ2dlcjtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIC8qKlxuICAgKiBUaGUgcmVzdW1lJ3Mgb25lLXNob3QgcmUtZW50cnkgKE0yKSDigJQgc2hhcmVkIGJ5IHJlZmVyZW5jZSB3aXRoIGV2ZXJ5XG4gICAqIG5lc3RlZCB0cmF2ZXJzZXIsIGxpa2UgdGhlIGV4ZWN1dGlvbiBjb3VudGVyLiBgU3ViZmxvd0V4ZWN1dG9yYCBhc2tzIGl0XG4gICAqIGF0IGVhY2ggc3ViZmxvdyBlbnRyeTogdGhlIEZJUlNUIGVudHJ5IGludG8gYSBzdWJmbG93IG9uIHRoZSBwYXVzZSBwYXRoXG4gICAqIHRha2VzIHRoYXQgc3ViZmxvdydzIGNhcHR1cmVkIHN0YXRlIChzZWVkaW5nIHRoZSBuZXN0ZWQgcnVudGltZSBpbiBwbGFjZVxuICAgKiBvZiB0aGUgaW5wdXRNYXBwZXIncyB2YWx1ZXMg4oCUIHRoZSBtYXBwZXIgc3RpbGwgcnVucyBmb3IgdGhlIHJlYWQtb25seVxuICAgKiBhcmdzKSwgaXRzIGVudHJ5IHBvaW50IGFuZCBhbnkgc2libGluZyBwYXVzZXMgd2FpdGluZyB0aGVyZTsgZXZlcnkgbGF0ZXJcbiAgICogZW50cnkgaXMgYW4gb3JkaW5hcnkgb25lLiBTZWUgYFJlc3VtZUVudHJ5YC4gVW5kZWZpbmVkIG9uIG5vcm1hbCBgcnVuKClgXG4gICAqIHBhdGhzLlxuICAgKi9cbiAgcmVzdW1lPzogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIEZsb3dDaGFydEV4ZWN1dG9yLnJ1bigpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5PcHRpb25zIHtcbiAgLyoqIEFib3J0U2lnbmFsIGZvciBjb29wZXJhdGl2ZSBjYW5jZWxsYXRpb24uIENvbXBvc2VkIHdpdGggYGVudi5zaWduYWxgIGFuZCB0aGUgZGVhZGxpbmUgKDEwLjEpLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzOiB0aGUgcnVuJ3MgZGVhZGxpbmUgaXMgYG5vdyArIHRpbWVvdXRNc2AuIFRoZSBydW4gYWJvcnRzIHdoZW4gaXQgcGFzc2VzIChyZWplY3Rpbmcgd2l0aFxuICAgKiBgRXhlY3V0aW9uIHRpbWVkIG91dCBhZnRlciA8dGltZW91dE1zPm1zYCksIHN0YWdlcyByZWFkIGl0IGFzIGBlbnYuZGVhZGxpbmVgLCBhbmQgZXZlcnkgc3RhZ2UgcmVjb3JkcyBpdHNcbiAgICogYXR0ZW1wdCAoYFN0YWdlU25hcHNob3QuYXR0ZW1wdHNgKS4gSG9ub3VyZWQgYmVzaWRlIGEgYHNpZ25hbGAgc2luY2UgMTAuMSAoaXQgdXNlZCB0byBiZSBpZ25vcmVkIHRoZXJlKS5cbiAgICovXG4gIHRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBydW4ncyBkZWFkbGluZSwgZXBvY2ggbWlsbGlzZWNvbmRzICgxMC4xKSDigJQgYERhdGUubm93KCkgKyAxMjBfMDAwYC4gU2FtZSBlZmZlY3QgYXMgYHRpbWVvdXRNc2A7IHdoZW4gYm90aFxuICAgKiBhcmUgZ2l2ZW4sIHRoZSBlYXJsaWVyIHdpbnMuIEEgZGVhZGxpbmUgYWxyZWFkeSBwYXN0IHN0b3BzIHRoZSBydW4gYmVmb3JlIGl0cyBmaXJzdCBzdGFnZS4gQSByZXN1bWVkIGxlZyBoYXNcbiAgICogaXRzIG93bjogcGFzcyBpdCBhZ2FpbiB0byBgcmVzdW1lKClgLlxuICAgKi9cbiAgZGVhZGxpbmU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBSdW50aW1lIGlucHV0IGRhdGEgZm9yIHRoZSBwaXBlbGluZS5cbiAgICogQmVjb21lcyB0aGUgcmVhZE9ubHlDb250ZXh0IGFjY2Vzc2libGUgdmlhIGBzY29wZS5nZXRBcmdzKClgLlxuICAgKiBTdGFnZXMgY2Fubm90IG92ZXJ3cml0ZSB0aGVzZSBrZXlzIHdpdGggYHNldFZhbHVlKClgLlxuICAgKi9cbiAgaW5wdXQ/OiB1bmtub3duO1xuICAvKipcbiAgICogRXhlY3V0aW9uIGVudmlyb25tZW50IOKAlCByZWFkLW9ubHkgaW5mcmFzdHJ1Y3R1cmUgdmFsdWVzIHRoYXQgcHJvcGFnYXRlXG4gICAqIHRocm91Z2ggbmVzdGVkIGV4ZWN1dG9ycyAobGlrZSBgcHJvY2Vzcy5lbnZgIGZvciBmbG93Y2hhcnRzKS5cbiAgICogQWNjZXNzaWJsZSB2aWEgYHNjb3BlLmdldEVudigpYC4gSW5oZXJpdGVkIGJ5IHN1YmZsb3dzIGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICBlbnY/OiBFeGVjdXRpb25FbnY7XG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgbWF4aW11bSBuZXN0ZWQgYGV4ZWN1dGVOb2RlYCBkZXB0aCBmb3IgdGhpcyBydW4uXG4gICAqIERlZmF1bHRzIHRvIGBGbG93Y2hhcnRUcmF2ZXJzZXIuTUFYX0VYRUNVVEVfREVQVEhgICg1MDApLlxuICAgKlxuICAgKiBEZXB0aCBjb3VudHMgVFJFRSBuZXN0aW5nIG9ubHkg4oCUIGZvcmsgY2hpbGRyZW4sIGRlY2lkZXIvc2VsZWN0b3IgYnJhbmNoXG4gICAqIGRpc3BhdGNoLCByZWN1cnNpdmUgY29tcG9zaXRpb24uIExpbmVhciBjaGFpbnMgYW5kIGxvb3AgaXRlcmF0aW9ucyBydW5cbiAgICogb24gYSBmbGF0IHRyYW1wb2xpbmUgYW5kIG5ldmVyIGNvbnN1bWUgZGVwdGgsIHNvIHRoaXMgcmFyZWx5IG5lZWRzXG4gICAqIHJhaXNpbmcuIE11c3QgYmUgPj0gMS5cbiAgICovXG4gIG1heERlcHRoPzogbnVtYmVyO1xuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIG1heGltdW0gbG9vcCBpdGVyYXRpb25zIHBlciBub2RlIGZvciB0aGlzIHJ1biAodGhlXG4gICAqIGBDb250aW51YXRpb25SZXNvbHZlcmAgaW5maW5pdGUtbG9vcCBndWFyZCkuIERlZmF1bHRzIHRvIDEwMDAuXG4gICAqIFRoaXMgaXMgdGhlIGJpbmRpbmcgY29uc3RyYWludCBmb3IgbG9vcC1oZWF2eSBwaXBlbGluZXMg4oCUIHJhaXNlIGl0IGZvclxuICAgKiBsZWdpdGltYXRlbHkgbG9uZyBsb29wcyAoYGxvb3BUb2AgY2hhaW5zIHJ1biB3aXRoIGEgZmxhdCBzdGFjaywgc28gaGlnaFxuICAgKiB2YWx1ZXMgYXJlIHNhZmU7IG1lbW9yeSBmb3Igc3RhdGUvbmFycmF0aXZlIHN0aWxsIGdyb3dzIHBlciBpdGVyYXRpb24pLlxuICAgKiBBbHNvIGJvdW5kcyB0aGUgcnVuLXRvdGFsIGNoYWluIG9mIGZ1bmN0aW9uLWJlYXJpbmcgZHluYW1pYyBgbmV4dGBcbiAgICogY29udGludWF0aW9ucyAoZnJlc2ggbm9kZXMgcmV0dXJuZWQgZnJvbSBzdGFnZXMpIOKAlCBhIHJ1bmF3YXkgZHluYW1pY1xuICAgKiBjaGFpbiBlcnJvcnMgaW5zdGVhZCBvZiBydW5uaW5nIGZvcmV2ZXIuXG4gICAqIFByb3BhZ2F0ZXMgdG8gc3ViZmxvd3MuIE11c3QgYmUgPj0gMS5cbiAgICovXG4gIG1heEl0ZXJhdGlvbnM/OiBudW1iZXI7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRmxvdyBDb250cm9sIE5hcnJhdGl2ZSDigJQgY2Fub25pY2FsIGRlZmluaXRpb25zIGxpdmUgaW4gbWVtb3J5L3R5cGVzLnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IHR5cGUgeyBGbG93Q29udHJvbFR5cGUsIEZsb3dNZXNzYWdlIH07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUnVudGltZSBTdHJ1Y3R1cmUgTWV0YWRhdGEgKHVzZWQgYnkgUnVudGltZVN0cnVjdHVyZU1hbmFnZXIpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lU3RydWN0dXJlTWV0YWRhdGEge1xuICB0eXBlOiAnc3RhZ2UnIHwgJ2RlY2lkZXInIHwgJ3NlbGVjdG9yJyB8ICdmb3JrJyB8ICdzdHJlYW1pbmcnIHwgJ3N1YmZsb3cnIHwgJ2xvb3AnO1xuICBzdWJmbG93SWQ/OiBzdHJpbmc7XG4gIGlzU3ViZmxvd1Jvb3Q/OiBib29sZWFuO1xuICBzdWJmbG93TmFtZT86IHN0cmluZztcbiAgLyoqIFRydWUgZm9yIGFuIGBhZGRQYXJhbGxlbEZvckVhY2hgIGZhbi1vdXQgKHR5cGUgc3RheXMgYCdmb3JrJ2ApLiAqL1xuICBpc0R5bmFtaWNQYXJhbGxlbD86IGJvb2xlYW47XG4gIGlzUGFyYWxsZWxDaGlsZD86IGJvb2xlYW47XG4gIHBhcmFsbGVsR3JvdXBJZD86IHN0cmluZztcbiAgbG9vcFRhcmdldD86IHN0cmluZztcbiAgaXNEeW5hbWljPzogYm9vbGVhbjtcbiAgaXNMb29wUmVmZXJlbmNlPzogYm9vbGVhbjtcbiAgc3RyZWFtSWQ/OiBzdHJpbmc7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTm9kZSBSZXN1bHRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgdHlwZSBOb2RlUmVzdWx0VHlwZSA9IHtcbiAgaWQ6IHN0cmluZztcbiAgcmVzdWx0OiB1bmtub3duO1xuICBpc0Vycm9yPzogYm9vbGVhbjtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRXhlY3V0aW9uIFJlc3BvbnNlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IHR5cGUgQnJhbmNoUmVzdWx0ID0ge1xuICByZXN1bHQ6IHN0cmluZyB8IEVycm9yO1xuICBpc0Vycm9yOiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgQnJhbmNoUmVzdWx0cyA9IHsgW2JyYW5jaElkOiBzdHJpbmddOiBCcmFuY2hSZXN1bHQgfTtcbmV4cG9ydCB0eXBlIFRyYXZlcnNhbFJlc3VsdCA9IEJyYW5jaFJlc3VsdHMgfCBzdHJpbmcgfCBFcnJvcjtcblxuLyoqIFJldHVybmVkIGJ5IHJ1bigpL3Jlc3VtZSgpIHdoZW4gZXhlY3V0aW9uIHBhdXNlcy4gKi9cbmV4cG9ydCB0eXBlIFBhdXNlZFJlc3VsdCA9IHtcbiAgcmVhZG9ubHkgcGF1c2VkOiB0cnVlO1xuICByZWFkb25seSBjaGVja3BvaW50OiBpbXBvcnQoJy4uL3BhdXNlL3R5cGVzLmpzJykuRmxvd2NoYXJ0Q2hlY2twb2ludDtcbn07XG5cbi8qKiBGdWxsIHJldHVybiB0eXBlIG9mIEZsb3dDaGFydEV4ZWN1dG9yLnJ1bigpIGFuZCByZXN1bWUoKS4gKi9cbmV4cG9ydCB0eXBlIEV4ZWN1dG9yUmVzdWx0ID0gVHJhdmVyc2FsUmVzdWx0IHwgUGF1c2VkUmVzdWx0O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlcmlhbGl6ZWQgUGlwZWxpbmUgU3RydWN0dXJlIChmb3IgdmlzdWFsaXphdGlvbilcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6ZWRQaXBlbGluZU5vZGUge1xuICBuYW1lOiBzdHJpbmc7XG4gIGlkOiBzdHJpbmc7XG4gIHR5cGU/OlxuICAgIHwgJ3N0YWdlJ1xuICAgIHwgJ2RlY2lkZXInXG4gICAgfCAnc2VsZWN0b3InXG4gICAgfCAnZm9yaydcbiAgICB8ICdzdHJlYW1pbmcnXG4gICAgfCAnc3ViZmxvdydcbiAgICB8ICdsb29wJ1xuICAgIHwgJ3VzZXInXG4gICAgfCAndG9vbCdcbiAgICB8ICdmdW5jdGlvbidcbiAgICB8ICdzZXF1ZW5jZSc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBjaGlsZHJlbj86IFNlcmlhbGl6ZWRQaXBlbGluZU5vZGVbXTtcbiAgbmV4dD86IFNlcmlhbGl6ZWRQaXBlbGluZU5vZGU7XG4gIGJyYW5jaGVzPzogUmVjb3JkPHN0cmluZywgU2VyaWFsaXplZFBpcGVsaW5lTm9kZT47XG4gIGhhc0RlY2lkZXI/OiBib29sZWFuO1xuICBoYXNTZWxlY3Rvcj86IGJvb2xlYW47XG4gIGhhc1N1YnRyZWU/OiBib29sZWFuO1xuICBpc1N0cmVhbWluZz86IGJvb2xlYW47XG4gIHN0cmVhbUlkPzogc3RyaW5nO1xuICBpc1N1YmZsb3dSb290PzogYm9vbGVhbjtcbiAgc3ViZmxvd0lkPzogc3RyaW5nO1xuICBzdWJmbG93TmFtZT86IHN0cmluZztcbiAgbG9vcFRhcmdldD86IHN0cmluZztcbiAgaXNMb29wUmVmZXJlbmNlPzogYm9vbGVhbjtcbiAgaXNQYXJhbGxlbENoaWxkPzogYm9vbGVhbjtcbiAgcGFyYWxsZWxHcm91cElkPzogc3RyaW5nO1xuICBpc0R5bmFtaWM/OiBib29sZWFuO1xuICAvKiogV2hlbiB0cnVlLCB0aGlzIHN0YWdlIGNhbiBwYXVzZSBleGVjdXRpb24gKFBhdXNhYmxlSGFuZGxlciBwYXR0ZXJuKS4gKi9cbiAgaXNQYXVzYWJsZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUcnVlIGZvciBhbiBgYWRkUGFyYWxsZWxGb3JFYWNoYCBmYW4tb3V0IOKAlCBicmFuY2ggQ09VTlQgZGVjaWRlZCBhdCBydW50aW1lXG4gICAqIGZyb20gdGhlIHBheWxvYWQuIEEgZmxhZywgbm90IGEgdHlwZTogYHR5cGVgIHN0YXlzIGAnZm9yaydgIHNvIGV2ZXJ5XG4gICAqIGV4aXN0aW5nIGNvbnN1bWVyIHJlbmRlcnMgaXQgY29ycmVjdGx5IChpdCBJUyBhIGZhbi1vdXQpLCBhbmQgYSBjb25zdW1lclxuICAgKiB0aGF0IHdhbnRzIHRvIHNheSBcIm9uZSBicmFuY2ggcGVyIGl0ZW1cIiBjYW4gcmVhZCB0aGlzLlxuICAgKi9cbiAgaXNEeW5hbWljUGFyYWxsZWw/OiBib29sZWFuO1xuICAvKipcbiAgICogVG90YWwgYXR0ZW1wdHMgdGhpcyBzdGFnZSdzIGZ1bmN0aW9uIG1heSBydW4sIGZyb20gaXRzIGRlY2xhcmVkXG4gICAqIHtAbGluayBSZXRyeVBvbGljeX0uIFByZXNlbnQgb25seSB3aGVuIGEgcG9saWN5IHdhcyBkZWNsYXJlZC4gVGhlIENPVU5UXG4gICAqIG9ubHkg4oCUIGBiYWNrb2ZmTXNgIGFuZCBgcmV0cnlPbmAgY2FuIGJlIGZ1bmN0aW9ucywgd2hpY2ggYSBKU09OLXNhZmUgc3BlY1xuICAgKiBjYW5ub3QgY2FycnkuXG4gICAqL1xuICByZXRyeUF0dGVtcHRzPzogbnVtYmVyO1xuICAvKipcbiAgICogRGVjbGFyZWQgdGFncyAoOS4yMS4wKSDigJQgdGhlIG5hbWVzIHRoZSBhdXRob3IgcHV0IG9uIHRoaXMgc3RhZ2UgYXQgYnVpbGRcbiAgICogdGltZSwgY29waWVkIGFzLWlzLiBGcmVlIHN0cmluZ3M7IGZvb3RwcmludGpzIGFzc2lnbnMgdGhlbSBubyBtZWFuaW5nLlxuICAgKiBBYnNlbnQgd2hlbiB0aGUgc3RhZ2UgZGVjbGFyZXMgbm9uZS5cbiAgICovXG4gIHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGbG93Q2hhcnQgaXMgZGVmaW5lZCBpbiBgLi4vYnVpbGRlci90eXBlcy50c2AuIFRoZSBlbmdpbmUgbGF5ZXIgY29uc3VtZXMgaXRcbi8vIHZpYSBpbXBvcnQgZnJvbSB0aGVyZS4gQSBkdXBsaWNhdGUgbWluaW1hbCBkZWZpbml0aW9uIHByZXZpb3VzbHkgbGl2ZWQgaGVyZVxuLy8gYW5kIGNhdXNlZCBUUyBjb25mdXNpb24gYXQgY29tcG9zaXRpb24gYm91bmRhcmllcyAoQ29tcG9zYWJsZVJ1bm5lciB2c1xuLy8gYWRkU3ViRmxvd0NoYXJ0IHBhcmFtZXRlcikuIFNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggbm93IGxpdmVzIGluIGJ1aWxkZXIvLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBBbGlhcyBmb3IgU2VyaWFsaXplZFBpcGVsaW5lTm9kZSB1c2VkIGFzIGZ1bGwgc3RydWN0dXJlICovXG5leHBvcnQgdHlwZSBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSBTZXJpYWxpemVkUGlwZWxpbmVOb2RlICYge1xuICBicmFuY2hJZHM/OiBzdHJpbmdbXTtcbiAgc3ViZmxvd1N0cnVjdHVyZT86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgaXRlcmF0aW9uQ291bnQ/OiBudW1iZXI7XG59O1xuIl19
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQWlCSCxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQWU5RSxvQ0FBb0M7QUFDcEMsd0RBQXdEO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBWTtJQUNwQyxJQUFJLEVBQUUsQ0FBQyxPQUFhLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ3ZFLEdBQUcsRUFBRSxDQUFDLE9BQWEsRUFBRSxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDckUsS0FBSyxFQUFFLENBQUMsT0FBYSxFQUFFLEdBQUcsSUFBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQztJQUN6RSxLQUFLLEVBQUUsQ0FBQyxPQUFhLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ3pFLElBQUksRUFBRSxDQUFDLE9BQWEsRUFBRSxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUM7Q0FDeEUsQ0FBQztBQXVIRiw4RUFBOEU7QUFDOUUsVUFBVTtBQUNWLDhFQUE4RTtBQUU5RTs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLGNBS1g7QUFMRCxXQUFZLGNBQWM7SUFDeEIsd0ZBQXdGO0lBQ3hGLG1DQUFpQixDQUFBO0lBQ2pCLHlFQUF5RTtJQUN6RSxxQ0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTFcsY0FBYyxLQUFkLGNBQWMsUUFLekIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHR5cGVzLnRzIOKAlCBBbGwgdHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIGVuZ2luZSBsaWJyYXJ5LlxuICpcbiAqIENlbnRyYWxpemVzIHR5cGUgZGVmaW5pdGlvbnMgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLlxuICogRXZlcnkgaGFuZGxlciByZWNlaXZlcyBIYW5kbGVyRGVwcyAodGhlIERJIGJhZykgaW5zdGVhZCBvZiBpbXBvcnRpbmcgdGhlIHRyYXZlcnNlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExvZ0FkZHJlc3MsIExvZ091dGNvbWUsIE1ldGEgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHR5cGUgeyBTaGFyZWRNZW1vcnkgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgdHlwZSB7IEZsb3dDb250cm9sVHlwZSwgRmxvd01lc3NhZ2UgfSBmcm9tICcuLi9tZW1vcnkvZnJhbWVUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVByb3RlY3Rpb25Nb2RlIH0gZnJvbSAnLi4vc2NvcGUvcHJvdGVjdGlvbi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IERlY2lkZXIsIFNlbGVjdG9yLCBTdGFnZU5vZGUgfSBmcm9tICcuL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1ZXVlZFBhdXNlLCBSZXN1bWVFbnRyeSB9IGZyb20gJy4vaGFuZGxlcnMvUmVzdW1lRW50cnkuanMnO1xuaW1wb3J0IHR5cGUgeyBJQ29udHJvbEZsb3dOYXJyYXRpdmUgfSBmcm9tICcuL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5cbi8vIFJlLWV4cG9ydCBTdGFnZU5vZGUgdHlwZXMgZm9yIGNvbnZlbmllbmNlXG5leHBvcnQgdHlwZSB7IERlY2lkZXIsIFNlbGVjdG9yLCBTdGFnZU5vZGUgfSBmcm9tICcuL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5cbi8vIFJlLWV4cG9ydCBwYXVzZSB0eXBlcyBmcm9tIHBhdXNlLyBsaWJyYXJ5XG5leHBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQsIFBhdXNhYmxlSGFuZGxlciwgUGF1c2VSZXN1bHQgfSBmcm9tICcuLi9wYXVzZS9pbmRleC5qcyc7XG5leHBvcnQgeyBpc1BhdXNlUmVzdWx0LCBpc1BhdXNlU2lnbmFsLCBQYXVzZVNpZ25hbCB9IGZyb20gJy4uL3BhdXNlL2luZGV4LmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMb2dnZXJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTWluaW1hbCBsb2dnaW5nIGNvbnRyYWN0LiBNaXJyb3JzIENvbnNvbGUgQVBJIHN1YnNldC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUxvZ2dlciB7XG4gIGluZm8obWVzc2FnZT86IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgbG9nKG1lc3NhZ2U/OiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGRlYnVnKG1lc3NhZ2U/OiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGVycm9yKG1lc3NhZ2U/OiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIHdhcm4obWVzc2FnZT86IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbn1cblxuLyoqIERlZmF1bHQgY29uc29sZS1iYXNlZCBsb2dnZXIuICovXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtLSB0cml2aWFsIGNvbnNvbGUgZGVsZWdhdGlvbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRMb2dnZXI6IElMb2dnZXIgPSB7XG4gIGluZm86IChtZXNzYWdlPzogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gY29uc29sZS5pbmZvKG1lc3NhZ2UsIC4uLmFyZ3MpLFxuICBsb2c6IChtZXNzYWdlPzogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gY29uc29sZS5sb2cobWVzc2FnZSwgLi4uYXJncyksXG4gIGRlYnVnOiAobWVzc2FnZT86IGFueSwgLi4uYXJnczogYW55W10pID0+IGNvbnNvbGUuZGVidWcobWVzc2FnZSwgLi4uYXJncyksXG4gIGVycm9yOiAobWVzc2FnZT86IGFueSwgLi4uYXJnczogYW55W10pID0+IGNvbnNvbGUuZXJyb3IobWVzc2FnZSwgLi4uYXJncyksXG4gIHdhcm46IChtZXNzYWdlPzogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gY29uc29sZS53YXJuKG1lc3NhZ2UsIC4uLmFyZ3MpLFxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdGFnZSBGdW5jdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBDYWxsYmFjayB0aGF0IHJlY2VpdmVzIHRva2VucyBkdXJpbmcgc3RyZWFtaW5nLiAqL1xuZXhwb3J0IHR5cGUgU3RyZWFtQ2FsbGJhY2sgPSAodG9rZW46IHN0cmluZykgPT4gdm9pZDtcblxuLyoqXG4gKiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIGZvciBzdGFnZSBoYW5kbGVycy5cbiAqIC0gVE91dDogcmV0dXJuIHR5cGUgcHJvZHVjZWQgYnkgdGhlIHN0YWdlXG4gKiAtIFRTY29wZTogdGhlIHNjb3BlIG9iamVjdCBwYXNzZWQgdG8gdGhlIHN0YWdlXG4gKiAtIE9wdGlvbmFsIDNyZCBwYXJhbWV0ZXIgYHN0cmVhbUNhbGxiYWNrYCBpbmplY3RlZCBmb3Igc3RyZWFtaW5nIHN0YWdlcy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RhZ2VGdW5jdGlvbjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+ID0gKFxuICBzY29wZTogVFNjb3BlLFxuICBicmVha1BpcGVsaW5lOiAoKSA9PiB2b2lkLFxuICBzdHJlYW1DYWxsYmFjaz86IFN0cmVhbUNhbGxiYWNrLFxuKSA9PiBQcm9taXNlPFRPdXQgfCB2b2lkPiB8IFRPdXQgfCB2b2lkO1xuXG4vKipcbiAqIFN0YWdlIGZ1bmN0aW9uIGZvciBwYXVzYWJsZSBzdGFnZXMg4oCUIHJldHVybiB2YWx1ZSBpcyB0aGUgcGF1c2UgZGF0YSAoYW55IHR5cGUpLlxuICogUmV0dXJuIG5vbi12b2lkIHRvIHBhdXNlLCByZXR1cm4gdm9pZCB0byBjb250aW51ZSBub3JtYWxseS5cbiAqL1xuZXhwb3J0IHR5cGUgUGF1c2FibGVTdGFnZUZ1bmN0aW9uPFRTY29wZSA9IGFueT4gPSAoXG4gIHNjb3BlOiBUU2NvcGUsXG4gIGJyZWFrUGlwZWxpbmU6ICgpID0+IHZvaWQsXG4pID0+IFByb21pc2U8dW5rbm93bj4gfCB1bmtub3duO1xuXG4vKiogRmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSBzY29wZSBpbnN0YW5jZSBmb3IgZWFjaCBzdGFnZS4gKi9cbmV4cG9ydCB0eXBlIFNjb3BlRmFjdG9yeTxUU2NvcGUgPSBhbnk+ID0gKFxuICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gIHN0YWdlTmFtZTogc3RyaW5nLFxuICByZWFkT25seUNvbnRleHQ/OiB1bmtub3duLFxuICBleGVjdXRpb25FbnY/OiBFeGVjdXRpb25FbnYsXG4pID0+IFRTY29wZTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdHJlYW1pbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgdHlwZSBTdHJlYW1Ub2tlbkhhbmRsZXIgPSAoc3RyZWFtSWQ6IHN0cmluZywgdG9rZW46IHN0cmluZykgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIFN0cmVhbUxpZmVjeWNsZUhhbmRsZXIgPSAoc3RyZWFtSWQ6IHN0cmluZywgZnVsbFRleHQ/OiBzdHJpbmcpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtSGFuZGxlcnMge1xuICBvblRva2VuPzogU3RyZWFtVG9rZW5IYW5kbGVyO1xuICBvblN0YXJ0PzogU3RyZWFtTGlmZWN5Y2xlSGFuZGxlcjtcbiAgb25FbmQ/OiBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBhcmFsbGVsLWZvci1lYWNoIChkeW5hbWljIGZhbi1vdXQpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBBIGJ1aWx0IGNoYXJ0LCBhcyBgYWRkUGFyYWxsZWxGb3JFYWNoYCdzIGBicmFuY2hgIGZhY3RvcnkgcmV0dXJucyBpdC5cbiAqXG4gKiBTdHJ1Y3R1cmFsbHkgdGhlIHN1YnNldCBvZiBgRmxvd0NoYXJ0YCB0aGUgZW5naW5lIG5lZWRzIHRvIG1vdW50IGEgYnJhbmNoIOKAlFxuICogZGVjbGFyZWQgaGVyZSByYXRoZXIgdGhhbiBpbXBvcnRlZCBzbyBgZW5naW5lL2Aga2VlcHMgaXRzIG9uZS13YXkgZGVwZW5kZW5jeVxuICogb24gYGJ1aWxkZXIvYC4gQW55IGBmbG93Q2hhcnQoLi4uKS5idWlsZCgpYCByZXN1bHQgc2F0aXNmaWVzIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyYW5jaENoYXJ0PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgc3RhZ2VNYXA6IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj47XG4gIHN1YmZsb3dzPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgYnVpbGRUaW1lU3RydWN0dXJlPzogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBSdW50aW1lIGZhbi1vdXQgY29uZmlnIOKAlCBvbmUgYnJhbmNoIHBlciBpdGVtLCBicmFuY2ggQ09VTlQgZGVjaWRlZCBhdFxuICogcnVudGltZSBmcm9tIHRoZSBwYXlsb2FkLiBEZXNpZ246IGRvY3MvZGVzaWduL2V4ZWN1dGlvbi1jb250cm9sLm1kIChEMikuXG4gKlxuICogRWFjaCBicmFuY2ggcnVucyBhcyBhIGdlbmVyYXRlZCBTVUJGTE9XIChpc29sYXRlZCBydW50aW1lLCBvd24gY29tbWl0IGxvZyxcbiAqIGFkZHJlc3NhYmxlIGF0IGA8c3RhZ2VJZD5+PGluZGV4PmAgaW4gZXZlcnkgdHJhY2UgcXVlcnkpLCB3aGljaCBpcyB3aGF0XG4gKiBtYWtlcyBicmFuY2hlcyB1bmFibGUgdG8gY29ycnVwdCBlYWNoIG90aGVyJ3MgaW4tZmxpZ2h0IHN0YXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmFsbGVsRm9yRWFjaENvbmZpZzxUSXRlbSA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIC8qKlxuICAgKiBQaWNrcyB0aGUgaXRlbXMgdG8gZmFuIG91dCBvdmVyLCBmcm9tIHRoZSBsaXZlIHNjb3BlLiBSZWFkcyBoZXJlIGFyZVxuICAgKiB0cmFja2VkIGxpa2UgYW55IG90aGVyIHN0YWdlIHJlYWQsIHNvIHRoZSBmYW4tb3V0J3Mgb3duIGlucHV0cyBzaG93IHVwIGluXG4gICAqIHRoZSB0cmFjZSBhbmQgaW4gYSBiYWNrd2FyZCBzbGljZS5cbiAgICovXG4gIGl0ZW1zOiAoc2NvcGU6IFRTY29wZSkgPT4gcmVhZG9ubHkgVEl0ZW1bXTtcbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgY2hhcnQgZm9yIE9ORSBpdGVtLiBDYWxsZWQgb25jZSBwZXIgZXhlY3V0ZWQgYnJhbmNoLCB3aXRoIHRoZVxuICAgKiBpdGVtIGFuZCBpdHMgaW5kZXgg4oCUIGNsb3NlIG92ZXIgdGhlbSwgb3IgcmVhZCB0aGUgYGl0ZW1gIC8gYGluZGV4YCB2YWx1ZXNcbiAgICogc2VlZGVkIGludG8gdGhlIGJyYW5jaCdzIG93biBzY29wZS5cbiAgICovXG4gIGJyYW5jaDogKGl0ZW06IFRJdGVtLCBpbmRleDogbnVtYmVyKSA9PiBCcmFuY2hDaGFydDtcbiAgLyoqXG4gICAqIEhhcmQgY2VpbGluZyBvbiBicmFuY2hlcyBwZXIgZXhlY3V0aW9uLiBSRVFVSVJFRDogYW4gdW5ib3VuZGVkIGZhbi1vdXRcbiAgICogZHJpdmVuIGJ5IG1vZGVsIG91dHB1dCBpcyBhIHJlc291cmNlIGF0dGFjaywgc28gdGhlcmUgaXMgbm8gZGVmYXVsdCB0b1xuICAgKiBmb3JnZXQuIEV4dHJhIGl0ZW1zIGRvIG5vdCBydW4g4oCUIHRoZSB0cnVuY2F0aW9uIGlzIHJlY29yZGVkLCBuZXZlciBzaWxlbnQuXG4gICAqL1xuICBtYXhCcmFuY2hlczogbnVtYmVyO1xuICAvKipcbiAgICogU3RhdGUga2V5IHRoZSBvcmRlcmVkIHJlc3VsdHMgYXJyYXkgaXMgd3JpdHRlbiB0byBvbiB0aGUgcGFyZW50IHNjb3BlLlxuICAgKiBSRVFVSVJFRCDigJQgYSBrZXkgZGVyaXZlZCBmcm9tIHRoZSBzdGFnZSBpZCBjb3VsZCBzaWxlbnRseSBvdmVyd3JpdGUgc3RhdGVcbiAgICogdGhlIGNoYXJ0IGFscmVhZHkgb3ducy5cbiAgICovXG4gIGludG86IHN0cmluZztcbiAgLyoqXG4gICAqIEZhbi1vdXQgZXJyb3IgcG9saWN5IOKAlCB0aGUgU0FNRSBwb2xpY3kgdGhlIGV4aXN0aW5nIHBhcmFsbGVsIGZhbi1vdXQgdXNlcy5cbiAgICogYHRydWVgID0gYFByb21pc2UuYWxsYCAodGhlIGZpcnN0IGZhaWxpbmcgYnJhbmNoIHJlamVjdHMgdGhlIHN0YWdlKTtcbiAgICogb21pdHRlZC9mYWxzZSA9IGJlc3QtZWZmb3J0IGBQcm9taXNlLmFsbFNldHRsZWRgIChldmVyeSBicmFuY2ggcnVuczsgYVxuICAgKiBmYWlsZWQgYnJhbmNoJ3Mgc2xvdCBpbiB0aGUgcmVzdWx0cyBhcnJheSBpcyBgdW5kZWZpbmVkYCkuXG4gICAqL1xuICBmYWlsRmFzdD86IGJvb2xlYW47XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmV0cnkgKHBlci1zdGFnZSBkZWNsYXJhdGl2ZSBwb2xpY3kpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gVGhlIHBvbGljeSB0aGUgYXR0ZW1wdCBydW5uZXIgcnVuczogZGVjbGFyZWQgb25jZSwgaW4gdGhlIGF0dGVtcHQgbGVhZiAoYGF0dGVtcHQvdHlwZXMudHNgLCAxMC4xKSwgYW5kIG5hbWVkXG4vLyBoZXJlIHNvIGV2ZXJ5IGVuZ2luZSBhbmQgYnVpbGRlciBzaXRlIGtlZXBzIGl0cyBpbXBvcnQuXG5leHBvcnQgdHlwZSB7IFJldHJ5UG9saWN5LCBTdGFnZVRvdWNoZXMgfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdWJmbG93XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDb250cm9scyBob3cgYXJyYXkgdmFsdWVzIGZyb20gb3V0cHV0TWFwcGVyIGFyZSBtZXJnZWQgaW50byBwYXJlbnQgc2NvcGUuXG4gKi9cbmV4cG9ydCBlbnVtIEFycmF5TWVyZ2VNb2RlIHtcbiAgLyoqIEFwcGVuZCBzdWJmbG93IG91dHB1dCB0byBleGlzdGluZyBwYXJlbnQgYXJyYXk6IFsuLi5leGlzdGluZywgLi4udmFsdWVdLiBEZWZhdWx0LiAqL1xuICBDb25jYXQgPSAnY29uY2F0JyxcbiAgLyoqIE92ZXJ3cml0ZSBwYXJlbnQgYXJyYXkgd2l0aCBzdWJmbG93IG91dHB1dC4gVXNlIGZvciBEeW5hbWljIGxvb3BzLiAqL1xuICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN1YmZsb3dNb3VudE9wdGlvbnM8VFBhcmVudFNjb3BlID0gYW55LCBUU3ViZmxvd0lucHV0ID0gYW55LCBUU3ViZmxvd091dHB1dCA9IGFueT4ge1xuICBpbnB1dE1hcHBlcj86IChwYXJlbnRTY29wZTogVFBhcmVudFNjb3BlKSA9PiBUU3ViZmxvd0lucHV0O1xuICAvKipcbiAgICogTWFwcyBzdWJmbG93IG91dHB1dCBiYWNrIGludG8gcGFyZW50IHNjb3BlLlxuICAgKlxuICAgKiAqKkFycmF5IG1lcmdlIGJlaGF2aW9yKiogaXMgY29udHJvbGxlZCBieSBgYXJyYXlNZXJnZWA6XG4gICAqIC0gYCdjb25jYXQnYCAoZGVmYXVsdCk6IGBbLi4uZXhpc3RpbmcsIC4uLnZhbHVlXWAg4oCUIHJldHVybiBvbmx5ICoqZGVsdGEqKiBpdGVtc1xuICAgKiAtIGAncmVwbGFjZSdgOiBvdmVyd3JpdGVzIHRoZSBwYXJlbnQgdmFsdWUg4oCUIHJldHVybiB0aGUgZnVsbCBhcnJheVxuICAgKlxuICAgKiBTY2FsYXIgdmFsdWVzIGFyZSBhbHdheXMgcmVwbGFjZWQgcmVnYXJkbGVzcyBvZiBgYXJyYXlNZXJnZWAuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gRGVsdGEgbW9kZSAoZGVmYXVsdCkg4oCUIHJldHVybiBvbmx5IG5ldyBpdGVtcywgY29uY2F0IGFwcGVuZHNcbiAgICogb3V0cHV0TWFwcGVyOiAoc2YpID0+ICh7IG1lc3NhZ2VzOiBzZi5uZXdNZXNzYWdlcyB9KVxuICAgKlxuICAgKiAvLyBSZXBsYWNlIG1vZGUg4oCUIHJldHVybiBmdWxsIGFycmF5LCBwYXJlbnQgdmFsdWUgaXMgb3ZlcndyaXR0ZW5cbiAgICogLy8gVXNlZnVsIGluIER5bmFtaWMgbG9vcHMgd2hlcmUgdGhlIHN1YmZsb3cgcmVjb21wdXRlcyB0aGUgZnVsbCB2YWx1ZSBlYWNoIGl0ZXJhdGlvblxuICAgKiBvdXRwdXRNYXBwZXI6IChzZikgPT4gKHsgdG9vbERlc2NyaXB0aW9uczogc2YudG9vbERlc2NyaXB0aW9ucyB9KSxcbiAgICogYXJyYXlNZXJnZTogQXJyYXlNZXJnZU1vZGUuUmVwbGFjZSxcbiAgICpcbiAgICogLy8gU2NhbGFycyBhcmUgZmluZSBpbiBib3RoIG1vZGVzIOKAlCBhbHdheXMgcmVwbGFjZWRcbiAgICogb3V0cHV0TWFwcGVyOiAoc2YpID0+ICh7IHN0YXR1czogc2YucmVzdWx0LCBjb3VudDogc2YudG90YWwgfSlcbiAgICogYGBgXG4gICAqL1xuICBvdXRwdXRNYXBwZXI/OiAoc3ViZmxvd091dHB1dDogVFN1YmZsb3dPdXRwdXQsIHBhcmVudFNjb3BlOiBUUGFyZW50U2NvcGUpID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKipcbiAgICogQ29udHJvbHMgaG93IGFycmF5IHZhbHVlcyBmcm9tIG91dHB1dE1hcHBlciBhcmUgbWVyZ2VkIGludG8gcGFyZW50IHNjb3BlLlxuICAgKiBBcHBsaWVzIG9ubHkgdG8gdG9wLWxldmVsIGFycmF5IGtleXMuIE5lc3RlZCBhcnJheXMgaW5zaWRlIG9iamVjdHNcbiAgICogYWx3YXlzIHVzZSBhcHBlbmQgKGFwcGVuZFRvQXJyYXkpIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBcnJheU1lcmdlTW9kZS5Db25jYXRcbiAgICovXG4gIGFycmF5TWVyZ2U/OiBBcnJheU1lcmdlTW9kZTtcblxuICAvKipcbiAgICogU1RSVUNUVVJFLU9OTFk6IHRoZSBkb3duc3RyZWFtIHN0YWdlIGlkIHRoaXMgYnJhbmNoJ3MgY29udmVyZ2VuY2UgZWRnZVxuICAgKiBwb2ludHMgdG8sIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgXCJjb252ZXJnZSBhdCB0aGUgbmV4dCBsaW5lYXIgc3RhZ2UuXCJcbiAgICpcbiAgICogV2hlbiBhIGZvcmsvc2VsZWN0b3IvZGVjaWRlciBicmFuY2ggY2FycmllcyBgY29udmVyZ2VBdGAsIGl0cyB2aXN1YWxpemVkXG4gICAqIGBuZXh0YCBlZGdlIGlzIGZpcmVkIHRvIHRoZSBuYW1lZCBzdGFnZSBpbnN0ZWFkIG9mIHRvIHRoZSBzaGFyZWRcbiAgICogY29udmVyZ2VuY2Ugbm9kZSBpdHMgc2libGluZ3MgdXNlLiBUaGlzIGV4cHJlc3NlcyBhbiB1bmVxdWFsLWRlcHRoIG1lcmdlXG4gICAqIOKAlCBlLmcuIGEgYHRvb2xzYCBzbG90IHRoYXQgYnlwYXNzZXMgdGhlIGBtZXNzYWdlQVBJYCBhc3NlbWJseSBub2RlIGFuZFxuICAgKiBwYWlycyB3aXRoIGl0cyBvdXRwdXQgYXQgYGNhbGwtbGxtYCAoc28gYGNhbGwtbGxtYCByZWFkcyBhcyBhIDItcGFyZW50XG4gICAqIG1lcmdlKSwgZmFpdGhmdWwgdG8gdGhlIEFudGhyb3BpYyB3aXJlIHByb3RvY29sIChzeXN0ZW0rbWVzc2FnZXMgPSB0aGVcbiAgICogbWVzc2FnZSBwYXlsb2FkOyB0b29scyA9IGEgc2VwYXJhdGUgdG9wLWxldmVsIGZpZWxkKS5cbiAgICpcbiAgICogKipUaGlzIGFmZmVjdHMgdGhlIFNUUlVDVFVSRS90b3BvbG9neSBncmFwaCBvbmx5Kiog4oCUIHRoZSBydW50aW1lIGlzXG4gICAqIHVuY2hhbmdlZCAodGhlIGJyYW5jaCdzIG91dHB1dHMgcmlkZSBzaGFyZWQgc2NvcGU7IHRoZSBuYW1lZCB0YXJnZXQgcmVhZHNcbiAgICogdGhlbSB3aGVuIGl0IHJ1bnMpLiBJdCBkb2VzIE5PVCBpbnRyb2R1Y2UgYSBqb2luIGJhcnJpZXIuIFRoZSB0YXJnZXQgaXMgYVxuICAgKiBGT1JXQVJEIHN0YWdlIChhZGRlZCBsYXRlciBpbiB0aGUgY2hhaW4pLCBzbyBpdCBpcyBub3QgdmFsaWRhdGVkIGF0XG4gICAqIGJyYW5jaC1kZWNsYXJhdGlvbiB0aW1lLlxuICAgKi9cbiAgY29udmVyZ2VBdD86IHN0cmluZztcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIGFuIGlubmVyIGBzY29wZS4kYnJlYWsocmVhc29uKWAgY2FsbCBpbnNpZGUgdGhpcyBzdWJmbG93XG4gICAqIHByb3BhZ2F0ZXMgdXAgdG8gdGhlIHBhcmVudCDigJQgaS5lLiwgdGhlIHBhcmVudCdzIGBicmVha0ZsYWdgIGlzIHNldFxuICAgKiBhZnRlciB0aGUgc3ViZmxvdyBleGl0cywgdGVybWluYXRpbmcgdGhlIHBhcmVudCdzIG91dGVyIGxvb3AgdG9vLlxuICAgKlxuICAgKiAqKkRlZmF1bHQ6IGBmYWxzZWAqKiAoY3VycmVudCBiZWhhdmlvdXIg4oCUIGlubmVyIGJyZWFrIHN0b3BzIG9ubHkgdGhlXG4gICAqIHN1YmZsb3c7IHBhcmVudCBjb250aW51ZXMpLlxuICAgKlxuICAgKiAjIyBXaGVuIHRvIHVzZVxuICAgKlxuICAgKiBTZXQgYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYCBvbiBzdWJmbG93IG1vdW50cyB0aGF0IHJlcHJlc2VudFxuICAgKiAqKnRlcm1pbmFsKiogYnJhbmNoZXMg4oCUIFwiaWYgdGhpcyBzdWJmbG93IGZpcmVzLCB0aGUgb3V0ZXIgbG9vcCBpc1xuICAgKiBkb25lXCIuIEV4YW1wbGVzOlxuICAgKlxuICAgKiAtIEEgaHVtYW4tcmV2aWV3IHJ1bm5lciB0aGF0IHRha2VzIG92ZXIgZnJvbSBhbiBhZ2VudCdzIHRvb2wtY2FsbGluZ1xuICAgKiAgIGxvb3AgYW5kIHByb2R1Y2VzIHRoZSBmaW5hbCByZXNwb25zZS5cbiAgICogLSBBIHNhZmV0eS1nYXRlIHN1YmZsb3cgdGhhdCBoYWx0cyB0aGUgb3V0ZXIgd29ya2Zsb3cgd2hlbiBhIHBvbGljeVxuICAgKiAgIHZpb2xhdGlvbiBpcyBkZXRlY3RlZC5cbiAgICogLSBBbiBlcnJvci1yZWNvdmVyeSBzdWJmbG93IHRoYXQgcmVzdG9yZXMgc3RhdGUgYW5kIHRoZW4gdGVybWluYXRlcy5cbiAgICpcbiAgICogIyMgU2VtYW50aWNzXG4gICAqXG4gICAqIDEuIEluc2lkZSB0aGUgc3ViZmxvdywgYSBzdGFnZSBjYWxscyBgc2NvcGUuJGJyZWFrKHJlYXNvbilgLlxuICAgKiAyLiBUaGUgc3ViZmxvdydzIG93biBleGVjdXRpb24gc3RvcHMgKG5vcm1hbCBgJGJyZWFrYCBiZWhhdmlvdXIpLlxuICAgKiAzLiBgU3ViZmxvd0V4ZWN1dG9yYCBpbnNwZWN0cyB0aGUgc3ViZmxvdydzIGV4aXQgc3RhdGUuIElmXG4gICAqICAgIGBwcm9wYWdhdGVCcmVhayA9PT0gdHJ1ZWAgQU5EIHRoZSBpbm5lciBicmVhayBmaXJlZCwgaXQgZm9yd2FyZHNcbiAgICogICAgdGhlIGJyZWFrIChhbmQgaXRzIHJlYXNvbikgdG8gdGhlIHBhcmVudCdzIGBicmVha0ZsYWdgLlxuICAgKiA0LiBUaGUgcGFyZW50IHRyYXZlcnNlciBzZWVzIGBzaG91bGRCcmVha2Agb24gaXRzIG5leHQgc3RlcCBhbmQgZXhpdHMuXG4gICAqIDUuIEEgYEZsb3dSZWNvcmRlci5vbkJyZWFrYCBldmVudCBmaXJlcyBhdCB0aGUgcGFyZW50LW1vdW50IGxldmVsIHdpdGhcbiAgICogICAgYHByb3BhZ2F0ZWRGcm9tU3ViZmxvd2AgPSB0aGUgc3ViZmxvdydzIGlkIGFuZCB0aGUgaW5uZXIgcmVhc29uLlxuICAgKlxuICAgKiAjIyBQYXJhbGxlbC9mYW4tb3V0XG4gICAqXG4gICAqIEZvbGxvd3MgdGhlIGV4aXN0aW5nIGxpYnJhcnkgcnVsZSBpbiBgQ2hpbGRyZW5FeGVjdXRvcmA6IHRoZSBwYXJlbnRcbiAgICogYnJlYWtzIG9ubHkgd2hlbiAqKmV2ZXJ5KiogY2hpbGQgb2YgYSBmb3JrIGJyb2tlLiBBIHNpbmdsZVxuICAgKiBgcHJvcGFnYXRlQnJlYWs6IHRydWVgIHN1YmZsb3cgY29udHJpYnV0aW5nIGl0cyBicmVhayB0byB0aGUgY291bnRcbiAgICogZG9lcyBub3Qgb24gaXRzIG93biB0ZXJtaW5hdGUgdGhlIHBhcmVudCBmYW4tb3V0LlxuICAgKlxuICAgKiAjIyBvdXRwdXRNYXBwZXIgc3RpbGwgcnVuc1xuICAgKlxuICAgKiBUaGUgc3ViZmxvdydzIGBvdXRwdXRNYXBwZXJgIChpZiBzdXBwbGllZCkgQUxXQVlTIHJ1bnMgYmVmb3JlIHRoZVxuICAgKiBicmVhayBwcm9wYWdhdGVzLCBzbyB0aGUgc3ViZmxvdydzIHBhcnRpYWwgc3RhdGUgaXMgc3RpbGwgd3JpdHRlbiB0b1xuICAgKiB0aGUgcGFyZW50IHNjb3BlLiBUaGlzIGlzIGludGVudGlvbmFsIOKAlCB0aGUgdHlwaWNhbCB1c2UgY2FzZSBpcyBhblxuICAgKiBcImVzY2FsYXRpb25cIiBzdWJmbG93IHdob3NlIG91dHB1dCBJUyB0aGUgZmluYWwgYW5zd2VyIHRoYXQgbmVlZHMgdG9cbiAgICogbGFuZCBpbiB0aGUgcGFyZW50IHNjb3BlIGJlZm9yZSB0aGUgb3V0ZXIgbG9vcCB0ZXJtaW5hdGVzLiBJZiB5b3VcbiAgICogd2FudCB0byBzdXBwcmVzcyBvdXRwdXQgbWFwcGluZyBvbiBicmVhaywgY2hlY2sgdGhlIGJyZWFrIHN0YXRlXG4gICAqIGluc2lkZSB5b3VyIGBvdXRwdXRNYXBwZXJgIGFuZCByZXR1cm4gYHt9YCBlYXJseS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHByb3BhZ2F0ZUJyZWFrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGVjbGFyZWQgdGFncyAoOS4yMS4xKSBmb3IgdGhlIE1PVU5UIGl0c2VsZiDigJQgdGhlIE5BTUVTIHRoZSBhdXRob3IgcHV0c1xuICAgKiBvbiB0aGlzIG1vdW50IGF0IGJ1aWxkIHRpbWUsIGxhbmRlZCBieSB0aGUgc2FtZSBgYXBwbHlUYWdzYCBldmVyeSBvdGhlclxuICAgKiBgb3B0aW9ucy50YWdzYCBzaXRlIHVzZXMsIHdpdGggdGhlIHNhbWUgcmVmdXNhbHMgKGVtcHR5LCBub24tc3RyaW5nLCB0aGVcbiAgICogcmVzZXJ2ZWQgYH5gIG1hcmtlciwgYSBkdXBsaWNhdGUsIGEgc2Vjb25kIGRlY2xhcmF0aW9uKS5cbiAgICpcbiAgICogQSBtb3VudCBpcyBhIHN0YWdlIHRoYXQgY29tbWl0czogaXRzIGZpcnN0IGJ1bmRsZSBpbiB0aGUgUEFSRU5UIGxvZyBpcyBhXG4gICAqIHN0b3AgaW4gYGNvbW1pdFN0b3BzYCwgc28gYHRhZ1N0b3BzYCBrZWVwcyBpdCBsaWtlIGFueSB0YWdnZWQgc3RhZ2UgYW5kXG4gICAqIGNhcnJpZXMgdGhlc2UgbmFtZXMgYXMgYFN0b3AubWV0YWAuIFN0YW1wZWQgb24gdGhhdCBmaXJzdCBidW5kbGUgb25seVxuICAgKiAodGhlIG1vdW50J3MgZXhpdCBidW5kbGUgY2FycmllcyBub25lIOKAlCB0aGUgb25jZS1wZXItZXhlY3V0aW9uIGxhdykuXG4gICAqIFRoZSBzdWJmbG93J3MgT1dOIGxvZyBpcyB1bnRvdWNoZWQ6IGl0cyBpbm5lciBzdGFnZXMgZGVjbGFyZSB0aGVpciBvd25cbiAgICogdGFncywgYW5kIGBkcmlsbChtb3VudClgIHJlYWRzIHRob3NlIG9mZiB0aGUgaW5uZXIgbG9nLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBPTkxZIHRhZyBzaXRlIGZvciBhIGZvcmstY2hpbGQgbW91bnQgKGBhZGRTdWJGbG93Q2hhcnRgKSBvclxuICAgKiBhIGJyYW5jaCBtb3VudCAoYGFkZFN1YkZsb3dDaGFydEJyYW5jaGApIOKAlCBhZnRlciB0aG9zZSB0aGUgY3Vyc29yIHN0aWxsXG4gICAqIHBvaW50cyBhdCB0aGUgcGFyZW50LCBzbyBgLnRhZygpYCByZWZ1c2VzIHJhdGhlciB0aGFuIG1pcy1hdHRyaWJ1dGUuIEFcbiAgICogbGluZWFyIG1vdW50IChgYWRkU3ViRmxvd0NoYXJ0TmV4dGApIG1vdmVzIHRoZSBjdXJzb3IsIHNvIGAudGFnKClgIHdvcmtzXG4gICAqIHRoZXJlIHRvbzsgZGVjbGFyZSBpbiBvbmUgcGxhY2UsIG5vdCBib3RoLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC5hZGRTZWxlY3RvckZ1bmN0aW9uKCdTbG90cycsIHBpY2tTbG90cywgJ3Nsb3RzJylcbiAgICogICAuYWRkU3ViRmxvd0NoYXJ0QnJhbmNoKCdtZW1vcnknLCBtZW1vcnlDaGFydCwgJ01lbW9yeScsIHsgdGFnczogWydzbG90Om1lbW9yeSddIH0pXG4gICAqICAgLmFkZFN1YkZsb3dDaGFydEJyYW5jaCgndG9vbHMnLCB0b29sc0NoYXJ0LCAnVG9vbHMnLCB7IHRhZ3M6IFsnc2xvdDp0b29scyddIH0pXG4gICAqIC5lbmQoKVxuICAgKiBgYGBcbiAgICovXG4gIHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdWJmbG93UmVzdWx0IHtcbiAgc3ViZmxvd0lkOiBzdHJpbmc7XG4gIHN1YmZsb3dOYW1lOiBzdHJpbmc7XG4gIHRyZWVDb250ZXh0OiB7XG4gICAgLyoqXG4gICAgICogVGhlIHN1YmZsb3cncyBmaW5hbCBzdGF0ZS4gVGhlIHRyYXZlcnNlcidzIHJlY29yZCBob2xkcyB0aGUgTElWRSBoZWFwXG4gICAgICog4oCUIHdoYXQgYSBwbGFpbiBgZ2V0U25hcHNob3QoKWAgYW5kIHRoZSBjaGVja3BvaW50IHNlZS4gVW5kZXJcbiAgICAgKiBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgIHRoZSBleGVjdXRvciBzZXJ2ZXMgdGhlIHN1YmZsb3cncyBvd25cbiAgICAgKiByZWRhY3RlZCBtaXJyb3IgaGVyZSBpbnN0ZWFkICg5LjIwLjA7IGBoYW5kbGVycy9zZXJ2ZWRTdWJmbG93UmVzdWx0c2ApLFxuICAgICAqIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCBgc3RhdGVBdGAgZm9sZHMgYGhpc3RvcnlgIHRvLlxuICAgICAqL1xuICAgIGdsb2JhbENvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHN0YWdlQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGhpc3Rvcnk6IHVua25vd25bXTtcbiAgICAvKiogVW5rbm93biB1bnRpbCBlYWNoIGNoaWxkIGludm9jYXRpb24gaGFzIGl0cyBvd24gc291cmNlIG93bmVyc2hpcCBwcm90b2NvbC4gKi9cbiAgICByZWFkb25seSByZWFkU291cmNlcz86IGltcG9ydCgnLi4vY2FwdHVyZS9yZWFkU291cmNlcy5qcycpLkVuZ2luZVJlYWRTb3VyY2VzO1xuICAgIC8qKiBJZGVudGl0eSBvZiB0aGUgbG9jYWwgaGlzdG9yeSwgbm90IGl0cyBwYXJlbnQncyBsb2cuICovXG4gICAgcmVhZG9ubHkgbG9nQWRkcmVzcz86IExvZ0FkZHJlc3M7XG4gICAgLyoqXG4gICAgICogVGhlIHN1YmZsb3cncyBPV04gZm9sZCBiYXNlIOKAlCB0aGUgc3RhdGUgaXRzIGlzb2xhdGVkIHJ1bnRpbWUgc3RhcnRlZFxuICAgICAqIGZyb20sIGJlZm9yZSBpdHMgZmlyc3QgY29tbWl0LiBUaGUgc2libGluZyBvZlxuICAgICAqIGBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlYCwgY2FycmllZCBoZXJlIHNvIGEgc3ViZmxvdydzIGBoaXN0b3J5YFxuICAgICAqIGNhbiBiZSBmb2xkZWQgb2ZmbGluZSBleGFjdGx5IGxpa2UgdGhlIHJ1bidzIGxvZyAoYHN0YXRlQXRgLFxuICAgICAqIGB0aW1lVHJhdmVsKC4uLikuZHJpbGwobW91bnQpYCkuIEZyb3plbiBhbmQgZGV0YWNoZWQuXG4gICAgICpcbiAgICAgKiBOb3JtYWxseSBge31gOiBhIHN1YmZsb3cncyBgaW5wdXRNYXBwZXJgIHNlZWQgaXMgaXRzZWxmIHRoZSBmaXJzdFxuICAgICAqIENPTU1JVCBpbiBgaGlzdG9yeWAgKHRoZSByb290IGNvbnRleHQgY29tbWl0cyBpdCksIG5vdCBhIHByZS1ydW4gYmFzZS5cbiAgICAgKi9cbiAgICBpbml0aWFsU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfTtcbiAgcGFyZW50U3RhZ2VJZDogc3RyaW5nO1xuICBwaXBlbGluZVN0cnVjdHVyZT86IHVua25vd247XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU3ViZmxvdyBUcmF2ZXJzZXIgRmFjdG9yeVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogU3ViZmxvd1RyYXZlcnNlckZhY3Rvcnkg4oCUIENyZWF0ZXMgYSBGbG93Y2hhcnRUcmF2ZXJzZXIgZm9yIHN1YmZsb3cgZXhlY3V0aW9uLlxuICpcbiAqIEluamVjdGVkIGludG8gU3ViZmxvd0V4ZWN1dG9yIHRvIGJyZWFrIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5OlxuICogRmxvd2NoYXJ0VHJhdmVyc2VyIOKGkiBTdWJmbG93RXhlY3V0b3Ig4oaSIEZsb3djaGFydFRyYXZlcnNlci5cbiAqXG4gKiBUaGUgZmFjdG9yeSBjYXB0dXJlcyBwYXJlbnQgdHJhdmVyc2VyIGNvbmZpZyAoc3RhZ2VNYXAsIHNjb3BlRmFjdG9yeSwgbmFycmF0aXZlLCBldGMuKVxuICogaW4gYSBjbG9zdXJlLiBTdWJmbG93RXhlY3V0b3IgY2FsbHMgaXQgd2l0aCBzdWJmbG93LXNwZWNpZmljIG92ZXJyaWRlcyAocm9vdCwgcnVudGltZSwgaW5wdXQpLlxuICogVGhlIHJldHVybmVkIHRyYXZlcnNlciB1c2VzIHRoZSBTQU1FIDctcGhhc2UgYWxnb3JpdGhtIGFzIHRoZSB0b3AtbGV2ZWwgdHJhdmVyc2VyLFxuICogc28gZGVjaWRlcnMsIHNlbGVjdG9ycywgbG9vcHMsIGxhenkgc3ViZmxvd3MsIGFuZCBhYm9ydCBzaWduYWxzIGFsbCB3b3JrIGluc2lkZSBzdWJmbG93cy5cbiAqL1xuZXhwb3J0IHR5cGUgU3ViZmxvd1RyYXZlcnNlckZhY3Rvcnk8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiA9IChvcHRpb25zOiB7XG4gIC8qKiBSb290IG5vZGUgb2YgdGhlIHN1YmZsb3cgKHdpdGggaXNTdWJmbG93Um9vdCBzdHJpcHBlZCkg4oCUIHRoZSBncmFwaCBldmVyeSBpZCBpbnNpZGUgdGhlIHN1YmZsb3cgcmVzb2x2ZXMgYWdhaW5zdC4gKi9cbiAgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgc3ViZmxvdydzIHRyYXZlcnNhbCBzdGFydHMgd2hlbiBub3QgYXQgYHJvb3RgIOKAlCBhIHJlc3VtZSdzXG4gICAqIG9uZS1zaG90IHJlLWVudHJ5IChgUmVzdW1lSG9wLmVudHJ5YCk6IHRoZSBuZXh0IG1vdW50IG9uIHRoZSBwYXVzZSBwYXRoLFxuICAgKiBvciB0aGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4sIGVhY2ggd2l0aCBpdHMgZGlzcGF0Y2hlcidzIGNvbnRpbnVhdGlvblxuICAgKiBhdHRhY2hlZC4gVmlzaXRlZCBvbmNlLCBmaXJzdDsgbmV2ZXIgcmVzb2x2YWJsZSBieSBpZC5cbiAgICovXG4gIGVudHJ5PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBQYXJhbGxlbCBzaWJsaW5ncycgcGF1c2VzIHdhaXRpbmcgaW4gdGhpcyBzdWJmbG93IChgUmVzdW1lSG9wLnBlbmRpbmdQYXVzZXNgLFxuICAgKiA5LjI4LjApIOKAlCByYWlzZWQgaW4gb3JkZXIgb25jZSBgZW50cnlgJ3MgY2hhaW4gZW5kcy5cbiAgICovXG4gIHBlbmRpbmdQYXVzZXM/OiByZWFkb25seSBRdWV1ZWRQYXVzZVtdO1xuICAvKiogSXNvbGF0ZWQgZXhlY3V0aW9uIHJ1bnRpbWUgZm9yIHRoZSBzdWJmbG93LiAqL1xuICBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgLyoqIE1hcHBlZCBpbnB1dCBmcm9tIHBhcmVudCBzY29wZSAoYmVjb21lcyByZWFkT25seUNvbnRleHQgZm9yIHN0YWdlcykuICovXG4gIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gIC8qKiBTdWJmbG93IGlkZW50aWZpZXIg4oCUIHVzZWQgYXMgYnJhbmNoUGF0aCBmb3IgbmFycmF0aXZlIGNvbnRleHQuICovXG4gIHN1YmZsb3dJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDE6IHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBzdWJmbG93IE1PVU5UIHN0YWdlIGluIHRoZSBwYXJlbnRcbiAgICogdHJhdmVyc2VyLiBCZWNvbWVzIHRoZSBgcGFyZW50UnVudGltZVN0YWdlSWRgIGZhbGxiYWNrIGZvciB0aGUgc3ViZmxvdydzXG4gICAqIHJvb3Qgc3RhZ2Ugc28gcnVudGltZSBhbmNlc3RvciBjaGFpbnMgY3Jvc3Mgc3ViZmxvdyBib3VuZGFyaWVzLlxuICAgKi9cbiAgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZD86IHN0cmluZztcbn0pID0+IFN1YmZsb3dUcmF2ZXJzZXJIYW5kbGU8VE91dCwgVFNjb3BlPjtcblxuLyoqXG4gKiBIYW5kbGUgcmV0dXJuZWQgYnkgU3ViZmxvd1RyYXZlcnNlckZhY3RvcnkuXG4gKiBQcm92aWRlcyBleGVjdXRlKCkgKyBhY2Nlc3MgdG8gbmVzdGVkIHN1YmZsb3cgcmVzdWx0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdWJmbG93VHJhdmVyc2VySGFuZGxlPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKiogRXhlY3V0ZSB0aGUgc3ViZmxvdydzIGdyYXBoIHVzaW5nIHRoZSBmdWxsIDctcGhhc2UgdHJhdmVyc2FsIGFsZ29yaXRobS4gKi9cbiAgZXhlY3V0ZSgpOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD47XG4gIC8qKiBDb2xsZWN0IG5lc3RlZCBzdWJmbG93IHJlc3VsdHMgKGZyb20gc3ViZmxvd3MgbW91bnRlZCBpbnNpZGUgdGhpcyBzdWJmbG93KS4gKi9cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD47XG4gIC8qKlxuICAgKiBGaW5hbCBicmVhayBzdGF0ZSBvZiB0aGUgc3ViZmxvdyBhZnRlciBgZXhlY3V0ZSgpYCByZXR1cm5zLlxuICAgKlxuICAgKiAgIC0gYHNob3VsZEJyZWFrOiB0cnVlYCAg4oaSIGEgc3RhZ2UgaW5zaWRlIHRoZSBzdWJmbG93IGNhbGxlZFxuICAgKiAgICAgYHNjb3BlLiRicmVhayhyZWFzb24pYCwgc3RvcHBpbmcgdGhlIHN1YmZsb3cncyBvd24gdHJhdmVyc2FsLlxuICAgKiAgIC0gYHJlYXNvbmAgICAgICAgICAgICAg4oaSIHRoZSBvcHRpb25hbCBzdHJpbmcgcGFzc2VkIHRvIGAkYnJlYWtgLlxuICAgKlxuICAgKiBVc2VkIGJ5IGBTdWJmbG93RXhlY3V0b3JgIHRvIGltcGxlbWVudCBgU3ViZmxvd01vdW50T3B0aW9ucy5wcm9wYWdhdGVCcmVha2A6XG4gICAqIGlmIHRoZSBtb3VudCBvcHRzIGluIEFORCB0aGUgc3ViZmxvdyBicm9rZSwgdGhlIHBhcmVudCdzIGJyZWFrIGZsYWcgaXNcbiAgICogZm9yd2FyZGVkLlxuICAgKi9cbiAgZ2V0QnJlYWtTdGF0ZSgpOiB7IHNob3VsZEJyZWFrOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeGVjdXRpb24gUnVudGltZSBJbnRlcmZhY2Vcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIElFeGVjdXRpb25SdW50aW1lIOKAlCBJbnRlcmZhY2UgZm9yIHRoZSBydW50aW1lIGVudmlyb25tZW50LlxuICpcbiAqIERlZmluZXMgdGhlIGNvbnRyYWN0IHRoYXQgZW5naW5lIGhhbmRsZXJzIG5lZWQgZnJvbSB0aGUgcnVubmVyIGxheWVyLFxuICogYXZvaWRpbmcgY2lyY3VsYXIgaW1wb3J0cyBiZXR3ZWVuIGVuZ2luZS8gYW5kIHJ1bm5lci8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4ZWN1dGlvblJ1bnRpbWUge1xuICBnbG9iYWxTdG9yZTogeyBnZXRTdGF0ZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9O1xuICAvKipcbiAgICogVGhlIHJlZGFjdGVkIG1pcnJvciBvZiBgZ2xvYmFsU3RvcmVgIOKAlCBwcmVzZW50IHdoZW4gdGhlIHJ1bidzIHBvbGljeVxuICAgKiBrZWVwcyBvbmUgKGBSdW5Qb2xpY3kubWlycm9yYDogYSBydW4gd2l0aCBhIHJlZGFjdGlvbiBwb2xpY3kpLCBlbHNlIGFic2VudC5cbiAgICogYFN1YmZsb3dFeGVjdXRvcmAgcmVhZHMgaXQgdG8gc2VydmUgYSBzdWJmbG93J3Mgc3RhdGUgKDkuMjAuMCkuXG4gICAqL1xuICByZWRhY3RlZFN0b3JlPzogU2hhcmVkTWVtb3J5O1xuICByb290U3RhZ2VDb250ZXh0OiBTdGFnZUNvbnRleHQ7XG4gIGV4ZWN1dGlvbkhpc3Rvcnk6IHsgbGlzdCgpOiB1bmtub3duW10gfTtcbiAgLyoqXG4gICAqIEEgZnJlc2ggcm9vdCBmcmFtZSBvbiB0aGlzIHJ1bnRpbWUg4oCUIGl0cyBzdG9yZSwgaXRzIGxvZywgdGhlIHJ1bidzIHBvbGljeVxuICAgKiBhbmQgbWlycm9yIChgRXhlY3V0aW9uUnVudGltZS5uZXdSb290YCkuIGBTdWJmbG93RXhlY3V0b3JgIHN3YXBzIGFcbiAgICogc3ViZmxvdydzIHNlZWQgZnJhbWUgZm9yIHRoZSBmcmFtZSBpdHMgZmlyc3Qgc3RhZ2UgcnVucyBvbiB3aXRoIGl0LlxuICAgKi9cbiAgbmV3Um9vdChuYW1lOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBTdGFnZUNvbnRleHQ7XG4gIGdldFNuYXBzaG90KG9wdGlvbnM/OiB7IHJlZGFjdD86IGJvb2xlYW4gfSk6IHtcbiAgICBzaGFyZWRTdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZXhlY3V0aW9uVHJlZTogdW5rbm93bjtcbiAgICAvKiogVGhlIGNvbW1pdCBsb2cncyBmb2xkIGJhc2Ug4oCUIHNlZSBgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZWAuICovXG4gICAgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29tbWl0TG9nOiB1bmtub3duW107XG4gICAgcmVhZG9ubHkgcmVhZFNvdXJjZXM/OiBpbXBvcnQoJy4uL2NhcHR1cmUvcmVhZFNvdXJjZXMuanMnKS5FbmdpbmVSZWFkU291cmNlcztcbiAgICByZWFkb25seSBsb2dBZGRyZXNzPzogTG9nQWRkcmVzcztcbiAgICAvKiogRHVhbC1rZXllZCBieSBzdWJmbG93IHBhdGggKGxhc3QgaXRlcmF0aW9uKSBBTkQgcGVyLWV4ZWN1dGlvbiBtb3VudCBydW50aW1lU3RhZ2VJZFxuICAgICAqICAoZWFjaCBpdGVyYXRpb24pIOKAlCBzZWUgUnVudGltZVNuYXBzaG90LnN1YmZsb3dSZXN1bHRzIC8gc3ViZmxvdy1jb21taXQtdmlzaWJpbGl0eS4gKi9cbiAgICBzdWJmbG93UmVzdWx0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHJlY29yZGVycz86IEFycmF5PHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBkYXRhOiB1bmtub3duIH0+O1xuICB9O1xuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICBnZXRQaXBlbGluZXMoKTogc3RyaW5nW107XG4gIC8qKlxuICAgKiBXaGVyZSBhIG1vdW50J3Mgb3duIGxvZyB3cml0ZXMgYXMgaXQgbGFuZHMgKDEwLjEsIFA2KSDigJQgdGhlIHJ1bidzIHNpbmsgYXQgdGhpcyBsb2cncyBhZGRyZXNzIHBsdXMgdGhlIG1vdW50J3NcbiAgICogYHJ1bnRpbWVTdGFnZUlkYC4gYHVuZGVmaW5lZGAgd2hlbiB0aGlzIHJ1bnRpbWUncyBsb2cgd3JpdGVzIHRvIG5vIHNpbmsuIGBTdWJmbG93RXhlY3V0b3JgIGhhbmRzIGl0IHRvIHRoZVxuICAgKiBuZXN0ZWQgcnVudGltZSBpdCBjb25zdHJ1Y3RzLlxuICAgKi9cbiAgcmVjb3JkRm9yPyhtb3VudFJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcsIG1ldGE/OiBNZXRhKTogdW5rbm93bjtcbiAgLyoqIFRlbGwgdGhlIHNpbmsgdGhpcyBydW50aW1lJ3MgbG9nIGVuZGVkICgxMC4xLCBQNikg4oCUIGEgbW91bnQncyBhdCBpdHMgZXhpdC4gTm8tb3Agd2l0aG91dCBhIHNpbmsuICovXG4gIGNsb3NlUmVjb3JkPyhvdXRjb21lOiBMb2dPdXRjb21lLCBtZXRhPzogTWV0YSk6IHZvaWQ7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRXhlY3V0aW9uIEVudmlyb25tZW50IOKAlCByZWFkLW9ubHksIHByb3BhZ2F0ZXMgdGhyb3VnaCBuZXN0ZWQgZXhlY3V0b3JzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBFeGVjdXRpb25FbnYg4oCUIGluZnJhc3RydWN0dXJlIHZhbHVlcyB0aGF0IHByb3BhZ2F0ZSB0aHJvdWdoIG5lc3RlZCBleGVjdXRvcnMuXG4gKlxuICogTGlrZSBgcHJvY2Vzcy5lbnZgIGZvciBmbG93Y2hhcnRzOiByZWFkLW9ubHksIGluaGVyaXRlZCBieSBjaGlsZCBleGVjdXRvcnMsXG4gKiBpbmZyYXN0cnVjdHVyZS1vbmx5IChub3QgYnVzaW5lc3MgbG9naWMpLlxuICpcbiAqIExpdG11cyB0ZXN0OiBDcmVhdGVkIGV4dGVybmFsIHRvIHRoZSBmbG93Y2hhcnQgKyBwYXNzZWQgaW4gZm9yIGV4ZWN1dGlvbiA9IGVudi5cbiAqIEJ1c2luZXNzIGNvbmZpZyBmb3IgYSBzcGVjaWZpYyBmbG93Y2hhcnQgPSBhcmdzIChnZXRBcmdzKCkpLlxuICpcbiAqIEludGVudGlvbmFsbHkgYSBjbG9zZWQgdHlwZSDigJQgbm90IGV4dGVuc2libGUgdG8gcHJldmVudCBjb3VwbGluZyBiZXR3ZWVuXG4gKiBwYXJlbnQgYW5kIGNoaWxkIGZsb3djaGFydHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uRW52IHtcbiAgLyoqXG4gICAqIEFib3J0U2lnbmFsIGZvciBjb29wZXJhdGl2ZSBjYW5jZWxsYXRpb24gYWNyb3NzIG5lc3RlZCBleGVjdXRvcnMuIEhvbm91cmVkIGJ5IHRoZSBlbmdpbmUgKDEwLjEpOiBpdCBlbmRzIHRoZVxuICAgKiBydW4gbGlrZSBgUnVuT3B0aW9ucy5zaWduYWxgLiBVbmRlciBhIHJ1biB0aGF0IGhhcyBhIHNpZ25hbCBvciBhIGRlYWRsaW5lIEFORCBhbiBlbnYsIGEgc3RhZ2UgcmVhZHMgdGhlIHJ1bidzXG4gICAqIE9ORSBlZmZlY3RpdmUgc2lnbmFsIGhlcmUg4oCUIGBSdW5PcHRpb25zLnNpZ25hbGAsIHRoaXMgb25lIGFuZCB0aGUgZGVhZGxpbmUncyB0aW1lciwgY29tcG9zZWQuXG4gICAqL1xuICByZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgLyoqIFRpbWVvdXQgYnVkZ2V0IGluIG1pbGxpc2Vjb25kcy4gUmVhZGFibGUgb25seSDigJQgdGhlIHJ1bidzIGRlYWRsaW5lIGlzIHtAbGluayBkZWFkbGluZX0uICovXG4gIHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRyYWNlIGlkZW50aWZpZXIgZm9yIGRpc3RyaWJ1dGVkIHRyYWNpbmcgLyBvYnNlcnZhYmlsaXR5LiBXaXRoIGBvcGVyYXRpb25JZGAgKG9yIGFsb25lKSBpdCBiZWNvbWVzIHRoZSBydW4nc1xuICAgKiBgUnVuQ29ycmVsYXRpb25gOyBpdCB3aW5zIG92ZXIgdGhlIHRyYWNlIGlkIG9mIGB0cmFjZXBhcmVudGAuIDHigJMyNTYgcHJpbnRhYmxlIEFTQ0lJIGNoYXJhY3RlcnMgd2l0aCBubyBzcGFjZVxuICAgKiAoc2luY2UgMTAuMSBhbnl0aGluZyBlbHNlIHJlamVjdHMgdGhlIHJ1biB3aXRoIGEgYFR5cGVFcnJvcmAgbmFtaW5nIHRoZSBmaWVsZCDigJQgdGhlIGlkIHJpZGVzIGV2ZXJ5IGV2ZW50KTtcbiAgICogYW4gZW1wdHkgc3RyaW5nIGlzIG5vIGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhY2VJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBjYWxsZXIncyB1bml0IG9mIHdvcmsgKFczQydzIHBhcmVudC1pZCkg4oCUIHBhcnQgb2YgdGhlIHJ1bidzIGBSdW5Db3JyZWxhdGlvbmA7IHdpbnMgb3ZlciB0aGUgaGVhZGVyJ3NcbiAgICogcGFyZW50LWlkLiBOZWVkcyBhIHRyYWNlOiBgdHJhY2VJZGAgb3IgYHRyYWNlcGFyZW50YCAocmVmdXNlZCBhbG9uZSkuIFNhbWUgY2hhcmFjdGVyIHJ1bGUgYXMgYHRyYWNlSWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBIFczQyBgdHJhY2VwYXJlbnRgIGhlYWRlciwgdXN1YWxseSBzdHJhaWdodCBmcm9tIGFuIGluYm91bmQgcmVxdWVzdC4gUGFyc2VkIFNUUklDVExZIG9uY2UgcGVyIHJ1biDigJQgYVxuICAgKiBtYWxmb3JtZWQgb25lIHJlZnVzZXMgdGhlIHJ1biB3aXRoIGEgYFRyYWNlcGFyZW50RXJyb3JgIG5hbWluZyB0aGUgcmVhc29uIChuZXZlciB0aGUgaGVhZGVyKS4gU3RhZ2VzIHJlYWRcbiAgICogYmFjayAoYCRnZXRFbnYoKWApIGV4YWN0bHkgYFJ1bkNvcnJlbGF0aW9uLnRyYWNlcGFyZW50YCDigJQgdGhlIGNhbm9uaWNhbCBoZWFkZXIgb2YgdGhlIGVmZmVjdGl2ZSBpZHMg4oCUIG9yIG5vXG4gICAqIGtleSB3aGVuIHRoZSBydW4ncyBjb3JyZWxhdGlvbiBjYXJyaWVzIG5vbmUuIENvcnJlbGF0aW9uIG9ubHk6IG5ldmVyIGlkZW50aXR5IG9yIGF1dGhvcmlzYXRpb24uXG4gICAqL1xuICByZWFkb25seSB0cmFjZXBhcmVudD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBydW4ncyBkZWFkbGluZSwgZXBvY2ggbWlsbGlzZWNvbmRzICgxMC4xKSDigJQgdGhlIGVhcmxpZXN0IG9mIGBSdW5PcHRpb25zLmRlYWRsaW5lYCwgYG5vdyArIFJ1bk9wdGlvbnMudGltZW91dE1zYFxuICAgKiBhbmQgYSBkZWFkbGluZSBnaXZlbiBoZXJlLiBUaGUgcnVuJ3Mgc2lnbmFsIGFib3J0cyB3aGVuIGl0IHBhc3NlczsgZXZlcnkgYXR0ZW1wdCBpcyBjYXBwZWQgYnkgdGhlIHRpbWUgbGVmdC5cbiAgICogSW5oZXJpdGVkIGJ5IHN1YmZsb3dzLiBSZWFkIGl0IHRocm91Z2ggYHNjb3BlLiRhdHRlbXB0KCkudGltZUxlZnRNcygpYC5cbiAgICovXG4gIHJlYWRvbmx5IGRlYWRsaW5lPzogbnVtYmVyO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEhhbmRsZXIgRGVwZW5kZW5jaWVzIChESSBiYWcpIOKAlCB3YXMgUGlwZWxpbmVDb250ZXh0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBIYW5kbGVyRGVwcyDigJQgRGVwZW5kZW5jeSBpbmplY3Rpb24gYmFnIHBhc3NlZCB0byBhbGwgaGFuZGxlciBtb2R1bGVzLlxuICpcbiAqIFByb3ZpZGVzIHNoYXJlZCBzdGF0ZSAoc3RhZ2VNYXAsIHJ1bnRpbWUsIHNjb3BlRmFjdG9yeSwgZXRjLikgd2l0aG91dFxuICogaGFuZGxlcnMgbmVlZGluZyB0byBpbXBvcnQgdGhlIHRyYXZlcnNlciBkaXJlY3RseS4gQXZvaWRzIGNpcmN1bGFyIGRlcHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZGxlckRlcHM8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+O1xuICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgZXhlY3V0aW9uUnVudGltZTogSUV4ZWN1dGlvblJ1bnRpbWU7XG4gIHNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT47XG4gIHN1YmZsb3dzPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgc2NvcGVQcm90ZWN0aW9uTW9kZTogU2NvcGVQcm90ZWN0aW9uTW9kZTtcbiAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcHJvcGFnYXRlcyB0byBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LiAqL1xuICBleGVjdXRpb25FbnY/OiBFeGVjdXRpb25FbnY7XG4gIG5hcnJhdGl2ZUdlbmVyYXRvcjogSUNvbnRyb2xGbG93TmFycmF0aXZlO1xuICBsb2dnZXI6IElMb2dnZXI7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKipcbiAgICogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IChNMikg4oCUIHNoYXJlZCBieSByZWZlcmVuY2Ugd2l0aCBldmVyeVxuICAgKiBuZXN0ZWQgdHJhdmVyc2VyLCBsaWtlIHRoZSBleGVjdXRpb24gY291bnRlci4gYFN1YmZsb3dFeGVjdXRvcmAgYXNrcyBpdFxuICAgKiBhdCBlYWNoIHN1YmZsb3cgZW50cnk6IHRoZSBGSVJTVCBlbnRyeSBpbnRvIGEgc3ViZmxvdyBvbiB0aGUgcGF1c2UgcGF0aFxuICAgKiB0YWtlcyB0aGF0IHN1YmZsb3cncyBjYXB0dXJlZCBzdGF0ZSAoc2VlZGluZyB0aGUgbmVzdGVkIHJ1bnRpbWUgaW4gcGxhY2VcbiAgICogb2YgdGhlIGlucHV0TWFwcGVyJ3MgdmFsdWVzIOKAlCB0aGUgbWFwcGVyIHN0aWxsIHJ1bnMgZm9yIHRoZSByZWFkLW9ubHlcbiAgICogYXJncyksIGl0cyBlbnRyeSBwb2ludCBhbmQgYW55IHNpYmxpbmcgcGF1c2VzIHdhaXRpbmcgdGhlcmU7IGV2ZXJ5IGxhdGVyXG4gICAqIGVudHJ5IGlzIGFuIG9yZGluYXJ5IG9uZS4gU2VlIGBSZXN1bWVFbnRyeWAuIFVuZGVmaW5lZCBvbiBub3JtYWwgYHJ1bigpYFxuICAgKiBwYXRocy5cbiAgICovXG4gIHJlc3VtZT86IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT47XG59XG5cbi8qKiBPcHRpb25zIGZvciBGbG93Q2hhcnRFeGVjdXRvci5ydW4oKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuT3B0aW9ucyB7XG4gIC8qKiBBYm9ydFNpZ25hbCBmb3IgY29vcGVyYXRpdmUgY2FuY2VsbGF0aW9uLiBDb21wb3NlZCB3aXRoIGBlbnYuc2lnbmFsYCBhbmQgdGhlIGRlYWRsaW5lICgxMC4xKS4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kczogdGhlIHJ1bidzIGRlYWRsaW5lIGlzIGBub3cgKyB0aW1lb3V0TXNgLiBUaGUgcnVuIGFib3J0cyB3aGVuIGl0IHBhc3NlcyAocmVqZWN0aW5nIHdpdGhcbiAgICogYEV4ZWN1dGlvbiB0aW1lZCBvdXQgYWZ0ZXIgPHRpbWVvdXRNcz5tc2ApLCBzdGFnZXMgcmVhZCBpdCBhcyBgZW52LmRlYWRsaW5lYCwgYW5kIGV2ZXJ5IHN0YWdlIHJlY29yZHMgaXRzXG4gICAqIGF0dGVtcHQgKGBTdGFnZVNuYXBzaG90LmF0dGVtcHRzYCkuIEhvbm91cmVkIGJlc2lkZSBhIGBzaWduYWxgIHNpbmNlIDEwLjEgKGl0IHVzZWQgdG8gYmUgaWdub3JlZCB0aGVyZSkuXG4gICAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgZGVhZGxpbmUsIGVwb2NoIG1pbGxpc2Vjb25kcyAoMTAuMSkg4oCUIGBEYXRlLm5vdygpICsgMTIwXzAwMGAuIFNhbWUgZWZmZWN0IGFzIGB0aW1lb3V0TXNgOyB3aGVuIGJvdGhcbiAgICogYXJlIGdpdmVuLCB0aGUgZWFybGllciB3aW5zLiBBIGRlYWRsaW5lIGFscmVhZHkgcGFzdCBzdG9wcyB0aGUgcnVuIGJlZm9yZSBpdHMgZmlyc3Qgc3RhZ2UuIEEgcmVzdW1lZCBsZWcgaGFzXG4gICAqIGl0cyBvd246IHBhc3MgaXQgYWdhaW4gdG8gYHJlc3VtZSgpYC5cbiAgICovXG4gIGRlYWRsaW5lPzogbnVtYmVyO1xuICAvKipcbiAgICogUnVudGltZSBpbnB1dCBkYXRhIGZvciB0aGUgcGlwZWxpbmUuXG4gICAqIEJlY29tZXMgdGhlIHJlYWRPbmx5Q29udGV4dCBhY2Nlc3NpYmxlIHZpYSBgc2NvcGUuZ2V0QXJncygpYC5cbiAgICogU3RhZ2VzIGNhbm5vdCBvdmVyd3JpdGUgdGhlc2Uga2V5cyB3aXRoIGBzZXRWYWx1ZSgpYC5cbiAgICovXG4gIGlucHV0PzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcmVhZC1vbmx5IGluZnJhc3RydWN0dXJlIHZhbHVlcyB0aGF0IHByb3BhZ2F0ZVxuICAgKiB0aHJvdWdoIG5lc3RlZCBleGVjdXRvcnMgKGxpa2UgYHByb2Nlc3MuZW52YCBmb3IgZmxvd2NoYXJ0cykuXG4gICAqIEFjY2Vzc2libGUgdmlhIGBzY29wZS5nZXRFbnYoKWAuIEluaGVyaXRlZCBieSBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgZW52PzogRXhlY3V0aW9uRW52O1xuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIG1heGltdW0gbmVzdGVkIGBleGVjdXRlTm9kZWAgZGVwdGggZm9yIHRoaXMgcnVuLlxuICAgKiBEZWZhdWx0cyB0byBgRmxvd2NoYXJ0VHJhdmVyc2VyLk1BWF9FWEVDVVRFX0RFUFRIYCAoNTAwKS5cbiAgICpcbiAgICogRGVwdGggY291bnRzIFRSRUUgbmVzdGluZyBvbmx5IOKAlCBmb3JrIGNoaWxkcmVuLCBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaFxuICAgKiBkaXNwYXRjaCwgcmVjdXJzaXZlIGNvbXBvc2l0aW9uLiBMaW5lYXIgY2hhaW5zIGFuZCBsb29wIGl0ZXJhdGlvbnMgcnVuXG4gICAqIG9uIGEgZmxhdCB0cmFtcG9saW5lIGFuZCBuZXZlciBjb25zdW1lIGRlcHRoLCBzbyB0aGlzIHJhcmVseSBuZWVkc1xuICAgKiByYWlzaW5nLiBNdXN0IGJlID49IDEuXG4gICAqL1xuICBtYXhEZXB0aD86IG51bWJlcjtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBtYXhpbXVtIGxvb3AgaXRlcmF0aW9ucyBwZXIgbm9kZSBmb3IgdGhpcyBydW4gKHRoZVxuICAgKiBgQ29udGludWF0aW9uUmVzb2x2ZXJgIGluZmluaXRlLWxvb3AgZ3VhcmQpLiBEZWZhdWx0cyB0byAxMDAwLlxuICAgKiBUaGlzIGlzIHRoZSBiaW5kaW5nIGNvbnN0cmFpbnQgZm9yIGxvb3AtaGVhdnkgcGlwZWxpbmVzIOKAlCByYWlzZSBpdCBmb3JcbiAgICogbGVnaXRpbWF0ZWx5IGxvbmcgbG9vcHMgKGBsb29wVG9gIGNoYWlucyBydW4gd2l0aCBhIGZsYXQgc3RhY2ssIHNvIGhpZ2hcbiAgICogdmFsdWVzIGFyZSBzYWZlOyBtZW1vcnkgZm9yIHN0YXRlL25hcnJhdGl2ZSBzdGlsbCBncm93cyBwZXIgaXRlcmF0aW9uKS5cbiAgICogQWxzbyBib3VuZHMgdGhlIHJ1bi10b3RhbCBjaGFpbiBvZiBmdW5jdGlvbi1iZWFyaW5nIGR5bmFtaWMgYG5leHRgXG4gICAqIGNvbnRpbnVhdGlvbnMgKGZyZXNoIG5vZGVzIHJldHVybmVkIGZyb20gc3RhZ2VzKSDigJQgYSBydW5hd2F5IGR5bmFtaWNcbiAgICogY2hhaW4gZXJyb3JzIGluc3RlYWQgb2YgcnVubmluZyBmb3JldmVyLlxuICAgKiBQcm9wYWdhdGVzIHRvIHN1YmZsb3dzLiBNdXN0IGJlID49IDEuXG4gICAqL1xuICBtYXhJdGVyYXRpb25zPzogbnVtYmVyO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZsb3cgQ29udHJvbCBOYXJyYXRpdmUg4oCUIGNhbm9uaWNhbCBkZWZpbml0aW9ucyBsaXZlIGluIG1lbW9yeS90eXBlcy50c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCB0eXBlIHsgRmxvd0NvbnRyb2xUeXBlLCBGbG93TWVzc2FnZSB9O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJ1bnRpbWUgU3RydWN0dXJlIE1ldGFkYXRhICh1c2VkIGJ5IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVN0cnVjdHVyZU1ldGFkYXRhIHtcbiAgdHlwZTogJ3N0YWdlJyB8ICdkZWNpZGVyJyB8ICdzZWxlY3RvcicgfCAnZm9yaycgfCAnc3RyZWFtaW5nJyB8ICdzdWJmbG93JyB8ICdsb29wJztcbiAgc3ViZmxvd0lkPzogc3RyaW5nO1xuICBpc1N1YmZsb3dSb290PzogYm9vbGVhbjtcbiAgc3ViZmxvd05hbWU/OiBzdHJpbmc7XG4gIC8qKiBUcnVlIGZvciBhbiBgYWRkUGFyYWxsZWxGb3JFYWNoYCBmYW4tb3V0ICh0eXBlIHN0YXlzIGAnZm9yaydgKS4gKi9cbiAgaXNEeW5hbWljUGFyYWxsZWw/OiBib29sZWFuO1xuICBpc1BhcmFsbGVsQ2hpbGQ/OiBib29sZWFuO1xuICBwYXJhbGxlbEdyb3VwSWQ/OiBzdHJpbmc7XG4gIGxvb3BUYXJnZXQ/OiBzdHJpbmc7XG4gIGlzRHluYW1pYz86IGJvb2xlYW47XG4gIGlzTG9vcFJlZmVyZW5jZT86IGJvb2xlYW47XG4gIHN0cmVhbUlkPzogc3RyaW5nO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE5vZGUgUmVzdWx0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IHR5cGUgTm9kZVJlc3VsdFR5cGUgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIHJlc3VsdDogdW5rbm93bjtcbiAgaXNFcnJvcj86IGJvb2xlYW47XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV4ZWN1dGlvbiBSZXNwb25zZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCB0eXBlIEJyYW5jaFJlc3VsdCA9IHtcbiAgcmVzdWx0OiBzdHJpbmcgfCBFcnJvcjtcbiAgaXNFcnJvcjogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIEJyYW5jaFJlc3VsdHMgPSB7IFticmFuY2hJZDogc3RyaW5nXTogQnJhbmNoUmVzdWx0IH07XG5leHBvcnQgdHlwZSBUcmF2ZXJzYWxSZXN1bHQgPSBCcmFuY2hSZXN1bHRzIHwgc3RyaW5nIHwgRXJyb3I7XG5cbi8qKiBSZXR1cm5lZCBieSBydW4oKS9yZXN1bWUoKSB3aGVuIGV4ZWN1dGlvbiBwYXVzZXMuICovXG5leHBvcnQgdHlwZSBQYXVzZWRSZXN1bHQgPSB7XG4gIHJlYWRvbmx5IHBhdXNlZDogdHJ1ZTtcbiAgcmVhZG9ubHkgY2hlY2twb2ludDogaW1wb3J0KCcuLi9wYXVzZS90eXBlcy5qcycpLkZsb3djaGFydENoZWNrcG9pbnQ7XG59O1xuXG4vKiogRnVsbCByZXR1cm4gdHlwZSBvZiBGbG93Q2hhcnRFeGVjdXRvci5ydW4oKSBhbmQgcmVzdW1lKCkuICovXG5leHBvcnQgdHlwZSBFeGVjdXRvclJlc3VsdCA9IFRyYXZlcnNhbFJlc3VsdCB8IFBhdXNlZFJlc3VsdDtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZXJpYWxpemVkIFBpcGVsaW5lIFN0cnVjdHVyZSAoZm9yIHZpc3VhbGl6YXRpb24pXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemVkUGlwZWxpbmVOb2RlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBpZDogc3RyaW5nO1xuICB0eXBlPzpcbiAgICB8ICdzdGFnZSdcbiAgICB8ICdkZWNpZGVyJ1xuICAgIHwgJ3NlbGVjdG9yJ1xuICAgIHwgJ2ZvcmsnXG4gICAgfCAnc3RyZWFtaW5nJ1xuICAgIHwgJ3N1YmZsb3cnXG4gICAgfCAnbG9vcCdcbiAgICB8ICd1c2VyJ1xuICAgIHwgJ3Rvb2wnXG4gICAgfCAnZnVuY3Rpb24nXG4gICAgfCAnc2VxdWVuY2UnO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgY2hpbGRyZW4/OiBTZXJpYWxpemVkUGlwZWxpbmVOb2RlW107XG4gIG5leHQ/OiBTZXJpYWxpemVkUGlwZWxpbmVOb2RlO1xuICBicmFuY2hlcz86IFJlY29yZDxzdHJpbmcsIFNlcmlhbGl6ZWRQaXBlbGluZU5vZGU+O1xuICBoYXNEZWNpZGVyPzogYm9vbGVhbjtcbiAgaGFzU2VsZWN0b3I/OiBib29sZWFuO1xuICBoYXNTdWJ0cmVlPzogYm9vbGVhbjtcbiAgaXNTdHJlYW1pbmc/OiBib29sZWFuO1xuICBzdHJlYW1JZD86IHN0cmluZztcbiAgaXNTdWJmbG93Um9vdD86IGJvb2xlYW47XG4gIHN1YmZsb3dJZD86IHN0cmluZztcbiAgc3ViZmxvd05hbWU/OiBzdHJpbmc7XG4gIGxvb3BUYXJnZXQ/OiBzdHJpbmc7XG4gIGlzTG9vcFJlZmVyZW5jZT86IGJvb2xlYW47XG4gIGlzUGFyYWxsZWxDaGlsZD86IGJvb2xlYW47XG4gIHBhcmFsbGVsR3JvdXBJZD86IHN0cmluZztcbiAgaXNEeW5hbWljPzogYm9vbGVhbjtcbiAgLyoqIFdoZW4gdHJ1ZSwgdGhpcyBzdGFnZSBjYW4gcGF1c2UgZXhlY3V0aW9uIChQYXVzYWJsZUhhbmRsZXIgcGF0dGVybikuICovXG4gIGlzUGF1c2FibGU/OiBib29sZWFuO1xuICAvKipcbiAgICogVHJ1ZSBmb3IgYW4gYGFkZFBhcmFsbGVsRm9yRWFjaGAgZmFuLW91dCDigJQgYnJhbmNoIENPVU5UIGRlY2lkZWQgYXQgcnVudGltZVxuICAgKiBmcm9tIHRoZSBwYXlsb2FkLiBBIGZsYWcsIG5vdCBhIHR5cGU6IGB0eXBlYCBzdGF5cyBgJ2ZvcmsnYCBzbyBldmVyeVxuICAgKiBleGlzdGluZyBjb25zdW1lciByZW5kZXJzIGl0IGNvcnJlY3RseSAoaXQgSVMgYSBmYW4tb3V0KSwgYW5kIGEgY29uc3VtZXJcbiAgICogdGhhdCB3YW50cyB0byBzYXkgXCJvbmUgYnJhbmNoIHBlciBpdGVtXCIgY2FuIHJlYWQgdGhpcy5cbiAgICovXG4gIGlzRHluYW1pY1BhcmFsbGVsPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRvdGFsIGF0dGVtcHRzIHRoaXMgc3RhZ2UncyBmdW5jdGlvbiBtYXkgcnVuLCBmcm9tIGl0cyBkZWNsYXJlZFxuICAgKiB7QGxpbmsgUmV0cnlQb2xpY3l9LiBQcmVzZW50IG9ubHkgd2hlbiBhIHBvbGljeSB3YXMgZGVjbGFyZWQuIFRoZSBDT1VOVFxuICAgKiBvbmx5IOKAlCBgYmFja29mZk1zYCBhbmQgYHJldHJ5T25gIGNhbiBiZSBmdW5jdGlvbnMsIHdoaWNoIGEgSlNPTi1zYWZlIHNwZWNcbiAgICogY2Fubm90IGNhcnJ5LlxuICAgKi9cbiAgcmV0cnlBdHRlbXB0cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIERlY2xhcmVkIHRhZ3MgKDkuMjEuMCkg4oCUIHRoZSBuYW1lcyB0aGUgYXV0aG9yIHB1dCBvbiB0aGlzIHN0YWdlIGF0IGJ1aWxkXG4gICAqIHRpbWUsIGNvcGllZCBhcy1pcy4gRnJlZSBzdHJpbmdzOyBmb290cHJpbnRqcyBhc3NpZ25zIHRoZW0gbm8gbWVhbmluZy5cbiAgICogQWJzZW50IHdoZW4gdGhlIHN0YWdlIGRlY2xhcmVzIG5vbmUuXG4gICAqL1xuICB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRmxvd0NoYXJ0IGlzIGRlZmluZWQgaW4gYC4uL2J1aWxkZXIvdHlwZXMudHNgLiBUaGUgZW5naW5lIGxheWVyIGNvbnN1bWVzIGl0XG4vLyB2aWEgaW1wb3J0IGZyb20gdGhlcmUuIEEgZHVwbGljYXRlIG1pbmltYWwgZGVmaW5pdGlvbiBwcmV2aW91c2x5IGxpdmVkIGhlcmVcbi8vIGFuZCBjYXVzZWQgVFMgY29uZnVzaW9uIGF0IGNvbXBvc2l0aW9uIGJvdW5kYXJpZXMgKENvbXBvc2FibGVSdW5uZXIgdnNcbi8vIGFkZFN1YkZsb3dDaGFydCBwYXJhbWV0ZXIpLiBTaW5nbGUgc291cmNlIG9mIHRydXRoIG5vdyBsaXZlcyBpbiBidWlsZGVyLy5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogQWxpYXMgZm9yIFNlcmlhbGl6ZWRQaXBlbGluZU5vZGUgdXNlZCBhcyBmdWxsIHN0cnVjdHVyZSAqL1xuZXhwb3J0IHR5cGUgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0gU2VyaWFsaXplZFBpcGVsaW5lTm9kZSAmIHtcbiAgYnJhbmNoSWRzPzogc3RyaW5nW107XG4gIHN1YmZsb3dTdHJ1Y3R1cmU/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU7XG4gIGl0ZXJhdGlvbkNvdW50PzogbnVtYmVyO1xufTtcbiJdfQ==
@@ -14,6 +14,8 @@
14
14
  import type { CommitPhase, EmitSourcePosition, UntrackedSource } from 'foottrace';
15
15
  import type { EventLog, SharedMemory } from 'foottrace/write';
16
16
  import type { AttemptContext, AttemptRecord, AttemptSummary, LateWrite } from '../attempt/types.js';
17
+ import type { NativeCapture } from '../capture/nativeCoverage.js';
18
+ import type { EngineReadSourceCapture } from '../capture/readSources.js';
17
19
  import type { StructuredErrorInfo } from '../errors/errorInfo.js';
18
20
  import { type TerminalFailureContext, NativeFailureState } from '../errors/terminalFailure.js';
19
21
  import { type DiagnosticChannel, DiagnosticCollector } from './DiagnosticCollector.js';
@@ -57,6 +59,11 @@ export declare class StageContext {
57
59
  private policy;
58
60
  /** The emitting frame's logical leg, never the mutable executor's current leg. */
59
61
  private emitRunId?;
62
+ /** The native root-log collector; copied to same-log frames, never child runtimes. */
63
+ capture?: NativeCapture;
64
+ /** Source coverage, shared only by frames of this runtime. */
65
+ readSources?: EngineReadSourceCapture;
66
+ private sourceAttempt?;
60
67
  stageName: string;
61
68
  /** Unique stage identifier from the builder (matches spec node id). */
62
69
  stageId: string;
@@ -342,6 +349,7 @@ export declare class StageContext {
342
349
  * `'summary'` records a cheap marker, `'off'` records nothing.
343
350
  */
344
351
  getValue(path: string[], key?: string, description?: string): unknown;
352
+ private readRetainedValue;
345
353
  /**
346
354
  * How many tracked reads of this frame read a value the run's rule selects
347
355
  * (a key it masks whole, or one with secret fields). A boundary that maps
@@ -350,6 +358,10 @@ export declare class StageContext {
350
358
  * (`memory/redaction.ts · MapperTaint`). Always 0 without a policy or a mark.
351
359
  */
352
360
  get selectedReads(): number;
361
+ private noteAndJudgeRead;
362
+ private judgeRead;
363
+ private readWithNativeSource;
364
+ private noteSourceRead;
353
365
  /** Read state without tracking in _stageReads or paying structuredClone cost.
354
366
  * Used by ScopeFacade.getValueSilent() for array proxy internal operations. */
355
367
  getValueDirect(path: string[], key?: string): unknown;
@@ -455,6 +467,7 @@ export declare class StageContext {
455
467
  * reads them post-run for the execution-tree snapshot.
456
468
  */
457
469
  commit(phase?: CommitPhase): void;
470
+ private commitRetained;
458
471
  /** Whether this frame has committed — a call's record arriving after it is late (P2, `ScopeFacade · call`). */
459
472
  get committed(): boolean;
460
473
  /**