@angular/compiler-cli 10.0.6 → 10.0.10

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 (85) hide show
  1. package/ngcc/src/analysis/ngcc_trait_compiler.js +2 -1
  2. package/ngcc/src/host/esm2015_host.js +10 -4
  3. package/ngcc/src/host/esm5_host.d.ts +118 -0
  4. package/ngcc/src/host/esm5_host.js +210 -123
  5. package/ngcc/src/packages/build_marker.d.ts +1 -1
  6. package/ngcc/src/packages/build_marker.js +1 -1
  7. package/package.json +2 -2
  8. package/src/main.js +1 -2
  9. package/src/ngtsc/annotations/src/component.d.ts +1 -1
  10. package/src/ngtsc/annotations/src/component.js +3 -3
  11. package/src/ngtsc/annotations/src/diagnostics.js +2 -2
  12. package/src/ngtsc/annotations/src/metadata.js +3 -3
  13. package/src/ngtsc/annotations/src/ng_module.js +6 -6
  14. package/src/ngtsc/annotations/src/util.d.ts +4 -8
  15. package/src/ngtsc/annotations/src/util.js +73 -22
  16. package/src/ngtsc/core/src/compiler.d.ts +2 -1
  17. package/src/ngtsc/core/src/compiler.js +8 -9
  18. package/src/ngtsc/diagnostics/index.d.ts +1 -1
  19. package/src/ngtsc/diagnostics/index.js +2 -1
  20. package/src/ngtsc/diagnostics/src/error.d.ts +5 -6
  21. package/src/ngtsc/diagnostics/src/error.js +20 -20
  22. package/src/ngtsc/diagnostics/src/error_code.d.ts +10 -0
  23. package/src/ngtsc/diagnostics/src/error_code.js +11 -1
  24. package/src/ngtsc/imports/src/core.js +2 -1
  25. package/src/ngtsc/incremental/api.d.ts +12 -7
  26. package/src/ngtsc/incremental/api.js +1 -1
  27. package/src/ngtsc/incremental/src/noop.js +2 -1
  28. package/src/ngtsc/incremental/src/state.d.ts +1 -1
  29. package/src/ngtsc/incremental/src/state.js +1 -1
  30. package/src/ngtsc/program.d.ts +2 -1
  31. package/src/ngtsc/program.js +1 -1
  32. package/src/ngtsc/reflection/src/host.d.ts +110 -25
  33. package/src/ngtsc/reflection/src/host.js +1 -1
  34. package/src/ngtsc/reflection/src/type_to_value.d.ts +1 -1
  35. package/src/ngtsc/reflection/src/type_to_value.js +62 -11
  36. package/src/ngtsc/reflection/src/typescript.js +1 -4
  37. package/src/ngtsc/scope/src/local.js +4 -4
  38. package/src/ngtsc/shims/api.d.ts +6 -2
  39. package/src/ngtsc/shims/api.js +1 -1
  40. package/src/ngtsc/shims/src/factory_generator.d.ts +2 -2
  41. package/src/ngtsc/shims/src/factory_generator.js +58 -9
  42. package/src/ngtsc/transform/src/api.d.ts +1 -1
  43. package/src/ngtsc/transform/src/api.js +1 -1
  44. package/src/ngtsc/transform/src/compilation.d.ts +1 -1
  45. package/src/ngtsc/transform/src/compilation.js +1 -1
  46. package/src/ngtsc/transform/src/transform.js +2 -2
  47. package/src/ngtsc/tsc_plugin.d.ts +1 -1
  48. package/src/ngtsc/tsc_plugin.js +1 -1
  49. package/src/ngtsc/typecheck/{src → api}/api.d.ts +25 -2
  50. package/src/ngtsc/typecheck/{src → api}/api.js +2 -2
  51. package/src/ngtsc/typecheck/api/checker.d.ts +91 -0
  52. package/src/ngtsc/typecheck/api/checker.js +44 -0
  53. package/src/ngtsc/typecheck/api/context.d.ts +44 -0
  54. package/src/ngtsc/typecheck/api/context.js +20 -0
  55. package/src/ngtsc/typecheck/api/index.d.ts +11 -0
  56. package/src/ngtsc/typecheck/api/index.js +24 -0
  57. package/src/ngtsc/typecheck/index.d.ts +4 -5
  58. package/src/ngtsc/typecheck/index.js +6 -8
  59. package/src/ngtsc/typecheck/src/augmented_program.d.ts +3 -1
  60. package/src/ngtsc/typecheck/src/augmented_program.js +9 -3
  61. package/src/ngtsc/typecheck/src/checker.d.ts +63 -18
  62. package/src/ngtsc/typecheck/src/checker.js +394 -62
  63. package/src/ngtsc/typecheck/src/context.d.ts +76 -55
  64. package/src/ngtsc/typecheck/src/context.js +111 -67
  65. package/src/ngtsc/typecheck/src/diagnostics.d.ts +9 -3
  66. package/src/ngtsc/typecheck/src/diagnostics.js +28 -5
  67. package/src/ngtsc/typecheck/src/dom.d.ts +4 -5
  68. package/src/ngtsc/typecheck/src/dom.js +3 -3
  69. package/src/ngtsc/typecheck/src/environment.d.ts +1 -1
  70. package/src/ngtsc/typecheck/src/environment.js +1 -1
  71. package/src/ngtsc/typecheck/src/expression.d.ts +1 -1
  72. package/src/ngtsc/typecheck/src/expression.js +2 -2
  73. package/src/ngtsc/typecheck/src/oob.d.ts +9 -5
  74. package/src/ngtsc/typecheck/src/oob.js +25 -6
  75. package/src/ngtsc/typecheck/src/source.d.ts +4 -3
  76. package/src/ngtsc/typecheck/src/source.js +20 -4
  77. package/src/ngtsc/typecheck/src/template_semantics.d.ts +1 -1
  78. package/src/ngtsc/typecheck/src/template_semantics.js +1 -1
  79. package/src/ngtsc/typecheck/src/type_check_block.d.ts +1 -1
  80. package/src/ngtsc/typecheck/src/type_check_block.js +1 -1
  81. package/src/ngtsc/typecheck/src/type_check_file.d.ts +1 -1
  82. package/src/ngtsc/typecheck/src/type_check_file.js +1 -1
  83. package/src/ngtsc/typecheck/src/type_constructor.d.ts +1 -1
  84. package/src/ngtsc/typecheck/src/type_constructor.js +1 -1
  85. package/src/version.js +1 -1
@@ -69,4 +69,4 @@
69
69
  KnownDeclaration[KnownDeclaration["TsHelperSpreadArrays"] = 3] = "TsHelperSpreadArrays";
70
70
  })(KnownDeclaration = exports.KnownDeclaration || (exports.KnownDeclaration = {}));
71
71
  });
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9zdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2MvcmVmbGVjdGlvbi9zcmMvaG9zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7SUFFSCwrQkFBaUM7SUFrRXBCLFFBQUEsU0FBUyxHQUFHO1FBQ3ZCLFlBQVksRUFBRSxVQUFDLFNBQW9CO1lBQ2pDLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBQzNCLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQzthQUN2QjtpQkFBTTtnQkFDTCxrRUFBa0U7Z0JBQ2xFLE9BQVEsU0FBZ0MsQ0FBQyxjQUFjLENBQUM7YUFDekQ7UUFDSCxDQUFDO0tBQ0YsQ0FBQztJQVdGLFNBQWdCLHFCQUFxQixDQUFDLEdBQWtCO1FBQ3RELE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7WUFDdkIsRUFBRSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztnQkFDckUsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUpELHNEQUlDO0lBbUJEOztPQUVHO0lBQ0gsSUFBWSxlQU1YO0lBTkQsV0FBWSxlQUFlO1FBQ3pCLG1FQUFXLENBQUE7UUFDWCx5REFBTSxDQUFBO1FBQ04seURBQU0sQ0FBQTtRQUNOLDZEQUFRLENBQUE7UUFDUix5REFBTSxDQUFBO0lBQ1IsQ0FBQyxFQU5XLGVBQWUsR0FBZix1QkFBZSxLQUFmLHVCQUFlLFFBTTFCO0lBeU5EOztPQUVHO0lBQ0gsSUFBWSxnQkFvQlg7SUFwQkQsV0FBWSxnQkFBZ0I7UUFDMUI7O1dBRUc7UUFDSCwyRUFBYyxDQUFBO1FBRWQ7O1dBRUc7UUFDSCwyRUFBYyxDQUFBO1FBRWQ7O1dBRUc7UUFDSCwyRUFBYyxDQUFBO1FBRWQ7O1dBRUc7UUFDSCx1RkFBb0IsQ0FBQTtJQUN0QixDQUFDLEVBcEJXLGdCQUFnQixHQUFoQix3QkFBZ0IsS0FBaEIsd0JBQWdCLFFBb0IzQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuLyoqXG4gKiBNZXRhZGF0YSBleHRyYWN0ZWQgZnJvbSBhbiBpbnN0YW5jZSBvZiBhIGRlY29yYXRvciBvbiBhbm90aGVyIGRlY2xhcmF0aW9uLCBvciBzeW50aGVzaXplZCBmcm9tXG4gKiBvdGhlciBpbmZvcm1hdGlvbiBhYm91dCBhIGNsYXNzLlxuICovXG5leHBvcnQgdHlwZSBEZWNvcmF0b3IgPSBDb25jcmV0ZURlY29yYXRvcnxTeW50aGV0aWNEZWNvcmF0b3I7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZURlY29yYXRvciB7XG4gIC8qKlxuICAgKiBOYW1lIGJ5IHdoaWNoIHRoZSBkZWNvcmF0b3Igd2FzIGludm9rZWQgaW4gdGhlIHVzZXIncyBjb2RlLlxuICAgKlxuICAgKiBUaGlzIGlzIGRpc3RpbmN0IGZyb20gdGhlIG5hbWUgYnkgd2hpY2ggdGhlIGRlY29yYXRvciB3YXMgaW1wb3J0ZWQgKHRob3VnaCBpbiBwcmFjdGljZSB0aGV5XG4gICAqIHdpbGwgdXN1YWxseSBiZSB0aGUgc2FtZSkuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElkZW50aWZpZXIgd2hpY2ggcmVmZXJzIHRvIHRoZSBkZWNvcmF0b3IgaW4gdGhlIHVzZXIncyBjb2RlLlxuICAgKi9cbiAgaWRlbnRpZmllcjogRGVjb3JhdG9ySWRlbnRpZmllcnxudWxsO1xuXG4vKipcbiAqIGBJbXBvcnRgIGJ5IHdoaWNoIHRoZSBkZWNvcmF0b3Igd2FzIGJyb3VnaHQgaW50byB0aGUgbW9kdWxlIGluIHdoaWNoIGl0IHdhcyBpbnZva2VkLCBvciBgbnVsbGBcbiAqIGlmIHRoZSBkZWNvcmF0b3Igd2FzIGRlY2xhcmVkIGluIHRoZSBzYW1lIG1vZHVsZSBhbmQgbm90IGltcG9ydGVkLlxuICovXG5pbXBvcnQ6IEltcG9ydHxudWxsO1xuXG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0IHJlZmVyZW5jZSB0byB0aGUgZGVjb3JhdG9yIGl0c2VsZiwgb3IgYG51bGxgIGlmIHRoZSBkZWNvcmF0b3IgaXMgc3ludGhlc2l6ZWQgKGUuZy5cbiAgICogaW4gbmdjYykuXG4gICAqL1xuICBub2RlOiB0cy5Ob2RlfG51bGw7XG5cbiAgLyoqXG4gICAqIEFyZ3VtZW50cyBvZiB0aGUgaW52b2NhdGlvbiBvZiB0aGUgZGVjb3JhdG9yLCBpZiB0aGUgZGVjb3JhdG9yIGlzIGludm9rZWQsIG9yIGBudWxsYFxuICAgKiBvdGhlcndpc2UuXG4gICAqL1xuICBhcmdzOiB0cy5FeHByZXNzaW9uW118bnVsbDtcbn1cblxuLyoqXG4gKiBNZXRhZGF0YSBleHRyYWN0ZWQgZnJvbSBhbiBpbnN0YW5jZSBvZiBhIGRlY29yYXRvciBvbiBhbm90aGVyIGRlY2xhcmF0aW9uLCB3aGljaCB3YXMgYWN0dWFsbHlcbiAqIHByZXNlbnQgaW4gYSBmaWxlLlxuICpcbiAqIENvbmNyZXRlIGRlY29yYXRvcnMgYWx3YXlzIGhhdmUgYW4gYGlkZW50aWZpZXJgIGFuZCBhIGBub2RlYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25jcmV0ZURlY29yYXRvciBleHRlbmRzIEJhc2VEZWNvcmF0b3Ige1xuICBpZGVudGlmaWVyOiBEZWNvcmF0b3JJZGVudGlmaWVyO1xuICBub2RlOiB0cy5Ob2RlO1xufVxuXG4vKipcbiAqIFN5bnRoZXRpYyBkZWNvcmF0b3JzIG5ldmVyIGhhdmUgYW4gYGlkZW50aWZpZXJgIG9yIGEgYG5vZGVgLCBidXQga25vdyB0aGUgbm9kZSBmb3Igd2hpY2ggdGhleVxuICogd2VyZSBzeW50aGVzaXplZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTeW50aGV0aWNEZWNvcmF0b3IgZXh0ZW5kcyBCYXNlRGVjb3JhdG9yIHtcbiAgaWRlbnRpZmllcjogbnVsbDtcbiAgbm9kZTogbnVsbDtcblxuICAvKipcbiAgICogVGhlIGB0cy5Ob2RlYCBmb3Igd2hpY2ggdGhpcyBkZWNvcmF0b3Igd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBzeW50aGVzaXplZEZvcjogdHMuTm9kZTtcbn1cblxuZXhwb3J0IGNvbnN0IERlY29yYXRvciA9IHtcbiAgbm9kZUZvckVycm9yOiAoZGVjb3JhdG9yOiBEZWNvcmF0b3IpOiB0cy5Ob2RlID0+IHtcbiAgICBpZiAoZGVjb3JhdG9yLm5vZGUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBkZWNvcmF0b3Iubm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyhhbHhodWIpOiB3ZSBjYW4ndCByZWx5IG9uIG5hcnJvd2luZyB1bnRpbCBUUyAzLjYgaXMgaW4gZzMuXG4gICAgICByZXR1cm4gKGRlY29yYXRvciBhcyBTeW50aGV0aWNEZWNvcmF0b3IpLnN5bnRoZXNpemVkRm9yO1xuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogQSBkZWNvcmF0b3IgaXMgaWRlbnRpZmllZCBieSBlaXRoZXIgYSBzaW1wbGUgaWRlbnRpZmllciAoZS5nLiBgRGVjb3JhdG9yYCkgb3IsIGluIHNvbWUgY2FzZXMsXG4gKiBhIG5hbWVzcGFjZWQgcHJvcGVydHkgYWNjZXNzIChlLmcuIGBjb3JlLkRlY29yYXRvcmApLlxuICovXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JJZGVudGlmaWVyID0gdHMuSWRlbnRpZmllcnxOYW1lc3BhY2VkSWRlbnRpZmllcjtcbmV4cG9ydCB0eXBlIE5hbWVzcGFjZWRJZGVudGlmaWVyID0gdHMuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uJntcbiAgZXhwcmVzc2lvbjogdHMuSWRlbnRpZmllcjtcbiAgbmFtZTogdHMuSWRlbnRpZmllclxufTtcbmV4cG9ydCBmdW5jdGlvbiBpc0RlY29yYXRvcklkZW50aWZpZXIoZXhwOiB0cy5FeHByZXNzaW9uKTogZXhwIGlzIERlY29yYXRvcklkZW50aWZpZXIge1xuICByZXR1cm4gdHMuaXNJZGVudGlmaWVyKGV4cCkgfHxcbiAgICAgIHRzLmlzUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKGV4cCkgJiYgdHMuaXNJZGVudGlmaWVyKGV4cC5leHByZXNzaW9uKSAmJlxuICAgICAgdHMuaXNJZGVudGlmaWVyKGV4cC5uYW1lKTtcbn1cblxuLyoqXG4gKiBUaGUgYHRzLkRlY2xhcmF0aW9uYCBvZiBhIFwiY2xhc3NcIi5cbiAqXG4gKiBDbGFzc2VzIGFyZSByZXByZXNlbnRlZCBkaWZmZXJlbnRseSBpbiBkaWZmZXJlbnQgY29kZSBmb3JtYXRzOlxuICogLSBJbiBUUyBjb2RlLCB0aGV5IGFyZSB0eXBpY2FsbHkgZGVmaW5lZCB1c2luZyB0aGUgYGNsYXNzYCBrZXl3b3JkLlxuICogLSBJbiBFUzIwMTUgY29kZSwgdGhleSBhcmUgdXN1YWxseSBkZWZpbmVkIHVzaW5nIHRoZSBgY2xhc3NgIGtleXdvcmQsIGJ1dCB0aGV5IGNhbiBhbHNvIGJlXG4gKiAgIHZhcmlhYmxlIGRlY2xhcmF0aW9ucywgd2hpY2ggYXJlIGluaXRpYWxpemVkIHRvIGEgY2xhc3MgZXhwcmVzc2lvbiAoZS5nLlxuICogICBgbGV0IEZvbyA9IEZvbzEgPSBjbGFzcyBGb28ge31gKS5cbiAqIC0gSW4gRVM1IGNvZGUsIHRoZXkgYXJlIHR5cGljYWxseSBkZWZpbmVkIGFzIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBiZWluZyBhc3NpZ25lZCB0aGUgcmV0dXJuXG4gKiAgIHZhbHVlIG9mIGFuIElJRkUuIFRoZSBhY3R1YWwgXCJjbGFzc1wiIGlzIGltcGxlbWVudGVkIGFzIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gaW5zaWRlIHRoZSBJSUZFLFxuICogICBidXQgdGhlIG91dGVyIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHJlcHJlc2VudHMgdGhlIFwiY2xhc3NcIiB0byB0aGUgcmVzdCBvZiB0aGUgcHJvZ3JhbS5cbiAqXG4gKiBGb3IgYFJlZmxlY3Rpb25Ib3N0YCBwdXJwb3NlcywgYSBjbGFzcyBkZWNsYXJhdGlvbiBzaG91bGQgYWx3YXlzIGhhdmUgYSBgbmFtZWAgaWRlbnRpZmllcixcbiAqIGJlY2F1c2Ugd2UgbmVlZCB0byBiZSBhYmxlIHRvIHJlZmVyZW5jZSBpdCBpbiBvdGhlciBwYXJ0cyBvZiB0aGUgcHJvZ3JhbS5cbiAqL1xuZXhwb3J0IHR5cGUgQ2xhc3NEZWNsYXJhdGlvbjxUIGV4dGVuZHMgdHMuRGVjbGFyYXRpb24gPSB0cy5EZWNsYXJhdGlvbj4gPSBUJntuYW1lOiB0cy5JZGVudGlmaWVyfTtcblxuLyoqXG4gKiBBbiBlbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBraW5kcyBvZiBjbGFzcyBtZW1iZXJzLlxuICovXG5leHBvcnQgZW51bSBDbGFzc01lbWJlcktpbmQge1xuICBDb25zdHJ1Y3RvcixcbiAgR2V0dGVyLFxuICBTZXR0ZXIsXG4gIFByb3BlcnR5LFxuICBNZXRob2QsXG59XG5cbi8qKlxuICogQSBtZW1iZXIgb2YgYSBjbGFzcywgc3VjaCBhcyBhIHByb3BlcnR5LCBtZXRob2QsIG9yIGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsYXNzTWVtYmVyIHtcbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgcmVmZXJlbmNlIHRvIHRoZSBjbGFzcyBtZW1iZXIgaXRzZWxmLCBvciBudWxsIGlmIGl0IGlzIG5vdCBhcHBsaWNhYmxlLlxuICAgKi9cbiAgbm9kZTogdHMuTm9kZXxudWxsO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0aW9uIG9mIHdoaWNoIHR5cGUgb2YgbWVtYmVyIHRoaXMgaXMgKHByb3BlcnR5LCBtZXRob2QsIGV0YykuXG4gICAqL1xuICBraW5kOiBDbGFzc01lbWJlcktpbmQ7XG5cbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgYHRzLlR5cGVOb2RlYCByZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YgdGhlIG1lbWJlciwgb3IgYG51bGxgIGlmIG5vdCBwcmVzZW50IG9yXG4gICAqIGFwcGxpY2FibGUuXG4gICAqL1xuICB0eXBlOiB0cy5UeXBlTm9kZXxudWxsO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBjbGFzcyBtZW1iZXIuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgYHRzLklkZW50aWZpZXJgIG9yIGB0cy5TdHJpbmdMaXRlcmFsYCByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhlIG1lbWJlciwgb3IgYG51bGxgXG4gICAqIGlmIG5vIHN1Y2ggbm9kZSBpcyBwcmVzZW50LlxuICAgKlxuICAgKiBUaGUgYG5hbWVOb2RlYCBpcyB1c2VmdWwgaW4gd3JpdGluZyByZWZlcmVuY2VzIHRvIHRoaXMgbWVtYmVyIHRoYXQgd2lsbCBiZSBjb3JyZWN0bHkgc291cmNlLVxuICAgKiBtYXBwZWQgYmFjayB0byB0aGUgb3JpZ2luYWwgZmlsZS5cbiAgICovXG4gIG5hbWVOb2RlOiB0cy5JZGVudGlmaWVyfHRzLlN0cmluZ0xpdGVyYWx8bnVsbDtcblxuICAvKipcbiAgICogVHlwZVNjcmlwdCBgdHMuRXhwcmVzc2lvbmAgd2hpY2ggcmVwcmVzZW50cyB0aGUgdmFsdWUgb2YgdGhlIG1lbWJlci5cbiAgICpcbiAgICogSWYgdGhlIG1lbWJlciBpcyBhIHByb3BlcnR5LCB0aGlzIHdpbGwgYmUgdGhlIHByb3BlcnR5IGluaXRpYWxpemVyIGlmIHRoZXJlIGlzIG9uZSwgb3IgbnVsbFxuICAgKiBvdGhlcndpc2UuXG4gICAqL1xuICB2YWx1ZTogdHMuRXhwcmVzc2lvbnxudWxsO1xuXG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0IGB0cy5EZWNsYXJhdGlvbmAgd2hpY2ggcmVwcmVzZW50cyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIG1lbWJlci5cbiAgICpcbiAgICogSW4gVHlwZVNjcmlwdCBjb2RlIHRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSBub2RlLCBidXQgaW4gZG93bmxldmVsZWQgY29kZSB0aGlzIHNob3VsZCBhbHdheXMgYmVcbiAgICogdGhlIERlY2xhcmF0aW9uIHdoaWNoIGFjdHVhbGx5IHJlcHJlc2VudHMgdGhlIG1lbWJlcidzIHJ1bnRpbWUgdmFsdWUuXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCB0aGUgVFMgY29kZTpcbiAgICpcbiAgICogYGBgXG4gICAqIGNsYXNzIENsYXp6IHtcbiAgICogICBzdGF0aWMgZ2V0IHByb3BlcnR5KCk6IHN0cmluZyB7XG4gICAqICAgICByZXR1cm4gJ3ZhbHVlJztcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIERvd25sZXZlbHMgdG86XG4gICAqXG4gICAqIGBgYFxuICAgKiB2YXIgQ2xhenogPSAoZnVuY3Rpb24gKCkge1xuICAgKiAgIGZ1bmN0aW9uIENsYXp6KCkge1xuICAgKiAgIH1cbiAgICogICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ2xhenosIFwicHJvcGVydHlcIiwge1xuICAgKiAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICogICAgICAgICAgIHJldHVybiAndmFsdWUnO1xuICAgKiAgICAgICB9LFxuICAgKiAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgKiAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICogICB9KTtcbiAgICogICByZXR1cm4gQ2xheno7XG4gICAqIH0oKSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBJbiB0aGlzIGV4YW1wbGUsIGZvciB0aGUgcHJvcGVydHkgXCJwcm9wZXJ0eVwiLCB0aGUgbm9kZSB3b3VsZCBiZSB0aGUgZW50aXJlXG4gICAqIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBFeHByZXNzaW9uU3RhdGVtZW50LCBidXQgdGhlIGltcGxlbWVudGF0aW9uIHdvdWxkIGJlIHRoaXNcbiAgICogRnVuY3Rpb25EZWNsYXJhdGlvbjpcbiAgICpcbiAgICogYGBgXG4gICAqIGZ1bmN0aW9uICgpIHtcbiAgICogICByZXR1cm4gJ3ZhbHVlJztcbiAgICogfSxcbiAgICogYGBgXG4gICAqL1xuICBpbXBsZW1lbnRhdGlvbjogdHMuRGVjbGFyYXRpb258bnVsbDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbWVtYmVyIGlzIHN0YXRpYyBvciBub3QuXG4gICAqL1xuICBpc1N0YXRpYzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW55IGBEZWNvcmF0b3JgcyB3aGljaCBhcmUgcHJlc2VudCBvbiB0aGUgbWVtYmVyLCBvciBgbnVsbGAgaWYgbm9uZSBhcmUgcHJlc2VudC5cbiAgICovXG4gIGRlY29yYXRvcnM6IERlY29yYXRvcltdfG51bGw7XG59XG5cbi8qKlxuICogQSByZWZlcmVuY2UgdG8gYSB2YWx1ZSB0aGF0IG9yaWdpbmF0ZWQgZnJvbSBhIHR5cGUgcG9zaXRpb24uXG4gKlxuICogRm9yIGV4YW1wbGUsIGEgY29uc3RydWN0b3IgcGFyYW1ldGVyIGNvdWxkIGJlIGRlY2xhcmVkIGFzIGBmb286IEZvb2AuIEEgYFR5cGVWYWx1ZVJlZmVyZW5jZWBcbiAqIGV4dHJhY3RlZCBmcm9tIHRoaXMgd291bGQgcmVmZXIgdG8gdGhlIHZhbHVlIG9mIHRoZSBjbGFzcyBgRm9vYCAoYXNzdW1pbmcgaXQgd2FzIGFjdHVhbGx5IGFcbiAqIHR5cGUpLlxuICpcbiAqIFRoZXJlIGFyZSB0d28ga2luZHMgb2Ygc3VjaCByZWZlcmVuY2VzLiBBIHJlZmVyZW5jZSB3aXRoIGBsb2NhbDogZmFsc2VgIHJlZmVycyB0byBhIHR5cGUgdGhhdCB3YXNcbiAqIGltcG9ydGVkLCBhbmQgZ2l2ZXMgdGhlIHN5bWJvbCBgbmFtZWAgYW5kIHRoZSBgbW9kdWxlTmFtZWAgb2YgdGhlIGltcG9ydC4gTm90ZSB0aGF0IHRoaXNcbiAqIGBtb2R1bGVOYW1lYCBtYXkgYmUgYSByZWxhdGl2ZSBwYXRoLCBhbmQgdGh1cyBpcyBsaWtlbHkgb25seSB2YWxpZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIGZpbGVcbiAqIHdoaWNoIGNvbnRhaW5lZCB0aGUgb3JpZ2luYWwgdHlwZSByZWZlcmVuY2UuXG4gKlxuICogQSByZWZlcmVuY2Ugd2l0aCBgbG9jYWw6IHRydWVgIHJlZmVycyB0byBhbnkgb3RoZXIga2luZCBvZiB0eXBlIHZpYSBhIGB0cy5FeHByZXNzaW9uYCB0aGF0J3NcbiAqIHZhbGlkIHdpdGhpbiB0aGUgbG9jYWwgZmlsZSB3aGVyZSB0aGUgdHlwZSB3YXMgcmVmZXJlbmNlZC5cbiAqL1xuZXhwb3J0IHR5cGUgVHlwZVZhbHVlUmVmZXJlbmNlID0ge1xuICBsb2NhbDogdHJ1ZTsgZXhwcmVzc2lvbjogdHMuRXhwcmVzc2lvbjsgZGVmYXVsdEltcG9ydFN0YXRlbWVudDogdHMuSW1wb3J0RGVjbGFyYXRpb24gfCBudWxsO1xufXx7XG4gIGxvY2FsOiBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIG1vZHVsZSBzcGVjaWZpZXIgZnJvbSB3aGljaCB0aGUgYGltcG9ydGVkTmFtZWAgc3ltYm9sIHNob3VsZCBiZSBpbXBvcnRlZC5cbiAgICovXG4gIG1vZHVsZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHRvcC1sZXZlbCBzeW1ib2wgdGhhdCBpcyBpbXBvcnRlZCBmcm9tIGBtb2R1bGVOYW1lYC4gSWYgYG5lc3RlZFBhdGhgIGlzIGFsc29cbiAgICogcHJlc2VudCwgYSBuZXN0ZWQgb2JqZWN0IGlzIGJlaW5nIHJlZmVyZW5jZWQgZnJvbSB0aGUgdG9wLWxldmVsIHN5bWJvbC5cbiAgICovXG4gIGltcG9ydGVkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiBwcmVzZW50LCByZXByZXNlbnRzIHRoZSBzeW1ib2wgbmFtZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBmcm9tIHRoZSB0b3AtbGV2ZWwgaW1wb3J0LlxuICAgKiBXaGVuIGBudWxsYCBvciBlbXB0eSwgdGhlIGBpbXBvcnRlZE5hbWVgIGl0c2VsZiBpcyB0aGUgc3ltYm9sIGJlaW5nIHJlZmVyZW5jZWQuXG4gICAqL1xuICBuZXN0ZWRQYXRoOiBzdHJpbmdbXXxudWxsO1xuXG4gIHZhbHVlRGVjbGFyYXRpb246IHRzLkRlY2xhcmF0aW9uO1xufTtcblxuLyoqXG4gKiBBIHBhcmFtZXRlciB0byBhIGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN0b3JQYXJhbWV0ZXIge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcGFyYW1ldGVyLCBpZiBhdmFpbGFibGUuXG4gICAqXG4gICAqIFNvbWUgcGFyYW1ldGVycyBkb24ndCBoYXZlIGEgc2ltcGxlIHN0cmluZyBuYW1lIChmb3IgZXhhbXBsZSwgcGFyYW1ldGVycyB3aGljaCBhcmUgZGVzdHJ1Y3R1cmVkXG4gICAqIGludG8gbXVsdGlwbGUgdmFyaWFibGVzKS4gSW4gdGhlc2UgY2FzZXMsIGBuYW1lYCBjYW4gYmUgYG51bGxgLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nfG51bGw7XG5cbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgYHRzLkJpbmRpbmdOYW1lYCByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlci5cbiAgICpcbiAgICogVGhlIGBuYW1lTm9kZWAgaXMgdXNlZnVsIGluIHdyaXRpbmcgcmVmZXJlbmNlcyB0byB0aGlzIG1lbWJlciB0aGF0IHdpbGwgYmUgY29ycmVjdGx5IHNvdXJjZS1cbiAgICogbWFwcGVkIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGZpbGUuXG4gICAqL1xuICBuYW1lTm9kZTogdHMuQmluZGluZ05hbWU7XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZSB0byB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlcidzIHR5cGUgYW5ub3RhdGlvbiwgaWYgaXQncyBwb3NzaWJsZSB0byByZWZlciB0byB0aGVcbiAgICogcGFyYW1ldGVyJ3MgdHlwZSBhcyBhIHZhbHVlLlxuICAgKlxuICAgKiBUaGlzIGNhbiBlaXRoZXIgYmUgYSByZWZlcmVuY2UgdG8gYSBsb2NhbCB2YWx1ZSwgaW4gd2hpY2ggY2FzZSBpdCBoYXMgYGxvY2FsYCBzZXQgdG8gYHRydWVgIGFuZFxuICAgKiBjb250YWlucyBhIGB0cy5FeHByZXNzaW9uYCwgb3IgaXQncyBhIHJlZmVyZW5jZSB0byBhbiBpbXBvcnRlZCB2YWx1ZSwgaW4gd2hpY2ggY2FzZSBgbG9jYWxgIGlzXG4gICAqIHNldCB0byBgZmFsc2VgIGFuZCB0aGUgc3ltYm9sIGFuZCBtb2R1bGUgbmFtZSBvZiB0aGUgaW1wb3J0ZWQgdmFsdWUgYXJlIHByb3ZpZGVkIGluc3RlYWQuXG4gICAqXG4gICAqIElmIHRoZSB0eXBlIGlzIG5vdCBwcmVzZW50IG9yIGNhbm5vdCBiZSByZXByZXNlbnRlZCBhcyBhbiBleHByZXNzaW9uLCBgdHlwZVZhbHVlUmVmZXJlbmNlYCBpc1xuICAgKiBgbnVsbGAuXG4gICAqL1xuICB0eXBlVmFsdWVSZWZlcmVuY2U6IFR5cGVWYWx1ZVJlZmVyZW5jZXxudWxsO1xuXG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0IGB0cy5UeXBlTm9kZWAgcmVwcmVzZW50aW5nIHRoZSB0eXBlIG5vZGUgZm91bmQgaW4gdGhlIHR5cGUgcG9zaXRpb24uXG4gICAqXG4gICAqIFRoaXMgZmllbGQgY2FuIGJlIHVzZWQgZm9yIGRpYWdub3N0aWNzIHJlcG9ydGluZyBpZiBgdHlwZVZhbHVlUmVmZXJlbmNlYCBpcyBgbnVsbGAuXG4gICAqXG4gICAqIENhbiBiZSBudWxsLCBpZiB0aGUgcGFyYW0gaGFzIG5vIHR5cGUgZGVjbGFyZWQuXG4gICAqL1xuICB0eXBlTm9kZTogdHMuVHlwZU5vZGV8bnVsbDtcblxuICAvKipcbiAgICogQW55IGBEZWNvcmF0b3JgcyB3aGljaCBhcmUgcHJlc2VudCBvbiB0aGUgcGFyYW1ldGVyLCBvciBgbnVsbGAgaWYgbm9uZSBhcmUgcHJlc2VudC5cbiAgICovXG4gIGRlY29yYXRvcnM6IERlY29yYXRvcltdfG51bGw7XG59XG5cbi8qKlxuICogRGVmaW5pdGlvbiBvZiBhIGZ1bmN0aW9uIG9yIG1ldGhvZCwgaW5jbHVkaW5nIGl0cyBib2R5IGlmIHByZXNlbnQgYW5kIGFueSBwYXJhbWV0ZXJzLlxuICpcbiAqIEluIFR5cGVTY3JpcHQgY29kZSB0aGlzIG1ldGFkYXRhIHdpbGwgYmUgYSBzaW1wbGUgcmVmbGVjdGlvbiBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBub2RlXG4gKiBpdHNlbGYuIEluIEVTNSBjb2RlIHRoaXMgY2FuIGJlIG1vcmUgY29tcGxpY2F0ZWQsIGFzIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVycyBtYXlcbiAqIGJlIGV4dHJhY3RlZCBmcm9tIGNlcnRhaW4gYm9keSBzdGF0ZW1lbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uRGVmaW5pdGlvbiB7XG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbm9kZSB3aGljaCBkZWNsYXJlcyB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICBub2RlOiB0cy5NZXRob2REZWNsYXJhdGlvbnx0cy5GdW5jdGlvbkRlY2xhcmF0aW9ufHRzLkZ1bmN0aW9uRXhwcmVzc2lvbnx0cy5WYXJpYWJsZURlY2xhcmF0aW9uO1xuXG4gIC8qKlxuICAgKiBTdGF0ZW1lbnRzIG9mIHRoZSBmdW5jdGlvbiBib2R5LCBpZiBhIGJvZHkgaXMgcHJlc2VudCwgb3IgbnVsbCBpZiBubyBib2R5IGlzIHByZXNlbnQgb3IgdGhlXG4gICAqIGZ1bmN0aW9uIGlzIGlkZW50aWZpZWQgdG8gcmVwcmVzZW50IGEgdHNsaWIgaGVscGVyIGZ1bmN0aW9uLCBpbiB3aGljaCBjYXNlIGBoZWxwZXJgIHdpbGxcbiAgICogaW5kaWNhdGUgd2hpY2ggaGVscGVyIHRoaXMgZnVuY3Rpb24gcmVwcmVzZW50cy5cbiAgICpcbiAgICogVGhpcyBsaXN0IG1heSBoYXZlIGJlZW4gZmlsdGVyZWQgdG8gZXhjbHVkZSBzdGF0ZW1lbnRzIHdoaWNoIHBlcmZvcm0gcGFyYW1ldGVyIGRlZmF1bHQgdmFsdWVcbiAgICogaW5pdGlhbGl6YXRpb24uXG4gICAqL1xuICBib2R5OiB0cy5TdGF0ZW1lbnRbXXxudWxsO1xuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSByZWdhcmRpbmcgdGhlIGZ1bmN0aW9uJ3MgcGFyYW1ldGVycywgaW5jbHVkaW5nIHBvc3NpYmxlIGRlZmF1bHQgdmFsdWUgZXhwcmVzc2lvbnMuXG4gICAqL1xuICBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJbXTtcbn1cblxuLyoqXG4gKiBQb3NzaWJsZSBkZWNsYXJhdGlvbnMgb2Yga25vd24gdmFsdWVzLCBzdWNoIGFzIGJ1aWx0LWluIG9iamVjdHMvZnVuY3Rpb25zIG9yIFR5cGVTY3JpcHQgaGVscGVycy5cbiAqL1xuZXhwb3J0IGVudW0gS25vd25EZWNsYXJhdGlvbiB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIEphdmFTY3JpcHQgZ2xvYmFsIGBPYmplY3RgIGNsYXNzLlxuICAgKi9cbiAgSnNHbG9iYWxPYmplY3QsXG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgYF9fYXNzaWduYCBUeXBlU2NyaXB0IGhlbHBlciBmdW5jdGlvbi5cbiAgICovXG4gIFRzSGVscGVyQXNzaWduLFxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIGBfX3NwcmVhZGAgVHlwZVNjcmlwdCBoZWxwZXIgZnVuY3Rpb24uXG4gICAqL1xuICBUc0hlbHBlclNwcmVhZCxcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSBgX19zcHJlYWRBcnJheXNgIFR5cGVTY3JpcHQgaGVscGVyIGZ1bmN0aW9uLlxuICAgKi9cbiAgVHNIZWxwZXJTcHJlYWRBcnJheXMsXG59XG5cbi8qKlxuICogQSBwYXJhbWV0ZXIgdG8gYSBmdW5jdGlvbiBvciBtZXRob2QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyYW1ldGVyIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHBhcmFtZXRlciwgaWYgYXZhaWxhYmxlLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nfG51bGw7XG5cbiAgLyoqXG4gICAqIERlY2xhcmF0aW9uIHdoaWNoIGNyZWF0ZWQgdGhpcyBwYXJhbWV0ZXIuXG4gICAqL1xuICBub2RlOiB0cy5QYXJhbWV0ZXJEZWNsYXJhdGlvbjtcblxuICAvKipcbiAgICogRXhwcmVzc2lvbiB3aGljaCByZXByZXNlbnRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIsIGlmIGFueS5cbiAgICovXG4gIGluaXRpYWxpemVyOiB0cy5FeHByZXNzaW9ufG51bGw7XG59XG5cbi8qKlxuICogVGhlIHNvdXJjZSBvZiBhbiBpbXBvcnRlZCBzeW1ib2wsIGluY2x1ZGluZyB0aGUgb3JpZ2luYWwgc3ltYm9sIG5hbWUgYW5kIHRoZSBtb2R1bGUgZnJvbSB3aGljaCBpdFxuICogd2FzIGltcG9ydGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydCB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgaW1wb3J0ZWQgc3ltYm9sIHVuZGVyIHdoaWNoIGl0IHdhcyBleHBvcnRlZCAobm90IGltcG9ydGVkKS5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vZHVsZSBmcm9tIHdoaWNoIHRoZSBzeW1ib2wgd2FzIGltcG9ydGVkLlxuICAgKlxuICAgKiBUaGlzIGNvdWxkIGVpdGhlciBiZSBhbiBhYnNvbHV0ZSBtb2R1bGUgbmFtZSAoQGFuZ3VsYXIvY29yZSBmb3IgZXhhbXBsZSkgb3IgYSByZWxhdGl2ZSBwYXRoLlxuICAgKi9cbiAgZnJvbTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIGVudW0gbWVtYmVyIGV4dHJhY3RlZCBmcm9tIEphdmFTY3JpcHQgd2hlbiBubyBgdHMuRW51bURlY2xhcmF0aW9uYCBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW51bU1lbWJlciB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZW51bSBtZW1iZXIuXG4gICAqL1xuICBuYW1lOiB0cy5Qcm9wZXJ0eU5hbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsaXplciBleHByZXNzaW9uIG9mIHRoZSBlbnVtIG1lbWJlci4gVW5saWtlIGluIFR5cGVTY3JpcHQsIHRoaXMgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgKiBpbiBlbWl0dGVkIEphdmFTY3JpcHQuXG4gICAqL1xuICBpbml0aWFsaXplcjogdHMuRXhwcmVzc2lvbjtcbn1cblxuLyoqXG4gKiBCYXNlIHR5cGUgZm9yIGFsbCBgRGVjbGFyYXRpb25gcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlRGVjbGFyYXRpb248VCBleHRlbmRzIHRzLkRlY2xhcmF0aW9uID0gdHMuRGVjbGFyYXRpb24+IHtcbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBtb2R1bGUgcGF0aCBmcm9tIHdoaWNoIHRoZSBzeW1ib2wgd2FzIGltcG9ydGVkIGludG8gdGhlIGFwcGxpY2F0aW9uLCBpZiB0aGUgc3ltYm9sXG4gICAqIHdhcyBpbXBvcnRlZCB2aWEgYW4gYWJzb2x1dGUgbW9kdWxlIChldmVuIHRocm91Z2ggYSBjaGFpbiBvZiByZS1leHBvcnRzKS4gSWYgdGhlIHN5bWJvbCBpcyBwYXJ0XG4gICAqIG9mIHRoZSBhcHBsaWNhdGlvbiBhbmQgd2FzIG5vdCBpbXBvcnRlZCBmcm9tIGFuIGFic29sdXRlIHBhdGgsIHRoaXMgd2lsbCBiZSBgbnVsbGAuXG4gICAqL1xuICB2aWFNb2R1bGU6IHN0cmluZ3xudWxsO1xuXG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0IHJlZmVyZW5jZSB0byB0aGUgZGVjbGFyYXRpb24gaXRzZWxmLCBpZiBvbmUgZXhpc3RzLlxuICAgKi9cbiAgbm9kZTogVHxudWxsO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQsIGRlc2NyaWJlcyB0aGUgdHlwZSBvZiB0aGUga25vd24gZGVjbGFyYXRpb24gdGhpcyBkZWNsYXJhdGlvbiByZXNvbHZlcyB0by5cbiAgICovXG4gIGtub3duOiBLbm93bkRlY2xhcmF0aW9ufG51bGw7XG59XG5cbi8qKlxuICogQSBkZWNsYXJhdGlvbiB0aGF0IGhhcyBhbiBhc3NvY2lhdGVkIFR5cGVTY3JpcHQgYHRzLkRlY2xhcmF0aW9uYC5cbiAqXG4gKiBUaGUgYWx0ZXJuYXRpdmUgaXMgYW4gYElubGluZURlY2xhcmF0aW9uYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25jcmV0ZURlY2xhcmF0aW9uPFQgZXh0ZW5kcyB0cy5EZWNsYXJhdGlvbiA9IHRzLkRlY2xhcmF0aW9uPiBleHRlbmRzXG4gICAgQmFzZURlY2xhcmF0aW9uPFQ+IHtcbiAgbm9kZTogVDtcblxuICAvKipcbiAgICogT3B0aW9uYWxseSByZXByZXNlbnRzIGEgc3BlY2lhbCBpZGVudGl0eSBvZiB0aGUgZGVjbGFyYXRpb24sIG9yIGBudWxsYCBpZiB0aGUgZGVjbGFyYXRpb25cbiAgICogZG9lcyBub3QgaGF2ZSBhIHNwZWNpYWwgaWRlbnRpdHkuXG4gICAqL1xuICBpZGVudGl0eTogU3BlY2lhbERlY2xhcmF0aW9uSWRlbnRpdHl8bnVsbDtcbn1cblxuZXhwb3J0IHR5cGUgU3BlY2lhbERlY2xhcmF0aW9uSWRlbnRpdHkgPSBEb3dubGV2ZWxlZEVudW07XG5cbmV4cG9ydCBjb25zdCBlbnVtIFNwZWNpYWxEZWNsYXJhdGlvbktpbmQge1xuICBEb3dubGV2ZWxlZEVudW0sXG59XG5cbi8qKlxuICogQSBzcGVjaWFsIGRlY2xhcmF0aW9uIGlkZW50aXR5IHRoYXQgcmVwcmVzZW50cyBhbiBlbnVtLiBUaGlzIGlzIHVzZWQgaW4gZG93bmxldmVsZWQgZm9ybXMgd2hlcmVcbiAqIGEgYHRzLkVudW1EZWNsYXJhdGlvbmAgaXMgZW1pdHRlZCBpbiBhbiBhbHRlcm5hdGl2ZSBmb3JtLCBlLmcuIGFuIElJRkUgY2FsbCB0aGF0IGRlY2xhcmVzIGFsbFxuICogbWVtYmVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3dubGV2ZWxlZEVudW0ge1xuICBraW5kOiBTcGVjaWFsRGVjbGFyYXRpb25LaW5kLkRvd25sZXZlbGVkRW51bTtcbiAgZW51bU1lbWJlcnM6IEVudW1NZW1iZXJbXTtcbn1cblxuLyoqXG4gKiBBIGRlY2xhcmF0aW9uIHRoYXQgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIFR5cGVTY3JpcHQgYHRzLkRlY2xhcmF0aW9uYCwgb25seSBhXG4gKiBgdHMuRXhwcmVzc2lvbmAuXG4gKlxuICogVGhpcyBjYW4gb2NjdXIgaW4gc29tZSBkb3dubGV2ZWxpbmdzIHdoZW4gYW4gYGV4cG9ydCBjb25zdCBWQVIgPSAuLi47YCAoYSBgdHMuRGVjbGFyYXRpb25gKSBpc1xuICogdHJhbnNwaWxlZCB0byBhbiBhc3NpZ25tZW50IHN0YXRlbWVudCAoZS5nLiBgZXhwb3J0cy5WQVIgPSAuLi47YCkuIFRoZXJlIGlzIG5vIGB0cy5EZWNsYXJhdGlvbmBcbiAqIGFzc29jaWF0ZWQgd2l0aCBgVkFSYCBpbiB0aGF0IGNhc2UsIG9ubHkgYW4gZXhwcmVzc2lvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmxpbmVEZWNsYXJhdGlvbiBleHRlbmRzIEJhc2VEZWNsYXJhdGlvbiB7XG4gIG5vZGU6IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBgdHMuRXhwcmVzc2lvbmAgd2hpY2ggY29uc3RpdHV0ZXMgdGhlIHZhbHVlIG9mIHRoZSBkZWNsYXJhdGlvbi5cbiAgICovXG4gIGV4cHJlc3Npb246IHRzLkV4cHJlc3Npb247XG59XG5cbi8qKlxuICogVGhlIGRlY2xhcmF0aW9uIG9mIGEgc3ltYm9sLCBhbG9uZyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGhvdyBpdCB3YXMgaW1wb3J0ZWQgaW50byB0aGVcbiAqIGFwcGxpY2F0aW9uLlxuICpcbiAqIFRoaXMgY2FuIGVpdGhlciBiZSBhIGBDb25jcmV0ZURlY2xhcmF0aW9uYCBpZiB0aGUgdW5kZXJseWluZyBUeXBlU2NyaXB0IG5vZGUgZm9yIHRoZSBzeW1ib2wgaXMgYW5cbiAqIGFjdHVhbCBgdHMuRGVjbGFyYXRpb25gLCBvciBhbiBgSW5saW5lRGVjbGFyYXRpb25gIGlmIHRoZSBkZWNsYXJhdGlvbiB3YXMgdHJhbnNwaWxlZCBpbiBjZXJ0YWluXG4gKiBkb3dubGV2ZWxpbmdzIHRvIGEgYHRzLkV4cHJlc3Npb25gIGluc3RlYWQuXG4gKi9cbmV4cG9ydCB0eXBlIERlY2xhcmF0aW9uPFQgZXh0ZW5kcyB0cy5EZWNsYXJhdGlvbiA9IHRzLkRlY2xhcmF0aW9uPiA9XG4gICAgQ29uY3JldGVEZWNsYXJhdGlvbjxUPnxJbmxpbmVEZWNsYXJhdGlvbjtcblxuLyoqXG4gKiBBYnN0cmFjdHMgcmVmbGVjdGlvbiBvcGVyYXRpb25zIG9uIGEgVHlwZVNjcmlwdCBBU1QuXG4gKlxuICogRGVwZW5kaW5nIG9uIHRoZSBmb3JtYXQgb2YgdGhlIGNvZGUgYmVpbmcgaW50ZXJwcmV0ZWQsIGRpZmZlcmVudCBjb25jZXB0cyBhcmUgcmVwcmVzZW50ZWRcbiAqIHdpdGggZGlmZmVyZW50IHN5bnRhY3RpY2FsIHN0cnVjdHVyZXMuIFRoZSBgUmVmbGVjdGlvbkhvc3RgIGFic3RyYWN0cyBvdmVyIHRob3NlIGRpZmZlcmVuY2VzIGFuZFxuICogcHJlc2VudHMgYSBzaW5nbGUgQVBJIGJ5IHdoaWNoIHRoZSBjb21waWxlciBjYW4gcXVlcnkgc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEFTVC5cbiAqXG4gKiBBbGwgb3BlcmF0aW9ucyBvbiB0aGUgYFJlZmxlY3Rpb25Ib3N0YCByZXF1aXJlIHRoZSB1c2Ugb2YgVHlwZVNjcmlwdCBgdHMuTm9kZWBzIHdpdGggYmluZGluZ1xuICogaW5mb3JtYXRpb24gYWxyZWFkeSBhdmFpbGFibGUgKHRoYXQgaXMsIG5vZGVzIHRoYXQgY29tZSBmcm9tIGEgYHRzLlByb2dyYW1gIHRoYXQgaGFzIGJlZW5cbiAqIHR5cGUtY2hlY2tlZCwgYW5kIGFyZSBub3Qgc3ludGhldGljYWxseSBjcmVhdGVkKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWZsZWN0aW9uSG9zdCB7XG4gIC8qKlxuICAgKiBFeGFtaW5lIGEgZGVjbGFyYXRpb24gKGZvciBleGFtcGxlLCBvZiBhIGNsYXNzIG9yIGZ1bmN0aW9uKSBhbmQgcmV0dXJuIG1ldGFkYXRhIGFib3V0IGFueVxuICAgKiBkZWNvcmF0b3JzIHByZXNlbnQgb24gdGhlIGRlY2xhcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZGVjbGFyYXRpb24gYSBUeXBlU2NyaXB0IGB0cy5EZWNsYXJhdGlvbmAgbm9kZSByZXByZXNlbnRpbmcgdGhlIGNsYXNzIG9yIGZ1bmN0aW9uIG92ZXJcbiAgICogd2hpY2ggdG8gcmVmbGVjdC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBpbnRlbnQgaXMgdG8gcmVmbGVjdCB0aGUgZGVjb3JhdG9ycyBvZiBhIGNsYXNzIGFuZCB0aGVcbiAgICogc291cmNlIGlzIGluIEVTNiBmb3JtYXQsIHRoaXMgd2lsbCBiZSBhIGB0cy5DbGFzc0RlY2xhcmF0aW9uYCBub2RlLiBJZiB0aGUgc291cmNlIGlzIGluIEVTNVxuICAgKiBmb3JtYXQsIHRoaXMgbWlnaHQgYmUgYSBgdHMuVmFyaWFibGVEZWNsYXJhdGlvbmAgYXMgY2xhc3NlcyBpbiBFUzUgYXJlIHJlcHJlc2VudGVkIGFzIHRoZVxuICAgKiByZXN1bHQgb2YgYW4gSUlGRSBleGVjdXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIGFuIGFycmF5IG9mIGBEZWNvcmF0b3JgIG1ldGFkYXRhIGlmIGRlY29yYXRvcnMgYXJlIHByZXNlbnQgb24gdGhlIGRlY2xhcmF0aW9uLCBvclxuICAgKiBgbnVsbGAgaWYgZWl0aGVyIG5vIGRlY29yYXRvcnMgd2VyZSBwcmVzZW50IG9yIGlmIHRoZSBkZWNsYXJhdGlvbiBpcyBub3Qgb2YgYSBkZWNvcmF0YWJsZSB0eXBlLlxuICAgKi9cbiAgZ2V0RGVjb3JhdG9yc09mRGVjbGFyYXRpb24oZGVjbGFyYXRpb246IHRzLkRlY2xhcmF0aW9uKTogRGVjb3JhdG9yW118bnVsbDtcblxuICAvKipcbiAgICogRXhhbWluZSBhIGRlY2xhcmF0aW9uIHdoaWNoIHNob3VsZCBiZSBvZiBhIGNsYXNzLCBhbmQgcmV0dXJuIG1ldGFkYXRhIGFib3V0IHRoZSBtZW1iZXJzIG9mIHRoZVxuICAgKiBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIGNsYXp6IGEgYENsYXNzRGVjbGFyYXRpb25gIHJlcHJlc2VudGluZyB0aGUgY2xhc3Mgb3ZlciB3aGljaCB0byByZWZsZWN0LlxuICAgKlxuICAgKiBAcmV0dXJucyBhbiBhcnJheSBvZiBgQ2xhc3NNZW1iZXJgIG1ldGFkYXRhIHJlcHJlc2VudGluZyB0aGUgbWVtYmVycyBvZiB0aGUgY2xhc3MuXG4gICAqXG4gICAqIEB0aHJvd3MgaWYgYGRlY2xhcmF0aW9uYCBkb2VzIG5vdCByZXNvbHZlIHRvIGEgY2xhc3MgZGVjbGFyYXRpb24uXG4gICAqL1xuICBnZXRNZW1iZXJzT2ZDbGFzcyhjbGF6ejogQ2xhc3NEZWNsYXJhdGlvbik6IENsYXNzTWVtYmVyW107XG5cbiAgLyoqXG4gICAqIFJlZmxlY3Qgb3ZlciB0aGUgY29uc3RydWN0b3Igb2YgYSBjbGFzcyBhbmQgcmV0dXJuIG1ldGFkYXRhIGFib3V0IGl0cyBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBvbmx5IGxvb2tzIGF0IHRoZSBjb25zdHJ1Y3RvciBvZiBhIGNsYXNzIGRpcmVjdGx5IGFuZCBub3QgYXQgYW55IGluaGVyaXRlZFxuICAgKiBjb25zdHJ1Y3RvcnMuXG4gICAqXG4gICAqIEBwYXJhbSBjbGF6eiBhIGBDbGFzc0RlY2xhcmF0aW9uYCByZXByZXNlbnRpbmcgdGhlIGNsYXNzIG92ZXIgd2hpY2ggdG8gcmVmbGVjdC5cbiAgICpcbiAgICogQHJldHVybnMgYW4gYXJyYXkgb2YgYFBhcmFtZXRlcmAgbWV0YWRhdGEgcmVwcmVzZW50aW5nIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBjb25zdHJ1Y3RvciwgaWZcbiAgICogYSBjb25zdHJ1Y3RvciBleGlzdHMuIElmIHRoZSBjb25zdHJ1Y3RvciBleGlzdHMgYW5kIGhhcyAwIHBhcmFtZXRlcnMsIHRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eS5cbiAgICogSWYgdGhlIGNsYXNzIGhhcyBubyBjb25zdHJ1Y3RvciwgdGhpcyBtZXRob2QgcmV0dXJucyBgbnVsbGAuXG4gICAqL1xuICBnZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoY2xheno6IENsYXNzRGVjbGFyYXRpb24pOiBDdG9yUGFyYW1ldGVyW118bnVsbDtcblxuICAvKipcbiAgICogUmVmbGVjdCBvdmVyIGEgZnVuY3Rpb24gYW5kIHJldHVybiBtZXRhZGF0YSBhYm91dCBpdHMgcGFyYW1ldGVycyBhbmQgYm9keS5cbiAgICpcbiAgICogRnVuY3Rpb25zIGluIFR5cGVTY3JpcHQgYW5kIEVTNSBjb2RlIGhhdmUgZGlmZmVyZW50IEFTVCByZXByZXNlbnRhdGlvbnMsIGluIHBhcnRpY3VsYXIgYXJvdW5kXG4gICAqIGRlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzLiBBIFR5cGVTY3JpcHQgZnVuY3Rpb24gaGFzIGl0cyBkZWZhdWx0IHZhbHVlIGFzIHRoZSBpbml0aWFsaXplclxuICAgKiBvbiB0aGUgcGFyYW1ldGVyIGRlY2xhcmF0aW9uLCB3aGVyZWFzIGFuIEVTNSBmdW5jdGlvbiBoYXMgaXRzIGRlZmF1bHQgdmFsdWUgc2V0IGluIGEgc3RhdGVtZW50XG4gICAqIG9mIHRoZSBmb3JtOlxuICAgKlxuICAgKiBpZiAocGFyYW0gPT09IHZvaWQgMCkgeyBwYXJhbSA9IDM7IH1cbiAgICpcbiAgICogVGhpcyBtZXRob2QgYWJzdHJhY3RzIG92ZXIgdGhlc2UgZGV0YWlscywgYW5kIGludGVycHJldHMgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGFuZCBib2R5IHRvXG4gICAqIGV4dHJhY3QgcGFyYW1ldGVyIGRlZmF1bHQgdmFsdWVzIGFuZCB0aGUgXCJyZWFsXCIgYm9keS5cbiAgICpcbiAgICogQSBjdXJyZW50IGxpbWl0YXRpb24gaXMgdGhhdCB0aGlzIG1ldGFkYXRhIGhhcyBubyByZXByZXNlbnRhdGlvbiBmb3Igc2hvcnRoYW5kIGFzc2lnbm1lbnQgb2ZcbiAgICogcGFyYW1ldGVyIG9iamVjdHMgaW4gdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZS5cbiAgICpcbiAgICogQHBhcmFtIGZuIGEgVHlwZVNjcmlwdCBgdHMuRGVjbGFyYXRpb25gIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBmdW5jdGlvbiBvdmVyIHdoaWNoIHRvIHJlZmxlY3QuXG4gICAqXG4gICAqIEByZXR1cm5zIGEgYEZ1bmN0aW9uRGVmaW5pdGlvbmAgZ2l2aW5nIG1ldGFkYXRhIGFib3V0IHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLlxuICAgKi9cbiAgZ2V0RGVmaW5pdGlvbk9mRnVuY3Rpb24oZm46IHRzLk5vZGUpOiBGdW5jdGlvbkRlZmluaXRpb258bnVsbDtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIGFuIGlkZW50aWZpZXIgd2FzIGltcG9ydGVkIGZyb20gYW5vdGhlciBtb2R1bGUgYW5kIHJldHVybiBgSW1wb3J0YCBtZXRhZGF0YVxuICAgKiBkZXNjcmliaW5nIGl0cyBvcmlnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBpZCBhIFR5cGVTY3JpcHQgYHRzLklkZW50aWZlcmAgdG8gcmVmbGVjdC5cbiAgICpcbiAgICogQHJldHVybnMgbWV0YWRhdGEgYWJvdXQgdGhlIGBJbXBvcnRgIGlmIHRoZSBpZGVudGlmaWVyIHdhcyBpbXBvcnRlZCBmcm9tIGFub3RoZXIgbW9kdWxlLCBvclxuICAgKiBgbnVsbGAgaWYgdGhlIGlkZW50aWZpZXIgZG9lc24ndCByZXNvbHZlIHRvIGFuIGltcG9ydCBidXQgaW5zdGVhZCBpcyBsb2NhbGx5IGRlZmluZWQuXG4gICAqL1xuICBnZXRJbXBvcnRPZklkZW50aWZpZXIoaWQ6IHRzLklkZW50aWZpZXIpOiBJbXBvcnR8bnVsbDtcblxuICAvKipcbiAgICogVHJhY2UgYW4gaWRlbnRpZmllciB0byBpdHMgZGVjbGFyYXRpb24sIGlmIHBvc3NpYmxlLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBhdHRlbXB0cyB0byByZXNvbHZlIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgZ2l2ZW4gaWRlbnRpZmllciwgdHJhY2luZyBiYWNrIHRocm91Z2hcbiAgICogaW1wb3J0cyBhbmQgcmUtZXhwb3J0cyB1bnRpbCB0aGUgb3JpZ2luYWwgZGVjbGFyYXRpb24gc3RhdGVtZW50IGlzIGZvdW5kLiBBIGBEZWNsYXJhdGlvbmBcbiAgICogb2JqZWN0IGlzIHJldHVybmVkIGlmIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiBpcyBmb3VuZCwgb3IgYG51bGxgIGlzIHJldHVybmVkIG90aGVyd2lzZS5cbiAgICpcbiAgICogSWYgdGhlIGRlY2xhcmF0aW9uIGlzIGluIGEgZGlmZmVyZW50IG1vZHVsZSwgYW5kIHRoYXQgbW9kdWxlIGlzIGltcG9ydGVkIHZpYSBhbiBhYnNvbHV0ZSBwYXRoLFxuICAgKiB0aGlzIG1ldGhvZCBhbHNvIHJldHVybnMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGltcG9ydGVkIG1vZHVsZS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBjb2RlIGlzOlxuICAgKlxuICAgKiBgYGBcbiAgICogaW1wb3J0IHtSb3V0ZXJNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuICAgKlxuICAgKiBleHBvcnQgY29uc3QgUk9VVEVTID0gUm91dGVyTW9kdWxlLmZvclJvb3QoWy4uLl0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogYW5kIGlmIGBnZXREZWNsYXJhdGlvbk9mSWRlbnRpZmllcmAgaXMgY2FsbGVkIG9uIGBSb3V0ZXJNb2R1bGVgIGluIHRoZSBgUk9VVEVTYCBleHByZXNzaW9uLFxuICAgKiB0aGVuIGl0IHdvdWxkIHRyYWNlIGBSb3V0ZXJNb2R1bGVgIHZpYSBpdHMgaW1wb3J0IGZyb20gYEBhbmd1bGFyL2NvcmVgLCBhbmQgbm90ZSB0aGF0IHRoZVxuICAgKiBkZWZpbml0aW9uIHdhcyBpbXBvcnRlZCBmcm9tIGBAYW5ndWxhci9jb3JlYCBpbnRvIHRoZSBhcHBsaWNhdGlvbiB3aGVyZSBpdCB3YXMgcmVmZXJlbmNlZC5cbiAgICpcbiAgICogSWYgdGhlIGRlZmluaXRpb24gaXMgcmUtZXhwb3J0ZWQgc2V2ZXJhbCB0aW1lcyBmcm9tIGRpZmZlcmVudCBhYnNvbHV0ZSBtb2R1bGUgbmFtZXMsIG9ubHlcbiAgICogdGhlIGZpcnN0IG9uZSAodGhlIG9uZSBieSB3aGljaCB0aGUgYXBwbGljYXRpb24gcmVmZXJzIHRvIHRoZSBtb2R1bGUpIGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBUaGlzIG1vZHVsZSBuYW1lIGlzIHJldHVybmVkIGluIHRoZSBgdmlhTW9kdWxlYCBmaWVsZCBvZiB0aGUgYERlY2xhcmF0aW9uYC4gSWYgVGhlIGRlY2xhcmF0aW9uXG4gICAqIGlzIHJlbGF0aXZlIHRvIHRoZSBhcHBsaWNhdGlvbiBpdHNlbGYgYW5kIHRoZXJlIHdhcyBubyBpbXBvcnQgdGhyb3VnaCBhbiBhYnNvbHV0ZSBwYXRoLCB0aGVuXG4gICAqIGB2aWFNb2R1bGVgIGlzIGBudWxsYC5cbiAgICpcbiAgICogQHBhcmFtIGlkIGEgVHlwZVNjcmlwdCBgdHMuSWRlbnRpZmllcmAgdG8gdHJhY2UgYmFjayB0byBhIGRlY2xhcmF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBtZXRhZGF0YSBhYm91dCB0aGUgYERlY2xhcmF0aW9uYCBpZiB0aGUgb3JpZ2luYWwgZGVjbGFyYXRpb24gaXMgZm91bmQsIG9yIGBudWxsYFxuICAgKiBvdGhlcndpc2UuXG4gICAqL1xuICBnZXREZWNsYXJhdGlvbk9mSWRlbnRpZmllcihpZDogdHMuSWRlbnRpZmllcik6IERlY2xhcmF0aW9ufG51bGw7XG5cbiAgLyoqXG4gICAqIENvbGxlY3QgdGhlIGRlY2xhcmF0aW9ucyBleHBvcnRlZCBmcm9tIGEgbW9kdWxlIGJ5IG5hbWUuXG4gICAqXG4gICAqIEl0ZXJhdGVzIG92ZXIgdGhlIGV4cG9ydHMgb2YgYSBtb2R1bGUgKGluY2x1ZGluZyByZS1leHBvcnRzKSBhbmQgcmV0dXJucyBhIG1hcCBvZiBleHBvcnRcbiAgICogbmFtZSB0byBpdHMgYERlY2xhcmF0aW9uYC4gSWYgYW4gZXhwb3J0ZWQgdmFsdWUgaXMgaXRzZWxmIHJlLWV4cG9ydGVkIGZyb20gYW5vdGhlciBtb2R1bGUsXG4gICAqIHRoZSBgRGVjbGFyYXRpb25gJ3MgYHZpYU1vZHVsZWAgd2lsbCByZWZsZWN0IHRoYXQuXG4gICAqXG4gICAqIEBwYXJhbSBub2RlIGEgVHlwZVNjcmlwdCBgdHMuTm9kZWAgcmVwcmVzZW50aW5nIHRoZSBtb2R1bGUgKGZvciBleGFtcGxlIGEgYHRzLlNvdXJjZUZpbGVgKSBmb3JcbiAgICogd2hpY2ggdG8gY29sbGVjdCBleHBvcnRzLlxuICAgKlxuICAgKiBAcmV0dXJucyBhIG1hcCBvZiBgRGVjbGFyYXRpb25gcyBmb3IgdGhlIG1vZHVsZSdzIGV4cG9ydHMsIGJ5IG5hbWUuXG4gICAqL1xuICBnZXRFeHBvcnRzT2ZNb2R1bGUobW9kdWxlOiB0cy5Ob2RlKTogTWFwPHN0cmluZywgRGVjbGFyYXRpb24+fG51bGw7XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYWN0dWFsbHkgcmVwcmVzZW50cyBhIGNsYXNzLlxuICAgKi9cbiAgaXNDbGFzcyhub2RlOiB0cy5Ob2RlKTogbm9kZSBpcyBDbGFzc0RlY2xhcmF0aW9uO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGRlY2xhcmF0aW9uLCB3aGljaCBzaG91bGQgYmUgYSBjbGFzcywgaGFzIGEgYmFzZSBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIGNsYXp6IGEgYENsYXNzRGVjbGFyYXRpb25gIHJlcHJlc2VudGluZyB0aGUgY2xhc3Mgb3ZlciB3aGljaCB0byByZWZsZWN0LlxuICAgKi9cbiAgaGFzQmFzZUNsYXNzKGNsYXp6OiBDbGFzc0RlY2xhcmF0aW9uKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogR2V0IGFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBiYXNlIGNsYXNzIChpZiBhbnkpIG9mIHRoZSBnaXZlbiBgY2xhenpgLlxuICAgKlxuICAgKiBUaGlzIGV4cHJlc3Npb24gaXMgbW9zdCBjb21tb25seSBhbiBJZGVudGlmaWVyLCBidXQgaXMgcG9zc2libGUgdG8gaW5oZXJpdCBmcm9tIGEgbW9yZSBkeW5hbWljXG4gICAqIGV4cHJlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSBjbGF6eiB0aGUgY2xhc3Mgd2hvc2UgYmFzZSB3ZSB3YW50IHRvIGdldC5cbiAgICovXG4gIGdldEJhc2VDbGFzc0V4cHJlc3Npb24oY2xheno6IENsYXNzRGVjbGFyYXRpb24pOiB0cy5FeHByZXNzaW9ufG51bGw7XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyIG9mIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzIG9mIGEgZ2l2ZW4gY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSBjbGF6eiBhIGBDbGFzc0RlY2xhcmF0aW9uYCByZXByZXNlbnRpbmcgdGhlIGNsYXNzIG92ZXIgd2hpY2ggdG8gcmVmbGVjdC5cbiAgICpcbiAgICogQHJldHVybnMgdGhlIG51bWJlciBvZiB0eXBlIHBhcmFtZXRlcnMgb2YgdGhlIGNsYXNzLCBpZiBrbm93biwgb3IgYG51bGxgIGlmIHRoZSBkZWNsYXJhdGlvblxuICAgKiBpcyBub3QgYSBjbGFzcyBvciBoYXMgYW4gdW5rbm93biBudW1iZXIgb2YgdHlwZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgZ2V0R2VuZXJpY0FyaXR5T2ZDbGFzcyhjbGF6ejogQ2xhc3NEZWNsYXJhdGlvbik6IG51bWJlcnxudWxsO1xuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBhc3NpZ25lZCB2YWx1ZSBvZiBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uLlxuICAgKlxuICAgKiBOb3JtYWxseSB0aGlzIHdpbGwgYmUgdGhlIGluaXRpYWxpemVyIG9mIHRoZSBkZWNsYXJhdGlvbiwgYnV0IHdoZXJlIHRoZSB2YXJpYWJsZSBpc1xuICAgKiBub3QgYSBgY29uc3RgIHdlIG1heSBuZWVkIHRvIGxvb2sgZWxzZXdoZXJlIGZvciB0aGUgdmFyaWFibGUncyB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIGRlY2xhcmF0aW9uIGEgVHlwZVNjcmlwdCB2YXJpYWJsZSBkZWNsYXJhdGlvbiwgd2hvc2UgdmFsdWUgd2Ugd2FudC5cbiAgICogQHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSwgYXMgYSBUeXBlU2NyaXB0IGV4cHJlc3Npb24gbm9kZSwgb3IgYHVuZGVmaW5lZGBcbiAgICogaWYgdGhlIHZhbHVlIGNhbm5vdCBiZSBjb21wdXRlZC5cbiAgICovXG4gIGdldFZhcmlhYmxlVmFsdWUoZGVjbGFyYXRpb246IHRzLlZhcmlhYmxlRGVjbGFyYXRpb24pOiB0cy5FeHByZXNzaW9ufG51bGw7XG5cbiAgLyoqXG4gICAqIFRha2UgYW4gZXhwb3J0ZWQgZGVjbGFyYXRpb24gKG1heWJlIGEgY2xhc3MgZG93bi1sZXZlbGVkIHRvIGEgdmFyaWFibGUpIGFuZCBsb29rIHVwIHRoZVxuICAgKiBkZWNsYXJhdGlvbiBvZiBpdHMgdHlwZSBpbiBhIHNlcGFyYXRlIC5kLnRzIHRyZWUuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgYWxsb3dlZCB0byByZXR1cm4gYG51bGxgIGlmIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQgZG9lcyBub3QgaGF2ZSBhXG4gICAqIHNlcGFyYXRlIC5kLnRzIHRyZWUuIFdoZW4gY29tcGlsaW5nIFR5cGVTY3JpcHQgY29kZSB0aGlzIGlzIGFsd2F5cyB0aGUgY2FzZSwgc2luY2UgLmQudHMgZmlsZXNcbiAgICogYXJlIHByb2R1Y2VkIG9ubHkgZHVyaW5nIHRoZSBlbWl0IG9mIHN1Y2ggYSBjb21waWxhdGlvbi4gV2hlbiBjb21waWxpbmcgLmpzIGNvZGUsIGhvd2V2ZXIsXG4gICAqIHRoZXJlIGlzIGZyZXF1ZW50bHkgYSBwYXJhbGxlbCAuZC50cyB0cmVlIHdoaWNoIHRoaXMgbWV0aG9kIGV4cG9zZXMuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgYHRzLkRlY2xhcmF0aW9uYCByZXR1cm5lZCBmcm9tIHRoaXMgZnVuY3Rpb24gbWF5IG5vdCBiZSBmcm9tIHRoZSBzYW1lXG4gICAqIGB0cy5Qcm9ncmFtYCBhcyB0aGUgaW5wdXQgZGVjbGFyYXRpb24uXG4gICAqL1xuICBnZXREdHNEZWNsYXJhdGlvbihkZWNsYXJhdGlvbjogdHMuRGVjbGFyYXRpb24pOiB0cy5EZWNsYXJhdGlvbnxudWxsO1xuXG4gIC8qKlxuICAgKiBHZXQgYSBgdHMuSWRlbnRpZmllcmAgZm9yIGEgZ2l2ZW4gYENsYXNzRGVjbGFyYXRpb25gIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBjbGFzc1xuICAgKiB3aXRoaW4gaXRzIGRlZmluaXRpb24gKHN1Y2ggYXMgaW4gc3RhdGljIGZpZWxkcykuXG4gICAqXG4gICAqIFRoaXMgY2FuIGRpZmZlciBmcm9tIGBjbGF6ei5uYW1lYCB3aGVuIG5nY2MgcnVucyBvdmVyIEVTNSBjb2RlLCBzaW5jZSB0aGUgY2xhc3MgbWF5IGhhdmUgYVxuICAgKiBkaWZmZXJlbnQgbmFtZSB3aXRoaW4gaXRzIElJRkUgd3JhcHBlciB0aGFuIGl0IGRvZXMgZXh0ZXJuYWxseS5cbiAgICovXG4gIGdldEludGVybmFsTmFtZU9mQ2xhc3MoY2xheno6IENsYXNzRGVjbGFyYXRpb24pOiB0cy5JZGVudGlmaWVyO1xuXG4gIC8qKlxuICAgKiBHZXQgYSBgdHMuSWRlbnRpZmllcmAgZm9yIGEgZ2l2ZW4gYENsYXNzRGVjbGFyYXRpb25gIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBjbGFzc1xuICAgKiBmcm9tIHN0YXRlbWVudHMgdGhhdCBhcmUgXCJhZGphY2VudFwiLCBhbmQgY29uY2VwdHVhbGx5IHRpZ2h0bHkgYm91bmQsIHRvIHRoZSBjbGFzcyBidXQgbm90XG4gICAqIGFjdHVhbGx5IGluc2lkZSBpdC5cbiAgICpcbiAgICogU2ltaWxhciB0byBgZ2V0SW50ZXJuYWxOYW1lT2ZDbGFzcygpYCwgdGhpcyBuYW1lIGNhbiBkaWZmZXIgZnJvbSBgY2xhenoubmFtZWAgd2hlbiBuZ2NjIHJ1bnNcbiAgICogb3ZlciBFUzUgY29kZSwgc2luY2UgdGhlc2UgXCJhZGphY2VudFwiIHN0YXRlbWVudHMgbmVlZCB0byBleGlzdCBpbiB0aGUgSUlGRSB3aGVyZSB0aGUgY2xhc3MgbWF5XG4gICAqIGhhdmUgYSBkaWZmZXJlbnQgbmFtZSB0aGFuIGl0IGRvZXMgZXh0ZXJuYWxseS5cbiAgICovXG4gIGdldEFkamFjZW50TmFtZU9mQ2xhc3MoY2xheno6IENsYXNzRGVjbGFyYXRpb24pOiB0cy5JZGVudGlmaWVyO1xufVxuIl19
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9zdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2MvcmVmbGVjdGlvbi9zcmMvaG9zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7SUFFSCwrQkFBaUM7SUFrRXBCLFFBQUEsU0FBUyxHQUFHO1FBQ3ZCLFlBQVksRUFBRSxVQUFDLFNBQW9CO1lBQ2pDLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBQzNCLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQzthQUN2QjtpQkFBTTtnQkFDTCxrRUFBa0U7Z0JBQ2xFLE9BQVEsU0FBZ0MsQ0FBQyxjQUFjLENBQUM7YUFDekQ7UUFDSCxDQUFDO0tBQ0YsQ0FBQztJQVdGLFNBQWdCLHFCQUFxQixDQUFDLEdBQWtCO1FBQ3RELE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7WUFDdkIsRUFBRSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztnQkFDckUsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUpELHNEQUlDO0lBbUJEOztPQUVHO0lBQ0gsSUFBWSxlQU1YO0lBTkQsV0FBWSxlQUFlO1FBQ3pCLG1FQUFXLENBQUE7UUFDWCx5REFBTSxDQUFBO1FBQ04seURBQU0sQ0FBQTtRQUNOLDZEQUFRLENBQUE7UUFDUix5REFBTSxDQUFBO0lBQ1IsQ0FBQyxFQU5XLGVBQWUsR0FBZix1QkFBZSxLQUFmLHVCQUFlLFFBTTFCO0lBdVVEOztPQUVHO0lBQ0gsSUFBWSxnQkFvQlg7SUFwQkQsV0FBWSxnQkFBZ0I7UUFDMUI7O1dBRUc7UUFDSCwyRUFBYyxDQUFBO1FBRWQ7O1dBRUc7UUFDSCwyRUFBYyxDQUFBO1FBRWQ7O1dBRUc7UUFDSCwyRUFBYyxDQUFBO1FBRWQ7O1dBRUc7UUFDSCx1RkFBb0IsQ0FBQTtJQUN0QixDQUFDLEVBcEJXLGdCQUFnQixHQUFoQix3QkFBZ0IsS0FBaEIsd0JBQWdCLFFBb0IzQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuLyoqXG4gKiBNZXRhZGF0YSBleHRyYWN0ZWQgZnJvbSBhbiBpbnN0YW5jZSBvZiBhIGRlY29yYXRvciBvbiBhbm90aGVyIGRlY2xhcmF0aW9uLCBvciBzeW50aGVzaXplZCBmcm9tXG4gKiBvdGhlciBpbmZvcm1hdGlvbiBhYm91dCBhIGNsYXNzLlxuICovXG5leHBvcnQgdHlwZSBEZWNvcmF0b3IgPSBDb25jcmV0ZURlY29yYXRvcnxTeW50aGV0aWNEZWNvcmF0b3I7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZURlY29yYXRvciB7XG4gIC8qKlxuICAgKiBOYW1lIGJ5IHdoaWNoIHRoZSBkZWNvcmF0b3Igd2FzIGludm9rZWQgaW4gdGhlIHVzZXIncyBjb2RlLlxuICAgKlxuICAgKiBUaGlzIGlzIGRpc3RpbmN0IGZyb20gdGhlIG5hbWUgYnkgd2hpY2ggdGhlIGRlY29yYXRvciB3YXMgaW1wb3J0ZWQgKHRob3VnaCBpbiBwcmFjdGljZSB0aGV5XG4gICAqIHdpbGwgdXN1YWxseSBiZSB0aGUgc2FtZSkuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElkZW50aWZpZXIgd2hpY2ggcmVmZXJzIHRvIHRoZSBkZWNvcmF0b3IgaW4gdGhlIHVzZXIncyBjb2RlLlxuICAgKi9cbiAgaWRlbnRpZmllcjogRGVjb3JhdG9ySWRlbnRpZmllcnxudWxsO1xuXG4vKipcbiAqIGBJbXBvcnRgIGJ5IHdoaWNoIHRoZSBkZWNvcmF0b3Igd2FzIGJyb3VnaHQgaW50byB0aGUgbW9kdWxlIGluIHdoaWNoIGl0IHdhcyBpbnZva2VkLCBvciBgbnVsbGBcbiAqIGlmIHRoZSBkZWNvcmF0b3Igd2FzIGRlY2xhcmVkIGluIHRoZSBzYW1lIG1vZHVsZSBhbmQgbm90IGltcG9ydGVkLlxuICovXG5pbXBvcnQ6IEltcG9ydHxudWxsO1xuXG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0IHJlZmVyZW5jZSB0byB0aGUgZGVjb3JhdG9yIGl0c2VsZiwgb3IgYG51bGxgIGlmIHRoZSBkZWNvcmF0b3IgaXMgc3ludGhlc2l6ZWQgKGUuZy5cbiAgICogaW4gbmdjYykuXG4gICAqL1xuICBub2RlOiB0cy5Ob2RlfG51bGw7XG5cbiAgLyoqXG4gICAqIEFyZ3VtZW50cyBvZiB0aGUgaW52b2NhdGlvbiBvZiB0aGUgZGVjb3JhdG9yLCBpZiB0aGUgZGVjb3JhdG9yIGlzIGludm9rZWQsIG9yIGBudWxsYFxuICAgKiBvdGhlcndpc2UuXG4gICAqL1xuICBhcmdzOiB0cy5FeHByZXNzaW9uW118bnVsbDtcbn1cblxuLyoqXG4gKiBNZXRhZGF0YSBleHRyYWN0ZWQgZnJvbSBhbiBpbnN0YW5jZSBvZiBhIGRlY29yYXRvciBvbiBhbm90aGVyIGRlY2xhcmF0aW9uLCB3aGljaCB3YXMgYWN0dWFsbHlcbiAqIHByZXNlbnQgaW4gYSBmaWxlLlxuICpcbiAqIENvbmNyZXRlIGRlY29yYXRvcnMgYWx3YXlzIGhhdmUgYW4gYGlkZW50aWZpZXJgIGFuZCBhIGBub2RlYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25jcmV0ZURlY29yYXRvciBleHRlbmRzIEJhc2VEZWNvcmF0b3Ige1xuICBpZGVudGlmaWVyOiBEZWNvcmF0b3JJZGVudGlmaWVyO1xuICBub2RlOiB0cy5Ob2RlO1xufVxuXG4vKipcbiAqIFN5bnRoZXRpYyBkZWNvcmF0b3JzIG5ldmVyIGhhdmUgYW4gYGlkZW50aWZpZXJgIG9yIGEgYG5vZGVgLCBidXQga25vdyB0aGUgbm9kZSBmb3Igd2hpY2ggdGhleVxuICogd2VyZSBzeW50aGVzaXplZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTeW50aGV0aWNEZWNvcmF0b3IgZXh0ZW5kcyBCYXNlRGVjb3JhdG9yIHtcbiAgaWRlbnRpZmllcjogbnVsbDtcbiAgbm9kZTogbnVsbDtcblxuICAvKipcbiAgICogVGhlIGB0cy5Ob2RlYCBmb3Igd2hpY2ggdGhpcyBkZWNvcmF0b3Igd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBzeW50aGVzaXplZEZvcjogdHMuTm9kZTtcbn1cblxuZXhwb3J0IGNvbnN0IERlY29yYXRvciA9IHtcbiAgbm9kZUZvckVycm9yOiAoZGVjb3JhdG9yOiBEZWNvcmF0b3IpOiB0cy5Ob2RlID0+IHtcbiAgICBpZiAoZGVjb3JhdG9yLm5vZGUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBkZWNvcmF0b3Iubm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyhhbHhodWIpOiB3ZSBjYW4ndCByZWx5IG9uIG5hcnJvd2luZyB1bnRpbCBUUyAzLjYgaXMgaW4gZzMuXG4gICAgICByZXR1cm4gKGRlY29yYXRvciBhcyBTeW50aGV0aWNEZWNvcmF0b3IpLnN5bnRoZXNpemVkRm9yO1xuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogQSBkZWNvcmF0b3IgaXMgaWRlbnRpZmllZCBieSBlaXRoZXIgYSBzaW1wbGUgaWRlbnRpZmllciAoZS5nLiBgRGVjb3JhdG9yYCkgb3IsIGluIHNvbWUgY2FzZXMsXG4gKiBhIG5hbWVzcGFjZWQgcHJvcGVydHkgYWNjZXNzIChlLmcuIGBjb3JlLkRlY29yYXRvcmApLlxuICovXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JJZGVudGlmaWVyID0gdHMuSWRlbnRpZmllcnxOYW1lc3BhY2VkSWRlbnRpZmllcjtcbmV4cG9ydCB0eXBlIE5hbWVzcGFjZWRJZGVudGlmaWVyID0gdHMuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uJntcbiAgZXhwcmVzc2lvbjogdHMuSWRlbnRpZmllcjtcbiAgbmFtZTogdHMuSWRlbnRpZmllclxufTtcbmV4cG9ydCBmdW5jdGlvbiBpc0RlY29yYXRvcklkZW50aWZpZXIoZXhwOiB0cy5FeHByZXNzaW9uKTogZXhwIGlzIERlY29yYXRvcklkZW50aWZpZXIge1xuICByZXR1cm4gdHMuaXNJZGVudGlmaWVyKGV4cCkgfHxcbiAgICAgIHRzLmlzUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKGV4cCkgJiYgdHMuaXNJZGVudGlmaWVyKGV4cC5leHByZXNzaW9uKSAmJlxuICAgICAgdHMuaXNJZGVudGlmaWVyKGV4cC5uYW1lKTtcbn1cblxuLyoqXG4gKiBUaGUgYHRzLkRlY2xhcmF0aW9uYCBvZiBhIFwiY2xhc3NcIi5cbiAqXG4gKiBDbGFzc2VzIGFyZSByZXByZXNlbnRlZCBkaWZmZXJlbnRseSBpbiBkaWZmZXJlbnQgY29kZSBmb3JtYXRzOlxuICogLSBJbiBUUyBjb2RlLCB0aGV5IGFyZSB0eXBpY2FsbHkgZGVmaW5lZCB1c2luZyB0aGUgYGNsYXNzYCBrZXl3b3JkLlxuICogLSBJbiBFUzIwMTUgY29kZSwgdGhleSBhcmUgdXN1YWxseSBkZWZpbmVkIHVzaW5nIHRoZSBgY2xhc3NgIGtleXdvcmQsIGJ1dCB0aGV5IGNhbiBhbHNvIGJlXG4gKiAgIHZhcmlhYmxlIGRlY2xhcmF0aW9ucywgd2hpY2ggYXJlIGluaXRpYWxpemVkIHRvIGEgY2xhc3MgZXhwcmVzc2lvbiAoZS5nLlxuICogICBgbGV0IEZvbyA9IEZvbzEgPSBjbGFzcyBGb28ge31gKS5cbiAqIC0gSW4gRVM1IGNvZGUsIHRoZXkgYXJlIHR5cGljYWxseSBkZWZpbmVkIGFzIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBiZWluZyBhc3NpZ25lZCB0aGUgcmV0dXJuXG4gKiAgIHZhbHVlIG9mIGFuIElJRkUuIFRoZSBhY3R1YWwgXCJjbGFzc1wiIGlzIGltcGxlbWVudGVkIGFzIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gaW5zaWRlIHRoZSBJSUZFLFxuICogICBidXQgdGhlIG91dGVyIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHJlcHJlc2VudHMgdGhlIFwiY2xhc3NcIiB0byB0aGUgcmVzdCBvZiB0aGUgcHJvZ3JhbS5cbiAqXG4gKiBGb3IgYFJlZmxlY3Rpb25Ib3N0YCBwdXJwb3NlcywgYSBjbGFzcyBkZWNsYXJhdGlvbiBzaG91bGQgYWx3YXlzIGhhdmUgYSBgbmFtZWAgaWRlbnRpZmllcixcbiAqIGJlY2F1c2Ugd2UgbmVlZCB0byBiZSBhYmxlIHRvIHJlZmVyZW5jZSBpdCBpbiBvdGhlciBwYXJ0cyBvZiB0aGUgcHJvZ3JhbS5cbiAqL1xuZXhwb3J0IHR5cGUgQ2xhc3NEZWNsYXJhdGlvbjxUIGV4dGVuZHMgdHMuRGVjbGFyYXRpb24gPSB0cy5EZWNsYXJhdGlvbj4gPSBUJntuYW1lOiB0cy5JZGVudGlmaWVyfTtcblxuLyoqXG4gKiBBbiBlbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBraW5kcyBvZiBjbGFzcyBtZW1iZXJzLlxuICovXG5leHBvcnQgZW51bSBDbGFzc01lbWJlcktpbmQge1xuICBDb25zdHJ1Y3RvcixcbiAgR2V0dGVyLFxuICBTZXR0ZXIsXG4gIFByb3BlcnR5LFxuICBNZXRob2QsXG59XG5cbi8qKlxuICogQSBtZW1iZXIgb2YgYSBjbGFzcywgc3VjaCBhcyBhIHByb3BlcnR5LCBtZXRob2QsIG9yIGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsYXNzTWVtYmVyIHtcbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgcmVmZXJlbmNlIHRvIHRoZSBjbGFzcyBtZW1iZXIgaXRzZWxmLCBvciBudWxsIGlmIGl0IGlzIG5vdCBhcHBsaWNhYmxlLlxuICAgKi9cbiAgbm9kZTogdHMuTm9kZXxudWxsO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0aW9uIG9mIHdoaWNoIHR5cGUgb2YgbWVtYmVyIHRoaXMgaXMgKHByb3BlcnR5LCBtZXRob2QsIGV0YykuXG4gICAqL1xuICBraW5kOiBDbGFzc01lbWJlcktpbmQ7XG5cbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgYHRzLlR5cGVOb2RlYCByZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YgdGhlIG1lbWJlciwgb3IgYG51bGxgIGlmIG5vdCBwcmVzZW50IG9yXG4gICAqIGFwcGxpY2FibGUuXG4gICAqL1xuICB0eXBlOiB0cy5UeXBlTm9kZXxudWxsO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBjbGFzcyBtZW1iZXIuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgYHRzLklkZW50aWZpZXJgIG9yIGB0cy5TdHJpbmdMaXRlcmFsYCByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhlIG1lbWJlciwgb3IgYG51bGxgXG4gICAqIGlmIG5vIHN1Y2ggbm9kZSBpcyBwcmVzZW50LlxuICAgKlxuICAgKiBUaGUgYG5hbWVOb2RlYCBpcyB1c2VmdWwgaW4gd3JpdGluZyByZWZlcmVuY2VzIHRvIHRoaXMgbWVtYmVyIHRoYXQgd2lsbCBiZSBjb3JyZWN0bHkgc291cmNlLVxuICAgKiBtYXBwZWQgYmFjayB0byB0aGUgb3JpZ2luYWwgZmlsZS5cbiAgICovXG4gIG5hbWVOb2RlOiB0cy5JZGVudGlmaWVyfHRzLlN0cmluZ0xpdGVyYWx8bnVsbDtcblxuICAvKipcbiAgICogVHlwZVNjcmlwdCBgdHMuRXhwcmVzc2lvbmAgd2hpY2ggcmVwcmVzZW50cyB0aGUgdmFsdWUgb2YgdGhlIG1lbWJlci5cbiAgICpcbiAgICogSWYgdGhlIG1lbWJlciBpcyBhIHByb3BlcnR5LCB0aGlzIHdpbGwgYmUgdGhlIHByb3BlcnR5IGluaXRpYWxpemVyIGlmIHRoZXJlIGlzIG9uZSwgb3IgbnVsbFxuICAgKiBvdGhlcndpc2UuXG4gICAqL1xuICB2YWx1ZTogdHMuRXhwcmVzc2lvbnxudWxsO1xuXG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0IGB0cy5EZWNsYXJhdGlvbmAgd2hpY2ggcmVwcmVzZW50cyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIG1lbWJlci5cbiAgICpcbiAgICogSW4gVHlwZVNjcmlwdCBjb2RlIHRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSBub2RlLCBidXQgaW4gZG93bmxldmVsZWQgY29kZSB0aGlzIHNob3VsZCBhbHdheXMgYmVcbiAgICogdGhlIERlY2xhcmF0aW9uIHdoaWNoIGFjdHVhbGx5IHJlcHJlc2VudHMgdGhlIG1lbWJlcidzIHJ1bnRpbWUgdmFsdWUuXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCB0aGUgVFMgY29kZTpcbiAgICpcbiAgICogYGBgXG4gICAqIGNsYXNzIENsYXp6IHtcbiAgICogICBzdGF0aWMgZ2V0IHByb3BlcnR5KCk6IHN0cmluZyB7XG4gICAqICAgICByZXR1cm4gJ3ZhbHVlJztcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIERvd25sZXZlbHMgdG86XG4gICAqXG4gICAqIGBgYFxuICAgKiB2YXIgQ2xhenogPSAoZnVuY3Rpb24gKCkge1xuICAgKiAgIGZ1bmN0aW9uIENsYXp6KCkge1xuICAgKiAgIH1cbiAgICogICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ2xhenosIFwicHJvcGVydHlcIiwge1xuICAgKiAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICogICAgICAgICAgIHJldHVybiAndmFsdWUnO1xuICAgKiAgICAgICB9LFxuICAgKiAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgKiAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICogICB9KTtcbiAgICogICByZXR1cm4gQ2xheno7XG4gICAqIH0oKSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBJbiB0aGlzIGV4YW1wbGUsIGZvciB0aGUgcHJvcGVydHkgXCJwcm9wZXJ0eVwiLCB0aGUgbm9kZSB3b3VsZCBiZSB0aGUgZW50aXJlXG4gICAqIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBFeHByZXNzaW9uU3RhdGVtZW50LCBidXQgdGhlIGltcGxlbWVudGF0aW9uIHdvdWxkIGJlIHRoaXNcbiAgICogRnVuY3Rpb25EZWNsYXJhdGlvbjpcbiAgICpcbiAgICogYGBgXG4gICAqIGZ1bmN0aW9uICgpIHtcbiAgICogICByZXR1cm4gJ3ZhbHVlJztcbiAgICogfSxcbiAgICogYGBgXG4gICAqL1xuICBpbXBsZW1lbnRhdGlvbjogdHMuRGVjbGFyYXRpb258bnVsbDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbWVtYmVyIGlzIHN0YXRpYyBvciBub3QuXG4gICAqL1xuICBpc1N0YXRpYzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW55IGBEZWNvcmF0b3JgcyB3aGljaCBhcmUgcHJlc2VudCBvbiB0aGUgbWVtYmVyLCBvciBgbnVsbGAgaWYgbm9uZSBhcmUgcHJlc2VudC5cbiAgICovXG4gIGRlY29yYXRvcnM6IERlY29yYXRvcltdfG51bGw7XG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIFR5cGVWYWx1ZVJlZmVyZW5jZUtpbmQge1xuICBMT0NBTCxcbiAgSU1QT1JURUQsXG4gIFVOQVZBSUxBQkxFLFxufVxuXG4vKipcbiAqIEEgdHlwZSByZWZlcmVuY2UgdGhhdCByZWZlcnMgdG8gYW55IHR5cGUgdmlhIGEgYHRzLkV4cHJlc3Npb25gIHRoYXQncyB2YWxpZCB3aXRoaW4gdGhlIGxvY2FsIGZpbGVcbiAqIHdoZXJlIHRoZSB0eXBlIHdhcyByZWZlcmVuY2VkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsVHlwZVZhbHVlUmVmZXJlbmNlIHtcbiAga2luZDogVHlwZVZhbHVlUmVmZXJlbmNlS2luZC5MT0NBTDtcblxuICAvKipcbiAgICogVGhlIHN5bnRoZXNpemVkIGV4cHJlc3Npb24gdG8gcmVmZXJlbmNlIHRoZSB0eXBlIGluIGEgdmFsdWUgcG9zaXRpb24uXG4gICAqL1xuICBleHByZXNzaW9uOiB0cy5FeHByZXNzaW9uO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgdHlwZSBvcmlnaW5hdGVzIGZyb20gYSBkZWZhdWx0IGltcG9ydCwgdGhlIGltcG9ydCBzdGF0ZW1lbnQgaXMgY2FwdHVyZWQgaGVyZSB0byBiZSBhYmxlXG4gICAqIHRvIHRyYWNrIGl0cyB1c2FnZXMsIHByZXZlbnRpbmcgdGhlIGltcG9ydCBmcm9tIGJlaW5nIGVsaWRlZCBpZiBpdCB3YXMgb3JpZ2luYWxseSBvbmx5IHVzZWQgaW5cbiAgICogYSB0eXBlLXBvc2l0aW9uLiBTZWUgYERlZmF1bHRJbXBvcnRUcmFja2VyYCBmb3IgZGV0YWlscy5cbiAgICovXG4gIGRlZmF1bHRJbXBvcnRTdGF0ZW1lbnQ6IHRzLkltcG9ydERlY2xhcmF0aW9ufG51bGw7XG59XG5cbi8qKlxuICogQSByZWZlcmVuY2UgdGhhdCByZWZlcnMgdG8gYSB0eXBlIHRoYXQgd2FzIGltcG9ydGVkLCBhbmQgZ2l2ZXMgdGhlIHN5bWJvbCBgbmFtZWAgYW5kIHRoZVxuICogYG1vZHVsZU5hbWVgIG9mIHRoZSBpbXBvcnQuIE5vdGUgdGhhdCB0aGlzIGBtb2R1bGVOYW1lYCBtYXkgYmUgYSByZWxhdGl2ZSBwYXRoLCBhbmQgdGh1cyBpc1xuICogbGlrZWx5IG9ubHkgdmFsaWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBmaWxlIHdoaWNoIGNvbnRhaW5lZCB0aGUgb3JpZ2luYWwgdHlwZSByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1wb3J0ZWRUeXBlVmFsdWVSZWZlcmVuY2Uge1xuICBraW5kOiBUeXBlVmFsdWVSZWZlcmVuY2VLaW5kLklNUE9SVEVEO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kdWxlIHNwZWNpZmllciBmcm9tIHdoaWNoIHRoZSBgaW1wb3J0ZWROYW1lYCBzeW1ib2wgc2hvdWxkIGJlIGltcG9ydGVkLlxuICAgKi9cbiAgbW9kdWxlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdG9wLWxldmVsIHN5bWJvbCB0aGF0IGlzIGltcG9ydGVkIGZyb20gYG1vZHVsZU5hbWVgLiBJZiBgbmVzdGVkUGF0aGAgaXMgYWxzb1xuICAgKiBwcmVzZW50LCBhIG5lc3RlZCBvYmplY3QgaXMgYmVpbmcgcmVmZXJlbmNlZCBmcm9tIHRoZSB0b3AtbGV2ZWwgc3ltYm9sLlxuICAgKi9cbiAgaW1wb3J0ZWROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHByZXNlbnQsIHJlcHJlc2VudHMgdGhlIHN5bWJvbCBuYW1lcyB0aGF0IGFyZSByZWZlcmVuY2VkIGZyb20gdGhlIHRvcC1sZXZlbCBpbXBvcnQuXG4gICAqIFdoZW4gYG51bGxgIG9yIGVtcHR5LCB0aGUgYGltcG9ydGVkTmFtZWAgaXRzZWxmIGlzIHRoZSBzeW1ib2wgYmVpbmcgcmVmZXJlbmNlZC5cbiAgICovXG4gIG5lc3RlZFBhdGg6IHN0cmluZ1tdfG51bGw7XG5cbiAgdmFsdWVEZWNsYXJhdGlvbjogdHMuRGVjbGFyYXRpb247XG59XG5cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBmb3IgYSB0eXBlIHZhbHVlIHJlZmVyZW5jZSB0aGF0IGlzIHVzZWQgd2hlbiBubyB2YWx1ZSBpcyBhdmFpbGFibGUuIFRoaXMgY2FuXG4gKiBvY2N1ciBkdWUgdG8gdmFyaW91cyByZWFzb25zLCB3aGljaCBpcyBpbmRpY2F0ZWQgaW4gdGhlIGByZWFzb25gIGZpZWxkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVuYXZhaWxhYmxlVHlwZVZhbHVlUmVmZXJlbmNlIHtcbiAga2luZDogVHlwZVZhbHVlUmVmZXJlbmNlS2luZC5VTkFWQUlMQUJMRTtcblxuICAvKipcbiAgICogVGhlIHJlYXNvbiB3aHkgbm8gdmFsdWUgcmVmZXJlbmNlIGNvdWxkIGJlIGRldGVybWluZWQgZm9yIGEgdHlwZS5cbiAgICovXG4gIHJlYXNvbjogVW5hdmFpbGFibGVWYWx1ZTtcbn1cblxuLyoqXG4gKiBUaGUgdmFyaW91cyByZWFzb25zIHdoeSB0aGUgY29tcGlsZXIgbWF5IGJlIHVuYWJsZSB0byBzeW50aGVzaXplIGEgdmFsdWUgZnJvbSBhIHR5cGUgcmVmZXJlbmNlLlxuICovXG5leHBvcnQgY29uc3QgZW51bSBWYWx1ZVVuYXZhaWxhYmxlS2luZCB7XG4gIC8qKlxuICAgKiBObyB0eXBlIG5vZGUgd2FzIGF2YWlsYWJsZS5cbiAgICovXG4gIE1JU1NJTkdfVFlQRSxcblxuICAvKipcbiAgICogVGhlIHR5cGUgZG9lcyBub3QgaGF2ZSBhIHZhbHVlIGRlY2xhcmF0aW9uLCBlLmcuIGFuIGludGVyZmFjZS5cbiAgICovXG4gIE5PX1ZBTFVFX0RFQ0xBUkFUSU9OLFxuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBpcyBpbXBvcnRlZCB1c2luZyBhIHR5cGUtb25seSBpbXBvcnRzLCBzbyBpdCBpcyBub3Qgc3VpdGFibGUgdG8gYmUgdXNlZCBpbiBhXG4gICAqIHZhbHVlLXBvc2l0aW9uLlxuICAgKi9cbiAgVFlQRV9PTkxZX0lNUE9SVCxcblxuICAvKipcbiAgICogVGhlIHR5cGUgcmVmZXJlbmNlIGNvdWxkIG5vdCBiZSByZXNvbHZlZCB0byBhIGRlY2xhcmF0aW9uLlxuICAgKi9cbiAgVU5LTk9XTl9SRUZFUkVOQ0UsXG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIGNvcnJlc3BvbmRzIHdpdGggYSBuYW1lc3BhY2UuXG4gICAqL1xuICBOQU1FU1BBQ0UsXG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGNvbXBpbGVyLCBmb3IgZXhhbXBsZSB1bmlvbiB0eXBlcy5cbiAgICovXG4gIFVOU1VQUE9SVEVELFxufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgVW5zdXBwb3J0ZWRUeXBlIHtcbiAga2luZDogVmFsdWVVbmF2YWlsYWJsZUtpbmQuVU5TVVBQT1JURUQ7XG4gIHR5cGVOb2RlOiB0cy5UeXBlTm9kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb1ZhbHVlRGVjbGFyYXRpb24ge1xuICBraW5kOiBWYWx1ZVVuYXZhaWxhYmxlS2luZC5OT19WQUxVRV9ERUNMQVJBVElPTjtcbiAgdHlwZU5vZGU6IHRzLlR5cGVOb2RlO1xuICBkZWNsOiB0cy5EZWNsYXJhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlT25seUltcG9ydCB7XG4gIGtpbmQ6IFZhbHVlVW5hdmFpbGFibGVLaW5kLlRZUEVfT05MWV9JTVBPUlQ7XG4gIHR5cGVOb2RlOiB0cy5UeXBlTm9kZTtcbiAgaW1wb3J0Q2xhdXNlOiB0cy5JbXBvcnRDbGF1c2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmFtZXNwYWNlSW1wb3J0IHtcbiAga2luZDogVmFsdWVVbmF2YWlsYWJsZUtpbmQuTkFNRVNQQUNFO1xuICB0eXBlTm9kZTogdHMuVHlwZU5vZGU7XG4gIGltcG9ydENsYXVzZTogdHMuSW1wb3J0Q2xhdXNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVua25vd25SZWZlcmVuY2Uge1xuICBraW5kOiBWYWx1ZVVuYXZhaWxhYmxlS2luZC5VTktOT1dOX1JFRkVSRU5DRTtcbiAgdHlwZU5vZGU6IHRzLlR5cGVOb2RlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1pc3NpbmdUeXBlIHtcbiAga2luZDogVmFsdWVVbmF2YWlsYWJsZUtpbmQuTUlTU0lOR19UWVBFO1xufVxuXG4vKipcbiAqIFRoZSB2YXJpb3VzIHJlYXNvbnMgd2h5IGEgdHlwZSBub2RlIG1heSBub3QgYmUgcmVmZXJyZWQgdG8gYXMgYSB2YWx1ZS5cbiAqL1xuZXhwb3J0IHR5cGUgVW5hdmFpbGFibGVWYWx1ZSA9XG4gICAgVW5zdXBwb3J0ZWRUeXBlfE5vVmFsdWVEZWNsYXJhdGlvbnxUeXBlT25seUltcG9ydHxOYW1lc3BhY2VJbXBvcnR8VW5rbm93blJlZmVyZW5jZXxNaXNzaW5nVHlwZTtcblxuLyoqXG4gKiBBIHJlZmVyZW5jZSB0byBhIHZhbHVlIHRoYXQgb3JpZ2luYXRlZCBmcm9tIGEgdHlwZSBwb3NpdGlvbi5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgYSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgY291bGQgYmUgZGVjbGFyZWQgYXMgYGZvbzogRm9vYC4gQSBgVHlwZVZhbHVlUmVmZXJlbmNlYFxuICogZXh0cmFjdGVkIGZyb20gdGhpcyB3b3VsZCByZWZlciB0byB0aGUgdmFsdWUgb2YgdGhlIGNsYXNzIGBGb29gIChhc3N1bWluZyBpdCB3YXMgYWN0dWFsbHkgYVxuICogdHlwZSkuXG4gKlxuICogU2VlIHRoZSBpbmRpdmlkdWFsIHR5cGVzIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgdHlwZSBUeXBlVmFsdWVSZWZlcmVuY2UgPVxuICAgIExvY2FsVHlwZVZhbHVlUmVmZXJlbmNlfEltcG9ydGVkVHlwZVZhbHVlUmVmZXJlbmNlfFVuYXZhaWxhYmxlVHlwZVZhbHVlUmVmZXJlbmNlO1xuXG4vKipcbiAqIEEgcGFyYW1ldGVyIHRvIGEgY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3RvclBhcmFtZXRlciB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIsIGlmIGF2YWlsYWJsZS5cbiAgICpcbiAgICogU29tZSBwYXJhbWV0ZXJzIGRvbid0IGhhdmUgYSBzaW1wbGUgc3RyaW5nIG5hbWUgKGZvciBleGFtcGxlLCBwYXJhbWV0ZXJzIHdoaWNoIGFyZSBkZXN0cnVjdHVyZWRcbiAgICogaW50byBtdWx0aXBsZSB2YXJpYWJsZXMpLiBJbiB0aGVzZSBjYXNlcywgYG5hbWVgIGNhbiBiZSBgbnVsbGAuXG4gICAqL1xuICBuYW1lOiBzdHJpbmd8bnVsbDtcblxuICAvKipcbiAgICogVHlwZVNjcmlwdCBgdHMuQmluZGluZ05hbWVgIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLlxuICAgKlxuICAgKiBUaGUgYG5hbWVOb2RlYCBpcyB1c2VmdWwgaW4gd3JpdGluZyByZWZlcmVuY2VzIHRvIHRoaXMgbWVtYmVyIHRoYXQgd2lsbCBiZSBjb3JyZWN0bHkgc291cmNlLVxuICAgKiBtYXBwZWQgYmFjayB0byB0aGUgb3JpZ2luYWwgZmlsZS5cbiAgICovXG4gIG5hbWVOb2RlOiB0cy5CaW5kaW5nTmFtZTtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyJ3MgdHlwZSBhbm5vdGF0aW9uLCBpZiBpdCdzIHBvc3NpYmxlIHRvIHJlZmVyIHRvIHRoZVxuICAgKiBwYXJhbWV0ZXIncyB0eXBlIGFzIGEgdmFsdWUuXG4gICAqXG4gICAqIFRoaXMgY2FuIGVpdGhlciBiZSBhIHJlZmVyZW5jZSB0byBhIGxvY2FsIHZhbHVlLCBhIHJlZmVyZW5jZSB0byBhbiBpbXBvcnRlZCB2YWx1ZSwgb3Igbm9cbiAgICogdmFsdWUgaWYgbm8gaXMgcHJlc2VudCBvciBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgYW4gZXhwcmVzc2lvbi5cbiAgICovXG4gIHR5cGVWYWx1ZVJlZmVyZW5jZTogVHlwZVZhbHVlUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0IGB0cy5UeXBlTm9kZWAgcmVwcmVzZW50aW5nIHRoZSB0eXBlIG5vZGUgZm91bmQgaW4gdGhlIHR5cGUgcG9zaXRpb24uXG4gICAqXG4gICAqIFRoaXMgZmllbGQgY2FuIGJlIHVzZWQgZm9yIGRpYWdub3N0aWNzIHJlcG9ydGluZyBpZiBgdHlwZVZhbHVlUmVmZXJlbmNlYCBpcyBgbnVsbGAuXG4gICAqXG4gICAqIENhbiBiZSBudWxsLCBpZiB0aGUgcGFyYW0gaGFzIG5vIHR5cGUgZGVjbGFyZWQuXG4gICAqL1xuICB0eXBlTm9kZTogdHMuVHlwZU5vZGV8bnVsbDtcblxuICAvKipcbiAgICogQW55IGBEZWNvcmF0b3JgcyB3aGljaCBhcmUgcHJlc2VudCBvbiB0aGUgcGFyYW1ldGVyLCBvciBgbnVsbGAgaWYgbm9uZSBhcmUgcHJlc2VudC5cbiAgICovXG4gIGRlY29yYXRvcnM6IERlY29yYXRvcltdfG51bGw7XG59XG5cbi8qKlxuICogRGVmaW5pdGlvbiBvZiBhIGZ1bmN0aW9uIG9yIG1ldGhvZCwgaW5jbHVkaW5nIGl0cyBib2R5IGlmIHByZXNlbnQgYW5kIGFueSBwYXJhbWV0ZXJzLlxuICpcbiAqIEluIFR5cGVTY3JpcHQgY29kZSB0aGlzIG1ldGFkYXRhIHdpbGwgYmUgYSBzaW1wbGUgcmVmbGVjdGlvbiBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBub2RlXG4gKiBpdHNlbGYuIEluIEVTNSBjb2RlIHRoaXMgY2FuIGJlIG1vcmUgY29tcGxpY2F0ZWQsIGFzIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVycyBtYXlcbiAqIGJlIGV4dHJhY3RlZCBmcm9tIGNlcnRhaW4gYm9keSBzdGF0ZW1lbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uRGVmaW5pdGlvbiB7XG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbm9kZSB3aGljaCBkZWNsYXJlcyB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICBub2RlOiB0cy5NZXRob2REZWNsYXJhdGlvbnx0cy5GdW5jdGlvbkRlY2xhcmF0aW9ufHRzLkZ1bmN0aW9uRXhwcmVzc2lvbnx0cy5WYXJpYWJsZURlY2xhcmF0aW9uO1xuXG4gIC8qKlxuICAgKiBTdGF0ZW1lbnRzIG9mIHRoZSBmdW5jdGlvbiBib2R5LCBpZiBhIGJvZHkgaXMgcHJlc2VudCwgb3IgbnVsbCBpZiBubyBib2R5IGlzIHByZXNlbnQgb3IgdGhlXG4gICAqIGZ1bmN0aW9uIGlzIGlkZW50aWZpZWQgdG8gcmVwcmVzZW50IGEgdHNsaWIgaGVscGVyIGZ1bmN0aW9uLCBpbiB3aGljaCBjYXNlIGBoZWxwZXJgIHdpbGxcbiAgICogaW5kaWNhdGUgd2hpY2ggaGVscGVyIHRoaXMgZnVuY3Rpb24gcmVwcmVzZW50cy5cbiAgICpcbiAgICogVGhpcyBsaXN0IG1heSBoYXZlIGJlZW4gZmlsdGVyZWQgdG8gZXhjbHVkZSBzdGF0ZW1lbnRzIHdoaWNoIHBlcmZvcm0gcGFyYW1ldGVyIGRlZmF1bHQgdmFsdWVcbiAgICogaW5pdGlhbGl6YXRpb24uXG4gICAqL1xuICBib2R5OiB0cy5TdGF0ZW1lbnRbXXxudWxsO1xuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSByZWdhcmRpbmcgdGhlIGZ1bmN0aW9uJ3MgcGFyYW1ldGVycywgaW5jbHVkaW5nIHBvc3NpYmxlIGRlZmF1bHQgdmFsdWUgZXhwcmVzc2lvbnMuXG4gICAqL1xuICBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJbXTtcbn1cblxuLyoqXG4gKiBQb3NzaWJsZSBkZWNsYXJhdGlvbnMgb2Yga25vd24gdmFsdWVzLCBzdWNoIGFzIGJ1aWx0LWluIG9iamVjdHMvZnVuY3Rpb25zIG9yIFR5cGVTY3JpcHQgaGVscGVycy5cbiAqL1xuZXhwb3J0IGVudW0gS25vd25EZWNsYXJhdGlvbiB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIEphdmFTY3JpcHQgZ2xvYmFsIGBPYmplY3RgIGNsYXNzLlxuICAgKi9cbiAgSnNHbG9iYWxPYmplY3QsXG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgYF9fYXNzaWduYCBUeXBlU2NyaXB0IGhlbHBlciBmdW5jdGlvbi5cbiAgICovXG4gIFRzSGVscGVyQXNzaWduLFxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIGBfX3NwcmVhZGAgVHlwZVNjcmlwdCBoZWxwZXIgZnVuY3Rpb24uXG4gICAqL1xuICBUc0hlbHBlclNwcmVhZCxcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSBgX19zcHJlYWRBcnJheXNgIFR5cGVTY3JpcHQgaGVscGVyIGZ1bmN0aW9uLlxuICAgKi9cbiAgVHNIZWxwZXJTcHJlYWRBcnJheXMsXG59XG5cbi8qKlxuICogQSBwYXJhbWV0ZXIgdG8gYSBmdW5jdGlvbiBvciBtZXRob2QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyYW1ldGVyIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHBhcmFtZXRlciwgaWYgYXZhaWxhYmxlLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nfG51bGw7XG5cbiAgLyoqXG4gICAqIERlY2xhcmF0aW9uIHdoaWNoIGNyZWF0ZWQgdGhpcyBwYXJhbWV0ZXIuXG4gICAqL1xuICBub2RlOiB0cy5QYXJhbWV0ZXJEZWNsYXJhdGlvbjtcblxuICAvKipcbiAgICogRXhwcmVzc2lvbiB3aGljaCByZXByZXNlbnRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIsIGlmIGFueS5cbiAgICovXG4gIGluaXRpYWxpemVyOiB0cy5FeHByZXNzaW9ufG51bGw7XG59XG5cbi8qKlxuICogVGhlIHNvdXJjZSBvZiBhbiBpbXBvcnRlZCBzeW1ib2wsIGluY2x1ZGluZyB0aGUgb3JpZ2luYWwgc3ltYm9sIG5hbWUgYW5kIHRoZSBtb2R1bGUgZnJvbSB3aGljaCBpdFxuICogd2FzIGltcG9ydGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydCB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgaW1wb3J0ZWQgc3ltYm9sIHVuZGVyIHdoaWNoIGl0IHdhcyBleHBvcnRlZCAobm90IGltcG9ydGVkKS5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vZHVsZSBmcm9tIHdoaWNoIHRoZSBzeW1ib2wgd2FzIGltcG9ydGVkLlxuICAgKlxuICAgKiBUaGlzIGNvdWxkIGVpdGhlciBiZSBhbiBhYnNvbHV0ZSBtb2R1bGUgbmFtZSAoQGFuZ3VsYXIvY29yZSBmb3IgZXhhbXBsZSkgb3IgYSByZWxhdGl2ZSBwYXRoLlxuICAgKi9cbiAgZnJvbTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIGVudW0gbWVtYmVyIGV4dHJhY3RlZCBmcm9tIEphdmFTY3JpcHQgd2hlbiBubyBgdHMuRW51bURlY2xhcmF0aW9uYCBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW51bU1lbWJlciB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZW51bSBtZW1iZXIuXG4gICAqL1xuICBuYW1lOiB0cy5Qcm9wZXJ0eU5hbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsaXplciBleHByZXNzaW9uIG9mIHRoZSBlbnVtIG1lbWJlci4gVW5saWtlIGluIFR5cGVTY3JpcHQsIHRoaXMgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgKiBpbiBlbWl0dGVkIEphdmFTY3JpcHQuXG4gICAqL1xuICBpbml0aWFsaXplcjogdHMuRXhwcmVzc2lvbjtcbn1cblxuLyoqXG4gKiBCYXNlIHR5cGUgZm9yIGFsbCBgRGVjbGFyYXRpb25gcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlRGVjbGFyYXRpb248VCBleHRlbmRzIHRzLkRlY2xhcmF0aW9uID0gdHMuRGVjbGFyYXRpb24+IHtcbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBtb2R1bGUgcGF0aCBmcm9tIHdoaWNoIHRoZSBzeW1ib2wgd2FzIGltcG9ydGVkIGludG8gdGhlIGFwcGxpY2F0aW9uLCBpZiB0aGUgc3ltYm9sXG4gICAqIHdhcyBpbXBvcnRlZCB2aWEgYW4gYWJzb2x1dGUgbW9kdWxlIChldmVuIHRocm91Z2ggYSBjaGFpbiBvZiByZS1leHBvcnRzKS4gSWYgdGhlIHN5bWJvbCBpcyBwYXJ0XG4gICAqIG9mIHRoZSBhcHBsaWNhdGlvbiBhbmQgd2FzIG5vdCBpbXBvcnRlZCBmcm9tIGFuIGFic29sdXRlIHBhdGgsIHRoaXMgd2lsbCBiZSBgbnVsbGAuXG4gICAqL1xuICB2aWFNb2R1bGU6IHN0cmluZ3xudWxsO1xuXG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0IHJlZmVyZW5jZSB0byB0aGUgZGVjbGFyYXRpb24gaXRzZWxmLCBpZiBvbmUgZXhpc3RzLlxuICAgKi9cbiAgbm9kZTogVHxudWxsO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQsIGRlc2NyaWJlcyB0aGUgdHlwZSBvZiB0aGUga25vd24gZGVjbGFyYXRpb24gdGhpcyBkZWNsYXJhdGlvbiByZXNvbHZlcyB0by5cbiAgICovXG4gIGtub3duOiBLbm93bkRlY2xhcmF0aW9ufG51bGw7XG59XG5cbi8qKlxuICogQSBkZWNsYXJhdGlvbiB0aGF0IGhhcyBhbiBhc3NvY2lhdGVkIFR5cGVTY3JpcHQgYHRzLkRlY2xhcmF0aW9uYC5cbiAqXG4gKiBUaGUgYWx0ZXJuYXRpdmUgaXMgYW4gYElubGluZURlY2xhcmF0aW9uYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25jcmV0ZURlY2xhcmF0aW9uPFQgZXh0ZW5kcyB0cy5EZWNsYXJhdGlvbiA9IHRzLkRlY2xhcmF0aW9uPiBleHRlbmRzXG4gICAgQmFzZURlY2xhcmF0aW9uPFQ+IHtcbiAgbm9kZTogVDtcblxuICAvKipcbiAgICogT3B0aW9uYWxseSByZXByZXNlbnRzIGEgc3BlY2lhbCBpZGVudGl0eSBvZiB0aGUgZGVjbGFyYXRpb24sIG9yIGBudWxsYCBpZiB0aGUgZGVjbGFyYXRpb25cbiAgICogZG9lcyBub3QgaGF2ZSBhIHNwZWNpYWwgaWRlbnRpdHkuXG4gICAqL1xuICBpZGVudGl0eTogU3BlY2lhbERlY2xhcmF0aW9uSWRlbnRpdHl8bnVsbDtcbn1cblxuZXhwb3J0IHR5cGUgU3BlY2lhbERlY2xhcmF0aW9uSWRlbnRpdHkgPSBEb3dubGV2ZWxlZEVudW07XG5cbmV4cG9ydCBjb25zdCBlbnVtIFNwZWNpYWxEZWNsYXJhdGlvbktpbmQge1xuICBEb3dubGV2ZWxlZEVudW0sXG59XG5cbi8qKlxuICogQSBzcGVjaWFsIGRlY2xhcmF0aW9uIGlkZW50aXR5IHRoYXQgcmVwcmVzZW50cyBhbiBlbnVtLiBUaGlzIGlzIHVzZWQgaW4gZG93bmxldmVsZWQgZm9ybXMgd2hlcmVcbiAqIGEgYHRzLkVudW1EZWNsYXJhdGlvbmAgaXMgZW1pdHRlZCBpbiBhbiBhbHRlcm5hdGl2ZSBmb3JtLCBlLmcuIGFuIElJRkUgY2FsbCB0aGF0IGRlY2xhcmVzIGFsbFxuICogbWVtYmVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3dubGV2ZWxlZEVudW0ge1xuICBraW5kOiBTcGVjaWFsRGVjbGFyYXRpb25LaW5kLkRvd25sZXZlbGVkRW51bTtcbiAgZW51bU1lbWJlcnM6IEVudW1NZW1iZXJbXTtcbn1cblxuLyoqXG4gKiBBIGRlY2xhcmF0aW9uIHRoYXQgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIFR5cGVTY3JpcHQgYHRzLkRlY2xhcmF0aW9uYCwgb25seSBhXG4gKiBgdHMuRXhwcmVzc2lvbmAuXG4gKlxuICogVGhpcyBjYW4gb2NjdXIgaW4gc29tZSBkb3dubGV2ZWxpbmdzIHdoZW4gYW4gYGV4cG9ydCBjb25zdCBWQVIgPSAuLi47YCAoYSBgdHMuRGVjbGFyYXRpb25gKSBpc1xuICogdHJhbnNwaWxlZCB0byBhbiBhc3NpZ25tZW50IHN0YXRlbWVudCAoZS5nLiBgZXhwb3J0cy5WQVIgPSAuLi47YCkuIFRoZXJlIGlzIG5vIGB0cy5EZWNsYXJhdGlvbmBcbiAqIGFzc29jaWF0ZWQgd2l0aCBgVkFSYCBpbiB0aGF0IGNhc2UsIG9ubHkgYW4gZXhwcmVzc2lvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmxpbmVEZWNsYXJhdGlvbiBleHRlbmRzIEJhc2VEZWNsYXJhdGlvbiB7XG4gIG5vZGU6IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBgdHMuRXhwcmVzc2lvbmAgd2hpY2ggY29uc3RpdHV0ZXMgdGhlIHZhbHVlIG9mIHRoZSBkZWNsYXJhdGlvbi5cbiAgICovXG4gIGV4cHJlc3Npb246IHRzLkV4cHJlc3Npb247XG59XG5cbi8qKlxuICogVGhlIGRlY2xhcmF0aW9uIG9mIGEgc3ltYm9sLCBhbG9uZyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGhvdyBpdCB3YXMgaW1wb3J0ZWQgaW50byB0aGVcbiAqIGFwcGxpY2F0aW9uLlxuICpcbiAqIFRoaXMgY2FuIGVpdGhlciBiZSBhIGBDb25jcmV0ZURlY2xhcmF0aW9uYCBpZiB0aGUgdW5kZXJseWluZyBUeXBlU2NyaXB0IG5vZGUgZm9yIHRoZSBzeW1ib2wgaXMgYW5cbiAqIGFjdHVhbCBgdHMuRGVjbGFyYXRpb25gLCBvciBhbiBgSW5saW5lRGVjbGFyYXRpb25gIGlmIHRoZSBkZWNsYXJhdGlvbiB3YXMgdHJhbnNwaWxlZCBpbiBjZXJ0YWluXG4gKiBkb3dubGV2ZWxpbmdzIHRvIGEgYHRzLkV4cHJlc3Npb25gIGluc3RlYWQuXG4gKi9cbmV4cG9ydCB0eXBlIERlY2xhcmF0aW9uPFQgZXh0ZW5kcyB0cy5EZWNsYXJhdGlvbiA9IHRzLkRlY2xhcmF0aW9uPiA9XG4gICAgQ29uY3JldGVEZWNsYXJhdGlvbjxUPnxJbmxpbmVEZWNsYXJhdGlvbjtcblxuLyoqXG4gKiBBYnN0cmFjdHMgcmVmbGVjdGlvbiBvcGVyYXRpb25zIG9uIGEgVHlwZVNjcmlwdCBBU1QuXG4gKlxuICogRGVwZW5kaW5nIG9uIHRoZSBmb3JtYXQgb2YgdGhlIGNvZGUgYmVpbmcgaW50ZXJwcmV0ZWQsIGRpZmZlcmVudCBjb25jZXB0cyBhcmUgcmVwcmVzZW50ZWRcbiAqIHdpdGggZGlmZmVyZW50IHN5bnRhY3RpY2FsIHN0cnVjdHVyZXMuIFRoZSBgUmVmbGVjdGlvbkhvc3RgIGFic3RyYWN0cyBvdmVyIHRob3NlIGRpZmZlcmVuY2VzIGFuZFxuICogcHJlc2VudHMgYSBzaW5nbGUgQVBJIGJ5IHdoaWNoIHRoZSBjb21waWxlciBjYW4gcXVlcnkgc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEFTVC5cbiAqXG4gKiBBbGwgb3BlcmF0aW9ucyBvbiB0aGUgYFJlZmxlY3Rpb25Ib3N0YCByZXF1aXJlIHRoZSB1c2Ugb2YgVHlwZVNjcmlwdCBgdHMuTm9kZWBzIHdpdGggYmluZGluZ1xuICogaW5mb3JtYXRpb24gYWxyZWFkeSBhdmFpbGFibGUgKHRoYXQgaXMsIG5vZGVzIHRoYXQgY29tZSBmcm9tIGEgYHRzLlByb2dyYW1gIHRoYXQgaGFzIGJlZW5cbiAqIHR5cGUtY2hlY2tlZCwgYW5kIGFyZSBub3Qgc3ludGhldGljYWxseSBjcmVhdGVkKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWZsZWN0aW9uSG9zdCB7XG4gIC8qKlxuICAgKiBFeGFtaW5lIGEgZGVjbGFyYXRpb24gKGZvciBleGFtcGxlLCBvZiBhIGNsYXNzIG9yIGZ1bmN0aW9uKSBhbmQgcmV0dXJuIG1ldGFkYXRhIGFib3V0IGFueVxuICAgKiBkZWNvcmF0b3JzIHByZXNlbnQgb24gdGhlIGRlY2xhcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZGVjbGFyYXRpb24gYSBUeXBlU2NyaXB0IGB0cy5EZWNsYXJhdGlvbmAgbm9kZSByZXByZXNlbnRpbmcgdGhlIGNsYXNzIG9yIGZ1bmN0aW9uIG92ZXJcbiAgICogd2hpY2ggdG8gcmVmbGVjdC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBpbnRlbnQgaXMgdG8gcmVmbGVjdCB0aGUgZGVjb3JhdG9ycyBvZiBhIGNsYXNzIGFuZCB0aGVcbiAgICogc291cmNlIGlzIGluIEVTNiBmb3JtYXQsIHRoaXMgd2lsbCBiZSBhIGB0cy5DbGFzc0RlY2xhcmF0aW9uYCBub2RlLiBJZiB0aGUgc291cmNlIGlzIGluIEVTNVxuICAgKiBmb3JtYXQsIHRoaXMgbWlnaHQgYmUgYSBgdHMuVmFyaWFibGVEZWNsYXJhdGlvbmAgYXMgY2xhc3NlcyBpbiBFUzUgYXJlIHJlcHJlc2VudGVkIGFzIHRoZVxuICAgKiByZXN1bHQgb2YgYW4gSUlGRSBleGVjdXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIGFuIGFycmF5IG9mIGBEZWNvcmF0b3JgIG1ldGFkYXRhIGlmIGRlY29yYXRvcnMgYXJlIHByZXNlbnQgb24gdGhlIGRlY2xhcmF0aW9uLCBvclxuICAgKiBgbnVsbGAgaWYgZWl0aGVyIG5vIGRlY29yYXRvcnMgd2VyZSBwcmVzZW50IG9yIGlmIHRoZSBkZWNsYXJhdGlvbiBpcyBub3Qgb2YgYSBkZWNvcmF0YWJsZSB0eXBlLlxuICAgKi9cbiAgZ2V0RGVjb3JhdG9yc09mRGVjbGFyYXRpb24oZGVjbGFyYXRpb246IHRzLkRlY2xhcmF0aW9uKTogRGVjb3JhdG9yW118bnVsbDtcblxuICAvKipcbiAgICogRXhhbWluZSBhIGRlY2xhcmF0aW9uIHdoaWNoIHNob3VsZCBiZSBvZiBhIGNsYXNzLCBhbmQgcmV0dXJuIG1ldGFkYXRhIGFib3V0IHRoZSBtZW1iZXJzIG9mIHRoZVxuICAgKiBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIGNsYXp6IGEgYENsYXNzRGVjbGFyYXRpb25gIHJlcHJlc2VudGluZyB0aGUgY2xhc3Mgb3ZlciB3aGljaCB0byByZWZsZWN0LlxuICAgKlxuICAgKiBAcmV0dXJucyBhbiBhcnJheSBvZiBgQ2xhc3NNZW1iZXJgIG1ldGFkYXRhIHJlcHJlc2VudGluZyB0aGUgbWVtYmVycyBvZiB0aGUgY2xhc3MuXG4gICAqXG4gICAqIEB0aHJvd3MgaWYgYGRlY2xhcmF0aW9uYCBkb2VzIG5vdCByZXNvbHZlIHRvIGEgY2xhc3MgZGVjbGFyYXRpb24uXG4gICAqL1xuICBnZXRNZW1iZXJzT2ZDbGFzcyhjbGF6ejogQ2xhc3NEZWNsYXJhdGlvbik6IENsYXNzTWVtYmVyW107XG5cbiAgLyoqXG4gICAqIFJlZmxlY3Qgb3ZlciB0aGUgY29uc3RydWN0b3Igb2YgYSBjbGFzcyBhbmQgcmV0dXJuIG1ldGFkYXRhIGFib3V0IGl0cyBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBvbmx5IGxvb2tzIGF0IHRoZSBjb25zdHJ1Y3RvciBvZiBhIGNsYXNzIGRpcmVjdGx5IGFuZCBub3QgYXQgYW55IGluaGVyaXRlZFxuICAgKiBjb25zdHJ1Y3RvcnMuXG4gICAqXG4gICAqIEBwYXJhbSBjbGF6eiBhIGBDbGFzc0RlY2xhcmF0aW9uYCByZXByZXNlbnRpbmcgdGhlIGNsYXNzIG92ZXIgd2hpY2ggdG8gcmVmbGVjdC5cbiAgICpcbiAgICogQHJldHVybnMgYW4gYXJyYXkgb2YgYFBhcmFtZXRlcmAgbWV0YWRhdGEgcmVwcmVzZW50aW5nIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBjb25zdHJ1Y3RvciwgaWZcbiAgICogYSBjb25zdHJ1Y3RvciBleGlzdHMuIElmIHRoZSBjb25zdHJ1Y3RvciBleGlzdHMgYW5kIGhhcyAwIHBhcmFtZXRlcnMsIHRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eS5cbiAgICogSWYgdGhlIGNsYXNzIGhhcyBubyBjb25zdHJ1Y3RvciwgdGhpcyBtZXRob2QgcmV0dXJucyBgbnVsbGAuXG4gICAqL1xuICBnZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoY2xheno6IENsYXNzRGVjbGFyYXRpb24pOiBDdG9yUGFyYW1ldGVyW118bnVsbDtcblxuICAvKipcbiAgICogUmVmbGVjdCBvdmVyIGEgZnVuY3Rpb24gYW5kIHJldHVybiBtZXRhZGF0YSBhYm91dCBpdHMgcGFyYW1ldGVycyBhbmQgYm9keS5cbiAgICpcbiAgICogRnVuY3Rpb25zIGluIFR5cGVTY3JpcHQgYW5kIEVTNSBjb2RlIGhhdmUgZGlmZmVyZW50IEFTVCByZXByZXNlbnRhdGlvbnMsIGluIHBhcnRpY3VsYXIgYXJvdW5kXG4gICAqIGRlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzLiBBIFR5cGVTY3JpcHQgZnVuY3Rpb24gaGFzIGl0cyBkZWZhdWx0IHZhbHVlIGFzIHRoZSBpbml0aWFsaXplclxuICAgKiBvbiB0aGUgcGFyYW1ldGVyIGRlY2xhcmF0aW9uLCB3aGVyZWFzIGFuIEVTNSBmdW5jdGlvbiBoYXMgaXRzIGRlZmF1bHQgdmFsdWUgc2V0IGluIGEgc3RhdGVtZW50XG4gICAqIG9mIHRoZSBmb3JtOlxuICAgKlxuICAgKiBpZiAocGFyYW0gPT09IHZvaWQgMCkgeyBwYXJhbSA9IDM7IH1cbiAgICpcbiAgICogVGhpcyBtZXRob2QgYWJzdHJhY3RzIG92ZXIgdGhlc2UgZGV0YWlscywgYW5kIGludGVycHJldHMgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGFuZCBib2R5IHRvXG4gICAqIGV4dHJhY3QgcGFyYW1ldGVyIGRlZmF1bHQgdmFsdWVzIGFuZCB0aGUgXCJyZWFsXCIgYm9keS5cbiAgICpcbiAgICogQSBjdXJyZW50IGxpbWl0YXRpb24gaXMgdGhhdCB0aGlzIG1ldGFkYXRhIGhhcyBubyByZXByZXNlbnRhdGlvbiBmb3Igc2hvcnRoYW5kIGFzc2lnbm1lbnQgb2ZcbiAgICogcGFyYW1ldGVyIG9iamVjdHMgaW4gdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZS5cbiAgICpcbiAgICogQHBhcmFtIGZuIGEgVHlwZVNjcmlwdCBgdHMuRGVjbGFyYXRpb25gIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBmdW5jdGlvbiBvdmVyIHdoaWNoIHRvIHJlZmxlY3QuXG4gICAqXG4gICAqIEByZXR1cm5zIGEgYEZ1bmN0aW9uRGVmaW5pdGlvbmAgZ2l2aW5nIG1ldGFkYXRhIGFib3V0IHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLlxuICAgKi9cbiAgZ2V0RGVmaW5pdGlvbk9mRnVuY3Rpb24oZm46IHRzLk5vZGUpOiBGdW5jdGlvbkRlZmluaXRpb258bnVsbDtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIGFuIGlkZW50aWZpZXIgd2FzIGltcG9ydGVkIGZyb20gYW5vdGhlciBtb2R1bGUgYW5kIHJldHVybiBgSW1wb3J0YCBtZXRhZGF0YVxuICAgKiBkZXNjcmliaW5nIGl0cyBvcmlnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBpZCBhIFR5cGVTY3JpcHQgYHRzLklkZW50aWZlcmAgdG8gcmVmbGVjdC5cbiAgICpcbiAgICogQHJldHVybnMgbWV0YWRhdGEgYWJvdXQgdGhlIGBJbXBvcnRgIGlmIHRoZSBpZGVudGlmaWVyIHdhcyBpbXBvcnRlZCBmcm9tIGFub3RoZXIgbW9kdWxlLCBvclxuICAgKiBgbnVsbGAgaWYgdGhlIGlkZW50aWZpZXIgZG9lc24ndCByZXNvbHZlIHRvIGFuIGltcG9ydCBidXQgaW5zdGVhZCBpcyBsb2NhbGx5IGRlZmluZWQuXG4gICAqL1xuICBnZXRJbXBvcnRPZklkZW50aWZpZXIoaWQ6IHRzLklkZW50aWZpZXIpOiBJbXBvcnR8bnVsbDtcblxuICAvKipcbiAgICogVHJhY2UgYW4gaWRlbnRpZmllciB0byBpdHMgZGVjbGFyYXRpb24sIGlmIHBvc3NpYmxlLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBhdHRlbXB0cyB0byByZXNvbHZlIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgZ2l2ZW4gaWRlbnRpZmllciwgdHJhY2luZyBiYWNrIHRocm91Z2hcbiAgICogaW1wb3J0cyBhbmQgcmUtZXhwb3J0cyB1bnRpbCB0aGUgb3JpZ2luYWwgZGVjbGFyYXRpb24gc3RhdGVtZW50IGlzIGZvdW5kLiBBIGBEZWNsYXJhdGlvbmBcbiAgICogb2JqZWN0IGlzIHJldHVybmVkIGlmIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiBpcyBmb3VuZCwgb3IgYG51bGxgIGlzIHJldHVybmVkIG90aGVyd2lzZS5cbiAgICpcbiAgICogSWYgdGhlIGRlY2xhcmF0aW9uIGlzIGluIGEgZGlmZmVyZW50IG1vZHVsZSwgYW5kIHRoYXQgbW9kdWxlIGlzIGltcG9ydGVkIHZpYSBhbiBhYnNvbHV0ZSBwYXRoLFxuICAgKiB0aGlzIG1ldGhvZCBhbHNvIHJldHVybnMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGltcG9ydGVkIG1vZHVsZS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBjb2RlIGlzOlxuICAgKlxuICAgKiBgYGBcbiAgICogaW1wb3J0IHtSb3V0ZXJNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuICAgKlxuICAgKiBleHBvcnQgY29uc3QgUk9VVEVTID0gUm91dGVyTW9kdWxlLmZvclJvb3QoWy4uLl0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogYW5kIGlmIGBnZXREZWNsYXJhdGlvbk9mSWRlbnRpZmllcmAgaXMgY2FsbGVkIG9uIGBSb3V0ZXJNb2R1bGVgIGluIHRoZSBgUk9VVEVTYCBleHByZXNzaW9uLFxuICAgKiB0aGVuIGl0IHdvdWxkIHRyYWNlIGBSb3V0ZXJNb2R1bGVgIHZpYSBpdHMgaW1wb3J0IGZyb20gYEBhbmd1bGFyL2NvcmVgLCBhbmQgbm90ZSB0aGF0IHRoZVxuICAgKiBkZWZpbml0aW9uIHdhcyBpbXBvcnRlZCBmcm9tIGBAYW5ndWxhci9jb3JlYCBpbnRvIHRoZSBhcHBsaWNhdGlvbiB3aGVyZSBpdCB3YXMgcmVmZXJlbmNlZC5cbiAgICpcbiAgICogSWYgdGhlIGRlZmluaXRpb24gaXMgcmUtZXhwb3J0ZWQgc2V2ZXJhbCB0aW1lcyBmcm9tIGRpZmZlcmVudCBhYnNvbHV0ZSBtb2R1bGUgbmFtZXMsIG9ubHlcbiAgICogdGhlIGZpcnN0IG9uZSAodGhlIG9uZSBieSB3aGljaCB0aGUgYXBwbGljYXRpb24gcmVmZXJzIHRvIHRoZSBtb2R1bGUpIGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBUaGlzIG1vZHVsZSBuYW1lIGlzIHJldHVybmVkIGluIHRoZSBgdmlhTW9kdWxlYCBmaWVsZCBvZiB0aGUgYERlY2xhcmF0aW9uYC4gSWYgVGhlIGRlY2xhcmF0aW9uXG4gICAqIGlzIHJlbGF0aXZlIHRvIHRoZSBhcHBsaWNhdGlvbiBpdHNlbGYgYW5kIHRoZXJlIHdhcyBubyBpbXBvcnQgdGhyb3VnaCBhbiBhYnNvbHV0ZSBwYXRoLCB0aGVuXG4gICAqIGB2aWFNb2R1bGVgIGlzIGBudWxsYC5cbiAgICpcbiAgICogQHBhcmFtIGlkIGEgVHlwZVNjcmlwdCBgdHMuSWRlbnRpZmllcmAgdG8gdHJhY2UgYmFjayB0byBhIGRlY2xhcmF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBtZXRhZGF0YSBhYm91dCB0aGUgYERlY2xhcmF0aW9uYCBpZiB0aGUgb3JpZ2luYWwgZGVjbGFyYXRpb24gaXMgZm91bmQsIG9yIGBudWxsYFxuICAgKiBvdGhlcndpc2UuXG4gICAqL1xuICBnZXREZWNsYXJhdGlvbk9mSWRlbnRpZmllcihpZDogdHMuSWRlbnRpZmllcik6IERlY2xhcmF0aW9ufG51bGw7XG5cbiAgLyoqXG4gICAqIENvbGxlY3QgdGhlIGRlY2xhcmF0aW9ucyBleHBvcnRlZCBmcm9tIGEgbW9kdWxlIGJ5IG5hbWUuXG4gICAqXG4gICAqIEl0ZXJhdGVzIG92ZXIgdGhlIGV4cG9ydHMgb2YgYSBtb2R1bGUgKGluY2x1ZGluZyByZS1leHBvcnRzKSBhbmQgcmV0dXJucyBhIG1hcCBvZiBleHBvcnRcbiAgICogbmFtZSB0byBpdHMgYERlY2xhcmF0aW9uYC4gSWYgYW4gZXhwb3J0ZWQgdmFsdWUgaXMgaXRzZWxmIHJlLWV4cG9ydGVkIGZyb20gYW5vdGhlciBtb2R1bGUsXG4gICAqIHRoZSBgRGVjbGFyYXRpb25gJ3MgYHZpYU1vZHVsZWAgd2lsbCByZWZsZWN0IHRoYXQuXG4gICAqXG4gICAqIEBwYXJhbSBub2RlIGEgVHlwZVNjcmlwdCBgdHMuTm9kZWAgcmVwcmVzZW50aW5nIHRoZSBtb2R1bGUgKGZvciBleGFtcGxlIGEgYHRzLlNvdXJjZUZpbGVgKSBmb3JcbiAgICogd2hpY2ggdG8gY29sbGVjdCBleHBvcnRzLlxuICAgKlxuICAgKiBAcmV0dXJucyBhIG1hcCBvZiBgRGVjbGFyYXRpb25gcyBmb3IgdGhlIG1vZHVsZSdzIGV4cG9ydHMsIGJ5IG5hbWUuXG4gICAqL1xuICBnZXRFeHBvcnRzT2ZNb2R1bGUobW9kdWxlOiB0cy5Ob2RlKTogTWFwPHN0cmluZywgRGVjbGFyYXRpb24+fG51bGw7XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYWN0dWFsbHkgcmVwcmVzZW50cyBhIGNsYXNzLlxuICAgKi9cbiAgaXNDbGFzcyhub2RlOiB0cy5Ob2RlKTogbm9kZSBpcyBDbGFzc0RlY2xhcmF0aW9uO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGRlY2xhcmF0aW9uLCB3aGljaCBzaG91bGQgYmUgYSBjbGFzcywgaGFzIGEgYmFzZSBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIGNsYXp6IGEgYENsYXNzRGVjbGFyYXRpb25gIHJlcHJlc2VudGluZyB0aGUgY2xhc3Mgb3ZlciB3aGljaCB0byByZWZsZWN0LlxuICAgKi9cbiAgaGFzQmFzZUNsYXNzKGNsYXp6OiBDbGFzc0RlY2xhcmF0aW9uKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogR2V0IGFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBiYXNlIGNsYXNzIChpZiBhbnkpIG9mIHRoZSBnaXZlbiBgY2xhenpgLlxuICAgKlxuICAgKiBUaGlzIGV4cHJlc3Npb24gaXMgbW9zdCBjb21tb25seSBhbiBJZGVudGlmaWVyLCBidXQgaXMgcG9zc2libGUgdG8gaW5oZXJpdCBmcm9tIGEgbW9yZSBkeW5hbWljXG4gICAqIGV4cHJlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSBjbGF6eiB0aGUgY2xhc3Mgd2hvc2UgYmFzZSB3ZSB3YW50IHRvIGdldC5cbiAgICovXG4gIGdldEJhc2VDbGFzc0V4cHJlc3Npb24oY2xheno6IENsYXNzRGVjbGFyYXRpb24pOiB0cy5FeHByZXNzaW9ufG51bGw7XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyIG9mIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzIG9mIGEgZ2l2ZW4gY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSBjbGF6eiBhIGBDbGFzc0RlY2xhcmF0aW9uYCByZXByZXNlbnRpbmcgdGhlIGNsYXNzIG92ZXIgd2hpY2ggdG8gcmVmbGVjdC5cbiAgICpcbiAgICogQHJldHVybnMgdGhlIG51bWJlciBvZiB0eXBlIHBhcmFtZXRlcnMgb2YgdGhlIGNsYXNzLCBpZiBrbm93biwgb3IgYG51bGxgIGlmIHRoZSBkZWNsYXJhdGlvblxuICAgKiBpcyBub3QgYSBjbGFzcyBvciBoYXMgYW4gdW5rbm93biBudW1iZXIgb2YgdHlwZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgZ2V0R2VuZXJpY0FyaXR5T2ZDbGFzcyhjbGF6ejogQ2xhc3NEZWNsYXJhdGlvbik6IG51bWJlcnxudWxsO1xuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBhc3NpZ25lZCB2YWx1ZSBvZiBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uLlxuICAgKlxuICAgKiBOb3JtYWxseSB0aGlzIHdpbGwgYmUgdGhlIGluaXRpYWxpemVyIG9mIHRoZSBkZWNsYXJhdGlvbiwgYnV0IHdoZXJlIHRoZSB2YXJpYWJsZSBpc1xuICAgKiBub3QgYSBgY29uc3RgIHdlIG1heSBuZWVkIHRvIGxvb2sgZWxzZXdoZXJlIGZvciB0aGUgdmFyaWFibGUncyB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIGRlY2xhcmF0aW9uIGEgVHlwZVNjcmlwdCB2YXJpYWJsZSBkZWNsYXJhdGlvbiwgd2hvc2UgdmFsdWUgd2Ugd2FudC5cbiAgICogQHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSwgYXMgYSBUeXBlU2NyaXB0IGV4cHJlc3Npb24gbm9kZSwgb3IgYHVuZGVmaW5lZGBcbiAgICogaWYgdGhlIHZhbHVlIGNhbm5vdCBiZSBjb21wdXRlZC5cbiAgICovXG4gIGdldFZhcmlhYmxlVmFsdWUoZGVjbGFyYXRpb246IHRzLlZhcmlhYmxlRGVjbGFyYXRpb24pOiB0cy5FeHByZXNzaW9ufG51bGw7XG5cbiAgLyoqXG4gICAqIFRha2UgYW4gZXhwb3J0ZWQgZGVjbGFyYXRpb24gKG1heWJlIGEgY2xhc3MgZG93bi1sZXZlbGVkIHRvIGEgdmFyaWFibGUpIGFuZCBsb29rIHVwIHRoZVxuICAgKiBkZWNsYXJhdGlvbiBvZiBpdHMgdHlwZSBpbiBhIHNlcGFyYXRlIC5kLnRzIHRyZWUuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgYWxsb3dlZCB0byByZXR1cm4gYG51bGxgIGlmIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQgZG9lcyBub3QgaGF2ZSBhXG4gICAqIHNlcGFyYXRlIC5kLnRzIHRyZWUuIFdoZW4gY29tcGlsaW5nIFR5cGVTY3JpcHQgY29kZSB0aGlzIGlzIGFsd2F5cyB0aGUgY2FzZSwgc2luY2UgLmQudHMgZmlsZXNcbiAgICogYXJlIHByb2R1Y2VkIG9ubHkgZHVyaW5nIHRoZSBlbWl0IG9mIHN1Y2ggYSBjb21waWxhdGlvbi4gV2hlbiBjb21waWxpbmcgLmpzIGNvZGUsIGhvd2V2ZXIsXG4gICAqIHRoZXJlIGlzIGZyZXF1ZW50bHkgYSBwYXJhbGxlbCAuZC50cyB0cmVlIHdoaWNoIHRoaXMgbWV0aG9kIGV4cG9zZXMuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgYHRzLkRlY2xhcmF0aW9uYCByZXR1cm5lZCBmcm9tIHRoaXMgZnVuY3Rpb24gbWF5IG5vdCBiZSBmcm9tIHRoZSBzYW1lXG4gICAqIGB0cy5Qcm9ncmFtYCBhcyB0aGUgaW5wdXQgZGVjbGFyYXRpb24uXG4gICAqL1xuICBnZXREdHNEZWNsYXJhdGlvbihkZWNsYXJhdGlvbjogdHMuRGVjbGFyYXRpb24pOiB0cy5EZWNsYXJhdGlvbnxudWxsO1xuXG4gIC8qKlxuICAgKiBHZXQgYSBgdHMuSWRlbnRpZmllcmAgZm9yIGEgZ2l2ZW4gYENsYXNzRGVjbGFyYXRpb25gIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBjbGFzc1xuICAgKiB3aXRoaW4gaXRzIGRlZmluaXRpb24gKHN1Y2ggYXMgaW4gc3RhdGljIGZpZWxkcykuXG4gICAqXG4gICAqIFRoaXMgY2FuIGRpZmZlciBmcm9tIGBjbGF6ei5uYW1lYCB3aGVuIG5nY2MgcnVucyBvdmVyIEVTNSBjb2RlLCBzaW5jZSB0aGUgY2xhc3MgbWF5IGhhdmUgYVxuICAgKiBkaWZmZXJlbnQgbmFtZSB3aXRoaW4gaXRzIElJRkUgd3JhcHBlciB0aGFuIGl0IGRvZXMgZXh0ZXJuYWxseS5cbiAgICovXG4gIGdldEludGVybmFsTmFtZU9mQ2xhc3MoY2xheno6IENsYXNzRGVjbGFyYXRpb24pOiB0cy5JZGVudGlmaWVyO1xuXG4gIC8qKlxuICAgKiBHZXQgYSBgdHMuSWRlbnRpZmllcmAgZm9yIGEgZ2l2ZW4gYENsYXNzRGVjbGFyYXRpb25gIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBjbGFzc1xuICAgKiBmcm9tIHN0YXRlbWVudHMgdGhhdCBhcmUgXCJhZGphY2VudFwiLCBhbmQgY29uY2VwdHVhbGx5IHRpZ2h0bHkgYm91bmQsIHRvIHRoZSBjbGFzcyBidXQgbm90XG4gICAqIGFjdHVhbGx5IGluc2lkZSBpdC5cbiAgICpcbiAgICogU2ltaWxhciB0byBgZ2V0SW50ZXJuYWxOYW1lT2ZDbGFzcygpYCwgdGhpcyBuYW1lIGNhbiBkaWZmZXIgZnJvbSBgY2xhenoubmFtZWAgd2hlbiBuZ2NjIHJ1bnNcbiAgICogb3ZlciBFUzUgY29kZSwgc2luY2UgdGhlc2UgXCJhZGphY2VudFwiIHN0YXRlbWVudHMgbmVlZCB0byBleGlzdCBpbiB0aGUgSUlGRSB3aGVyZSB0aGUgY2xhc3MgbWF5XG4gICAqIGhhdmUgYSBkaWZmZXJlbnQgbmFtZSB0aGFuIGl0IGRvZXMgZXh0ZXJuYWxseS5cbiAgICovXG4gIGdldEFkamFjZW50TmFtZU9mQ2xhc3MoY2xheno6IENsYXNzRGVjbGFyYXRpb24pOiB0cy5JZGVudGlmaWVyO1xufVxuIl19
@@ -15,7 +15,7 @@ import { TypeValueReference } from './host';
15
15
  * This can return `null` if the `typeNode` is `null`, if it does not refer to a symbol with a value
16
16
  * declaration, or if it is not possible to statically understand.
17
17
  */
18
- export declare function typeToValue(typeNode: ts.TypeNode | null, checker: ts.TypeChecker): TypeValueReference | null;
18
+ export declare function typeToValue(typeNode: ts.TypeNode | null, checker: ts.TypeChecker): TypeValueReference;
19
19
  /**
20
20
  * Attempt to extract a `ts.Expression` that's equivalent to a `ts.TypeNode`, as the two have
21
21
  * different AST shapes but can reference the same symbols.
@@ -28,18 +28,21 @@
28
28
  */
29
29
  function typeToValue(typeNode, checker) {
30
30
  // It's not possible to get a value expression if the parameter doesn't even have a type.
31
- if (typeNode === null || !ts.isTypeReferenceNode(typeNode)) {
32
- return null;
31
+ if (typeNode === null) {
32
+ return missingType();
33
+ }
34
+ if (!ts.isTypeReferenceNode(typeNode)) {
35
+ return unsupportedType(typeNode);
33
36
  }
34
37
  var symbols = resolveTypeSymbols(typeNode, checker);
35
38
  if (symbols === null) {
36
- return null;
39
+ return unknownReference(typeNode);
37
40
  }
38
41
  var local = symbols.local, decl = symbols.decl;
39
42
  // It's only valid to convert a type reference to a value reference if the type actually
40
43
  // has a value declaration associated with it.
41
44
  if (decl.valueDeclaration === undefined) {
42
- return null;
45
+ return noValueDeclaration(typeNode, decl.declarations[0]);
43
46
  }
44
47
  // The type points to a valid value declaration. Rewrite the TypeReference into an
45
48
  // Expression which references the value pointed to by the TypeReference, if possible.
@@ -50,8 +53,12 @@
50
53
  if (ts.isImportClause(firstDecl) && firstDecl.name !== undefined) {
51
54
  // This is a default import.
52
55
  // import Foo from 'foo';
56
+ if (firstDecl.isTypeOnly) {
57
+ // Type-only imports cannot be represented as value.
58
+ return typeOnlyImport(typeNode, firstDecl);
59
+ }
53
60
  return {
54
- local: true,
61
+ kind: 0 /* LOCAL */,
55
62
  // Copying the name here ensures the generated references will be correctly transformed
56
63
  // along with the import.
57
64
  expression: ts.updateIdentifier(firstDecl.name),
@@ -63,6 +70,10 @@
63
70
  // import {Foo} from 'foo';
64
71
  // or
65
72
  // import {Foo as Bar} from 'foo';
73
+ if (firstDecl.parent.parent.isTypeOnly) {
74
+ // Type-only imports cannot be represented as value.
75
+ return typeOnlyImport(typeNode, firstDecl.parent.parent);
76
+ }
66
77
  // Determine the name to import (`Foo`) from the import specifier, as the symbol names of
67
78
  // the imported type could refer to a local alias (like `Bar` in the example above).
68
79
  var importedName = (firstDecl.propertyName || firstDecl.name).text;
@@ -71,7 +82,7 @@
71
82
  var _a = tslib_1.__read(symbols.symbolNames), _localName = _a[0], nestedPath = _a.slice(1);
72
83
  var moduleName = extractModuleName(firstDecl.parent.parent.parent);
73
84
  return {
74
- local: false,
85
+ kind: 1 /* IMPORTED */,
75
86
  valueDeclaration: decl.valueDeclaration,
76
87
  moduleName: moduleName,
77
88
  importedName: importedName,
@@ -81,9 +92,13 @@
81
92
  else if (ts.isNamespaceImport(firstDecl)) {
82
93
  // The import is a namespace import
83
94
  // import * as Foo from 'foo';
95
+ if (firstDecl.parent.isTypeOnly) {
96
+ // Type-only imports cannot be represented as value.
97
+ return typeOnlyImport(typeNode, firstDecl.parent);
98
+ }
84
99
  if (symbols.symbolNames.length === 1) {
85
100
  // The type refers to the namespace itself, which cannot be represented as a value.
86
- return null;
101
+ return namespaceImport(typeNode, firstDecl.parent);
87
102
  }
88
103
  // The first symbol name refers to the local name of the namespace, which is is discarded
89
104
  // as a new namespace import will be generated. This is followed by the symbol name that needs
@@ -91,7 +106,7 @@
91
106
  var _b = tslib_1.__read(symbols.symbolNames), _ns = _b[0], importedName = _b[1], nestedPath = _b.slice(2);
92
107
  var moduleName = extractModuleName(firstDecl.parent.parent);
93
108
  return {
94
- local: false,
109
+ kind: 1 /* IMPORTED */,
95
110
  valueDeclaration: decl.valueDeclaration,
96
111
  moduleName: moduleName,
97
112
  importedName: importedName,
@@ -103,16 +118,52 @@
103
118
  var expression = typeNodeToValueExpr(typeNode);
104
119
  if (expression !== null) {
105
120
  return {
106
- local: true,
121
+ kind: 0 /* LOCAL */,
107
122
  expression: expression,
108
123
  defaultImportStatement: null,
109
124
  };
110
125
  }
111
126
  else {
112
- return null;
127
+ return unsupportedType(typeNode);
113
128
  }
114
129
  }
115
130
  exports.typeToValue = typeToValue;
131
+ function unsupportedType(typeNode) {
132
+ return {
133
+ kind: 2 /* UNAVAILABLE */,
134
+ reason: { kind: 5 /* UNSUPPORTED */, typeNode: typeNode },
135
+ };
136
+ }
137
+ function noValueDeclaration(typeNode, decl) {
138
+ return {
139
+ kind: 2 /* UNAVAILABLE */,
140
+ reason: { kind: 1 /* NO_VALUE_DECLARATION */, typeNode: typeNode, decl: decl },
141
+ };
142
+ }
143
+ function typeOnlyImport(typeNode, importClause) {
144
+ return {
145
+ kind: 2 /* UNAVAILABLE */,
146
+ reason: { kind: 2 /* TYPE_ONLY_IMPORT */, typeNode: typeNode, importClause: importClause },
147
+ };
148
+ }
149
+ function unknownReference(typeNode) {
150
+ return {
151
+ kind: 2 /* UNAVAILABLE */,
152
+ reason: { kind: 3 /* UNKNOWN_REFERENCE */, typeNode: typeNode },
153
+ };
154
+ }
155
+ function namespaceImport(typeNode, importClause) {
156
+ return {
157
+ kind: 2 /* UNAVAILABLE */,
158
+ reason: { kind: 4 /* NAMESPACE */, typeNode: typeNode, importClause: importClause },
159
+ };
160
+ }
161
+ function missingType() {
162
+ return {
163
+ kind: 2 /* UNAVAILABLE */,
164
+ reason: { kind: 0 /* MISSING_TYPE */ },
165
+ };
166
+ }
116
167
  /**
117
168
  * Attempt to extract a `ts.Expression` that's equivalent to a `ts.TypeNode`, as the two have
118
169
  * different AST shapes but can reference the same symbols.
@@ -202,4 +253,4 @@
202
253
  return node.moduleSpecifier.text;
203
254
  }
204
255
  });
205
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZV90b192YWx1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2MvcmVmbGVjdGlvbi9zcmMvdHlwZV90b192YWx1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7O0lBRUgsK0JBQWlDO0lBSWpDOzs7Ozs7T0FNRztJQUNILFNBQWdCLFdBQVcsQ0FDdkIsUUFBMEIsRUFBRSxPQUF1QjtRQUNyRCx5RkFBeUY7UUFDekYsSUFBSSxRQUFRLEtBQUssSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzFELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEQsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFO1lBQ3BCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFTSxJQUFBLEtBQUssR0FBVSxPQUFPLE1BQWpCLEVBQUUsSUFBSSxHQUFJLE9BQU8sS0FBWCxDQUFZO1FBQzlCLHdGQUF3RjtRQUN4Riw4Q0FBOEM7UUFDOUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxFQUFFO1lBQ3ZDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxrRkFBa0Y7UUFDbEYsc0ZBQXNGO1FBRXRGLGtGQUFrRjtRQUNsRixvRkFBb0Y7UUFDcEYsSUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlELElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUMzQixJQUFJLEVBQUUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7Z0JBQ2hF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QztTQUNoRDtRQUNELE9BQU8sRUFBQyxLQUFLLE9BQUEsRUFBRSxJQUFJLE1BQUEsRUFBRSxXQUFXLGFBQUEsRUFBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxTQUFTLGlCQUFpQixDQUFDLElBQW1CO1FBQzVDLElBQUksRUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM1QixJQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUMsT0FBTyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1NBQ3pFO2FBQU0sSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2hDLE9BQU8sRUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQzthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUM7SUFFRCxTQUFTLGlCQUFpQixDQUFDLElBQTBCO1FBQ25ELElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUM3QyxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7U0FDM0M7UUFDRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO0lBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7VHlwZVZhbHVlUmVmZXJlbmNlfSBmcm9tICcuL2hvc3QnO1xuXG4vKipcbiAqIFBvdGVudGlhbGx5IGNvbnZlcnQgYSBgdHMuVHlwZU5vZGVgIHRvIGEgYFR5cGVWYWx1ZVJlZmVyZW5jZWAsIHdoaWNoIGluZGljYXRlcyBob3cgdG8gdXNlIHRoZVxuICogdHlwZSBnaXZlbiBpbiB0aGUgYHRzLlR5cGVOb2RlYCBpbiBhIHZhbHVlIHBvc2l0aW9uLlxuICpcbiAqIFRoaXMgY2FuIHJldHVybiBgbnVsbGAgaWYgdGhlIGB0eXBlTm9kZWAgaXMgYG51bGxgLCBpZiBpdCBkb2VzIG5vdCByZWZlciB0byBhIHN5bWJvbCB3aXRoIGEgdmFsdWVcbiAqIGRlY2xhcmF0aW9uLCBvciBpZiBpdCBpcyBub3QgcG9zc2libGUgdG8gc3RhdGljYWxseSB1bmRlcnN0YW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZVRvVmFsdWUoXG4gICAgdHlwZU5vZGU6IHRzLlR5cGVOb2RlfG51bGwsIGNoZWNrZXI6IHRzLlR5cGVDaGVja2VyKTogVHlwZVZhbHVlUmVmZXJlbmNlfG51bGwge1xuICAvLyBJdCdzIG5vdCBwb3NzaWJsZSB0byBnZXQgYSB2YWx1ZSBleHByZXNzaW9uIGlmIHRoZSBwYXJhbWV0ZXIgZG9lc24ndCBldmVuIGhhdmUgYSB0eXBlLlxuICBpZiAodHlwZU5vZGUgPT09IG51bGwgfHwgIXRzLmlzVHlwZVJlZmVyZW5jZU5vZGUodHlwZU5vZGUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzeW1ib2xzID0gcmVzb2x2ZVR5cGVTeW1ib2xzKHR5cGVOb2RlLCBjaGVja2VyKTtcbiAgaWYgKHN5bWJvbHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHtsb2NhbCwgZGVjbH0gPSBzeW1ib2xzO1xuICAvLyBJdCdzIG9ubHkgdmFsaWQgdG8gY29udmVydCBhIHR5cGUgcmVmZXJlbmNlIHRvIGEgdmFsdWUgcmVmZXJlbmNlIGlmIHRoZSB0eXBlIGFjdHVhbGx5XG4gIC8vIGhhcyBhIHZhbHVlIGRlY2xhcmF0aW9uIGFzc29jaWF0ZWQgd2l0aCBpdC5cbiAgaWYgKGRlY2wudmFsdWVEZWNsYXJhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBUaGUgdHlwZSBwb2ludHMgdG8gYSB2YWxpZCB2YWx1ZSBkZWNsYXJhdGlvbi4gUmV3cml0ZSB0aGUgVHlwZVJlZmVyZW5jZSBpbnRvIGFuXG4gIC8vIEV4cHJlc3Npb24gd2hpY2ggcmVmZXJlbmNlcyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSB0aGUgVHlwZVJlZmVyZW5jZSwgaWYgcG9zc2libGUuXG5cbiAgLy8gTG9vayBhdCB0aGUgbG9jYWwgYHRzLlN5bWJvbGAncyBkZWNsYXJhdGlvbnMgYW5kIHNlZSBpZiBpdCBjb21lcyBmcm9tIGFuIGltcG9ydFxuICAvLyBzdGF0ZW1lbnQuIElmIHNvLCBleHRyYWN0IHRoZSBtb2R1bGUgc3BlY2lmaWVyIGFuZCB0aGUgbmFtZSBvZiB0aGUgaW1wb3J0ZWQgdHlwZS5cbiAgY29uc3QgZmlyc3REZWNsID0gbG9jYWwuZGVjbGFyYXRpb25zICYmIGxvY2FsLmRlY2xhcmF0aW9uc1swXTtcbiAgaWYgKGZpcnN0RGVjbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRzLmlzSW1wb3J0Q2xhdXNlKGZpcnN0RGVjbCkgJiYgZmlyc3REZWNsLm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVGhpcyBpcyBhIGRlZmF1bHQgaW1wb3J0LlxuICAgICAgLy8gICBpbXBvcnQgRm9vIGZyb20gJ2Zvbyc7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxvY2FsOiB0cnVlLFxuICAgICAgICAvLyBDb3B5aW5nIHRoZSBuYW1lIGhlcmUgZW5zdXJlcyB0aGUgZ2VuZXJhdGVkIHJlZmVyZW5jZXMgd2lsbCBiZSBjb3JyZWN0bHkgdHJhbnNmb3JtZWRcbiAgICAgICAgLy8gYWxvbmcgd2l0aCB0aGUgaW1wb3J0LlxuICAgICAgICBleHByZXNzaW9uOiB0cy51cGRhdGVJZGVudGlmaWVyKGZpcnN0RGVjbC5uYW1lKSxcbiAgICAgICAgZGVmYXVsdEltcG9ydFN0YXRlbWVudDogZmlyc3REZWNsLnBhcmVudCxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICh0cy5pc0ltcG9ydFNwZWNpZmllcihmaXJzdERlY2wpKSB7XG4gICAgICAvLyBUaGUgc3ltYm9sIHdhcyBpbXBvcnRlZCBieSBuYW1lXG4gICAgICAvLyAgIGltcG9ydCB7Rm9vfSBmcm9tICdmb28nO1xuICAgICAgLy8gb3JcbiAgICAgIC8vICAgaW1wb3J0IHtGb28gYXMgQmFyfSBmcm9tICdmb28nO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgdGhlIG5hbWUgdG8gaW1wb3J0IChgRm9vYCkgZnJvbSB0aGUgaW1wb3J0IHNwZWNpZmllciwgYXMgdGhlIHN5bWJvbCBuYW1lcyBvZlxuICAgICAgLy8gdGhlIGltcG9ydGVkIHR5cGUgY291bGQgcmVmZXIgdG8gYSBsb2NhbCBhbGlhcyAobGlrZSBgQmFyYCBpbiB0aGUgZXhhbXBsZSBhYm92ZSkuXG4gICAgICBjb25zdCBpbXBvcnRlZE5hbWUgPSAoZmlyc3REZWNsLnByb3BlcnR5TmFtZSB8fCBmaXJzdERlY2wubmFtZSkudGV4dDtcblxuICAgICAgLy8gVGhlIGZpcnN0IHN5bWJvbCBuYW1lIHJlZmVycyB0byB0aGUgbG9jYWwgbmFtZSwgd2hpY2ggaXMgcmVwbGFjZWQgYnkgYGltcG9ydGVkTmFtZWAgYWJvdmUuXG4gICAgICAvLyBBbnkgcmVtYWluaW5nIHN5bWJvbCBuYW1lcyBtYWtlIHVwIHRoZSBjb21wbGV0ZSBwYXRoIHRvIHRoZSB2YWx1ZS5cbiAgICAgIGNvbnN0IFtfbG9jYWxOYW1lLCAuLi5uZXN0ZWRQYXRoXSA9IHN5bWJvbHMuc3ltYm9sTmFtZXM7XG5cbiAgICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBleHRyYWN0TW9kdWxlTmFtZShmaXJzdERlY2wucGFyZW50LnBhcmVudC5wYXJlbnQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9jYWw6IGZhbHNlLFxuICAgICAgICB2YWx1ZURlY2xhcmF0aW9uOiBkZWNsLnZhbHVlRGVjbGFyYXRpb24sXG4gICAgICAgIG1vZHVsZU5hbWUsXG4gICAgICAgIGltcG9ydGVkTmFtZSxcbiAgICAgICAgbmVzdGVkUGF0aFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHRzLmlzTmFtZXNwYWNlSW1wb3J0KGZpcnN0RGVjbCkpIHtcbiAgICAgIC8vIFRoZSBpbXBvcnQgaXMgYSBuYW1lc3BhY2UgaW1wb3J0XG4gICAgICAvLyAgIGltcG9ydCAqIGFzIEZvbyBmcm9tICdmb28nO1xuXG4gICAgICBpZiAoc3ltYm9scy5zeW1ib2xOYW1lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gVGhlIHR5cGUgcmVmZXJzIHRvIHRoZSBuYW1lc3BhY2UgaXRzZWxmLCB3aGljaCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgYSB2YWx1ZS5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBmaXJzdCBzeW1ib2wgbmFtZSByZWZlcnMgdG8gdGhlIGxvY2FsIG5hbWUgb2YgdGhlIG5hbWVzcGFjZSwgd2hpY2ggaXMgaXMgZGlzY2FyZGVkXG4gICAgICAvLyBhcyBhIG5ldyBuYW1lc3BhY2UgaW1wb3J0IHdpbGwgYmUgZ2VuZXJhdGVkLiBUaGlzIGlzIGZvbGxvd2VkIGJ5IHRoZSBzeW1ib2wgbmFtZSB0aGF0IG5lZWRzXG4gICAgICAvLyB0byBiZSBpbXBvcnRlZCBhbmQgYW55IHJlbWFpbmluZyBuYW1lcyB0aGF0IGNvbnN0aXR1dGUgdGhlIGNvbXBsZXRlIHBhdGggdG8gdGhlIHZhbHVlLlxuICAgICAgY29uc3QgW19ucywgaW1wb3J0ZWROYW1lLCAuLi5uZXN0ZWRQYXRoXSA9IHN5bWJvbHMuc3ltYm9sTmFtZXM7XG5cbiAgICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBleHRyYWN0TW9kdWxlTmFtZShmaXJzdERlY2wucGFyZW50LnBhcmVudCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb2NhbDogZmFsc2UsXG4gICAgICAgIHZhbHVlRGVjbGFyYXRpb246IGRlY2wudmFsdWVEZWNsYXJhdGlvbixcbiAgICAgICAgbW9kdWxlTmFtZSxcbiAgICAgICAgaW1wb3J0ZWROYW1lLFxuICAgICAgICBuZXN0ZWRQYXRoXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIHRoZSB0eXBlIGlzIG5vdCBpbXBvcnRlZCwgdGhlIHR5cGUgcmVmZXJlbmNlIGNhbiBiZSBjb252ZXJ0ZWQgaW50byBhbiBleHByZXNzaW9uIGFzIGlzLlxuICBjb25zdCBleHByZXNzaW9uID0gdHlwZU5vZGVUb1ZhbHVlRXhwcih0eXBlTm9kZSk7XG4gIGlmIChleHByZXNzaW9uICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2FsOiB0cnVlLFxuICAgICAgZXhwcmVzc2lvbixcbiAgICAgIGRlZmF1bHRJbXBvcnRTdGF0ZW1lbnQ6IG51bGwsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gZXh0cmFjdCBhIGB0cy5FeHByZXNzaW9uYCB0aGF0J3MgZXF1aXZhbGVudCB0byBhIGB0cy5UeXBlTm9kZWAsIGFzIHRoZSB0d28gaGF2ZVxuICogZGlmZmVyZW50IEFTVCBzaGFwZXMgYnV0IGNhbiByZWZlcmVuY2UgdGhlIHNhbWUgc3ltYm9scy5cbiAqXG4gKiBUaGlzIHdpbGwgcmV0dXJuIGBudWxsYCBpZiBhbiBlcXVpdmFsZW50IGV4cHJlc3Npb24gY2Fubm90IGJlIGNvbnN0cnVjdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZU5vZGVUb1ZhbHVlRXhwcihub2RlOiB0cy5UeXBlTm9kZSk6IHRzLkV4cHJlc3Npb258bnVsbCB7XG4gIGlmICh0cy5pc1R5cGVSZWZlcmVuY2VOb2RlKG5vZGUpKSB7XG4gICAgcmV0dXJuIGVudGl0eU5hbWVUb1ZhbHVlKG5vZGUudHlwZU5hbWUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGBUeXBlUmVmZXJlbmNlYCBub2RlIHRvIHRoZSBgdHMuU3ltYm9sYHMgZm9yIGJvdGggaXRzIGRlY2xhcmF0aW9uIGFuZCBpdHMgbG9jYWwgc291cmNlLlxuICpcbiAqIEluIHRoZSBldmVudCB0aGF0IHRoZSBgVHlwZVJlZmVyZW5jZWAgcmVmZXJzIHRvIGEgbG9jYWxseSBkZWNsYXJlZCBzeW1ib2wsIHRoZXNlIHdpbGwgYmUgdGhlXG4gKiBzYW1lLiBJZiB0aGUgYFR5cGVSZWZlcmVuY2VgIHJlZmVycyB0byBhbiBpbXBvcnRlZCBzeW1ib2wsIHRoZW4gYGRlY2xgIHdpbGwgYmUgdGhlIGZ1bGx5IHJlc29sdmVkXG4gKiBgdHMuU3ltYm9sYCBvZiB0aGUgcmVmZXJlbmNlZCBzeW1ib2wuIGBsb2NhbGAgd2lsbCBiZSB0aGUgYHRzLlN5bWJvbGAgb2YgdGhlIGB0cy5JZGVudGlmaWVyYFxuICogd2hpY2ggcG9pbnRzIHRvIHRoZSBpbXBvcnQgc3RhdGVtZW50IGJ5IHdoaWNoIHRoZSBzeW1ib2wgd2FzIGltcG9ydGVkLlxuICpcbiAqIEFsbCBzeW1ib2wgbmFtZXMgdGhhdCBtYWtlIHVwIHRoZSB0eXBlIHJlZmVyZW5jZSBhcmUgcmV0dXJuZWQgbGVmdC10by1yaWdodCBpbnRvIHRoZVxuICogYHN5bWJvbE5hbWVzYCBhcnJheSwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBpbmNsdWRlIGF0IGxlYXN0IG9uZSBlbnRyeS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVR5cGVTeW1ib2xzKHR5cGVSZWY6IHRzLlR5cGVSZWZlcmVuY2VOb2RlLCBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcik6XG4gICAge2xvY2FsOiB0cy5TeW1ib2wsIGRlY2w6IHRzLlN5bWJvbCwgc3ltYm9sTmFtZXM6IHN0cmluZ1tdfXxudWxsIHtcbiAgY29uc3QgdHlwZU5hbWUgPSB0eXBlUmVmLnR5cGVOYW1lO1xuICAvLyB0eXBlUmVmU3ltYm9sIGlzIHRoZSB0cy5TeW1ib2wgb2YgdGhlIGVudGlyZSB0eXBlIHJlZmVyZW5jZS5cbiAgY29uc3QgdHlwZVJlZlN5bWJvbDogdHMuU3ltYm9sfHVuZGVmaW5lZCA9IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbih0eXBlTmFtZSk7XG4gIGlmICh0eXBlUmVmU3ltYm9sID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIGBsb2NhbGAgaXMgdGhlIGB0cy5TeW1ib2xgIGZvciB0aGUgbG9jYWwgYHRzLklkZW50aWZpZXJgIGZvciB0aGUgdHlwZS5cbiAgLy8gSWYgdGhlIHR5cGUgaXMgYWN0dWFsbHkgbG9jYWxseSBkZWNsYXJlZCBvciBpcyBpbXBvcnRlZCBieSBuYW1lLCBmb3IgZXhhbXBsZTpcbiAgLy8gICBpbXBvcnQge0Zvb30gZnJvbSAnLi9mb28nO1xuICAvLyB0aGVuIGl0J2xsIGJlIHRoZSBzYW1lIGFzIGB0eXBlUmVmU3ltYm9sYC5cbiAgLy9cbiAgLy8gSWYgdGhlIHR5cGUgaXMgaW1wb3J0ZWQgdmlhIGEgbmFtZXNwYWNlIGltcG9ydCwgZm9yIGV4YW1wbGU6XG4gIC8vICAgaW1wb3J0ICogYXMgZm9vIGZyb20gJy4vZm9vJztcbiAgLy8gYW5kIHRoZW4gcmVmZXJlbmNlZCBhczpcbiAgLy8gICBjb25zdHJ1Y3RvcihmOiBmb28uRm9vKVxuICAvLyB0aGVuIGBsb2NhbGAgd2lsbCBiZSB0aGUgYHRzLlN5bWJvbGAgb2YgYGZvb2AsIHdoZXJlYXMgYHR5cGVSZWZTeW1ib2xgIHdpbGwgYmUgdGhlIGB0cy5TeW1ib2xgXG4gIC8vIG9mIGBmb28uRm9vYC4gVGhpcyBhbGxvd3MgdHJhY2tpbmcgb2YgdGhlIGltcG9ydCBiZWhpbmQgd2hhdGV2ZXIgdHlwZSByZWZlcmVuY2UgZXhpc3RzLlxuICBsZXQgbG9jYWwgPSB0eXBlUmVmU3ltYm9sO1xuXG4gIC8vIERlc3RydWN0dXJlIGEgbmFtZSBsaWtlIGBmb28uWC5ZLlpgIGFzIGZvbGxvd3M6XG4gIC8vIC0gaW4gYGxlZnRNb3N0YCwgdGhlIGB0cy5JZGVudGlmaWVyYCBvZiB0aGUgbGVmdC1tb3N0IG5hbWUgKGBmb29gKSBpbiB0aGUgcXVhbGlmaWVkIG5hbWUuXG4gIC8vICAgVGhpcyBpZGVudGlmaWVyIGlzIHVzZWQgdG8gcmVzb2x2ZSB0aGUgYHRzLlN5bWJvbGAgZm9yIGBsb2NhbGAuXG4gIC8vIC0gaW4gYHN5bWJvbE5hbWVzYCwgYWxsIG5hbWVzIGludm9sdmVkIGluIHRoZSBxdWFsaWZpZWQgcGF0aCwgb3IgYSBzaW5nbGUgc3ltYm9sIG5hbWUgaWYgdGhlXG4gIC8vICAgdHlwZSBpcyBub3QgcXVhbGlmaWVkLlxuICBsZXQgbGVmdE1vc3QgPSB0eXBlTmFtZTtcbiAgY29uc3Qgc3ltYm9sTmFtZXM6IHN0cmluZ1tdID0gW107XG4gIHdoaWxlICh0cy5pc1F1YWxpZmllZE5hbWUobGVmdE1vc3QpKSB7XG4gICAgc3ltYm9sTmFtZXMudW5zaGlmdChsZWZ0TW9zdC5yaWdodC50ZXh0KTtcbiAgICBsZWZ0TW9zdCA9IGxlZnRNb3N0LmxlZnQ7XG4gIH1cbiAgc3ltYm9sTmFtZXMudW5zaGlmdChsZWZ0TW9zdC50ZXh0KTtcblxuICBpZiAobGVmdE1vc3QgIT09IHR5cGVOYW1lKSB7XG4gICAgY29uc3QgbG9jYWxUbXAgPSBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24obGVmdE1vc3QpO1xuICAgIGlmIChsb2NhbFRtcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsb2NhbCA9IGxvY2FsVG1wO1xuICAgIH1cbiAgfVxuXG4gIC8vIERlLWFsaWFzIHRoZSB0b3AtbGV2ZWwgdHlwZSByZWZlcmVuY2Ugc3ltYm9sIHRvIGdldCB0aGUgc3ltYm9sIG9mIHRoZSBhY3R1YWwgZGVjbGFyYXRpb24uXG4gIGxldCBkZWNsID0gdHlwZVJlZlN5bWJvbDtcbiAgaWYgKHR5cGVSZWZTeW1ib2wuZmxhZ3MgJiB0cy5TeW1ib2xGbGFncy5BbGlhcykge1xuICAgIGRlY2wgPSBjaGVja2VyLmdldEFsaWFzZWRTeW1ib2wodHlwZVJlZlN5bWJvbCk7XG4gIH1cbiAgcmV0dXJuIHtsb2NhbCwgZGVjbCwgc3ltYm9sTmFtZXN9O1xufVxuXG5mdW5jdGlvbiBlbnRpdHlOYW1lVG9WYWx1ZShub2RlOiB0cy5FbnRpdHlOYW1lKTogdHMuRXhwcmVzc2lvbnxudWxsIHtcbiAgaWYgKHRzLmlzUXVhbGlmaWVkTmFtZShub2RlKSkge1xuICAgIGNvbnN0IGxlZnQgPSBlbnRpdHlOYW1lVG9WYWx1ZShub2RlLmxlZnQpO1xuICAgIHJldHVybiBsZWZ0ICE9PSBudWxsID8gdHMuY3JlYXRlUHJvcGVydHlBY2Nlc3MobGVmdCwgbm9kZS5yaWdodCkgOiBudWxsO1xuICB9IGVsc2UgaWYgKHRzLmlzSWRlbnRpZmllcihub2RlKSkge1xuICAgIHJldHVybiB0cy5nZXRNdXRhYmxlQ2xvbmUobm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdE1vZHVsZU5hbWUobm9kZTogdHMuSW1wb3J0RGVjbGFyYXRpb24pOiBzdHJpbmcge1xuICBpZiAoIXRzLmlzU3RyaW5nTGl0ZXJhbChub2RlLm1vZHVsZVNwZWNpZmllcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhIG1vZHVsZSBzcGVjaWZpZXInKTtcbiAgfVxuICByZXR1cm4gbm9kZS5tb2R1bGVTcGVjaWZpZXIudGV4dDtcbn1cbiJdfQ==
256
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZV90b192YWx1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2MvcmVmbGVjdGlvbi9zcmMvdHlwZV90b192YWx1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7O0lBRUgsK0JBQWlDO0lBSWpDOzs7Ozs7T0FNRztJQUNILFNBQWdCLFdBQVcsQ0FDdkIsUUFBMEIsRUFBRSxPQUF1QjtRQUNyRCx5RkFBeUY7UUFDekYsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQ3JCLE9BQU8sV0FBVyxFQUFFLENBQUM7U0FDdEI7UUFFRCxJQUFJLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3JDLE9BQU8sZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsSUFBTSxPQUFPLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtZQUNwQixPQUFPLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ25DO1FBRU0sSUFBQSxLQUFLLEdBQVUsT0FBTyxNQUFqQixFQUFFLElBQUksR0FBSSxPQUFPLEtBQVgsQ0FBWTtRQUM5Qix3RkFBd0Y7UUFDeEYsOENBQThDO1FBQzlDLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRTtZQUN2QyxPQUFPLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0Q7UUFFRCxrRkFBa0Y7UUFDbEYsc0ZBQXNGO1FBRXRGLGtGQUFrRjtRQUNsRixvRkFBb0Y7UUFDcEYsSUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFD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TCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVELFNBQVMsaUJBQWlCLENBQUMsSUFBMEI7UUFDbkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1lBQzdDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUMzQztRQUNELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7SUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHtUeXBlVmFsdWVSZWZlcmVuY2UsIFR5cGVWYWx1ZVJlZmVyZW5jZUtpbmQsIFVuYXZhaWxhYmxlVHlwZVZhbHVlUmVmZXJlbmNlLCBWYWx1ZVVuYXZhaWxhYmxlS2luZH0gZnJvbSAnLi9ob3N0JztcblxuLyoqXG4gKiBQb3RlbnRpYWxseSBjb252ZXJ0IGEgYHRzLlR5cGVOb2RlYCB0byBhIGBUeXBlVmFsdWVSZWZlcmVuY2VgLCB3aGljaCBpbmRpY2F0ZXMgaG93IHRvIHVzZSB0aGVcbiAqIHR5cGUgZ2l2ZW4gaW4gdGhlIGB0cy5UeXBlTm9kZWAgaW4gYSB2YWx1ZSBwb3NpdGlvbi5cbiAqXG4gKiBUaGlzIGNhbiByZXR1cm4gYG51bGxgIGlmIHRoZSBgdHlwZU5vZGVgIGlzIGBudWxsYCwgaWYgaXQgZG9lcyBub3QgcmVmZXIgdG8gYSBzeW1ib2wgd2l0aCBhIHZhbHVlXG4gKiBkZWNsYXJhdGlvbiwgb3IgaWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHN0YXRpY2FsbHkgdW5kZXJzdGFuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVUb1ZhbHVlKFxuICAgIHR5cGVOb2RlOiB0cy5UeXBlTm9kZXxudWxsLCBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcik6IFR5cGVWYWx1ZVJlZmVyZW5jZSB7XG4gIC8vIEl0J3Mgbm90IHBvc3NpYmxlIHRvIGdldCBhIHZhbHVlIGV4cHJlc3Npb24gaWYgdGhlIHBhcmFtZXRlciBkb2Vzbid0IGV2ZW4gaGF2ZSBhIHR5cGUuXG4gIGlmICh0eXBlTm9kZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBtaXNzaW5nVHlwZSgpO1xuICB9XG5cbiAgaWYgKCF0cy5pc1R5cGVSZWZlcmVuY2VOb2RlKHR5cGVOb2RlKSkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFR5cGUodHlwZU5vZGUpO1xuICB9XG5cbiAgY29uc3Qgc3ltYm9scyA9IHJlc29sdmVUeXBlU3ltYm9scyh0eXBlTm9kZSwgY2hlY2tlcik7XG4gIGlmIChzeW1ib2xzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVua25vd25SZWZlcmVuY2UodHlwZU5vZGUpO1xuICB9XG5cbiAgY29uc3Qge2xvY2FsLCBkZWNsfSA9IHN5bWJvbHM7XG4gIC8vIEl0J3Mgb25seSB2YWxpZCB0byBjb252ZXJ0IGEgdHlwZSByZWZlcmVuY2UgdG8gYSB2YWx1ZSByZWZlcmVuY2UgaWYgdGhlIHR5cGUgYWN0dWFsbHlcbiAgLy8gaGFzIGEgdmFsdWUgZGVjbGFyYXRpb24gYXNzb2NpYXRlZCB3aXRoIGl0LlxuICBpZiAoZGVjbC52YWx1ZURlY2xhcmF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbm9WYWx1ZURlY2xhcmF0aW9uKHR5cGVOb2RlLCBkZWNsLmRlY2xhcmF0aW9uc1swXSk7XG4gIH1cblxuICAvLyBUaGUgdHlwZSBwb2ludHMgdG8gYSB2YWxpZCB2YWx1ZSBkZWNsYXJhdGlvbi4gUmV3cml0ZSB0aGUgVHlwZVJlZmVyZW5jZSBpbnRvIGFuXG4gIC8vIEV4cHJlc3Npb24gd2hpY2ggcmVmZXJlbmNlcyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSB0aGUgVHlwZVJlZmVyZW5jZSwgaWYgcG9zc2libGUuXG5cbiAgLy8gTG9vayBhdCB0aGUgbG9jYWwgYHRzLlN5bWJvbGAncyBkZWNsYXJhdGlvbnMgYW5kIHNlZSBpZiBpdCBjb21lcyBmcm9tIGFuIGltcG9ydFxuICAvLyBzdGF0ZW1lbnQuIElmIHNvLCBleHRyYWN0IHRoZSBtb2R1bGUgc3BlY2lmaWVyIGFuZCB0aGUgbmFtZSBvZiB0aGUgaW1wb3J0ZWQgdHlwZS5cbiAgY29uc3QgZmlyc3REZWNsID0gbG9jYWwuZGVjbGFyYXRpb25zICYmIGxvY2FsLmRlY2xhcmF0aW9uc1swXTtcbiAgaWYgKGZpcnN0RGVjbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRzLmlzSW1wb3J0Q2xhdXNlKGZpcnN0RGVjbCkgJiYgZmlyc3REZWNsLm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVGhpcyBpcyBhIGRlZmF1bHQgaW1wb3J0LlxuICAgICAgLy8gICBpbXBvcnQgRm9vIGZyb20gJ2Zvbyc7XG5cbiAgICAgIGlmIChmaXJzdERlY2wuaXNUeXBlT25seSkge1xuICAgICAgICAvLyBUeXBlLW9ubHkgaW1wb3J0cyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgdmFsdWUuXG4gICAgICAgIHJldHVybiB0eXBlT25seUltcG9ydCh0eXBlTm9kZSwgZmlyc3REZWNsKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogVHlwZVZhbHVlUmVmZXJlbmNlS2luZC5MT0NBTCxcbiAgICAgICAgLy8gQ29weWluZyB0aGUgbmFtZSBoZXJlIGVuc3VyZXMgdGhlIGdlbmVyYXRlZCByZWZlcmVuY2VzIHdpbGwgYmUgY29ycmVjdGx5IHRyYW5zZm9ybWVkXG4gICAgICAgIC8vIGFsb25nIHdpdGggdGhlIGltcG9ydC5cbiAgICAgICAgZXhwcmVzc2lvbjogdHMudXBkYXRlSWRlbnRpZmllcihmaXJzdERlY2wubmFtZSksXG4gICAgICAgIGRlZmF1bHRJbXBvcnRTdGF0ZW1lbnQ6IGZpcnN0RGVjbC5wYXJlbnQsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodHMuaXNJbXBvcnRTcGVjaWZpZXIoZmlyc3REZWNsKSkge1xuICAgICAgLy8gVGhlIHN5bWJvbCB3YXMgaW1wb3J0ZWQgYnkgbmFtZVxuICAgICAgLy8gICBpbXBvcnQge0Zvb30gZnJvbSAnZm9vJztcbiAgICAgIC8vIG9yXG4gICAgICAvLyAgIGltcG9ydCB7Rm9vIGFzIEJhcn0gZnJvbSAnZm9vJztcblxuICAgICAgaWYgKGZpcnN0RGVjbC5wYXJlbnQucGFyZW50LmlzVHlwZU9ubHkpIHtcbiAgICAgICAgLy8gVHlwZS1vbmx5IGltcG9ydHMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGFzIHZhbHVlLlxuICAgICAgICByZXR1cm4gdHlwZU9ubHlJbXBvcnQodHlwZU5vZGUsIGZpcnN0RGVjbC5wYXJlbnQucGFyZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBuYW1lIHRvIGltcG9ydCAoYEZvb2ApIGZyb20gdGhlIGltcG9ydCBzcGVjaWZpZXIsIGFzIHRoZSBzeW1ib2wgbmFtZXMgb2ZcbiAgICAgIC8vIHRoZSBpbXBvcnRlZCB0eXBlIGNvdWxkIHJlZmVyIHRvIGEgbG9jYWwgYWxpYXMgKGxpa2UgYEJhcmAgaW4gdGhlIGV4YW1wbGUgYWJvdmUpLlxuICAgICAgY29uc3QgaW1wb3J0ZWROYW1lID0gKGZpcnN0RGVjbC5wcm9wZXJ0eU5hbWUgfHwgZmlyc3REZWNsLm5hbWUpLnRleHQ7XG5cbiAgICAgIC8vIFRoZSBmaXJzdCBzeW1ib2wgbmFtZSByZWZlcnMgdG8gdGhlIGxvY2FsIG5hbWUsIHdoaWNoIGlzIHJlcGxhY2VkIGJ5IGBpbXBvcnRlZE5hbWVgIGFib3ZlLlxuICAgICAgLy8gQW55IHJlbWFpbmluZyBzeW1ib2wgbmFtZXMgbWFrZSB1cCB0aGUgY29tcGxldGUgcGF0aCB0byB0aGUgdmFsdWUuXG4gICAgICBjb25zdCBbX2xvY2FsTmFtZSwgLi4ubmVzdGVkUGF0aF0gPSBzeW1ib2xzLnN5bWJvbE5hbWVzO1xuXG4gICAgICBjb25zdCBtb2R1bGVOYW1lID0gZXh0cmFjdE1vZHVsZU5hbWUoZmlyc3REZWNsLnBhcmVudC5wYXJlbnQucGFyZW50KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IFR5cGVWYWx1ZVJlZmVyZW5jZUtpbmQuSU1QT1JURUQsXG4gICAgICAgIHZhbHVlRGVjbGFyYXRpb246IGRlY2wudmFsdWVEZWNsYXJhdGlvbixcbiAgICAgICAgbW9kdWxlTmFtZSxcbiAgICAgICAgaW1wb3J0ZWROYW1lLFxuICAgICAgICBuZXN0ZWRQYXRoXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodHMuaXNOYW1lc3BhY2VJbXBvcnQoZmlyc3REZWNsKSkge1xuICAgICAgLy8gVGhlIGltcG9ydCBpcyBhIG5hbWVzcGFjZSBpbXBvcnRcbiAgICAgIC8vICAgaW1wb3J0ICogYXMgRm9vIGZyb20gJ2Zvbyc7XG5cbiAgICAgIGlmIChmaXJzdERlY2wucGFyZW50LmlzVHlwZU9ubHkpIHtcbiAgICAgICAgLy8gVHlwZS1vbmx5IGltcG9ydHMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGFzIHZhbHVlLlxuICAgICAgICByZXR1cm4gdHlwZU9ubHlJbXBvcnQodHlwZU5vZGUsIGZpcnN0RGVjbC5wYXJlbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3ltYm9scy5zeW1ib2xOYW1lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gVGhlIHR5cGUgcmVmZXJzIHRvIHRoZSBuYW1lc3BhY2UgaXRzZWxmLCB3aGljaCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgYSB2YWx1ZS5cbiAgICAgICAgcmV0dXJuIG5hbWVzcGFjZUltcG9ydCh0eXBlTm9kZSwgZmlyc3REZWNsLnBhcmVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBmaXJzdCBzeW1ib2wgbmFtZSByZWZlcnMgdG8gdGhlIGxvY2FsIG5hbWUgb2YgdGhlIG5hbWVzcGFjZSwgd2hpY2ggaXMgaXMgZGlzY2FyZGVkXG4gICAgICAvLyBhcyBhIG5ldyBuYW1lc3BhY2UgaW1wb3J0IHdpbGwgYmUgZ2VuZXJhdGVkLiBUaGlzIGlzIGZvbGxvd2VkIGJ5IHRoZSBzeW1ib2wgbmFtZSB0aGF0IG5lZWRzXG4gICAgICAvLyB0byBiZSBpbXBvcnRlZCBhbmQgYW55IHJlbWFpbmluZyBuYW1lcyB0aGF0IGNvbnN0aXR1dGUgdGhlIGNvbXBsZXRlIHBhdGggdG8gdGhlIHZhbHVlLlxuICAgICAgY29uc3QgW19ucywgaW1wb3J0ZWROYW1lLCAuLi5uZXN0ZWRQYXRoXSA9IHN5bWJvbHMuc3ltYm9sTmFtZXM7XG5cbiAgICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBleHRyYWN0TW9kdWxlTmFtZShmaXJzdERlY2wucGFyZW50LnBhcmVudCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBUeXBlVmFsdWVSZWZlcmVuY2VLaW5kLklNUE9SVEVELFxuICAgICAgICB2YWx1ZURlY2xhcmF0aW9uOiBkZWNsLnZhbHVlRGVjbGFyYXRpb24sXG4gICAgICAgIG1vZHVsZU5hbWUsXG4gICAgICAgIGltcG9ydGVkTmFtZSxcbiAgICAgICAgbmVzdGVkUGF0aFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBJZiB0aGUgdHlwZSBpcyBub3QgaW1wb3J0ZWQsIHRoZSB0eXBlIHJlZmVyZW5jZSBjYW4gYmUgY29udmVydGVkIGludG8gYW4gZXhwcmVzc2lvbiBhcyBpcy5cbiAgY29uc3QgZXhwcmVzc2lvbiA9IHR5cGVOb2RlVG9WYWx1ZUV4cHIodHlwZU5vZGUpO1xuICBpZiAoZXhwcmVzc2lvbiAhPT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiBUeXBlVmFsdWVSZWZlcmVuY2VLaW5kLkxPQ0FMLFxuICAgICAgZXhwcmVzc2lvbixcbiAgICAgIGRlZmF1bHRJbXBvcnRTdGF0ZW1lbnQ6IG51bGwsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRUeXBlKHR5cGVOb2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN1cHBvcnRlZFR5cGUodHlwZU5vZGU6IHRzLlR5cGVOb2RlKTogVW5hdmFpbGFibGVUeXBlVmFsdWVSZWZlcmVuY2Uge1xuICByZXR1cm4ge1xuICAgIGtpbmQ6IFR5cGVWYWx1ZVJlZmVyZW5jZUtpbmQuVU5BVkFJTEFCTEUsXG4gICAgcmVhc29uOiB7a2luZDogVmFsdWVVbmF2YWlsYWJsZUtpbmQuVU5TVVBQT1JURUQsIHR5cGVOb2RlfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9WYWx1ZURlY2xhcmF0aW9uKFxuICAgIHR5cGVOb2RlOiB0cy5UeXBlTm9kZSwgZGVjbDogdHMuRGVjbGFyYXRpb24pOiBVbmF2YWlsYWJsZVR5cGVWYWx1ZVJlZmVyZW5jZSB7XG4gIHJldHVybiB7XG4gICAga2luZDogVHlwZVZhbHVlUmVmZXJlbmNlS2luZC5VTkFWQUlMQUJMRSxcbiAgICByZWFzb246IHtraW5kOiBWYWx1ZVVuYXZhaWxhYmxlS2luZC5OT19WQUxVRV9ERUNMQVJBVElPTiwgdHlwZU5vZGUsIGRlY2x9LFxuICB9O1xufVxuXG5mdW5jdGlvbiB0eXBlT25seUltcG9ydChcbiAgICB0eXBlTm9kZTogdHMuVHlwZU5vZGUsIGltcG9ydENsYXVzZTogdHMuSW1wb3J0Q2xhdXNlKTogVW5hdmFpbGFibGVUeXBlVmFsdWVSZWZlcmVuY2Uge1xuICByZXR1cm4ge1xuICAgIGtpbmQ6IFR5cGVWYWx1ZVJlZmVyZW5jZUtpbmQuVU5BVkFJTEFCTEUsXG4gICAgcmVhc29uOiB7a2luZDogVmFsdWVVbmF2YWlsYWJsZUtpbmQuVFlQRV9PTkxZX0lNUE9SVCwgdHlwZU5vZGUsIGltcG9ydENsYXVzZX0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVua25vd25SZWZlcmVuY2UodHlwZU5vZGU6IHRzLlR5cGVOb2RlKTogVW5hdmFpbGFibGVUeXBlVmFsdWVSZWZlcmVuY2Uge1xuICByZXR1cm4ge1xuICAgIGtpbmQ6IFR5cGVWYWx1ZVJlZmVyZW5jZUtpbmQuVU5BVkFJTEFCTEUsXG4gICAgcmVhc29uOiB7a2luZDogVmFsdWVVbmF2YWlsYWJsZUtpbmQuVU5LTk9XTl9SRUZFUkVOQ0UsIHR5cGVOb2RlfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbmFtZXNwYWNlSW1wb3J0KFxuICAgIHR5cGVOb2RlOiB0cy5UeXBlTm9kZSwgaW1wb3J0Q2xhdXNlOiB0cy5JbXBvcnRDbGF1c2UpOiBVbmF2YWlsYWJsZVR5cGVWYWx1ZVJlZmVyZW5jZSB7XG4gIHJldHVybiB7XG4gICAga2luZDogVHlwZVZhbHVlUmVmZXJlbmNlS2luZC5VTkFWQUlMQUJMRSxcbiAgICByZWFzb246IHtraW5kOiBWYWx1ZVVuYXZhaWxhYmxlS2luZC5OQU1FU1BBQ0UsIHR5cGVOb2RlLCBpbXBvcnRDbGF1c2V9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBtaXNzaW5nVHlwZSgpOiBVbmF2YWlsYWJsZVR5cGVWYWx1ZVJlZmVyZW5jZSB7XG4gIHJldHVybiB7XG4gICAga2luZDogVHlwZVZhbHVlUmVmZXJlbmNlS2luZC5VTkFWQUlMQUJMRSxcbiAgICByZWFzb246IHtraW5kOiBWYWx1ZVVuYXZhaWxhYmxlS2luZC5NSVNTSU5HX1RZUEV9LFxuICB9O1xufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gZXh0cmFjdCBhIGB0cy5FeHByZXNzaW9uYCB0aGF0J3MgZXF1aXZhbGVudCB0byBhIGB0cy5UeXBlTm9kZWAsIGFzIHRoZSB0d28gaGF2ZVxuICogZGlmZmVyZW50IEFTVCBzaGFwZXMgYnV0IGNhbiByZWZlcmVuY2UgdGhlIHNhbWUgc3ltYm9scy5cbiAqXG4gKiBUaGlzIHdpbGwgcmV0dXJuIGBudWxsYCBpZiBhbiBlcXVpdmFsZW50IGV4cHJlc3Npb24gY2Fubm90IGJlIGNvbnN0cnVjdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZU5vZGVUb1ZhbHVlRXhwcihub2RlOiB0cy5UeXBlTm9kZSk6IHRzLkV4cHJlc3Npb258bnVsbCB7XG4gIGlmICh0cy5pc1R5cGVSZWZlcmVuY2VOb2RlKG5vZGUpKSB7XG4gICAgcmV0dXJuIGVudGl0eU5hbWVUb1ZhbHVlKG5vZGUudHlwZU5hbWUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGBUeXBlUmVmZXJlbmNlYCBub2RlIHRvIHRoZSBgdHMuU3ltYm9sYHMgZm9yIGJvdGggaXRzIGRlY2xhcmF0aW9uIGFuZCBpdHMgbG9jYWwgc291cmNlLlxuICpcbiAqIEluIHRoZSBldmVudCB0aGF0IHRoZSBgVHlwZVJlZmVyZW5jZWAgcmVmZXJzIHRvIGEgbG9jYWxseSBkZWNsYXJlZCBzeW1ib2wsIHRoZXNlIHdpbGwgYmUgdGhlXG4gKiBzYW1lLiBJZiB0aGUgYFR5cGVSZWZlcmVuY2VgIHJlZmVycyB0byBhbiBpbXBvcnRlZCBzeW1ib2wsIHRoZW4gYGRlY2xgIHdpbGwgYmUgdGhlIGZ1bGx5IHJlc29sdmVkXG4gKiBgdHMuU3ltYm9sYCBvZiB0aGUgcmVmZXJlbmNlZCBzeW1ib2wuIGBsb2NhbGAgd2lsbCBiZSB0aGUgYHRzLlN5bWJvbGAgb2YgdGhlIGB0cy5JZGVudGlmaWVyYFxuICogd2hpY2ggcG9pbnRzIHRvIHRoZSBpbXBvcnQgc3RhdGVtZW50IGJ5IHdoaWNoIHRoZSBzeW1ib2wgd2FzIGltcG9ydGVkLlxuICpcbiAqIEFsbCBzeW1ib2wgbmFtZXMgdGhhdCBtYWtlIHVwIHRoZSB0eXBlIHJlZmVyZW5jZSBhcmUgcmV0dXJuZWQgbGVmdC10by1yaWdodCBpbnRvIHRoZVxuICogYHN5bWJvbE5hbWVzYCBhcnJheSwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBpbmNsdWRlIGF0IGxlYXN0IG9uZSBlbnRyeS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVR5cGVTeW1ib2xzKHR5cGVSZWY6IHRzLlR5cGVSZWZlcmVuY2VOb2RlLCBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcik6XG4gICAge2xvY2FsOiB0cy5TeW1ib2wsIGRlY2w6IHRzLlN5bWJvbCwgc3ltYm9sTmFtZXM6IHN0cmluZ1tdfXxudWxsIHtcbiAgY29uc3QgdHlwZU5hbWUgPSB0eXBlUmVmLnR5cGVOYW1lO1xuICAvLyB0eXBlUmVmU3ltYm9sIGlzIHRoZSB0cy5TeW1ib2wgb2YgdGhlIGVudGlyZSB0eXBlIHJlZmVyZW5jZS5cbiAgY29uc3QgdHlwZVJlZlN5bWJvbDogdHMuU3ltYm9sfHVuZGVmaW5lZCA9IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbih0eXBlTmFtZSk7XG4gIGlmICh0eXBlUmVmU3ltYm9sID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIGBsb2NhbGAgaXMgdGhlIGB0cy5TeW1ib2xgIGZvciB0aGUgbG9jYWwgYHRzLklkZW50aWZpZXJgIGZvciB0aGUgdHlwZS5cbiAgLy8gSWYgdGhlIHR5cGUgaXMgYWN0dWFsbHkgbG9jYWxseSBkZWNsYXJlZCBvciBpcyBpbXBvcnRlZCBieSBuYW1lLCBmb3IgZXhhbXBsZTpcbiAgLy8gICBpbXBvcnQge0Zvb30gZnJvbSAnLi9mb28nO1xuICAvLyB0aGVuIGl0J2xsIGJlIHRoZSBzYW1lIGFzIGB0eXBlUmVmU3ltYm9sYC5cbiAgLy9cbiAgLy8gSWYgdGhlIHR5cGUgaXMgaW1wb3J0ZWQgdmlhIGEgbmFtZXNwYWNlIGltcG9ydCwgZm9yIGV4YW1wbGU6XG4gIC8vICAgaW1wb3J0ICogYXMgZm9vIGZyb20gJy4vZm9vJztcbiAgLy8gYW5kIHRoZW4gcmVmZXJlbmNlZCBhczpcbiAgLy8gICBjb25zdHJ1Y3RvcihmOiBmb28uRm9vKVxuICAvLyB0aGVuIGBsb2NhbGAgd2lsbCBiZSB0aGUgYHRzLlN5bWJvbGAgb2YgYGZvb2AsIHdoZXJlYXMgYHR5cGVSZWZTeW1ib2xgIHdpbGwgYmUgdGhlIGB0cy5TeW1ib2xgXG4gIC8vIG9mIGBmb28uRm9vYC4gVGhpcyBhbGxvd3MgdHJhY2tpbmcgb2YgdGhlIGltcG9ydCBiZWhpbmQgd2hhdGV2ZXIgdHlwZSByZWZlcmVuY2UgZXhpc3RzLlxuICBsZXQgbG9jYWwgPSB0eXBlUmVmU3ltYm9sO1xuXG4gIC8vIERlc3RydWN0dXJlIGEgbmFtZSBsaWtlIGBmb28uWC5ZLlpgIGFzIGZvbGxvd3M6XG4gIC8vIC0gaW4gYGxlZnRNb3N0YCwgdGhlIGB0cy5JZGVudGlmaWVyYCBvZiB0aGUgbGVmdC1tb3N0IG5hbWUgKGBmb29gKSBpbiB0aGUgcXVhbGlmaWVkIG5hbWUuXG4gIC8vICAgVGhpcyBpZGVudGlmaWVyIGlzIHVzZWQgdG8gcmVzb2x2ZSB0aGUgYHRzLlN5bWJvbGAgZm9yIGBsb2NhbGAuXG4gIC8vIC0gaW4gYHN5bWJvbE5hbWVzYCwgYWxsIG5hbWVzIGludm9sdmVkIGluIHRoZSBxdWFsaWZpZWQgcGF0aCwgb3IgYSBzaW5nbGUgc3ltYm9sIG5hbWUgaWYgdGhlXG4gIC8vICAgdHlwZSBpcyBub3QgcXVhbGlmaWVkLlxuICBsZXQgbGVmdE1vc3QgPSB0eXBlTmFtZTtcbiAgY29uc3Qgc3ltYm9sTmFtZXM6IHN0cmluZ1tdID0gW107XG4gIHdoaWxlICh0cy5pc1F1YWxpZmllZE5hbWUobGVmdE1vc3QpKSB7XG4gICAgc3ltYm9sTmFtZXMudW5zaGlmdChsZWZ0TW9zdC5yaWdodC50ZXh0KTtcbiAgICBsZWZ0TW9zdCA9IGxlZnRNb3N0LmxlZnQ7XG4gIH1cbiAgc3ltYm9sTmFtZXMudW5zaGlmdChsZWZ0TW9zdC50ZXh0KTtcblxuICBpZiAobGVmdE1vc3QgIT09IHR5cGVOYW1lKSB7XG4gICAgY29uc3QgbG9jYWxUbXAgPSBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24obGVmdE1vc3QpO1xuICAgIGlmIChsb2NhbFRtcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsb2NhbCA9IGxvY2FsVG1wO1xuICAgIH1cbiAgfVxuXG4gIC8vIERlLWFsaWFzIHRoZSB0b3AtbGV2ZWwgdHlwZSByZWZlcmVuY2Ugc3ltYm9sIHRvIGdldCB0aGUgc3ltYm9sIG9mIHRoZSBhY3R1YWwgZGVjbGFyYXRpb24uXG4gIGxldCBkZWNsID0gdHlwZVJlZlN5bWJvbDtcbiAgaWYgKHR5cGVSZWZTeW1ib2wuZmxhZ3MgJiB0cy5TeW1ib2xGbGFncy5BbGlhcykge1xuICAgIGRlY2wgPSBjaGVja2VyLmdldEFsaWFzZWRTeW1ib2wodHlwZVJlZlN5bWJvbCk7XG4gIH1cbiAgcmV0dXJuIHtsb2NhbCwgZGVjbCwgc3ltYm9sTmFtZXN9O1xufVxuXG5mdW5jdGlvbiBlbnRpdHlOYW1lVG9WYWx1ZShub2RlOiB0cy5FbnRpdHlOYW1lKTogdHMuRXhwcmVzc2lvbnxudWxsIHtcbiAgaWYgKHRzLmlzUXVhbGlmaWVkTmFtZShub2RlKSkge1xuICAgIGNvbnN0IGxlZnQgPSBlbnRpdHlOYW1lVG9WYWx1ZShub2RlLmxlZnQpO1xuICAgIHJldHVybiBsZWZ0ICE9PSBudWxsID8gdHMuY3JlYXRlUHJvcGVydHlBY2Nlc3MobGVmdCwgbm9kZS5yaWdodCkgOiBudWxsO1xuICB9IGVsc2UgaWYgKHRzLmlzSWRlbnRpZmllcihub2RlKSkge1xuICAgIHJldHVybiB0cy5nZXRNdXRhYmxlQ2xvbmUobm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdE1vZHVsZU5hbWUobm9kZTogdHMuSW1wb3J0RGVjbGFyYXRpb24pOiBzdHJpbmcge1xuICBpZiAoIXRzLmlzU3RyaW5nTGl0ZXJhbChub2RlLm1vZHVsZVNwZWNpZmllcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhIG1vZHVsZSBzcGVjaWZpZXInKTtcbiAgfVxuICByZXR1cm4gbm9kZS5tb2R1bGVTcGVjaWZpZXIudGV4dDtcbn1cbiJdfQ==