footprintjs 4.7.0 → 4.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/CLAUDE.md +38 -14
  2. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +97 -90
  3. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  4. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +8 -6
  5. package/dist/esm/lib/memory/StageContext.js +2 -1
  6. package/dist/esm/lib/memory/types.js +1 -1
  7. package/dist/esm/lib/recorder/KeyedRecorder.js +56 -7
  8. package/dist/esm/lib/recorder/SequenceRecorder.js +194 -0
  9. package/dist/esm/lib/recorder/index.js +2 -1
  10. package/dist/esm/lib/scope/recorders/MetricRecorder.js +85 -82
  11. package/dist/esm/lib/scope/recorders/index.js +1 -1
  12. package/dist/esm/trace.js +10 -5
  13. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +97 -90
  14. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  15. package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -6
  16. package/dist/lib/memory/StageContext.js +2 -1
  17. package/dist/lib/memory/types.js +1 -1
  18. package/dist/lib/recorder/KeyedRecorder.js +56 -7
  19. package/dist/lib/recorder/SequenceRecorder.js +198 -0
  20. package/dist/lib/recorder/index.js +4 -2
  21. package/dist/lib/scope/recorders/MetricRecorder.js +85 -82
  22. package/dist/lib/scope/recorders/index.js +1 -1
  23. package/dist/trace.js +12 -6
  24. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +8 -18
  25. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +7 -0
  26. package/dist/types/lib/memory/types.d.ts +2 -0
  27. package/dist/types/lib/recorder/KeyedRecorder.d.ts +29 -6
  28. package/dist/types/lib/recorder/SequenceRecorder.d.ts +112 -0
  29. package/dist/types/lib/recorder/index.d.ts +1 -0
  30. package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +47 -40
  31. package/dist/types/lib/scope/recorders/index.d.ts +1 -1
  32. package/dist/types/trace.d.ts +7 -3
  33. package/package.json +1 -1
@@ -6,4 +6,4 @@
6
6
  * Use CombinedNarrativeRecorder (auto-attached by setEnableNarrative()) instead.
7
7
  */
8
8
  export {};
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFycmF0aXZlVHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9uYXJyYXRpdmUvbmFycmF0aXZlVHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBuYXJyYXRpdmVUeXBlcyDigJQgU2hhcmVkIHR5cGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBuYXJyYXRpdmUgcmVjb3JkZXIgc3lzdGVtLlxuICpcbiAqIFByZXZpb3VzbHk6IENvbWJpbmVkTmFycmF0aXZlQnVpbGRlci50cyAoZmlsZSByZW5hbWVkIGluIHBvc3QtcmVsZWFzZSBjbGVhbnVwKS5cbiAqIFRoZSBDb21iaW5lZE5hcnJhdGl2ZUJ1aWxkZXIgY2xhc3Mgd2FzIHJlbW92ZWQgaW4gdjEuMC5cbiAqIFVzZSBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIChhdXRvLWF0dGFjaGVkIGJ5IHNldEVuYWJsZU5hcnJhdGl2ZSgpKSBpbnN0ZWFkLlxuICovXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVHlwZXMgKGtlcHQg4oCUIHVzZWQgYnkgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciwgRmxvd0NoYXJ0RXhlY3V0b3IsIGV0Yy4pXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5IHtcbiAgdHlwZTpcbiAgICB8ICdzdGFnZSdcbiAgICB8ICdzdGVwJ1xuICAgIHwgJ2NvbmRpdGlvbidcbiAgICB8ICdmb3JrJ1xuICAgIHwgJ3NlbGVjdG9yJ1xuICAgIHwgJ3N1YmZsb3cnXG4gICAgfCAnbG9vcCdcbiAgICB8ICdicmVhaydcbiAgICB8ICdlcnJvcidcbiAgICB8ICdwYXVzZSdcbiAgICB8ICdyZXN1bWUnO1xuICB0ZXh0OiBzdHJpbmc7XG4gIGRlcHRoOiBudW1iZXI7XG4gIHN0YWdlTmFtZT86IHN0cmluZztcbiAgLyoqIFN0YWJsZSBzdGFnZSBpZGVudGlmaWVyIGZyb20gdGhlIGJ1aWxkZXIgKG1hdGNoZXMgc3BlYyBub2RlIGlkKS4gVXNlIGZvciBVSSBzeW5jLiAqL1xuICBzdGFnZUlkPzogc3RyaW5nO1xuICBzdGVwTnVtYmVyPzogbnVtYmVyO1xuICAvKiogU3ViZmxvdyBJRCB3aGVuIHRoaXMgZW50cnkgd2FzIGdlbmVyYXRlZCBpbnNpZGUgYSBzdWJmbG93LiBVbmRlZmluZWQgZm9yIHJvb3QtbGV2ZWwuICovXG4gIHN1YmZsb3dJZD86IHN0cmluZztcbiAgLyoqIFNjb3BlIGtleSB0aGF0IHdhcyByZWFkIG9yIHdyaXR0ZW4uIE9ubHkgcHJlc2VudCBvbiAnc3RlcCcgZW50cmllcy5cbiAgICogIFVzZSB0aGlzIGZvciBzdHJ1Y3R1cmVkIGRhdGEgZXh0cmFjdGlvbiAoZS5nLiwgZ3JvdW5kaW5nIGFuYWx5c2lzKVxuICAgKiAgaW5zdGVhZCBvZiBtYXRjaGluZyBvbiByZW5kZXJlZCB0ZXh0IHN0cmluZ3MuICovXG4gIGtleT86IHN0cmluZztcbiAgLyoqIFJhdyB2YWx1ZSBmcm9tIHRoZSBzY29wZSBldmVudCDigJQgYXZhaWxhYmxlIGZvciBwcm9ncmFtbWF0aWMgYWNjZXNzIGFuZCBjdXN0b20gZm9ybWF0dGluZy5cbiAgICogIE9ubHkgcHJlc2VudCBvbiAnc3RlcCcgZW50cmllcyAocmVhZC93cml0ZSBvcHMpLiBUaGlzIGlzIGEgbGl2ZSByZWZlcmVuY2UsIG5vdCBhIGNsb25lLlxuICAgKiAgV2hlbiB1c2luZyBTY29wZUZhY2FkZSwgcmVkYWN0ZWQga2V5cyB3aWxsIGhhdmUgdmFsdWUgJ1tSRURBQ1RFRF0nIChzYW5pdGl6ZWQgdXBzdHJlYW1cbiAgICogIGJ5IFNjb3BlRmFjYWRlIGJlZm9yZSBkaXNwYXRjaGluZyBldmVudHMg4oCUIHRoZSByZWNvcmRlciBkb2VzIG5vdCBlbmZvcmNlIHJlZGFjdGlvbikuICovXG4gIHJhd1ZhbHVlPzogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21iaW5lZE5hcnJhdGl2ZU9wdGlvbnMge1xuICBpbmNsdWRlU3RlcE51bWJlcnM/OiBib29sZWFuO1xuICBpbmNsdWRlVmFsdWVzPzogYm9vbGVhbjtcbiAgaW5kZW50Pzogc3RyaW5nO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE5hcnJhdGl2ZVJlbmRlcmVyIOKAlCBQbHVnZ2FibGUgcmVuZGVyaW5nIGZvciBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIENvbnRleHQgcGFzc2VkIHRvIHJlbmRlclN0YWdlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFnZVJlbmRlckNvbnRleHQge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgc3RhZ2VOdW1iZXI6IG51bWJlcjtcbiAgaXNGaXJzdDogYm9vbGVhbjtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbi8qKiBDb250ZXh0IHBhc3NlZCB0byByZW5kZXJPcC4gUmV0dXJuIG51bGwgdG8gZXhjbHVkZSB0aGUgZW50cnkuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wUmVuZGVyQ29udGV4dCB7XG4gIHR5cGU6ICdyZWFkJyB8ICd3cml0ZSc7XG4gIGtleTogc3RyaW5nO1xuICByYXdWYWx1ZTogdW5rbm93bjtcbiAgdmFsdWVTdW1tYXJ5OiBzdHJpbmc7XG4gIG9wZXJhdGlvbj86ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJztcbiAgc3RlcE51bWJlcjogbnVtYmVyO1xufVxuXG4vKiogQ29udGV4dCBwYXNzZWQgdG8gcmVuZGVyRGVjaXNpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIERlY2lzaW9uUmVuZGVyQ29udGV4dCB7XG4gIGRlY2lkZXI6IHN0cmluZztcbiAgY2hvc2VuOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICByYXRpb25hbGU/OiBzdHJpbmc7XG4gIC8qKiBSYXcgZXZpZGVuY2UgZnJvbSBkZWNpZGUoKS9zZWxlY3QoKSDigJQgYXZhaWxhYmxlIGZvciBjdXN0b20gcmVuZGVyaW5nLiAqL1xuICBldmlkZW5jZT86IHVua25vd247XG59XG5cbi8qKiBDb250ZXh0IHBhc3NlZCB0byByZW5kZXJGb3JrLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3JrUmVuZGVyQ29udGV4dCB7XG4gIGNoaWxkcmVuOiBzdHJpbmdbXTtcbn1cblxuLyoqIENvbnRleHQgcGFzc2VkIHRvIHJlbmRlclN1YmZsb3cuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1YmZsb3dSZW5kZXJDb250ZXh0IHtcbiAgbmFtZTogc3RyaW5nO1xuICBkaXJlY3Rpb246ICdlbnRyeScgfCAnZXhpdCc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG4vKiogQ29udGV4dCBwYXNzZWQgdG8gcmVuZGVyTG9vcC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9vcFJlbmRlckNvbnRleHQge1xuICB0YXJnZXQ6IHN0cmluZztcbiAgaXRlcmF0aW9uOiBudW1iZXI7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG4vKiogQ29udGV4dCBwYXNzZWQgdG8gcmVuZGVyQnJlYWsuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyZWFrUmVuZGVyQ29udGV4dCB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xufVxuXG4vKiogQ29udGV4dCBwYXNzZWQgdG8gcmVuZGVyU2VsZWN0ZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdGVkUmVuZGVyQ29udGV4dCB7XG4gIHNlbGVjdGVkOiBzdHJpbmdbXTtcbiAgdG90YWw6IG51bWJlcjtcbiAgLyoqIFJhdyBldmlkZW5jZSBmcm9tIHNlbGVjdCgpIOKAlCBhdmFpbGFibGUgZm9yIGN1c3RvbSByZW5kZXJpbmcuICovXG4gIGV2aWRlbmNlPzogdW5rbm93bjtcbn1cblxuLyoqIENvbnRleHQgcGFzc2VkIHRvIHJlbmRlckVycm9yLiAqL1xuZXhwb3J0IGludGVyZmFjZSBFcnJvclJlbmRlckNvbnRleHQge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICB2YWxpZGF0aW9uSXNzdWVzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBsdWdnYWJsZSByZW5kZXJlciBmb3IgY3VzdG9taXppbmcgbmFycmF0aXZlIG91dHB1dC5cbiAqXG4gKiBFYWNoIG1ldGhvZCBpcyBvcHRpb25hbCDigJQgdW5pbXBsZW1lbnRlZCBtZXRob2RzIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdFxuICogRW5nbGlzaCByZW5kZXJlci4gUmV0dXJuIG51bGwgZnJvbSByZW5kZXJPcCB0byBleGNsdWRlIGFuIGVudHJ5IGVudGlyZWx5LlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlYyA9IG5hcnJhdGl2ZSh7XG4gKiAgIHJlbmRlcmVyOiB7XG4gKiAgICAgcmVuZGVyT3AoY3R4KSB7XG4gKiAgICAgICBpZiAoY3R4LmtleS5zdGFydHNXaXRoKCdfaW50ZXJuYWwnKSkgcmV0dXJuIG51bGw7IC8vIGZpbHRlciBvdXQgaW50ZXJuYWwga2V5c1xuICogICAgICAgcmV0dXJuIGAke2N0eC50eXBlID09PSAncmVhZCcgPyAnUmVhZCcgOiAnV3JvdGUnfSAke2N0eC5rZXl9OiAke2N0eC52YWx1ZVN1bW1hcnl9YDtcbiAqICAgICB9LFxuICogICB9LFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOYXJyYXRpdmVSZW5kZXJlciB7XG4gIHJlbmRlclN0YWdlPyhjdHg6IFN0YWdlUmVuZGVyQ29udGV4dCk6IHN0cmluZztcbiAgLyoqIFJldHVybiBudWxsIHRvIGV4Y2x1ZGUgdGhlIG9wIGZyb20gdGhlIG5hcnJhdGl2ZS4gKi9cbiAgcmVuZGVyT3A/KGN0eDogT3BSZW5kZXJDb250ZXh0KTogc3RyaW5nIHwgbnVsbDtcbiAgcmVuZGVyRGVjaXNpb24/KGN0eDogRGVjaXNpb25SZW5kZXJDb250ZXh0KTogc3RyaW5nO1xuICByZW5kZXJGb3JrPyhjdHg6IEZvcmtSZW5kZXJDb250ZXh0KTogc3RyaW5nO1xuICByZW5kZXJTZWxlY3RlZD8oY3R4OiBTZWxlY3RlZFJlbmRlckNvbnRleHQpOiBzdHJpbmc7XG4gIHJlbmRlclN1YmZsb3c/KGN0eDogU3ViZmxvd1JlbmRlckNvbnRleHQpOiBzdHJpbmc7XG4gIHJlbmRlckxvb3A/KGN0eDogTG9vcFJlbmRlckNvbnRleHQpOiBzdHJpbmc7XG4gIHJlbmRlckJyZWFrPyhjdHg6IEJyZWFrUmVuZGVyQ29udGV4dCk6IHN0cmluZztcbiAgcmVuZGVyRXJyb3I/KGN0eDogRXJyb3JSZW5kZXJDb250ZXh0KTogc3RyaW5nO1xufVxuIl19
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFycmF0aXZlVHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9uYXJyYXRpdmUvbmFycmF0aXZlVHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBuYXJyYXRpdmVUeXBlcyDigJQgU2hhcmVkIHR5cGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBuYXJyYXRpdmUgcmVjb3JkZXIgc3lzdGVtLlxuICpcbiAqIFByZXZpb3VzbHk6IENvbWJpbmVkTmFycmF0aXZlQnVpbGRlci50cyAoZmlsZSByZW5hbWVkIGluIHBvc3QtcmVsZWFzZSBjbGVhbnVwKS5cbiAqIFRoZSBDb21iaW5lZE5hcnJhdGl2ZUJ1aWxkZXIgY2xhc3Mgd2FzIHJlbW92ZWQgaW4gdjEuMC5cbiAqIFVzZSBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIChhdXRvLWF0dGFjaGVkIGJ5IHNldEVuYWJsZU5hcnJhdGl2ZSgpKSBpbnN0ZWFkLlxuICovXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVHlwZXMgKGtlcHQg4oCUIHVzZWQgYnkgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciwgRmxvd0NoYXJ0RXhlY3V0b3IsIGV0Yy4pXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5IHtcbiAgdHlwZTpcbiAgICB8ICdzdGFnZSdcbiAgICB8ICdzdGVwJ1xuICAgIHwgJ2NvbmRpdGlvbidcbiAgICB8ICdmb3JrJ1xuICAgIHwgJ3NlbGVjdG9yJ1xuICAgIHwgJ3N1YmZsb3cnXG4gICAgfCAnbG9vcCdcbiAgICB8ICdicmVhaydcbiAgICB8ICdlcnJvcidcbiAgICB8ICdwYXVzZSdcbiAgICB8ICdyZXN1bWUnO1xuICB0ZXh0OiBzdHJpbmc7XG4gIGRlcHRoOiBudW1iZXI7XG4gIHN0YWdlTmFtZT86IHN0cmluZztcbiAgLyoqIFN0YWJsZSBzdGFnZSBpZGVudGlmaWVyIGZyb20gdGhlIGJ1aWxkZXIgKG1hdGNoZXMgc3BlYyBub2RlIGlkKS4gVXNlIGZvciBVSSBzeW5jLiAqL1xuICBzdGFnZUlkPzogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBGb3JtYXQ6IFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNleGVjdXRpb25JbmRleC5cbiAgICogIExpbmtzIG5hcnJhdGl2ZSBlbnRyaWVzIHRvIHJlY29yZGVyIE1hcCBlbnRyaWVzIGZvciBPKDEpIHRpbWUtdHJhdmVsIGxvb2t1cC5cbiAgICogIFVuZGVmaW5lZCBvbmx5IHdoZW4gVHJhdmVyc2FsQ29udGV4dCBpcyBhYnNlbnQgZnJvbSB0aGUgc291cmNlIGV2ZW50LiAqL1xuICBydW50aW1lU3RhZ2VJZD86IHN0cmluZztcbiAgc3RlcE51bWJlcj86IG51bWJlcjtcbiAgLyoqIFN1YmZsb3cgSUQgd2hlbiB0aGlzIGVudHJ5IHdhcyBnZW5lcmF0ZWQgaW5zaWRlIGEgc3ViZmxvdy4gVW5kZWZpbmVkIGZvciByb290LWxldmVsLiAqL1xuICBzdWJmbG93SWQ/OiBzdHJpbmc7XG4gIC8qKiBEaXJlY3Rpb24gZm9yIHN1YmZsb3cgZW50cmllczogJ2VudHJ5JyB3aGVuIGVudGVyaW5nLCAnZXhpdCcgd2hlbiBsZWF2aW5nLlxuICAgKiAgT25seSBwcmVzZW50IG9uIGVudHJpZXMgd2l0aCB0eXBlID09PSAnc3ViZmxvdycuIFVzZSB0aGlzIGluc3RlYWQgb2YgdGV4dCBzY2FubmluZy4gKi9cbiAgZGlyZWN0aW9uPzogJ2VudHJ5JyB8ICdleGl0JztcbiAgLyoqIFNjb3BlIGtleSB0aGF0IHdhcyByZWFkIG9yIHdyaXR0ZW4uIE9ubHkgcHJlc2VudCBvbiAnc3RlcCcgZW50cmllcy5cbiAgICogIFVzZSB0aGlzIGZvciBzdHJ1Y3R1cmVkIGRhdGEgZXh0cmFjdGlvbiAoZS5nLiwgZ3JvdW5kaW5nIGFuYWx5c2lzKVxuICAgKiAgaW5zdGVhZCBvZiBtYXRjaGluZyBvbiByZW5kZXJlZCB0ZXh0IHN0cmluZ3MuICovXG4gIGtleT86IHN0cmluZztcbiAgLyoqIFJhdyB2YWx1ZSBmcm9tIHRoZSBzY29wZSBldmVudCDigJQgYXZhaWxhYmxlIGZvciBwcm9ncmFtbWF0aWMgYWNjZXNzIGFuZCBjdXN0b20gZm9ybWF0dGluZy5cbiAgICogIE9ubHkgcHJlc2VudCBvbiAnc3RlcCcgZW50cmllcyAocmVhZC93cml0ZSBvcHMpLiBUaGlzIGlzIGEgbGl2ZSByZWZlcmVuY2UsIG5vdCBhIGNsb25lLlxuICAgKiAgV2hlbiB1c2luZyBTY29wZUZhY2FkZSwgcmVkYWN0ZWQga2V5cyB3aWxsIGhhdmUgdmFsdWUgJ1tSRURBQ1RFRF0nIChzYW5pdGl6ZWQgdXBzdHJlYW1cbiAgICogIGJ5IFNjb3BlRmFjYWRlIGJlZm9yZSBkaXNwYXRjaGluZyBldmVudHMg4oCUIHRoZSByZWNvcmRlciBkb2VzIG5vdCBlbmZvcmNlIHJlZGFjdGlvbikuICovXG4gIHJhd1ZhbHVlPzogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21iaW5lZE5hcnJhdGl2ZU9wdGlvbnMge1xuICBpbmNsdWRlU3RlcE51bWJlcnM/OiBib29sZWFuO1xuICBpbmNsdWRlVmFsdWVzPzogYm9vbGVhbjtcbiAgaW5kZW50Pzogc3RyaW5nO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE5hcnJhdGl2ZVJlbmRlcmVyIOKAlCBQbHVnZ2FibGUgcmVuZGVyaW5nIGZvciBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIENvbnRleHQgcGFzc2VkIHRvIHJlbmRlclN0YWdlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFnZVJlbmRlckNvbnRleHQge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgc3RhZ2VOdW1iZXI6IG51bWJlcjtcbiAgaXNGaXJzdDogYm9vbGVhbjtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbi8qKiBDb250ZXh0IHBhc3NlZCB0byByZW5kZXJPcC4gUmV0dXJuIG51bGwgdG8gZXhjbHVkZSB0aGUgZW50cnkuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wUmVuZGVyQ29udGV4dCB7XG4gIHR5cGU6ICdyZWFkJyB8ICd3cml0ZSc7XG4gIGtleTogc3RyaW5nO1xuICByYXdWYWx1ZTogdW5rbm93bjtcbiAgdmFsdWVTdW1tYXJ5OiBzdHJpbmc7XG4gIG9wZXJhdGlvbj86ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJztcbiAgc3RlcE51bWJlcjogbnVtYmVyO1xufVxuXG4vKiogQ29udGV4dCBwYXNzZWQgdG8gcmVuZGVyRGVjaXNpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIERlY2lzaW9uUmVuZGVyQ29udGV4dCB7XG4gIGRlY2lkZXI6IHN0cmluZztcbiAgY2hvc2VuOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICByYXRpb25hbGU/OiBzdHJpbmc7XG4gIC8qKiBSYXcgZXZpZGVuY2UgZnJvbSBkZWNpZGUoKS9zZWxlY3QoKSDigJQgYXZhaWxhYmxlIGZvciBjdXN0b20gcmVuZGVyaW5nLiAqL1xuICBldmlkZW5jZT86IHVua25vd247XG59XG5cbi8qKiBDb250ZXh0IHBhc3NlZCB0byByZW5kZXJGb3JrLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3JrUmVuZGVyQ29udGV4dCB7XG4gIGNoaWxkcmVuOiBzdHJpbmdbXTtcbn1cblxuLyoqIENvbnRleHQgcGFzc2VkIHRvIHJlbmRlclN1YmZsb3cuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1YmZsb3dSZW5kZXJDb250ZXh0IHtcbiAgbmFtZTogc3RyaW5nO1xuICBkaXJlY3Rpb246ICdlbnRyeScgfCAnZXhpdCc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG4vKiogQ29udGV4dCBwYXNzZWQgdG8gcmVuZGVyTG9vcC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9vcFJlbmRlckNvbnRleHQge1xuICB0YXJnZXQ6IHN0cmluZztcbiAgaXRlcmF0aW9uOiBudW1iZXI7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG4vKiogQ29udGV4dCBwYXNzZWQgdG8gcmVuZGVyQnJlYWsuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyZWFrUmVuZGVyQ29udGV4dCB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xufVxuXG4vKiogQ29udGV4dCBwYXNzZWQgdG8gcmVuZGVyU2VsZWN0ZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdGVkUmVuZGVyQ29udGV4dCB7XG4gIHNlbGVjdGVkOiBzdHJpbmdbXTtcbiAgdG90YWw6IG51bWJlcjtcbiAgLyoqIFJhdyBldmlkZW5jZSBmcm9tIHNlbGVjdCgpIOKAlCBhdmFpbGFibGUgZm9yIGN1c3RvbSByZW5kZXJpbmcuICovXG4gIGV2aWRlbmNlPzogdW5rbm93bjtcbn1cblxuLyoqIENvbnRleHQgcGFzc2VkIHRvIHJlbmRlckVycm9yLiAqL1xuZXhwb3J0IGludGVyZmFjZSBFcnJvclJlbmRlckNvbnRleHQge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICB2YWxpZGF0aW9uSXNzdWVzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBsdWdnYWJsZSByZW5kZXJlciBmb3IgY3VzdG9taXppbmcgbmFycmF0aXZlIG91dHB1dC5cbiAqXG4gKiBFYWNoIG1ldGhvZCBpcyBvcHRpb25hbCDigJQgdW5pbXBsZW1lbnRlZCBtZXRob2RzIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdFxuICogRW5nbGlzaCByZW5kZXJlci4gUmV0dXJuIG51bGwgZnJvbSByZW5kZXJPcCB0byBleGNsdWRlIGFuIGVudHJ5IGVudGlyZWx5LlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlYyA9IG5hcnJhdGl2ZSh7XG4gKiAgIHJlbmRlcmVyOiB7XG4gKiAgICAgcmVuZGVyT3AoY3R4KSB7XG4gKiAgICAgICBpZiAoY3R4LmtleS5zdGFydHNXaXRoKCdfaW50ZXJuYWwnKSkgcmV0dXJuIG51bGw7IC8vIGZpbHRlciBvdXQgaW50ZXJuYWwga2V5c1xuICogICAgICAgcmV0dXJuIGAke2N0eC50eXBlID09PSAncmVhZCcgPyAnUmVhZCcgOiAnV3JvdGUnfSAke2N0eC5rZXl9OiAke2N0eC52YWx1ZVN1bW1hcnl9YDtcbiAqICAgICB9LFxuICogICB9LFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOYXJyYXRpdmVSZW5kZXJlciB7XG4gIHJlbmRlclN0YWdlPyhjdHg6IFN0YWdlUmVuZGVyQ29udGV4dCk6IHN0cmluZztcbiAgLyoqIFJldHVybiBudWxsIHRvIGV4Y2x1ZGUgdGhlIG9wIGZyb20gdGhlIG5hcnJhdGl2ZS4gKi9cbiAgcmVuZGVyT3A/KGN0eDogT3BSZW5kZXJDb250ZXh0KTogc3RyaW5nIHwgbnVsbDtcbiAgcmVuZGVyRGVjaXNpb24/KGN0eDogRGVjaXNpb25SZW5kZXJDb250ZXh0KTogc3RyaW5nO1xuICByZW5kZXJGb3JrPyhjdHg6IEZvcmtSZW5kZXJDb250ZXh0KTogc3RyaW5nO1xuICByZW5kZXJTZWxlY3RlZD8oY3R4OiBTZWxlY3RlZFJlbmRlckNvbnRleHQpOiBzdHJpbmc7XG4gIHJlbmRlclN1YmZsb3c/KGN0eDogU3ViZmxvd1JlbmRlckNvbnRleHQpOiBzdHJpbmc7XG4gIHJlbmRlckxvb3A/KGN0eDogTG9vcFJlbmRlckNvbnRleHQpOiBzdHJpbmc7XG4gIHJlbmRlckJyZWFrPyhjdHg6IEJyZWFrUmVuZGVyQ29udGV4dCk6IHN0cmluZztcbiAgcmVuZGVyRXJyb3I/KGN0eDogRXJyb3JSZW5kZXJDb250ZXh0KTogc3RyaW5nO1xufVxuIl19
@@ -242,11 +242,8 @@ export class FlowchartTraverser {
242
242
  return this.stageMap.get(node.name);
243
243
  }
244
244
  async executeStage(node, stageFunc, context, breakFn) {
245
- // Assign runtimeStageId BEFORE scope creation monotonic counter ensures uniqueness.
246
- // node.id already includes subflow prefix (e.g., 'sf-inner/inner-a') from the builder,
247
- // so we don't add parentSubflowId separately.
248
- const idx = this._executionCounter.value++;
249
- context.runtimeStageId = buildRuntimeStageId(node.id, idx);
245
+ // runtimeStageId is assigned in executeNode() before traversalContext creation,
246
+ // ensuring scope events and flow events use the same value.
250
247
  return this.stageRunner.run(node, stageFunc, context, breakFn);
251
248
  }
252
249
  /**
@@ -275,6 +272,11 @@ export class FlowchartTraverser {
275
272
  context.description = node.description;
276
273
  if (node.isSubflowRoot && node.subflowId)
277
274
  context.subflowId = node.subflowId;
275
+ // Assign runtimeStageId BEFORE traversalContext creation — ensures scope events
276
+ // (buffered by runtimeStageId) and flow events (flushed by traversalContext.runtimeStageId)
277
+ // use the same value. Must happen before executeStage AND before traversalContext.
278
+ const idx = this._executionCounter.value++;
279
+ context.runtimeStageId = buildRuntimeStageId(node.id, idx);
278
280
  // Build traversal context for recorder events — created once per stage, shared by all events
279
281
  const traversalContext = {
280
282
  stageId: (_a = node.id) !== null && _a !== void 0 ? _a : context.stageId,
@@ -695,4 +697,4 @@ export class FlowchartTraverser {
695
697
  * execution. `FlowChartExecutor.run()` always creates a fresh traverser per call.
696
698
  */
697
699
  FlowchartTraverser.MAX_EXECUTE_DEPTH = 500;
698
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd2NoYXJ0VHJhdmVyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUdILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUV0RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQTBEM0QsTUFBTSxPQUFPLGtCQUFrQjtJQXVFN0IsWUFBWSxJQUFvQzs7UUFqRGhELGtC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QUFNLFdBQVcsR0FBRyxDQUFBLE1BQUEsVUFBVSxDQUFDLElBQUksMENBQUUsV0FBVyxNQUFJLE1BQUEsVUFBVSxDQUFDLElBQUksMENBQUUsSUFBSSxDQUFBLElBQUksU0FBUyxDQUFDO1lBQ3ZGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FDekMsU0FBUyxFQUNULFdBQVcsRUFDWCxNQUFBLFVBQVUsQ0FBQyxJQUFJLDBDQUFFLFdBQVcsRUFDNUIsVUFBVSxDQUFDLGtCQUFrQixDQUM5QixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7O0FBeDFCRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDYSxvQ0FBaUIsR0FBRyxHQUFHLEFBQU4sQ0FBTyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxvd2NoYXJ0VHJhdmVyc2VyIOKAlCBQcmUtb3JkZXIgREZTIHRyYXZlcnNhbCBvZiBTdGFnZU5vZGUgZ3JhcGguXG4gKlxuICogVW5pZmllZCB0cmF2ZXJzYWwgYWxnb3JpdGhtIGZvciBhbGwgbm9kZSBzaGFwZXM6XG4gKiAgIGNvbnN0IHByZSA9IGF3YWl0IHByZXAoKTtcbiAqICAgY29uc3QgW3gsIHldID0gYXdhaXQgUHJvbWlzZS5hbGwoW2Z4KHByZSksIGZ5KHByZSldKTtcbiAqICAgcmV0dXJuIGF3YWl0IG5leHQoeCwgeSk7XG4gKlxuICogRm9yIGVhY2ggbm9kZSwgZXhlY3V0ZU5vZGUgZm9sbG93cyA3IHBoYXNlczpcbiAqICAgMC4gQ0xBU1NJRlkgIOKAlCBzdWJmbG93IGRldGVjdGlvbiwgZWFybHkgZGVsZWdhdGlvblxuICogICAxLiBWQUxJREFURSAg4oCUIG5vZGUgaW52YXJpYW50cywgcm9sZSBtYXJrZXJzXG4gKiAgIDIuIEVYRUNVVEUgICDigJQgcnVuIHN0YWdlIGZuLCBjb21taXQsIGJyZWFrIGNoZWNrXG4gKiAgIDMuIERZTkFNSUMgICDigJQgU3RhZ2VOb2RlIHJldHVybiBkZXRlY3Rpb24sIHN1YmZsb3cgYXV0by1yZWdpc3RyYXRpb24sIHN0cnVjdHVyZSB1cGRhdGVzXG4gKiAgIDQuIENISUxEUkVOICDigJQgZm9yay9zZWxlY3Rvci9kZWNpZGVyIGRpc3BhdGNoXG4gKiAgIDUuIENPTlRJTlVFICDigJQgZHluYW1pYyBuZXh0IC8gbGluZWFyIG5leHQgcmVzb2x1dGlvblxuICogICA2LiBMRUFGICAgICAg4oCUIG5vIGNvbnRpbnVhdGlvbiwgcmV0dXJuIG91dHB1dFxuICpcbiAqIEJyZWFrIHNlbWFudGljczogSWYgYSBzdGFnZSBjYWxscyBicmVha0ZuKCksIGNvbW1pdCBhbmQgU1RPUC5cbiAqIFBhdGNoIG1vZGVsOiBTdGFnZSB3cml0ZXMgaW50byBsb2NhbCBwYXRjaDsgY29tbWl0UGF0Y2goKSBhZnRlciByZXR1cm4gb3IgdGhyb3cuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi8uLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjb3BlUHJvdGVjdGlvbk1vZGUgfSBmcm9tICcuLi8uLi9zY29wZS9wcm90ZWN0aW9uL3R5cGVzLmpzJztcbmltcG9ydCB7IGlzU3RhZ2VOb2RlUmV0dXJuIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB7IENoaWxkcmVuRXhlY3V0b3IgfSBmcm9tICcuLi9oYW5kbGVycy9DaGlsZHJlbkV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IENvbnRpbnVhdGlvblJlc29sdmVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvQ29udGludWF0aW9uUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgRGVjaWRlckhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9EZWNpZGVySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBFeHRyYWN0b3JSdW5uZXIgfSBmcm9tICcuLi9oYW5kbGVycy9FeHRyYWN0b3JSdW5uZXIuanMnO1xuaW1wb3J0IHsgTm9kZVJlc29sdmVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvTm9kZVJlc29sdmVyLmpzJztcbmltcG9ydCB7IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyIH0gZnJvbSAnLi4vaGFuZGxlcnMvUnVudGltZVN0cnVjdHVyZU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VsZWN0b3JIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvU2VsZWN0b3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IFN0YWdlUnVubmVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvU3RhZ2VSdW5uZXIuanMnO1xuaW1wb3J0IHsgU3ViZmxvd0V4ZWN1dG9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLmpzJztcbmltcG9ydCB7IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvRmxvd1JlY29yZGVyRGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvTmFycmF0aXZlRmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB7IE51bGxDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvciB9IGZyb20gJy4uL25hcnJhdGl2ZS9OdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIsIElDb250cm9sRmxvd05hcnJhdGl2ZSwgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBidWlsZFJ1bnRpbWVTdGFnZUlkIH0gZnJvbSAnLi4vcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHR5cGUge1xuICBFeHRyYWN0b3JFcnJvcixcbiAgSGFuZGxlckRlcHMsXG4gIElFeGVjdXRpb25SdW50aW1lLFxuICBJTG9nZ2VyLFxuICBOb2RlUmVzdWx0VHlwZSxcbiAgU2NvcGVGYWN0b3J5LFxuICBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIFN0YWdlRnVuY3Rpb24sXG4gIFN0YWdlTm9kZSxcbiAgU3RyZWFtSGFuZGxlcnMsXG4gIFN1YmZsb3dSZXN1bHQsXG4gIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5LFxuICBUcmF2ZXJzYWxFeHRyYWN0b3IsXG4gIFRyYXZlcnNhbFJlc3VsdCxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYXZlcnNlck9wdGlvbnM8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICBzdGFnZU1hcDogTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+PjtcbiAgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcbiAgZXhlY3V0aW9uUnVudGltZTogSUV4ZWN1dGlvblJ1bnRpbWU7XG4gIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gIC8qKiBFeGVjdXRpb24gZW52aXJvbm1lbnQg4oCUIHByb3BhZ2F0ZXMgdG8gc3ViZmxvd3MgYXV0b21hdGljYWxseS4gKi9cbiAgZXhlY3V0aW9uRW52PzogaW1wb3J0KCcuLi8uLi9lbmdpbmUvdHlwZXMnKS5FeGVjdXRpb25FbnY7XG4gIHRocm90dGxpbmdFcnJvckNoZWNrZXI/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHN0cmVhbUhhbmRsZXJzPzogU3RyZWFtSGFuZGxlcnM7XG4gIGV4dHJhY3Rvcj86IFRyYXZlcnNhbEV4dHJhY3RvcjtcbiAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG4gIHN1YmZsb3dzPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgZW5yaWNoU25hcHNob3RzPzogYm9vbGVhbjtcbiAgbmFycmF0aXZlRW5hYmxlZD86IGJvb2xlYW47XG4gIGJ1aWxkVGltZVN0cnVjdHVyZT86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgbG9nZ2VyOiBJTG9nZ2VyO1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgLyoqIFByZS1jb25maWd1cmVkIEZsb3dSZWNvcmRlcnMgdG8gYXR0YWNoIHdoZW4gbmFycmF0aXZlIGlzIGVuYWJsZWQuICovXG4gIGZsb3dSZWNvcmRlcnM/OiBGbG93UmVjb3JkZXJbXTtcbiAgLyoqXG4gICAqIFByZS1jb25maWd1cmVkIG5hcnJhdGl2ZSBnZW5lcmF0b3IuIElmIHByb3ZpZGVkLCB0YWtlcyBwcmVjZWRlbmNlIG92ZXJcbiAgICogZmxvd1JlY29yZGVycyBhbmQgbmFycmF0aXZlRW5hYmxlZC4gVXNlZCBieSB0aGUgc3ViZmxvdyB0cmF2ZXJzZXIgZmFjdG9yeVxuICAgKiB0byBzaGFyZSB0aGUgcGFyZW50J3MgbmFycmF0aXZlIGdlbmVyYXRvciB3aXRoIHN1YmZsb3cgdHJhdmVyc2Vycy5cbiAgICovXG4gIG5hcnJhdGl2ZUdlbmVyYXRvcj86IElDb250cm9sRmxvd05hcnJhdGl2ZTtcbiAgLyoqXG4gICAqIE1heGltdW0gcmVjdXJzaXZlIGV4ZWN1dGVOb2RlIGRlcHRoLiBEZWZhdWx0cyB0byBGbG93Y2hhcnRUcmF2ZXJzZXIuTUFYX0VYRUNVVEVfREVQVEggKDUwMCkuXG4gICAqIE92ZXJyaWRlIGluIHRlc3RzIG9yIHVudXN1YWxseSBkZWVwIHBpcGVsaW5lcy5cbiAgICovXG4gIG1heERlcHRoPzogbnVtYmVyO1xuICAvKipcbiAgICogV2hlbiB0aGlzIHRyYXZlcnNlciBydW5zIGluc2lkZSBhIHN1YmZsb3csIHNldCB0aGlzIHRvIHRoZSBzdWJmbG93J3MgSUQuXG4gICAqIFByb3BhZ2F0ZWQgdG8gVHJhdmVyc2FsQ29udGV4dCBzbyBuYXJyYXRpdmUgZW50cmllcyBjYXJyeSB0aGUgY29ycmVjdCBzdWJmbG93SWQuXG4gICAqL1xuICBwYXJlbnRTdWJmbG93SWQ/OiBzdHJpbmc7XG4gIC8qKiBTaGFyZWQgZXhlY3V0aW9uIGNvdW50ZXIgZnJvbSBwYXJlbnQgdHJhdmVyc2VyLiBTdWJmbG93cyBjb250aW51ZSB0aGUgcGFyZW50J3MgbnVtYmVyaW5nLiAqL1xuICBleGVjdXRpb25Db3VudGVyPzogeyB2YWx1ZTogbnVtYmVyIH07XG59XG5cbmV4cG9ydCBjbGFzcyBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgc3RhZ2VNYXA6IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj47XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhlY3V0aW9uUnVudGltZTogSUV4ZWN1dGlvblJ1bnRpbWU7XG4gIHByaXZhdGUgc3ViZmxvd3M6IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT47XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBJTG9nZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudFN1YmZsb3dJZD86IHN0cmluZztcblxuICAvLyBIYW5kbGVyIG1vZHVsZXNcbiAgcHJpdmF0ZSByZWFkb25seSBub2RlUmVzb2x2ZXI6IE5vZGVSZXNvbHZlcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IGNoaWxkcmVuRXhlY3V0b3I6IENoaWxkcmVuRXhlY3V0b3I8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJmbG93RXhlY3V0b3I6IFN1YmZsb3dFeGVjdXRvcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWdlUnVubmVyOiBTdGFnZVJ1bm5lcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRpbnVhdGlvblJlc29sdmVyOiBDb250aW51YXRpb25SZXNvbHZlcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IGRlY2lkZXJIYW5kbGVyOiBEZWNpZGVySGFuZGxlcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdG9ySGFuZGxlcjogU2VsZWN0b3JIYW5kbGVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RydWN0dXJlTWFuYWdlcjogUnVudGltZVN0cnVjdHVyZU1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXh0cmFjdG9yUnVubmVyOiBFeHRyYWN0b3JSdW5uZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBuYXJyYXRpdmVHZW5lcmF0b3I6IElDb250cm9sRmxvd05hcnJhdGl2ZTtcbiAgcHJpdmF0ZSByZWFkb25seSBmbG93UmVjb3JkZXJEaXNwYXRjaGVyOiBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEV4ZWN1dGlvbiBzdGF0ZVxuICBwcml2YXRlIHN1YmZsb3dSZXN1bHRzOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogUGVyLXRyYXZlcnNlciBzZXQgb2YgbGF6eSBzdWJmbG93IElEcyB0aGF0IGhhdmUgYmVlbiByZXNvbHZlZCBieSBUSElTIHJ1bi5cbiAgICogVXNlZCBpbnN0ZWFkIG9mIHdyaXRpbmcgYG5vZGUuc3ViZmxvd1Jlc29sdmVyID0gdW5kZWZpbmVkYCBiYWNrIHRvIHRoZSBzaGFyZWRcbiAgICogU3RhZ2VOb2RlIGdyYXBoIOKAlCBhdm9pZHMgYSByYWNlIHdoZXJlIGEgY29uY3VycmVudCB0cmF2ZXJzZXIgY2xlYXJzIHRoZSBzaGFyZWRcbiAgICogcmVzb2x2ZXIgYmVmb3JlIGFub3RoZXIgdHJhdmVyc2VyIGhhcyBmaW5pc2hlZCB1c2luZyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZWRMYXp5U3ViZmxvd3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUmVjdXJzaW9uIGRlcHRoIGNvdW50ZXIgZm9yIGV4ZWN1dGVOb2RlLlxuICAgKiBFYWNoIHJlY3Vyc2l2ZSBleGVjdXRlTm9kZSBjYWxsIGluY3JlbWVudHMgdGhpczsgZGVjcmVtZW50cyBvbiBleGl0ICh0cnkvZmluYWxseSkuXG4gICAqIFByZXZlbnRzIGNhbGwtc3RhY2sgb3ZlcmZsb3cgb24gaW5maW5pdGUgbG9vcHMgb3IgZXhjZXNzaXZlbHkgZGVlcCBzdGFnZSBjaGFpbnMuXG4gICAqL1xuICBwcml2YXRlIF9leGVjdXRlRGVwdGggPSAwO1xuXG4gIC8qKlxuICAgKiBTaGFyZWQgbXV0YWJsZSBleGVjdXRpb24gY291bnRlciDigJQgbW9ub3RvbmljLCBpbmNyZW1lbnRlZCBwZXIgc3RhZ2UgZXhlY3V0aW9uLlxuICAgKiBTaGFyZWQgd2l0aCBjaGlsZCB0cmF2ZXJzZXJzIChzdWJmbG93cykgc28gaW5kaWNlcyBhcmUgZ2xvYmFsbHkgdW5pcXVlIHdpdGhpbiBhIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2V4ZWN1dGlvbkNvdW50ZXI6IHsgdmFsdWU6IG51bWJlciB9O1xuXG4gIC8qKlxuICAgKiBQZXItaW5zdGFuY2UgbWF4aW11bSBkZXB0aCAoc2V0IGZyb20gVHJhdmVyc2VyT3B0aW9ucy5tYXhEZXB0aCBvciB0aGUgY2xhc3MgZGVmYXVsdCkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhEZXB0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gcmVjdXJzaXZlIGV4ZWN1dGVOb2RlIGRlcHRoIGJlZm9yZSBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAqIDUwMCBjb21mb3J0YWJseSBjb3ZlcnMgYW55IHJlYWxpc3RpYyBwaXBlbGluZSBkZXB0aCAoaW5jbHVkaW5nIGRlZXBseSBuZXN0ZWRcbiAgICogc3ViZmxvd3MpIHdoaWxlIHByZXZlbnRpbmcgY2FsbC1zdGFjayBvdmVyZmxvdyAofjEwIDAwMCBmcmFtZXMgaW4gVjgpLlxuICAgKlxuICAgKiAqKk5vdGUgb24gY291bnRpbmc6KiogdGhlIGNvdW50ZXIgaW5jcmVtZW50cyBvbmNlIHBlciBgZXhlY3V0ZU5vZGVgIGNhbGwsIG5vdCBvbmNlIHBlclxuICAgKiBsb2dpY2FsIHVzZXIgc3RhZ2UuIFN1YmZsb3cgcm9vdCBlbnRyeSBhbmQgc3ViZmxvdyBjb250aW51YXRpb24gYWZ0ZXIgcmV0dXJuIGVhY2ggY29zdFxuICAgKiBvbmUgdGljay4gRm9yIHBpcGVsaW5lcyB3aXRoIG1hbnkgbmVzdGVkIHN1YmZsb3dzLCBidWRnZXQgcm91Z2hseSAyIMOXIChhdmcgc3RhZ2VzIHBlclxuICAgKiBzdWJmbG93KSBvZiBoZWFkcm9vbSB3aGVuIGNvbXB1dGluZyBhIGN1c3RvbSBgbWF4RGVwdGhgIHZpYSBgUnVuT3B0aW9ucy5tYXhEZXB0aGAuXG4gICAqXG4gICAqICoqTm90ZSBvbiBsb29wczoqKiBmb3IgYGxvb3BUbygpYCBwaXBlbGluZXMsIHRoaXMgZGVwdGggZ3VhcmQgYW5kIGBDb250aW51YXRpb25SZXNvbHZlcmAnc1xuICAgKiBpdGVyYXRpb24gbGltaXQgYXJlIGluZGVwZW5kZW50IOKAlCB0aGUgbG93ZXIgb25lIGZpcmVzIGZpcnN0LiBUaGUgZGVmYXVsdCBkZXB0aCBndWFyZCAoNTAwKVxuICAgKiBmaXJlcyBiZWZvcmUgdGhlIGRlZmF1bHQgaXRlcmF0aW9uIGxpbWl0ICgxMDAwKSBmb3IgbG9vcC1oZWF2eSBwaXBlbGluZXMuXG4gICAqXG4gICAqIEByZW1hcmtzIE5vdCBzYWZlIGZvciBjb25jdXJyZW50IGAuZXhlY3V0ZSgpYCBjYWxscyBvbiB0aGUgc2FtZSBpbnN0YW5jZSDigJQgY29uY3VycmVudFxuICAgKiBleGVjdXRpb25zIHJhY2Ugb24gYF9leGVjdXRlRGVwdGhgLiBVc2UgYSBzZXBhcmF0ZSBgRmxvd2NoYXJ0VHJhdmVyc2VyYCBwZXIgY29uY3VycmVudFxuICAgKiBleGVjdXRpb24uIGBGbG93Q2hhcnRFeGVjdXRvci5ydW4oKWAgYWx3YXlzIGNyZWF0ZXMgYSBmcmVzaCB0cmF2ZXJzZXIgcGVyIGNhbGwuXG4gICAqL1xuICBzdGF0aWMgcmVhZG9ubHkgTUFYX0VYRUNVVEVfREVQVEggPSA1MDA7XG5cbiAgY29uc3RydWN0b3Iob3B0czogVHJhdmVyc2VyT3B0aW9uczxUT3V0LCBUU2NvcGU+KSB7XG4gICAgY29uc3QgbWF4RGVwdGggPSBvcHRzLm1heERlcHRoID8/IEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSDtcbiAgICBpZiAobWF4RGVwdGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoJ0Zsb3djaGFydFRyYXZlcnNlcjogbWF4RGVwdGggbXVzdCBiZSA+PSAxJyk7XG4gICAgdGhpcy5fbWF4RGVwdGggPSBtYXhEZXB0aDtcbiAgICB0aGlzLl9leGVjdXRpb25Db3VudGVyID0gb3B0cy5leGVjdXRpb25Db3VudGVyID8/IHsgdmFsdWU6IDAgfTtcbiAgICB0aGlzLnJvb3QgPSBvcHRzLnJvb3Q7XG4gICAgLy8gU2hhbGxvdy1jb3B5IHN0YWdlTWFwIGFuZCBzdWJmbG93cyBzbyB0aGF0IGxhenktcmVzb2x1dGlvbiBtdXRhdGlvbnNcbiAgICAvLyAocHJlZml4ZWQgZW50cmllcyBhZGRlZCBkdXJpbmcgZXhlY3V0aW9uKSBzdGF5IHNjb3BlZCB0byBUSElTIHRyYXZlcnNlclxuICAgIC8vIGFuZCBkbyBub3QgZXNjYXBlIHRvIHRoZSBzaGFyZWQgRmxvd0NoYXJ0IG9iamVjdC4gV2l0aG91dCB0aGUgY29weSxcbiAgICAvLyBjb25jdXJyZW50IEZsb3dDaGFydEV4ZWN1dG9yIHJ1bnMgc2hhcmluZyB0aGUgc2FtZSBGbG93Q2hhcnQgd291bGQgcmFjZVxuICAgIC8vIG9uIHRoZXNlIHR3byBtdXRhYmxlIGRpY3Rpb25hcmllcy5cbiAgICB0aGlzLnN0YWdlTWFwID0gbmV3IE1hcChvcHRzLnN0YWdlTWFwKTtcbiAgICB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUgPSBvcHRzLmV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgdGhpcy5zdWJmbG93cyA9IG9wdHMuc3ViZmxvd3MgPyB7IC4uLm9wdHMuc3ViZmxvd3MgfSA6IHt9O1xuICAgIHRoaXMubG9nZ2VyID0gb3B0cy5sb2dnZXI7XG4gICAgdGhpcy5zaWduYWwgPSBvcHRzLnNpZ25hbDtcbiAgICB0aGlzLnBhcmVudFN1YmZsb3dJZCA9IG9wdHMucGFyZW50U3ViZmxvd0lkO1xuXG4gICAgLy8gU3RydWN0dXJlIG1hbmFnZXIgKGRlZXAtY2xvbmVzIGJ1aWxkLXRpbWUgc3RydWN0dXJlKVxuICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlciA9IG5ldyBSdW50aW1lU3RydWN0dXJlTWFuYWdlcigpO1xuICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci5pbml0KG9wdHMuYnVpbGRUaW1lU3RydWN0dXJlKTtcblxuICAgIC8vIEV4dHJhY3RvciBydW5uZXJcbiAgICB0aGlzLmV4dHJhY3RvclJ1bm5lciA9IG5ldyBFeHRyYWN0b3JSdW5uZXIoXG4gICAgICBvcHRzLmV4dHJhY3RvcixcbiAgICAgIG9wdHMuZW5yaWNoU25hcHNob3RzID8/IGZhbHNlLFxuICAgICAgdGhpcy5leGVjdXRpb25SdW50aW1lLFxuICAgICAgdGhpcy5sb2dnZXIsXG4gICAgKTtcblxuICAgIC8vIE5hcnJhdGl2ZSBnZW5lcmF0b3JcbiAgICAvLyBQcmlvcml0eTogZXhwbGljaXQgbmFycmF0aXZlR2VuZXJhdG9yID4gZmxvd1JlY29yZGVycyA+IGRlZmF1bHQgTmFycmF0aXZlRmxvd1JlY29yZGVyID4gbnVsbC5cbiAgICAvLyBTdWJmbG93IHRyYXZlcnNlcnMgcmVjZWl2ZSB0aGUgcGFyZW50J3MgbmFycmF0aXZlR2VuZXJhdG9yIHNvIGFsbCBldmVudHMgZmxvdyB0byBvbmUgcGxhY2UuXG4gICAgaWYgKG9wdHMubmFycmF0aXZlR2VuZXJhdG9yKSB7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciA9IG9wdHMubmFycmF0aXZlR2VuZXJhdG9yO1xuICAgIH0gZWxzZSBpZiAob3B0cy5uYXJyYXRpdmVFbmFibGVkKSB7XG4gICAgICBjb25zdCBkaXNwYXRjaGVyID0gbmV3IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIoKTtcbiAgICAgIHRoaXMuZmxvd1JlY29yZGVyRGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7XG5cbiAgICAgIC8vIElmIGN1c3RvbSBGbG93UmVjb3JkZXJzIGFyZSBwcm92aWRlZCwgdXNlIHRoZW07IG90aGVyd2lzZSBhdHRhY2ggZGVmYXVsdCBOYXJyYXRpdmVGbG93UmVjb3JkZXJcbiAgICAgIGlmIChvcHRzLmZsb3dSZWNvcmRlcnMgJiYgb3B0cy5mbG93UmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCByZWNvcmRlciBvZiBvcHRzLmZsb3dSZWNvcmRlcnMpIHtcbiAgICAgICAgICBkaXNwYXRjaGVyLmF0dGFjaChyZWNvcmRlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3BhdGNoZXIuYXR0YWNoKG5ldyBOYXJyYXRpdmVGbG93UmVjb3JkZXIoKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yID0gZGlzcGF0Y2hlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IgPSBuZXcgTnVsbENvbnRyb2xGbG93TmFycmF0aXZlR2VuZXJhdG9yKCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgc2hhcmVkIGRlcHMgYmFnXG4gICAgY29uc3QgZGVwcyA9IHRoaXMuY3JlYXRlRGVwcyhvcHRzKTtcblxuICAgIC8vIEJ1aWxkIE8oMSkgbm9kZSBJRCBtYXAgZnJvbSB0aGUgcm9vdCBncmFwaCAoYXZvaWRzIHJlcGVhdGVkIERGUyBvbiBldmVyeSBsb29wVG8oKSlcbiAgICBjb25zdCBub2RlSWRNYXAgPSB0aGlzLmJ1aWxkTm9kZUlkTWFwKG9wdHMucm9vdCk7XG5cbiAgICAvLyBJbml0aWFsaXplIGhhbmRsZXIgbW9kdWxlc1xuICAgIHRoaXMubm9kZVJlc29sdmVyID0gbmV3IE5vZGVSZXNvbHZlcihkZXBzLCBub2RlSWRNYXApO1xuICAgIHRoaXMuY2hpbGRyZW5FeGVjdXRvciA9IG5ldyBDaGlsZHJlbkV4ZWN1dG9yKGRlcHMsIHRoaXMuZXhlY3V0ZU5vZGUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5zdGFnZVJ1bm5lciA9IG5ldyBTdGFnZVJ1bm5lcihkZXBzKTtcbiAgICB0aGlzLmNvbnRpbnVhdGlvblJlc29sdmVyID0gbmV3IENvbnRpbnVhdGlvblJlc29sdmVyKGRlcHMsIHRoaXMubm9kZVJlc29sdmVyLCAobm9kZUlkLCBjb3VudCkgPT5cbiAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVJdGVyYXRpb25Db3VudChub2RlSWQsIGNvdW50KSxcbiAgICApO1xuICAgIHRoaXMuZGVjaWRlckhhbmRsZXIgPSBuZXcgRGVjaWRlckhhbmRsZXIoZGVwcyk7XG4gICAgdGhpcy5zZWxlY3RvckhhbmRsZXIgPSBuZXcgU2VsZWN0b3JIYW5kbGVyKGRlcHMsIHRoaXMuY2hpbGRyZW5FeGVjdXRvcik7XG4gICAgdGhpcy5zdWJmbG93RXhlY3V0b3IgPSBuZXcgU3ViZmxvd0V4ZWN1dG9yKGRlcHMsIHRoaXMuY3JlYXRlU3ViZmxvd1RyYXZlcnNlckZhY3Rvcnkob3B0cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGZhY3RvcnkgdGhhdCBwcm9kdWNlcyBGbG93Y2hhcnRUcmF2ZXJzZXIgaW5zdGFuY2VzIGZvciBzdWJmbG93IGV4ZWN1dGlvbi5cbiAgICogQ2FwdHVyZXMgcGFyZW50IGNvbmZpZyBpbiBjbG9zdXJlIOKAlCBTdWJmbG93RXhlY3V0b3IgcHJvdmlkZXMgc3ViZmxvdy1zcGVjaWZpYyBvdmVycmlkZXMuXG4gICAqIEVhY2ggc3ViZmxvdyBnZXRzIGEgZnVsbCB0cmF2ZXJzZXIgd2l0aCBhbGwgNyBwaGFzZXMgKGRlY2lkZXJzLCBzZWxlY3RvcnMsIGxvb3BzLCBldGMuKS5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlU3ViZmxvd1RyYXZlcnNlckZhY3RvcnkoXG4gICAgcGFyZW50T3B0czogVHJhdmVyc2VyT3B0aW9uczxUT3V0LCBUU2NvcGU+LFxuICApOiBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeTxUT3V0LCBUU2NvcGU+IHtcbiAgICAvLyBDYXB0dXJlIHJlZmVyZW5jZXMgdG8gbXV0YWJsZSBzdGF0ZSDigJQgZmFjdG9yeSByZWFkcyB0aGUgQ1VSUkVOVCBzdGF0ZSB3aGVuIGNhbGxlZCxcbiAgICAvLyBub3QgdGhlIHN0YXRlIGF0IGZhY3RvcnkgY3JlYXRpb24gdGltZS4gVGhpcyBpcyBjb3JyZWN0IGJlY2F1c2UgbGF6eSBzdWJmbG93IHJlc29sdXRpb25cbiAgICAvLyBtYXkgYWRkIGVudHJpZXMgdG8gc3RhZ2VNYXAvc3ViZmxvd3MgYmVmb3JlIGEgbmVzdGVkIHN1YmZsb3cgaXMgZW5jb3VudGVyZWQuXG4gICAgY29uc3QgcGFyZW50U3RhZ2VNYXAgPSB0aGlzLnN0YWdlTWFwO1xuICAgIGNvbnN0IHBhcmVudFN1YmZsb3dzID0gdGhpcy5zdWJmbG93cztcbiAgICBjb25zdCBuYXJyYXRpdmVHZW5lcmF0b3IgPSB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvcjtcblxuICAgIHJldHVybiAoc3ViZmxvd09wdHMpID0+IHtcbiAgICAgIGNvbnN0IHRyYXZlcnNlciA9IG5ldyBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPih7XG4gICAgICAgIHJvb3Q6IHN1YmZsb3dPcHRzLnJvb3QsXG4gICAgICAgIHN0YWdlTWFwOiBwYXJlbnRTdGFnZU1hcCwgLy8gQ29uc3RydWN0b3Igc2hhbGxvdy1jb3BpZXMgdGhpc1xuICAgICAgICBzY29wZUZhY3Rvcnk6IHBhcmVudE9wdHMuc2NvcGVGYWN0b3J5LFxuICAgICAgICBleGVjdXRpb25SdW50aW1lOiBzdWJmbG93T3B0cy5leGVjdXRpb25SdW50aW1lLFxuICAgICAgICByZWFkT25seUNvbnRleHQ6IHN1YmZsb3dPcHRzLnJlYWRPbmx5Q29udGV4dCxcbiAgICAgICAgZXhlY3V0aW9uRW52OiBwYXJlbnRPcHRzLmV4ZWN1dGlvbkVudixcbiAgICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjogcGFyZW50T3B0cy50aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgICBzdHJlYW1IYW5kbGVyczogcGFyZW50T3B0cy5zdHJlYW1IYW5kbGVycyxcbiAgICAgICAgZXh0cmFjdG9yOiBwYXJlbnRPcHRzLmV4dHJhY3RvcixcbiAgICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogcGFyZW50T3B0cy5zY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgICBzdWJmbG93czogcGFyZW50U3ViZmxvd3MsIC8vIENvbnN0cnVjdG9yIHNoYWxsb3ctY29waWVzIHRoaXNcbiAgICAgICAgZW5yaWNoU25hcHNob3RzOiBwYXJlbnRPcHRzLmVucmljaFNuYXBzaG90cyxcbiAgICAgICAgbmFycmF0aXZlR2VuZXJhdG9yLCAvLyBTaGFyZSBwYXJlbnQncyDigJQgYWxsIGV2ZW50cyBmbG93IHRvIG9uZSBwbGFjZVxuICAgICAgICBsb2dnZXI6IHBhcmVudE9wdHMubG9nZ2VyLFxuICAgICAgICBzaWduYWw6IHBhcmVudE9wdHMuc2lnbmFsLFxuICAgICAgICBtYXhEZXB0aDogdGhpcy5fbWF4RGVwdGgsXG4gICAgICAgIHBhcmVudFN1YmZsb3dJZDogc3ViZmxvd09wdHMuc3ViZmxvd0lkLFxuICAgICAgICBleGVjdXRpb25Db3VudGVyOiB0aGlzLl9leGVjdXRpb25Db3VudGVyLCAvLyBTaGFyZSBjb3VudGVyIOKAlCBzdWJmbG93IGNvbnRpbnVlcyBnbG9iYWwgbnVtYmVyaW5nXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhlY3V0ZTogKCkgPT4gdHJhdmVyc2VyLmV4ZWN1dGUoKSxcbiAgICAgICAgZ2V0U3ViZmxvd1Jlc3VsdHM6ICgpID0+IHRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpLFxuICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZXBzKG9wdHM6IFRyYXZlcnNlck9wdGlvbnM8VE91dCwgVFNjb3BlPik6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBzdGFnZU1hcDogdGhpcy5zdGFnZU1hcCxcbiAgICAgIHJvb3Q6IHRoaXMucm9vdCxcbiAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHRoaXMuZXhlY3V0aW9uUnVudGltZSxcbiAgICAgIHNjb3BlRmFjdG9yeTogb3B0cy5zY29wZUZhY3RvcnksXG4gICAgICBzdWJmbG93czogdGhpcy5zdWJmbG93cyxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IG9wdHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgIHN0cmVhbUhhbmRsZXJzOiBvcHRzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogb3B0cy5zY29wZVByb3RlY3Rpb25Nb2RlID8/ICdlcnJvcicsXG4gICAgICByZWFkT25seUNvbnRleHQ6IG9wdHMucmVhZE9ubHlDb250ZXh0LFxuICAgICAgZXhlY3V0aW9uRW52OiBvcHRzLmV4ZWN1dGlvbkVudixcbiAgICAgIG5hcnJhdGl2ZUdlbmVyYXRvcjogdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IsXG4gICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgICAgc2lnbmFsOiBvcHRzLnNpZ25hbCxcbiAgICB9O1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIFB1YmxpYyBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgZXhlY3V0ZShicmFuY2hQYXRoPzogc3RyaW5nKTogUHJvbWlzZTxUcmF2ZXJzYWxSZXN1bHQ+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5leGVjdXRpb25SdW50aW1lLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZU5vZGUodGhpcy5yb290LCBjb250ZXh0LCB7IHNob3VsZEJyZWFrOiBmYWxzZSB9LCBicmFuY2hQYXRoID8/ICcnKTtcbiAgfVxuXG4gIGdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLmdldFN0cnVjdHVyZSgpO1xuICB9XG5cbiAgZ2V0U25hcHNob3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0aW9uUnVudGltZS5nZXRTbmFwc2hvdCgpO1xuICB9XG5cbiAgZ2V0UnVudGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRpb25SdW50aW1lO1xuICB9XG5cbiAgc2V0Um9vdE9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5leGVjdXRpb25SdW50aW1lLnNldFJvb3RPYmplY3QocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICBnZXRCcmFuY2hJZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0aW9uUnVudGltZS5nZXRQaXBlbGluZXMoKTtcbiAgfVxuXG4gIGdldFJ1bnRpbWVSb290KCk6IFN0YWdlTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMucm9vdDtcbiAgfVxuXG4gIGdldFN1YmZsb3dSZXN1bHRzKCk6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5zdWJmbG93UmVzdWx0cztcbiAgfVxuXG4gIGdldEV4dHJhY3RlZFJlc3VsdHM8VFJlc3VsdCA9IHVua25vd24+KCk6IE1hcDxzdHJpbmcsIFRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5leHRyYWN0b3JSdW5uZXIuZ2V0RXh0cmFjdGVkUmVzdWx0cygpIGFzIE1hcDxzdHJpbmcsIFRSZXN1bHQ+O1xuICB9XG5cbiAgZ2V0RXh0cmFjdG9yRXJyb3JzKCk6IEV4dHJhY3RvckVycm9yW10ge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RvclJ1bm5lci5nZXRFeHRyYWN0b3JFcnJvcnMoKTtcbiAgfVxuXG4gIGdldE5hcnJhdGl2ZSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLmdldFNlbnRlbmNlcygpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIEZsb3dSZWNvcmRlckRpc3BhdGNoZXIsIG9yIHVuZGVmaW5lZCBpZiBuYXJyYXRpdmUgaXMgZGlzYWJsZWQuICovXG4gIGdldEZsb3dSZWNvcmRlckRpc3BhdGNoZXIoKTogRmxvd1JlY29yZGVyRGlzcGF0Y2hlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmxvd1JlY29yZGVyRGlzcGF0Y2hlcjtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBDb3JlIFRyYXZlcnNhbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQnVpbGQgYW4gTygxKSBJROKGkm5vZGUgbWFwIGZyb20gdGhlIHJvb3QgZ3JhcGguXG4gICAqIFVzZWQgYnkgTm9kZVJlc29sdmVyIHRvIGF2b2lkIHJlcGVhdGVkIERGUyBvbiBldmVyeSBsb29wVG8oKSBjYWxsLlxuICAgKiBEZXB0aC1ndWFyZGVkIGF0IE1BWF9FWEVDVVRFX0RFUFRIIHRvIHByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uIG9uIGN5Y2xpYyBncmFwaHMuXG4gICAqIER5bmFtaWMgc3ViZmxvd3MgYW5kIGxhenktcmVzb2x2ZWQgbm9kZXMgYXJlIGFkZGVkIHRvIHN0YWdlTWFwIGF0IHJ1bnRpbWUgYnV0IG5vdCB0byB0aGlzIG1hcCDigJRcbiAgICogdGhvc2UgdXNlIHRoZSBERlMgZmFsbGJhY2sgaW4gTm9kZVJlc29sdmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE5vZGVJZE1hcChyb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IE1hcDxzdHJpbmcsIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+PiB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+PigpO1xuICAgIGNvbnN0IHZpc2l0ID0gKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBkZXB0aDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICBpZiAoZGVwdGggPiBGbG93Y2hhcnRUcmF2ZXJzZXIuTUFYX0VYRUNVVEVfREVQVEgpIHJldHVybjtcbiAgICAgIGlmIChtYXAuaGFzKG5vZGUuaWQpKSByZXR1cm47IC8vIGFscmVhZHkgdmlzaXRlZCAoYXZvaWRzIGluZmluaXRlIGxvb3BzIG9uIGN5Y2xpYyByZWZzKVxuICAgICAgbWFwLnNldChub2RlLmlkLCBub2RlKTtcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikgdmlzaXQoY2hpbGQsIGRlcHRoICsgMSk7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5uZXh0KSB2aXNpdChub2RlLm5leHQsIGRlcHRoICsgMSk7XG4gICAgfTtcbiAgICB2aXNpdChyb290LCAwKTtcbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGFnZUZuKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIG5vZGUuZm4gPT09ICdmdW5jdGlvbicpIHJldHVybiBub2RlLmZuIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPjtcbiAgICAvLyBQcmltYXJ5OiBsb29rIHVwIGJ5IGlkIChzdGFibGUgaWRlbnRpZmllciwga2V5ZWQgYnkgRmxvd0NoYXJ0QnVpbGRlcilcbiAgICBjb25zdCBieUlkID0gdGhpcy5zdGFnZU1hcC5nZXQobm9kZS5pZCk7XG4gICAgaWYgKGJ5SWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGJ5SWQ7XG4gICAgLy8gRmFsbGJhY2s6IGxvb2sgdXAgYnkgbmFtZSAoc3VwcG9ydHMgaGFuZC1jcmFmdGVkIHN0YWdlTWFwcyBpbiB0ZXN0cyBhbmQgYWR2YW5jZWQgdXNlKVxuICAgIHJldHVybiB0aGlzLnN0YWdlTWFwLmdldChub2RlLm5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlU3RhZ2UoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgc3RhZ2VGdW5jOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRm46ICgpID0+IHZvaWQsXG4gICkge1xuICAgIC8vIEFzc2lnbiBydW50aW1lU3RhZ2VJZCBCRUZPUkUgc2NvcGUgY3JlYXRpb24g4oCUIG1vbm90b25pYyBjb3VudGVyIGVuc3VyZXMgdW5pcXVlbmVzcy5cbiAgICAvLyBub2RlLmlkIGFscmVhZHkgaW5jbHVkZXMgc3ViZmxvdyBwcmVmaXggKGUuZy4sICdzZi1pbm5lci9pbm5lci1hJykgZnJvbSB0aGUgYnVpbGRlcixcbiAgICAvLyBzbyB3ZSBkb24ndCBhZGQgcGFyZW50U3ViZmxvd0lkIHNlcGFyYXRlbHkuXG4gICAgY29uc3QgaWR4ID0gdGhpcy5fZXhlY3V0aW9uQ291bnRlci52YWx1ZSsrO1xuICAgIGNvbnRleHQucnVudGltZVN0YWdlSWQgPSBidWlsZFJ1bnRpbWVTdGFnZUlkKG5vZGUuaWQsIGlkeCk7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VSdW5uZXIucnVuKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbik7XG4gIH1cblxuICAvKipcbiAgICogUHJlLW9yZGVyIERGUyB0cmF2ZXJzYWwg4oCUIHRoZSBjb3JlIGFsZ29yaXRobS5cbiAgICogRWFjaCBjYWxsIHByb2Nlc3NlcyBvbmUgbm9kZSB0aHJvdWdoIGFsbCA3IHBoYXNlcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZU5vZGUoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogeyBzaG91bGRCcmVhazogYm9vbGVhbiB9LFxuICAgIGJyYW5jaFBhdGg/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgLy8g4pSA4pSA4pSAIFJlY3Vyc2lvbiBkZXB0aCBndWFyZCDilIDilIDilIBcbiAgICAvLyBFYWNoIGBhd2FpdCBleGVjdXRlTm9kZSguLi4pYCBrZWVwcyB0aGUgY2FsbGluZyBmcmFtZSBvbiB0aGUgc3RhY2suXG4gICAgLy8gV2l0aG91dCBhIGNhcCwgYW4gaW5maW5pdGUgbG9vcCBvciBhbiBleGNlc3NpdmVseSBkZWVwIHN0YWdlIGNoYWluIHdpbGxcbiAgICAvLyBldmVudHVhbGx5IG92ZXJmbG93IHRoZSBWOCBjYWxsIHN0YWNrICh+MTAgMDAwIGZyYW1lcykgd2l0aCBhIGNyeXB0aWNcbiAgICAvLyBcIk1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIgZXJyb3IuICBXZSBmYWlsIGVhcmx5IHdpdGggYSBjbGVhclxuICAgIC8vIG1lc3NhZ2Ugc28gdXNlcnMgY2FuIGRpYWdub3NlIHRoZSBjYXVzZSAoaW5maW5pdGUgbG9vcCwgbWlzc2luZyBicmVhaywgZXRjLikuXG4gICAgLy8gVGhlIGluY3JlbWVudCBpcyBpbnNpZGUgYHRyeWAgc28gYGZpbmFsbHlgIGFsd2F5cyBkZWNyZW1lbnRzIOKAlCBubyBmcmFnaWxlXG4gICAgLy8gZ2FwIGJldHdlZW4gY2hlY2sgYW5kIHRyeSBlbnRyeS5cbiAgICB0cnkge1xuICAgICAgaWYgKCsrdGhpcy5fZXhlY3V0ZURlcHRoID4gdGhpcy5fbWF4RGVwdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGbG93Y2hhcnRUcmF2ZXJzZXI6IG1heGltdW0gdHJhdmVyc2FsIGRlcHRoIGV4Y2VlZGVkICgke3RoaXMuX21heERlcHRofSkuIGAgK1xuICAgICAgICAgICAgJ0NoZWNrIGZvciBpbmZpbml0ZSBsb29wcyBvciBtaXNzaW5nIGJyZWFrIGNvbmRpdGlvbnMgaW4geW91ciBmbG93Y2hhcnQuICcgK1xuICAgICAgICAgICAgYExhc3Qgc3RhZ2U6ICcke25vZGUubmFtZX0nLiBgICtcbiAgICAgICAgICAgICdGb3IgbG9vcFRvKCkgcGlwZWxpbmVzLCBjb25zaWRlciBhZGRpbmcgYSBicmVhayBjb25kaXRpb24gb3IgdXNpbmcgUnVuT3B0aW9ucy5tYXhEZXB0aCB0byByYWlzZSB0aGUgbGltaXQuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXR0YWNoIGJ1aWxkZXIgbWV0YWRhdGEgdG8gY29udGV4dCBmb3Igc25hcHNob3QgZW5yaWNobWVudFxuICAgICAgaWYgKG5vZGUuZGVzY3JpcHRpb24pIGNvbnRleHQuZGVzY3JpcHRpb24gPSBub2RlLmRlc2NyaXB0aW9uO1xuICAgICAgaWYgKG5vZGUuaXNTdWJmbG93Um9vdCAmJiBub2RlLnN1YmZsb3dJZCkgY29udGV4dC5zdWJmbG93SWQgPSBub2RlLnN1YmZsb3dJZDtcblxuICAgICAgLy8gQnVpbGQgdHJhdmVyc2FsIGNvbnRleHQgZm9yIHJlY29yZGVyIGV2ZW50cyDigJQgY3JlYXRlZCBvbmNlIHBlciBzdGFnZSwgc2hhcmVkIGJ5IGFsbCBldmVudHNcbiAgICAgIGNvbnN0IHRyYXZlcnNhbENvbnRleHQ6IFRyYXZlcnNhbENvbnRleHQgPSB7XG4gICAgICAgIHN0YWdlSWQ6IG5vZGUuaWQgPz8gY29udGV4dC5zdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogY29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgc3RhZ2VOYW1lOiBub2RlLm5hbWUsXG4gICAgICAgIHBhcmVudFN0YWdlSWQ6IGNvbnRleHQucGFyZW50Py5zdGFnZUlkLFxuICAgICAgICBzdWJmbG93SWQ6IGNvbnRleHQuc3ViZmxvd0lkID8/IHRoaXMucGFyZW50U3ViZmxvd0lkLFxuICAgICAgICBzdWJmbG93UGF0aDogYnJhbmNoUGF0aCB8fCB1bmRlZmluZWQsXG4gICAgICAgIGRlcHRoOiB0aGlzLmNvbXB1dGVDb250ZXh0RGVwdGgoY29udGV4dCksXG4gICAgICB9O1xuXG4gICAgICAvLyDilIDilIDilIAgUGhhc2UgMGE6IExBWlkgUkVTT0xWRSDigJQgZGVmZXJyZWQgc3ViZmxvdyByZXNvbHV0aW9uIOKUgOKUgOKUgFxuICAgICAgLy8gR3VhcmQgdXNlcyB0aGUgcGVyLXRyYXZlcnNlciByZXNvbHZlZExhenlTdWJmbG93cyBzZXQgKG5vdCB0aGUgc2hhcmVkIG5vZGUpIHNvXG4gICAgICAvLyBjb25jdXJyZW50IHRyYXZlcnNlcnMgZG8gbm90IHJhY2Ugb24gbm9kZS5zdWJmbG93UmVzb2x2ZXIgb3IgY2xlYXIgaXQgZm9yIGVhY2ggb3RoZXIuXG4gICAgICBpZiAobm9kZS5pc1N1YmZsb3dSb290ICYmIG5vZGUuc3ViZmxvd1Jlc29sdmVyICYmICF0aGlzLnJlc29sdmVkTGF6eVN1YmZsb3dzLmhhcyhub2RlLnN1YmZsb3dJZCEpKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gbm9kZS5zdWJmbG93UmVzb2x2ZXIoKTtcbiAgICAgICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5wcmVmaXhOb2RlVHJlZShyZXNvbHZlZC5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBub2RlLnN1YmZsb3dJZCEpO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSByZXNvbHZlZCBzdWJmbG93IChzYW1lIHBhdGggYXMgZWFnZXIgcmVnaXN0cmF0aW9uKVxuICAgICAgICB0aGlzLnN1YmZsb3dzW25vZGUuc3ViZmxvd0lkIV0gPSB7IHJvb3Q6IHByZWZpeGVkUm9vdCB9O1xuXG4gICAgICAgIC8vIE1lcmdlIHN0YWdlTWFwIGVudHJpZXNcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBmbl0gb2YgcmVzb2x2ZWQuc3RhZ2VNYXApIHtcbiAgICAgICAgICBjb25zdCBwcmVmaXhlZEtleSA9IGAke25vZGUuc3ViZmxvd0lkfS8ke2tleX1gO1xuICAgICAgICAgIGlmICghdGhpcy5zdGFnZU1hcC5oYXMocHJlZml4ZWRLZXkpKSB7XG4gICAgICAgICAgICB0aGlzLnN0YWdlTWFwLnNldChwcmVmaXhlZEtleSwgZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNZXJnZSBuZXN0ZWQgc3ViZmxvd3NcbiAgICAgICAgaWYgKHJlc29sdmVkLnN1YmZsb3dzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKHJlc29sdmVkLnN1YmZsb3dzKSkge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ZWRLZXkgPSBgJHtub2RlLnN1YmZsb3dJZH0vJHtrZXl9YDtcbiAgICAgICAgICAgIGlmICghdGhpcy5zdWJmbG93c1twcmVmaXhlZEtleV0pIHtcbiAgICAgICAgICAgICAgdGhpcy5zdWJmbG93c1twcmVmaXhlZEtleV0gPSBkZWYgYXMgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBydW50aW1lIHN0cnVjdHVyZSB3aXRoIHRoZSBub3ctcmVzb2x2ZWQgc3BlY1xuICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICBub2RlLnN1YmZsb3dJZCEsXG4gICAgICAgICAgbm9kZS5zdWJmbG93TmFtZSxcbiAgICAgICAgICByZXNvbHZlZC5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gTWFyayBhcyByZXNvbHZlZCBmb3IgVEhJUyB0cmF2ZXJzZXIg4oCUIHBlci10cmF2ZXJzZXIgc2V0IHByZXZlbnRzIHJlLWVudHJ5XG4gICAgICAgIC8vIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHNoYXJlZCBTdGFnZU5vZGUgZ3JhcGggKHdoaWNoIHdvdWxkIHJhY2UgY29uY3VycmVudCB0cmF2ZXJzZXJzKS5cbiAgICAgICAgdGhpcy5yZXNvbHZlZExhenlTdWJmbG93cy5hZGQobm9kZS5zdWJmbG93SWQhKTtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSA4pSAIFBoYXNlIDA6IENMQVNTSUZZIOKAlCBzdWJmbG93IGRldGVjdGlvbiDilIDilIDilIBcbiAgICAgIGlmIChub2RlLmlzU3ViZmxvd1Jvb3QgJiYgbm9kZS5zdWJmbG93SWQpIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWROb2RlID0gdGhpcy5ub2RlUmVzb2x2ZXIucmVzb2x2ZVN1YmZsb3dSZWZlcmVuY2Uobm9kZSk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzU3ViZmxvd0lkID0gdGhpcy5leHRyYWN0b3JSdW5uZXIuY3VycmVudFN1YmZsb3dJZDtcbiAgICAgICAgdGhpcy5leHRyYWN0b3JSdW5uZXIuY3VycmVudFN1YmZsb3dJZCA9IG5vZGUuc3ViZmxvd0lkO1xuXG4gICAgICAgIGxldCBzdWJmbG93T3V0cHV0OiBhbnk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3ViZmxvd091dHB1dCA9IGF3YWl0IHRoaXMuc3ViZmxvd0V4ZWN1dG9yLmV4ZWN1dGVTdWJmbG93KFxuICAgICAgICAgICAgcmVzb2x2ZWROb2RlLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgICB0aGlzLnN1YmZsb3dSZXN1bHRzLFxuICAgICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMuZXh0cmFjdG9yUnVubmVyLmN1cnJlbnRTdWJmbG93SWQgPSBwcmV2aW91c1N1YmZsb3dJZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzUmVmZXJlbmNlQmFzZWRTdWJmbG93ID0gcmVzb2x2ZWROb2RlICE9PSBub2RlO1xuICAgICAgICBjb25zdCBoYXNDaGlsZHJlbiA9IEJvb2xlYW4obm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApO1xuICAgICAgICBjb25zdCBzaG91bGRFeGVjdXRlQ29udGludWF0aW9uID0gaXNSZWZlcmVuY2VCYXNlZFN1YmZsb3cgfHwgaGFzQ2hpbGRyZW47XG5cbiAgICAgICAgaWYgKG5vZGUubmV4dCAmJiBzaG91bGRFeGVjdXRlQ29udGludWF0aW9uKSB7XG4gICAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbm9kZS5uZXh0Lm5hbWUsIG5vZGUubmV4dC5pZCk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZU5vZGUobm9kZS5uZXh0LCBuZXh0Q3R4LCBicmVha0ZsYWcsIGJyYW5jaFBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1YmZsb3dPdXRwdXQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0YWdlRnVuYyA9IHRoaXMuZ2V0U3RhZ2VGbihub2RlKTtcbiAgICAgIGNvbnN0IGhhc1N0YWdlRnVuY3Rpb24gPSBCb29sZWFuKHN0YWdlRnVuYyk7XG4gICAgICBjb25zdCBpc1Njb3BlQmFzZWREZWNpZGVyID0gQm9vbGVhbihub2RlLmRlY2lkZXJGbik7XG4gICAgICBjb25zdCBpc1Njb3BlQmFzZWRTZWxlY3RvciA9IEJvb2xlYW4obm9kZS5zZWxlY3RvckZuKTtcbiAgICAgIGNvbnN0IGlzRGVjaWRlck5vZGUgPSBpc1Njb3BlQmFzZWREZWNpZGVyO1xuICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBCb29sZWFuKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCk7XG4gICAgICBjb25zdCBoYXNOZXh0ID0gQm9vbGVhbihub2RlLm5leHQpO1xuICAgICAgY29uc3Qgb3JpZ2luYWxOZXh0ID0gbm9kZS5uZXh0O1xuXG4gICAgICAvLyDilIDilIDilIAgUGhhc2UgMTogVkFMSURBVEUg4oCUIG5vZGUgaW52YXJpYW50cyDilIDilIDilIBcbiAgICAgIGlmICghaGFzU3RhZ2VGdW5jdGlvbiAmJiAhaXNEZWNpZGVyTm9kZSAmJiAhaXNTY29wZUJhc2VkU2VsZWN0b3IgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBOb2RlICcke25vZGUubmFtZX0nIG11c3QgZGVmaW5lOiBlbWJlZGRlZCBmbiBPUiBhIHN0YWdlTWFwIGVudHJ5IE9SIGhhdmUgY2hpbGRyZW4vZGVjaWRlcmA7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0RlY2lkZXJOb2RlICYmICFoYXNDaGlsZHJlbikge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnRGVjaWRlciBub2RlIG5lZWRzIHRvIGhhdmUgY2hpbGRyZW4gdG8gZXhlY3V0ZSc7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1Njb3BlQmFzZWRTZWxlY3RvciAmJiAhaGFzQ2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJ1NlbGVjdG9yIG5vZGUgbmVlZHMgdG8gaGF2ZSBjaGlsZHJlbiB0byBleGVjdXRlJztcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuXG4gICAgICAvLyBSb2xlIG1hcmtlcnMgZm9yIGRlYnVnIHBhbmVsc1xuICAgICAgaWYgKCFoYXNTdGFnZUZ1bmN0aW9uKSB7XG4gICAgICAgIGlmIChpc0RlY2lkZXJOb2RlKSBjb250ZXh0LnNldEFzRGVjaWRlcigpO1xuICAgICAgICBlbHNlIGlmIChoYXNDaGlsZHJlbikgY29udGV4dC5zZXRBc0ZvcmsoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnJlYWtGbiA9ICgpID0+IChicmVha0ZsYWcuc2hvdWxkQnJlYWsgPSB0cnVlKTtcblxuICAgICAgLy8g4pSA4pSA4pSAIFBoYXNlIDJhOiBTRUxFQ1RPUiDigJQgc2NvcGUtYmFzZWQgbXVsdGktY2hvaWNlIOKUgOKUgOKUgFxuICAgICAgaWYgKGlzU2NvcGVCYXNlZFNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzRm9ya0lkID0gdGhpcy5leHRyYWN0b3JSdW5uZXIuY3VycmVudEZvcmtJZDtcbiAgICAgICAgdGhpcy5leHRyYWN0b3JSdW5uZXIuY3VycmVudEZvcmtJZCA9IG5vZGUuaWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzZWxlY3RvclJlc3VsdCA9IGF3YWl0IHRoaXMuc2VsZWN0b3JIYW5kbGVyLmhhbmRsZVNjb3BlQmFzZWQoXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgc3RhZ2VGdW5jISxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICAgICAgdGhpcy5leGVjdXRlU3RhZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZU5vZGUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHRoaXMuZXh0cmFjdG9yUnVubmVyLmNhbGxFeHRyYWN0b3IuYmluZCh0aGlzLmV4dHJhY3RvclJ1bm5lciksXG4gICAgICAgICAgICB0aGlzLmV4dHJhY3RvclJ1bm5lci5nZXRTdGFnZVBhdGguYmluZCh0aGlzLmV4dHJhY3RvclJ1bm5lciksXG4gICAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoaGFzTmV4dCkge1xuICAgICAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbm9kZS5uZXh0IS5uYW1lLCBub2RlLm5leHQhLmlkKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKG5vZGUubmV4dCEsIG5leHRDdHgsIGJyZWFrRmxhZywgYnJhbmNoUGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzZWxlY3RvclJlc3VsdDtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aGlzLmV4dHJhY3RvclJ1bm5lci5jdXJyZW50Rm9ya0lkID0gcHJldmlvdXNGb3JrSWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSA4pSAIFBoYXNlIDJiOiBERUNJREVSIOKAlCBzY29wZS1iYXNlZCBzaW5nbGUtY2hvaWNlIGNvbmRpdGlvbmFsIGJyYW5jaCDilIDilIDilIBcbiAgICAgIGlmIChpc0RlY2lkZXJOb2RlKSB7XG4gICAgICAgIGNvbnN0IGRlY2lkZXJSZXN1bHQgPSBhd2FpdCB0aGlzLmRlY2lkZXJIYW5kbGVyLmhhbmRsZVNjb3BlQmFzZWQoXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBzdGFnZUZ1bmMhLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgdGhpcy5leGVjdXRlU3RhZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgICB0aGlzLmV4ZWN1dGVOb2RlLmJpbmQodGhpcyksXG4gICAgICAgICAgdGhpcy5leHRyYWN0b3JSdW5uZXIuY2FsbEV4dHJhY3Rvci5iaW5kKHRoaXMuZXh0cmFjdG9yUnVubmVyKSxcbiAgICAgICAgICB0aGlzLmV4dHJhY3RvclJ1bm5lci5nZXRTdGFnZVBhdGguYmluZCh0aGlzLmV4dHJhY3RvclJ1bm5lciksXG4gICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBBZnRlciBicmFuY2ggZXhlY3V0aW9uLCBmb2xsb3cgZGVjaWRlcidzIG93biBuZXh0IChlLmcuLCBsb29wVG8gdGFyZ2V0KVxuICAgICAgICBpZiAoaGFzTmV4dCAmJiAhYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAgICAgY29uc3QgbmV4dE5vZGUgPSBvcmlnaW5hbE5leHQhO1xuICAgICAgICAgIC8vIFVzZSB0aGUgaXNMb29wUmVmIGZsYWcgc2V0IGJ5IGxvb3BUbygpIOKAlCBkbyBub3QgcmVseSBvbiBzdGFnZU1hcCBhYnNlbmNlLFxuICAgICAgICAgIC8vIHNpbmNlIGlkLWtleWVkIHN0YWdlTWFwcyB3b3VsZCBvdGhlcndpc2UgY2F1c2UgbG9vcCB0YXJnZXRzIHRvIGJlIGV4ZWN1dGVkIGRpcmVjdGx5LlxuICAgICAgICAgIGNvbnN0IGlzTG9vcFJlZiA9XG4gICAgICAgICAgICBuZXh0Tm9kZS5pc0xvb3BSZWYgPT09IHRydWUgfHxcbiAgICAgICAgICAgICghdGhpcy5nZXRTdGFnZUZuKG5leHROb2RlKSAmJlxuICAgICAgICAgICAgICAhbmV4dE5vZGUuY2hpbGRyZW4/Lmxlbmd0aCAmJlxuICAgICAgICAgICAgICAhbmV4dE5vZGUuZGVjaWRlckZuICYmXG4gICAgICAgICAgICAgICFuZXh0Tm9kZS5zZWxlY3RvckZuICYmXG4gICAgICAgICAgICAgICFuZXh0Tm9kZS5pc1N1YmZsb3dSb290KTtcblxuICAgICAgICAgIGlmIChpc0xvb3BSZWYpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRpbnVhdGlvblJlc29sdmVyLnJlc29sdmUoXG4gICAgICAgICAgICAgIG5leHROb2RlLFxuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZU5vZGUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25OZXh0KG5vZGUubmFtZSwgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmlkKTtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlTm9kZShuZXh0Tm9kZSwgbmV4dEN0eCwgYnJlYWtGbGFnLCBicmFuY2hQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWNpZGVyUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIDilIAgQWJvcnQgY2hlY2sg4oCUIGNvb3BlcmF0aXZlIGNhbmNlbGxhdGlvbiDilIDilIDilIBcbiAgICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgICBjb25zdCByZWFzb24gPVxuICAgICAgICAgIHRoaXMuc2lnbmFsLnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gdGhpcy5zaWduYWwucmVhc29uIDogbmV3IEVycm9yKHRoaXMuc2lnbmFsLnJlYXNvbiA/PyAnQWJvcnRlZCcpO1xuICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAzOiBFWEVDVVRFIOKAlCBydW4gc3RhZ2UgZnVuY3Rpb24g4pSA4pSA4pSAXG4gICAgICBsZXQgc3RhZ2VPdXRwdXQ6IFRPdXQgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgZHluYW1pY05leHQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoc3RhZ2VGdW5jKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3RhZ2VPdXRwdXQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdGFnZShub2RlLCBzdGFnZUZ1bmMsIGNvbnRleHQsIGJyZWFrRm4pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgLy8gUGF1c2VTaWduYWwgaXMgZXhwZWN0ZWQgY29udHJvbCBmbG93LCBub3QgYW4gZXJyb3Ig4oCUIGZpcmUgbmFycmF0aXZlLCBjb21taXQsIHJlLXRocm93LlxuICAgICAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uUGF1c2Uobm9kZS5uYW1lLCBub2RlLmlkLCBlcnJvci5wYXVzZURhdGEsIGVycm9yLnN1YmZsb3dQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250ZXh0LmNvbW1pdCgpO1xuICAgICAgICAgIHRoaXMuZXh0cmFjdG9yUnVubmVyLmNhbGxFeHRyYWN0b3IoXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIHRoaXMuZXh0cmFjdG9yUnVubmVyLmdldFN0YWdlUGF0aChub2RlLCBicmFuY2hQYXRoLCBjb250ZXh0LnN0YWdlTmFtZSksXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICB7IHR5cGU6ICdzdGFnZUV4ZWN1dGlvbkVycm9yJywgbWVzc2FnZTogZXJyb3IudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25FcnJvcihub2RlLm5hbWUsIGVycm9yLnRvU3RyaW5nKCksIGVycm9yLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHsgZXJyb3IgfSk7XG4gICAgICAgICAgY29udGV4dC5hZGRFcnJvcignc3RhZ2VFeGVjdXRpb25FcnJvcicsIGVycm9yLnRvU3RyaW5nKCkpO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuY29tbWl0KCk7XG4gICAgICAgIHRoaXMuZXh0cmFjdG9yUnVubmVyLmNhbGxFeHRyYWN0b3IoXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIHRoaXMuZXh0cmFjdG9yUnVubmVyLmdldFN0YWdlUGF0aChub2RlLCBicmFuY2hQYXRoLCBjb250ZXh0LnN0YWdlTmFtZSksXG4gICAgICAgICAgc3RhZ2VPdXRwdXQsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChub2RlLm5hbWUsIG5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQpO1xuXG4gICAgICAgIGlmIChicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkJyZWFrKG5vZGUubmFtZSwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgRXhlY3V0aW9uIHN0b3BwZWQgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIGFmdGVyICR7bm9kZS5uYW1lfSBkdWUgdG8gYnJlYWsgY29uZGl0aW9uLmApO1xuICAgICAgICAgIHJldHVybiBzdGFnZU91dHB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA0OiBEWU5BTUlDIOKAlCBTdGFnZU5vZGUgcmV0dXJuIGRldGVjdGlvbiDilIDilIDilIBcbiAgICAgICAgaWYgKHN0YWdlT3V0cHV0ICYmIHR5cGVvZiBzdGFnZU91dHB1dCA9PT0gJ29iamVjdCcgJiYgaXNTdGFnZU5vZGVSZXR1cm4oc3RhZ2VPdXRwdXQpKSB7XG4gICAgICAgICAgY29uc3QgZHluYW1pY05vZGUgPSBzdGFnZU91dHB1dCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnaXNEeW5hbWljJywgdHJ1ZSk7XG4gICAgICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNQYXR0ZXJuJywgJ1N0YWdlTm9kZVJldHVybicpO1xuXG4gICAgICAgICAgLy8gRHluYW1pYyBzdWJmbG93IGF1dG8tcmVnaXN0cmF0aW9uXG4gICAgICAgICAgaWYgKGR5bmFtaWNOb2RlLmlzU3ViZmxvd1Jvb3QgJiYgZHluYW1pY05vZGUuc3ViZmxvd0RlZiAmJiBkeW5hbWljTm9kZS5zdWJmbG93SWQpIHtcbiAgICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljUGF0dGVybicsICdkeW5hbWljU3ViZmxvdycpO1xuICAgICAgICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNTdWJmbG93SWQnLCBkeW5hbWljTm9kZS5zdWJmbG93SWQpO1xuXG4gICAgICAgICAgICAvLyBTdHJ1Y3R1cmFsLW9ubHkgc3ViZmxvdzogaGFzIGJ1aWxkVGltZVN0cnVjdHVyZSBidXQgbm8gZXhlY3V0YWJsZSByb290LlxuICAgICAgICAgICAgLy8gVXNlZCBmb3IgcHJlLWV4ZWN1dGVkIHN1YmZsb3dzIChlLmcuLCBpbm5lciBmbG93cyB0aGF0IGFscmVhZHkgcmFuKS5cbiAgICAgICAgICAgIC8vIEFubm90YXRlcyB0aGUgbm9kZSBmb3IgdmlzdWFsaXphdGlvbiB3aXRob3V0IHJlLWV4ZWN1dGluZy5cbiAgICAgICAgICAgIGlmICghZHluYW1pY05vZGUuc3ViZmxvd0RlZi5yb290KSB7XG4gICAgICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljUGF0dGVybicsICdzdHJ1Y3R1cmFsU3ViZmxvdycpO1xuICAgICAgICAgICAgICBub2RlLmlzU3ViZmxvd1Jvb3QgPSB0cnVlO1xuICAgICAgICAgICAgICBub2RlLnN1YmZsb3dJZCA9IGR5bmFtaWNOb2RlLnN1YmZsb3dJZDtcbiAgICAgICAgICAgICAgbm9kZS5zdWJmbG93TmFtZSA9IGR5bmFtaWNOb2RlLnN1YmZsb3dOYW1lO1xuICAgICAgICAgICAgICBub2RlLmRlc2NyaXB0aW9uID0gZHluYW1pY05vZGUuZGVzY3JpcHRpb24gPz8gbm9kZS5kZXNjcmlwdGlvbjtcblxuICAgICAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93SWQhLFxuICAgICAgICAgICAgICAgIGR5bmFtaWNOb2RlLnN1YmZsb3dOYW1lLFxuICAgICAgICAgICAgICAgIGR5bmFtaWNOb2RlLnN1YmZsb3dEZWYuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBQaGFzZSA1IChjb250aW51YXRpb24pIOKAlCBubyBzdWJmbG93IGV4ZWN1dGlvbiBuZWVkZWRcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIEZ1bGwgZHluYW1pYyBzdWJmbG93OiByZWdpc3RlciArIGV4ZWN1dGVcbiAgICAgICAgICAgICAgdGhpcy5hdXRvUmVnaXN0ZXJTdWJmbG93RGVmKGR5bmFtaWNOb2RlLnN1YmZsb3dJZCwgZHluYW1pY05vZGUuc3ViZmxvd0RlZiwgbm9kZS5pZCk7XG5cbiAgICAgICAgICAgICAgbm9kZS5pc1N1YmZsb3dSb290ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgbm9kZS5zdWJmbG93SWQgPSBkeW5hbWljTm9kZS5zdWJmbG93SWQ7XG4gICAgICAgICAgICAgIG5vZGUuc3ViZmxvd05hbWUgPSBkeW5hbWljTm9kZS5zdWJmbG93TmFtZTtcbiAgICAgICAgICAgICAgbm9kZS5zdWJmbG93TW91bnRPcHRpb25zID0gZHluYW1pY05vZGUuc3ViZmxvd01vdW50T3B0aW9ucztcblxuICAgICAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93SWQhLFxuICAgICAgICAgICAgICAgIGR5bmFtaWNOb2RlLnN1YmZsb3dOYW1lLFxuICAgICAgICAgICAgICAgIGR5bmFtaWNOb2RlLnN1YmZsb3dEZWY/LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlTm9kZShub2RlLCBjb250ZXh0LCBicmVha0ZsYWcsIGJyYW5jaFBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGNoaWxkcmVuIGZvciBzdWJmbG93RGVmXG4gICAgICAgICAgaWYgKGR5bmFtaWNOb2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGR5bmFtaWNOb2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgIGlmIChjaGlsZC5pc1N1YmZsb3dSb290ICYmIGNoaWxkLnN1YmZsb3dEZWYgJiYgY2hpbGQuc3ViZmxvd0lkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvUmVnaXN0ZXJTdWJmbG93RGVmKGNoaWxkLnN1YmZsb3dJZCwgY2hpbGQuc3ViZmxvd0RlZiwgY2hpbGQuaWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgICAgICAgICAgIGNoaWxkLmlkLFxuICAgICAgICAgICAgICAgICAgY2hpbGQuc3ViZmxvd0lkISxcbiAgICAgICAgICAgICAgICAgIGNoaWxkLnN1YmZsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgY2hpbGQuc3ViZmxvd0RlZj8uYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBEeW5hbWljIGNoaWxkcmVuIChmb3JrIHBhdHRlcm4pXG4gICAgICAgICAgaWYgKGR5bmFtaWNOb2RlLmNoaWxkcmVuICYmIGR5bmFtaWNOb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBkeW5hbWljTm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljQ2hpbGRDb3VudCcsIGR5bmFtaWNOb2RlLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgICAgICBjb250ZXh0LmFkZExvZyhcbiAgICAgICAgICAgICAgJ2R5bmFtaWNDaGlsZElkcycsXG4gICAgICAgICAgICAgIGR5bmFtaWNOb2RlLmNoaWxkcmVuLm1hcCgoYykgPT4gYy5pZCksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY0NoaWxkcmVuKFxuICAgICAgICAgICAgICBub2RlLmlkLFxuICAgICAgICAgICAgICBkeW5hbWljTm9kZS5jaGlsZHJlbixcbiAgICAgICAgICAgICAgQm9vbGVhbihkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yKSxcbiAgICAgICAgICAgICAgQm9vbGVhbihkeW5hbWljTm9kZS5kZWNpZGVyRm4pLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIG5vZGUubmV4dE5vZGVTZWxlY3RvciA9IGR5bmFtaWNOb2RlLm5leHROb2RlU2VsZWN0b3I7XG4gICAgICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdoYXNTZWxlY3RvcicsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIER5bmFtaWMgbmV4dCAobGluZWFyIGNvbnRpbnVhdGlvbilcbiAgICAgICAgICBpZiAoZHluYW1pY05vZGUubmV4dCkge1xuICAgICAgICAgICAgZHluYW1pY05leHQgPSBkeW5hbWljTm9kZS5uZXh0O1xuICAgICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNOZXh0KG5vZGUuaWQsIGR5bmFtaWNOb2RlLm5leHQpO1xuICAgICAgICAgICAgbm9kZS5uZXh0ID0gZHluYW1pY05vZGUubmV4dDtcbiAgICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdoYXNEeW5hbWljTmV4dCcsIHRydWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN0YWdlT3V0cHV0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBuZXh0IHRvIGF2b2lkIHN0YWxlIHJlZmVyZW5jZSBvbiBsb29wIHJldmlzaXRcbiAgICAgICAgaWYgKGR5bmFtaWNOZXh0KSB7XG4gICAgICAgICAgbm9kZS5uZXh0ID0gb3JpZ2luYWxOZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA1OiBDSElMRFJFTiDigJQgZm9yayBkaXNwYXRjaCDilIDilIDilIBcbiAgICAgIGNvbnN0IGhhc0NoaWxkcmVuQWZ0ZXJTdGFnZSA9IEJvb2xlYW4obm9kZS5jaGlsZHJlbj8ubGVuZ3RoKTtcblxuICAgICAgaWYgKGhhc0NoaWxkcmVuQWZ0ZXJTdGFnZSkge1xuICAgICAgICBjb250ZXh0LmFkZExvZygndG90YWxDaGlsZHJlbicsIG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCk7XG4gICAgICAgIGNvbnRleHQuYWRkTG9nKCdvcmRlck9mRXhlY3V0aW9uJywgJ0NoaWxkcmVuQWZ0ZXJTdGFnZScpO1xuXG4gICAgICAgIGxldCBub2RlQ2hpbGRyZW5SZXN1bHRzOiBSZWNvcmQ8c3RyaW5nLCBOb2RlUmVzdWx0VHlwZT47XG5cbiAgICAgICAgaWYgKG5vZGUubmV4dE5vZGVTZWxlY3Rvcikge1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzRm9ya0lkID0gdGhpcy5leHRyYWN0b3JSdW5uZXIuY3VycmVudEZvcmtJZDtcbiAgICAgICAgICB0aGlzLmV4dHJhY3RvclJ1bm5lci5jdXJyZW50Rm9ya0lkID0gbm9kZS5pZDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbm9kZUNoaWxkcmVuUmVzdWx0cyA9IGF3YWl0IHRoaXMuY2hpbGRyZW5FeGVjdXRvci5leGVjdXRlU2VsZWN0ZWRDaGlsZHJlbihcbiAgICAgICAgICAgICAgbm9kZS5uZXh0Tm9kZVNlbGVjdG9yLFxuICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuISxcbiAgICAgICAgICAgICAgc3RhZ2VPdXRwdXQsXG4gICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgIGJyYW5jaFBhdGggYXMgc3RyaW5nLFxuICAgICAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5leHRyYWN0b3JSdW5uZXIuY3VycmVudEZvcmtJZCA9IHByZXZpb3VzRm9ya0lkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBjaGlsZENvdW50ID0gbm9kZS5jaGlsZHJlbj8ubGVuZ3RoID8/IDA7XG4gICAgICAgICAgY29uc3QgY2hpbGROYW1lcyA9IG5vZGUuY2hpbGRyZW4/Lm1hcCgoYykgPT4gYy5uYW1lKS5qb2luKCcsICcpO1xuICAgICAgICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnY2hpbGRyZW4nLCBgRXhlY3V0aW5nIGFsbCAke2NoaWxkQ291bnR9IGNoaWxkcmVuIGluIHBhcmFsbGVsOiAke2NoaWxkTmFtZXN9YCwge1xuICAgICAgICAgICAgY291bnQ6IGNoaWxkQ291bnQsXG4gICAgICAgICAgICB0YXJnZXRTdGFnZTogbm9kZS5jaGlsZHJlbj8ubWFwKChjKSA9PiBjLm5hbWUpLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgcHJldmlvdXNGb3JrSWQgPSB0aGlzLmV4dHJhY3RvclJ1bm5lci5jdXJyZW50Rm9ya0lkO1xuICAgICAgICAgIHRoaXMuZXh0cmFjdG9yUnVubmVyLmN1cnJlbnRGb3JrSWQgPSBub2RlLmlkO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBub2RlQ2hpbGRyZW5SZXN1bHRzID0gYXdhaXQgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLmV4ZWN1dGVOb2RlQ2hpbGRyZW4oXG4gICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuZXh0cmFjdG9yUnVubmVyLmN1cnJlbnRGb3JrSWQgPSBwcmV2aW91c0ZvcmtJZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb3JrLW9ubHk6IHJldHVybiBidW5kbGVcbiAgICAgICAgaWYgKCFoYXNOZXh0ICYmICFkeW5hbWljTmV4dCkge1xuICAgICAgICAgIHJldHVybiBub2RlQ2hpbGRyZW5SZXN1bHRzITtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhcHR1cmUgZHluYW1pYyBjaGlsZHJlbiBhcyBzeW50aGV0aWMgc3ViZmxvdyByZXN1bHQgZm9yIFVJXG4gICAgICAgIGNvbnN0IGlzRHluYW1pYyA9IGNvbnRleHQuZGVidWc/LmxvZ0NvbnRleHQ/LmlzRHluYW1pYztcbiAgICAgICAgaWYgKGlzRHluYW1pYyAmJiBub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuY2FwdHVyZUR5bmFtaWNDaGlsZHJlblJlc3VsdChub2RlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDilIDilIDilIAgUGhhc2UgNjogQ09OVElOVUUg4oCUIGR5bmFtaWMgbmV4dCAvIGxpbmVhciBuZXh0IOKUgOKUgOKUgFxuICAgICAgaWYgKGR5bmFtaWNOZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRpbnVhdGlvblJlc29sdmVyLnJlc29sdmUoXG4gICAgICAgICAgZHluYW1pY05leHQsXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICAgIHRoaXMuZXhlY3V0ZU5vZGUuYmluZCh0aGlzKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc05leHQpIHtcbiAgICAgICAgY29uc3QgbmV4dE5vZGUgPSBvcmlnaW5hbE5leHQhO1xuXG4gICAgICAgIC8vIERldGVjdCBsb29wIHJlZmVyZW5jZSBub2RlcyBjcmVhdGVkIGJ5IGxvb3BUbygpIOKAlCBtYXJrZWQgd2l0aCBpc0xvb3BSZWYgZmxhZy5cbiAgICAgICAgLy8gUm91dGUgdGhyb3VnaCBDb250aW51YXRpb25SZXNvbHZlciBmb3IgcHJvcGVyIElEIHJlc29sdXRpb24sIGl0ZXJhdGlvblxuICAgICAgICAvLyB0cmFja2luZywgYW5kIG5hcnJhdGl2ZSBnZW5lcmF0aW9uLlxuICAgICAgICBjb25zdCBpc0xvb3BSZWZlcmVuY2UgPSBuZXh0Tm9kZS5pc0xvb3BSZWY7XG5cbiAgICAgICAgaWYgKGlzTG9vcFJlZmVyZW5jZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRpbnVhdGlvblJlc29sdmVyLnJlc29sdmUoXG4gICAgICAgICAgICBuZXh0Tm9kZSxcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZU5vZGUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uTmV4dChub2RlLm5hbWUsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCduZXh0JywgYE1vdmluZyB0byAke25leHROb2RlLm5hbWV9IHN0YWdlYCwge1xuICAgICAgICAgIHRhcmdldFN0YWdlOiBuZXh0Tm9kZS5uYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuaWQpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlTm9kZShuZXh0Tm9kZSwgbmV4dEN0eCwgYnJlYWtGbGFnLCBicmFuY2hQYXRoKTtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSA4pSAIFBoYXNlIDc6IExFQUYg4oCUIG5vIGNvbnRpbnVhdGlvbiDilIDilIDilIBcbiAgICAgIHJldHVybiBzdGFnZU91dHB1dDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fZXhlY3V0ZURlcHRoLS07XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIFByaXZhdGUgSGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGNhcHR1cmVEeW5hbWljQ2hpbGRyZW5SZXN1bHQobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIGNvbnRleHQ6IFN0YWdlQ29udGV4dCk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudFN0YWdlSWQgPSBjb250ZXh0LmdldFN0YWdlSWQoKTtcblxuICAgIGNvbnN0IGNoaWxkU3RydWN0dXJlOiBhbnkgPSB7XG4gICAgICBpZDogYCR7bm9kZS5pZH0tY2hpbGRyZW5gLFxuICAgICAgbmFtZTogJ0R5bmFtaWMgQ2hpbGRyZW4nLFxuICAgICAgdHlwZTogJ2ZvcmsnLFxuICAgICAgY2hpbGRyZW46IG5vZGUuY2hpbGRyZW4hLm1hcCgoYykgPT4gKHtcbiAgICAgICAgaWQ6IGMuaWQsXG4gICAgICAgIG5hbWU6IGMubmFtZSxcbiAgICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIH0pKSxcbiAgICB9O1xuXG4gICAgY29uc3QgY2hpbGRTdGFnZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgaWYgKGNvbnRleHQuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGRDdHggb2YgY29udGV4dC5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBzbmFwc2hvdCA9IGNoaWxkQ3R4LmdldFNuYXBzaG90KCk7XG4gICAgICAgIGNoaWxkU3RhZ2VzW3NuYXBzaG90Lm5hbWUgfHwgc25hcHNob3QuaWRdID0ge1xuICAgICAgICAgIG5hbWU6IHNuYXBzaG90Lm5hbWUsXG4gICAgICAgICAgb3V0cHV0OiBzbmFwc2hvdC5sb2dzLFxuICAgICAgICAgIGVycm9yczogc25hcHNob3QuZXJyb3JzLFxuICAgICAgICAgIG1ldHJpY3M6IHNuYXBzaG90Lm1ldHJpY3MsXG4gICAgICAgICAgc3RhdHVzOiBzbmFwc2hvdC5lcnJvcnMgJiYgT2JqZWN0LmtleXMoc25hcHNob3QuZXJyb3JzKS5sZW5ndGggPiAwID8gJ2Vycm9yJyA6ICdzdWNjZXNzJyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN1YmZsb3dSZXN1bHRzLnNldChub2RlLmlkLCB7XG4gICAgICBzdWJmbG93SWQ6IG5vZGUuaWQsXG4gICAgICBzdWJmbG93TmFtZTogbm9kZS5uYW1lLFxuICAgICAgdHJlZUNvbnRleHQ6IHtcbiAgICAgICAgZ2xvYmFsQ29udGV4dDoge30sXG4gICAgICAgIHN0YWdlQ29udGV4dHM6IGNoaWxkU3RhZ2VzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIGhpc3Rvcnk6IFtdLFxuICAgICAgfSxcbiAgICAgIHBhcmVudFN0YWdlSWQsXG4gICAgICBwaXBlbGluZVN0cnVjdHVyZTogY2hpbGRTdHJ1Y3R1cmUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVDb250ZXh0RGVwdGgoY29udGV4dDogU3RhZ2VDb250ZXh0KTogbnVtYmVyIHtcbiAgICBsZXQgZGVwdGggPSAwO1xuICAgIGxldCBjdXJyZW50ID0gY29udGV4dC5wYXJlbnQ7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGRlcHRoKys7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiBkZXB0aDtcbiAgfVxuXG4gIHByaXZhdGUgcHJlZml4Tm9kZVRyZWUobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIHByZWZpeDogc3RyaW5nKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIGlmICghbm9kZSkgcmV0dXJuIG5vZGU7XG4gICAgY29uc3QgY2xvbmU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyAuLi5ub2RlIH07XG4gICAgY2xvbmUubmFtZSA9IGAke3ByZWZpeH0vJHtub2RlLm5hbWV9YDtcbiAgICBjbG9uZS5pZCA9IGAke3ByZWZpeH0vJHtjbG9uZS5pZH1gO1xuICAgIGlmIChjbG9uZS5zdWJmbG93SWQpIGNsb25lLnN1YmZsb3dJZCA9IGAke3ByZWZpeH0vJHtjbG9uZS5zdWJmbG93SWR9YDtcbiAgICBpZiAoY2xvbmUubmV4dCkgY2xvbmUubmV4dCA9IHRoaXMucHJlZml4Tm9kZVRyZWUoY2xvbmUubmV4dCwgcHJlZml4KTtcbiAgICBpZiAoY2xvbmUuY2hpbGRyZW4pIHtcbiAgICAgIGNsb25lLmNoaWxkcmVuID0gY2xvbmUuY2hpbGRyZW4ubWFwKChjKSA9PiB0aGlzLnByZWZpeE5vZGVUcmVlKGMsIHByZWZpeCkpO1xuICAgIH1cbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBwcml2YXRlIGF1dG9SZWdpc3RlclN1YmZsb3dEZWYoXG4gICAgc3ViZmxvd0lkOiBzdHJpbmcsXG4gICAgc3ViZmxvd0RlZjogTm9uTnVsbGFibGU8U3RhZ2VOb2RlWydzdWJmbG93RGVmJ10+LFxuICAgIG1vdW50Tm9kZUlkPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICAvLyB0aGlzLnN1YmZsb3dzIGlzIGFsd2F5cyBpbml0aWFsaXplZCBpbiB0aGUgY29uc3RydWN0b3I7IHRoZSBudWxsIGd1YXJkIGJlbG93IGlzIHVucmVhY2hhYmxlLlxuICAgIGNvbnN0IHN1YmZsb3dzRGljdCA9IHRoaXMuc3ViZmxvd3M7XG5cbiAgICAvLyBGaXJzdC13cml0ZS13aW5zXG4gICAgY29uc3QgaXNOZXdSZWdpc3RyYXRpb24gPSAhc3ViZmxvd3NEaWN0W3N1YmZsb3dJZF07XG4gICAgaWYgKGlzTmV3UmVnaXN0cmF0aW9uICYmIHN1YmZsb3dEZWYucm9vdCkge1xuICAgICAgc3ViZmxvd3NEaWN0W3N1YmZsb3dJZF0gPSB7XG4gICAgICAgIHJvb3Q6IHN1YmZsb3dEZWYucm9vdCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICAgICAgLi4uKHN1YmZsb3dEZWYuYnVpbGRUaW1lU3RydWN0dXJlID8geyBidWlsZFRpbWVTdHJ1Y3R1cmU6IHN1YmZsb3dEZWYuYnVpbGRUaW1lU3RydWN0dXJlIH0gOiB7fSksXG4gICAgICB9IGFzIGFueTtcbiAgICB9XG5cbiAgICAvLyBNZXJnZSBzdGFnZU1hcCBlbnRyaWVzIChwYXJlbnQgZW50cmllcyBwcmVzZXJ2ZWQpXG4gICAgaWYgKHN1YmZsb3dEZWYuc3RhZ2VNYXApIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZm5dIG9mIEFycmF5LmZyb20oc3ViZmxvd0RlZi5zdGFnZU1hcC5lbnRyaWVzKCkpKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFnZU1hcC5oYXMoa2V5KSkge1xuICAgICAgICAgIHRoaXMuc3RhZ2VNYXAuc2V0KGtleSwgZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1lcmdlIG5lc3RlZCBzdWJmbG93c1xuICAgIGlmIChzdWJmbG93RGVmLnN1YmZsb3dzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoc3ViZmxvd0RlZi5zdWJmbG93cykpIHtcbiAgICAgICAgaWYgKCFzdWJmbG93c0RpY3Rba2V5XSkge1xuICAgICAgICAgIHN1YmZsb3dzRGljdFtrZXldID0gZGVmIGFzIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb3VudE5vZGVJZCkge1xuICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNTdWJmbG93KFxuICAgICAgICBtb3VudE5vZGVJZCxcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICBzdWJmbG93RGVmLnJvb3Q/LnN1YmZsb3dOYW1lIHx8IHN1YmZsb3dEZWYucm9vdD8ubmFtZSxcbiAgICAgICAgc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIE5vdGlmeSBGbG93UmVjb3JkZXJzIG9ubHkgb24gZmlyc3QgcmVnaXN0cmF0aW9uIChtYXRjaGVzIGZpcnN0LXdyaXRlLXdpbnMpXG4gICAgaWYgKGlzTmV3UmVnaXN0cmF0aW9uKSB7XG4gICAgICBjb25zdCBzdWJmbG93TmFtZSA9IHN1YmZsb3dEZWYucm9vdD8uc3ViZmxvd05hbWUgfHwgc3ViZmxvd0RlZi5yb290Py5uYW1lIHx8IHN1YmZsb3dJZDtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3ViZmxvd1JlZ2lzdGVyZWQoXG4gICAgICAgIHN1YmZsb3dJZCxcbiAgICAgICAgc3ViZmxvd05hbWUsXG4gICAgICAgIHN1YmZsb3dEZWYucm9vdD8uZGVzY3JpcHRpb24sXG4gICAgICAgIHN1YmZsb3dEZWYuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
700
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd2NoYXJ0VHJhdmVyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUdILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUV0RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQTBEM0QsTUFBTSxPQUFPLGtCQUFrQjtJQXVFN0IsWUFBWSxJQUFvQzs7UUFqRGhELGtCQUFrQjtRQUNWLG1CQUFjLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7UUFFL0Q7Ozs7O1dBS0c7UUFDYyx5QkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBRTFEOzs7O1dBSUc7UUFDSyxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQWtDeEIsTUFBTSxRQUFRLEdBQUcsTUFBQSxJQUFJLENBQUMsUUFBUSxtQ0FBSSxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQztRQUN2RSxJQUFJLFFBQVEsR0FBRyxDQUFDO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFBLElBQUksQ0FBQyxnQkFBZ0IsbUNBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDL0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3RCLHVFQUF1RTtRQUN2RSwwRUFBMEU7UUFDMUUsc0VBQXNFO1FBQ3RFLDBFQUEwRTtRQUMxRSxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM5QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUU1Qyx1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksdUJBQXVCLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRXBELG1CQUFtQjtRQUNuQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksZUFBZSxDQUN4QyxJQUFJLENBQUMsU0FBUyxFQUNkLE1BQUEsSUFBSSxDQUFDLGVBQWUsbUNBQUksS0FBSyxFQUM3QixJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLElBQUksQ0FBQyxNQUFNLENBQ1osQ0FBQztRQUVGLHNCQUFzQjtRQUN0QixnR0FBZ0c7UUFDaEcsOEZBQThGO1FBQzlGLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUNwRCxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNqQyxNQUFNLFVBQVUsR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFVBQVUsQ0FBQztZQUV6QyxpR0FBaUc7WUFDakcsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDMUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDOUIsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixVQUFVLENBQUMsTUFBTSxDQUFDLElBQUkscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFFRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxDQUFDO1FBQ3ZDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksaUNBQWlDLEVBQUUsQ0FBQztRQUNwRSxDQUFDO1FBRUQsd0JBQXdCO1FBQ3hCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbkMscUZBQXFGO1FBQ3JGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWpELDZCQUE2QjtRQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLG9CQUFvQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQzlGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQzFELENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssNkJBQTZCLENBQ25DLFVBQTBDO1FBRTFDLHFGQUFxRjtRQUNyRiwwRkFBMEY7UUFDMUYsK0VBQStFO1FBQy9FLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDckMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNyQyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUVuRCxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDckIsTUFBTSxTQUFTLEdBQUcsSUFBSSxrQkFBa0IsQ0FBZTtnQkFDckQsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJO2dCQUN0QixRQUFRLEVBQUUsY0FBYyxFQUFFLGtDQUFrQztnQkFDNUQsWUFBWSxFQUFFLFVBQVUsQ0FBQyxZQUFZO2dCQUNyQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsZ0JBQWdCO2dCQUM5QyxlQUFlLEVBQUUsV0FBVyxDQUFDLGVBQWU7Z0JBQzVDLFlBQVksRUFBRSxVQUFVLENBQUMsWUFBWTtnQkFDckMsc0JBQXNCLEVBQUUsVUFBVSxDQUFDLHNCQUFzQjtnQkFDekQsY0FBYyxFQUFFLFVBQVUsQ0FBQyxjQUFjO2dCQUN6QyxTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVM7Z0JBQy9CLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxtQkFBbUI7Z0JBQ25ELFFBQVEsRUFBRSxjQUFjLEVBQUUsa0NBQWtDO2dCQUM1RCxlQUFlLEVBQUUsVUFBVSxDQUFDLGVBQWU7Z0JBQzNDLGtCQUFrQixFQUFFLGdEQUFnRDtnQkFDcEUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO2dCQUN6QixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07Z0JBQ3pCLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDeEIsZUFBZSxFQUFFLFdBQVcsQ0FBQyxTQUFTO2dCQUN0QyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUscURBQXFEO2FBQ2hHLENBQUMsQ0FBQztZQUVILE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2xDLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRTthQUN2RCxDQUFDO1FBQ0osQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVPLFVBQVUsQ0FBQyxJQUFvQzs7UUFDckQsT0FBTztZQUNMLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQ3ZDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtZQUMvQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLHNCQUFzQjtZQUNuRCxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDbkMsbUJBQW1CLEVBQUUsTUFBQSxJQUFJLENBQUMsbUJBQW1CLG1DQUFJLE9BQU87WUFDeEQsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ3JDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtZQUMvQixrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCO1lBQzNDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07U0FDcEIsQ0FBQztJQUNKLENBQUM7SUFFRCw2REFBNkQ7SUFFN0QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFtQjtRQUMvQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUM7UUFDdkQsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsVUFBVSxhQUFWLFVBQVUsY0FBVixVQUFVLEdBQUksRUFBRSxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFjLEVBQUUsR0FBVyxFQUFFLEtBQWM7UUFDdkQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsRUFBMEIsQ0FBQztJQUM1RSxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVELGlGQUFpRjtJQUNqRix5QkFBeUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDckMsQ0FBQztJQUVELGlFQUFpRTtJQUVqRTs7Ozs7O09BTUc7SUFDSyxjQUFjLENBQUMsSUFBNkI7UUFDbEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQW1DLENBQUM7UUFDdkQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUE2QixFQUFFLEtBQWEsRUFBUSxFQUFFO1lBQ25FLElBQUksS0FBSyxHQUFHLGtCQUFrQixDQUFDLGlCQUFpQjtnQkFBRSxPQUFPO1lBQ3pELElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUFFLE9BQU8sQ0FBQyx5REFBeUQ7WUFDdkYsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3ZCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNsQixLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRO29CQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzdELENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJO2dCQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUM7UUFDRixLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2YsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU8sVUFBVSxDQUFDLElBQTZCO1FBQzlDLElBQUksT0FBTyxJQUFJLENBQUMsRUFBRSxLQUFLLFVBQVU7WUFBRSxPQUFPLElBQUksQ0FBQyxFQUFpQyxDQUFDO1FBQ2pGLHdFQUF3RTtRQUN4RSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEMsSUFBSSxJQUFJLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3BDLHdGQUF3RjtRQUN4RixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVksQ0FDeEIsSUFBNkIsRUFDN0IsU0FBc0MsRUFDdEMsT0FBcUIsRUFDckIsT0FBbUI7UUFFbkIsZ0ZBQWdGO1FBQ2hGLDREQUE0RDtRQUM1RCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7O09BR0c7SUFDSyxLQUFLLENBQUMsV0FBVyxDQUN2QixJQUE2QixFQUM3QixPQUFxQixFQUNyQixTQUFtQyxFQUNuQyxVQUFtQjs7UUFFbkIsZ0NBQWdDO1FBQ2hDLHNFQUFzRTtRQUN0RSwwRUFBMEU7UUFDMUUsd0VBQXdFO1FBQ3hFLHdFQUF3RTtRQUN4RSxnRkFBZ0Y7UUFDaEYsNEVBQTRFO1FBQzVFLG1DQUFtQztRQUNuQyxJQUFJLENBQUM7WUFDSCxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzFDLE1BQU0sSUFBSSxLQUFLLENBQ2IseURBQXlELElBQUksQ0FBQyxTQUFTLEtBQUs7b0JBQzFFLDBFQUEwRTtvQkFDMUUsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLEtBQUs7b0JBQzlCLDRHQUE0RyxDQUMvRyxDQUFDO1lBQ0osQ0FBQztZQUVELDZEQUE2RDtZQUM3RCxJQUFJLElBQUksQ0FBQyxXQUFXO2dCQUFFLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUM3RCxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFNBQVM7Z0JBQUUsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBRTdFLGdGQUFnRjtZQUNoRiw0RkFBNEY7WUFDNUYsbUZBQW1GO1lBQ25GLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQyxPQUFPLENBQUMsY0FBYyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFM0QsNkZBQTZGO1lBQzdGLE1BQU0sZ0JBQWdCLEdBQXFCO2dCQUN6QyxPQUFPLEVBQUUsTUFBQSxJQUFJLENBQUMsRUFBRSxtQ0FBSSxPQUFPLENBQUMsT0FBTztnQkFDbkMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjO2dCQUN0QyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ3BCLGFBQWEsRUFBRSxNQUFBLE9BQU8sQ0FBQyxNQUFNLDBDQUFFLE9BQU87Z0JBQ3RDLFNBQVMsRUFBRSxNQUFBLE9BQU8sQ0FBQyxTQUFTLG1DQUFJLElBQUksQ0FBQyxlQUFlO2dCQUNwRCxXQUFXLEVBQUUsVUFBVSxJQUFJLFNBQVM7Z0JBQ3BDLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDO2FBQ3pDLENBQUM7WUFFRiwrREFBK0Q7WUFDL0QsaUZBQWlGO1lBQ2pGLHdGQUF3RjtZQUN4RixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xHLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDeEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBK0IsRUFBRSxJQUFJLENBQUMsU0FBVSxDQUFDLENBQUM7Z0JBRXBHLGtFQUFrRTtnQkFDbEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Z0JBRXhELHlCQUF5QjtnQkFDekIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDMUMsTUFBTSxXQUFXLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQzt3QkFDcEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEVBQWlDLENBQUMsQ0FBQztvQkFDcEUsQ0FBQztnQkFDSCxDQUFDO2dCQUVELHdCQUF3QjtnQkFDeEIsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3RCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO3dCQUMzRCxNQUFNLFdBQVcsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksR0FBRyxFQUFFLENBQUM7d0JBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7NEJBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBd0MsQ0FBQzt3QkFDeEUsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7Z0JBRUQsc0RBQXNEO2dCQUN0RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQ3hDLElBQUksQ0FBQyxFQUFFLEVBQ1AsSUFBSSxDQUFDLFNBQVUsRUFDZixJQUFJLENBQUMsV0FBVyxFQUNoQixRQUFRLENBQUMsa0JBQWtCLENBQzVCLENBQUM7Z0JBRUYsNEVBQTRFO2dCQUM1RSx3RkFBd0Y7Z0JBQ3hGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVUsQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFFRCxnREFBZ0Q7WUFDaEQsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckUsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUNoRSxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBRXZELElBQUksYUFBa0IsQ0FBQztnQkFDdkIsSUFBSSxDQUFDO29CQUNILGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUN2RCxZQUFZLEVBQ1osT0FBTyxFQUNQLFNBQVMsRUFDVCxVQUFVLEVBQ1YsSUFBSSxDQUFDLGNBQWMsRUFDbkIsZ0JBQWdCLENBQ2pCLENBQUM7Z0JBQ0osQ0FBQzt3QkFBUyxDQUFDO29CQUNULElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEdBQUcsaUJBQWlCLENBQUM7Z0JBQzVELENBQUM7Z0JBRUQsTUFBTSx1QkFBdUIsR0FBRyxZQUFZLEtBQUssSUFBSSxDQUFDO2dCQUN0RCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDdkUsTUFBTSx5QkFBeUIsR0FBRyx1QkFBdUIsSUFBSSxXQUFXLENBQUM7Z0JBRXpFLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSx5QkFBeUIsRUFBRSxDQUFDO29CQUMzQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQW9CLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDdkYsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUMzRSxDQUFDO2dCQUVELE9BQU8sYUFBYSxDQUFDO1lBQ3ZCLENBQUM7WUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNwRCxNQUFNLG9CQUFvQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEQsTUFBTSxhQUFhLEdBQUcsbUJBQW1CLENBQUM7WUFDMUMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLE1BQUEsSUFBSSxDQUFDLFFBQVEsMENBQUUsTUFBTSxDQUFDLENBQUM7WUFDbkQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBRS9CLDhDQUE4QztZQUM5QyxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNqRixNQUFNLFlBQVksR0FBRyxTQUFTLElBQUksQ0FBQyxJQUFJLHlFQUF5RSxDQUFDO2dCQUNqSCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsVUFBVSxZQUFZLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RyxNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2hDLENBQUM7WUFDRCxJQUFJLGFBQWEsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNsQyxNQUFNLFlBQVksR0FBRyxnREFBZ0QsQ0FBQztnQkFDdEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLFVBQVUsWUFBWSxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztnQkFDdEcsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBQ0QsSUFBSSxvQkFBb0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN6QyxNQUFNLFlBQVksR0FBRyxpREFBaUQsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLFVBQVUsWUFBWSxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztnQkFDdEcsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBRUQsZ0NBQWdDO1lBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUN0QixJQUFJLGFBQWE7b0JBQUUsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO3FCQUNyQyxJQUFJLFdBQVc7b0JBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzVDLENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFFckQsd0RBQXdEO1lBQ3hELElBQUksb0JBQW9CLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUM7Z0JBQzFELElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBRTdDLElBQUksQ0FBQztvQkFDSCxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQ2hFLElBQUksRUFDSixTQUFVLEVBQ1YsT0FBTyxFQUNQLFNBQVMsRUFDVCxVQUFVLEVBQ1YsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUMzQixJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUM3RCxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUM1RCxnQkFBZ0IsQ0FDakIsQ0FBQztvQkFFRixJQUFJLE9BQU8sRUFBRSxDQUFDO3dCQUNaLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBb0IsRUFBRSxJQUFJLENBQUMsSUFBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUN6RixPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7b0JBQzVFLENBQUM7b0JBQ0QsT0FBTyxjQUFjLENBQUM7Z0JBQ3hCLENBQUM7d0JBQVMsQ0FBQztvQkFDVCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsR0FBRyxjQUFjLENBQUM7Z0JBQ3RELENBQUM7WUFDSCxDQUFDO1lBRUQsMkVBQTJFO1lBQzNFLElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FDOUQsSUFBSSxFQUNKLFNBQVUsRUFDVixPQUFPLEVBQ1AsU0FBUyxFQUNULFVBQVUsRUFDVixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQzNCLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQzdELElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQzVELGdCQUFnQixDQUNqQixDQUFDO2dCQUVGLDBFQUEwRTtnQkFDMUUsSUFBSSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ3RDLE1BQU0sUUFBUSxHQUFHLFlBQWEsQ0FBQztvQkFDL0IsNEVBQTRFO29CQUM1RSx1RkFBdUY7b0JBQ3ZGLE1BQU0sU0FBUyxHQUNiLFFBQVEsQ0FBQyxTQUFTLEtBQUssSUFBSTt3QkFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDOzRCQUN6QixDQUFDLENBQUEsTUFBQSxRQUFRLENBQUMsUUFBUSwwQ0FBRSxNQUFNLENBQUE7NEJBQzFCLENBQUMsUUFBUSxDQUFDLFNBQVM7NEJBQ25CLENBQUMsUUFBUSxDQUFDLFVBQVU7NEJBQ3BCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUU3QixJQUFJLFNBQVMsRUFBRSxDQUFDO3dCQUNkLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FDdEMsUUFBUSxFQUNSLElBQUksRUFDSixPQUFPLEVBQ1AsU0FBUyxFQUNULFVBQVUsRUFDVixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDNUIsQ0FBQztvQkFDSixDQUFDO29CQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztvQkFDakcsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFvQixFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNyRixPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDMUUsQ0FBQztnQkFFRCxPQUFPLGFBQWEsQ0FBQztZQUN2QixDQUFDO1lBRUQsaURBQWlEO1lBQ2pELElBQUksTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxPQUFPLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxNQUFNLEdBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sbUNBQUksU0FBUyxDQUFDLENBQUM7Z0JBQ3hHLE1BQU0sTUFBTSxDQUFDO1lBQ2YsQ0FBQztZQUVELGdEQUFnRDtZQUNoRCxJQUFJLFdBQTZCLENBQUM7WUFDbEMsSUFBSSxXQUFnRCxDQUFDO1lBRXJELElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxDQUFDO29CQUNILFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzNFLENBQUM7Z0JBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztvQkFDcEIseUZBQXlGO29CQUN6RixJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUN6QixPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7d0JBQ2pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO3dCQUMxRyxNQUFNLEtBQUssQ0FBQztvQkFDZCxDQUFDO29CQUNELE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDakIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQ2hDLElBQUksRUFDSixPQUFPLEVBQ1AsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQ3RFLFNBQVMsRUFDVCxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQzNELENBQUM7b0JBQ0YsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztvQkFDdEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLFVBQVUsWUFBWSxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO29CQUN4RixPQUFPLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO29CQUMxRCxNQUFNLEtBQUssQ0FBQztnQkFDZCxDQUFDO2dCQUNELE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQ2hDLElBQUksRUFDSixPQUFPLEVBQ1AsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQ3RFLFdBQVcsQ0FDWixDQUFDO2dCQUNGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLENBQUM7Z0JBRXZGLElBQUksU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztvQkFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLFVBQVUsV0FBVyxJQUFJLENBQUMsSUFBSSwwQkFBMEIsQ0FBQyxDQUFDO29CQUM3RyxPQUFPLFdBQVcsQ0FBQztnQkFDckIsQ0FBQztnQkFFRCx3REFBd0Q7Z0JBQ3hELElBQUksV0FBVyxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsSUFBSSxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO29CQUNyRixNQUFNLFdBQVcsR0FBRyxXQUFzQyxDQUFDO29CQUMzRCxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDbEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO29CQUVwRCxvQ0FBb0M7b0JBQ3BDLElBQUksV0FBVyxDQUFDLGFBQWEsSUFBSSxXQUFXLENBQUMsVUFBVSxJQUFJLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDakYsT0FBTyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO3dCQUNuRCxPQUFPLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFFMUQsMEVBQTBFO3dCQUMxRSx1RUFBdUU7d0JBQ3ZFLDZEQUE2RDt3QkFDN0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7NEJBQ2pDLE9BQU8sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQzs0QkFDdEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7NEJBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQzs0QkFDdkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDOzRCQUMzQyxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQUEsV0FBVyxDQUFDLFdBQVcsbUNBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQzs0QkFFL0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUN4QyxJQUFJLENBQUMsRUFBRSxFQUNQLFdBQVcsQ0FBQyxTQUFVLEVBQ3RCLFdBQVcsQ0FBQyxXQUFXLEVBQ3ZCLFdBQVcsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQzFDLENBQUM7NEJBRUYsdUVBQXVFO3dCQUN6RSxDQUFDOzZCQUFNLENBQUM7NEJBQ04sMkNBQTJDOzRCQUMzQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzs0QkFFcEYsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7NEJBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQzs0QkFDdkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDOzRCQUMzQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsV0FBVyxDQUFDLG1CQUFtQixDQUFDOzRCQUUzRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQ3hDLElBQUksQ0FBQyxFQUFFLEVBQ1AsV0FBVyxDQUFDLFNBQVUsRUFDdEIsV0FBVyxDQUFDLFdBQVcsRUFDdkIsTUFBQSxXQUFXLENBQUMsVUFBVSwwQ0FBRSxrQkFBa0IsQ0FDM0MsQ0FBQzs0QkFFRixPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQzt3QkFDdEUsQ0FBQztvQkFDSCxDQUFDO29CQUVELGdDQUFnQztvQkFDaEMsSUFBSSxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ3pCLEtBQUssTUFBTSxLQUFLLElBQUksV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDOzRCQUN6QyxJQUFJLEtBQUssQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7Z0NBQy9ELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dDQUN6RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQ3hDLEtBQUssQ0FBQyxFQUFFLEVBQ1IsS0FBSyxDQUFDLFNBQVUsRUFDaEIsS0FBSyxDQUFDLFdBQVcsRUFDakIsTUFBQSxLQUFLLENBQUMsVUFBVSwwQ0FBRSxrQkFBa0IsQ0FDckMsQ0FBQzs0QkFDSixDQUFDO3dCQUNILENBQUM7b0JBQ0gsQ0FBQztvQkFFRCxrQ0FBa0M7b0JBQ2xDLElBQUksV0FBVyxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDNUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO3dCQUNyQyxPQUFPLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ2pFLE9BQU8sQ0FBQyxNQUFNLENBQ1osaUJBQWlCLEVBQ2pCLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQ3RDLENBQUM7d0JBRUYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUN6QyxJQUFJLENBQUMsRUFBRSxFQUNQLFdBQVcsQ0FBQyxRQUFRLEVBQ3BCLE9BQU8sQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsRUFDckMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FDL0IsQ0FBQzt3QkFFRixJQUFJLE9BQU8sV0FBVyxDQUFDLGdCQUFnQixLQUFLLFVBQVUsRUFBRSxDQUFDOzRCQUN2RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDOzRCQUNyRCxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFDdEMsQ0FBQztvQkFDSCxDQUFDO29CQUVELHFDQUFxQztvQkFDckMsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ3JCLFdBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO3dCQUMvQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ25FLElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQzt3QkFDN0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDekMsQ0FBQztvQkFFRCxXQUFXLEdBQUcsU0FBUyxDQUFDO2dCQUMxQixDQUFDO2dCQUVELGlFQUFpRTtnQkFDakUsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDaEIsSUFBSSxDQUFDLElBQUksR0FBRyxZQUFZLENBQUM7Z0JBQzNCLENBQUM7WUFDSCxDQUFDO1lBRUQsNENBQTRDO1lBQzVDLE1BQU0scUJBQXFCLEdBQUcsT0FBTyxDQUFDLE1BQUEsSUFBSSxDQUFDLFFBQVEsMENBQUUsTUFBTSxDQUFDLENBQUM7WUFFN0QsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO2dCQUMxQixPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxNQUFBLElBQUksQ0FBQyxRQUFRLDBDQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUN2RCxPQUFPLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLG9CQUFvQixDQUFDLENBQUM7Z0JBRXpELElBQUksbUJBQW1ELENBQUM7Z0JBRXhELElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7b0JBQzFCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDO29CQUMxRCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUM3QyxJQUFJLENBQUM7d0JBQ0gsbUJBQW1CLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLENBQ3ZFLElBQUksQ0FBQyxnQkFBZ0IsRUFDckIsSUFBSSxDQUFDLFFBQVMsRUFDZCxXQUFXLEVBQ1gsT0FBTyxFQUNQLFVBQW9CLEVBQ3BCLGdCQUFnQixDQUNqQixDQUFDO29CQUNKLENBQUM7NEJBQVMsQ0FBQzt3QkFDVCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsR0FBRyxjQUFjLENBQUM7b0JBQ3RELENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE1BQU0sVUFBVSxHQUFHLE1BQUEsTUFBQSxJQUFJLENBQUMsUUFBUSwwQ0FBRSxNQUFNLG1DQUFJLENBQUMsQ0FBQztvQkFDOUMsTUFBTSxVQUFVLEdBQUcsTUFBQSxJQUFJLENBQUMsUUFBUSwwQ0FBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoRSxPQUFPLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLGlCQUFpQixVQUFVLDBCQUEwQixVQUFVLEVBQUUsRUFBRTt3QkFDekcsS0FBSyxFQUFFLFVBQVU7d0JBQ2pCLFdBQVcsRUFBRSxNQUFBLElBQUksQ0FBQyxRQUFRLDBDQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztxQkFDL0MsQ0FBQyxDQUFDO29CQUVILE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDO29CQUMxRCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUM3QyxJQUFJLENBQUM7d0JBQ0gsbUJBQW1CLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQ25FLElBQUksRUFDSixPQUFPLEVBQ1AsU0FBUyxFQUNULFVBQVUsRUFDVixnQkFBZ0IsQ0FDakIsQ0FBQztvQkFDSixDQUFDOzRCQUFTLENBQUM7d0JBQ1QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEdBQUcsY0FBYyxDQUFDO29CQUN0RCxDQUFDO2dCQUNILENBQUM7Z0JBRUQsMkJBQTJCO2dCQUMzQixJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQzdCLE9BQU8sbUJBQW9CLENBQUM7Z0JBQzlCLENBQUM7Z0JBRUQsOERBQThEO2dCQUM5RCxNQUFNLFNBQVMsR0FBRyxNQUFBLE1BQUEsT0FBTyxDQUFDLEtBQUssMENBQUUsVUFBVSwwQ0FBRSxTQUFTLENBQUM7Z0JBQ3ZELElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzNELElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ25ELENBQUM7WUFDSCxDQUFDO1lBRUQseURBQXlEO1lBQ3pELElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2hCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FDdEMsV0FBVyxFQUNYLElBQUksRUFDSixPQUFPLEVBQ1AsU0FBUyxFQUNULFVBQVUsRUFDVixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDNUIsQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLE1BQU0sUUFBUSxHQUFHLFlBQWEsQ0FBQztnQkFFL0IsZ0ZBQWdGO2dCQUNoRix5RUFBeUU7Z0JBQ3pFLHNDQUFzQztnQkFDdEMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztnQkFFM0MsSUFBSSxlQUFlLEVBQUUsQ0FBQztvQkFDcEIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUN0QyxRQUFRLEVBQ1IsSUFBSSxFQUNKLE9BQU8sRUFDUCxTQUFTLEVBQ1QsVUFBVSxFQUNWLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUMzQixnQkFBZ0IsQ0FDakIsQ0FBQztnQkFDSixDQUFDO2dCQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztnQkFDakcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxhQUFhLFFBQVEsQ0FBQyxJQUFJLFFBQVEsRUFBRTtvQkFDdEUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxJQUFJO2lCQUMzQixDQUFDLENBQUM7Z0JBQ0gsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFvQixFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRixPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMxRSxDQUFDO1lBRUQsMENBQTBDO1lBQzFDLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUVELGtFQUFrRTtJQUUxRCw0QkFBNEIsQ0FBQyxJQUE2QixFQUFFLE9BQXFCO1FBQ3ZGLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUUzQyxNQUFNLGNBQWMsR0FBUTtZQUMxQixFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxXQUFXO1lBQ3pCLElBQUksRUFBRSxrQkFBa0I7WUFDeEIsSUFBSSxFQUFFLE1BQU07WUFDWixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ25DLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtnQkFDUixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7Z0JBQ1osSUFBSSxFQUFFLE9BQU87YUFDZCxDQUFDLENBQUM7U0FDSixDQUFDO1FBRUYsTUFBTSxXQUFXLEdBQTRCLEVBQUUsQ0FBQztRQUNoRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyQixLQUFLLE1BQU0sUUFBUSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDeEMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN4QyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUc7b0JBQzFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtvQkFDbkIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJO29CQUNyQixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07b0JBQ3ZCLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztvQkFDekIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTO2lCQUN6RixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQy9CLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNsQixXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDdEIsV0FBVyxFQUFFO2dCQUNYLGFBQWEsRUFBRSxFQUFFO2dCQUNqQixhQUFhLEVBQUUsV0FBaUQ7Z0JBQ2hFLE9BQU8sRUFBRSxFQUFFO2FBQ1o7WUFDRCxhQUFhO1lBQ2IsaUJBQWlCLEVBQUUsY0FBYztTQUNsQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsT0FBcUI7UUFDL0MsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUM3QixPQUFPLE9BQU8sRUFBRSxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUM7WUFDUixPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sY0FBYyxDQUFDLElBQTZCLEVBQUUsTUFBYztRQUNsRSxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZCLE1BQU0sS0FBSyxHQUE0QixFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDbkQsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEMsS0FBSyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sSUFBSSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDbkMsSUFBSSxLQUFLLENBQUMsU0FBUztZQUFFLEtBQUssQ0FBQyxTQUFTLEdBQUcsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3RFLElBQUksS0FBSyxDQUFDLElBQUk7WUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxzQkFBc0IsQ0FDNUIsU0FBaUIsRUFDakIsVUFBZ0QsRUFDaEQsV0FBb0I7O1FBRXBCLCtGQUErRjtRQUMvRixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRW5DLG1CQUFtQjtRQUNuQixNQUFNLGlCQUFpQixHQUFHLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25ELElBQUksaUJBQWlCLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRztnQkFDeEIsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUErQjtnQkFDaEQsR0FBRyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxVQUFVLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3pGLENBQUM7UUFDWCxDQUFDO1FBRUQsb0RBQW9EO1FBQ3BELElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNsRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQWlDLENBQUMsQ0FBQztnQkFDNUQsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsd0JBQXdCO1FBQ3hCLElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUM3RCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3ZCLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUF3QyxDQUFDO2dCQUMvRCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FDeEMsV0FBVyxFQUNYLFNBQVMsRUFDVCxDQUFBLE1BQUEsVUFBVSxDQUFDLElBQUksMENBQUUsV0FBVyxNQUFJLE1BQUEsVUFBVSxDQUFDLElBQUksMENBQUUsSUFBSSxDQUFBLEVBQ3JELFVBQVUsQ0FBQyxrQkFBa0IsQ0FDOUIsQ0FBQztRQUNKLENBQUM7UUFFRCw2RUFBNkU7UUFDN0UsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sV0FBVyxHQUFHLENBQUEsTUFBQSxVQUFVLENBQUMsSUFBSSwwQ0FBRSxXQUFXLE1BQUksTUFBQSxVQUFVLENBQUMsSUFBSSwwQ0FBRSxJQUFJLENBQUEsSUFBSSxTQUFTLENBQUM7WUFDdkYsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixDQUN6QyxTQUFTLEVBQ1QsV0FBVyxFQUNYLE1BQUEsVUFBVSxDQUFDLElBQUksMENBQUUsV0FBVyxFQUM1QixVQUFVLENBQUMsa0JBQWtCLENBQzlCLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQzs7QUEzMUJEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNhLG9DQUFpQixHQUFHLEdBQUcsQUFBTixDQUFPIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGbG93Y2hhcnRUcmF2ZXJzZXIg4oCUIFByZS1vcmRlciBERlMgdHJhdmVyc2FsIG9mIFN0YWdlTm9kZSBncmFwaC5cbiAqXG4gKiBVbmlmaWVkIHRyYXZlcnNhbCBhbGdvcml0aG0gZm9yIGFsbCBub2RlIHNoYXBlczpcbiAqICAgY29uc3QgcHJlID0gYXdhaXQgcHJlcCgpO1xuICogICBjb25zdCBbeCwgeV0gPSBhd2FpdCBQcm9taXNlLmFsbChbZngocHJlKSwgZnkocHJlKV0pO1xuICogICByZXR1cm4gYXdhaXQgbmV4dCh4LCB5KTtcbiAqXG4gKiBGb3IgZWFjaCBub2RlLCBleGVjdXRlTm9kZSBmb2xsb3dzIDcgcGhhc2VzOlxuICogICAwLiBDTEFTU0lGWSAg4oCUIHN1YmZsb3cgZGV0ZWN0aW9uLCBlYXJseSBkZWxlZ2F0aW9uXG4gKiAgIDEuIFZBTElEQVRFICDigJQgbm9kZSBpbnZhcmlhbnRzLCByb2xlIG1hcmtlcnNcbiAqICAgMi4gRVhFQ1VURSAgIOKAlCBydW4gc3RhZ2UgZm4sIGNvbW1pdCwgYnJlYWsgY2hlY2tcbiAqICAgMy4gRFlOQU1JQyAgIOKAlCBTdGFnZU5vZGUgcmV0dXJuIGRldGVjdGlvbiwgc3ViZmxvdyBhdXRvLXJlZ2lzdHJhdGlvbiwgc3RydWN0dXJlIHVwZGF0ZXNcbiAqICAgNC4gQ0hJTERSRU4gIOKAlCBmb3JrL3NlbGVjdG9yL2RlY2lkZXIgZGlzcGF0Y2hcbiAqICAgNS4gQ09OVElOVUUgIOKAlCBkeW5hbWljIG5leHQgLyBsaW5lYXIgbmV4dCByZXNvbHV0aW9uXG4gKiAgIDYuIExFQUYgICAgICDigJQgbm8gY29udGludWF0aW9uLCByZXR1cm4gb3V0cHV0XG4gKlxuICogQnJlYWsgc2VtYW50aWNzOiBJZiBhIHN0YWdlIGNhbGxzIGJyZWFrRm4oKSwgY29tbWl0IGFuZCBTVE9QLlxuICogUGF0Y2ggbW9kZWw6IFN0YWdlIHdyaXRlcyBpbnRvIGxvY2FsIHBhdGNoOyBjb21taXRQYXRjaCgpIGFmdGVyIHJldHVybiBvciB0aHJvdy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU2NvcGVQcm90ZWN0aW9uTW9kZSB9IGZyb20gJy4uLy4uL3Njb3BlL3Byb3RlY3Rpb24vdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNTdGFnZU5vZGVSZXR1cm4gfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHsgQ2hpbGRyZW5FeGVjdXRvciB9IGZyb20gJy4uL2hhbmRsZXJzL0NoaWxkcmVuRXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgQ29udGludWF0aW9uUmVzb2x2ZXIgfSBmcm9tICcuLi9oYW5kbGVycy9Db250aW51YXRpb25SZXNvbHZlci5qcyc7XG5pbXBvcnQgeyBEZWNpZGVySGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL0RlY2lkZXJIYW5kbGVyLmpzJztcbmltcG9ydCB7IEV4dHJhY3RvclJ1bm5lciB9IGZyb20gJy4uL2hhbmRsZXJzL0V4dHJhY3RvclJ1bm5lci5qcyc7XG5pbXBvcnQgeyBOb2RlUmVzb2x2ZXIgfSBmcm9tICcuLi9oYW5kbGVycy9Ob2RlUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgUnVudGltZVN0cnVjdHVyZU1hbmFnZXIgfSBmcm9tICcuLi9oYW5kbGVycy9SdW50aW1lU3RydWN0dXJlTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWxlY3RvckhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9TZWxlY3RvckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgU3RhZ2VSdW5uZXIgfSBmcm9tICcuLi9oYW5kbGVycy9TdGFnZVJ1bm5lci5qcyc7XG5pbXBvcnQgeyBTdWJmbG93RXhlY3V0b3IgfSBmcm9tICcuLi9oYW5kbGVycy9TdWJmbG93RXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgRmxvd1JlY29yZGVyRGlzcGF0Y2hlciB9IGZyb20gJy4uL25hcnJhdGl2ZS9GbG93UmVjb3JkZXJEaXNwYXRjaGVyLmpzJztcbmltcG9ydCB7IE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4uL25hcnJhdGl2ZS9OYXJyYXRpdmVGbG93UmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgTnVsbENvbnRyb2xGbG93TmFycmF0aXZlR2VuZXJhdG9yIH0gZnJvbSAnLi4vbmFycmF0aXZlL051bGxDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dSZWNvcmRlciwgSUNvbnRyb2xGbG93TmFycmF0aXZlLCBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB7IGJ1aWxkUnVudGltZVN0YWdlSWQgfSBmcm9tICcuLi9ydW50aW1lU3RhZ2VJZC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEV4dHJhY3RvckVycm9yLFxuICBIYW5kbGVyRGVwcyxcbiAgSUV4ZWN1dGlvblJ1bnRpbWUsXG4gIElMb2dnZXIsXG4gIE5vZGVSZXN1bHRUeXBlLFxuICBTY29wZUZhY3RvcnksXG4gIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgU3RhZ2VGdW5jdGlvbixcbiAgU3RhZ2VOb2RlLFxuICBTdHJlYW1IYW5kbGVycyxcbiAgU3ViZmxvd1Jlc3VsdCxcbiAgU3ViZmxvd1RyYXZlcnNlckZhY3RvcnksXG4gIFRyYXZlcnNhbEV4dHJhY3RvcixcbiAgVHJhdmVyc2FsUmVzdWx0LFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhdmVyc2VyT3B0aW9uczxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+O1xuICBzY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuICBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcHJvcGFnYXRlcyB0byBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LiAqL1xuICBleGVjdXRpb25FbnY/OiBpbXBvcnQoJy4uLy4uL2VuZ2luZS90eXBlcycpLkV4ZWN1dGlvbkVudjtcbiAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgZXh0cmFjdG9yPzogVHJhdmVyc2FsRXh0cmFjdG9yO1xuICBzY29wZVByb3RlY3Rpb25Nb2RlPzogU2NvcGVQcm90ZWN0aW9uTW9kZTtcbiAgc3ViZmxvd3M/OiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+O1xuICBlbnJpY2hTbmFwc2hvdHM/OiBib29sZWFuO1xuICBuYXJyYXRpdmVFbmFibGVkPzogYm9vbGVhbjtcbiAgYnVpbGRUaW1lU3RydWN0dXJlPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICBsb2dnZXI6IElMb2dnZXI7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKiogUHJlLWNvbmZpZ3VyZWQgRmxvd1JlY29yZGVycyB0byBhdHRhY2ggd2hlbiBuYXJyYXRpdmUgaXMgZW5hYmxlZC4gKi9cbiAgZmxvd1JlY29yZGVycz86IEZsb3dSZWNvcmRlcltdO1xuICAvKipcbiAgICogUHJlLWNvbmZpZ3VyZWQgbmFycmF0aXZlIGdlbmVyYXRvci4gSWYgcHJvdmlkZWQsIHRha2VzIHByZWNlZGVuY2Ugb3ZlclxuICAgKiBmbG93UmVjb3JkZXJzIGFuZCBuYXJyYXRpdmVFbmFibGVkLiBVc2VkIGJ5IHRoZSBzdWJmbG93IHRyYXZlcnNlciBmYWN0b3J5XG4gICAqIHRvIHNoYXJlIHRoZSBwYXJlbnQncyBuYXJyYXRpdmUgZ2VuZXJhdG9yIHdpdGggc3ViZmxvdyB0cmF2ZXJzZXJzLlxuICAgKi9cbiAgbmFycmF0aXZlR2VuZXJhdG9yPzogSUNvbnRyb2xGbG93TmFycmF0aXZlO1xuICAvKipcbiAgICogTWF4aW11bSByZWN1cnNpdmUgZXhlY3V0ZU5vZGUgZGVwdGguIERlZmF1bHRzIHRvIEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSCAoNTAwKS5cbiAgICogT3ZlcnJpZGUgaW4gdGVzdHMgb3IgdW51c3VhbGx5IGRlZXAgcGlwZWxpbmVzLlxuICAgKi9cbiAgbWF4RGVwdGg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBXaGVuIHRoaXMgdHJhdmVyc2VyIHJ1bnMgaW5zaWRlIGEgc3ViZmxvdywgc2V0IHRoaXMgdG8gdGhlIHN1YmZsb3cncyBJRC5cbiAgICogUHJvcGFnYXRlZCB0byBUcmF2ZXJzYWxDb250ZXh0IHNvIG5hcnJhdGl2ZSBlbnRyaWVzIGNhcnJ5IHRoZSBjb3JyZWN0IHN1YmZsb3dJZC5cbiAgICovXG4gIHBhcmVudFN1YmZsb3dJZD86IHN0cmluZztcbiAgLyoqIFNoYXJlZCBleGVjdXRpb24gY291bnRlciBmcm9tIHBhcmVudCB0cmF2ZXJzZXIuIFN1YmZsb3dzIGNvbnRpbnVlIHRoZSBwYXJlbnQncyBudW1iZXJpbmcuICovXG4gIGV4ZWN1dGlvbkNvdW50ZXI/OiB7IHZhbHVlOiBudW1iZXIgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEZsb3djaGFydFRyYXZlcnNlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSByZWFkb25seSByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSBzdGFnZU1hcDogTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+PjtcbiAgcHJpdmF0ZSByZWFkb25seSBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgcHJpdmF0ZSBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IElMb2dnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50U3ViZmxvd0lkPzogc3RyaW5nO1xuXG4gIC8vIEhhbmRsZXIgbW9kdWxlc1xuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVSZXNvbHZlcjogTm9kZVJlc29sdmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW5FeGVjdXRvcjogQ2hpbGRyZW5FeGVjdXRvcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YmZsb3dFeGVjdXRvcjogU3ViZmxvd0V4ZWN1dG9yPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhZ2VSdW5uZXI6IFN0YWdlUnVubmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGludWF0aW9uUmVzb2x2ZXI6IENvbnRpbnVhdGlvblJlc29sdmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVjaWRlckhhbmRsZXI6IERlY2lkZXJIYW5kbGVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0b3JIYW5kbGVyOiBTZWxlY3RvckhhbmRsZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdHJ1Y3R1cmVNYW5hZ2VyOiBSdW50aW1lU3RydWN0dXJlTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBleHRyYWN0b3JSdW5uZXI6IEV4dHJhY3RvclJ1bm5lcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IG5hcnJhdGl2ZUdlbmVyYXRvcjogSUNvbnRyb2xGbG93TmFycmF0aXZlO1xuICBwcml2YXRlIHJlYWRvbmx5IGZsb3dSZWNvcmRlckRpc3BhdGNoZXI6IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIgfCB1bmRlZmluZWQ7XG5cbiAgLy8gRXhlY3V0aW9uIHN0YXRlXG4gIHByaXZhdGUgc3ViZmxvd1Jlc3VsdHM6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBQZXItdHJhdmVyc2VyIHNldCBvZiBsYXp5IHN1YmZsb3cgSURzIHRoYXQgaGF2ZSBiZWVuIHJlc29sdmVkIGJ5IFRISVMgcnVuLlxuICAgKiBVc2VkIGluc3RlYWQgb2Ygd3JpdGluZyBgbm9kZS5zdWJmbG93UmVzb2x2ZXIgPSB1bmRlZmluZWRgIGJhY2sgdG8gdGhlIHNoYXJlZFxuICAgKiBTdGFnZU5vZGUgZ3JhcGgg4oCUIGF2b2lkcyBhIHJhY2Ugd2hlcmUgYSBjb25jdXJyZW50IHRyYXZlcnNlciBjbGVhcnMgdGhlIHNoYXJlZFxuICAgKiByZXNvbHZlciBiZWZvcmUgYW5vdGhlciB0cmF2ZXJzZXIgaGFzIGZpbmlzaGVkIHVzaW5nIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXNvbHZlZExhenlTdWJmbG93cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBSZWN1cnNpb24gZGVwdGggY291bnRlciBmb3IgZXhlY3V0ZU5vZGUuXG4gICAqIEVhY2ggcmVjdXJzaXZlIGV4ZWN1dGVOb2RlIGNhbGwgaW5jcmVtZW50cyB0aGlzOyBkZWNyZW1lbnRzIG9uIGV4aXQgKHRyeS9maW5hbGx5KS5cbiAgICogUHJldmVudHMgY2FsbC1zdGFjayBvdmVyZmxvdyBvbiBpbmZpbml0ZSBsb29wcyBvciBleGNlc3NpdmVseSBkZWVwIHN0YWdlIGNoYWlucy5cbiAgICovXG4gIHByaXZhdGUgX2V4ZWN1dGVEZXB0aCA9IDA7XG5cbiAgLyoqXG4gICAqIFNoYXJlZCBtdXRhYmxlIGV4ZWN1dGlvbiBjb3VudGVyIOKAlCBtb25vdG9uaWMsIGluY3JlbWVudGVkIHBlciBzdGFnZSBleGVjdXRpb24uXG4gICAqIFNoYXJlZCB3aXRoIGNoaWxkIHRyYXZlcnNlcnMgKHN1YmZsb3dzKSBzbyBpbmRpY2VzIGFyZSBnbG9iYWxseSB1bmlxdWUgd2l0aGluIGEgcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZXhlY3V0aW9uQ291bnRlcjogeyB2YWx1ZTogbnVtYmVyIH07XG5cbiAgLyoqXG4gICAqIFBlci1pbnN0YW5jZSBtYXhpbXVtIGRlcHRoIChzZXQgZnJvbSBUcmF2ZXJzZXJPcHRpb25zLm1heERlcHRoIG9yIHRoZSBjbGFzcyBkZWZhdWx0KS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX21heERlcHRoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgbWF4aW11bSByZWN1cnNpdmUgZXhlY3V0ZU5vZGUgZGVwdGggYmVmb3JlIGFuIGVycm9yIGlzIHRocm93bi5cbiAgICogNTAwIGNvbWZvcnRhYmx5IGNvdmVycyBhbnkgcmVhbGlzdGljIHBpcGVsaW5lIGRlcHRoIChpbmNsdWRpbmcgZGVlcGx5IG5lc3RlZFxuICAgKiBzdWJmbG93cykgd2hpbGUgcHJldmVudGluZyBjYWxsLXN0YWNrIG92ZXJmbG93ICh+MTAgMDAwIGZyYW1lcyBpbiBWOCkuXG4gICAqXG4gICAqICoqTm90ZSBvbiBjb3VudGluZzoqKiB0aGUgY291bnRlciBpbmNyZW1lbnRzIG9uY2UgcGVyIGBleGVjdXRlTm9kZWAgY2FsbCwgbm90IG9uY2UgcGVyXG4gICAqIGxvZ2ljYWwgdXNlciBzdGFnZS4gU3ViZmxvdyByb290IGVudHJ5IGFuZCBzdWJmbG93IGNvbnRpbnVhdGlvbiBhZnRlciByZXR1cm4gZWFjaCBjb3N0XG4gICAqIG9uZSB0aWNrLiBGb3IgcGlwZWxpbmVzIHdpdGggbWFueSBuZXN0ZWQgc3ViZmxvd3MsIGJ1ZGdldCByb3VnaGx5IDIgw5cgKGF2ZyBzdGFnZXMgcGVyXG4gICAqIHN1YmZsb3cpIG9mIGhlYWRyb29tIHdoZW4gY29tcHV0aW5nIGEgY3VzdG9tIGBtYXhEZXB0aGAgdmlhIGBSdW5PcHRpb25zLm1heERlcHRoYC5cbiAgICpcbiAgICogKipOb3RlIG9uIGxvb3BzOioqIGZvciBgbG9vcFRvKClgIHBpcGVsaW5lcywgdGhpcyBkZXB0aCBndWFyZCBhbmQgYENvbnRpbnVhdGlvblJlc29sdmVyYCdzXG4gICAqIGl0ZXJhdGlvbiBsaW1pdCBhcmUgaW5kZXBlbmRlbnQg4oCUIHRoZSBsb3dlciBvbmUgZmlyZXMgZmlyc3QuIFRoZSBkZWZhdWx0IGRlcHRoIGd1YXJkICg1MDApXG4gICAqIGZpcmVzIGJlZm9yZSB0aGUgZGVmYXVsdCBpdGVyYXRpb24gbGltaXQgKDEwMDApIGZvciBsb29wLWhlYXZ5IHBpcGVsaW5lcy5cbiAgICpcbiAgICogQHJlbWFya3MgTm90IHNhZmUgZm9yIGNvbmN1cnJlbnQgYC5leGVjdXRlKClgIGNhbGxzIG9uIHRoZSBzYW1lIGluc3RhbmNlIOKAlCBjb25jdXJyZW50XG4gICAqIGV4ZWN1dGlvbnMgcmFjZSBvbiBgX2V4ZWN1dGVEZXB0aGAuIFVzZSBhIHNlcGFyYXRlIGBGbG93Y2hhcnRUcmF2ZXJzZXJgIHBlciBjb25jdXJyZW50XG4gICAqIGV4ZWN1dGlvbi4gYEZsb3dDaGFydEV4ZWN1dG9yLnJ1bigpYCBhbHdheXMgY3JlYXRlcyBhIGZyZXNoIHRyYXZlcnNlciBwZXIgY2FsbC5cbiAgICovXG4gIHN0YXRpYyByZWFkb25seSBNQVhfRVhFQ1VURV9ERVBUSCA9IDUwMDtcblxuICBjb25zdHJ1Y3RvcihvcHRzOiBUcmF2ZXJzZXJPcHRpb25zPFRPdXQsIFRTY29wZT4pIHtcbiAgICBjb25zdCBtYXhEZXB0aCA9IG9wdHMubWF4RGVwdGggPz8gRmxvd2NoYXJ0VHJhdmVyc2VyLk1BWF9FWEVDVVRFX0RFUFRIO1xuICAgIGlmIChtYXhEZXB0aCA8IDEpIHRocm93IG5ldyBFcnJvcignRmxvd2NoYXJ0VHJhdmVyc2VyOiBtYXhEZXB0aCBtdXN0IGJlID49IDEnKTtcbiAgICB0aGlzLl9tYXhEZXB0aCA9IG1heERlcHRoO1xuICAgIHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIgPSBvcHRzLmV4ZWN1dGlvbkNvdW50ZXIgPz8geyB2YWx1ZTogMCB9O1xuICAgIHRoaXMucm9vdCA9IG9wdHMucm9vdDtcbiAgICAvLyBTaGFsbG93LWNvcHkgc3RhZ2VNYXAgYW5kIHN1YmZsb3dzIHNvIHRoYXQgbGF6eS1yZXNvbHV0aW9uIG11dGF0aW9uc1xuICAgIC8vIChwcmVmaXhlZCBlbnRyaWVzIGFkZGVkIGR1cmluZyBleGVjdXRpb24pIHN0YXkgc2NvcGVkIHRvIFRISVMgdHJhdmVyc2VyXG4gICAgLy8gYW5kIGRvIG5vdCBlc2NhcGUgdG8gdGhlIHNoYXJlZCBGbG93Q2hhcnQgb2JqZWN0LiBXaXRob3V0IHRoZSBjb3B5LFxuICAgIC8vIGNvbmN1cnJlbnQgRmxvd0NoYXJ0RXhlY3V0b3IgcnVucyBzaGFyaW5nIHRoZSBzYW1lIEZsb3dDaGFydCB3b3VsZCByYWNlXG4gICAgLy8gb24gdGhlc2UgdHdvIG11dGFibGUgZGljdGlvbmFyaWVzLlxuICAgIHRoaXMuc3RhZ2VNYXAgPSBuZXcgTWFwKG9wdHMuc3RhZ2VNYXApO1xuICAgIHRoaXMuZXhlY3V0aW9uUnVudGltZSA9IG9wdHMuZXhlY3V0aW9uUnVudGltZTtcbiAgICB0aGlzLnN1YmZsb3dzID0gb3B0cy5zdWJmbG93cyA/IHsgLi4ub3B0cy5zdWJmbG93cyB9IDoge307XG4gICAgdGhpcy5sb2dnZXIgPSBvcHRzLmxvZ2dlcjtcbiAgICB0aGlzLnNpZ25hbCA9IG9wdHMuc2lnbmFsO1xuICAgIHRoaXMucGFyZW50U3ViZmxvd0lkID0gb3B0cy5wYXJlbnRTdWJmbG93SWQ7XG5cbiAgICAvLyBTdHJ1Y3R1cmUgbWFuYWdlciAoZGVlcC1jbG9uZXMgYnVpbGQtdGltZSBzdHJ1Y3R1cmUpXG4gICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyID0gbmV3IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyKCk7XG4gICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLmluaXQob3B0cy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuXG4gICAgLy8gRXh0cmFjdG9yIHJ1bm5lclxuICAgIHRoaXMuZXh0cmFjdG9yUnVubmVyID0gbmV3IEV4dHJhY3RvclJ1bm5lcihcbiAgICAgIG9wdHMuZXh0cmFjdG9yLFxuICAgICAgb3B0cy5lbnJpY2hTbmFwc2hvdHMgPz8gZmFsc2UsXG4gICAgICB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUsXG4gICAgICB0aGlzLmxvZ2dlcixcbiAgICApO1xuXG4gICAgLy8gTmFycmF0aXZlIGdlbmVyYXRvclxuICAgIC8vIFByaW9yaXR5OiBleHBsaWNpdCBuYXJyYXRpdmVHZW5lcmF0b3IgPiBmbG93UmVjb3JkZXJzID4gZGVmYXVsdCBOYXJyYXRpdmVGbG93UmVjb3JkZXIgPiBudWxsLlxuICAgIC8vIFN1YmZsb3cgdHJhdmVyc2VycyByZWNlaXZlIHRoZSBwYXJlbnQncyBuYXJyYXRpdmVHZW5lcmF0b3Igc28gYWxsIGV2ZW50cyBmbG93IHRvIG9uZSBwbGFjZS5cbiAgICBpZiAob3B0cy5uYXJyYXRpdmVHZW5lcmF0b3IpIHtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yID0gb3B0cy5uYXJyYXRpdmVHZW5lcmF0b3I7XG4gICAgfSBlbHNlIGlmIChvcHRzLm5hcnJhdGl2ZUVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSBuZXcgRmxvd1JlY29yZGVyRGlzcGF0Y2hlcigpO1xuICAgICAgdGhpcy5mbG93UmVjb3JkZXJEaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcblxuICAgICAgLy8gSWYgY3VzdG9tIEZsb3dSZWNvcmRlcnMgYXJlIHByb3ZpZGVkLCB1c2UgdGhlbTsgb3RoZXJ3aXNlIGF0dGFjaCBkZWZhdWx0IE5hcnJhdGl2ZUZsb3dSZWNvcmRlclxuICAgICAgaWYgKG9wdHMuZmxvd1JlY29yZGVycyAmJiBvcHRzLmZsb3dSZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZGVyIG9mIG9wdHMuZmxvd1JlY29yZGVycykge1xuICAgICAgICAgIGRpc3BhdGNoZXIuYXR0YWNoKHJlY29yZGVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzcGF0Y2hlci5hdHRhY2gobmV3IE5hcnJhdGl2ZUZsb3dSZWNvcmRlcigpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IgPSBkaXNwYXRjaGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciA9IG5ldyBOdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IoKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBzaGFyZWQgZGVwcyBiYWdcbiAgICBjb25zdCBkZXBzID0gdGhpcy5jcmVhdGVEZXBzKG9wdHMpO1xuXG4gICAgLy8gQnVpbGQgTygxKSBub2RlIElEIG1hcCBmcm9tIHRoZSByb290IGdyYXBoIChhdm9pZHMgcmVwZWF0ZWQgREZTIG9uIGV2ZXJ5IGxvb3BUbygpKVxuICAgIGNvbnN0IG5vZGVJZE1hcCA9IHRoaXMuYnVpbGROb2RlSWRNYXAob3B0cy5yb290KTtcblxuICAgIC8vIEluaXRpYWxpemUgaGFuZGxlciBtb2R1bGVzXG4gICAgdGhpcy5ub2RlUmVzb2x2ZXIgPSBuZXcgTm9kZVJlc29sdmVyKGRlcHMsIG5vZGVJZE1hcCk7XG4gICAgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yID0gbmV3IENoaWxkcmVuRXhlY3V0b3IoZGVwcywgdGhpcy5leGVjdXRlTm9kZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLnN0YWdlUnVubmVyID0gbmV3IFN0YWdlUnVubmVyKGRlcHMpO1xuICAgIHRoaXMuY29udGludWF0aW9uUmVzb2x2ZXIgPSBuZXcgQ29udGludWF0aW9uUmVzb2x2ZXIoZGVwcywgdGhpcy5ub2RlUmVzb2x2ZXIsIChub2RlSWQsIGNvdW50KSA9PlxuICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUl0ZXJhdGlvbkNvdW50KG5vZGVJZCwgY291bnQpLFxuICAgICk7XG4gICAgdGhpcy5kZWNpZGVySGFuZGxlciA9IG5ldyBEZWNpZGVySGFuZGxlcihkZXBzKTtcbiAgICB0aGlzLnNlbGVjdG9ySGFuZGxlciA9IG5ldyBTZWxlY3RvckhhbmRsZXIoZGVwcywgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yKTtcbiAgICB0aGlzLnN1YmZsb3dFeGVjdXRvciA9IG5ldyBTdWJmbG93RXhlY3V0b3IoZGVwcywgdGhpcy5jcmVhdGVTdWJmbG93VHJhdmVyc2VyRmFjdG9yeShvcHRzKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZmFjdG9yeSB0aGF0IHByb2R1Y2VzIEZsb3djaGFydFRyYXZlcnNlciBpbnN0YW5jZXMgZm9yIHN1YmZsb3cgZXhlY3V0aW9uLlxuICAgKiBDYXB0dXJlcyBwYXJlbnQgY29uZmlnIGluIGNsb3N1cmUg4oCUIFN1YmZsb3dFeGVjdXRvciBwcm92aWRlcyBzdWJmbG93LXNwZWNpZmljIG92ZXJyaWRlcy5cbiAgICogRWFjaCBzdWJmbG93IGdldHMgYSBmdWxsIHRyYXZlcnNlciB3aXRoIGFsbCA3IHBoYXNlcyAoZGVjaWRlcnMsIHNlbGVjdG9ycywgbG9vcHMsIGV0Yy4pLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVTdWJmbG93VHJhdmVyc2VyRmFjdG9yeShcbiAgICBwYXJlbnRPcHRzOiBUcmF2ZXJzZXJPcHRpb25zPFRPdXQsIFRTY29wZT4sXG4gICk6IFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5PFRPdXQsIFRTY29wZT4ge1xuICAgIC8vIENhcHR1cmUgcmVmZXJlbmNlcyB0byBtdXRhYmxlIHN0YXRlIOKAlCBmYWN0b3J5IHJlYWRzIHRoZSBDVVJSRU5UIHN0YXRlIHdoZW4gY2FsbGVkLFxuICAgIC8vIG5vdCB0aGUgc3RhdGUgYXQgZmFjdG9yeSBjcmVhdGlvbiB0aW1lLiBUaGlzIGlzIGNvcnJlY3QgYmVjYXVzZSBsYXp5IHN1YmZsb3cgcmVzb2x1dGlvblxuICAgIC8vIG1heSBhZGQgZW50cmllcyB0byBzdGFnZU1hcC9zdWJmbG93cyBiZWZvcmUgYSBuZXN0ZWQgc3ViZmxvdyBpcyBlbmNvdW50ZXJlZC5cbiAgICBjb25zdCBwYXJlbnRTdGFnZU1hcCA9IHRoaXMuc3RhZ2VNYXA7XG4gICAgY29uc3QgcGFyZW50U3ViZmxvd3MgPSB0aGlzLnN1YmZsb3dzO1xuICAgIGNvbnN0IG5hcnJhdGl2ZUdlbmVyYXRvciA9IHRoaXMubmFycmF0aXZlR2VuZXJhdG9yO1xuXG4gICAgcmV0dXJuIChzdWJmbG93T3B0cykgPT4ge1xuICAgICAgY29uc3QgdHJhdmVyc2VyID0gbmV3IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+KHtcbiAgICAgICAgcm9vdDogc3ViZmxvd09wdHMucm9vdCxcbiAgICAgICAgc3RhZ2VNYXA6IHBhcmVudFN0YWdlTWFwLCAvLyBDb25zdHJ1Y3RvciBzaGFsbG93LWNvcGllcyB0aGlzXG4gICAgICAgIHNjb3BlRmFjdG9yeTogcGFyZW50T3B0cy5zY29wZUZhY3RvcnksXG4gICAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHN1YmZsb3dPcHRzLmV4ZWN1dGlvblJ1bnRpbWUsXG4gICAgICAgIHJlYWRPbmx5Q29udGV4dDogc3ViZmxvd09wdHMucmVhZE9ubHlDb250ZXh0LFxuICAgICAgICBleGVjdXRpb25FbnY6IHBhcmVudE9wdHMuZXhlY3V0aW9uRW52LFxuICAgICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiBwYXJlbnRPcHRzLnRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICAgIHN0cmVhbUhhbmRsZXJzOiBwYXJlbnRPcHRzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgICBleHRyYWN0b3I6IHBhcmVudE9wdHMuZXh0cmFjdG9yLFxuICAgICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBwYXJlbnRPcHRzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICAgIHN1YmZsb3dzOiBwYXJlbnRTdWJmbG93cywgLy8gQ29uc3RydWN0b3Igc2hhbGxvdy1jb3BpZXMgdGhpc1xuICAgICAgICBlbnJpY2hTbmFwc2hvdHM6IHBhcmVudE9wdHMuZW5yaWNoU25hcHNob3RzLFxuICAgICAgICBuYXJyYXRpdmVHZW5lcmF0b3IsIC8vIFNoYXJlIHBhcmVudCdzIOKAlCBhbGwgZXZlbnRzIGZsb3cgdG8gb25lIHBsYWNlXG4gICAgICAgIGxvZ2dlcjogcGFyZW50T3B0cy5sb2dnZXIsXG4gICAgICAgIHNpZ25hbDogcGFyZW50T3B0cy5zaWduYWwsXG4gICAgICAgIG1heERlcHRoOiB0aGlzLl9tYXhEZXB0aCxcbiAgICAgICAgcGFyZW50U3ViZmxvd0lkOiBzdWJmbG93T3B0cy5zdWJmbG93SWQsXG4gICAgICAgIGV4ZWN1dGlvbkNvdW50ZXI6IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIsIC8vIFNoYXJlIGNvdW50ZXIg4oCUIHN1YmZsb3cgY29udGludWVzIGdsb2JhbCBudW1iZXJpbmdcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBleGVjdXRlOiAoKSA9PiB0cmF2ZXJzZXIuZXhlY3V0ZSgpLFxuICAgICAgICBnZXRTdWJmbG93UmVzdWx0czogKCkgPT4gdHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCksXG4gICAgICB9O1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURlcHMob3B0czogVHJhdmVyc2VyT3B0aW9uczxUT3V0LCBUU2NvcGU+KTogSGFuZGxlckRlcHM8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YWdlTWFwOiB0aGlzLnN0YWdlTWFwLFxuICAgICAgcm9vdDogdGhpcy5yb290LFxuICAgICAgZXhlY3V0aW9uUnVudGltZTogdGhpcy5leGVjdXRpb25SdW50aW1lLFxuICAgICAgc2NvcGVGYWN0b3J5OiBvcHRzLnNjb3BlRmFjdG9yeSxcbiAgICAgIHN1YmZsb3dzOiB0aGlzLnN1YmZsb3dzLFxuICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjogb3B0cy50aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgc3RyZWFtSGFuZGxlcnM6IG9wdHMuc3RyZWFtSGFuZGxlcnMsXG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBvcHRzLnNjb3BlUHJvdGVjdGlvbk1vZGUgPz8gJ2Vycm9yJyxcbiAgICAgIHJlYWRPbmx5Q29udGV4dDogb3B0cy5yZWFkT25seUNvbnRleHQsXG4gICAgICBleGVjdXRpb25FbnY6IG9wdHMuZXhlY3V0aW9uRW52LFxuICAgICAgbmFycmF0aXZlR2VuZXJhdG9yOiB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvcixcbiAgICAgIGxvZ2dlcjogdGhpcy5sb2dnZXIsXG4gICAgICBzaWduYWw6IG9wdHMuc2lnbmFsLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgUHVibGljIEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBleGVjdXRlKGJyYW5jaFBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dDtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlTm9kZSh0aGlzLnJvb3QsIGNvbnRleHQsIHsgc2hvdWxkQnJlYWs6IGZhbHNlIH0sIGJyYW5jaFBhdGggPz8gJycpO1xuICB9XG5cbiAgZ2V0UnVudGltZVN0cnVjdHVyZSgpOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0cnVjdHVyZU1hbmFnZXIuZ2V0U3RydWN0dXJlKCk7XG4gIH1cblxuICBnZXRTbmFwc2hvdCgpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRpb25SdW50aW1lLmdldFNuYXBzaG90KCk7XG4gIH1cblxuICBnZXRSdW50aW1lKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGlvblJ1bnRpbWU7XG4gIH1cblxuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUuc2V0Um9vdE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRpb25SdW50aW1lLmdldFBpcGVsaW5lcygpO1xuICB9XG5cbiAgZ2V0UnVudGltZVJvb3QoKTogU3RhZ2VOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5yb290O1xuICB9XG5cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnN1YmZsb3dSZXN1bHRzO1xuICB9XG5cbiAgZ2V0RXh0cmFjdGVkUmVzdWx0czxUUmVzdWx0ID0gdW5rbm93bj4oKTogTWFwPHN0cmluZywgVFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RvclJ1bm5lci5nZXRFeHRyYWN0ZWRSZXN1bHRzKCkgYXMgTWFwPHN0cmluZywgVFJlc3VsdD47XG4gIH1cblxuICBnZXRFeHRyYWN0b3JFcnJvcnMoKTogRXh0cmFjdG9yRXJyb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXh0cmFjdG9yUnVubmVyLmdldEV4dHJhY3RvckVycm9ycygpO1xuICB9XG5cbiAgZ2V0TmFycmF0aXZlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IuZ2V0U2VudGVuY2VzKCk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgRmxvd1JlY29yZGVyRGlzcGF0Y2hlciwgb3IgdW5kZWZpbmVkIGlmIG5hcnJhdGl2ZSBpcyBkaXNhYmxlZC4gKi9cbiAgZ2V0Rmxvd1JlY29yZGVyRGlzcGF0Y2hlcigpOiBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mbG93UmVjb3JkZXJEaXNwYXRjaGVyO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIENvcmUgVHJhdmVyc2FsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiBPKDEpIElE4oaSbm9kZSBtYXAgZnJvbSB0aGUgcm9vdCBncmFwaC5cbiAgICogVXNlZCBieSBOb2RlUmVzb2x2ZXIgdG8gYXZvaWQgcmVwZWF0ZWQgREZTIG9uIGV2ZXJ5IGxvb3BUbygpIGNhbGwuXG4gICAqIERlcHRoLWd1YXJkZWQgYXQgTUFYX0VYRUNVVEVfREVQVEggdG8gcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24gb24gY3ljbGljIGdyYXBocy5cbiAgICogRHluYW1pYyBzdWJmbG93cyBhbmQgbGF6eS1yZXNvbHZlZCBub2RlcyBhcmUgYWRkZWQgdG8gc3RhZ2VNYXAgYXQgcnVudGltZSBidXQgbm90IHRvIHRoaXMgbWFwIOKAlFxuICAgKiB0aG9zZSB1c2UgdGhlIERGUyBmYWxsYmFjayBpbiBOb2RlUmVzb2x2ZXIuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTm9kZUlkTWFwKHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+IHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+KCk7XG4gICAgY29uc3QgdmlzaXQgPSAobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIGRlcHRoOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIGlmIChkZXB0aCA+IEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSCkgcmV0dXJuO1xuICAgICAgaWYgKG1hcC5oYXMobm9kZS5pZCkpIHJldHVybjsgLy8gYWxyZWFkeSB2aXNpdGVkIChhdm9pZHMgaW5maW5pdGUgbG9vcHMgb24gY3ljbGljIHJlZnMpXG4gICAgICBtYXAuc2V0KG5vZGUuaWQsIG5vZGUpO1xuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB2aXNpdChjaGlsZCwgZGVwdGggKyAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLm5leHQpIHZpc2l0KG5vZGUubmV4dCwgZGVwdGggKyAxKTtcbiAgICB9O1xuICAgIHZpc2l0KHJvb3QsIDApO1xuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YWdlRm4obm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2Ygbm9kZS5mbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG5vZGUuZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+O1xuICAgIC8vIFByaW1hcnk6IGxvb2sgdXAgYnkgaWQgKHN0YWJsZSBpZGVudGlmaWVyLCBrZXllZCBieSBGbG93Q2hhcnRCdWlsZGVyKVxuICAgIGNvbnN0IGJ5SWQgPSB0aGlzLnN0YWdlTWFwLmdldChub2RlLmlkKTtcbiAgICBpZiAoYnlJZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYnlJZDtcbiAgICAvLyBGYWxsYmFjazogbG9vayB1cCBieSBuYW1lIChzdXBwb3J0cyBoYW5kLWNyYWZ0ZWQgc3RhZ2VNYXBzIGluIHRlc3RzIGFuZCBhZHZhbmNlZCB1c2UpXG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VNYXAuZ2V0KG5vZGUubmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVTdGFnZShcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdGFnZUZ1bmM6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbjogKCkgPT4gdm9pZCxcbiAgKSB7XG4gICAgLy8gcnVudGltZVN0YWdlSWQgaXMgYXNzaWduZWQgaW4gZXhlY3V0ZU5vZGUoKSBiZWZvcmUgdHJhdmVyc2FsQ29udGV4dCBjcmVhdGlvbixcbiAgICAvLyBlbnN1cmluZyBzY29wZSBldmVudHMgYW5kIGZsb3cgZXZlbnRzIHVzZSB0aGUgc2FtZSB2YWx1ZS5cbiAgICByZXR1cm4gdGhpcy5zdGFnZVJ1bm5lci5ydW4obm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmUtb3JkZXIgREZTIHRyYXZlcnNhbCDigJQgdGhlIGNvcmUgYWxnb3JpdGhtLlxuICAgKiBFYWNoIGNhbGwgcHJvY2Vzc2VzIG9uZSBub2RlIHRocm91Z2ggYWxsIDcgcGhhc2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTm9kZShcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbGFnOiB7IHNob3VsZEJyZWFrOiBib29sZWFuIH0sXG4gICAgYnJhbmNoUGF0aD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyDilIDilIDilIAgUmVjdXJzaW9uIGRlcHRoIGd1YXJkIOKUgOKUgOKUgFxuICAgIC8vIEVhY2ggYGF3YWl0IGV4ZWN1dGVOb2RlKC4uLilgIGtlZXBzIHRoZSBjYWxsaW5nIGZyYW1lIG9uIHRoZSBzdGFjay5cbiAgICAvLyBXaXRob3V0IGEgY2FwLCBhbiBpbmZpbml0ZSBsb29wIG9yIGFuIGV4Y2Vzc2l2ZWx5IGRlZXAgc3RhZ2UgY2hhaW4gd2lsbFxuICAgIC8vIGV2ZW50dWFsbHkgb3ZlcmZsb3cgdGhlIFY4IGNhbGwgc3RhY2sgKH4xMCAwMDAgZnJhbWVzKSB3aXRoIGEgY3J5cHRpY1xuICAgIC8vIFwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIiBlcnJvci4gIFdlIGZhaWwgZWFybHkgd2l0aCBhIGNsZWFyXG4gICAgLy8gbWVzc2FnZSBzbyB1c2VycyBjYW4gZGlhZ25vc2UgdGhlIGNhdXNlIChpbmZpbml0ZSBsb29wLCBtaXNzaW5nIGJyZWFrLCBldGMuKS5cbiAgICAvLyBUaGUgaW5jcmVtZW50IGlzIGluc2lkZSBgdHJ5YCBzbyBgZmluYWxseWAgYWx3YXlzIGRlY3JlbWVudHMg4oCUIG5vIGZyYWdpbGVcbiAgICAvLyBnYXAgYmV0d2VlbiBjaGVjayBhbmQgdHJ5IGVudHJ5LlxuICAgIHRyeSB7XG4gICAgICBpZiAoKyt0aGlzLl9leGVjdXRlRGVwdGggPiB0aGlzLl9tYXhEZXB0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZsb3djaGFydFRyYXZlcnNlcjogbWF4aW11bSB0cmF2ZXJzYWwgZGVwdGggZXhjZWVkZWQgKCR7dGhpcy5fbWF4RGVwdGh9KS4gYCArXG4gICAgICAgICAgICAnQ2hlY2sgZm9yIGluZmluaXRlIGxvb3BzIG9yIG1pc3NpbmcgYnJlYWsgY29uZGl0aW9ucyBpbiB5b3VyIGZsb3djaGFydC4gJyArXG4gICAgICAgICAgICBgTGFzdCBzdGFnZTogJyR7bm9kZS5uYW1lfScuIGAgK1xuICAgICAgICAgICAgJ0ZvciBsb29wVG8oKSBwaXBlbGluZXMsIGNvbnNpZGVyIGFkZGluZyBhIGJyZWFrIGNvbmRpdGlvbiBvciB1c2luZyBSdW5PcHRpb25zLm1heERlcHRoIHRvIHJhaXNlIHRoZSBsaW1pdC4nLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBBdHRhY2ggYnVpbGRlciBtZXRhZGF0YSB0byBjb250ZXh0IGZvciBzbmFwc2hvdCBlbnJpY2htZW50XG4gICAgICBpZiAobm9kZS5kZXNjcmlwdGlvbikgY29udGV4dC5kZXNjcmlwdGlvbiA9IG5vZGUuZGVzY3JpcHRpb247XG4gICAgICBpZiAobm9kZS5pc1N1YmZsb3dSb290ICYmIG5vZGUuc3ViZmxvd0lkKSBjb250ZXh0LnN1YmZsb3dJZCA9IG5vZGUuc3ViZmxvd0lkO1xuXG4gICAgICAvLyBBc3NpZ24gcnVudGltZVN0YWdlSWQgQkVGT1JFIHRyYXZlcnNhbENvbnRleHQgY3JlYXRpb24g4oCUIGVuc3VyZXMgc2NvcGUgZXZlbnRzXG4gICAgICAvLyAoYnVmZmVyZWQgYnkgcnVudGltZVN0YWdlSWQpIGFuZCBmbG93IGV2ZW50cyAoZmx1c2hlZCBieSB0cmF2ZXJzYWxDb250ZXh0LnJ1bnRpbWVTdGFnZUlkKVxuICAgICAgLy8gdXNlIHRoZSBzYW1lIHZhbHVlLiBNdXN0IGhhcHBlbiBiZWZvcmUgZXhlY3V0ZVN0YWdlIEFORCBiZWZvcmUgdHJhdmVyc2FsQ29udGV4dC5cbiAgICAgIGNvbnN0IGlkeCA9IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUrKztcbiAgICAgIGNvbnRleHQucnVudGltZVN0YWdlSWQgPSBidWlsZFJ1bnRpbWVTdGFnZUlkKG5vZGUuaWQsIGlkeCk7XG5cbiAgICAgIC8vIEJ1aWxkIHRyYXZlcnNhbCBjb250ZXh0IGZvciByZWNvcmRlciBldmVudHMg4oCUIGNyZWF0ZWQgb25jZSBwZXIgc3RhZ2UsIHNoYXJlZCBieSBhbGwgZXZlbnRzXG4gICAgICBjb25zdCB0cmF2ZXJzYWxDb250ZXh0OiBUcmF2ZXJzYWxDb250ZXh0ID0ge1xuICAgICAgICBzdGFnZUlkOiBub2RlLmlkID8/IGNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IGNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHN0YWdlTmFtZTogbm9kZS5uYW1lLFxuICAgICAgICBwYXJlbnRTdGFnZUlkOiBjb250ZXh0LnBhcmVudD8uc3RhZ2VJZCxcbiAgICAgICAgc3ViZmxvd0lkOiBjb250ZXh0LnN1YmZsb3dJZCA/PyB0aGlzLnBhcmVudFN1YmZsb3dJZCxcbiAgICAgICAgc3ViZmxvd1BhdGg6IGJyYW5jaFBhdGggfHwgdW5kZWZpbmVkLFxuICAgICAgICBkZXB0aDogdGhpcy5jb21wdXRlQ29udGV4dERlcHRoKGNvbnRleHQpLFxuICAgICAgfTtcblxuICAgICAgLy8g4pSA4pSA4pSAIFBoYXNlIDBhOiBMQVpZIFJFU09MVkUg4oCUIGRlZmVycmVkIHN1YmZsb3cgcmVzb2x1dGlvbiDilIDilIDilIBcbiAgICAgIC8vIEd1YXJkIHVzZXMgdGhlIHBlci10cmF2ZXJzZXIgcmVzb2x2ZWRMYXp5U3ViZmxvd3Mgc2V0IChub3QgdGhlIHNoYXJlZCBub2RlKSBzb1xuICAgICAgLy8gY29uY3VycmVudCB0cmF2ZXJzZXJzIGRvIG5vdCByYWNlIG9uIG5vZGUuc3ViZmxvd1Jlc29sdmVyIG9yIGNsZWFyIGl0IGZvciBlYWNoIG90aGVyLlxuICAgICAgaWYgKG5vZGUuaXNTdWJmbG93Um9vdCAmJiBub2RlLnN1YmZsb3dSZXNvbHZlciAmJiAhdGhpcy5yZXNvbHZlZExhenlTdWJmbG93cy5oYXMobm9kZS5zdWJmbG93SWQhKSkge1xuICAgICAgICBjb25zdCByZXNvbHZlZCA9IG5vZGUuc3ViZmxvd1Jlc29sdmVyKCk7XG4gICAgICAgIGNvbnN0IHByZWZpeGVkUm9vdCA9IHRoaXMucHJlZml4Tm9kZVRyZWUocmVzb2x2ZWQucm9vdCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgbm9kZS5zdWJmbG93SWQhKTtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGUgcmVzb2x2ZWQgc3ViZmxvdyAoc2FtZSBwYXRoIGFzIGVhZ2VyIHJlZ2lzdHJhdGlvbilcbiAgICAgICAgdGhpcy5zdWJmbG93c1tub2RlLnN1YmZsb3dJZCFdID0geyByb290OiBwcmVmaXhlZFJvb3QgfTtcblxuICAgICAgICAvLyBNZXJnZSBzdGFnZU1hcCBlbnRyaWVzXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZm5dIG9mIHJlc29sdmVkLnN0YWdlTWFwKSB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ZWRLZXkgPSBgJHtub2RlLnN1YmZsb3dJZH0vJHtrZXl9YDtcbiAgICAgICAgICBpZiAoIXRoaXMuc3RhZ2VNYXAuaGFzKHByZWZpeGVkS2V5KSkge1xuICAgICAgICAgICAgdGhpcy5zdGFnZU1hcC5zZXQocHJlZml4ZWRLZXksIGZuIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWVyZ2UgbmVzdGVkIHN1YmZsb3dzXG4gICAgICAgIGlmIChyZXNvbHZlZC5zdWJmbG93cykge1xuICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhyZXNvbHZlZC5zdWJmbG93cykpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gYCR7bm9kZS5zdWJmbG93SWR9LyR7a2V5fWA7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc3ViZmxvd3NbcHJlZml4ZWRLZXldKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3ViZmxvd3NbcHJlZml4ZWRLZXldID0gZGVmIGFzIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgcnVudGltZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgbm93LXJlc29sdmVkIHNwZWNcbiAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNTdWJmbG93KFxuICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgbm9kZS5zdWJmbG93SWQhLFxuICAgICAgICAgIG5vZGUuc3ViZmxvd05hbWUsXG4gICAgICAgICAgcmVzb2x2ZWQuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIE1hcmsgYXMgcmVzb2x2ZWQgZm9yIFRISVMgdHJhdmVyc2VyIOKAlCBwZXItdHJhdmVyc2VyIHNldCBwcmV2ZW50cyByZS1lbnRyeVxuICAgICAgICAvLyB3aXRob3V0IG11dGF0aW5nIHRoZSBzaGFyZWQgU3RhZ2VOb2RlIGdyYXBoICh3aGljaCB3b3VsZCByYWNlIGNvbmN1cnJlbnQgdHJhdmVyc2VycykuXG4gICAgICAgIHRoaXMucmVzb2x2ZWRMYXp5U3ViZmxvd3MuYWRkKG5vZGUuc3ViZmxvd0lkISk7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAwOiBDTEFTU0lGWSDigJQgc3ViZmxvdyBkZXRlY3Rpb24g4pSA4pSA4pSAXG4gICAgICBpZiAobm9kZS5pc1N1YmZsb3dSb290ICYmIG5vZGUuc3ViZmxvd0lkKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkTm9kZSA9IHRoaXMubm9kZVJlc29sdmVyLnJlc29sdmVTdWJmbG93UmVmZXJlbmNlKG5vZGUpO1xuICAgICAgICBjb25zdCBwcmV2aW91c1N1YmZsb3dJZCA9IHRoaXMuZXh0cmFjdG9yUnVubmVyLmN1cnJlbnRTdWJmbG93SWQ7XG4gICAgICAgIHRoaXMuZXh0cmFjdG9yUnVubmVyLmN1cnJlbnRTdWJmbG93SWQgPSBub2RlLnN1YmZsb3dJZDtcblxuICAgICAgICBsZXQgc3ViZmxvd091dHB1dDogYW55O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN1YmZsb3dPdXRwdXQgPSBhd2FpdCB0aGlzLnN1YmZsb3dFeGVjdXRvci5leGVjdXRlU3ViZmxvdyhcbiAgICAgICAgICAgIHJlc29sdmVkTm9kZSxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICAgICAgdGhpcy5zdWJmbG93UmVzdWx0cyxcbiAgICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aGlzLmV4dHJhY3RvclJ1bm5lci5jdXJyZW50U3ViZmxvd0lkID0gcHJldmlvdXNTdWJmbG93SWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc1JlZmVyZW5jZUJhc2VkU3ViZmxvdyA9IHJlc29sdmVkTm9kZSAhPT0gbm9kZTtcbiAgICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBCb29sZWFuKG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKTtcbiAgICAgICAgY29uc3Qgc2hvdWxkRXhlY3V0ZUNvbnRpbnVhdGlvbiA9IGlzUmVmZXJlbmNlQmFzZWRTdWJmbG93IHx8IGhhc0NoaWxkcmVuO1xuXG4gICAgICAgIGlmIChub2RlLm5leHQgJiYgc2hvdWxkRXhlY3V0ZUNvbnRpbnVhdGlvbikge1xuICAgICAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5vZGUubmV4dC5uYW1lLCBub2RlLm5leHQuaWQpO1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKG5vZGUubmV4dCwgbmV4dEN0eCwgYnJlYWtGbGFnLCBicmFuY2hQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdWJmbG93T3V0cHV0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGFnZUZ1bmMgPSB0aGlzLmdldFN0YWdlRm4obm9kZSk7XG4gICAgICBjb25zdCBoYXNTdGFnZUZ1bmN0aW9uID0gQm9vbGVhbihzdGFnZUZ1bmMpO1xuICAgICAgY29uc3QgaXNTY29wZUJhc2VkRGVjaWRlciA9IEJvb2xlYW4obm9kZS5kZWNpZGVyRm4pO1xuICAgICAgY29uc3QgaXNTY29wZUJhc2VkU2VsZWN0b3IgPSBCb29sZWFuKG5vZGUuc2VsZWN0b3JGbik7XG4gICAgICBjb25zdCBpc0RlY2lkZXJOb2RlID0gaXNTY29wZUJhc2VkRGVjaWRlcjtcbiAgICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gQm9vbGVhbihub2RlLmNoaWxkcmVuPy5sZW5ndGgpO1xuICAgICAgY29uc3QgaGFzTmV4dCA9IEJvb2xlYW4obm9kZS5uZXh0KTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsTmV4dCA9IG5vZGUubmV4dDtcblxuICAgICAgLy8g4pSA4pSA4pSAIFBoYXNlIDE6IFZBTElEQVRFIOKAlCBub2RlIGludmFyaWFudHMg4pSA4pSA4pSAXG4gICAgICBpZiAoIWhhc1N0YWdlRnVuY3Rpb24gJiYgIWlzRGVjaWRlck5vZGUgJiYgIWlzU2NvcGVCYXNlZFNlbGVjdG9yICYmICFoYXNDaGlsZHJlbikge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgTm9kZSAnJHtub2RlLm5hbWV9JyBtdXN0IGRlZmluZTogZW1iZWRkZWQgZm4gT1IgYSBzdGFnZU1hcCBlbnRyeSBPUiBoYXZlIGNoaWxkcmVuL2RlY2lkZXJgO1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNEZWNpZGVyTm9kZSAmJiAhaGFzQ2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJ0RlY2lkZXIgbm9kZSBuZWVkcyB0byBoYXZlIGNoaWxkcmVuIHRvIGV4ZWN1dGUnO1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNTY29wZUJhc2VkU2VsZWN0b3IgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9ICdTZWxlY3RvciBub2RlIG5lZWRzIHRvIGhhdmUgY2hpbGRyZW4gdG8gZXhlY3V0ZSc7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cblxuICAgICAgLy8gUm9sZSBtYXJrZXJzIGZvciBkZWJ1ZyBwYW5lbHNcbiAgICAgIGlmICghaGFzU3RhZ2VGdW5jdGlvbikge1xuICAgICAgICBpZiAoaXNEZWNpZGVyTm9kZSkgY29udGV4dC5zZXRBc0RlY2lkZXIoKTtcbiAgICAgICAgZWxzZSBpZiAoaGFzQ2hpbGRyZW4pIGNvbnRleHQuc2V0QXNGb3JrKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJyZWFrRm4gPSAoKSA9PiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrID0gdHJ1ZSk7XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAyYTogU0VMRUNUT1Ig4oCUIHNjb3BlLWJhc2VkIG11bHRpLWNob2ljZSDilIDilIDilIBcbiAgICAgIGlmIChpc1Njb3BlQmFzZWRTZWxlY3Rvcikge1xuICAgICAgICBjb25zdCBwcmV2aW91c0ZvcmtJZCA9IHRoaXMuZXh0cmFjdG9yUnVubmVyLmN1cnJlbnRGb3JrSWQ7XG4gICAgICAgIHRoaXMuZXh0cmFjdG9yUnVubmVyLmN1cnJlbnRGb3JrSWQgPSBub2RlLmlkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0b3JSZXN1bHQgPSBhd2FpdCB0aGlzLnNlbGVjdG9ySGFuZGxlci5oYW5kbGVTY29wZUJhc2VkKFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIHN0YWdlRnVuYyEsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZVN0YWdlLmJpbmQodGhpcyksXG4gICAgICAgICAgICB0aGlzLmV4ZWN1dGVOb2RlLmJpbmQodGhpcyksXG4gICAgICAgICAgICB0aGlzLmV4dHJhY3RvclJ1bm5lci5jYWxsRXh0cmFjdG9yLmJpbmQodGhpcy5leHRyYWN0b3JSdW5uZXIpLFxuICAgICAgICAgICAgdGhpcy5leHRyYWN0b3JSdW5uZXIuZ2V0U3RhZ2VQYXRoLmJpbmQodGhpcy5leHRyYWN0b3JSdW5uZXIpLFxuICAgICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGhhc05leHQpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5vZGUubmV4dCEubmFtZSwgbm9kZS5uZXh0IS5pZCk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlTm9kZShub2RlLm5leHQhLCBuZXh0Q3R4LCBicmVha0ZsYWcsIGJyYW5jaFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gc2VsZWN0b3JSZXN1bHQ7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5leHRyYWN0b3JSdW5uZXIuY3VycmVudEZvcmtJZCA9IHByZXZpb3VzRm9ya0lkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAyYjogREVDSURFUiDigJQgc2NvcGUtYmFzZWQgc2luZ2xlLWNob2ljZSBjb25kaXRpb25hbCBicmFuY2gg4pSA4pSA4pSAXG4gICAgICBpZiAoaXNEZWNpZGVyTm9kZSkge1xuICAgICAgICBjb25zdCBkZWNpZGVyUmVzdWx0ID0gYXdhaXQgdGhpcy5kZWNpZGVySGFuZGxlci5oYW5kbGVTY29wZUJhc2VkKFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgc3RhZ2VGdW5jISxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICAgIHRoaXMuZXhlY3V0ZVN0YWdlLmJpbmQodGhpcyksXG4gICAgICAgICAgdGhpcy5leGVjdXRlTm9kZS5iaW5kKHRoaXMpLFxuICAgICAgICAgIHRoaXMuZXh0cmFjdG9yUnVubmVyLmNhbGxFeHRyYWN0b3IuYmluZCh0aGlzLmV4dHJhY3RvclJ1bm5lciksXG4gICAgICAgICAgdGhpcy5leHRyYWN0b3JSdW5uZXIuZ2V0U3RhZ2VQYXRoLmJpbmQodGhpcy5leHRyYWN0b3JSdW5uZXIpLFxuICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQWZ0ZXIgYnJhbmNoIGV4ZWN1dGlvbiwgZm9sbG93IGRlY2lkZXIncyBvd24gbmV4dCAoZS5nLiwgbG9vcFRvIHRhcmdldClcbiAgICAgICAgaWYgKGhhc05leHQgJiYgIWJyZWFrRmxhZy5zaG91bGRCcmVhaykge1xuICAgICAgICAgIGNvbnN0IG5leHROb2RlID0gb3JpZ2luYWxOZXh0ITtcbiAgICAgICAgICAvLyBVc2UgdGhlIGlzTG9vcFJlZiBmbGFnIHNldCBieSBsb29wVG8oKSDigJQgZG8gbm90IHJlbHkgb24gc3RhZ2VNYXAgYWJzZW5jZSxcbiAgICAgICAgICAvLyBzaW5jZSBpZC1rZXllZCBzdGFnZU1hcHMgd291bGQgb3RoZXJ3aXNlIGNhdXNlIGxvb3AgdGFyZ2V0cyB0byBiZSBleGVjdXRlZCBkaXJlY3RseS5cbiAgICAgICAgICBjb25zdCBpc0xvb3BSZWYgPVxuICAgICAgICAgICAgbmV4dE5vZGUuaXNMb29wUmVmID09PSB0cnVlIHx8XG4gICAgICAgICAgICAoIXRoaXMuZ2V0U3RhZ2VGbihuZXh0Tm9kZSkgJiZcbiAgICAgICAgICAgICAgIW5leHROb2RlLmNoaWxkcmVuPy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgIW5leHROb2RlLmRlY2lkZXJGbiAmJlxuICAgICAgICAgICAgICAhbmV4dE5vZGUuc2VsZWN0b3JGbiAmJlxuICAgICAgICAgICAgICAhbmV4dE5vZGUuaXNTdWJmbG93Um9vdCk7XG5cbiAgICAgICAgICBpZiAoaXNMb29wUmVmKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb250aW51YXRpb25SZXNvbHZlci5yZXNvbHZlKFxuICAgICAgICAgICAgICBuZXh0Tm9kZSxcbiAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVOb2RlLmJpbmQodGhpcyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uTmV4dChub2RlLm5hbWUsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5pZCk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZU5vZGUobmV4dE5vZGUsIG5leHRDdHgsIGJyZWFrRmxhZywgYnJhbmNoUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVjaWRlclJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSA4pSAIEFib3J0IGNoZWNrIOKAlCBjb29wZXJhdGl2ZSBjYW5jZWxsYXRpb24g4pSA4pSA4pSAXG4gICAgICBpZiAodGhpcy5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgICB0aGlzLnNpZ25hbC5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHRoaXMuc2lnbmFsLnJlYXNvbiA6IG5ldyBFcnJvcih0aGlzLnNpZ25hbC5yZWFzb24gPz8gJ0Fib3J0ZWQnKTtcbiAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIDilIAgUGhhc2UgMzogRVhFQ1VURSDigJQgcnVuIHN0YWdlIGZ1bmN0aW9uIOKUgOKUgOKUgFxuICAgICAgbGV0IHN0YWdlT3V0cHV0OiBUT3V0IHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IGR5bmFtaWNOZXh0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKHN0YWdlRnVuYykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN0YWdlT3V0cHV0ID0gYXdhaXQgdGhpcy5leGVjdXRlU3RhZ2Uobm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIC8vIFBhdXNlU2lnbmFsIGlzIGV4cGVjdGVkIGNvbnRyb2wgZmxvdywgbm90IGFuIGVycm9yIOKAlCBmaXJlIG5hcnJhdGl2ZSwgY29tbWl0LCByZS10aHJvdy5cbiAgICAgICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgICAgIGNvbnRleHQuY29tbWl0KCk7XG4gICAgICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblBhdXNlKG5vZGUubmFtZSwgbm9kZS5pZCwgZXJyb3IucGF1c2VEYXRhLCBlcnJvci5zdWJmbG93UGF0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgICAgICB0aGlzLmV4dHJhY3RvclJ1bm5lci5jYWxsRXh0cmFjdG9yKFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICB0aGlzLmV4dHJhY3RvclJ1bm5lci5nZXRTdGFnZVBhdGgobm9kZSwgYnJhbmNoUGF0aCwgY29udGV4dC5zdGFnZU5hbWUpLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgeyB0eXBlOiAnc3RhZ2VFeGVjdXRpb25FcnJvcicsIG1lc3NhZ2U6IGVycm9yLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uRXJyb3Iobm9kZS5uYW1lLCBlcnJvci50b1N0cmluZygpLCBlcnJvciwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yIH0pO1xuICAgICAgICAgIGNvbnRleHQuYWRkRXJyb3IoJ3N0YWdlRXhlY3V0aW9uRXJyb3InLCBlcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmNvbW1pdCgpO1xuICAgICAgICB0aGlzLmV4dHJhY3RvclJ1bm5lci5jYWxsRXh0cmFjdG9yKFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICB0aGlzLmV4dHJhY3RvclJ1bm5lci5nZXRTdGFnZVBhdGgobm9kZSwgYnJhbmNoUGF0aCwgY29udGV4dC5zdGFnZU5hbWUpLFxuICAgICAgICAgIHN0YWdlT3V0cHV0LFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN0YWdlRXhlY3V0ZWQobm9kZS5uYW1lLCBub2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0KTtcblxuICAgICAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25CcmVhayhub2RlLm5hbWUsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oYEV4ZWN1dGlvbiBzdG9wcGVkIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBhZnRlciAke25vZGUubmFtZX0gZHVlIHRvIGJyZWFrIGNvbmRpdGlvbi5gKTtcbiAgICAgICAgICByZXR1cm4gc3RhZ2VPdXRwdXQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDilIDilIDilIAgUGhhc2UgNDogRFlOQU1JQyDigJQgU3RhZ2VOb2RlIHJldHVybiBkZXRlY3Rpb24g4pSA4pSA4pSAXG4gICAgICAgIGlmIChzdGFnZU91dHB1dCAmJiB0eXBlb2Ygc3RhZ2VPdXRwdXQgPT09ICdvYmplY3QnICYmIGlzU3RhZ2VOb2RlUmV0dXJuKHN0YWdlT3V0cHV0KSkge1xuICAgICAgICAgIGNvbnN0IGR5bmFtaWNOb2RlID0gc3RhZ2VPdXRwdXQgYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gICAgICAgICAgY29udGV4dC5hZGRMb2coJ2lzRHluYW1pYycsIHRydWUpO1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljUGF0dGVybicsICdTdGFnZU5vZGVSZXR1cm4nKTtcblxuICAgICAgICAgIC8vIER5bmFtaWMgc3ViZmxvdyBhdXRvLXJlZ2lzdHJhdGlvblxuICAgICAgICAgIGlmIChkeW5hbWljTm9kZS5pc1N1YmZsb3dSb290ICYmIGR5bmFtaWNOb2RlLnN1YmZsb3dEZWYgJiYgZHluYW1pY05vZGUuc3ViZmxvd0lkKSB7XG4gICAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1BhdHRlcm4nLCAnZHluYW1pY1N1YmZsb3cnKTtcbiAgICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljU3ViZmxvd0lkJywgZHluYW1pY05vZGUuc3ViZmxvd0lkKTtcblxuICAgICAgICAgICAgLy8gU3RydWN0dXJhbC1vbmx5IHN1YmZsb3c6IGhhcyBidWlsZFRpbWVTdHJ1Y3R1cmUgYnV0IG5vIGV4ZWN1dGFibGUgcm9vdC5cbiAgICAgICAgICAgIC8vIFVzZWQgZm9yIHByZS1leGVjdXRlZCBzdWJmbG93cyAoZS5nLiwgaW5uZXIgZmxvd3MgdGhhdCBhbHJlYWR5IHJhbikuXG4gICAgICAgICAgICAvLyBBbm5vdGF0ZXMgdGhlIG5vZGUgZm9yIHZpc3VhbGl6YXRpb24gd2l0aG91dCByZS1leGVjdXRpbmcuXG4gICAgICAgICAgICBpZiAoIWR5bmFtaWNOb2RlLnN1YmZsb3dEZWYucm9vdCkge1xuICAgICAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1BhdHRlcm4nLCAnc3RydWN0dXJhbFN1YmZsb3cnKTtcbiAgICAgICAgICAgICAgbm9kZS5pc1N1YmZsb3dSb290ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgbm9kZS5zdWJmbG93SWQgPSBkeW5hbWljTm9kZS5zdWJmbG93SWQ7XG4gICAgICAgICAgICAgIG5vZGUuc3ViZmxvd05hbWUgPSBkeW5hbWljTm9kZS5zdWJmbG93TmFtZTtcbiAgICAgICAgICAgICAgbm9kZS5kZXNjcmlwdGlvbiA9IGR5bmFtaWNOb2RlLmRlc2NyaXB0aW9uID8/IG5vZGUuZGVzY3JpcHRpb247XG5cbiAgICAgICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNTdWJmbG93KFxuICAgICAgICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgICAgICAgZHluYW1pY05vZGUuc3ViZmxvd0lkISxcbiAgICAgICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gUGhhc2UgNSAoY29udGludWF0aW9uKSDigJQgbm8gc3ViZmxvdyBleGVjdXRpb24gbmVlZGVkXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBGdWxsIGR5bmFtaWMgc3ViZmxvdzogcmVnaXN0ZXIgKyBleGVjdXRlXG4gICAgICAgICAgICAgIHRoaXMuYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZihkeW5hbWljTm9kZS5zdWJmbG93SWQsIGR5bmFtaWNOb2RlLnN1YmZsb3dEZWYsIG5vZGUuaWQpO1xuXG4gICAgICAgICAgICAgIG5vZGUuaXNTdWJmbG93Um9vdCA9IHRydWU7XG4gICAgICAgICAgICAgIG5vZGUuc3ViZmxvd0lkID0gZHluYW1pY05vZGUuc3ViZmxvd0lkO1xuICAgICAgICAgICAgICBub2RlLnN1YmZsb3dOYW1lID0gZHluYW1pY05vZGUuc3ViZmxvd05hbWU7XG4gICAgICAgICAgICAgIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IGR5bmFtaWNOb2RlLnN1YmZsb3dNb3VudE9wdGlvbnM7XG5cbiAgICAgICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNTdWJmbG93KFxuICAgICAgICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgICAgICAgZHluYW1pY05vZGUuc3ViZmxvd0lkISxcbiAgICAgICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93RGVmPy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZU5vZGUobm9kZSwgY29udGV4dCwgYnJlYWtGbGFnLCBicmFuY2hQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBjaGlsZHJlbiBmb3Igc3ViZmxvd0RlZlxuICAgICAgICAgIGlmIChkeW5hbWljTm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBkeW5hbWljTm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNTdWJmbG93Um9vdCAmJiBjaGlsZC5zdWJmbG93RGVmICYmIGNoaWxkLnN1YmZsb3dJZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZihjaGlsZC5zdWJmbG93SWQsIGNoaWxkLnN1YmZsb3dEZWYsIGNoaWxkLmlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgICAgICAgICAgICBjaGlsZC5pZCxcbiAgICAgICAgICAgICAgICAgIGNoaWxkLnN1YmZsb3dJZCEsXG4gICAgICAgICAgICAgICAgICBjaGlsZC5zdWJmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgIGNoaWxkLnN1YmZsb3dEZWY/LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRHluYW1pYyBjaGlsZHJlbiAoZm9yayBwYXR0ZXJuKVxuICAgICAgICAgIGlmIChkeW5hbWljTm9kZS5jaGlsZHJlbiAmJiBkeW5hbWljTm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBub2RlLmNoaWxkcmVuID0gZHluYW1pY05vZGUuY2hpbGRyZW47XG4gICAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY0NoaWxkQ291bnQnLCBkeW5hbWljTm9kZS5jaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICAgICAgY29udGV4dC5hZGRMb2coXG4gICAgICAgICAgICAgICdkeW5hbWljQ2hpbGRJZHMnLFxuICAgICAgICAgICAgICBkeW5hbWljTm9kZS5jaGlsZHJlbi5tYXAoKGMpID0+IGMuaWQpLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNDaGlsZHJlbihcbiAgICAgICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICAgICAgZHluYW1pY05vZGUuY2hpbGRyZW4sXG4gICAgICAgICAgICAgIEJvb2xlYW4oZHluYW1pY05vZGUubmV4dE5vZGVTZWxlY3RvciksXG4gICAgICAgICAgICAgIEJvb2xlYW4oZHluYW1pY05vZGUuZGVjaWRlckZuKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZHluYW1pY05vZGUubmV4dE5vZGVTZWxlY3RvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBub2RlLm5leHROb2RlU2VsZWN0b3IgPSBkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yO1xuICAgICAgICAgICAgICBjb250ZXh0LmFkZExvZygnaGFzU2VsZWN0b3InLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBEeW5hbWljIG5leHQgKGxpbmVhciBjb250aW51YXRpb24pXG4gICAgICAgICAgaWYgKGR5bmFtaWNOb2RlLm5leHQpIHtcbiAgICAgICAgICAgIGR5bmFtaWNOZXh0ID0gZHluYW1pY05vZGUubmV4dDtcbiAgICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljTmV4dChub2RlLmlkLCBkeW5hbWljTm9kZS5uZXh0KTtcbiAgICAgICAgICAgIG5vZGUubmV4dCA9IGR5bmFtaWNOb2RlLm5leHQ7XG4gICAgICAgICAgICBjb250ZXh0LmFkZExvZygnaGFzRHluYW1pY05leHQnLCB0cnVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdGFnZU91dHB1dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgbmV4dCB0byBhdm9pZCBzdGFsZSByZWZlcmVuY2Ugb24gbG9vcCByZXZpc2l0XG4gICAgICAgIGlmIChkeW5hbWljTmV4dCkge1xuICAgICAgICAgIG5vZGUubmV4dCA9IG9yaWdpbmFsTmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDilIDilIDilIAgUGhhc2UgNTogQ0hJTERSRU4g4oCUIGZvcmsgZGlzcGF0Y2gg4pSA4pSA4pSAXG4gICAgICBjb25zdCBoYXNDaGlsZHJlbkFmdGVyU3RhZ2UgPSBCb29sZWFuKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCk7XG5cbiAgICAgIGlmIChoYXNDaGlsZHJlbkFmdGVyU3RhZ2UpIHtcbiAgICAgICAgY29udGV4dC5hZGRMb2coJ3RvdGFsQ2hpbGRyZW4nLCBub2RlLmNoaWxkcmVuPy5sZW5ndGgpO1xuICAgICAgICBjb250ZXh0LmFkZExvZygnb3JkZXJPZkV4ZWN1dGlvbicsICdDaGlsZHJlbkFmdGVyU3RhZ2UnKTtcblxuICAgICAgICBsZXQgbm9kZUNoaWxkcmVuUmVzdWx0czogUmVjb3JkPHN0cmluZywgTm9kZVJlc3VsdFR5cGU+O1xuXG4gICAgICAgIGlmIChub2RlLm5leHROb2RlU2VsZWN0b3IpIHtcbiAgICAgICAgICBjb25zdCBwcmV2aW91c0ZvcmtJZCA9IHRoaXMuZXh0cmFjdG9yUnVubmVyLmN1cnJlbnRGb3JrSWQ7XG4gICAgICAgICAgdGhpcy5leHRyYWN0b3JSdW5uZXIuY3VycmVudEZvcmtJZCA9IG5vZGUuaWQ7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5vZGVDaGlsZHJlblJlc3VsdHMgPSBhd2FpdCB0aGlzLmNoaWxkcmVuRXhlY3V0b3IuZXhlY3V0ZVNlbGVjdGVkQ2hpbGRyZW4oXG4gICAgICAgICAgICAgIG5vZGUubmV4dE5vZGVTZWxlY3RvcixcbiAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiEsXG4gICAgICAgICAgICAgIHN0YWdlT3V0cHV0LFxuICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICBicmFuY2hQYXRoIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuZXh0cmFjdG9yUnVubmVyLmN1cnJlbnRGb3JrSWQgPSBwcmV2aW91c0ZvcmtJZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY2hpbGRDb3VudCA9IG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCA/PyAwO1xuICAgICAgICAgIGNvbnN0IGNoaWxkTmFtZXMgPSBub2RlLmNoaWxkcmVuPy5tYXAoKGMpID0+IGMubmFtZSkuam9pbignLCAnKTtcbiAgICAgICAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ2NoaWxkcmVuJywgYEV4ZWN1dGluZyBhbGwgJHtjaGlsZENvdW50fSBjaGlsZHJlbiBpbiBwYXJhbGxlbDogJHtjaGlsZE5hbWVzfWAsIHtcbiAgICAgICAgICAgIGNvdW50OiBjaGlsZENvdW50LFxuICAgICAgICAgICAgdGFyZ2V0U3RhZ2U6IG5vZGUuY2hpbGRyZW4/Lm1hcCgoYykgPT4gYy5uYW1lKSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHByZXZpb3VzRm9ya0lkID0gdGhpcy5leHRyYWN0b3JSdW5uZXIuY3VycmVudEZvcmtJZDtcbiAgICAgICAgICB0aGlzLmV4dHJhY3RvclJ1bm5lci5jdXJyZW50Rm9ya0lkID0gbm9kZS5pZDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbm9kZUNoaWxkcmVuUmVzdWx0cyA9IGF3YWl0IHRoaXMuY2hpbGRyZW5FeGVjdXRvci5leGVjdXRlTm9kZUNoaWxkcmVuKFxuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLmV4dHJhY3RvclJ1bm5lci5jdXJyZW50Rm9ya0lkID0gcHJldmlvdXNGb3JrSWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9yay1vbmx5OiByZXR1cm4gYnVuZGxlXG4gICAgICAgIGlmICghaGFzTmV4dCAmJiAhZHluYW1pY05leHQpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZUNoaWxkcmVuUmVzdWx0cyE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYXB0dXJlIGR5bmFtaWMgY2hpbGRyZW4gYXMgc3ludGhldGljIHN1YmZsb3cgcmVzdWx0IGZvciBVSVxuICAgICAgICBjb25zdCBpc0R5bmFtaWMgPSBjb250ZXh0LmRlYnVnPy5sb2dDb250ZXh0Py5pc0R5bmFtaWM7XG4gICAgICAgIGlmIChpc0R5bmFtaWMgJiYgbm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmNhcHR1cmVEeW5hbWljQ2hpbGRyZW5SZXN1bHQobm9kZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSA4pSAIFBoYXNlIDY6IENPTlRJTlVFIOKAlCBkeW5hbWljIG5leHQgLyBsaW5lYXIgbmV4dCDilIDilIDilIBcbiAgICAgIGlmIChkeW5hbWljTmV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250aW51YXRpb25SZXNvbHZlci5yZXNvbHZlKFxuICAgICAgICAgIGR5bmFtaWNOZXh0LFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgICB0aGlzLmV4ZWN1dGVOb2RlLmJpbmQodGhpcyksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNOZXh0KSB7XG4gICAgICAgIGNvbnN0IG5leHROb2RlID0gb3JpZ2luYWxOZXh0ITtcblxuICAgICAgICAvLyBEZXRlY3QgbG9vcCByZWZlcmVuY2Ugbm9kZXMgY3JlYXRlZCBieSBsb29wVG8oKSDigJQgbWFya2VkIHdpdGggaXNMb29wUmVmIGZsYWcuXG4gICAgICAgIC8vIFJvdXRlIHRocm91Z2ggQ29udGludWF0aW9uUmVzb2x2ZXIgZm9yIHByb3BlciBJRCByZXNvbHV0aW9uLCBpdGVyYXRpb25cbiAgICAgICAgLy8gdHJhY2tpbmcsIGFuZCBuYXJyYXRpdmUgZ2VuZXJhdGlvbi5cbiAgICAgICAgY29uc3QgaXNMb29wUmVmZXJlbmNlID0gbmV4dE5vZGUuaXNMb29wUmVmO1xuXG4gICAgICAgIGlmIChpc0xvb3BSZWZlcmVuY2UpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250aW51YXRpb25SZXNvbHZlci5yZXNvbHZlKFxuICAgICAgICAgICAgbmV4dE5vZGUsXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgICB0aGlzLmV4ZWN1dGVOb2RlLmJpbmQodGhpcyksXG4gICAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbk5leHQobm9kZS5uYW1lLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnbmV4dCcsIGBNb3ZpbmcgdG8gJHtuZXh0Tm9kZS5uYW1lfSBzdGFnZWAsIHtcbiAgICAgICAgICB0YXJnZXRTdGFnZTogbmV4dE5vZGUubmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmlkKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZU5vZGUobmV4dE5vZGUsIG5leHRDdHgsIGJyZWFrRmxhZywgYnJhbmNoUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA3OiBMRUFGIOKAlCBubyBjb250aW51YXRpb24g4pSA4pSA4pSAXG4gICAgICByZXR1cm4gc3RhZ2VPdXRwdXQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2V4ZWN1dGVEZXB0aC0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBQcml2YXRlIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBjYXB0dXJlRHluYW1pY0NoaWxkcmVuUmVzdWx0KG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBjb250ZXh0OiBTdGFnZUNvbnRleHQpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJlbnRTdGFnZUlkID0gY29udGV4dC5nZXRTdGFnZUlkKCk7XG5cbiAgICBjb25zdCBjaGlsZFN0cnVjdHVyZTogYW55ID0ge1xuICAgICAgaWQ6IGAke25vZGUuaWR9LWNoaWxkcmVuYCxcbiAgICAgIG5hbWU6ICdEeW5hbWljIENoaWxkcmVuJyxcbiAgICAgIHR5cGU6ICdmb3JrJyxcbiAgICAgIGNoaWxkcmVuOiBub2RlLmNoaWxkcmVuIS5tYXAoKGMpID0+ICh7XG4gICAgICAgIGlkOiBjLmlkLFxuICAgICAgICBuYW1lOiBjLm5hbWUsXG4gICAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICB9KSksXG4gICAgfTtcblxuICAgIGNvbnN0IGNoaWxkU3RhZ2VzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGlmIChjb250ZXh0LmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkQ3R4IG9mIGNvbnRleHQuY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3Qgc25hcHNob3QgPSBjaGlsZEN0eC5nZXRTbmFwc2hvdCgpO1xuICAgICAgICBjaGlsZFN0YWdlc1tzbmFwc2hvdC5uYW1lIHx8IHNuYXBzaG90LmlkXSA9IHtcbiAgICAgICAgICBuYW1lOiBzbmFwc2hvdC5uYW1lLFxuICAgICAgICAgIG91dHB1dDogc25hcHNob3QubG9ncyxcbiAgICAgICAgICBlcnJvcnM6IHNuYXBzaG90LmVycm9ycyxcbiAgICAgICAgICBtZXRyaWNzOiBzbmFwc2hvdC5tZXRyaWNzLFxuICAgICAgICAgIHN0YXR1czogc25hcHNob3QuZXJyb3JzICYmIE9iamVjdC5rZXlzKHNuYXBzaG90LmVycm9ycykubGVuZ3RoID4gMCA/ICdlcnJvcicgOiAnc3VjY2VzcycsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdWJmbG93UmVzdWx0cy5zZXQobm9kZS5pZCwge1xuICAgICAgc3ViZmxvd0lkOiBub2RlLmlkLFxuICAgICAgc3ViZmxvd05hbWU6IG5vZGUubmFtZSxcbiAgICAgIHRyZWVDb250ZXh0OiB7XG4gICAgICAgIGdsb2JhbENvbnRleHQ6IHt9LFxuICAgICAgICBzdGFnZUNvbnRleHRzOiBjaGlsZFN0YWdlcyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBoaXN0b3J5OiBbXSxcbiAgICAgIH0sXG4gICAgICBwYXJlbnRTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVTdHJ1Y3R1cmU6IGNoaWxkU3RydWN0dXJlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlQ29udGV4dERlcHRoKGNvbnRleHQ6IFN0YWdlQ29udGV4dCk6IG51bWJlciB7XG4gICAgbGV0IGRlcHRoID0gMDtcbiAgICBsZXQgY3VycmVudCA9IGNvbnRleHQucGFyZW50O1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBkZXB0aCsrO1xuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuICAgIH1cbiAgICByZXR1cm4gZGVwdGg7XG4gIH1cblxuICBwcml2YXRlIHByZWZpeE5vZGVUcmVlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBwcmVmaXg6IHN0cmluZyk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICBpZiAoIW5vZGUpIHJldHVybiBub2RlO1xuICAgIGNvbnN0IGNsb25lOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgLi4ubm9kZSB9O1xuICAgIGNsb25lLm5hbWUgPSBgJHtwcmVmaXh9LyR7bm9kZS5uYW1lfWA7XG4gICAgY2xvbmUuaWQgPSBgJHtwcmVmaXh9LyR7Y2xvbmUuaWR9YDtcbiAgICBpZiAoY2xvbmUuc3ViZmxvd0lkKSBjbG9uZS5zdWJmbG93SWQgPSBgJHtwcmVmaXh9LyR7Y2xvbmUuc3ViZmxvd0lkfWA7XG4gICAgaWYgKGNsb25lLm5leHQpIGNsb25lLm5leHQgPSB0aGlzLnByZWZpeE5vZGVUcmVlKGNsb25lLm5leHQsIHByZWZpeCk7XG4gICAgaWYgKGNsb25lLmNoaWxkcmVuKSB7XG4gICAgICBjbG9uZS5jaGlsZHJlbiA9IGNsb25lLmNoaWxkcmVuLm1hcCgoYykgPT4gdGhpcy5wcmVmaXhOb2RlVHJlZShjLCBwcmVmaXgpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgcHJpdmF0ZSBhdXRvUmVnaXN0ZXJTdWJmbG93RGVmKFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHN1YmZsb3dEZWY6IE5vbk51bGxhYmxlPFN0YWdlTm9kZVsnc3ViZmxvd0RlZiddPixcbiAgICBtb3VudE5vZGVJZD86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgLy8gdGhpcy5zdWJmbG93cyBpcyBhbHdheXMgaW5pdGlhbGl6ZWQgaW4gdGhlIGNvbnN0cnVjdG9yOyB0aGUgbnVsbCBndWFyZCBiZWxvdyBpcyB1bnJlYWNoYWJsZS5cbiAgICBjb25zdCBzdWJmbG93c0RpY3QgPSB0aGlzLnN1YmZsb3dzO1xuXG4gICAgLy8gRmlyc3Qtd3JpdGUtd2luc1xuICAgIGNvbnN0IGlzTmV3UmVnaXN0cmF0aW9uID0gIXN1YmZsb3dzRGljdFtzdWJmbG93SWRdO1xuICAgIGlmIChpc05ld1JlZ2lzdHJhdGlvbiAmJiBzdWJmbG93RGVmLnJvb3QpIHtcbiAgICAgIHN1YmZsb3dzRGljdFtzdWJmbG93SWRdID0ge1xuICAgICAgICByb290OiBzdWJmbG93RGVmLnJvb3QgYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgICAgIC4uLihzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSA/IHsgYnVpbGRUaW1lU3RydWN0dXJlOiBzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSB9IDoge30pLFxuICAgICAgfSBhcyBhbnk7XG4gICAgfVxuXG4gICAgLy8gTWVyZ2Ugc3RhZ2VNYXAgZW50cmllcyAocGFyZW50IGVudHJpZXMgcHJlc2VydmVkKVxuICAgIGlmIChzdWJmbG93RGVmLnN0YWdlTWFwKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGZuXSBvZiBBcnJheS5mcm9tKHN1YmZsb3dEZWYuc3RhZ2VNYXAuZW50cmllcygpKSkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhZ2VNYXAuaGFzKGtleSkpIHtcbiAgICAgICAgICB0aGlzLnN0YWdlTWFwLnNldChrZXksIGZuIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNZXJnZSBuZXN0ZWQgc3ViZmxvd3NcbiAgICBpZiAoc3ViZmxvd0RlZi5zdWJmbG93cykge1xuICAgICAgZm9yIChjb25zdCBba2V5LCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKHN1YmZsb3dEZWYuc3ViZmxvd3MpKSB7XG4gICAgICAgIGlmICghc3ViZmxvd3NEaWN0W2tleV0pIHtcbiAgICAgICAgICBzdWJmbG93c0RpY3Rba2V5XSA9IGRlZiBhcyB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW91bnROb2RlSWQpIHtcbiAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgbW91bnROb2RlSWQsXG4gICAgICAgIHN1YmZsb3dJZCxcbiAgICAgICAgc3ViZmxvd0RlZi5yb290Py5zdWJmbG93TmFtZSB8fCBzdWJmbG93RGVmLnJvb3Q/Lm5hbWUsXG4gICAgICAgIHN1YmZsb3dEZWYuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBOb3RpZnkgRmxvd1JlY29yZGVycyBvbmx5IG9uIGZpcnN0IHJlZ2lzdHJhdGlvbiAobWF0Y2hlcyBmaXJzdC13cml0ZS13aW5zKVxuICAgIGlmIChpc05ld1JlZ2lzdHJhdGlvbikge1xuICAgICAgY29uc3Qgc3ViZmxvd05hbWUgPSBzdWJmbG93RGVmLnJvb3Q/LnN1YmZsb3dOYW1lIHx8IHN1YmZsb3dEZWYucm9vdD8ubmFtZSB8fCBzdWJmbG93SWQ7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN1YmZsb3dSZWdpc3RlcmVkKFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgICBzdWJmbG93RGVmLnJvb3Q/LmRlc2NyaXB0aW9uLFxuICAgICAgICBzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=