@angular/compiler-cli 11.1.0-next.4 → 11.1.1

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 (147) hide show
  1. package/linker/babel/src/ast/babel_ast_factory.d.ts +5 -0
  2. package/linker/babel/src/ast/babel_ast_factory.js +10 -5
  3. package/linker/babel/src/es2015_linker_plugin.d.ts +2 -2
  4. package/linker/babel/src/es2015_linker_plugin.js +26 -11
  5. package/linker/babel/src/linker_plugin_options.d.ts +21 -0
  6. package/linker/babel/src/linker_plugin_options.js +13 -0
  7. package/linker/src/file_linker/emit_scopes/emit_scope.d.ts +3 -3
  8. package/linker/src/file_linker/emit_scopes/emit_scope.js +6 -6
  9. package/linker/src/file_linker/emit_scopes/iife_emit_scope.d.ts +4 -0
  10. package/linker/src/file_linker/emit_scopes/iife_emit_scope.js +9 -8
  11. package/linker/src/file_linker/file_linker.d.ts +2 -3
  12. package/linker/src/file_linker/file_linker.js +6 -7
  13. package/linker/src/file_linker/get_source_file.d.ts +19 -0
  14. package/linker/src/file_linker/get_source_file.js +42 -0
  15. package/linker/src/file_linker/linker_environment.d.ts +8 -2
  16. package/linker/src/file_linker/linker_environment.js +11 -6
  17. package/linker/src/file_linker/linker_options.d.ts +5 -0
  18. package/linker/src/file_linker/linker_options.js +2 -1
  19. package/linker/src/file_linker/partial_linkers/partial_component_linker_1.d.ts +24 -10
  20. package/linker/src/file_linker/partial_linkers/partial_component_linker_1.js +138 -97
  21. package/linker/src/file_linker/partial_linkers/partial_directive_linker_1.d.ts +6 -2
  22. package/linker/src/file_linker/partial_linkers/partial_directive_linker_1.js +7 -4
  23. package/linker/src/file_linker/partial_linkers/partial_linker.d.ts +1 -1
  24. package/linker/src/file_linker/partial_linkers/partial_linker.js +1 -1
  25. package/linker/src/file_linker/partial_linkers/partial_linker_selector.d.ts +21 -18
  26. package/linker/src/file_linker/partial_linkers/partial_linker_selector.js +37 -31
  27. package/ngcc/src/analysis/decoration_analyzer.d.ts +3 -3
  28. package/ngcc/src/analysis/decoration_analyzer.js +3 -3
  29. package/ngcc/src/command_line_options.js +4 -3
  30. package/ngcc/src/dependencies/dependency_host.d.ts +3 -3
  31. package/ngcc/src/dependencies/dependency_host.js +1 -1
  32. package/ngcc/src/dependencies/dependency_resolver.d.ts +2 -2
  33. package/ngcc/src/dependencies/dependency_resolver.js +3 -4
  34. package/ngcc/src/dependencies/dts_dependency_host.d.ts +2 -2
  35. package/ngcc/src/dependencies/dts_dependency_host.js +1 -1
  36. package/ngcc/src/dependencies/esm_dependency_host.d.ts +2 -2
  37. package/ngcc/src/dependencies/esm_dependency_host.js +1 -1
  38. package/ngcc/src/dependencies/module_resolver.d.ts +2 -2
  39. package/ngcc/src/dependencies/module_resolver.js +15 -24
  40. package/ngcc/src/entry_point_finder/entry_point_collector.d.ts +2 -2
  41. package/ngcc/src/entry_point_finder/entry_point_collector.js +1 -1
  42. package/ngcc/src/entry_point_finder/program_based_entry_point_finder.d.ts +2 -2
  43. package/ngcc/src/entry_point_finder/program_based_entry_point_finder.js +2 -2
  44. package/ngcc/src/entry_point_finder/targeted_entry_point_finder.d.ts +11 -2
  45. package/ngcc/src/entry_point_finder/targeted_entry_point_finder.js +24 -20
  46. package/ngcc/src/entry_point_finder/tracing_entry_point_finder.d.ts +3 -3
  47. package/ngcc/src/entry_point_finder/tracing_entry_point_finder.js +1 -1
  48. package/ngcc/src/entry_point_finder/utils.d.ts +0 -9
  49. package/ngcc/src/entry_point_finder/utils.js +8 -9
  50. package/ngcc/src/execution/cluster/executor.d.ts +2 -2
  51. package/ngcc/src/execution/cluster/executor.js +1 -1
  52. package/ngcc/src/execution/cluster/master.d.ts +2 -2
  53. package/ngcc/src/execution/cluster/master.js +1 -1
  54. package/ngcc/src/execution/tasks/completion.d.ts +4 -4
  55. package/ngcc/src/execution/tasks/completion.js +4 -12
  56. package/ngcc/src/host/umd_host.js +2 -2
  57. package/ngcc/src/locking/lock_file.d.ts +2 -2
  58. package/ngcc/src/locking/lock_file.js +1 -1
  59. package/ngcc/src/main.js +6 -6
  60. package/ngcc/src/ngcc_options.js +2 -2
  61. package/ngcc/src/packages/build_marker.d.ts +1 -1
  62. package/ngcc/src/packages/build_marker.js +1 -1
  63. package/ngcc/src/packages/bundle_program.d.ts +3 -3
  64. package/ngcc/src/packages/bundle_program.js +6 -7
  65. package/ngcc/src/packages/configuration.d.ts +3 -3
  66. package/ngcc/src/packages/configuration.js +8 -9
  67. package/ngcc/src/packages/entry_point.d.ts +3 -3
  68. package/ngcc/src/packages/entry_point.js +13 -16
  69. package/ngcc/src/packages/entry_point_bundle.js +1 -1
  70. package/ngcc/src/packages/source_file_cache.d.ts +6 -6
  71. package/ngcc/src/packages/source_file_cache.js +1 -1
  72. package/ngcc/src/packages/transformer.d.ts +2 -2
  73. package/ngcc/src/packages/transformer.js +6 -6
  74. package/ngcc/src/path_mappings.d.ts +2 -2
  75. package/ngcc/src/path_mappings.js +4 -12
  76. package/ngcc/src/rendering/commonjs_rendering_formatter.d.ts +9 -1
  77. package/ngcc/src/rendering/commonjs_rendering_formatter.js +6 -13
  78. package/ngcc/src/rendering/dts_renderer.d.ts +2 -2
  79. package/ngcc/src/rendering/dts_renderer.js +1 -1
  80. package/ngcc/src/rendering/esm_rendering_formatter.d.ts +4 -3
  81. package/ngcc/src/rendering/esm_rendering_formatter.js +7 -5
  82. package/ngcc/src/rendering/renderer.d.ts +2 -2
  83. package/ngcc/src/rendering/renderer.js +1 -1
  84. package/ngcc/src/rendering/source_maps.d.ts +2 -2
  85. package/ngcc/src/rendering/source_maps.js +18 -19
  86. package/ngcc/src/rendering/umd_rendering_formatter.d.ts +9 -1
  87. package/ngcc/src/rendering/umd_rendering_formatter.js +6 -13
  88. package/ngcc/src/utils.d.ts +2 -2
  89. package/ngcc/src/utils.js +1 -1
  90. package/ngcc/src/writing/cleaning/package_cleaner.d.ts +2 -2
  91. package/ngcc/src/writing/cleaning/package_cleaner.js +1 -1
  92. package/ngcc/src/writing/cleaning/utils.d.ts +2 -2
  93. package/ngcc/src/writing/cleaning/utils.js +1 -1
  94. package/ngcc/src/writing/new_entry_point_file_writer.d.ts +14 -1
  95. package/ngcc/src/writing/new_entry_point_file_writer.js +54 -18
  96. package/package.json +2 -2
  97. package/src/ngtsc/annotations/src/component.d.ts +48 -10
  98. package/src/ngtsc/annotations/src/component.js +197 -116
  99. package/src/ngtsc/annotations/src/directive.js +18 -3
  100. package/src/ngtsc/core/api/src/public_options.d.ts +2 -2
  101. package/src/ngtsc/core/api/src/public_options.js +1 -1
  102. package/src/ngtsc/core/index.d.ts +1 -1
  103. package/src/ngtsc/core/index.js +5 -5
  104. package/src/ngtsc/core/src/compiler.d.ts +95 -12
  105. package/src/ngtsc/core/src/compiler.js +240 -81
  106. package/src/ngtsc/diagnostics/index.d.ts +1 -1
  107. package/src/ngtsc/diagnostics/index.js +4 -2
  108. package/src/ngtsc/diagnostics/src/error_code.d.ts +6 -1
  109. package/src/ngtsc/diagnostics/src/error_code.js +29 -2
  110. package/src/ngtsc/file_system/index.d.ts +1 -1
  111. package/src/ngtsc/file_system/index.js +1 -1
  112. package/src/ngtsc/file_system/src/node_js_file_system.d.ts +29 -19
  113. package/src/ngtsc/file_system/src/node_js_file_system.js +102 -80
  114. package/src/ngtsc/file_system/src/types.d.ts +34 -23
  115. package/src/ngtsc/file_system/src/types.js +1 -1
  116. package/src/ngtsc/incremental/src/strategy.d.ts +7 -0
  117. package/src/ngtsc/incremental/src/strategy.js +7 -1
  118. package/src/ngtsc/program.js +51 -20
  119. package/src/ngtsc/resource/src/loader.d.ts +4 -0
  120. package/src/ngtsc/resource/src/loader.js +7 -1
  121. package/src/ngtsc/sourcemaps/index.d.ts +3 -2
  122. package/src/ngtsc/sourcemaps/index.js +12 -3
  123. package/src/ngtsc/sourcemaps/src/content_origin.d.ts +34 -0
  124. package/src/ngtsc/sourcemaps/src/content_origin.js +48 -0
  125. package/src/ngtsc/sourcemaps/src/raw_source_map.d.ts +19 -1
  126. package/src/ngtsc/sourcemaps/src/raw_source_map.js +1 -8
  127. package/src/ngtsc/sourcemaps/src/segment_marker.d.ts +1 -1
  128. package/src/ngtsc/sourcemaps/src/segment_marker.js +1 -1
  129. package/src/ngtsc/sourcemaps/src/source_file.d.ts +7 -11
  130. package/src/ngtsc/sourcemaps/src/source_file.js +108 -32
  131. package/src/ngtsc/sourcemaps/src/source_file_loader.d.ts +36 -16
  132. package/src/ngtsc/sourcemaps/src/source_file_loader.js +72 -19
  133. package/src/ngtsc/transform/src/api.d.ts +5 -0
  134. package/src/ngtsc/transform/src/api.js +1 -1
  135. package/src/ngtsc/transform/src/compilation.d.ts +1 -0
  136. package/src/ngtsc/transform/src/compilation.js +40 -17
  137. package/src/ngtsc/tsc_plugin.js +26 -5
  138. package/src/ngtsc/typecheck/api/checker.d.ts +5 -0
  139. package/src/ngtsc/typecheck/api/checker.js +1 -1
  140. package/src/ngtsc/typecheck/src/checker.d.ts +1 -0
  141. package/src/ngtsc/typecheck/src/checker.js +17 -1
  142. package/src/ngtsc/typecheck/src/template_symbol_builder.js +104 -55
  143. package/src/perform_compile.d.ts +2 -2
  144. package/src/perform_compile.js +1 -1
  145. package/src/transformers/downlevel_decorators_transform.js +7 -8
  146. package/src/transformers/patch_alias_reference_resolution.js +25 -13
  147. package/src/version.js +1 -1
@@ -329,7 +329,12 @@
329
329
  */
330
330
  function getDownlevelDecoratorsTransform(typeChecker, host, diagnostics, isCore, isClosureCompilerEnabled, skipClassDecorators) {
331
331
  return function (context) {
332
- var referencedParameterTypes = new Set();
332
+ // Ensure that referenced type symbols are not elided by TypeScript. Imports for
333
+ // such parameter type symbols previously could be type-only, but now might be also
334
+ // used in the `ctorParameters` static property as a value. We want to make sure
335
+ // that TypeScript does not elide imports for such type references. Read more
336
+ // about this in the description for `loadIsReferencedAliasDeclarationPatch`.
337
+ var referencedParameterTypes = patch_alias_reference_resolution_1.loadIsReferencedAliasDeclarationPatch(context);
333
338
  /**
334
339
  * Converts an EntityName (from a type annotation) to an expression (accessing a value).
335
340
  *
@@ -601,12 +606,6 @@
601
606
  return ts.visitEachChild(node, decoratorDownlevelVisitor, context);
602
607
  }
603
608
  return function (sf) {
604
- // Ensure that referenced type symbols are not elided by TypeScript. Imports for
605
- // such parameter type symbols previously could be type-only, but now might be also
606
- // used in the `ctorParameters` static property as a value. We want to make sure
607
- // that TypeScript does not elide imports for such type references. Read more
608
- // about this in the description for `patchAliasReferenceResolution`.
609
- patch_alias_reference_resolution_1.patchAliasReferenceResolutionOrDie(context, referencedParameterTypes);
610
609
  // Downlevel decorators and constructor parameter types. We will keep track of all
611
610
  // referenced constructor parameter types so that we can instruct TypeScript to
612
611
  // not elide their imports if they previously were only type-only.
@@ -616,4 +615,4 @@
616
615
  }
617
616
  exports.getDownlevelDecoratorsTransform = getDownlevelDecoratorsTransform;
618
617
  });
619
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxldmVsX2RlY29yYXRvcnNfdHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXItY2xpL3NyYy90cmFuc2Zvcm1lcnMvZG93bmxldmVsX2RlY29yYXRvcnNfdHJhbnNmb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRzs7Ozs7Ozs7Ozs7Ozs7SUFFSCwrQkFBaUM7SUFFakMsNEhBQWdIO0lBRWhIOzs7T0FHRztJQUNILFNBQVMsa0JBQWtCLENBQUMsU0FBb0IsRUFBRSxNQUFlO1FBQy9ELE9BQU8sTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQW9CRTtJQUVGOzs7T0FHRztJQUNILFNBQVMsNkJBQTZCO1FBQ3BDLElBQU0sWUFBWSxHQUFxQixFQUFFLENBQUM7UUFDMUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQ3hDLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUM1QixFQUFFLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDeEYsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQ3hDLFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUM5RCxFQUFFLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxTQUFTLENB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LEVBQUUsU0FBUyxDQUFDLGNBQWMsRUFBRSxTQUFTLENBQUMsZUFBZSxFQUN4RixPQUFPLENBQUMsQ0FBQztZQUNmLENBQUM7WUFFRDs7OztlQUlHO1lBQ0gsU0FBUyx5QkFBeUIsQ0FBQyxJQUFhO2dCQUM5QyxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDL0IsT0FBTyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDeEM7Z0JBQ0QsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSx5QkFBeUIsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBRUQsT0FBTyxVQUFDLEVBQWlCO2dCQUN2QixnRkFBZ0Y7Z0JBQ2hGLG1GQUFtRjtnQkFDbkYsZ0ZBQWdGO2dCQUNoRiw2RUFBNkU7Z0JBQzdFLHFFQUFxRTtnQkFDckUscUVBQWtDLENBQUMsT0FBTyxFQUFFLHdCQUF3QixDQUFDLENBQUM7Z0JBQ3RFLGtGQUFrRjtnQkFDbEYsK0VBQStFO2dCQUMvRSxrRUFBa0U7Z0JBQ2xFLE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUseUJBQXlCLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDbkUsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQXpRRCwwRUF5UUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQge0RlY29yYXRvciwgUmVmbGVjdGlvbkhvc3R9IGZyb20gJy4uL25ndHNjL3JlZmxlY3Rpb24nO1xuaW1wb3J0IHtpc0FsaWFzSW1wb3J0RGVjbGFyYXRpb24sIHBhdGNoQWxpYXNSZWZlcmVuY2VSZXNvbHV0aW9uT3JEaWV9IGZyb20gJy4vcGF0Y2hfYWxpYXNfcmVmZXJlbmNlX3Jlc29sdXRpb24nO1xuXG4vKipcbiAqIFdoZXRoZXIgYSBnaXZlbiBkZWNvcmF0b3Igc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYW4gQW5ndWxhciBkZWNvcmF0b3IuXG4gKiBFaXRoZXIgaXQncyB1c2VkIGluIEBhbmd1bGFyL2NvcmUsIG9yIGl0J3MgaW1wb3J0ZWQgZnJvbSB0aGVyZS5cbiAqL1xuZnVuY3Rpb24gaXNBbmd1bGFyRGVjb3JhdG9yKGRlY29yYXRvcjogRGVjb3JhdG9yLCBpc0NvcmU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzQ29yZSB8fCAoZGVjb3JhdG9yLmltcG9ydCAhPT0gbnVsbCAmJiBkZWNvcmF0b3IuaW1wb3J0LmZyb20gPT09ICdAYW5ndWxhci9jb3JlJyk7XG59XG5cbi8qXG4gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4gIENvZGUgYmVsb3cgaGFzIGJlZW4gZXh0cmFjdGVkIGZyb20gdGhlIHRzaWNrbGUgZGVjb3JhdG9yIGRvd25sZXZlbCB0cmFuc2Zvcm1lclxuICBhbmQgYSBmZXcgbG9jYWwgbW9kaWZpY2F0aW9ucyBoYXZlIGJlZW4gYXBwbGllZDpcblxuICAgIDEuIFRzaWNrbGUgYnkgZGVmYXVsdCBwcm9jZXNzZWQgYWxsIGRlY29yYXRvcnMgdGhhdCBoYWQgdGhlIGBAQW5ub3RhdGlvbmAgSlNEb2MuXG4gICAgICAgV2UgbW9kaWZpZWQgdGhlIHRyYW5zZm9ybSB0byBvbmx5IGJlIGNvbmNlcm5lZCB3aXRoIGtub3duIEFuZ3VsYXIgZGVjb3JhdG9ycy5cbiAgICAyLiBUc2lja2xlIGJ5IGRlZmF1bHQgYWRkZWQgYEBub2NvbGxhcHNlYCB0byBhbGwgZ2VuZXJhdGVkIGBjdG9yUGFyYW1ldGVyc2AgcHJvcGVydGllcy5cbiAgICAgICBXZSBvbmx5IGRvIHRoaXMgd2hlbiBgYW5ub3RhdGVGb3JDbG9zdXJlQ29tcGlsZXJgIGlzIGVuYWJsZWQuXG4gICAgMy4gVHNpY2tsZSBkb2VzIG5vdCBoYW5kbGUgdW5pb24gdHlwZXMgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLiBpLmUuIGlmIGEgaW5qZWN0ZWQgdHlwZVxuICAgICAgIGlzIGRlbm90ZWQgd2l0aCBgQE9wdGlvbmFsYCwgdGhlIGFjdHVhbCB0eXBlIGNvdWxkIGJlIHNldCB0byBgVCB8IG51bGxgLlxuICAgICAgIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci1jbGkvY29tbWl0LzgyNjgwM2QwNzM2YjgwNzg2N2NhZmY5Zjg5MDNlNTA4OTcwYWQ1ZTQuXG4gICAgNC4gVHNpY2tsZSByZWxpZWQgb24gYGVtaXREZWNvcmF0b3JNZXRhZGF0YWAgdG8gYmUgc2V0IHRvIGB0cnVlYC4gVGhpcyBpcyBkdWUgdG8gYSBsaW1pdGF0aW9uXG4gICAgICAgaW4gVHlwZVNjcmlwdCB0cmFuc2Zvcm1lcnMgdGhhdCBuZXZlciBoYXMgYmVlbiBmaXhlZC4gV2Ugd2VyZSBhYmxlIHRvIHdvcmsgYXJvdW5kIHRoaXNcbiAgICAgICBsaW1pdGF0aW9uIHNvIHRoYXQgYGVtaXREZWNvcmF0b3JNZXRhZGF0YWAgZG9lc24ndCBuZWVkIHRvIGJlIHNwZWNpZmllZC5cbiAgICAgICBTZWU6IGBwYXRjaEFsaWFzUmVmZXJlbmNlUmVzb2x1dGlvbmAgZm9yIG1vcmUgZGV0YWlscy5cblxuICBIZXJlIGlzIGEgbGluayB0byB0aGUgdHNpY2tsZSByZXZpc2lvbiBvbiB3aGljaCB0aGlzIHRyYW5zZm9ybWVyIGlzIGJhc2VkOlxuICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci90c2lja2xlL2Jsb2IvZmFlMDZiZWNiMTU3MGY0OTE4MDYwNjBkODNmMjlmMmQ1MGM0M2NkZC9zcmMvZGVjb3JhdG9yX2Rvd25sZXZlbF90cmFuc2Zvcm1lci50c1xuICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuKi9cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBBU1QgZm9yIHRoZSBkZWNvcmF0b3IgZmllbGQgdHlwZSBhbm5vdGF0aW9uLCB3aGljaCBoYXMgdGhlIGZvcm1cbiAqICAgICB7IHR5cGU6IEZ1bmN0aW9uLCBhcmdzPzogYW55W10gfVtdXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURlY29yYXRvckludm9jYXRpb25UeXBlKCk6IHRzLlR5cGVOb2RlIHtcbiAgY29uc3QgdHlwZUVsZW1lbnRzOiB0cy5UeXBlRWxlbWVudFtdID0gW107XG4gIHR5cGVFbGVtZW50cy5wdXNoKHRzLmNyZWF0ZVByb3BlcnR5U2lnbmF0dXJlKFxuICAgICAgdW5kZWZpbmVkLCAndHlwZScsIHVuZGVmaW5lZCxcbiAgICAgIHRzLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKHRzLmNyZWF0ZUlkZW50aWZpZXIoJ0Z1bmN0aW9uJyksIHVuZGVmaW5lZCksIHVuZGVmaW5lZCkpO1xuICB0eXBlRWxlbWVudHMucHVzaCh0cy5jcmVhdGVQcm9wZXJ0eVNpZ25hdHVyZShcbiAgICAgIHVuZGVmaW5lZCwgJ2FyZ3MnLCB0cy5jcmVhdGVUb2tlbih0cy5TeW50YXhLaW5kLlF1ZXN0aW9uVG9rZW4pLFxuICAgICAgdHMuY3JlYXRlQXJyYXlUeXBlTm9kZSh0cy5jcmVhdGVLZXl3b3JkVHlwZU5vZGUodHMuU3ludGF4S2luZC5BbnlLZXl3b3JkKSksIHVuZGVmaW5lZCkpO1xuICByZXR1cm4gdHMuY3JlYXRlQXJyYXlUeXBlTm9kZSh0cy5jcmVhdGVUeXBlTGl0ZXJhbE5vZGUodHlwZUVsZW1lbnRzKSk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIHR5cGUgb2YgdGhlIGRlY29yYXRvciAodGhlIGZ1bmN0aW9uIG9yIGV4cHJlc3Npb24gaW52b2tlZCksIGFzIHdlbGwgYXMgYWxsIHRoZVxuICogYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZGVjb3JhdG9yLiBSZXR1cm5zIGFuIEFTVCB3aXRoIHRoZSBmb3JtOlxuICpcbiAqICAgICAvLyBGb3IgQGRlY29yYXRvcihhcmcxLCBhcmcyKVxuICogICAgIHsgdHlwZTogZGVjb3JhdG9yLCBhcmdzOiBbYXJnMSwgYXJnMl0gfVxuICovXG5mdW5jdGlvbiBleHRyYWN0TWV0YWRhdGFGcm9tU2luZ2xlRGVjb3JhdG9yKFxuICAgIGRlY29yYXRvcjogdHMuRGVjb3JhdG9yLCBkaWFnbm9zdGljczogdHMuRGlhZ25vc3RpY1tdKTogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24ge1xuICBjb25zdCBtZXRhZGF0YVByb3BlcnRpZXM6IHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZVtdID0gW107XG4gIGNvbnN0IGV4cHIgPSBkZWNvcmF0b3IuZXhwcmVzc2lvbjtcbiAgc3dpdGNoIChleHByLmtpbmQpIHtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuSWRlbnRpZmllcjpcbiAgICAgIC8vIFRoZSBkZWNvcmF0b3Igd2FzIGEgcGxhaW4gQEZvby5cbiAgICAgIG1ldGFkYXRhUHJvcGVydGllcy5wdXNoKHRzLmNyZWF0ZVByb3BlcnR5QXNzaWdubWVudCgndHlwZScsIGV4cHIpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbjpcbiAgICAgIC8vIFRoZSBkZWNvcmF0b3Igd2FzIGEgY2FsbCwgbGlrZSBARm9vKGJhcikuXG4gICAgICBjb25zdCBjYWxsID0gZXhwciBhcyB0cy5DYWxsRXhwcmVzc2lvbjtcbiAgICAgIG1ldGFkYXRhUHJvcGVydGllcy5wdXNoKHRzLmNyZWF0ZVByb3BlcnR5QXNzaWdubWVudCgndHlwZScsIGNhbGwuZXhwcmVzc2lvbikpO1xuICAgICAgaWYgKGNhbGwuYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBhcmdzOiB0cy5FeHByZXNzaW9uW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgY2FsbC5hcmd1bWVudHMpIHtcbiAgICAgICAgICBhcmdzLnB1c2goYXJnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcmdzQXJyYXlMaXRlcmFsID0gdHMuY3JlYXRlQXJyYXlMaXRlcmFsKGFyZ3MpO1xuICAgICAgICBhcmdzQXJyYXlMaXRlcmFsLmVsZW1lbnRzLmhhc1RyYWlsaW5nQ29tbWEgPSB0cnVlO1xuICAgICAgICBtZXRhZGF0YVByb3BlcnRpZXMucHVzaCh0cy5jcmVhdGVQcm9wZXJ0eUFzc2lnbm1lbnQoJ2FyZ3MnLCBhcmdzQXJyYXlMaXRlcmFsKSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgIGZpbGU6IGRlY29yYXRvci5nZXRTb3VyY2VGaWxlKCksXG4gICAgICAgIHN0YXJ0OiBkZWNvcmF0b3IuZ2V0U3RhcnQoKSxcbiAgICAgICAgbGVuZ3RoOiBkZWNvcmF0b3IuZ2V0RW5kKCkgLSBkZWNvcmF0b3IuZ2V0U3RhcnQoKSxcbiAgICAgICAgbWVzc2FnZVRleHQ6XG4gICAgICAgICAgICBgJHt0cy5TeW50YXhLaW5kW2RlY29yYXRvci5raW5kXX0gbm90IGltcGxlbWVudGVkIGluIGdhdGhlcmluZyBkZWNvcmF0b3IgbWV0YWRhdGEuYCxcbiAgICAgICAgY2F0ZWdvcnk6IHRzLkRpYWdub3N0aWNDYXRlZ29yeS5FcnJvcixcbiAgICAgICAgY29kZTogMCxcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHRzLmNyZWF0ZU9iamVjdExpdGVyYWwobWV0YWRhdGFQcm9wZXJ0aWVzKTtcbn1cblxuLyoqXG4gKiBUYWtlcyBhIGxpc3Qgb2YgZGVjb3JhdG9yIG1ldGFkYXRhIG9iamVjdCBBU1RzIGFuZCBwcm9kdWNlcyBhbiBBU1QgZm9yIGFcbiAqIHN0YXRpYyBjbGFzcyBwcm9wZXJ0eSBvZiBhbiBhcnJheSBvZiB0aG9zZSBtZXRhZGF0YSBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVEZWNvcmF0b3JDbGFzc1Byb3BlcnR5KGRlY29yYXRvckxpc3Q6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uW10pIHtcbiAgY29uc3QgbW9kaWZpZXIgPSB0cy5jcmVhdGVUb2tlbih0cy5TeW50YXhLaW5kLlN0YXRpY0tleXdvcmQpO1xuICBjb25zdCB0eXBlID0gY3JlYXRlRGVjb3JhdG9ySW52b2NhdGlvblR5cGUoKTtcbiAgY29uc3QgaW5pdGlhbGl6ZXIgPSB0cy5jcmVhdGVBcnJheUxpdGVyYWwoZGVjb3JhdG9yTGlzdCwgdHJ1ZSk7XG4gIC8vIE5COiB0aGUgLmRlY29yYXRvcnMgcHJvcGVydHkgZG9lcyBub3QgZ2V0IGEgQG5vY29sbGFwc2UgcHJvcGVydHkuIFRoZXJlIGlzXG4gIC8vIG5vIGdvb2QgcmVhc29uIHdoeSAtIGl0IG1lYW5zIC5kZWNvcmF0b3JzIGlzIG5vdCBydW50aW1lIGFjY2Vzc2libGUgaWYgeW91XG4gIC8vIGNvbXBpbGUgd2l0aCBjb2xsYXBzZSBwcm9wZXJ0aWVzLCB3aGVyZWFzIHByb3BEZWNvcmF0b3JzIGlzLCB3aGljaCBkb2Vzbid0XG4gIC8vIGZvbGxvdyBhbnkgc3RyaW5nZW50IGxvZ2ljLiBIb3dldmVyIHRoaXMgaGFzIGJlZW4gdGhlIGNhc2UgcHJldmlvdXNseSwgYW5kXG4gIC8vIGFkZGluZyBpdCBiYWNrIGluIGxlYWRzIHRvIHN1YnN0YW50aWFsIGNvZGUgc2l6ZSBpbmNyZWFzZXMgYXMgQ2xvc3VyZSBmYWlsc1xuICAvLyB0byB0cmVlIHNoYWtlIHRoZXNlIHByb3BzIHdpdGhvdXQgQG5vY29sbGFwc2UuXG4gIHJldHVybiB0cy5jcmVhdGVQcm9wZXJ0eSh1bmRlZmluZWQsIFttb2RpZmllcl0sICdkZWNvcmF0b3JzJywgdW5kZWZpbmVkLCB0eXBlLCBpbml0aWFsaXplcik7XG59XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgQVNUIGZvciB0aGUgJ2N0b3JQYXJhbWV0ZXJzJyBmaWVsZCB0eXBlIGFubm90YXRpb246XG4gKiAgICgpID0+ICh7IHR5cGU6IGFueSwgZGVjb3JhdG9ycz86IHt0eXBlOiBGdW5jdGlvbiwgYXJncz86IGFueVtdfVtdIH18bnVsbClbXVxuICovXG5mdW5jdGlvbiBjcmVhdGVDdG9yUGFyYW1ldGVyc0NsYXNzUHJvcGVydHlUeXBlKCk6IHRzLlR5cGVOb2RlIHtcbiAgLy8gU29ycnkgYWJvdXQgdGhpcy4gVHJ5IHJlYWRpbmcganVzdCB0aGUgc3RyaW5nIGxpdGVyYWxzIGJlbG93LlxuICBjb25zdCB0eXBlRWxlbWVudHM6IHRzLlR5cGVFbGVtZW50W10gPSBbXTtcbiAgdHlwZUVsZW1lbnRzLnB1c2godHMuY3JlYXRlUHJvcGVydHlTaWduYXR1cmUoXG4gICAgICB1bmRlZmluZWQsICd0eXBlJywgdW5kZWZpbmVkLFxuICAgICAgdHMuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUodHMuY3JlYXRlSWRlbnRpZmllcignYW55JyksIHVuZGVmaW5lZCksIHVuZGVmaW5lZCkpO1xuICB0eXBlRWxlbWVudHMucHVzaCh0cy5jcmVhdGVQcm9wZXJ0eVNpZ25hdHVyZShcbiAgICAgIHVuZGVmaW5lZCwgJ2RlY29yYXRvcnMnLCB0cy5jcmVhdGVUb2tlbih0cy5TeW50YXhLaW5kLlF1ZXN0aW9uVG9rZW4pLFxuICAgICAgdHMuY3JlYXRlQXJyYXlUeXBlTm9kZSh0cy5jcmVhdGVUeXBlTGl0ZXJhbE5vZGUoW1xuICAgICAgICB0cy5jcmVhdGVQcm9wZXJ0eVNpZ25hdHVyZShcbiAgICAgICAgICAgIHVuZGVmaW5lZCwgJ3R5cGUnLCB1bmRlZmluZWQsXG4gICAgICAgICAgICB0cy5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZSh0cy5jcmVhdGVJZGVudGlmaWVyKCdGdW5jdGlvbicpLCB1bmRlZmluZWQpLCB1bmRlZmluZWQpLFxuICAgICAgICB0cy5jcmVhdGVQcm9wZXJ0eVNpZ25hdHVyZShcbiAgICAgICAgICAgIHVuZGVmaW5lZCwgJ2FyZ3MnLCB0cy5jcmVhdGVUb2tlbih0cy5TeW50YXhLaW5kLlF1ZXN0aW9uVG9rZW4pLFxuICAgICAgICAgICAgdHMuY3JlYXRlQXJyYXlUeXBlTm9kZShcbiAgICAgICAgICAgICAgICB0cy5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZSh0cy5jcmVhdGVJZGVudGlmaWVyKCdhbnknKSwgdW5kZWZpbmVkKSksXG4gICAgICAgICAgICB1bmRlZmluZWQpLFxuICAgICAgXSkpLFxuICAgICAgdW5kZWZpbmVkKSk7XG5cbiAgcmV0dXJuIHRzLmNyZWF0ZUZ1bmN0aW9uVHlwZU5vZGUodW5kZWZpbmVkLCBbXSwgdHMuY3JlYXRlQXJyYXlUeXBlTm9kZSh0cy5jcmVhdGVVbmlvblR5cGVOb2RlKFtcbiAgICB0cy5jcmVhdGVUeXBlTGl0ZXJhbE5vZGUodHlwZUVsZW1lbnRzKSxcbiAgICB0cy5jcmVhdGVMaXRlcmFsVHlwZU5vZGUodHMuY3JlYXRlTnVsbCgpKSxcbiAgXSkpKTtcbn1cblxuLyoqXG4gKiBTZXRzIGEgQ2xvc3VyZSBcXEBub2NvbGxhcHNlIHN5bnRoZXRpYyBjb21tZW50IG9uIHRoZSBnaXZlbiBub2RlLiBUaGlzIHByZXZlbnRzIENsb3N1cmUgQ29tcGlsZXJcbiAqIGZyb20gY29sbGFwc2luZyB0aGUgYXBwYXJlbnRseSBzdGF0aWMgcHJvcGVydHksIHdoaWNoIHdvdWxkIG1ha2UgaXQgaW1wb3NzaWJsZSB0byBmaW5kIGZvciBjb2RlXG4gKiB0cnlpbmcgdG8gZGV0ZWN0IGl0IGF0IHJ1bnRpbWUuXG4gKi9cbmZ1bmN0aW9uIGFkZE5vQ29sbGFwc2VDb21tZW50KG46IHRzLk5vZGUpIHtcbiAgdHMuc2V0U3ludGhldGljTGVhZGluZ0NvbW1lbnRzKG4sIFt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6IHRzLlN5bnRheEtpbmQuTXVsdGlMaW5lQ29tbWVudFRyaXZpYSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyogQG5vY29sbGFwc2UgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zOiAtMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiAtMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzVHJhaWxpbmdOZXdMaW5lOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSk7XG59XG5cbi8qKlxuICogY3JlYXRlQ3RvclBhcmFtZXRlcnNDbGFzc1Byb3BlcnR5IGNyZWF0ZXMgYSBzdGF0aWMgJ2N0b3JQYXJhbWV0ZXJzJyBwcm9wZXJ0eSBjb250YWluaW5nXG4gKiBkb3dubGV2ZWxlZCBkZWNvcmF0b3IgaW5mb3JtYXRpb24uXG4gKlxuICogVGhlIHByb3BlcnR5IGNvbnRhaW5zIGFuIGFycm93IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3QgbGl0ZXJhbHMgb2YgdGhlIHNoYXBlOlxuICogICAgIHN0YXRpYyBjdG9yUGFyYW1ldGVycyA9ICgpID0+IFt7XG4gKiAgICAgICB0eXBlOiBTb21lQ2xhc3N8dW5kZWZpbmVkLCAgLy8gdGhlIHR5cGUgb2YgdGhlIHBhcmFtIHRoYXQncyBkZWNvcmF0ZWQsIGlmIGl0J3MgYSB2YWx1ZS5cbiAqICAgICAgIGRlY29yYXRvcnM6IFt7XG4gKiAgICAgICAgIHR5cGU6IERlY29yYXRvckZuLCAgLy8gdGhlIHR5cGUgb2YgdGhlIGRlY29yYXRvciB0aGF0J3MgaW52b2tlZC5cbiAqICAgICAgICAgYXJnczogW0FSR1NdLCAgICAgICAvLyB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZGVjb3JhdG9yLlxuICogICAgICAgfV1cbiAqICAgICB9XTtcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ3RvclBhcmFtZXRlcnNDbGFzc1Byb3BlcnR5KFxuICAgIGRpYWdub3N0aWNzOiB0cy5EaWFnbm9zdGljW10sXG4gICAgZW50aXR5TmFtZVRvRXhwcmVzc2lvbjogKG46IHRzLkVudGl0eU5hbWUpID0+IHRzLkV4cHJlc3Npb24gfCB1bmRlZmluZWQsXG4gICAgY3RvclBhcmFtZXRlcnM6IFBhcmFtZXRlckRlY29yYXRpb25JbmZvW10sXG4gICAgaXNDbG9zdXJlQ29tcGlsZXJFbmFibGVkOiBib29sZWFuKTogdHMuUHJvcGVydHlEZWNsYXJhdGlvbiB7XG4gIGNvbnN0IHBhcmFtczogdHMuRXhwcmVzc2lvbltdID0gW107XG5cbiAgZm9yIChjb25zdCBjdG9yUGFyYW0gb2YgY3RvclBhcmFtZXRlcnMpIHtcbiAgICBpZiAoIWN0b3JQYXJhbS50eXBlICYmIGN0b3JQYXJhbS5kZWNvcmF0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcGFyYW1zLnB1c2godHMuY3JlYXRlTnVsbCgpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtVHlwZSA9IGN0b3JQYXJhbS50eXBlID9cbiAgICAgICAgdHlwZVJlZmVyZW5jZVRvRXhwcmVzc2lvbihlbnRpdHlOYW1lVG9FeHByZXNzaW9uLCBjdG9yUGFyYW0udHlwZSkgOlxuICAgICAgICB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWVtYmVycyA9XG4gICAgICAgIFt0cy5jcmVhdGVQcm9wZXJ0eUFzc2lnbm1lbnQoJ3R5cGUnLCBwYXJhbVR5cGUgfHwgdHMuY3JlYXRlSWRlbnRpZmllcigndW5kZWZpbmVkJykpXTtcblxuICAgIGNvbnN0IGRlY29yYXRvcnM6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGRlY28gb2YgY3RvclBhcmFtLmRlY29yYXRvcnMpIHtcbiAgICAgIGRlY29yYXRvcnMucHVzaChleHRyYWN0TWV0YWRhdGFGcm9tU2luZ2xlRGVjb3JhdG9yKGRlY28sIGRpYWdub3N0aWNzKSk7XG4gICAgfVxuICAgIGlmIChkZWNvcmF0b3JzLmxlbmd0aCkge1xuICAgICAgbWVtYmVycy5wdXNoKHRzLmNyZWF0ZVByb3BlcnR5QXNzaWdubWVudCgnZGVjb3JhdG9ycycsIHRzLmNyZWF0ZUFycmF5TGl0ZXJhbChkZWNvcmF0b3JzKSkpO1xuICAgIH1cbiAgICBwYXJhbXMucHVzaCh0cy5jcmVhdGVPYmplY3RMaXRlcmFsKG1lbWJlcnMpKTtcbiAgfVxuXG4gIGNvbnN0IGluaXRpYWxpemVyID0gdHMuY3JlYXRlQXJyb3dGdW5jdGlvbihcbiAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBbXSwgdW5kZWZpbmVkLCB0cy5jcmVhdGVUb2tlbih0cy5TeW50YXhLaW5kLkVxdWFsc0dyZWF0ZXJUaGFuVG9rZW4pLFxuICAgICAgdHMuY3JlYXRlQXJyYXlMaXRlcmFsKHBhcmFtcywgdHJ1ZSkpO1xuICBjb25zdCB0eXBlID0gY3JlYXRlQ3RvclBhcmFtZXRlcnNDbGFzc1Byb3BlcnR5VHlwZSgpO1xuICBjb25zdCBjdG9yUHJvcCA9IHRzLmNyZWF0ZVByb3BlcnR5KFxuICAgICAgdW5kZWZpbmVkLCBbdHMuY3JlYXRlVG9rZW4odHMuU3ludGF4S2luZC5TdGF0aWNLZXl3b3JkKV0sICdjdG9yUGFyYW1ldGVycycsIHVuZGVmaW5lZCwgdHlwZSxcbiAgICAgIGluaXRpYWxpemVyKTtcbiAgaWYgKGlzQ2xvc3VyZUNvbXBpbGVyRW5hYmxlZCkge1xuICAgIGFkZE5vQ29sbGFwc2VDb21tZW50KGN0b3JQcm9wKTtcbiAgfVxuICByZXR1cm4gY3RvclByb3A7XG59XG5cbi8qKlxuICogY3JlYXRlUHJvcERlY29yYXRvcnNDbGFzc1Byb3BlcnR5IGNyZWF0ZXMgYSBzdGF0aWMgJ3Byb3BEZWNvcmF0b3JzJyBwcm9wZXJ0eSBjb250YWluaW5nIHR5cGVcbiAqIGluZm9ybWF0aW9uIGZvciBldmVyeSBwcm9wZXJ0eSB0aGF0IGhhcyBhIGRlY29yYXRvciBhcHBsaWVkLlxuICpcbiAqICAgICBzdGF0aWMgcHJvcERlY29yYXRvcnM6IHtba2V5OiBzdHJpbmddOiB7dHlwZTogRnVuY3Rpb24sIGFyZ3M/OiBhbnlbXX1bXX0gPSB7XG4gKiAgICAgICBwcm9wQTogW3t0eXBlOiBNeURlY29yYXRvciwgYXJnczogWzEsIDJdfSwgLi4uXSxcbiAqICAgICAgIC4uLlxuICogICAgIH07XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb3BEZWNvcmF0b3JzQ2xhc3NQcm9wZXJ0eShcbiAgICBkaWFnbm9zdGljczogdHMuRGlhZ25vc3RpY1tdLCBwcm9wZXJ0aWVzOiBNYXA8c3RyaW5nLCB0cy5EZWNvcmF0b3JbXT4pOiB0cy5Qcm9wZXJ0eURlY2xhcmF0aW9uIHtcbiAgLy8gIGBzdGF0aWMgcHJvcERlY29yYXRvcnM6IHtba2V5OiBzdHJpbmddOiBgICsge3R5cGU6IEZ1bmN0aW9uLCBhcmdzPzogYW55W119W10gKyBgfSA9IHtcXG5gKTtcbiAgY29uc3QgZW50cmllczogdHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlW10gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgZGVjb3JhdG9yc10gb2YgcHJvcGVydGllcy5lbnRyaWVzKCkpIHtcbiAgICBlbnRyaWVzLnB1c2godHMuY3JlYXRlUHJvcGVydHlBc3NpZ25tZW50KFxuICAgICAgICBuYW1lLFxuICAgICAgICB0cy5jcmVhdGVBcnJheUxpdGVyYWwoXG4gICAgICAgICAgICBkZWNvcmF0b3JzLm1hcChkZWNvID0+IGV4dHJhY3RNZXRhZGF0YUZyb21TaW5nbGVEZWNvcmF0b3IoZGVjbywgZGlhZ25vc3RpY3MpKSkpKTtcbiAgfVxuICBjb25zdCBpbml0aWFsaXplciA9IHRzLmNyZWF0ZU9iamVjdExpdGVyYWwoZW50cmllcywgdHJ1ZSk7XG4gIGNvbnN0IHR5cGUgPSB0cy5jcmVhdGVUeXBlTGl0ZXJhbE5vZGUoW3RzLmNyZWF0ZUluZGV4U2lnbmF0dXJlKFxuICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFt0cy5jcmVhdGVQYXJhbWV0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsICdrZXknLCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKCdzdHJpbmcnLCB1bmRlZmluZWQpLCB1bmRlZmluZWQpXSxcbiAgICAgIGNyZWF0ZURlY29yYXRvckludm9jYXRpb25UeXBlKCkpXSk7XG4gIHJldHVybiB0cy5jcmVhdGVQcm9wZXJ0eShcbiAgICAgIHVuZGVmaW5lZCwgW3RzLmNyZWF0ZVRva2VuKHRzLlN5bnRheEtpbmQuU3RhdGljS2V5d29yZCldLCAncHJvcERlY29yYXRvcnMnLCB1bmRlZmluZWQsIHR5cGUsXG4gICAgICBpbml0aWFsaXplcik7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgKHBvdGVudGlhbGx5KSB2YWx1ZSBwYXJ0IGZvciB0aGUgZ2l2ZW4gbm9kZS5cbiAqXG4gKiBUaGlzIGlzIGEgcGFydGlhbCByZS1pbXBsZW1lbnRhdGlvbiBvZiBUeXBlU2NyaXB0J3Mgc2VyaWFsaXplVHlwZVJlZmVyZW5jZU5vZGUuIFRoaXMgaXMgYVxuICogd29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xNzUxNiAoc2VyaWFsaXplVHlwZVJlZmVyZW5jZU5vZGVcbiAqIG5vdCBiZWluZyBleHBvc2VkKS4gSW4gcHJhY3RpY2UgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBzdWZmaWNpZW50IGZvciBBbmd1bGFyJ3MgdXNlIG9mIHR5cGVcbiAqIG1ldGFkYXRhLlxuICovXG5mdW5jdGlvbiB0eXBlUmVmZXJlbmNlVG9FeHByZXNzaW9uKFxuICAgIGVudGl0eU5hbWVUb0V4cHJlc3Npb246IChuOiB0cy5FbnRpdHlOYW1lKSA9PiB0cy5FeHByZXNzaW9uIHwgdW5kZWZpbmVkLFxuICAgIG5vZGU6IHRzLlR5cGVOb2RlKTogdHMuRXhwcmVzc2lvbnx1bmRlZmluZWQge1xuICBsZXQga2luZCA9IG5vZGUua2luZDtcbiAgaWYgKHRzLmlzTGl0ZXJhbFR5cGVOb2RlKG5vZGUpKSB7XG4gICAgLy8gVHJlYXQgbGl0ZXJhbCB0eXBlcyBsaWtlIHRoZWlyIGJhc2UgdHlwZSAoYm9vbGVhbiwgc3RyaW5nLCBudW1iZXIpLlxuICAgIGtpbmQgPSBub2RlLmxpdGVyYWwua2luZDtcbiAgfVxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuRnVuY3Rpb25UeXBlOlxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5Db25zdHJ1Y3RvclR5cGU6XG4gICAgICByZXR1cm4gdHMuY3JlYXRlSWRlbnRpZmllcignRnVuY3Rpb24nKTtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuQXJyYXlUeXBlOlxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5UdXBsZVR5cGU6XG4gICAgICByZXR1cm4gdHMuY3JlYXRlSWRlbnRpZmllcignQXJyYXknKTtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVHlwZVByZWRpY2F0ZTpcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVHJ1ZUtleXdvcmQ6XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkZhbHNlS2V5d29yZDpcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuQm9vbGVhbktleXdvcmQ6XG4gICAgICByZXR1cm4gdHMuY3JlYXRlSWRlbnRpZmllcignQm9vbGVhbicpO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5TdHJpbmdMaXRlcmFsOlxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5TdHJpbmdLZXl3b3JkOlxuICAgICAgcmV0dXJuIHRzLmNyZWF0ZUlkZW50aWZpZXIoJ1N0cmluZycpO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5PYmplY3RLZXl3b3JkOlxuICAgICAgcmV0dXJuIHRzLmNyZWF0ZUlkZW50aWZpZXIoJ09iamVjdCcpO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5OdW1iZXJLZXl3b3JkOlxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5OdW1lcmljTGl0ZXJhbDpcbiAgICAgIHJldHVybiB0cy5jcmVhdGVJZGVudGlmaWVyKCdOdW1iZXInKTtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVHlwZVJlZmVyZW5jZTpcbiAgICAgIGNvbnN0IHR5cGVSZWYgPSBub2RlIGFzIHRzLlR5cGVSZWZlcmVuY2VOb2RlO1xuICAgICAgLy8gSWdub3JlIGFueSBnZW5lcmljIHR5cGVzLCBqdXN0IHJldHVybiB0aGUgYmFzZSB0eXBlLlxuICAgICAgcmV0dXJuIGVudGl0eU5hbWVUb0V4cHJlc3Npb24odHlwZVJlZi50eXBlTmFtZSk7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlVuaW9uVHlwZTpcbiAgICAgIGNvbnN0IGNoaWxkVHlwZU5vZGVzID1cbiAgICAgICAgICAobm9kZSBhcyB0cy5VbmlvblR5cGVOb2RlKVxuICAgICAgICAgICAgICAudHlwZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgdCA9PiAhKHRzLmlzTGl0ZXJhbFR5cGVOb2RlKHQpICYmIHQubGl0ZXJhbC5raW5kID09PSB0cy5TeW50YXhLaW5kLk51bGxLZXl3b3JkKSk7XG4gICAgICByZXR1cm4gY2hpbGRUeXBlTm9kZXMubGVuZ3RoID09PSAxID9cbiAgICAgICAgICB0eXBlUmVmZXJlbmNlVG9FeHByZXNzaW9uKGVudGl0eU5hbWVUb0V4cHJlc3Npb24sIGNoaWxkVHlwZU5vZGVzWzBdKSA6XG4gICAgICAgICAgdW5kZWZpbmVkO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBzeW1ib2wgcmVmZXJzIHRvIGEgdmFsdWUgdGhhdCBleGlzdHMgYXQgcnVudGltZSAoYXMgZGlzdGluY3QgZnJvbSBhIHR5cGUpLlxuICpcbiAqIEV4cGFuZHMgYWxpYXNlcywgd2hpY2ggaXMgaW1wb3J0YW50IGZvciB0aGUgY2FzZSB3aGVyZVxuICogICBpbXBvcnQgKiBhcyB4IGZyb20gJ3NvbWUtbW9kdWxlJztcbiAqIGFuZCB4IGlzIG5vdyBhIHZhbHVlICh0aGUgbW9kdWxlIG9iamVjdCkuXG4gKi9cbmZ1bmN0aW9uIHN5bWJvbElzUnVudGltZVZhbHVlKHR5cGVDaGVja2VyOiB0cy5UeXBlQ2hlY2tlciwgc3ltYm9sOiB0cy5TeW1ib2wpOiBib29sZWFuIHtcbiAgaWYgKHN5bWJvbC5mbGFncyAmIHRzLlN5bWJvbEZsYWdzLkFsaWFzKSB7XG4gICAgc3ltYm9sID0gdHlwZUNoZWNrZXIuZ2V0QWxpYXNlZFN5bWJvbChzeW1ib2wpO1xuICB9XG5cbiAgLy8gTm90ZSB0aGF0IGNvbnN0IGVudW1zIGFyZSBhIHNwZWNpYWwgY2FzZSwgYmVjYXVzZVxuICAvLyB3aGlsZSB0aGV5IGhhdmUgYSB2YWx1ZSwgdGhleSBkb24ndCBleGlzdCBhdCBydW50aW1lLlxuICByZXR1cm4gKHN5bWJvbC5mbGFncyAmIHRzLlN5bWJvbEZsYWdzLlZhbHVlICYgdHMuU3ltYm9sRmxhZ3MuQ29uc3RFbnVtRXhjbHVkZXMpICE9PSAwO1xufVxuXG4vKiogUGFyYW1ldGVyRGVjb3JhdGlvbkluZm8gZGVzY3JpYmVzIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBzaW5nbGUgY29uc3RydWN0b3IgcGFyYW1ldGVyLiAqL1xuaW50ZXJmYWNlIFBhcmFtZXRlckRlY29yYXRpb25JbmZvIHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIGRlY2xhcmF0aW9uIGZvciB0aGUgcGFyYW1ldGVyLiBPbmx5IHNldCBpZiB0aGUgdHlwZSBpcyBhIHZhbHVlIChlLmcuIGEgY2xhc3MsIG5vdCBhblxuICAgKiBpbnRlcmZhY2UpLlxuICAgKi9cbiAgdHlwZTogdHMuVHlwZU5vZGV8bnVsbDtcbiAgLyoqIFRoZSBsaXN0IG9mIGRlY29yYXRvcnMgZm91bmQgb24gdGhlIHBhcmFtZXRlciwgbnVsbCBpZiBub25lLiAqL1xuICBkZWNvcmF0b3JzOiB0cy5EZWNvcmF0b3JbXTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgdHJhbnNmb3JtZXIgZm9yIGRvd25sZXZlbGluZyBBbmd1bGFyIGRlY29yYXRvcnMuXG4gKiBAcGFyYW0gdHlwZUNoZWNrZXIgUmVmZXJlbmNlIHRvIHRoZSBwcm9ncmFtJ3MgdHlwZSBjaGVja2VyLlxuICogQHBhcmFtIGhvc3QgUmVmbGVjdGlvbiBob3N0IHRoYXQgaXMgdXNlZCBmb3IgZGV0ZXJtaW5pbmcgZGVjb3JhdG9ycy5cbiAqIEBwYXJhbSBkaWFnbm9zdGljcyBMaXN0IHdoaWNoIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggZGlhZ25vc3RpY3MgaWYgYW55LlxuICogQHBhcmFtIGlzQ29yZSBXaGV0aGVyIHRoZSBjdXJyZW50IFR5cGVTY3JpcHQgcHJvZ3JhbSBpcyBmb3IgdGhlIGBAYW5ndWxhci9jb3JlYCBwYWNrYWdlLlxuICogQHBhcmFtIGlzQ2xvc3VyZUNvbXBpbGVyRW5hYmxlZCBXaGV0aGVyIGNsb3N1cmUgYW5ub3RhdGlvbnMgbmVlZCB0byBiZSBhZGRlZCB3aGVyZSBuZWVkZWQuXG4gKiBAcGFyYW0gc2tpcENsYXNzRGVjb3JhdG9ycyBXaGV0aGVyIGNsYXNzIGRlY29yYXRvcnMgc2hvdWxkIGJlIHNraXBwZWQgZnJvbSBkb3dubGV2ZWxpbmcuXG4gKiAgIFRoaXMgaXMgdXNlZnVsIGZvciBKSVQgbW9kZSB3aGVyZSBjbGFzcyBkZWNvcmF0b3JzIHNob3VsZCBiZSBwcmVzZXJ2ZWQgYXMgdGhleSBjb3VsZCByZWx5XG4gKiAgIG9uIGltbWVkaWF0ZSBleGVjdXRpb24uIGUuZy4gZG93bmxldmVsaW5nIGBASW5qZWN0YWJsZWAgbWVhbnMgdGhhdCB0aGUgaW5qZWN0YWJsZSBmYWN0b3J5XG4gKiAgIGlzIG5vdCBjcmVhdGVkLCBhbmQgaW5qZWN0aW5nIHRoZSB0b2tlbiB3aWxsIG5vdCB3b3JrLiBJZiB0aGlzIGRlY29yYXRvciB3b3VsZCBub3QgYmVcbiAqICAgZG93bmxldmVsZWQsIHRoZSBgSW5qZWN0YWJsZWAgZGVjb3JhdG9yIHdpbGwgZXhlY3V0ZSBpbW1lZGlhdGVseSBvbiBmaWxlIGxvYWQsIGFuZFxuICogICBBbmd1bGFyIHdpbGwgZ2VuZXJhdGUgdGhlIGNvcnJlc3BvbmRpbmcgaW5qZWN0YWJsZSBmYWN0b3J5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG93bmxldmVsRGVjb3JhdG9yc1RyYW5zZm9ybShcbiAgICB0eXBlQ2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsIGhvc3Q6IFJlZmxlY3Rpb25Ib3N0LCBkaWFnbm9zdGljczogdHMuRGlhZ25vc3RpY1tdLFxuICAgIGlzQ29yZTogYm9vbGVhbiwgaXNDbG9zdXJlQ29tcGlsZXJFbmFibGVkOiBib29sZWFuLFxuICAgIHNraXBDbGFzc0RlY29yYXRvcnM6IGJvb2xlYW4pOiB0cy5UcmFuc2Zvcm1lckZhY3Rvcnk8dHMuU291cmNlRmlsZT4ge1xuICByZXR1cm4gKGNvbnRleHQ6IHRzLlRyYW5zZm9ybWF0aW9uQ29udGV4dCkgPT4ge1xuICAgIGxldCByZWZlcmVuY2VkUGFyYW1ldGVyVHlwZXMgPSBuZXcgU2V0PHRzLkRlY2xhcmF0aW9uPigpO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYW4gRW50aXR5TmFtZSAoZnJvbSBhIHR5cGUgYW5ub3RhdGlvbikgdG8gYW4gZXhwcmVzc2lvbiAoYWNjZXNzaW5nIGEgdmFsdWUpLlxuICAgICAqXG4gICAgICogRm9yIGEgZ2l2ZW4gcXVhbGlmaWVkIG5hbWUsIHRoaXMgd2Fsa3MgZGVwdGggZmlyc3QgdG8gZmluZCB0aGUgbGVmdG1vc3QgaWRlbnRpZmllcixcbiAgICAgKiBhbmQgdGhlbiBjb252ZXJ0cyB0aGUgcGF0aCBpbnRvIGEgcHJvcGVydHkgYWNjZXNzIHRoYXQgY2FuIGJlIHVzZWQgYXMgZXhwcmVzc2lvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlbnRpdHlOYW1lVG9FeHByZXNzaW9uKG5hbWU6IHRzLkVudGl0eU5hbWUpOiB0cy5FeHByZXNzaW9ufHVuZGVmaW5lZCB7XG4gICAgICBjb25zdCBzeW1ib2wgPSB0eXBlQ2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKG5hbWUpO1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBuYW1lIHJlZmVyZW5jZXMgYSBzeW1ib2wgdGhhdCBpcyBhbiBhY3R1YWwgdmFsdWUuIElmIGl0IGlzIG5vdCwgaXRcbiAgICAgIC8vIGNhbm5vdCBiZSByZWZlcmVuY2VkIGJ5IGFuIGV4cHJlc3Npb24sIHNvIHJldHVybiB1bmRlZmluZWQuXG4gICAgICBpZiAoIXN5bWJvbCB8fCAhc3ltYm9sSXNSdW50aW1lVmFsdWUodHlwZUNoZWNrZXIsIHN5bWJvbCkgfHwgIXN5bWJvbC5kZWNsYXJhdGlvbnMgfHxcbiAgICAgICAgICBzeW1ib2wuZGVjbGFyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgLy8gSWYgd2UgZGVhbCB3aXRoIGEgcXVhbGlmaWVkIG5hbWUsIGJ1aWxkIHVwIGEgcHJvcGVydHkgYWNjZXNzIGV4cHJlc3Npb25cbiAgICAgIC8vIHRoYXQgY291bGQgYmUgdXNlZCBpbiB0aGUgSmF2YVNjcmlwdCBvdXRwdXQuXG4gICAgICBpZiAodHMuaXNRdWFsaWZpZWROYW1lKG5hbWUpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckV4cHIgPSBlbnRpdHlOYW1lVG9FeHByZXNzaW9uKG5hbWUubGVmdCk7XG4gICAgICAgIGlmIChjb250YWluZXJFeHByID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cy5jcmVhdGVQcm9wZXJ0eUFjY2Vzcyhjb250YWluZXJFeHByLCBuYW1lLnJpZ2h0KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlY2wgPSBzeW1ib2wuZGVjbGFyYXRpb25zWzBdO1xuICAgICAgLy8gSWYgdGhlIGdpdmVuIGVudGl0eSBuYW1lIGhhcyBiZWVuIHJlc29sdmVkIHRvIGFuIGFsaWFzIGltcG9ydCBkZWNsYXJhdGlvbixcbiAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBhbGlhcyBkZWNsYXJhdGlvbiBpcyBub3QgZWxpZGVkIGJ5IFR5cGVTY3JpcHQsIGFuZCB1c2UgaXRzXG4gICAgICAvLyBuYW1lIGlkZW50aWZpZXIgdG8gcmVmZXJlbmNlIGl0IGF0IHJ1bnRpbWUuXG4gICAgICBpZiAoaXNBbGlhc0ltcG9ydERlY2xhcmF0aW9uKGRlY2wpKSB7XG4gICAgICAgIHJlZmVyZW5jZWRQYXJhbWV0ZXJUeXBlcy5hZGQoZGVjbCk7XG4gICAgICAgIC8vIElmIHRoZSBlbnRpdHkgbmFtZSByZXNvbHZlcyB0byBhbiBhbGlhcyBpbXBvcnQgZGVjbGFyYXRpb24sIHdlIHJlZmVyZW5jZSB0aGVcbiAgICAgICAgLy8gZW50aXR5IGJhc2VkIG9uIHRoZSBhbGlhcyBpbXBvcnQgbmFtZS4gVGhpcyBlbnN1cmVzIHRoYXQgVHlwZVNjcmlwdCBwcm9wZXJseVxuICAgICAgICAvLyByZXNvbHZlcyB0aGUgbGluayB0byB0aGUgaW1wb3J0LiBDbG9uaW5nIHRoZSBvcmlnaW5hbCBlbnRpdHkgbmFtZSBpZGVudGlmaWVyXG4gICAgICAgIC8vIGNvdWxkIGxlYWQgdG8gYW4gaW5jb3JyZWN0IHJlc29sdXRpb24gYXQgbG9jYWwgc2NvcGUuIGUuZy4gQ29uc2lkZXIgdGhlIGZvbGxvd2luZ1xuICAgICAgICAvLyBzbmlwcGV0OiBgY29uc3RydWN0b3IoRGVwOiBEZXApIHt9YC4gSW4gc3VjaCBhIGNhc2UsIHRoZSBsb2NhbCBgRGVwYCBpZGVudGlmaWVyXG4gICAgICAgIC8vIHdvdWxkIHJlc29sdmUgdG8gdGhlIGFjdHVhbCBwYXJhbWV0ZXIgbmFtZSwgYW5kIG5vdCB0byB0aGUgZGVzaXJlZCBpbXBvcnQuXG4gICAgICAgIC8vIFRoaXMgaGFwcGVucyBiZWNhdXNlIHRoZSBlbnRpdHkgbmFtZSBpZGVudGlmaWVyIHN5bWJvbCBpcyBpbnRlcm5hbGx5IGNvbnNpZGVyZWRcbiAgICAgICAgLy8gYXMgdHlwZS1vbmx5IGFuZCB0aGVyZWZvcmUgVHlwZVNjcmlwdCB0cmllcyB0byByZXNvbHZlIGl0IGFzIHZhbHVlIG1hbnVhbGx5LlxuICAgICAgICAvLyBXZSBjYW4gaGVscCBUeXBlU2NyaXB0IGFuZCBhdm9pZCB0aGlzIG5vbi1yZWxpYWJsZSByZXNvbHV0aW9uIGJ5IHVzaW5nIGFuIGlkZW50aWZpZXJcbiAgICAgICAgLy8gdGhhdCBpcyBub3QgdHlwZS1vbmx5IGFuZCBpcyBkaXJlY3RseSBsaW5rZWQgdG8gdGhlIGltcG9ydCBhbGlhcyBkZWNsYXJhdGlvbi5cbiAgICAgICAgaWYgKGRlY2wubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRzLmdldE11dGFibGVDbG9uZShkZWNsLm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDbG9uZSB0aGUgb3JpZ2luYWwgZW50aXR5IG5hbWUgaWRlbnRpZmllciBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZVxuICAgICAgLy8gaXRzIHZhbHVlIGF0IHJ1bnRpbWUuIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBpZGVudGlmaWVyIGlzIHJlc29sdmluZyB0byBhIGZpbGVcbiAgICAgIC8vIGxvY2FsIGRlY2xhcmF0aW9uIChvdGhlcndpc2UgaXQgd291bGQgcmVzb2x2ZSB0byBhbiBhbGlhcyBpbXBvcnQgZGVjbGFyYXRpb24pLlxuICAgICAgcmV0dXJuIHRzLmdldE11dGFibGVDbG9uZShuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm1zIGEgY2xhc3MgZWxlbWVudC4gUmV0dXJucyBhIHRocmVlIHR1cGxlIG9mIG5hbWUsIHRyYW5zZm9ybWVkIGVsZW1lbnQsIGFuZFxuICAgICAqIGRlY29yYXRvcnMgZm91bmQuIFJldHVybnMgYW4gdW5kZWZpbmVkIG5hbWUgaWYgdGhlcmUgYXJlIG5vIGRlY29yYXRvcnMgdG8gbG93ZXIgb24gdGhlXG4gICAgICogZWxlbWVudCwgb3IgdGhlIGVsZW1lbnQgaGFzIGFuIGV4b3RpYyBuYW1lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybUNsYXNzRWxlbWVudChlbGVtZW50OiB0cy5DbGFzc0VsZW1lbnQpOlxuICAgICAgICBbc3RyaW5nfHVuZGVmaW5lZCwgdHMuQ2xhc3NFbGVtZW50LCB0cy5EZWNvcmF0b3JbXV0ge1xuICAgICAgZWxlbWVudCA9IHRzLnZpc2l0RWFjaENoaWxkKGVsZW1lbnQsIGRlY29yYXRvckRvd25sZXZlbFZpc2l0b3IsIGNvbnRleHQpO1xuICAgICAgY29uc3QgZGVjb3JhdG9yc1RvS2VlcDogdHMuRGVjb3JhdG9yW10gPSBbXTtcbiAgICAgIGNvbnN0IHRvTG93ZXI6IHRzLkRlY29yYXRvcltdID0gW107XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gaG9zdC5nZXREZWNvcmF0b3JzT2ZEZWNsYXJhdGlvbihlbGVtZW50KSB8fCBbXTtcbiAgICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRlY29yYXRvcnMpIHtcbiAgICAgICAgLy8gV2Ugb25seSBkZWFsIHdpdGggY29uY3JldGUgbm9kZXMgaW4gVHlwZVNjcmlwdCBzb3VyY2VzLCBzbyB3ZSBkb24ndFxuICAgICAgICAvLyBuZWVkIHRvIGhhbmRsZSBzeW50aGV0aWNhbGx5IGNyZWF0ZWQgZGVjb3JhdG9ycy5cbiAgICAgICAgY29uc3QgZGVjb3JhdG9yTm9kZSA9IGRlY29yYXRvci5ub2RlISBhcyB0cy5EZWNvcmF0b3I7XG4gICAgICAgIGlmICghaXNBbmd1bGFyRGVjb3JhdG9yKGRlY29yYXRvciwgaXNDb3JlKSkge1xuICAgICAgICAgIGRlY29yYXRvcnNUb0tlZXAucHVzaChkZWNvcmF0b3JOb2RlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0b0xvd2VyLnB1c2goZGVjb3JhdG9yTm9kZSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRvTG93ZXIubGVuZ3RoKSByZXR1cm4gW3VuZGVmaW5lZCwgZWxlbWVudCwgW11dO1xuXG4gICAgICBpZiAoIWVsZW1lbnQubmFtZSB8fCAhdHMuaXNJZGVudGlmaWVyKGVsZW1lbnQubmFtZSkpIHtcbiAgICAgICAgLy8gTWV0aG9kIGhhcyBhIHdlaXJkIG5hbWUsIGUuZy5cbiAgICAgICAgLy8gICBbU3ltYm9sLmZvb10oKSB7Li4ufVxuICAgICAgICBkaWFnbm9zdGljcy5wdXNoKHtcbiAgICAgICAgICBmaWxlOiBlbGVtZW50LmdldFNvdXJjZUZpbGUoKSxcbiAgICAgICAgICBzdGFydDogZWxlbWVudC5nZXRTdGFydCgpLFxuICAgICAgICAgIGxlbmd0aDogZWxlbWVudC5nZXRFbmQoKSAtIGVsZW1lbnQuZ2V0U3RhcnQoKSxcbiAgICAgICAgICBtZXNzYWdlVGV4dDogYENhbm5vdCBwcm9jZXNzIGRlY29yYXRvcnMgZm9yIGNsYXNzIGVsZW1lbnQgd2l0aCBub24tYW5hbHl6YWJsZSBuYW1lLmAsXG4gICAgICAgICAgY2F0ZWdvcnk6IHRzLkRpYWdub3N0aWNDYXRlZ29yeS5FcnJvcixcbiAgICAgICAgICBjb2RlOiAwLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFt1bmRlZmluZWQsIGVsZW1lbnQsIFtdXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmFtZSA9IChlbGVtZW50Lm5hbWUgYXMgdHMuSWRlbnRpZmllcikudGV4dDtcbiAgICAgIGNvbnN0IG11dGFibGUgPSB0cy5nZXRNdXRhYmxlQ2xvbmUoZWxlbWVudCk7XG4gICAgICAobXV0YWJsZSBhcyBhbnkpLmRlY29yYXRvcnMgPSBkZWNvcmF0b3JzVG9LZWVwLmxlbmd0aCA/XG4gICAgICAgICAgdHMuc2V0VGV4dFJhbmdlKHRzLmNyZWF0ZU5vZGVBcnJheShkZWNvcmF0b3JzVG9LZWVwKSwgbXV0YWJsZS5kZWNvcmF0b3JzKSA6XG4gICAgICAgICAgdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIFtuYW1lLCBtdXRhYmxlLCB0b0xvd2VyXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm1zIGEgY29uc3RydWN0b3IuIFJldHVybnMgdGhlIHRyYW5zZm9ybWVkIGNvbnN0cnVjdG9yIGFuZCB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJcbiAgICAgKiBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQsIGNvbnNpc3Rpbmcgb2YgZGVjb3JhdG9ycyBhbmQgb3B0aW9uYWwgdHlwZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1Db25zdHJ1Y3RvcihjdG9yOiB0cy5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uKTpcbiAgICAgICAgW3RzLkNvbnN0cnVjdG9yRGVjbGFyYXRpb24sIFBhcmFtZXRlckRlY29yYXRpb25JbmZvW11dIHtcbiAgICAgIGN0b3IgPSB0cy52aXNpdEVhY2hDaGlsZChjdG9yLCBkZWNvcmF0b3JEb3dubGV2ZWxWaXNpdG9yLCBjb250ZXh0KTtcblxuICAgICAgY29uc3QgbmV3UGFyYW1ldGVyczogdHMuUGFyYW1ldGVyRGVjbGFyYXRpb25bXSA9IFtdO1xuICAgICAgY29uc3Qgb2xkUGFyYW1ldGVycyA9XG4gICAgICAgICAgdHMudmlzaXRQYXJhbWV0ZXJMaXN0KGN0b3IucGFyYW1ldGVycywgZGVjb3JhdG9yRG93bmxldmVsVmlzaXRvciwgY29udGV4dCk7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJzSW5mbzogUGFyYW1ldGVyRGVjb3JhdGlvbkluZm9bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBwYXJhbSBvZiBvbGRQYXJhbWV0ZXJzKSB7XG4gICAgICAgIGNvbnN0IGRlY29yYXRvcnNUb0tlZXA6IHRzLkRlY29yYXRvcltdID0gW107XG4gICAgICAgIGNvbnN0IHBhcmFtSW5mbzogUGFyYW1ldGVyRGVjb3JhdGlvbkluZm8gPSB7ZGVjb3JhdG9yczogW10sIHR5cGU6IG51bGx9O1xuICAgICAgICBjb25zdCBkZWNvcmF0b3JzID0gaG9zdC5nZXREZWNvcmF0b3JzT2ZEZWNsYXJhdGlvbihwYXJhbSkgfHwgW107XG5cbiAgICAgICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9ycykge1xuICAgICAgICAgIC8vIFdlIG9ubHkgZGVhbCB3aXRoIGNvbmNyZXRlIG5vZGVzIGluIFR5cGVTY3JpcHQgc291cmNlcywgc28gd2UgZG9uJ3RcbiAgICAgICAgICAvLyBuZWVkIHRvIGhhbmRsZSBzeW50aGV0aWNhbGx5IGNyZWF0ZWQgZGVjb3JhdG9ycy5cbiAgICAgICAgICBjb25zdCBkZWNvcmF0b3JOb2RlID0gZGVjb3JhdG9yLm5vZGUhIGFzIHRzLkRlY29yYXRvcjtcbiAgICAgICAgICBpZiAoIWlzQW5ndWxhckRlY29yYXRvcihkZWNvcmF0b3IsIGlzQ29yZSkpIHtcbiAgICAgICAgICAgIGRlY29yYXRvcnNUb0tlZXAucHVzaChkZWNvcmF0b3JOb2RlKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXJhbUluZm8hLmRlY29yYXRvcnMucHVzaChkZWNvcmF0b3JOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW0udHlwZSkge1xuICAgICAgICAgIC8vIHBhcmFtIGhhcyBhIHR5cGUgcHJvdmlkZWQsIGUuZy4gXCJmb286IEJhclwiLlxuICAgICAgICAgIC8vIFRoZSB0eXBlIHdpbGwgYmUgZW1pdHRlZCBhcyBhIHZhbHVlIGV4cHJlc3Npb24gaW4gZW50aXR5TmFtZVRvRXhwcmVzc2lvbiwgd2hpY2ggdGFrZXNcbiAgICAgICAgICAvLyBjYXJlIG5vdCB0byBlbWl0IGFueXRoaW5nIGZvciB0eXBlcyB0aGF0IGNhbm5vdCBiZSBleHByZXNzZWQgYXMgYSB2YWx1ZSAoZS5nLlxuICAgICAgICAgIC8vIGludGVyZmFjZXMpLlxuICAgICAgICAgIHBhcmFtSW5mbyEudHlwZSA9IHBhcmFtLnR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgcGFyYW1ldGVyc0luZm8ucHVzaChwYXJhbUluZm8pO1xuICAgICAgICBjb25zdCBuZXdQYXJhbSA9IHRzLnVwZGF0ZVBhcmFtZXRlcihcbiAgICAgICAgICAgIHBhcmFtLFxuICAgICAgICAgICAgLy8gTXVzdCBwYXNzICd1bmRlZmluZWQnIHRvIGF2b2lkIGVtaXR0aW5nIGRlY29yYXRvciBtZXRhZGF0YS5cbiAgICAgICAgICAgIGRlY29yYXRvcnNUb0tlZXAubGVuZ3RoID8gZGVjb3JhdG9yc1RvS2VlcCA6IHVuZGVmaW5lZCwgcGFyYW0ubW9kaWZpZXJzLFxuICAgICAgICAgICAgcGFyYW0uZG90RG90RG90VG9rZW4sIHBhcmFtLm5hbWUsIHBhcmFtLnF1ZXN0aW9uVG9rZW4sIHBhcmFtLnR5cGUsIHBhcmFtLmluaXRpYWxpemVyKTtcbiAgICAgICAgbmV3UGFyYW1ldGVycy5wdXNoKG5ld1BhcmFtKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSB0cy51cGRhdGVDb25zdHJ1Y3RvcihcbiAgICAgICAgICBjdG9yLCBjdG9yLmRlY29yYXRvcnMsIGN0b3IubW9kaWZpZXJzLCBuZXdQYXJhbWV0ZXJzLFxuICAgICAgICAgIHRzLnZpc2l0RnVuY3Rpb25Cb2R5KGN0b3IuYm9keSwgZGVjb3JhdG9yRG93bmxldmVsVmlzaXRvciwgY29udGV4dCkpO1xuICAgICAgcmV0dXJuIFt1cGRhdGVkLCBwYXJhbWV0ZXJzSW5mb107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtcyBhIHNpbmdsZSBjbGFzcyBkZWNsYXJhdGlvbjpcbiAgICAgKiAtIGRpc3BhdGNoZXMgdG8gc3RyaXAgZGVjb3JhdG9ycyBvbiBtZW1iZXJzXG4gICAgICogLSBjb252ZXJ0cyBkZWNvcmF0b3JzIG9uIHRoZSBjbGFzcyB0byBhbm5vdGF0aW9uc1xuICAgICAqIC0gY3JlYXRlcyBhIGN0b3JQYXJhbWV0ZXJzIHByb3BlcnR5XG4gICAgICogLSBjcmVhdGVzIGEgcHJvcERlY29yYXRvcnMgcHJvcGVydHlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1DbGFzc0RlY2xhcmF0aW9uKGNsYXNzRGVjbDogdHMuQ2xhc3NEZWNsYXJhdGlvbik6IHRzLkNsYXNzRGVjbGFyYXRpb24ge1xuICAgICAgY2xhc3NEZWNsID0gdHMuZ2V0TXV0YWJsZUNsb25lKGNsYXNzRGVjbCk7XG5cbiAgICAgIGNvbnN0IG5ld01lbWJlcnM6IHRzLkNsYXNzRWxlbWVudFtdID0gW107XG4gICAgICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzID0gbmV3IE1hcDxzdHJpbmcsIHRzLkRlY29yYXRvcltdPigpO1xuICAgICAgbGV0IGNsYXNzUGFyYW1ldGVyczogUGFyYW1ldGVyRGVjb3JhdGlvbkluZm9bXXxudWxsID0gbnVsbDtcblxuICAgICAgZm9yIChjb25zdCBtZW1iZXIgb2YgY2xhc3NEZWNsLm1lbWJlcnMpIHtcbiAgICAgICAgc3dpdGNoIChtZW1iZXIua2luZCkge1xuICAgICAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5Qcm9wZXJ0eURlY2xhcmF0aW9uOlxuICAgICAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5HZXRBY2Nlc3NvcjpcbiAgICAgICAgICBjYXNlIHRzLlN5bnRheEtpbmQuU2V0QWNjZXNzb3I6XG4gICAgICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLk1ldGhvZERlY2xhcmF0aW9uOiB7XG4gICAgICAgICAgICBjb25zdCBbbmFtZSwgbmV3TWVtYmVyLCBkZWNvcmF0b3JzXSA9IHRyYW5zZm9ybUNsYXNzRWxlbWVudChtZW1iZXIpO1xuICAgICAgICAgICAgbmV3TWVtYmVycy5wdXNoKG5ld01lbWJlcik7XG4gICAgICAgICAgICBpZiAobmFtZSkgZGVjb3JhdGVkUHJvcGVydGllcy5zZXQobmFtZSwgZGVjb3JhdG9ycyk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgICBjb25zdCBjdG9yID0gbWVtYmVyIGFzIHRzLkNvbnN0cnVjdG9yRGVjbGFyYXRpb247XG4gICAgICAgICAgICBpZiAoIWN0b3IuYm9keSkgYnJlYWs7XG4gICAgICAgICAgICBjb25zdCBbbmV3TWVtYmVyLCBwYXJhbWV0ZXJzSW5mb10gPVxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybUNvbnN0cnVjdG9yKG1lbWJlciBhcyB0cy5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uKTtcbiAgICAgICAgICAgIGNsYXNzUGFyYW1ldGVycyA9IHBhcmFtZXRlcnNJbmZvO1xuICAgICAgICAgICAgbmV3TWVtYmVycy5wdXNoKG5ld01lbWJlcik7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG5ld01lbWJlcnMucHVzaCh0cy52aXNpdEVhY2hDaGlsZChtZW1iZXIsIGRlY29yYXRvckRvd25sZXZlbFZpc2l0b3IsIGNvbnRleHQpKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGBSZWZsZWN0aW9uSG9zdC5nZXREZWNvcmF0b3JzT2ZEZWNsYXJhdGlvbigpYCBtZXRob2Qgd2lsbCBub3QgcmV0dXJuIGNlcnRhaW4ga2luZHMgb2ZcbiAgICAgIC8vIGRlY29yYXRvcnMgdGhhdCB3aWxsIG5ldmVyIGJlIEFuZ3VsYXIgZGVjb3JhdG9ycy4gU28gd2UgY2Fubm90IHJlbHkgb24gaXQgdG8gY2FwdHVyZSBhbGxcbiAgICAgIC8vIHRoZSBkZWNvcmF0b3JzIHRoYXQgc2hvdWxkIGJlIGtlcHQuIEluc3RlYWQgd2Ugc3RhcnQgb2ZmIHdpdGggYSBzZXQgb2YgdGhlIHJhdyBkZWNvcmF0b3JzXG4gICAgICAvLyBvbiB0aGUgY2xhc3MsIGFuZCBvbmx5IHJlbW92ZSB0aGUgb25lcyB0aGF0IGhhdmUgYmVlbiBpZGVudGlmaWVkIGZvciBkb3dubGV2ZWxpbmcuXG4gICAgICBjb25zdCBkZWNvcmF0b3JzVG9LZWVwID0gbmV3IFNldDx0cy5EZWNvcmF0b3I+KGNsYXNzRGVjbC5kZWNvcmF0b3JzKTtcbiAgICAgIGNvbnN0IHBvc3NpYmxlQW5ndWxhckRlY29yYXRvcnMgPSBob3N0LmdldERlY29yYXRvcnNPZkRlY2xhcmF0aW9uKGNsYXNzRGVjbCkgfHwgW107XG5cbiAgICAgIGxldCBoYXNBbmd1bGFyRGVjb3JhdG9yID0gZmFsc2U7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzVG9Mb3dlciA9IFtdO1xuICAgICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgcG9zc2libGVBbmd1bGFyRGVjb3JhdG9ycykge1xuICAgICAgICAvLyBXZSBvbmx5IGRlYWwgd2l0aCBjb25jcmV0ZSBub2RlcyBpbiBUeXBlU2NyaXB0IHNvdXJjZXMsIHNvIHdlIGRvbid0XG4gICAgICAgIC8vIG5lZWQgdG8gaGFuZGxlIHN5bnRoZXRpY2FsbHkgY3JlYXRlZCBkZWNvcmF0b3JzLlxuICAgICAgICBjb25zdCBkZWNvcmF0b3JOb2RlID0gZGVjb3JhdG9yLm5vZGUhIGFzIHRzLkRlY29yYXRvcjtcbiAgICAgICAgY29uc3QgaXNOZ0RlY29yYXRvciA9IGlzQW5ndWxhckRlY29yYXRvcihkZWNvcmF0b3IsIGlzQ29yZSk7XG5cbiAgICAgICAgLy8gS2VlcCB0cmFjayBpZiB3ZSBjb21lIGFjcm9zcyBhbiBBbmd1bGFyIGNsYXNzIGRlY29yYXRvci4gVGhpcyBpcyB1c2VkXG4gICAgICAgIC8vIGZvciB0byBkZXRlcm1pbmUgd2hldGhlciBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHNob3VsZCBiZSBjYXB0dXJlZCBvciBub3QuXG4gICAgICAgIGlmIChpc05nRGVjb3JhdG9yKSB7XG4gICAgICAgICAgaGFzQW5ndWxhckRlY29yYXRvciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNOZ0RlY29yYXRvciAmJiAhc2tpcENsYXNzRGVjb3JhdG9ycykge1xuICAgICAgICAgIGRlY29yYXRvcnNUb0xvd2VyLnB1c2goZXh0cmFjdE1ldGFkYXRhRnJvbVNpbmdsZURlY29yYXRvcihkZWNvcmF0b3JOb2RlLCBkaWFnbm9zdGljcykpO1xuICAgICAgICAgIGRlY29yYXRvcnNUb0tlZXAuZGVsZXRlKGRlY29yYXRvck5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkZWNvcmF0b3JzVG9Mb3dlci5sZW5ndGgpIHtcbiAgICAgICAgbmV3TWVtYmVycy5wdXNoKGNyZWF0ZURlY29yYXRvckNsYXNzUHJvcGVydHkoZGVjb3JhdG9yc1RvTG93ZXIpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjbGFzc1BhcmFtZXRlcnMpIHtcbiAgICAgICAgaWYgKGhhc0FuZ3VsYXJEZWNvcmF0b3IgfHwgY2xhc3NQYXJhbWV0ZXJzLnNvbWUocCA9PiAhIXAuZGVjb3JhdG9ycy5sZW5ndGgpKSB7XG4gICAgICAgICAgLy8gQ2FwdHVyZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGlmIHRoZSBjbGFzcyBoYXMgQW5ndWxhciBkZWNvcmF0b3IgYXBwbGllZCxcbiAgICAgICAgICAvLyBvciBpZiBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgaGFzIGRlY29yYXRvcnMgYXBwbGllZCBkaXJlY3RseS5cbiAgICAgICAgICBuZXdNZW1iZXJzLnB1c2goY3JlYXRlQ3RvclBhcmFtZXRlcnNDbGFzc1Byb3BlcnR5KFxuICAgICAgICAgICAgICBkaWFnbm9zdGljcywgZW50aXR5TmFtZVRvRXhwcmVzc2lvbiwgY2xhc3NQYXJhbWV0ZXJzLCBpc0Nsb3N1cmVDb21waWxlckVuYWJsZWQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRlY29yYXRlZFByb3BlcnRpZXMuc2l6ZSkge1xuICAgICAgICBuZXdNZW1iZXJzLnB1c2goY3JlYXRlUHJvcERlY29yYXRvcnNDbGFzc1Byb3BlcnR5KGRpYWdub3N0aWNzLCBkZWNvcmF0ZWRQcm9wZXJ0aWVzKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lbWJlcnMgPSB0cy5zZXRUZXh0UmFuZ2UoXG4gICAgICAgICAgdHMuY3JlYXRlTm9kZUFycmF5KG5ld01lbWJlcnMsIGNsYXNzRGVjbC5tZW1iZXJzLmhhc1RyYWlsaW5nQ29tbWEpLCBjbGFzc0RlY2wubWVtYmVycyk7XG5cbiAgICAgIHJldHVybiB0cy51cGRhdGVDbGFzc0RlY2xhcmF0aW9uKFxuICAgICAgICAgIGNsYXNzRGVjbCwgZGVjb3JhdG9yc1RvS2VlcC5zaXplID8gQXJyYXkuZnJvbShkZWNvcmF0b3JzVG9LZWVwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjbGFzc0RlY2wubW9kaWZpZXJzLCBjbGFzc0RlY2wubmFtZSwgY2xhc3NEZWNsLnR5cGVQYXJhbWV0ZXJzLCBjbGFzc0RlY2wuaGVyaXRhZ2VDbGF1c2VzLFxuICAgICAgICAgIG1lbWJlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybWVyIHZpc2l0b3IgdGhhdCBsb29rcyBmb3IgQW5ndWxhciBkZWNvcmF0b3JzIGFuZCByZXBsYWNlcyB0aGVtIHdpdGhcbiAgICAgKiBkb3dubGV2ZWxlZCBzdGF0aWMgcHJvcGVydGllcy4gQWxzbyBjb2xsZWN0cyBjb25zdHJ1Y3RvciB0eXBlIG1ldGFkYXRhIGZvclxuICAgICAqIGNsYXNzIGRlY2xhcmF0aW9uIHRoYXQgYXJlIGRlY29yYXRlZCB3aXRoIGFuIEFuZ3VsYXIgZGVjb3JhdG9yLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlY29yYXRvckRvd25sZXZlbFZpc2l0b3Iobm9kZTogdHMuTm9kZSk6IHRzLk5vZGUge1xuICAgICAgaWYgKHRzLmlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtQ2xhc3NEZWNsYXJhdGlvbihub2RlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cy52aXNpdEVhY2hDaGlsZChub2RlLCBkZWNvcmF0b3JEb3dubGV2ZWxWaXNpdG9yLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNmOiB0cy5Tb3VyY2VGaWxlKSA9PiB7XG4gICAgICAvLyBFbnN1cmUgdGhhdCByZWZlcmVuY2VkIHR5cGUgc3ltYm9scyBhcmUgbm90IGVsaWRlZCBieSBUeXBlU2NyaXB0LiBJbXBvcnRzIGZvclxuICAgICAgLy8gc3VjaCBwYXJhbWV0ZXIgdHlwZSBzeW1ib2xzIHByZXZpb3VzbHkgY291bGQgYmUgdHlwZS1vbmx5LCBidXQgbm93IG1pZ2h0IGJlIGFsc29cbiAgICAgIC8vIHVzZWQgaW4gdGhlIGBjdG9yUGFyYW1ldGVyc2Agc3RhdGljIHByb3BlcnR5IGFzIGEgdmFsdWUuIFdlIHdhbnQgdG8gbWFrZSBzdXJlXG4gICAgICAvLyB0aGF0IFR5cGVTY3JpcHQgZG9lcyBub3QgZWxpZGUgaW1wb3J0cyBmb3Igc3VjaCB0eXBlIHJlZmVyZW5jZXMuIFJlYWQgbW9yZVxuICAgICAgLy8gYWJvdXQgdGhpcyBpbiB0aGUgZGVzY3JpcHRpb24gZm9yIGBwYXRjaEFsaWFzUmVmZXJlbmNlUmVzb2x1dGlvbmAuXG4gICAgICBwYXRjaEFsaWFzUmVmZXJlbmNlUmVzb2x1dGlvbk9yRGllKGNvbnRleHQsIHJlZmVyZW5jZWRQYXJhbWV0ZXJUeXBlcyk7XG4gICAgICAvLyBEb3dubGV2ZWwgZGVjb3JhdG9ycyBhbmQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzLiBXZSB3aWxsIGtlZXAgdHJhY2sgb2YgYWxsXG4gICAgICAvLyByZWZlcmVuY2VkIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBzbyB0aGF0IHdlIGNhbiBpbnN0cnVjdCBUeXBlU2NyaXB0IHRvXG4gICAgICAvLyBub3QgZWxpZGUgdGhlaXIgaW1wb3J0cyBpZiB0aGV5IHByZXZpb3VzbHkgd2VyZSBvbmx5IHR5cGUtb25seS5cbiAgICAgIHJldHVybiB0cy52aXNpdEVhY2hDaGlsZChzZiwgZGVjb3JhdG9yRG93bmxldmVsVmlzaXRvciwgY29udGV4dCk7XG4gICAgfTtcbiAgfTtcbn1cbiJdfQ==
618
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxldmVsX2RlY29yYXRvcnNfdHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXItY2xpL3NyYy90cmFuc2Zvcm1lcnMvZG93bmxldmVsX2RlY29yYXRvcnNfdHJhbnNmb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRzs7Ozs7Ozs7Ozs7Ozs7SUFFSCwrQkFBaUM7SUFFakMsNEhBQW1IO0lBRW5IOzs7T0FHRztJQUNILFNBQVMsa0JBQWtCLENBQUMsU0FBb0IsRUFBRSxNQUFlO1FBQy9ELE9BQU8sTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQW9CRTtJQUVGOzs7T0FHRztJQUNILFNBQVMsNkJBQTZCO1FBQ3BDLElBQU0sWUFBWSxHQUFxQixFQUFFLENBQUM7UUFDMUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQ3hDLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUM1QixFQUFFLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDeEYsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQ3hDLFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUM5RCxFQUFFLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxTQUFTLENB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QkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQzNFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxlQUFlLEVBQ3hGLE9BQU8sQ0FBQyxDQUFDO1lBQ2YsQ0FBQztZQUVEOzs7O2VBSUc7WUFDSCxTQUFTLHlCQUF5QixDQUFDLElBQWE7Z0JBQzlDLElBQUksRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFO29CQUMvQixPQUFPLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUN4QztnQkFDRCxPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLHlCQUF5QixFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3JFLENBQUM7WUFFRCxPQUFPLFVBQUMsRUFBaUI7Z0JBQ3ZCLGtGQUFrRjtnQkFDbEYsK0VBQStFO2dCQUMvRSxrRUFBa0U7Z0JBQ2xFLE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUseUJBQXlCLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDbkUsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQXhRRCwwRUF3UUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQge0RlY29yYXRvciwgUmVmbGVjdGlvbkhvc3R9IGZyb20gJy4uL25ndHNjL3JlZmxlY3Rpb24nO1xuaW1wb3J0IHtpc0FsaWFzSW1wb3J0RGVjbGFyYXRpb24sIGxvYWRJc1JlZmVyZW5jZWRBbGlhc0RlY2xhcmF0aW9uUGF0Y2h9IGZyb20gJy4vcGF0Y2hfYWxpYXNfcmVmZXJlbmNlX3Jlc29sdXRpb24nO1xuXG4vKipcbiAqIFdoZXRoZXIgYSBnaXZlbiBkZWNvcmF0b3Igc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYW4gQW5ndWxhciBkZWNvcmF0b3IuXG4gKiBFaXRoZXIgaXQncyB1c2VkIGluIEBhbmd1bGFyL2NvcmUsIG9yIGl0J3MgaW1wb3J0ZWQgZnJvbSB0aGVyZS5cbiAqL1xuZnVuY3Rpb24gaXNBbmd1bGFyRGVjb3JhdG9yKGRlY29yYXRvcjogRGVjb3JhdG9yLCBpc0NvcmU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzQ29yZSB8fCAoZGVjb3JhdG9yLmltcG9ydCAhPT0gbnVsbCAmJiBkZWNvcmF0b3IuaW1wb3J0LmZyb20gPT09ICdAYW5ndWxhci9jb3JlJyk7XG59XG5cbi8qXG4gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4gIENvZGUgYmVsb3cgaGFzIGJlZW4gZXh0cmFjdGVkIGZyb20gdGhlIHRzaWNrbGUgZGVjb3JhdG9yIGRvd25sZXZlbCB0cmFuc2Zvcm1lclxuICBhbmQgYSBmZXcgbG9jYWwgbW9kaWZpY2F0aW9ucyBoYXZlIGJlZW4gYXBwbGllZDpcblxuICAgIDEuIFRzaWNrbGUgYnkgZGVmYXVsdCBwcm9jZXNzZWQgYWxsIGRlY29yYXRvcnMgdGhhdCBoYWQgdGhlIGBAQW5ub3RhdGlvbmAgSlNEb2MuXG4gICAgICAgV2UgbW9kaWZpZWQgdGhlIHRyYW5zZm9ybSB0byBvbmx5IGJlIGNvbmNlcm5lZCB3aXRoIGtub3duIEFuZ3VsYXIgZGVjb3JhdG9ycy5cbiAgICAyLiBUc2lja2xlIGJ5IGRlZmF1bHQgYWRkZWQgYEBub2NvbGxhcHNlYCB0byBhbGwgZ2VuZXJhdGVkIGBjdG9yUGFyYW1ldGVyc2AgcHJvcGVydGllcy5cbiAgICAgICBXZSBvbmx5IGRvIHRoaXMgd2hlbiBgYW5ub3RhdGVGb3JDbG9zdXJlQ29tcGlsZXJgIGlzIGVuYWJsZWQuXG4gICAgMy4gVHNpY2tsZSBkb2VzIG5vdCBoYW5kbGUgdW5pb24gdHlwZXMgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLiBpLmUuIGlmIGEgaW5qZWN0ZWQgdHlwZVxuICAgICAgIGlzIGRlbm90ZWQgd2l0aCBgQE9wdGlvbmFsYCwgdGhlIGFjdHVhbCB0eXBlIGNvdWxkIGJlIHNldCB0byBgVCB8IG51bGxgLlxuICAgICAgIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci1jbGkvY29tbWl0LzgyNjgwM2QwNzM2YjgwNzg2N2NhZmY5Zjg5MDNlNTA4OTcwYWQ1ZTQuXG4gICAgNC4gVHNpY2tsZSByZWxpZWQgb24gYGVtaXREZWNvcmF0b3JNZXRhZGF0YWAgdG8gYmUgc2V0IHRvIGB0cnVlYC4gVGhpcyBpcyBkdWUgdG8gYSBsaW1pdGF0aW9uXG4gICAgICAgaW4gVHlwZVNjcmlwdCB0cmFuc2Zvcm1lcnMgdGhhdCBuZXZlciBoYXMgYmVlbiBmaXhlZC4gV2Ugd2VyZSBhYmxlIHRvIHdvcmsgYXJvdW5kIHRoaXNcbiAgICAgICBsaW1pdGF0aW9uIHNvIHRoYXQgYGVtaXREZWNvcmF0b3JNZXRhZGF0YWAgZG9lc24ndCBuZWVkIHRvIGJlIHNwZWNpZmllZC5cbiAgICAgICBTZWU6IGBwYXRjaEFsaWFzUmVmZXJlbmNlUmVzb2x1dGlvbmAgZm9yIG1vcmUgZGV0YWlscy5cblxuICBIZXJlIGlzIGEgbGluayB0byB0aGUgdHNpY2tsZSByZXZpc2lvbiBvbiB3aGljaCB0aGlzIHRyYW5zZm9ybWVyIGlzIGJhc2VkOlxuICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci90c2lja2xlL2Jsb2IvZmFlMDZiZWNiMTU3MGY0OTE4MDYwNjBkODNmMjlmMmQ1MGM0M2NkZC9zcmMvZGVjb3JhdG9yX2Rvd25sZXZlbF90cmFuc2Zvcm1lci50c1xuICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuKi9cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBBU1QgZm9yIHRoZSBkZWNvcmF0b3IgZmllbGQgdHlwZSBhbm5vdGF0aW9uLCB3aGljaCBoYXMgdGhlIGZvcm1cbiAqICAgICB7IHR5cGU6IEZ1bmN0aW9uLCBhcmdzPzogYW55W10gfVtdXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURlY29yYXRvckludm9jYXRpb25UeXBlKCk6IHRzLlR5cGVOb2RlIHtcbiAgY29uc3QgdHlwZUVsZW1lbnRzOiB0cy5UeXBlRWxlbWVudFtdID0gW107XG4gIHR5cGVFbGVtZW50cy5wdXNoKHRzLmNyZWF0ZVByb3BlcnR5U2lnbmF0dXJlKFxuICAgICAgdW5kZWZpbmVkLCAndHlwZScsIHVuZGVmaW5lZCxcbiAgICAgIHRzLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKHRzLmNyZWF0ZUlkZW50aWZpZXIoJ0Z1bmN0aW9uJyksIHVuZGVmaW5lZCksIHVuZGVmaW5lZCkpO1xuICB0eXBlRWxlbWVudHMucHVzaCh0cy5jcmVhdGVQcm9wZXJ0eVNpZ25hdHVyZShcbiAgICAgIHVuZGVmaW5lZCwgJ2FyZ3MnLCB0cy5jcmVhdGVUb2tlbih0cy5TeW50YXhLaW5kLlF1ZXN0aW9uVG9rZW4pLFxuICAgICAgdHMuY3JlYXRlQXJyYXlUeXBlTm9kZSh0cy5jcmVhdGVLZXl3b3JkVHlwZU5vZGUodHMuU3ludGF4S2luZC5BbnlLZXl3b3JkKSksIHVuZGVmaW5lZCkpO1xuICByZXR1cm4gdHMuY3JlYXRlQXJyYXlUeXBlTm9kZSh0cy5jcmVhdGVUeXBlTGl0ZXJhbE5vZGUodHlwZUVsZW1lbnRzKSk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIHR5cGUgb2YgdGhlIGRlY29yYXRvciAodGhlIGZ1bmN0aW9uIG9yIGV4cHJlc3Npb24gaW52b2tlZCksIGFzIHdlbGwgYXMgYWxsIHRoZVxuICogYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZGVjb3JhdG9yLiBSZXR1cm5zIGFuIEFTVCB3aXRoIHRoZSBmb3JtOlxuICpcbiAqICAgICAvLyBGb3IgQGRlY29yYXRvcihhcmcxLCBhcmcyKVxuICogICAgIHsgdHlwZTogZGVjb3JhdG9yLCBhcmdzOiBbYXJnMSwgYXJnMl0gfVxuICovXG5mdW5jdGlvbiBleHRyYWN0TWV0YWRhdGFGcm9tU2luZ2xlRGVjb3JhdG9yKFxuICAgIGRlY29yYXRvcjogdHMuRGVjb3JhdG9yLCBkaWFnbm9zdGljczogdHMuRGlhZ25vc3RpY1tdKTogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24ge1xuICBjb25zdCBtZXRhZGF0YVByb3BlcnRpZXM6IHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZVtdID0gW107XG4gIGNvbnN0IGV4cHIgPSBkZWNvcmF0b3IuZXhwcmVzc2lvbjtcbiAgc3dpdGNoIChleHByLmtpbmQpIHtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuSWRlbnRpZmllcjpcbiAgICAgIC8vIFRoZSBkZWNvcmF0b3Igd2FzIGEgcGxhaW4gQEZvby5cbiAgICAgIG1ldGFkYXRhUHJvcGVydGllcy5wdXNoKHRzLmNyZWF0ZVByb3BlcnR5QXNzaWdubWVudCgndHlwZScsIGV4cHIpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbjpcbiAgICAgIC8vIFRoZSBkZWNvcmF0b3Igd2FzIGEgY2FsbCwgbGlrZSBARm9vKGJhcikuXG4gICAgICBjb25zdCBjYWxsID0gZXhwciBhcyB0cy5DYWxsRXhwcmVzc2lvbjtcbiAgICAgIG1ldGFkYXRhUHJvcGVydGllcy5wdXNoKHRzLmNyZWF0ZVByb3BlcnR5QXNzaWdubWVudCgndHlwZScsIGNhbGwuZXhwcmVzc2lvbikpO1xuICAgICAgaWYgKGNhbGwuYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBhcmdzOiB0cy5FeHByZXNzaW9uW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgY2FsbC5hcmd1bWVudHMpIHtcbiAgICAgICAgICBhcmdzLnB1c2goYXJnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcmdzQXJyYXlMaXRlcmFsID0gdHMuY3JlYXRlQXJyYXlMaXRlcmFsKGFyZ3MpO1xuICAgICAgICBhcmdzQXJyYXlMaXRlcmFsLmVsZW1lbnRzLmhhc1RyYWlsaW5nQ29tbWEgPSB0cnVlO1xuICAgICAgICBtZXRhZGF0YVByb3BlcnRpZXMucHVzaCh0cy5jcmVhdGVQcm9wZXJ0eUFzc2lnbm1lbnQoJ2FyZ3MnLCBhcmdzQXJyYXlMaXRlcmFsKSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgIGZpbGU6IGRlY29yYXRvci5nZXRTb3VyY2VGaWxlKCksXG4gICAgICAgIHN0YXJ0OiBkZWNvcmF0b3IuZ2V0U3RhcnQoKSxcbiAgICAgICAgbGVuZ3RoOiBkZWNvcmF0b3IuZ2V0RW5kKCkgLSBkZWNvcmF0b3IuZ2V0U3RhcnQoKSxcbiAgICAgICAgbWVzc2FnZVRleHQ6XG4gICAgICAgICAgICBgJHt0cy5TeW50YXhLaW5kW2RlY29yYXRvci5raW5kXX0gbm90IGltcGxlbWVudGVkIGluIGdhdGhlcmluZyBkZWNvcmF0b3IgbWV0YWRhdGEuYCxcbiAgICAgICAgY2F0ZWdvcnk6IHRzLkRpYWdub3N0aWNDYXRlZ29yeS5FcnJvcixcbiAgICAgICAgY29kZTogMCxcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHRzLmNyZWF0ZU9iamVjdExpdGVyYWwobWV0YWRhdGFQcm9wZXJ0aWVzKTtcbn1cblxuLyoqXG4gKiBUYWtlcyBhIGxpc3Qgb2YgZGVjb3JhdG9yIG1ldGFkYXRhIG9iamVjdCBBU1RzIGFuZCBwcm9kdWNlcyBhbiBBU1QgZm9yIGFcbiAqIHN0YXRpYyBjbGFzcyBwcm9wZXJ0eSBvZiBhbiBhcnJheSBvZiB0aG9zZSBtZXRhZGF0YSBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVEZWNvcmF0b3JDbGFzc1Byb3BlcnR5KGRlY29yYXRvckxpc3Q6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uW10pIHtcbiAgY29uc3QgbW9kaWZpZXIgPSB0cy5jcmVhdGVUb2tlbih0cy5TeW50YXhLaW5kLlN0YXRpY0tleXdvcmQpO1xuICBjb25zdCB0eXBlID0gY3JlYXRlRGVjb3JhdG9ySW52b2NhdGlvblR5cGUoKTtcbiAgY29uc3QgaW5pdGlhbGl6ZXIgPSB0cy5jcmVhdGVBcnJheUxpdGVyYWwoZGVjb3JhdG9yTGlzdCwgdHJ1ZSk7XG4gIC8vIE5COiB0aGUgLmRlY29yYXRvcnMgcHJvcGVydHkgZG9lcyBub3QgZ2V0IGEgQG5vY29sbGFwc2UgcHJvcGVydHkuIFRoZXJlIGlzXG4gIC8vIG5vIGdvb2QgcmVhc29uIHdoeSAtIGl0IG1lYW5zIC5kZWNvcmF0b3JzIGlzIG5vdCBydW50aW1lIGFjY2Vzc2libGUgaWYgeW91XG4gIC8vIGNvbXBpbGUgd2l0aCBjb2xsYXBzZSBwcm9wZXJ0aWVzLCB3aGVyZWFzIHByb3BEZWNvcmF0b3JzIGlzLCB3aGljaCBkb2Vzbid0XG4gIC8vIGZvbGxvdyBhbnkgc3RyaW5nZW50IGxvZ2ljLiBIb3dldmVyIHRoaXMgaGFzIGJlZW4gdGhlIGNhc2UgcHJldmlvdXNseSwgYW5kXG4gIC8vIGFkZGluZyBpdCBiYWNrIGluIGxlYWRzIHRvIHN1YnN0YW50aWFsIGNvZGUgc2l6ZSBpbmNyZWFzZXMgYXMgQ2xvc3VyZSBmYWlsc1xuICAvLyB0byB0cmVlIHNoYWtlIHRoZXNlIHByb3BzIHdpdGhvdXQgQG5vY29sbGFwc2UuXG4gIHJldHVybiB0cy5jcmVhdGVQcm9wZXJ0eSh1bmRlZmluZWQsIFttb2RpZmllcl0sICdkZWNvcmF0b3JzJywgdW5kZWZpbmVkLCB0eXBlLCBpbml0aWFsaXplcik7XG59XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgQVNUIGZvciB0aGUgJ2N0b3JQYXJhbWV0ZXJzJyBmaWVsZCB0eXBlIGFubm90YXRpb246XG4gKiAgICgpID0+ICh7IHR5cGU6IGFueSwgZGVjb3JhdG9ycz86IHt0eXBlOiBGdW5jdGlvbiwgYXJncz86IGFueVtdfVtdIH18bnVsbClbXVxuICovXG5mdW5jdGlvbiBjcmVhdGVDdG9yUGFyYW1ldGVyc0NsYXNzUHJvcGVydHlUeXBlKCk6IHRzLlR5cGVOb2RlIHtcbiAgLy8gU29ycnkgYWJvdXQgdGhpcy4gVHJ5IHJlYWRpbmcganVzdCB0aGUgc3RyaW5nIGxpdGVyYWxzIGJlbG93LlxuICBjb25zdCB0eXBlRWxlbWVudHM6IHRzLlR5cGVFbGVtZW50W10gPSBbXTtcbiAgdHlwZUVsZW1lbnRzLnB1c2godHMuY3JlYXRlUHJvcGVydHlTaWduYXR1cmUoXG4gICAgICB1bmRlZmluZWQsICd0eXBlJywgdW5kZWZpbmVkLFxuICAgICAgdHMuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUodHMuY3JlYXRlSWRlbnRpZmllcignYW55JyksIHVuZGVmaW5lZCksIHVuZGVmaW5lZCkpO1xuICB0eXBlRWxlbWVudHMucHVzaCh0cy5jcmVhdGVQcm9wZXJ0eVNpZ25hdHVyZShcbiAgICAgIHVuZGVmaW5lZCwgJ2RlY29yYXRvcnMnLCB0cy5jcmVhdGVUb2tlbih0cy5TeW50YXhLaW5kLlF1ZXN0aW9uVG9rZW4pLFxuICAgICAgdHMuY3JlYXRlQXJyYXlUeXBlTm9kZSh0cy5jcmVhdGVUeXBlTGl0ZXJhbE5vZGUoW1xuICAgICAgICB0cy5jcmVhdGVQcm9wZXJ0eVNpZ25hdHVyZShcbiAgICAgICAgICAgIHVuZGVmaW5lZCwgJ3R5cGUnLCB1bmRlZmluZWQsXG4gICAgICAgICAgICB0cy5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZSh0cy5jcmVhdGVJZGVudGlmaWVyKCdGdW5jdGlvbicpLCB1bmRlZmluZWQpLCB1bmRlZmluZWQpLFxuICAgICAgICB0cy5jcmVhdGVQcm9wZXJ0eVNpZ25hdHVyZShcbiAgICAgICAgICAgIHVuZGVmaW5lZCwgJ2FyZ3MnLCB0cy5jcmVhdGVUb2tlbih0cy5TeW50YXhLaW5kLlF1ZXN0aW9uVG9rZW4pLFxuICAgICAgICAgICAgdHMuY3JlYXRlQXJyYXlUeXBlTm9kZShcbiAgICAgICAgICAgICAgICB0cy5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZSh0cy5jcmVhdGVJZGVudGlmaWVyKCdhbnknKSwgdW5kZWZpbmVkKSksXG4gICAgICAgICAgICB1bmRlZmluZWQpLFxuICAgICAgXSkpLFxuICAgICAgdW5kZWZpbmVkKSk7XG5cbiAgcmV0dXJuIHRzLmNyZWF0ZUZ1bmN0aW9uVHlwZU5vZGUodW5kZWZpbmVkLCBbXSwgdHMuY3JlYXRlQXJyYXlUeXBlTm9kZSh0cy5jcmVhdGVVbmlvblR5cGVOb2RlKFtcbiAgICB0cy5jcmVhdGVUeXBlTGl0ZXJhbE5vZGUodHlwZUVsZW1lbnRzKSxcbiAgICB0cy5jcmVhdGVMaXRlcmFsVHlwZU5vZGUodHMuY3JlYXRlTnVsbCgpKSxcbiAgXSkpKTtcbn1cblxuLyoqXG4gKiBTZXRzIGEgQ2xvc3VyZSBcXEBub2NvbGxhcHNlIHN5bnRoZXRpYyBjb21tZW50IG9uIHRoZSBnaXZlbiBub2RlLiBUaGlzIHByZXZlbnRzIENsb3N1cmUgQ29tcGlsZXJcbiAqIGZyb20gY29sbGFwc2luZyB0aGUgYXBwYXJlbnRseSBzdGF0aWMgcHJvcGVydHksIHdoaWNoIHdvdWxkIG1ha2UgaXQgaW1wb3NzaWJsZSB0byBmaW5kIGZvciBjb2RlXG4gKiB0cnlpbmcgdG8gZGV0ZWN0IGl0IGF0IHJ1bnRpbWUuXG4gKi9cbmZ1bmN0aW9uIGFkZE5vQ29sbGFwc2VDb21tZW50KG46IHRzLk5vZGUpIHtcbiAgdHMuc2V0U3ludGhldGljTGVhZGluZ0NvbW1lbnRzKG4sIFt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6IHRzLlN5bnRheEtpbmQuTXVsdGlMaW5lQ29tbWVudFRyaXZpYSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyogQG5vY29sbGFwc2UgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zOiAtMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiAtMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzVHJhaWxpbmdOZXdMaW5lOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSk7XG59XG5cbi8qKlxuICogY3JlYXRlQ3RvclBhcmFtZXRlcnNDbGFzc1Byb3BlcnR5IGNyZWF0ZXMgYSBzdGF0aWMgJ2N0b3JQYXJhbWV0ZXJzJyBwcm9wZXJ0eSBjb250YWluaW5nXG4gKiBkb3dubGV2ZWxlZCBkZWNvcmF0b3IgaW5mb3JtYXRpb24uXG4gKlxuICogVGhlIHByb3BlcnR5IGNvbnRhaW5zIGFuIGFycm93IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3QgbGl0ZXJhbHMgb2YgdGhlIHNoYXBlOlxuICogICAgIHN0YXRpYyBjdG9yUGFyYW1ldGVycyA9ICgpID0+IFt7XG4gKiAgICAgICB0eXBlOiBTb21lQ2xhc3N8dW5kZWZpbmVkLCAgLy8gdGhlIHR5cGUgb2YgdGhlIHBhcmFtIHRoYXQncyBkZWNvcmF0ZWQsIGlmIGl0J3MgYSB2YWx1ZS5cbiAqICAgICAgIGRlY29yYXRvcnM6IFt7XG4gKiAgICAgICAgIHR5cGU6IERlY29yYXRvckZuLCAgLy8gdGhlIHR5cGUgb2YgdGhlIGRlY29yYXRvciB0aGF0J3MgaW52b2tlZC5cbiAqICAgICAgICAgYXJnczogW0FSR1NdLCAgICAgICAvLyB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZGVjb3JhdG9yLlxuICogICAgICAgfV1cbiAqICAgICB9XTtcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ3RvclBhcmFtZXRlcnNDbGFzc1Byb3BlcnR5KFxuICAgIGRpYWdub3N0aWNzOiB0cy5EaWFnbm9zdGljW10sXG4gICAgZW50aXR5TmFtZVRvRXhwcmVzc2lvbjogKG46IHRzLkVudGl0eU5hbWUpID0+IHRzLkV4cHJlc3Npb24gfCB1bmRlZmluZWQsXG4gICAgY3RvclBhcmFtZXRlcnM6IFBhcmFtZXRlckRlY29yYXRpb25JbmZvW10sXG4gICAgaXNDbG9zdXJlQ29tcGlsZXJFbmFibGVkOiBib29sZWFuKTogdHMuUHJvcGVydHlEZWNsYXJhdGlvbiB7XG4gIGNvbnN0IHBhcmFtczogdHMuRXhwcmVzc2lvbltdID0gW107XG5cbiAgZm9yIChjb25zdCBjdG9yUGFyYW0gb2YgY3RvclBhcmFtZXRlcnMpIHtcbiAgICBpZiAoIWN0b3JQYXJhbS50eXBlICYmIGN0b3JQYXJhbS5kZWNvcmF0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcGFyYW1zLnB1c2godHMuY3JlYXRlTnVsbCgpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtVHlwZSA9IGN0b3JQYXJhbS50eXBlID9cbiAgICAgICAgdHlwZVJlZmVyZW5jZVRvRXhwcmVzc2lvbihlbnRpdHlOYW1lVG9FeHByZXNzaW9uLCBjdG9yUGFyYW0udHlwZSkgOlxuICAgICAgICB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWVtYmVycyA9XG4gICAgICAgIFt0cy5jcmVhdGVQcm9wZXJ0eUFzc2lnbm1lbnQoJ3R5cGUnLCBwYXJhbVR5cGUgfHwgdHMuY3JlYXRlSWRlbnRpZmllcigndW5kZWZpbmVkJykpXTtcblxuICAgIGNvbnN0IGRlY29yYXRvcnM6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGRlY28gb2YgY3RvclBhcmFtLmRlY29yYXRvcnMpIHtcbiAgICAgIGRlY29yYXRvcnMucHVzaChleHRyYWN0TWV0YWRhdGFGcm9tU2luZ2xlRGVjb3JhdG9yKGRlY28sIGRpYWdub3N0aWNzKSk7XG4gICAgfVxuICAgIGlmIChkZWNvcmF0b3JzLmxlbmd0aCkge1xuICAgICAgbWVtYmVycy5wdXNoKHRzLmNyZWF0ZVByb3BlcnR5QXNzaWdubWVudCgnZGVjb3JhdG9ycycsIHRzLmNyZWF0ZUFycmF5TGl0ZXJhbChkZWNvcmF0b3JzKSkpO1xuICAgIH1cbiAgICBwYXJhbXMucHVzaCh0cy5jcmVhdGVPYmplY3RMaXRlcmFsKG1lbWJlcnMpKTtcbiAgfVxuXG4gIGNvbnN0IGluaXRpYWxpemVyID0gdHMuY3JlYXRlQXJyb3dGdW5jdGlvbihcbiAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBbXSwgdW5kZWZpbmVkLCB0cy5jcmVhdGVUb2tlbih0cy5TeW50YXhLaW5kLkVxdWFsc0dyZWF0ZXJUaGFuVG9rZW4pLFxuICAgICAgdHMuY3JlYXRlQXJyYXlMaXRlcmFsKHBhcmFtcywgdHJ1ZSkpO1xuICBjb25zdCB0eXBlID0gY3JlYXRlQ3RvclBhcmFtZXRlcnNDbGFzc1Byb3BlcnR5VHlwZSgpO1xuICBjb25zdCBjdG9yUHJvcCA9IHRzLmNyZWF0ZVByb3BlcnR5KFxuICAgICAgdW5kZWZpbmVkLCBbdHMuY3JlYXRlVG9rZW4odHMuU3ludGF4S2luZC5TdGF0aWNLZXl3b3JkKV0sICdjdG9yUGFyYW1ldGVycycsIHVuZGVmaW5lZCwgdHlwZSxcbiAgICAgIGluaXRpYWxpemVyKTtcbiAgaWYgKGlzQ2xvc3VyZUNvbXBpbGVyRW5hYmxlZCkge1xuICAgIGFkZE5vQ29sbGFwc2VDb21tZW50KGN0b3JQcm9wKTtcbiAgfVxuICByZXR1cm4gY3RvclByb3A7XG59XG5cbi8qKlxuICogY3JlYXRlUHJvcERlY29yYXRvcnNDbGFzc1Byb3BlcnR5IGNyZWF0ZXMgYSBzdGF0aWMgJ3Byb3BEZWNvcmF0b3JzJyBwcm9wZXJ0eSBjb250YWluaW5nIHR5cGVcbiAqIGluZm9ybWF0aW9uIGZvciBldmVyeSBwcm9wZXJ0eSB0aGF0IGhhcyBhIGRlY29yYXRvciBhcHBsaWVkLlxuICpcbiAqICAgICBzdGF0aWMgcHJvcERlY29yYXRvcnM6IHtba2V5OiBzdHJpbmddOiB7dHlwZTogRnVuY3Rpb24sIGFyZ3M/OiBhbnlbXX1bXX0gPSB7XG4gKiAgICAgICBwcm9wQTogW3t0eXBlOiBNeURlY29yYXRvciwgYXJnczogWzEsIDJdfSwgLi4uXSxcbiAqICAgICAgIC4uLlxuICogICAgIH07XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb3BEZWNvcmF0b3JzQ2xhc3NQcm9wZXJ0eShcbiAgICBkaWFnbm9zdGljczogdHMuRGlhZ25vc3RpY1tdLCBwcm9wZXJ0aWVzOiBNYXA8c3RyaW5nLCB0cy5EZWNvcmF0b3JbXT4pOiB0cy5Qcm9wZXJ0eURlY2xhcmF0aW9uIHtcbiAgLy8gIGBzdGF0aWMgcHJvcERlY29yYXRvcnM6IHtba2V5OiBzdHJpbmddOiBgICsge3R5cGU6IEZ1bmN0aW9uLCBhcmdzPzogYW55W119W10gKyBgfSA9IHtcXG5gKTtcbiAgY29uc3QgZW50cmllczogdHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlW10gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgZGVjb3JhdG9yc10gb2YgcHJvcGVydGllcy5lbnRyaWVzKCkpIHtcbiAgICBlbnRyaWVzLnB1c2godHMuY3JlYXRlUHJvcGVydHlBc3NpZ25tZW50KFxuICAgICAgICBuYW1lLFxuICAgICAgICB0cy5jcmVhdGVBcnJheUxpdGVyYWwoXG4gICAgICAgICAgICBkZWNvcmF0b3JzLm1hcChkZWNvID0+IGV4dHJhY3RNZXRhZGF0YUZyb21TaW5nbGVEZWNvcmF0b3IoZGVjbywgZGlhZ25vc3RpY3MpKSkpKTtcbiAgfVxuICBjb25zdCBpbml0aWFsaXplciA9IHRzLmNyZWF0ZU9iamVjdExpdGVyYWwoZW50cmllcywgdHJ1ZSk7XG4gIGNvbnN0IHR5cGUgPSB0cy5jcmVhdGVUeXBlTGl0ZXJhbE5vZGUoW3RzLmNyZWF0ZUluZGV4U2lnbmF0dXJlKFxuICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFt0cy5jcmVhdGVQYXJhbWV0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsICdrZXknLCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKCdzdHJpbmcnLCB1bmRlZmluZWQpLCB1bmRlZmluZWQpXSxcbiAgICAgIGNyZWF0ZURlY29yYXRvckludm9jYXRpb25UeXBlKCkpXSk7XG4gIHJldHVybiB0cy5jcmVhdGVQcm9wZXJ0eShcbiAgICAgIHVuZGVmaW5lZCwgW3RzLmNyZWF0ZVRva2VuKHRzLlN5bnRheEtpbmQuU3RhdGljS2V5d29yZCldLCAncHJvcERlY29yYXRvcnMnLCB1bmRlZmluZWQsIHR5cGUsXG4gICAgICBpbml0aWFsaXplcik7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgKHBvdGVudGlhbGx5KSB2YWx1ZSBwYXJ0IGZvciB0aGUgZ2l2ZW4gbm9kZS5cbiAqXG4gKiBUaGlzIGlzIGEgcGFydGlhbCByZS1pbXBsZW1lbnRhdGlvbiBvZiBUeXBlU2NyaXB0J3Mgc2VyaWFsaXplVHlwZVJlZmVyZW5jZU5vZGUuIFRoaXMgaXMgYVxuICogd29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xNzUxNiAoc2VyaWFsaXplVHlwZVJlZmVyZW5jZU5vZGVcbiAqIG5vdCBiZWluZyBleHBvc2VkKS4gSW4gcHJhY3RpY2UgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBzdWZmaWNpZW50IGZvciBBbmd1bGFyJ3MgdXNlIG9mIHR5cGVcbiAqIG1ldGFkYXRhLlxuICovXG5mdW5jdGlvbiB0eXBlUmVmZXJlbmNlVG9FeHByZXNzaW9uKFxuICAgIGVudGl0eU5hbWVUb0V4cHJlc3Npb246IChuOiB0cy5FbnRpdHlOYW1lKSA9PiB0cy5FeHByZXNzaW9uIHwgdW5kZWZpbmVkLFxuICAgIG5vZGU6IHRzLlR5cGVOb2RlKTogdHMuRXhwcmVzc2lvbnx1bmRlZmluZWQge1xuICBsZXQga2luZCA9IG5vZGUua2luZDtcbiAgaWYgKHRzLmlzTGl0ZXJhbFR5cGVOb2RlKG5vZGUpKSB7XG4gICAgLy8gVHJlYXQgbGl0ZXJhbCB0eXBlcyBsaWtlIHRoZWlyIGJhc2UgdHlwZSAoYm9vbGVhbiwgc3RyaW5nLCBudW1iZXIpLlxuICAgIGtpbmQgPSBub2RlLmxpdGVyYWwua2luZDtcbiAgfVxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuRnVuY3Rpb25UeXBlOlxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5Db25zdHJ1Y3RvclR5cGU6XG4gICAgICByZXR1cm4gdHMuY3JlYXRlSWRlbnRpZmllcignRnVuY3Rpb24nKTtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuQXJyYXlUeXBlOlxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5UdXBsZVR5cGU6XG4gICAgICByZXR1cm4gdHMuY3JlYXRlSWRlbnRpZmllcignQXJyYXknKTtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVHlwZVByZWRpY2F0ZTpcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVHJ1ZUtleXdvcmQ6XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkZhbHNlS2V5d29yZDpcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuQm9vbGVhbktleXdvcmQ6XG4gICAgICByZXR1cm4gdHMuY3JlYXRlSWRlbnRpZmllcignQm9vbGVhbicpO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5TdHJpbmdMaXRlcmFsOlxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5TdHJpbmdLZXl3b3JkOlxuICAgICAgcmV0dXJuIHRzLmNyZWF0ZUlkZW50aWZpZXIoJ1N0cmluZycpO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5PYmplY3RLZXl3b3JkOlxuICAgICAgcmV0dXJuIHRzLmNyZWF0ZUlkZW50aWZpZXIoJ09iamVjdCcpO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5OdW1iZXJLZXl3b3JkOlxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5OdW1lcmljTGl0ZXJhbDpcbiAgICAgIHJldHVybiB0cy5jcmVhdGVJZGVudGlmaWVyKCdOdW1iZXInKTtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVHlwZVJlZmVyZW5jZTpcbiAgICAgIGNvbnN0IHR5cGVSZWYgPSBub2RlIGFzIHRzLlR5cGVSZWZlcmVuY2VOb2RlO1xuICAgICAgLy8gSWdub3JlIGFueSBnZW5lcmljIHR5cGVzLCBqdXN0IHJldHVybiB0aGUgYmFzZSB0eXBlLlxuICAgICAgcmV0dXJuIGVudGl0eU5hbWVUb0V4cHJlc3Npb24odHlwZVJlZi50eXBlTmFtZSk7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlVuaW9uVHlwZTpcbiAgICAgIGNvbnN0IGNoaWxkVHlwZU5vZGVzID1cbiAgICAgICAgICAobm9kZSBhcyB0cy5VbmlvblR5cGVOb2RlKVxuICAgICAgICAgICAgICAudHlwZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgdCA9PiAhKHRzLmlzTGl0ZXJhbFR5cGVOb2RlKHQpICYmIHQubGl0ZXJhbC5raW5kID09PSB0cy5TeW50YXhLaW5kLk51bGxLZXl3b3JkKSk7XG4gICAgICByZXR1cm4gY2hpbGRUeXBlTm9kZXMubGVuZ3RoID09PSAxID9cbiAgICAgICAgICB0eXBlUmVmZXJlbmNlVG9FeHByZXNzaW9uKGVudGl0eU5hbWVUb0V4cHJlc3Npb24sIGNoaWxkVHlwZU5vZGVzWzBdKSA6XG4gICAgICAgICAgdW5kZWZpbmVkO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBzeW1ib2wgcmVmZXJzIHRvIGEgdmFsdWUgdGhhdCBleGlzdHMgYXQgcnVudGltZSAoYXMgZGlzdGluY3QgZnJvbSBhIHR5cGUpLlxuICpcbiAqIEV4cGFuZHMgYWxpYXNlcywgd2hpY2ggaXMgaW1wb3J0YW50IGZvciB0aGUgY2FzZSB3aGVyZVxuICogICBpbXBvcnQgKiBhcyB4IGZyb20gJ3NvbWUtbW9kdWxlJztcbiAqIGFuZCB4IGlzIG5vdyBhIHZhbHVlICh0aGUgbW9kdWxlIG9iamVjdCkuXG4gKi9cbmZ1bmN0aW9uIHN5bWJvbElzUnVudGltZVZhbHVlKHR5cGVDaGVja2VyOiB0cy5UeXBlQ2hlY2tlciwgc3ltYm9sOiB0cy5TeW1ib2wpOiBib29sZWFuIHtcbiAgaWYgKHN5bWJvbC5mbGFncyAmIHRzLlN5bWJvbEZsYWdzLkFsaWFzKSB7XG4gICAgc3ltYm9sID0gdHlwZUNoZWNrZXIuZ2V0QWxpYXNlZFN5bWJvbChzeW1ib2wpO1xuICB9XG5cbiAgLy8gTm90ZSB0aGF0IGNvbnN0IGVudW1zIGFyZSBhIHNwZWNpYWwgY2FzZSwgYmVjYXVzZVxuICAvLyB3aGlsZSB0aGV5IGhhdmUgYSB2YWx1ZSwgdGhleSBkb24ndCBleGlzdCBhdCBydW50aW1lLlxuICByZXR1cm4gKHN5bWJvbC5mbGFncyAmIHRzLlN5bWJvbEZsYWdzLlZhbHVlICYgdHMuU3ltYm9sRmxhZ3MuQ29uc3RFbnVtRXhjbHVkZXMpICE9PSAwO1xufVxuXG4vKiogUGFyYW1ldGVyRGVjb3JhdGlvbkluZm8gZGVzY3JpYmVzIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBzaW5nbGUgY29uc3RydWN0b3IgcGFyYW1ldGVyLiAqL1xuaW50ZXJmYWNlIFBhcmFtZXRlckRlY29yYXRpb25JbmZvIHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIGRlY2xhcmF0aW9uIGZvciB0aGUgcGFyYW1ldGVyLiBPbmx5IHNldCBpZiB0aGUgdHlwZSBpcyBhIHZhbHVlIChlLmcuIGEgY2xhc3MsIG5vdCBhblxuICAgKiBpbnRlcmZhY2UpLlxuICAgKi9cbiAgdHlwZTogdHMuVHlwZU5vZGV8bnVsbDtcbiAgLyoqIFRoZSBsaXN0IG9mIGRlY29yYXRvcnMgZm91bmQgb24gdGhlIHBhcmFtZXRlciwgbnVsbCBpZiBub25lLiAqL1xuICBkZWNvcmF0b3JzOiB0cy5EZWNvcmF0b3JbXTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgdHJhbnNmb3JtZXIgZm9yIGRvd25sZXZlbGluZyBBbmd1bGFyIGRlY29yYXRvcnMuXG4gKiBAcGFyYW0gdHlwZUNoZWNrZXIgUmVmZXJlbmNlIHRvIHRoZSBwcm9ncmFtJ3MgdHlwZSBjaGVja2VyLlxuICogQHBhcmFtIGhvc3QgUmVmbGVjdGlvbiBob3N0IHRoYXQgaXMgdXNlZCBmb3IgZGV0ZXJtaW5pbmcgZGVjb3JhdG9ycy5cbiAqIEBwYXJhbSBkaWFnbm9zdGljcyBMaXN0IHdoaWNoIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggZGlhZ25vc3RpY3MgaWYgYW55LlxuICogQHBhcmFtIGlzQ29yZSBXaGV0aGVyIHRoZSBjdXJyZW50IFR5cGVTY3JpcHQgcHJvZ3JhbSBpcyBmb3IgdGhlIGBAYW5ndWxhci9jb3JlYCBwYWNrYWdlLlxuICogQHBhcmFtIGlzQ2xvc3VyZUNvbXBpbGVyRW5hYmxlZCBXaGV0aGVyIGNsb3N1cmUgYW5ub3RhdGlvbnMgbmVlZCB0byBiZSBhZGRlZCB3aGVyZSBuZWVkZWQuXG4gKiBAcGFyYW0gc2tpcENsYXNzRGVjb3JhdG9ycyBXaGV0aGVyIGNsYXNzIGRlY29yYXRvcnMgc2hvdWxkIGJlIHNraXBwZWQgZnJvbSBkb3dubGV2ZWxpbmcuXG4gKiAgIFRoaXMgaXMgdXNlZnVsIGZvciBKSVQgbW9kZSB3aGVyZSBjbGFzcyBkZWNvcmF0b3JzIHNob3VsZCBiZSBwcmVzZXJ2ZWQgYXMgdGhleSBjb3VsZCByZWx5XG4gKiAgIG9uIGltbWVkaWF0ZSBleGVjdXRpb24uIGUuZy4gZG93bmxldmVsaW5nIGBASW5qZWN0YWJsZWAgbWVhbnMgdGhhdCB0aGUgaW5qZWN0YWJsZSBmYWN0b3J5XG4gKiAgIGlzIG5vdCBjcmVhdGVkLCBhbmQgaW5qZWN0aW5nIHRoZSB0b2tlbiB3aWxsIG5vdCB3b3JrLiBJZiB0aGlzIGRlY29yYXRvciB3b3VsZCBub3QgYmVcbiAqICAgZG93bmxldmVsZWQsIHRoZSBgSW5qZWN0YWJsZWAgZGVjb3JhdG9yIHdpbGwgZXhlY3V0ZSBpbW1lZGlhdGVseSBvbiBmaWxlIGxvYWQsIGFuZFxuICogICBBbmd1bGFyIHdpbGwgZ2VuZXJhdGUgdGhlIGNvcnJlc3BvbmRpbmcgaW5qZWN0YWJsZSBmYWN0b3J5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG93bmxldmVsRGVjb3JhdG9yc1RyYW5zZm9ybShcbiAgICB0eXBlQ2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsIGhvc3Q6IFJlZmxlY3Rpb25Ib3N0LCBkaWFnbm9zdGljczogdHMuRGlhZ25vc3RpY1tdLFxuICAgIGlzQ29yZTogYm9vbGVhbiwgaXNDbG9zdXJlQ29tcGlsZXJFbmFibGVkOiBib29sZWFuLFxuICAgIHNraXBDbGFzc0RlY29yYXRvcnM6IGJvb2xlYW4pOiB0cy5UcmFuc2Zvcm1lckZhY3Rvcnk8dHMuU291cmNlRmlsZT4ge1xuICByZXR1cm4gKGNvbnRleHQ6IHRzLlRyYW5zZm9ybWF0aW9uQ29udGV4dCkgPT4ge1xuICAgIC8vIEVuc3VyZSB0aGF0IHJlZmVyZW5jZWQgdHlwZSBzeW1ib2xzIGFyZSBub3QgZWxpZGVkIGJ5IFR5cGVTY3JpcHQuIEltcG9ydHMgZm9yXG4gICAgLy8gc3VjaCBwYXJhbWV0ZXIgdHlwZSBzeW1ib2xzIHByZXZpb3VzbHkgY291bGQgYmUgdHlwZS1vbmx5LCBidXQgbm93IG1pZ2h0IGJlIGFsc29cbiAgICAvLyB1c2VkIGluIHRoZSBgY3RvclBhcmFtZXRlcnNgIHN0YXRpYyBwcm9wZXJ0eSBhcyBhIHZhbHVlLiBXZSB3YW50IHRvIG1ha2Ugc3VyZVxuICAgIC8vIHRoYXQgVHlwZVNjcmlwdCBkb2VzIG5vdCBlbGlkZSBpbXBvcnRzIGZvciBzdWNoIHR5cGUgcmVmZXJlbmNlcy4gUmVhZCBtb3JlXG4gICAgLy8gYWJvdXQgdGhpcyBpbiB0aGUgZGVzY3JpcHRpb24gZm9yIGBsb2FkSXNSZWZlcmVuY2VkQWxpYXNEZWNsYXJhdGlvblBhdGNoYC5cbiAgICBjb25zdCByZWZlcmVuY2VkUGFyYW1ldGVyVHlwZXMgPSBsb2FkSXNSZWZlcmVuY2VkQWxpYXNEZWNsYXJhdGlvblBhdGNoKGNvbnRleHQpO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYW4gRW50aXR5TmFtZSAoZnJvbSBhIHR5cGUgYW5ub3RhdGlvbikgdG8gYW4gZXhwcmVzc2lvbiAoYWNjZXNzaW5nIGEgdmFsdWUpLlxuICAgICAqXG4gICAgICogRm9yIGEgZ2l2ZW4gcXVhbGlmaWVkIG5hbWUsIHRoaXMgd2Fsa3MgZGVwdGggZmlyc3QgdG8gZmluZCB0aGUgbGVmdG1vc3QgaWRlbnRpZmllcixcbiAgICAgKiBhbmQgdGhlbiBjb252ZXJ0cyB0aGUgcGF0aCBpbnRvIGEgcHJvcGVydHkgYWNjZXNzIHRoYXQgY2FuIGJlIHVzZWQgYXMgZXhwcmVzc2lvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlbnRpdHlOYW1lVG9FeHByZXNzaW9uKG5hbWU6IHRzLkVudGl0eU5hbWUpOiB0cy5FeHByZXNzaW9ufHVuZGVmaW5lZCB7XG4gICAgICBjb25zdCBzeW1ib2wgPSB0eXBlQ2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKG5hbWUpO1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBuYW1lIHJlZmVyZW5jZXMgYSBzeW1ib2wgdGhhdCBpcyBhbiBhY3R1YWwgdmFsdWUuIElmIGl0IGlzIG5vdCwgaXRcbiAgICAgIC8vIGNhbm5vdCBiZSByZWZlcmVuY2VkIGJ5IGFuIGV4cHJlc3Npb24sIHNvIHJldHVybiB1bmRlZmluZWQuXG4gICAgICBpZiAoIXN5bWJvbCB8fCAhc3ltYm9sSXNSdW50aW1lVmFsdWUodHlwZUNoZWNrZXIsIHN5bWJvbCkgfHwgIXN5bWJvbC5kZWNsYXJhdGlvbnMgfHxcbiAgICAgICAgICBzeW1ib2wuZGVjbGFyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgLy8gSWYgd2UgZGVhbCB3aXRoIGEgcXVhbGlmaWVkIG5hbWUsIGJ1aWxkIHVwIGEgcHJvcGVydHkgYWNjZXNzIGV4cHJlc3Npb25cbiAgICAgIC8vIHRoYXQgY291bGQgYmUgdXNlZCBpbiB0aGUgSmF2YVNjcmlwdCBvdXRwdXQuXG4gICAgICBpZiAodHMuaXNRdWFsaWZpZWROYW1lKG5hbWUpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckV4cHIgPSBlbnRpdHlOYW1lVG9FeHByZXNzaW9uKG5hbWUubGVmdCk7XG4gICAgICAgIGlmIChjb250YWluZXJFeHByID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cy5jcmVhdGVQcm9wZXJ0eUFjY2Vzcyhjb250YWluZXJFeHByLCBuYW1lLnJpZ2h0KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlY2wgPSBzeW1ib2wuZGVjbGFyYXRpb25zWzBdO1xuICAgICAgLy8gSWYgdGhlIGdpdmVuIGVudGl0eSBuYW1lIGhhcyBiZWVuIHJlc29sdmVkIHRvIGFuIGFsaWFzIGltcG9ydCBkZWNsYXJhdGlvbixcbiAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBhbGlhcyBkZWNsYXJhdGlvbiBpcyBub3QgZWxpZGVkIGJ5IFR5cGVTY3JpcHQsIGFuZCB1c2UgaXRzXG4gICAgICAvLyBuYW1lIGlkZW50aWZpZXIgdG8gcmVmZXJlbmNlIGl0IGF0IHJ1bnRpbWUuXG4gICAgICBpZiAoaXNBbGlhc0ltcG9ydERlY2xhcmF0aW9uKGRlY2wpKSB7XG4gICAgICAgIHJlZmVyZW5jZWRQYXJhbWV0ZXJUeXBlcy5hZGQoZGVjbCk7XG4gICAgICAgIC8vIElmIHRoZSBlbnRpdHkgbmFtZSByZXNvbHZlcyB0byBhbiBhbGlhcyBpbXBvcnQgZGVjbGFyYXRpb24sIHdlIHJlZmVyZW5jZSB0aGVcbiAgICAgICAgLy8gZW50aXR5IGJhc2VkIG9uIHRoZSBhbGlhcyBpbXBvcnQgbmFtZS4gVGhpcyBlbnN1cmVzIHRoYXQgVHlwZVNjcmlwdCBwcm9wZXJseVxuICAgICAgICAvLyByZXNvbHZlcyB0aGUgbGluayB0byB0aGUgaW1wb3J0LiBDbG9uaW5nIHRoZSBvcmlnaW5hbCBlbnRpdHkgbmFtZSBpZGVudGlmaWVyXG4gICAgICAgIC8vIGNvdWxkIGxlYWQgdG8gYW4gaW5jb3JyZWN0IHJlc29sdXRpb24gYXQgbG9jYWwgc2NvcGUuIGUuZy4gQ29uc2lkZXIgdGhlIGZvbGxvd2luZ1xuICAgICAgICAvLyBzbmlwcGV0OiBgY29uc3RydWN0b3IoRGVwOiBEZXApIHt9YC4gSW4gc3VjaCBhIGNhc2UsIHRoZSBsb2NhbCBgRGVwYCBpZGVudGlmaWVyXG4gICAgICAgIC8vIHdvdWxkIHJlc29sdmUgdG8gdGhlIGFjdHVhbCBwYXJhbWV0ZXIgbmFtZSwgYW5kIG5vdCB0byB0aGUgZGVzaXJlZCBpbXBvcnQuXG4gICAgICAgIC8vIFRoaXMgaGFwcGVucyBiZWNhdXNlIHRoZSBlbnRpdHkgbmFtZSBpZGVudGlmaWVyIHN5bWJvbCBpcyBpbnRlcm5hbGx5IGNvbnNpZGVyZWRcbiAgICAgICAgLy8gYXMgdHlwZS1vbmx5IGFuZCB0aGVyZWZvcmUgVHlwZVNjcmlwdCB0cmllcyB0byByZXNvbHZlIGl0IGFzIHZhbHVlIG1hbnVhbGx5LlxuICAgICAgICAvLyBXZSBjYW4gaGVscCBUeXBlU2NyaXB0IGFuZCBhdm9pZCB0aGlzIG5vbi1yZWxpYWJsZSByZXNvbHV0aW9uIGJ5IHVzaW5nIGFuIGlkZW50aWZpZXJcbiAgICAgICAgLy8gdGhhdCBpcyBub3QgdHlwZS1vbmx5IGFuZCBpcyBkaXJlY3RseSBsaW5rZWQgdG8gdGhlIGltcG9ydCBhbGlhcyBkZWNsYXJhdGlvbi5cbiAgICAgICAgaWYgKGRlY2wubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRzLmdldE11dGFibGVDbG9uZShkZWNsLm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDbG9uZSB0aGUgb3JpZ2luYWwgZW50aXR5IG5hbWUgaWRlbnRpZmllciBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZVxuICAgICAgLy8gaXRzIHZhbHVlIGF0IHJ1bnRpbWUuIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBpZGVudGlmaWVyIGlzIHJlc29sdmluZyB0byBhIGZpbGVcbiAgICAgIC8vIGxvY2FsIGRlY2xhcmF0aW9uIChvdGhlcndpc2UgaXQgd291bGQgcmVzb2x2ZSB0byBhbiBhbGlhcyBpbXBvcnQgZGVjbGFyYXRpb24pLlxuICAgICAgcmV0dXJuIHRzLmdldE11dGFibGVDbG9uZShuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm1zIGEgY2xhc3MgZWxlbWVudC4gUmV0dXJucyBhIHRocmVlIHR1cGxlIG9mIG5hbWUsIHRyYW5zZm9ybWVkIGVsZW1lbnQsIGFuZFxuICAgICAqIGRlY29yYXRvcnMgZm91bmQuIFJldHVybnMgYW4gdW5kZWZpbmVkIG5hbWUgaWYgdGhlcmUgYXJlIG5vIGRlY29yYXRvcnMgdG8gbG93ZXIgb24gdGhlXG4gICAgICogZWxlbWVudCwgb3IgdGhlIGVsZW1lbnQgaGFzIGFuIGV4b3RpYyBuYW1lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybUNsYXNzRWxlbWVudChlbGVtZW50OiB0cy5DbGFzc0VsZW1lbnQpOlxuICAgICAgICBbc3RyaW5nfHVuZGVmaW5lZCwgdHMuQ2xhc3NFbGVtZW50LCB0cy5EZWNvcmF0b3JbXV0ge1xuICAgICAgZWxlbWVudCA9IHRzLnZpc2l0RWFjaENoaWxkKGVsZW1lbnQsIGRlY29yYXRvckRvd25sZXZlbFZpc2l0b3IsIGNvbnRleHQpO1xuICAgICAgY29uc3QgZGVjb3JhdG9yc1RvS2VlcDogdHMuRGVjb3JhdG9yW10gPSBbXTtcbiAgICAgIGNvbnN0IHRvTG93ZXI6IHRzLkRlY29yYXRvcltdID0gW107XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gaG9zdC5nZXREZWNvcmF0b3JzT2ZEZWNsYXJhdGlvbihlbGVtZW50KSB8fCBbXTtcbiAgICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRlY29yYXRvcnMpIHtcbiAgICAgICAgLy8gV2Ugb25seSBkZWFsIHdpdGggY29uY3JldGUgbm9kZXMgaW4gVHlwZVNjcmlwdCBzb3VyY2VzLCBzbyB3ZSBkb24ndFxuICAgICAgICAvLyBuZWVkIHRvIGhhbmRsZSBzeW50aGV0aWNhbGx5IGNyZWF0ZWQgZGVjb3JhdG9ycy5cbiAgICAgICAgY29uc3QgZGVjb3JhdG9yTm9kZSA9IGRlY29yYXRvci5ub2RlISBhcyB0cy5EZWNvcmF0b3I7XG4gICAgICAgIGlmICghaXNBbmd1bGFyRGVjb3JhdG9yKGRlY29yYXRvciwgaXNDb3JlKSkge1xuICAgICAgICAgIGRlY29yYXRvcnNUb0tlZXAucHVzaChkZWNvcmF0b3JOb2RlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0b0xvd2VyLnB1c2goZGVjb3JhdG9yTm9kZSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRvTG93ZXIubGVuZ3RoKSByZXR1cm4gW3VuZGVmaW5lZCwgZWxlbWVudCwgW11dO1xuXG4gICAgICBpZiAoIWVsZW1lbnQubmFtZSB8fCAhdHMuaXNJZGVudGlmaWVyKGVsZW1lbnQubmFtZSkpIHtcbiAgICAgICAgLy8gTWV0aG9kIGhhcyBhIHdlaXJkIG5hbWUsIGUuZy5cbiAgICAgICAgLy8gICBbU3ltYm9sLmZvb10oKSB7Li4ufVxuICAgICAgICBkaWFnbm9zdGljcy5wdXNoKHtcbiAgICAgICAgICBmaWxlOiBlbGVtZW50LmdldFNvdXJjZUZpbGUoKSxcbiAgICAgICAgICBzdGFydDogZWxlbWVudC5nZXRTdGFydCgpLFxuICAgICAgICAgIGxlbmd0aDogZWxlbWVudC5nZXRFbmQoKSAtIGVsZW1lbnQuZ2V0U3RhcnQoKSxcbiAgICAgICAgICBtZXNzYWdlVGV4dDogYENhbm5vdCBwcm9jZXNzIGRlY29yYXRvcnMgZm9yIGNsYXNzIGVsZW1lbnQgd2l0aCBub24tYW5hbHl6YWJsZSBuYW1lLmAsXG4gICAgICAgICAgY2F0ZWdvcnk6IHRzLkRpYWdub3N0aWNDYXRlZ29yeS5FcnJvcixcbiAgICAgICAgICBjb2RlOiAwLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFt1bmRlZmluZWQsIGVsZW1lbnQsIFtdXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmFtZSA9IChlbGVtZW50Lm5hbWUgYXMgdHMuSWRlbnRpZmllcikudGV4dDtcbiAgICAgIGNvbnN0IG11dGFibGUgPSB0cy5nZXRNdXRhYmxlQ2xvbmUoZWxlbWVudCk7XG4gICAgICAobXV0YWJsZSBhcyBhbnkpLmRlY29yYXRvcnMgPSBkZWNvcmF0b3JzVG9LZWVwLmxlbmd0aCA/XG4gICAgICAgICAgdHMuc2V0VGV4dFJhbmdlKHRzLmNyZWF0ZU5vZGVBcnJheShkZWNvcmF0b3JzVG9LZWVwKSwgbXV0YWJsZS5kZWNvcmF0b3JzKSA6XG4gICAgICAgICAgdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIFtuYW1lLCBtdXRhYmxlLCB0b0xvd2VyXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm1zIGEgY29uc3RydWN0b3IuIFJldHVybnMgdGhlIHRyYW5zZm9ybWVkIGNvbnN0cnVjdG9yIGFuZCB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJcbiAgICAgKiBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQsIGNvbnNpc3Rpbmcgb2YgZGVjb3JhdG9ycyBhbmQgb3B0aW9uYWwgdHlwZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1Db25zdHJ1Y3RvcihjdG9yOiB0cy5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uKTpcbiAgICAgICAgW3RzLkNvbnN0cnVjdG9yRGVjbGFyYXRpb24sIFBhcmFtZXRlckRlY29yYXRpb25JbmZvW11dIHtcbiAgICAgIGN0b3IgPSB0cy52aXNpdEVhY2hDaGlsZChjdG9yLCBkZWNvcmF0b3JEb3dubGV2ZWxWaXNpdG9yLCBjb250ZXh0KTtcblxuICAgICAgY29uc3QgbmV3UGFyYW1ldGVyczogdHMuUGFyYW1ldGVyRGVjbGFyYXRpb25bXSA9IFtdO1xuICAgICAgY29uc3Qgb2xkUGFyYW1ldGVycyA9XG4gICAgICAgICAgdHMudmlzaXRQYXJhbWV0ZXJMaXN0KGN0b3IucGFyYW1ldGVycywgZGVjb3JhdG9yRG93bmxldmVsVmlzaXRvciwgY29udGV4dCk7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJzSW5mbzogUGFyYW1ldGVyRGVjb3JhdGlvbkluZm9bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBwYXJhbSBvZiBvbGRQYXJhbWV0ZXJzKSB7XG4gICAgICAgIGNvbnN0IGRlY29yYXRvcnNUb0tlZXA6IHRzLkRlY29yYXRvcltdID0gW107XG4gICAgICAgIGNvbnN0IHBhcmFtSW5mbzogUGFyYW1ldGVyRGVjb3JhdGlvbkluZm8gPSB7ZGVjb3JhdG9yczogW10sIHR5cGU6IG51bGx9O1xuICAgICAgICBjb25zdCBkZWNvcmF0b3JzID0gaG9zdC5nZXREZWNvcmF0b3JzT2ZEZWNsYXJhdGlvbihwYXJhbSkgfHwgW107XG5cbiAgICAgICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9ycykge1xuICAgICAgICAgIC8vIFdlIG9ubHkgZGVhbCB3aXRoIGNvbmNyZXRlIG5vZGVzIGluIFR5cGVTY3JpcHQgc291cmNlcywgc28gd2UgZG9uJ3RcbiAgICAgICAgICAvLyBuZWVkIHRvIGhhbmRsZSBzeW50aGV0aWNhbGx5IGNyZWF0ZWQgZGVjb3JhdG9ycy5cbiAgICAgICAgICBjb25zdCBkZWNvcmF0b3JOb2RlID0gZGVjb3JhdG9yLm5vZGUhIGFzIHRzLkRlY29yYXRvcjtcbiAgICAgICAgICBpZiAoIWlzQW5ndWxhckRlY29yYXRvcihkZWNvcmF0b3IsIGlzQ29yZSkpIHtcbiAgICAgICAgICAgIGRlY29yYXRvcnNUb0tlZXAucHVzaChkZWNvcmF0b3JOb2RlKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXJhbUluZm8hLmRlY29yYXRvcnMucHVzaChkZWNvcmF0b3JOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW0udHlwZSkge1xuICAgICAgICAgIC8vIHBhcmFtIGhhcyBhIHR5cGUgcHJvdmlkZWQsIGUuZy4gXCJmb286IEJhclwiLlxuICAgICAgICAgIC8vIFRoZSB0eXBlIHdpbGwgYmUgZW1pdHRlZCBhcyBhIHZhbHVlIGV4cHJlc3Npb24gaW4gZW50aXR5TmFtZVRvRXhwcmVzc2lvbiwgd2hpY2ggdGFrZXNcbiAgICAgICAgICAvLyBjYXJlIG5vdCB0byBlbWl0IGFueXRoaW5nIGZvciB0eXBlcyB0aGF0IGNhbm5vdCBiZSBleHByZXNzZWQgYXMgYSB2YWx1ZSAoZS5nLlxuICAgICAgICAgIC8vIGludGVyZmFjZXMpLlxuICAgICAgICAgIHBhcmFtSW5mbyEudHlwZSA9IHBhcmFtLnR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgcGFyYW1ldGVyc0luZm8ucHVzaChwYXJhbUluZm8pO1xuICAgICAgICBjb25zdCBuZXdQYXJhbSA9IHRzLnVwZGF0ZVBhcmFtZXRlcihcbiAgICAgICAgICAgIHBhcmFtLFxuICAgICAgICAgICAgLy8gTXVzdCBwYXNzICd1bmRlZmluZWQnIHRvIGF2b2lkIGVtaXR0aW5nIGRlY29yYXRvciBtZXRhZGF0YS5cbiAgICAgICAgICAgIGRlY29yYXRvcnNUb0tlZXAubGVuZ3RoID8gZGVjb3JhdG9yc1RvS2VlcCA6IHVuZGVmaW5lZCwgcGFyYW0ubW9kaWZpZXJzLFxuICAgICAgICAgICAgcGFyYW0uZG90RG90RG90VG9rZW4sIHBhcmFtLm5hbWUsIHBhcmFtLnF1ZXN0aW9uVG9rZW4sIHBhcmFtLnR5cGUsIHBhcmFtLmluaXRpYWxpemVyKTtcbiAgICAgICAgbmV3UGFyYW1ldGVycy5wdXNoKG5ld1BhcmFtKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSB0cy51cGRhdGVDb25zdHJ1Y3RvcihcbiAgICAgICAgICBjdG9yLCBjdG9yLmRlY29yYXRvcnMsIGN0b3IubW9kaWZpZXJzLCBuZXdQYXJhbWV0ZXJzLFxuICAgICAgICAgIHRzLnZpc2l0RnVuY3Rpb25Cb2R5KGN0b3IuYm9keSwgZGVjb3JhdG9yRG93bmxldmVsVmlzaXRvciwgY29udGV4dCkpO1xuICAgICAgcmV0dXJuIFt1cGRhdGVkLCBwYXJhbWV0ZXJzSW5mb107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtcyBhIHNpbmdsZSBjbGFzcyBkZWNsYXJhdGlvbjpcbiAgICAgKiAtIGRpc3BhdGNoZXMgdG8gc3RyaXAgZGVjb3JhdG9ycyBvbiBtZW1iZXJzXG4gICAgICogLSBjb252ZXJ0cyBkZWNvcmF0b3JzIG9uIHRoZSBjbGFzcyB0byBhbm5vdGF0aW9uc1xuICAgICAqIC0gY3JlYXRlcyBhIGN0b3JQYXJhbWV0ZXJzIHByb3BlcnR5XG4gICAgICogLSBjcmVhdGVzIGEgcHJvcERlY29yYXRvcnMgcHJvcGVydHlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1DbGFzc0RlY2xhcmF0aW9uKGNsYXNzRGVjbDogdHMuQ2xhc3NEZWNsYXJhdGlvbik6IHRzLkNsYXNzRGVjbGFyYXRpb24ge1xuICAgICAgY2xhc3NEZWNsID0gdHMuZ2V0TXV0YWJsZUNsb25lKGNsYXNzRGVjbCk7XG5cbiAgICAgIGNvbnN0IG5ld01lbWJlcnM6IHRzLkNsYXNzRWxlbWVudFtdID0gW107XG4gICAgICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzID0gbmV3IE1hcDxzdHJpbmcsIHRzLkRlY29yYXRvcltdPigpO1xuICAgICAgbGV0IGNsYXNzUGFyYW1ldGVyczogUGFyYW1ldGVyRGVjb3JhdGlvbkluZm9bXXxudWxsID0gbnVsbDtcblxuICAgICAgZm9yIChjb25zdCBtZW1iZXIgb2YgY2xhc3NEZWNsLm1lbWJlcnMpIHtcbiAgICAgICAgc3dpdGNoIChtZW1iZXIua2luZCkge1xuICAgICAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5Qcm9wZXJ0eURlY2xhcmF0aW9uOlxuICAgICAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5HZXRBY2Nlc3NvcjpcbiAgICAgICAgICBjYXNlIHRzLlN5bnRheEtpbmQuU2V0QWNjZXNzb3I6XG4gICAgICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLk1ldGhvZERlY2xhcmF0aW9uOiB7XG4gICAgICAgICAgICBjb25zdCBbbmFtZSwgbmV3TWVtYmVyLCBkZWNvcmF0b3JzXSA9IHRyYW5zZm9ybUNsYXNzRWxlbWVudChtZW1iZXIpO1xuICAgICAgICAgICAgbmV3TWVtYmVycy5wdXNoKG5ld01lbWJlcik7XG4gICAgICAgICAgICBpZiAobmFtZSkgZGVjb3JhdGVkUHJvcGVydGllcy5zZXQobmFtZSwgZGVjb3JhdG9ycyk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgICBjb25zdCBjdG9yID0gbWVtYmVyIGFzIHRzLkNvbnN0cnVjdG9yRGVjbGFyYXRpb247XG4gICAgICAgICAgICBpZiAoIWN0b3IuYm9keSkgYnJlYWs7XG4gICAgICAgICAgICBjb25zdCBbbmV3TWVtYmVyLCBwYXJhbWV0ZXJzSW5mb10gPVxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybUNvbnN0cnVjdG9yKG1lbWJlciBhcyB0cy5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uKTtcbiAgICAgICAgICAgIGNsYXNzUGFyYW1ldGVycyA9IHBhcmFtZXRlcnNJbmZvO1xuICAgICAgICAgICAgbmV3TWVtYmVycy5wdXNoKG5ld01lbWJlcik7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG5ld01lbWJlcnMucHVzaCh0cy52aXNpdEVhY2hDaGlsZChtZW1iZXIsIGRlY29yYXRvckRvd25sZXZlbFZpc2l0b3IsIGNvbnRleHQpKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGBSZWZsZWN0aW9uSG9zdC5nZXREZWNvcmF0b3JzT2ZEZWNsYXJhdGlvbigpYCBtZXRob2Qgd2lsbCBub3QgcmV0dXJuIGNlcnRhaW4ga2luZHMgb2ZcbiAgICAgIC8vIGRlY29yYXRvcnMgdGhhdCB3aWxsIG5ldmVyIGJlIEFuZ3VsYXIgZGVjb3JhdG9ycy4gU28gd2UgY2Fubm90IHJlbHkgb24gaXQgdG8gY2FwdHVyZSBhbGxcbiAgICAgIC8vIHRoZSBkZWNvcmF0b3JzIHRoYXQgc2hvdWxkIGJlIGtlcHQuIEluc3RlYWQgd2Ugc3RhcnQgb2ZmIHdpdGggYSBzZXQgb2YgdGhlIHJhdyBkZWNvcmF0b3JzXG4gICAgICAvLyBvbiB0aGUgY2xhc3MsIGFuZCBvbmx5IHJlbW92ZSB0aGUgb25lcyB0aGF0IGhhdmUgYmVlbiBpZGVudGlmaWVkIGZvciBkb3dubGV2ZWxpbmcuXG4gICAgICBjb25zdCBkZWNvcmF0b3JzVG9LZWVwID0gbmV3IFNldDx0cy5EZWNvcmF0b3I+KGNsYXNzRGVjbC5kZWNvcmF0b3JzKTtcbiAgICAgIGNvbnN0IHBvc3NpYmxlQW5ndWxhckRlY29yYXRvcnMgPSBob3N0LmdldERlY29yYXRvcnNPZkRlY2xhcmF0aW9uKGNsYXNzRGVjbCkgfHwgW107XG5cbiAgICAgIGxldCBoYXNBbmd1bGFyRGVjb3JhdG9yID0gZmFsc2U7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzVG9Mb3dlciA9IFtdO1xuICAgICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgcG9zc2libGVBbmd1bGFyRGVjb3JhdG9ycykge1xuICAgICAgICAvLyBXZSBvbmx5IGRlYWwgd2l0aCBjb25jcmV0ZSBub2RlcyBpbiBUeXBlU2NyaXB0IHNvdXJjZXMsIHNvIHdlIGRvbid0XG4gICAgICAgIC8vIG5lZWQgdG8gaGFuZGxlIHN5bnRoZXRpY2FsbHkgY3JlYXRlZCBkZWNvcmF0b3JzLlxuICAgICAgICBjb25zdCBkZWNvcmF0b3JOb2RlID0gZGVjb3JhdG9yLm5vZGUhIGFzIHRzLkRlY29yYXRvcjtcbiAgICAgICAgY29uc3QgaXNOZ0RlY29yYXRvciA9IGlzQW5ndWxhckRlY29yYXRvcihkZWNvcmF0b3IsIGlzQ29yZSk7XG5cbiAgICAgICAgLy8gS2VlcCB0cmFjayBpZiB3ZSBjb21lIGFjcm9zcyBhbiBBbmd1bGFyIGNsYXNzIGRlY29yYXRvci4gVGhpcyBpcyB1c2VkXG4gICAgICAgIC8vIGZvciB0byBkZXRlcm1pbmUgd2hldGhlciBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHNob3VsZCBiZSBjYXB0dXJlZCBvciBub3QuXG4gICAgICAgIGlmIChpc05nRGVjb3JhdG9yKSB7XG4gICAgICAgICAgaGFzQW5ndWxhckRlY29yYXRvciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNOZ0RlY29yYXRvciAmJiAhc2tpcENsYXNzRGVjb3JhdG9ycykge1xuICAgICAgICAgIGRlY29yYXRvcnNUb0xvd2VyLnB1c2goZXh0cmFjdE1ldGFkYXRhRnJvbVNpbmdsZURlY29yYXRvcihkZWNvcmF0b3JOb2RlLCBkaWFnbm9zdGljcykpO1xuICAgICAgICAgIGRlY29yYXRvcnNUb0tlZXAuZGVsZXRlKGRlY29yYXRvck5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkZWNvcmF0b3JzVG9Mb3dlci5sZW5ndGgpIHtcbiAgICAgICAgbmV3TWVtYmVycy5wdXNoKGNyZWF0ZURlY29yYXRvckNsYXNzUHJvcGVydHkoZGVjb3JhdG9yc1RvTG93ZXIpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjbGFzc1BhcmFtZXRlcnMpIHtcbiAgICAgICAgaWYgKGhhc0FuZ3VsYXJEZWNvcmF0b3IgfHwgY2xhc3NQYXJhbWV0ZXJzLnNvbWUocCA9PiAhIXAuZGVjb3JhdG9ycy5sZW5ndGgpKSB7XG4gICAgICAgICAgLy8gQ2FwdHVyZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGlmIHRoZSBjbGFzcyBoYXMgQW5ndWxhciBkZWNvcmF0b3IgYXBwbGllZCxcbiAgICAgICAgICAvLyBvciBpZiBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgaGFzIGRlY29yYXRvcnMgYXBwbGllZCBkaXJlY3RseS5cbiAgICAgICAgICBuZXdNZW1iZXJzLnB1c2goY3JlYXRlQ3RvclBhcmFtZXRlcnNDbGFzc1Byb3BlcnR5KFxuICAgICAgICAgICAgICBkaWFnbm9zdGljcywgZW50aXR5TmFtZVRvRXhwcmVzc2lvbiwgY2xhc3NQYXJhbWV0ZXJzLCBpc0Nsb3N1cmVDb21waWxlckVuYWJsZWQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRlY29yYXRlZFByb3BlcnRpZXMuc2l6ZSkge1xuICAgICAgICBuZXdNZW1iZXJzLnB1c2goY3JlYXRlUHJvcERlY29yYXRvcnNDbGFzc1Byb3BlcnR5KGRpYWdub3N0aWNzLCBkZWNvcmF0ZWRQcm9wZXJ0aWVzKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lbWJlcnMgPSB0cy5zZXRUZXh0UmFuZ2UoXG4gICAgICAgICAgdHMuY3JlYXRlTm9kZUFycmF5KG5ld01lbWJlcnMsIGNsYXNzRGVjbC5tZW1iZXJzLmhhc1RyYWlsaW5nQ29tbWEpLCBjbGFzc0RlY2wubWVtYmVycyk7XG5cbiAgICAgIHJldHVybiB0cy51cGRhdGVDbGFzc0RlY2xhcmF0aW9uKFxuICAgICAgICAgIGNsYXNzRGVjbCwgZGVjb3JhdG9yc1RvS2VlcC5zaXplID8gQXJyYXkuZnJvbShkZWNvcmF0b3JzVG9LZWVwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjbGFzc0RlY2wubW9kaWZpZXJzLCBjbGFzc0RlY2wubmFtZSwgY2xhc3NEZWNsLnR5cGVQYXJhbWV0ZXJzLCBjbGFzc0RlY2wuaGVyaXRhZ2VDbGF1c2VzLFxuICAgICAgICAgIG1lbWJlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybWVyIHZpc2l0b3IgdGhhdCBsb29rcyBmb3IgQW5ndWxhciBkZWNvcmF0b3JzIGFuZCByZXBsYWNlcyB0aGVtIHdpdGhcbiAgICAgKiBkb3dubGV2ZWxlZCBzdGF0aWMgcHJvcGVydGllcy4gQWxzbyBjb2xsZWN0cyBjb25zdHJ1Y3RvciB0eXBlIG1ldGFkYXRhIGZvclxuICAgICAqIGNsYXNzIGRlY2xhcmF0aW9uIHRoYXQgYXJlIGRlY29yYXRlZCB3aXRoIGFuIEFuZ3VsYXIgZGVjb3JhdG9yLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlY29yYXRvckRvd25sZXZlbFZpc2l0b3Iobm9kZTogdHMuTm9kZSk6IHRzLk5vZGUge1xuICAgICAgaWYgKHRzLmlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtQ2xhc3NEZWNsYXJhdGlvbihub2RlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cy52aXNpdEVhY2hDaGlsZChub2RlLCBkZWNvcmF0b3JEb3dubGV2ZWxWaXNpdG9yLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNmOiB0cy5Tb3VyY2VGaWxlKSA9PiB7XG4gICAgICAvLyBEb3dubGV2ZWwgZGVjb3JhdG9ycyBhbmQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzLiBXZSB3aWxsIGtlZXAgdHJhY2sgb2YgYWxsXG4gICAgICAvLyByZWZlcmVuY2VkIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBzbyB0aGF0IHdlIGNhbiBpbnN0cnVjdCBUeXBlU2NyaXB0IHRvXG4gICAgICAvLyBub3QgZWxpZGUgdGhlaXIgaW1wb3J0cyBpZiB0aGV5IHByZXZpb3VzbHkgd2VyZSBvbmx5IHR5cGUtb25seS5cbiAgICAgIHJldHVybiB0cy52aXNpdEVhY2hDaGlsZChzZiwgZGVjb3JhdG9yRG93bmxldmVsVmlzaXRvciwgY29udGV4dCk7XG4gICAgfTtcbiAgfTtcbn1cbiJdfQ==
@@ -16,9 +16,10 @@
16
16
  })(function (require, exports) {
17
17
  "use strict";
18
18
  Object.defineProperty(exports, "__esModule", { value: true });
19
- exports.isAliasImportDeclaration = exports.patchAliasReferenceResolutionOrDie = void 0;
19
+ exports.isAliasImportDeclaration = exports.loadIsReferencedAliasDeclarationPatch = void 0;
20
20
  var tslib_1 = require("tslib");
21
21
  var ts = require("typescript");
22
+ var patchedReferencedAliasesSymbol = Symbol('patchedReferencedAliases');
22
23
  /**
23
24
  * Patches the alias declaration reference resolution for a given transformation context
24
25
  * so that TypeScript knows about the specified alias declarations being referenced.
@@ -37,10 +38,10 @@
37
38
  * This is a trick the CLI used in the past for constructor parameter downleveling in JIT:
38
39
  * https://github.com/angular/angular-cli/blob/b3f84cc5184337666ce61c07b7b9df418030106f/packages/ngtools/webpack/src/transformers/ctor-parameters.ts#L323-L325
39
40
  * The trick is not ideal though as it preserves the full import (as outlined before), and it
40
- * results in a slow-down due to the type checker being involved multiple times. The CLI
41
- * worked around this import preserving issue by having another complex post-process step that
42
- * detects and elides unused imports. Note that these unused imports could cause unused chunks
43
- * being generated by Webpack if the application or library is not marked as side-effect free.
41
+ * results in a slow-down due to the type checker being involved multiple times. The CLI worked
42
+ * around this import preserving issue by having another complex post-process step that detects and
43
+ * elides unused imports. Note that these unused imports could cause unused chunks being generated
44
+ * by Webpack if the application or library is not marked as side-effect free.
44
45
  *
45
46
  * This is not ideal though, as we basically re-implement the complex import usage resolution
46
47
  * from TypeScript. We can do better by letting TypeScript do the import eliding, but providing
@@ -57,25 +58,35 @@
57
58
  * `emitDecoratorMetadata` flag is enabled. TypeScript basically surfaces the same problem and
58
59
  * solves it conceptually the same way, but obviously doesn't need to access an `@internal` API.
59
60
  *
61
+ * The set that is returned by this function is meant to be filled with import declaration nodes
62
+ * that have been referenced in a value-position by the transform, such the installed patch can
63
+ * ensure that those import declarations are not elided.
64
+ *
60
65
  * See below. Note that this uses sourcegraph as the TypeScript checker file doesn't display on
61
66
  * Github.
62
67
  * https://sourcegraph.com/github.com/microsoft/TypeScript@3eaa7c65f6f076a08a5f7f1946fd0df7c7430259/-/blob/src/compiler/checker.ts#L31219-31257
63
68
  */
64
- function patchAliasReferenceResolutionOrDie(context, referencedAliases) {
69
+ function loadIsReferencedAliasDeclarationPatch(context) {
65
70
  // If the `getEmitResolver` method is not available, TS most likely changed the
66
71
  // internal structure of the transformation context. We will abort gracefully.
67
72
  if (!isTransformationContextWithEmitResolver(context)) {
68
73
  throwIncompatibleTransformationContextError();
69
- return;
70
74
  }
71
75
  var emitResolver = context.getEmitResolver();
72
- var originalReferenceResolution = emitResolver.isReferencedAliasDeclaration;
76
+ // The emit resolver may have been patched already, in which case we return the set of referenced
77
+ // aliases that was created when the patch was first applied.
78
+ // See https://github.com/angular/angular/issues/40276.
79
+ var existingReferencedAliases = emitResolver[patchedReferencedAliasesSymbol];
80
+ if (existingReferencedAliases !== undefined) {
81
+ return existingReferencedAliases;
82
+ }
83
+ var originalIsReferencedAliasDeclaration = emitResolver.isReferencedAliasDeclaration;
73
84
  // If the emit resolver does not have a function called `isReferencedAliasDeclaration`, then
74
85
  // we abort gracefully as most likely TS changed the internal structure of the emit resolver.
75
- if (originalReferenceResolution === undefined) {
86
+ if (originalIsReferencedAliasDeclaration === undefined) {
76
87
  throwIncompatibleTransformationContextError();
77
- return;
78
88
  }
89
+ var referencedAliases = new Set();
79
90
  emitResolver.isReferencedAliasDeclaration = function (node) {
80
91
  var args = [];
81
92
  for (var _i = 1; _i < arguments.length; _i++) {
@@ -84,10 +95,11 @@
84
95
  if (isAliasImportDeclaration(node) && referencedAliases.has(node)) {
85
96
  return true;
86
97
  }
87
- return originalReferenceResolution.call.apply(originalReferenceResolution, tslib_1.__spread([emitResolver, node], args));
98
+ return originalIsReferencedAliasDeclaration.call.apply(originalIsReferencedAliasDeclaration, tslib_1.__spread([emitResolver, node], args));
88
99
  };
100
+ return emitResolver[patchedReferencedAliasesSymbol] = referencedAliases;
89
101
  }
90
- exports.patchAliasReferenceResolutionOrDie = patchAliasReferenceResolutionOrDie;
102
+ exports.loadIsReferencedAliasDeclarationPatch = loadIsReferencedAliasDeclarationPatch;
91
103
  /**
92
104
  * Gets whether a given node corresponds to an import alias declaration. Alias
93
105
  * declarations can be import specifiers, namespace imports or import clauses
@@ -114,4 +126,4 @@
114
126
  'surfaces and you are using a supposedly compatible TypeScript version.');
115
127
  }
116
128
  });
117
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0Y2hfYWxpYXNfcmVmZXJlbmNlX3Jlc29sdXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci1jbGkvc3JjL3RyYW5zZm9ybWVycy9wYXRjaF9hbGlhc19yZWZlcmVuY2VfcmVzb2x1dGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7O0lBRUgsK0JBQWlDO0lBZ0JqQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F5Q0c7SUFDSCxTQUFnQixrQ0FBa0MsQ0FDOUMsT0FBaUMsRUFBRSxpQkFBc0M7UUFDM0UsK0VBQStFO1FBQy9FLDhFQUE4RTtRQUM5RSxJQUFJLENBQUMsdUNBQXVDLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDckQsMkNBQTJDLEVBQUUsQ0FBQztZQUM5QyxPQUFPO1NBQ1I7UUFDRCxJQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDL0MsSUFBTSwyQkFBMkIsR0FBRyxZQUFZLENBQUMsNEJBQTRCLENBQUM7UUFDOUUsNEZBQTRGO1FBQzVGLDZGQUE2RjtRQUM3RixJQUFJLDJCQUEyQixLQUFLLFNBQVMsRUFBRTtZQUM3QywyQ0FBMkMsRUFBRSxDQUFDO1lBQzlDLE9BQU87U0FDUjtRQUNELFlBQVksQ0FBQyw0QkFBNEIsR0FBRyxVQUFTLElBQUk7WUFBRSxjQUFPO2lCQUFQLFVBQU8sRUFBUCxxQkFBTyxFQUFQLElBQU87Z0JBQVAsNkJBQU87O1lBQ2hFLElBQUksd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNqRSxPQUFPLElBQUksQ0FBQzthQUNiO1lBQ0QsT0FBTywyQkFBMkIsQ0FBQyxJQUFJLE9BQWhDLDJCQUEyQixvQkFBTSxZQUFZLEVBQUUsSUFBSSxHQUFLLElBQUksR0FBRTtRQUN2RSxDQUFDLENBQUM7SUFDSixDQUFDO0lBdEJELGdGQXNCQztJQUVEOzs7O09BSUc7SUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxJQUFhO1FBRXBELE9BQU8sRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFIRCw0REFHQztJQUVELG9FQUFvRTtJQUNwRSxTQUFTLHVDQUF1QyxDQUFDLE9BQWlDO1FBRWhGLE9BQVEsT0FBc0QsQ0FBQyxlQUFlLEtBQUssU0FBUyxDQUFDO0lBQy9GLENBQUM7SUFHRDs7OztPQUlHO0lBQ0gsU0FBUywyQ0FBMkM7UUFDbEQsTUFBTSxLQUFLLENBQ1AsMkVBQTJFO1lBQzNFLHFGQUFxRjtZQUNyRixrQkFBa0I7WUFDbEIscUVBQXFFO1lBQ3JFLHdFQUF3RSxDQUFDLENBQUM7SUFDaEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuLyoqXG4gKiBEZXNjcmliZXMgYSBUeXBlU2NyaXB0IHRyYW5zZm9ybWF0aW9uIGNvbnRleHQgd2l0aCB0aGUgaW50ZXJuYWwgZW1pdFxuICogcmVzb2x2ZXIgZXhwb3NlZC4gVGhlcmUgYXJlIHJlcXVlc3RzIHVwc3RyZWFtIGluIFR5cGVTY3JpcHQgdG8gZXhwb3NlXG4gKiB0aGF0IGFzIHB1YmxpYyBBUEk6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTc1MTYuLlxuICovXG5pbnRlcmZhY2UgVHJhbnNmb3JtYXRpb25Db250ZXh0V2l0aFJlc29sdmVyIGV4dGVuZHMgdHMuVHJhbnNmb3JtYXRpb25Db250ZXh0IHtcbiAgZ2V0RW1pdFJlc29sdmVyOiAoKSA9PiBFbWl0UmVzb2x2ZXI7XG59XG5cbi8qKiBEZXNjcmliZXMgYSBzdWJzZXQgb2YgdGhlIFR5cGVTY3JpcHQgaW50ZXJuYWwgZW1pdCByZXNvbHZlci4gKi9cbmludGVyZmFjZSBFbWl0UmVzb2x2ZXIge1xuICBpc1JlZmVyZW5jZWRBbGlhc0RlY2xhcmF0aW9uPyhub2RlOiB0cy5Ob2RlLCBjaGVja0NoaWxkcmVuPzogYm9vbGVhbik6IHZvaWQ7XG59XG5cbi8qKlxuICogUGF0Y2hlcyB0aGUgYWxpYXMgZGVjbGFyYXRpb24gcmVmZXJlbmNlIHJlc29sdXRpb24gZm9yIGEgZ2l2ZW4gdHJhbnNmb3JtYXRpb24gY29udGV4dFxuICogc28gdGhhdCBUeXBlU2NyaXB0IGtub3dzIGFib3V0IHRoZSBzcGVjaWZpZWQgYWxpYXMgZGVjbGFyYXRpb25zIGJlaW5nIHJlZmVyZW5jZWQuXG4gKlxuICogVGhpcyBleGlzdHMgYmVjYXVzZSBUeXBlU2NyaXB0IHBlcmZvcm1zIGFuYWx5c2lzIG9mIGltcG9ydCB1c2FnZSBiZWZvcmUgdHJhbnNmb3JtZXJzXG4gKiBydW4gYW5kIGRvZXNuJ3QgcmVmcmVzaCBpdHMgc3RhdGUgYWZ0ZXIgdHJhbnNmb3JtYXRpb25zLiBUaGlzIG1lYW5zIHRoYXQgaW1wb3J0c1xuICogZm9yIHN5bWJvbHMgdXNlZCBhcyBjb25zdHJ1Y3RvciB0eXBlcyBhcmUgZWxpZGVkIGR1ZSB0byB0aGVpciBvcmlnaW5hbCB0eXBlLW9ubHkgdXNhZ2UuXG4gKlxuICogSW4gcmVhbGl0eSB0aG91Z2gsIHNpbmNlIHdlIGRvd25sZXZlbCBkZWNvcmF0b3JzIGFuZCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLCB3ZSB3YW50XG4gKiB0aGVzZSBzeW1ib2xzIHRvIGJlIHJldGFpbmVkIGluIHRoZSBKYXZhU2NyaXB0IG91dHB1dCBhcyB0aGV5IHdpbGwgYmUgdXNlZCBhcyB2YWx1ZXNcbiAqIGF0IHJ1bnRpbWUuIFdlIGNhbiBpbnN0cnVjdCBUeXBlU2NyaXB0IHRvIHByZXNlcnZlIGltcG9ydHMgZm9yIHN1Y2ggaWRlbnRpZmllcnMgYnlcbiAqIGNyZWF0aW5nIGEgbXV0YWJsZSBjbG9uZSBvZiBhIGdpdmVuIGltcG9ydCBzcGVjaWZpZXIvY2xhdXNlIG9yIG5hbWVzcGFjZSwgYnV0IHRoYXRcbiAqIGhhcyB0aGUgZG93bnNpZGUgb2YgcHJlc2VydmluZyB0aGUgZnVsbCBpbXBvcnQgaW4gdGhlIEpTIG91dHB1dC4gU2VlOlxuICogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2Jsb2IvM2VhYTdjNjVmNmYwNzZhMDhhNWY3ZjE5NDZmZDBkZjdjNzQzMDI1OS9zcmMvY29tcGlsZXIvdHJhbnNmb3JtZXJzL3RzLnRzI0wyNDItTDI1MC5cbiAqXG4gKiBUaGlzIGlzIGEgdHJpY2sgdGhlIENMSSB1c2VkIGluIHRoZSBwYXN0ICBmb3IgY29uc3RydWN0b3IgcGFyYW1ldGVyIGRvd25sZXZlbGluZyBpbiBKSVQ6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLWNsaS9ibG9iL2IzZjg0Y2M1MTg0MzM3NjY2Y2U2MWMwN2I3YjlkZjQxODAzMDEwNmYvcGFja2FnZXMvbmd0b29scy93ZWJwYWNrL3NyYy90cmFuc2Zvcm1lcnMvY3Rvci1wYXJhbWV0ZXJzLnRzI0wzMjMtTDMyNVxuICogVGhlIHRyaWNrIGlzIG5vdCBpZGVhbCB0aG91Z2ggYXMgaXQgcHJlc2VydmVzIHRoZSBmdWxsIGltcG9ydCAoYXMgb3V0bGluZWQgYmVmb3JlKSwgYW5kIGl0XG4gKiByZXN1bHRzIGluIGEgc2xvdy1kb3duIGR1ZSB0byB0aGUgdHlwZSBjaGVja2VyIGJlaW5nIGludm9sdmVkIG11bHRpcGxlIHRpbWVzLiBUaGUgQ0xJXG4gKiB3b3JrZWQgYXJvdW5kIHRoaXMgaW1wb3J0IHByZXNlcnZpbmcgaXNzdWUgYnkgaGF2aW5nIGFub3RoZXIgY29tcGxleCBwb3N0LXByb2Nlc3Mgc3RlcCB0aGF0XG4gKiBkZXRlY3RzIGFuZCBlbGlkZXMgdW51c2VkIGltcG9ydHMuIE5vdGUgdGhhdCB0aGVzZSB1bnVzZWQgaW1wb3J0cyBjb3VsZCBjYXVzZSB1bnVzZWQgY2h1bmtzXG4gKiBiZWluZyBnZW5lcmF0ZWQgYnkgV2VicGFjayBpZiB0aGUgYXBwbGljYXRpb24gb3IgbGlicmFyeSBpcyBub3QgbWFya2VkIGFzIHNpZGUtZWZmZWN0IGZyZWUuXG4gKlxuICogVGhpcyBpcyBub3QgaWRlYWwgdGhvdWdoLCBhcyB3ZSBiYXNpY2FsbHkgcmUtaW1wbGVtZW50IHRoZSBjb21wbGV4IGltcG9ydCB1c2FnZSByZXNvbHV0aW9uXG4gKiBmcm9tIFR5cGVTY3JpcHQuIFdlIGNhbiBkbyBiZXR0ZXIgYnkgbGV0dGluZyBUeXBlU2NyaXB0IGRvIHRoZSBpbXBvcnQgZWxpZGluZywgYnV0IHByb3ZpZGluZ1xuICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFsaWFzIGRlY2xhcmF0aW9ucyAoZS5nLiBpbXBvcnQgc3BlY2lmaWVycykgdGhhdCBzaG91bGQgbm90IGJlIGVsaWRlZFxuICogYmVjYXVzZSB0aGV5IGFyZSBhY3R1YWxseSByZWZlcmVuY2VkIChhcyB0aGV5IHdpbGwgbm93IGFwcGVhciBpbiBzdGF0aWMgcHJvcGVydGllcykuXG4gKlxuICogTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBsaW1pdGF0aW9ucyB3aXRoIHRyYW5zZm9ybWVycyBjYW4gYmUgZm91bmQgaW46XG4gKiAgIDEuIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTc1NTIuXG4gKiAgIDIuIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTc1MTYuXG4gKiAgIDMuIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3RzaWNrbGUvaXNzdWVzLzYzNS5cbiAqXG4gKiBUaGUgcGF0Y2ggd2UgYXBwbHkgdG8gdGVsbCBUeXBlU2NyaXB0IGFib3V0IGFjdHVhbCByZWZlcmVuY2VkIGFsaWFzZXMgKGkuZS4gaW1wb3J0ZWQgc3ltYm9scyksXG4gKiBtYXRjaGVzIGNvbmNlcHR1YWxseSB3aXRoIHRoZSBsb2dpYyB0aGF0IHJ1bnMgaW50ZXJuYWxseSBpbiBUeXBlU2NyaXB0IHdoZW4gdGhlXG4gKiBgZW1pdERlY29yYXRvck1ldGFkYXRhYCBmbGFnIGlzIGVuYWJsZWQuIFR5cGVTY3JpcHQgYmFzaWNhbGx5IHN1cmZhY2VzIHRoZSBzYW1lIHByb2JsZW0gYW5kXG4gKiBzb2x2ZXMgaXQgY29uY2VwdHVhbGx5IHRoZSBzYW1lIHdheSwgYnV0IG9idmlvdXNseSBkb2Vzbid0IG5lZWQgdG8gYWNjZXNzIGFuIGBAaW50ZXJuYWxgIEFQSS5cbiAqXG4gKiBTZWUgYmVsb3cuIE5vdGUgdGhhdCB0aGlzIHVzZXMgc291cmNlZ3JhcGggYXMgdGhlIFR5cGVTY3JpcHQgY2hlY2tlciBmaWxlIGRvZXNuJ3QgZGlzcGxheSBvblxuICogR2l0aHViLlxuICogaHR0cHM6Ly9zb3VyY2VncmFwaC5jb20vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdEAzZWFhN2M2NWY2ZjA3NmEwOGE1ZjdmMTk0NmZkMGRmN2M3NDMwMjU5Ly0vYmxvYi9zcmMvY29tcGlsZXIvY2hlY2tlci50cyNMMzEyMTktMzEyNTdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoQWxpYXNSZWZlcmVuY2VSZXNvbHV0aW9uT3JEaWUoXG4gICAgY29udGV4dDogdHMuVHJhbnNmb3JtYXRpb25Db250ZXh0LCByZWZlcmVuY2VkQWxpYXNlczogU2V0PHRzLkRlY2xhcmF0aW9uPik6IHZvaWQge1xuICAvLyBJZiB0aGUgYGdldEVtaXRSZXNvbHZlcmAgbWV0aG9kIGlzIG5vdCBhdmFpbGFibGUsIFRTIG1vc3QgbGlrZWx5IGNoYW5nZWQgdGhlXG4gIC8vIGludGVybmFsIHN0cnVjdHVyZSBvZiB0aGUgdHJhbnNmb3JtYXRpb24gY29udGV4dC4gV2Ugd2lsbCBhYm9ydCBncmFjZWZ1bGx5LlxuICBpZiAoIWlzVHJhbnNmb3JtYXRpb25Db250ZXh0V2l0aEVtaXRSZXNvbHZlcihjb250ZXh0KSkge1xuICAgIHRocm93SW5jb21wYXRpYmxlVHJhbnNmb3JtYXRpb25Db250ZXh0RXJyb3IoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZW1pdFJlc29sdmVyID0gY29udGV4dC5nZXRFbWl0UmVzb2x2ZXIoKTtcbiAgY29uc3Qgb3JpZ2luYWxSZWZlcmVuY2VSZXNvbHV0aW9uID0gZW1pdFJlc29sdmVyLmlzUmVmZXJlbmNlZEFsaWFzRGVjbGFyYXRpb247XG4gIC8vIElmIHRoZSBlbWl0IHJlc29sdmVyIGRvZXMgbm90IGhhdmUgYSBmdW5jdGlvbiBjYWxsZWQgYGlzUmVmZXJlbmNlZEFsaWFzRGVjbGFyYXRpb25gLCB0aGVuXG4gIC8vIHdlIGFib3J0IGdyYWNlZnVsbHkgYXMgbW9zdCBsaWtlbHkgVFMgY2hhbmdlZCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIG9mIHRoZSBlbWl0IHJlc29sdmVyLlxuICBpZiAob3JpZ2luYWxSZWZlcmVuY2VSZXNvbHV0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvd0luY29tcGF0aWJsZVRyYW5zZm9ybWF0aW9uQ29udGV4dEVycm9yKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGVtaXRSZXNvbHZlci5pc1JlZmVyZW5jZWRBbGlhc0RlY2xhcmF0aW9uID0gZnVuY3Rpb24obm9kZSwgLi4uYXJncykge1xuICAgIGlmIChpc0FsaWFzSW1wb3J0RGVjbGFyYXRpb24obm9kZSkgJiYgcmVmZXJlbmNlZEFsaWFzZXMuaGFzKG5vZGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG9yaWdpbmFsUmVmZXJlbmNlUmVzb2x1dGlvbi5jYWxsKGVtaXRSZXNvbHZlciwgbm9kZSwgLi4uYXJncyk7XG4gIH07XG59XG5cbi8qKlxuICogR2V0cyB3aGV0aGVyIGEgZ2l2ZW4gbm9kZSBjb3JyZXNwb25kcyB0byBhbiBpbXBvcnQgYWxpYXMgZGVjbGFyYXRpb24uIEFsaWFzXG4gKiBkZWNsYXJhdGlvbnMgY2FuIGJlIGltcG9ydCBzcGVjaWZpZXJzLCBuYW1lc3BhY2UgaW1wb3J0cyBvciBpbXBvcnQgY2xhdXNlc1xuICogYXMgdGhlc2UgZG8gbm90IGRlY2xhcmUgYW4gYWN0dWFsIHN5bWJvbCBidXQganVzdCBwb2ludCB0byBhIHRhcmdldCBkZWNsYXJhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWxpYXNJbXBvcnREZWNsYXJhdGlvbihub2RlOiB0cy5Ob2RlKTogbm9kZSBpcyB0cy5JbXBvcnRTcGVjaWZpZXJ8XG4gICAgdHMuTmFtZXNwYWNlSW1wb3J0fHRzLkltcG9ydENsYXVzZSB7XG4gIHJldHVybiB0cy5pc0ltcG9ydFNwZWNpZmllcihub2RlKSB8fCB0cy5pc05hbWVzcGFjZUltcG9ydChub2RlKSB8fCB0cy5pc0ltcG9ydENsYXVzZShub2RlKTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHRyYW5zZm9ybWF0aW9uIGNvbnRleHQgZXhwb3NlcyBpdHMgZW1pdCByZXNvbHZlci4gKi9cbmZ1bmN0aW9uIGlzVHJhbnNmb3JtYXRpb25Db250ZXh0V2l0aEVtaXRSZXNvbHZlcihjb250ZXh0OiB0cy5UcmFuc2Zvcm1hdGlvbkNvbnRleHQpOlxuICAgIGNvbnRleHQgaXMgVHJhbnNmb3JtYXRpb25Db250ZXh0V2l0aFJlc29sdmVyIHtcbiAgcmV0dXJuIChjb250ZXh0IGFzIFBhcnRpYWw8VHJhbnNmb3JtYXRpb25Db250ZXh0V2l0aFJlc29sdmVyPikuZ2V0RW1pdFJlc29sdmVyICE9PSB1bmRlZmluZWQ7XG59XG5cblxuLyoqXG4gKiBUaHJvd3MgYW4gZXJyb3IgYWJvdXQgYW4gaW5jb21wYXRpYmxlIFR5cGVTY3JpcHQgdmVyc2lvbiBmb3Igd2hpY2ggdGhlIGFsaWFzXG4gKiBkZWNsYXJhdGlvbiByZWZlcmVuY2UgcmVzb2x1dGlvbiBjb3VsZCBub3QgYmUgbW9ua2V5LXBhdGNoZWQuIFRoZSBlcnJvciB3aWxsXG4gKiBhbHNvIHByb3Bvc2UgcG90ZW50aWFsIHNvbHV0aW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIGJ5IGRldmVsb3BlcnMuXG4gKi9cbmZ1bmN0aW9uIHRocm93SW5jb21wYXRpYmxlVHJhbnNmb3JtYXRpb25Db250ZXh0RXJyb3IoKSB7XG4gIHRocm93IEVycm9yKFxuICAgICAgJ1VuYWJsZSB0byBkb3dubGV2ZWwgQW5ndWxhciBkZWNvcmF0b3JzIGR1ZSB0byBhbiBpbmNvbXBhdGlibGUgVHlwZVNjcmlwdCAnICtcbiAgICAgICd2ZXJzaW9uLlxcbklmIHlvdSByZWNlbnRseSB1cGRhdGVkIFR5cGVTY3JpcHQgYW5kIHRoaXMgaXNzdWUgc3VyZmFjZXMgbm93LCBjb25zaWRlciAnICtcbiAgICAgICdkb3duZ3JhZGluZy5cXG5cXG4nICtcbiAgICAgICdQbGVhc2UgcmVwb3J0IGFuIGlzc3VlIG9uIHRoZSBBbmd1bGFyIHJlcG9zaXRvcmllcyB3aGVuIHRoaXMgaXNzdWUgJyArXG4gICAgICAnc3VyZmFjZXMgYW5kIHlvdSBhcmUgdXNpbmcgYSBzdXBwb3NlZGx5IGNvbXBhdGlibGUgVHlwZVNjcmlwdCB2ZXJzaW9uLicpO1xufVxuIl19
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0Y2hfYWxpYXNfcmVmZXJlbmNlX3Jlc29sdXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci1jbGkvc3JjL3RyYW5zZm9ybWVycy9wYXRjaF9hbGlhc19yZWZlcmVuY2VfcmVzb2x1dGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7O0lBRUgsK0JBQWlDO0lBV2pDLElBQU0sOEJBQThCLEdBQUcsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFRMUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTZDRztJQUNILFNBQWdCLHFDQUFxQyxDQUFDLE9BQWlDO1FBRXJGLCtFQUErRTtRQUMvRSw4RUFBOEU7UUFDOUUsSUFBSSxDQUFDLHVDQUF1QyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3JELDJDQUEyQyxFQUFFLENBQUM7U0FDL0M7UUFDRCxJQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFL0MsaUdBQWlHO1FBQ2pHLDZEQUE2RDtRQUM3RCx1REFBdUQ7UUFDdkQsSUFBTSx5QkFBeUIsR0FBRyxZQUFZLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUMvRSxJQUFJLHlCQUF5QixLQUFLLFNBQVMsRUFBRTtZQUMzQyxPQUFPLHlCQUF5QixDQUFDO1NBQ2xDO1FBRUQsSUFBTSxvQ0FBb0MsR0FBRyxZQUFZLENBQUMsNEJBQTRCLENBQUM7UUFDdkYsNEZBQTRGO1FBQzVGLDZGQUE2RjtRQUM3RixJQUFJLG9DQUFvQyxLQUFLLFNBQVMsRUFBRTtZQUN0RCwyQ0FBMkMsRUFBRSxDQUFDO1NBQy9DO1FBRUQsSUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUNwRCxZQUFZLENBQUMsNEJBQTRCLEdBQUcsVUFBUyxJQUFJO1lBQUUsY0FBTztpQkFBUCxVQUFPLEVBQVAscUJBQU8sRUFBUCxJQUFPO2dCQUFQLDZCQUFPOztZQUNoRSxJQUFJLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFJLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDakUsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUNELE9BQU8sb0NBQW9DLENBQUMsSUFBSSxPQUF6QyxvQ0FBb0Msb0JBQU0sWUFBWSxFQUFFLElBQUksR0FBSyxJQUFJLEdBQUU7UUFDaEYsQ0FBQyxDQUFDO1FBQ0YsT0FBTyxZQUFZLENBQUMsOEJBQThCLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztJQUMxRSxDQUFDO0lBaENELHNGQWdDQztJQUVEOzs7O09BSUc7SUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxJQUFhO1FBRXBELE9BQU8sRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFIRCw0REFHQztJQUVELG9FQUFvRTtJQUNwRSxTQUFTLHVDQUF1QyxDQUFDLE9BQWlDO1FBRWhGLE9BQVEsT0FBc0QsQ0FBQyxlQUFlLEtBQUssU0FBUyxDQUFDO0lBQy9GLENBQUM7SUFHRDs7OztPQUlHO0lBQ0gsU0FBUywyQ0FBMkM7UUFDbEQsTUFBTSxLQUFLLENBQ1AsMkVBQTJFO1lBQzNFLHFGQUFxRjtZQUNyRixrQkFBa0I7WUFDbEIscUVBQXFFO1lBQ3JFLHdFQUF3RSxDQUFDLENBQUM7SUFDaEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuLyoqXG4gKiBEZXNjcmliZXMgYSBUeXBlU2NyaXB0IHRyYW5zZm9ybWF0aW9uIGNvbnRleHQgd2l0aCB0aGUgaW50ZXJuYWwgZW1pdFxuICogcmVzb2x2ZXIgZXhwb3NlZC4gVGhlcmUgYXJlIHJlcXVlc3RzIHVwc3RyZWFtIGluIFR5cGVTY3JpcHQgdG8gZXhwb3NlXG4gKiB0aGF0IGFzIHB1YmxpYyBBUEk6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTc1MTYuLlxuICovXG5pbnRlcmZhY2UgVHJhbnNmb3JtYXRpb25Db250ZXh0V2l0aFJlc29sdmVyIGV4dGVuZHMgdHMuVHJhbnNmb3JtYXRpb25Db250ZXh0IHtcbiAgZ2V0RW1pdFJlc29sdmVyOiAoKSA9PiBFbWl0UmVzb2x2ZXI7XG59XG5cbmNvbnN0IHBhdGNoZWRSZWZlcmVuY2VkQWxpYXNlc1N5bWJvbCA9IFN5bWJvbCgncGF0Y2hlZFJlZmVyZW5jZWRBbGlhc2VzJyk7XG5cbi8qKiBEZXNjcmliZXMgYSBzdWJzZXQgb2YgdGhlIFR5cGVTY3JpcHQgaW50ZXJuYWwgZW1pdCByZXNvbHZlci4gKi9cbmludGVyZmFjZSBFbWl0UmVzb2x2ZXIge1xuICBpc1JlZmVyZW5jZWRBbGlhc0RlY2xhcmF0aW9uPyhub2RlOiB0cy5Ob2RlLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkO1xuICBbcGF0Y2hlZFJlZmVyZW5jZWRBbGlhc2VzU3ltYm9sXT86IFNldDx0cy5EZWNsYXJhdGlvbj47XG59XG5cbi8qKlxuICogUGF0Y2hlcyB0aGUgYWxpYXMgZGVjbGFyYXRpb24gcmVmZXJlbmNlIHJlc29sdXRpb24gZm9yIGEgZ2l2ZW4gdHJhbnNmb3JtYXRpb24gY29udGV4dFxuICogc28gdGhhdCBUeXBlU2NyaXB0IGtub3dzIGFib3V0IHRoZSBzcGVjaWZpZWQgYWxpYXMgZGVjbGFyYXRpb25zIGJlaW5nIHJlZmVyZW5jZWQuXG4gKlxuICogVGhpcyBleGlzdHMgYmVjYXVzZSBUeXBlU2NyaXB0IHBlcmZvcm1zIGFuYWx5c2lzIG9mIGltcG9ydCB1c2FnZSBiZWZvcmUgdHJhbnNmb3JtZXJzXG4gKiBydW4gYW5kIGRvZXNuJ3QgcmVmcmVzaCBpdHMgc3RhdGUgYWZ0ZXIgdHJhbnNmb3JtYXRpb25zLiBUaGlzIG1lYW5zIHRoYXQgaW1wb3J0c1xuICogZm9yIHN5bWJvbHMgdXNlZCBhcyBjb25zdHJ1Y3RvciB0eXBlcyBhcmUgZWxpZGVkIGR1ZSB0byB0aGVpciBvcmlnaW5hbCB0eXBlLW9ubHkgdXNhZ2UuXG4gKlxuICogSW4gcmVhbGl0eSB0aG91Z2gsIHNpbmNlIHdlIGRvd25sZXZlbCBkZWNvcmF0b3JzIGFuZCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLCB3ZSB3YW50XG4gKiB0aGVzZSBzeW1ib2xzIHRvIGJlIHJldGFpbmVkIGluIHRoZSBKYXZhU2NyaXB0IG91dHB1dCBhcyB0aGV5IHdpbGwgYmUgdXNlZCBhcyB2YWx1ZXNcbiAqIGF0IHJ1bnRpbWUuIFdlIGNhbiBpbnN0cnVjdCBUeXBlU2NyaXB0IHRvIHByZXNlcnZlIGltcG9ydHMgZm9yIHN1Y2ggaWRlbnRpZmllcnMgYnlcbiAqIGNyZWF0aW5nIGEgbXV0YWJsZSBjbG9uZSBvZiBhIGdpdmVuIGltcG9ydCBzcGVjaWZpZXIvY2xhdXNlIG9yIG5hbWVzcGFjZSwgYnV0IHRoYXRcbiAqIGhhcyB0aGUgZG93bnNpZGUgb2YgcHJlc2VydmluZyB0aGUgZnVsbCBpbXBvcnQgaW4gdGhlIEpTIG91dHB1dC4gU2VlOlxuICogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2Jsb2IvM2VhYTdjNjVmNmYwNzZhMDhhNWY3ZjE5NDZmZDBkZjdjNzQzMDI1OS9zcmMvY29tcGlsZXIvdHJhbnNmb3JtZXJzL3RzLnRzI0wyNDItTDI1MC5cbiAqXG4gKiBUaGlzIGlzIGEgdHJpY2sgdGhlIENMSSB1c2VkIGluIHRoZSBwYXN0ICBmb3IgY29uc3RydWN0b3IgcGFyYW1ldGVyIGRvd25sZXZlbGluZyBpbiBKSVQ6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLWNsaS9ibG9iL2IzZjg0Y2M1MTg0MzM3NjY2Y2U2MWMwN2I3YjlkZjQxODAzMDEwNmYvcGFja2FnZXMvbmd0b29scy93ZWJwYWNrL3NyYy90cmFuc2Zvcm1lcnMvY3Rvci1wYXJhbWV0ZXJzLnRzI0wzMjMtTDMyNVxuICogVGhlIHRyaWNrIGlzIG5vdCBpZGVhbCB0aG91Z2ggYXMgaXQgcHJlc2VydmVzIHRoZSBmdWxsIGltcG9ydCAoYXMgb3V0bGluZWQgYmVmb3JlKSwgYW5kIGl0XG4gKiByZXN1bHRzIGluIGEgc2xvdy1kb3duIGR1ZSB0byB0aGUgdHlwZSBjaGVja2VyIGJlaW5nIGludm9sdmVkIG11bHRpcGxlIHRpbWVzLiBUaGUgQ0xJIHdvcmtlZFxuICogYXJvdW5kIHRoaXMgaW1wb3J0IHByZXNlcnZpbmcgaXNzdWUgYnkgaGF2aW5nIGFub3RoZXIgY29tcGxleCBwb3N0LXByb2Nlc3Mgc3RlcCB0aGF0IGRldGVjdHMgYW5kXG4gKiBlbGlkZXMgdW51c2VkIGltcG9ydHMuIE5vdGUgdGhhdCB0aGVzZSB1bnVzZWQgaW1wb3J0cyBjb3VsZCBjYXVzZSB1bnVzZWQgY2h1bmtzIGJlaW5nIGdlbmVyYXRlZFxuICogYnkgV2VicGFjayBpZiB0aGUgYXBwbGljYXRpb24gb3IgbGlicmFyeSBpcyBub3QgbWFya2VkIGFzIHNpZGUtZWZmZWN0IGZyZWUuXG4gKlxuICogVGhpcyBpcyBub3QgaWRlYWwgdGhvdWdoLCBhcyB3ZSBiYXNpY2FsbHkgcmUtaW1wbGVtZW50IHRoZSBjb21wbGV4IGltcG9ydCB1c2FnZSByZXNvbHV0aW9uXG4gKiBmcm9tIFR5cGVTY3JpcHQuIFdlIGNhbiBkbyBiZXR0ZXIgYnkgbGV0dGluZyBUeXBlU2NyaXB0IGRvIHRoZSBpbXBvcnQgZWxpZGluZywgYnV0IHByb3ZpZGluZ1xuICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFsaWFzIGRlY2xhcmF0aW9ucyAoZS5nLiBpbXBvcnQgc3BlY2lmaWVycykgdGhhdCBzaG91bGQgbm90IGJlIGVsaWRlZFxuICogYmVjYXVzZSB0aGV5IGFyZSBhY3R1YWxseSByZWZlcmVuY2VkIChhcyB0aGV5IHdpbGwgbm93IGFwcGVhciBpbiBzdGF0aWMgcHJvcGVydGllcykuXG4gKlxuICogTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBsaW1pdGF0aW9ucyB3aXRoIHRyYW5zZm9ybWVycyBjYW4gYmUgZm91bmQgaW46XG4gKiAgIDEuIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTc1NTIuXG4gKiAgIDIuIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTc1MTYuXG4gKiAgIDMuIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3RzaWNrbGUvaXNzdWVzLzYzNS5cbiAqXG4gKiBUaGUgcGF0Y2ggd2UgYXBwbHkgdG8gdGVsbCBUeXBlU2NyaXB0IGFib3V0IGFjdHVhbCByZWZlcmVuY2VkIGFsaWFzZXMgKGkuZS4gaW1wb3J0ZWQgc3ltYm9scyksXG4gKiBtYXRjaGVzIGNvbmNlcHR1YWxseSB3aXRoIHRoZSBsb2dpYyB0aGF0IHJ1bnMgaW50ZXJuYWxseSBpbiBUeXBlU2NyaXB0IHdoZW4gdGhlXG4gKiBgZW1pdERlY29yYXRvck1ldGFkYXRhYCBmbGFnIGlzIGVuYWJsZWQuIFR5cGVTY3JpcHQgYmFzaWNhbGx5IHN1cmZhY2VzIHRoZSBzYW1lIHByb2JsZW0gYW5kXG4gKiBzb2x2ZXMgaXQgY29uY2VwdHVhbGx5IHRoZSBzYW1lIHdheSwgYnV0IG9idmlvdXNseSBkb2Vzbid0IG5lZWQgdG8gYWNjZXNzIGFuIGBAaW50ZXJuYWxgIEFQSS5cbiAqXG4gKiBUaGUgc2V0IHRoYXQgaXMgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBmaWxsZWQgd2l0aCBpbXBvcnQgZGVjbGFyYXRpb24gbm9kZXNcbiAqIHRoYXQgaGF2ZSBiZWVuIHJlZmVyZW5jZWQgaW4gYSB2YWx1ZS1wb3NpdGlvbiBieSB0aGUgdHJhbnNmb3JtLCBzdWNoIHRoZSBpbnN0YWxsZWQgcGF0Y2ggY2FuXG4gKiBlbnN1cmUgdGhhdCB0aG9zZSBpbXBvcnQgZGVjbGFyYXRpb25zIGFyZSBub3QgZWxpZGVkLlxuICpcbiAqIFNlZSBiZWxvdy4gTm90ZSB0aGF0IHRoaXMgdXNlcyBzb3VyY2VncmFwaCBhcyB0aGUgVHlwZVNjcmlwdCBjaGVja2VyIGZpbGUgZG9lc24ndCBkaXNwbGF5IG9uXG4gKiBHaXRodWIuXG4gKiBodHRwczovL3NvdXJjZWdyYXBoLmNvbS9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0QDNlYWE3YzY1ZjZmMDc2YTA4YTVmN2YxOTQ2ZmQwZGY3Yzc0MzAyNTkvLS9ibG9iL3NyYy9jb21waWxlci9jaGVja2VyLnRzI0wzMTIxOS0zMTI1N1xuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZElzUmVmZXJlbmNlZEFsaWFzRGVjbGFyYXRpb25QYXRjaChjb250ZXh0OiB0cy5UcmFuc2Zvcm1hdGlvbkNvbnRleHQpOlxuICAgIFNldDx0cy5EZWNsYXJhdGlvbj4ge1xuICAvLyBJZiB0aGUgYGdldEVtaXRSZXNvbHZlcmAgbWV0aG9kIGlzIG5vdCBhdmFpbGFibGUsIFRTIG1vc3QgbGlrZWx5IGNoYW5nZWQgdGhlXG4gIC8vIGludGVybmFsIHN0cnVjdHVyZSBvZiB0aGUgdHJhbnNmb3JtYXRpb24gY29udGV4dC4gV2Ugd2lsbCBhYm9ydCBncmFjZWZ1bGx5LlxuICBpZiAoIWlzVHJhbnNmb3JtYXRpb25Db250ZXh0V2l0aEVtaXRSZXNvbHZlcihjb250ZXh0KSkge1xuICAgIHRocm93SW5jb21wYXRpYmxlVHJhbnNmb3JtYXRpb25Db250ZXh0RXJyb3IoKTtcbiAgfVxuICBjb25zdCBlbWl0UmVzb2x2ZXIgPSBjb250ZXh0LmdldEVtaXRSZXNvbHZlcigpO1xuXG4gIC8vIFRoZSBlbWl0IHJlc29sdmVyIG1heSBoYXZlIGJlZW4gcGF0Y2hlZCBhbHJlYWR5LCBpbiB3aGljaCBjYXNlIHdlIHJldHVybiB0aGUgc2V0IG9mIHJlZmVyZW5jZWRcbiAgLy8gYWxpYXNlcyB0aGF0IHdhcyBjcmVhdGVkIHdoZW4gdGhlIHBhdGNoIHdhcyBmaXJzdCBhcHBsaWVkLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvNDAyNzYuXG4gIGNvbnN0IGV4aXN0aW5nUmVmZXJlbmNlZEFsaWFzZXMgPSBlbWl0UmVzb2x2ZXJbcGF0Y2hlZFJlZmVyZW5jZWRBbGlhc2VzU3ltYm9sXTtcbiAgaWYgKGV4aXN0aW5nUmVmZXJlbmNlZEFsaWFzZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBleGlzdGluZ1JlZmVyZW5jZWRBbGlhc2VzO1xuICB9XG5cbiAgY29uc3Qgb3JpZ2luYWxJc1JlZmVyZW5jZWRBbGlhc0RlY2xhcmF0aW9uID0gZW1pdFJlc29sdmVyLmlzUmVmZXJlbmNlZEFsaWFzRGVjbGFyYXRpb247XG4gIC8vIElmIHRoZSBlbWl0IHJlc29sdmVyIGRvZXMgbm90IGhhdmUgYSBmdW5jdGlvbiBjYWxsZWQgYGlzUmVmZXJlbmNlZEFsaWFzRGVjbGFyYXRpb25gLCB0aGVuXG4gIC8vIHdlIGFib3J0IGdyYWNlZnVsbHkgYXMgbW9zdCBsaWtlbHkgVFMgY2hhbmdlZCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIG9mIHRoZSBlbWl0IHJlc29sdmVyLlxuICBpZiAob3JpZ2luYWxJc1JlZmVyZW5jZWRBbGlhc0RlY2xhcmF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvd0luY29tcGF0aWJsZVRyYW5zZm9ybWF0aW9uQ29udGV4dEVycm9yKCk7XG4gIH1cblxuICBjb25zdCByZWZlcmVuY2VkQWxpYXNlcyA9IG5ldyBTZXQ8dHMuRGVjbGFyYXRpb24+KCk7XG4gIGVtaXRSZXNvbHZlci5pc1JlZmVyZW5jZWRBbGlhc0RlY2xhcmF0aW9uID0gZnVuY3Rpb24obm9kZSwgLi4uYXJncykge1xuICAgIGlmIChpc0FsaWFzSW1wb3J0RGVjbGFyYXRpb24obm9kZSkgJiYgcmVmZXJlbmNlZEFsaWFzZXMuaGFzKG5vZGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG9yaWdpbmFsSXNSZWZlcmVuY2VkQWxpYXNEZWNsYXJhdGlvbi5jYWxsKGVtaXRSZXNvbHZlciwgbm9kZSwgLi4uYXJncyk7XG4gIH07XG4gIHJldHVybiBlbWl0UmVzb2x2ZXJbcGF0Y2hlZFJlZmVyZW5jZWRBbGlhc2VzU3ltYm9sXSA9IHJlZmVyZW5jZWRBbGlhc2VzO1xufVxuXG4vKipcbiAqIEdldHMgd2hldGhlciBhIGdpdmVuIG5vZGUgY29ycmVzcG9uZHMgdG8gYW4gaW1wb3J0IGFsaWFzIGRlY2xhcmF0aW9uLiBBbGlhc1xuICogZGVjbGFyYXRpb25zIGNhbiBiZSBpbXBvcnQgc3BlY2lmaWVycywgbmFtZXNwYWNlIGltcG9ydHMgb3IgaW1wb3J0IGNsYXVzZXNcbiAqIGFzIHRoZXNlIGRvIG5vdCBkZWNsYXJlIGFuIGFjdHVhbCBzeW1ib2wgYnV0IGp1c3QgcG9pbnQgdG8gYSB0YXJnZXQgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FsaWFzSW1wb3J0RGVjbGFyYXRpb24obm9kZTogdHMuTm9kZSk6IG5vZGUgaXMgdHMuSW1wb3J0U3BlY2lmaWVyfFxuICAgIHRzLk5hbWVzcGFjZUltcG9ydHx0cy5JbXBvcnRDbGF1c2Uge1xuICByZXR1cm4gdHMuaXNJbXBvcnRTcGVjaWZpZXIobm9kZSkgfHwgdHMuaXNOYW1lc3BhY2VJbXBvcnQobm9kZSkgfHwgdHMuaXNJbXBvcnRDbGF1c2Uobm9kZSk7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSB0cmFuc2Zvcm1hdGlvbiBjb250ZXh0IGV4cG9zZXMgaXRzIGVtaXQgcmVzb2x2ZXIuICovXG5mdW5jdGlvbiBpc1RyYW5zZm9ybWF0aW9uQ29udGV4dFdpdGhFbWl0UmVzb2x2ZXIoY29udGV4dDogdHMuVHJhbnNmb3JtYXRpb25Db250ZXh0KTpcbiAgICBjb250ZXh0IGlzIFRyYW5zZm9ybWF0aW9uQ29udGV4dFdpdGhSZXNvbHZlciB7XG4gIHJldHVybiAoY29udGV4dCBhcyBQYXJ0aWFsPFRyYW5zZm9ybWF0aW9uQ29udGV4dFdpdGhSZXNvbHZlcj4pLmdldEVtaXRSZXNvbHZlciAhPT0gdW5kZWZpbmVkO1xufVxuXG5cbi8qKlxuICogVGhyb3dzIGFuIGVycm9yIGFib3V0IGFuIGluY29tcGF0aWJsZSBUeXBlU2NyaXB0IHZlcnNpb24gZm9yIHdoaWNoIHRoZSBhbGlhc1xuICogZGVjbGFyYXRpb24gcmVmZXJlbmNlIHJlc29sdXRpb24gY291bGQgbm90IGJlIG1vbmtleS1wYXRjaGVkLiBUaGUgZXJyb3Igd2lsbFxuICogYWxzbyBwcm9wb3NlIHBvdGVudGlhbCBzb2x1dGlvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCBieSBkZXZlbG9wZXJzLlxuICovXG5mdW5jdGlvbiB0aHJvd0luY29tcGF0aWJsZVRyYW5zZm9ybWF0aW9uQ29udGV4dEVycm9yKCk6IG5ldmVyIHtcbiAgdGhyb3cgRXJyb3IoXG4gICAgICAnVW5hYmxlIHRvIGRvd25sZXZlbCBBbmd1bGFyIGRlY29yYXRvcnMgZHVlIHRvIGFuIGluY29tcGF0aWJsZSBUeXBlU2NyaXB0ICcgK1xuICAgICAgJ3ZlcnNpb24uXFxuSWYgeW91IHJlY2VudGx5IHVwZGF0ZWQgVHlwZVNjcmlwdCBhbmQgdGhpcyBpc3N1ZSBzdXJmYWNlcyBub3csIGNvbnNpZGVyICcgK1xuICAgICAgJ2Rvd25ncmFkaW5nLlxcblxcbicgK1xuICAgICAgJ1BsZWFzZSByZXBvcnQgYW4gaXNzdWUgb24gdGhlIEFuZ3VsYXIgcmVwb3NpdG9yaWVzIHdoZW4gdGhpcyBpc3N1ZSAnICtcbiAgICAgICdzdXJmYWNlcyBhbmQgeW91IGFyZSB1c2luZyBhIHN1cHBvc2VkbHkgY29tcGF0aWJsZSBUeXBlU2NyaXB0IHZlcnNpb24uJyk7XG59XG4iXX0=
package/src/version.js CHANGED
@@ -23,6 +23,6 @@
23
23
  * Entry point for all public APIs of the common package.
24
24
  */
25
25
  var compiler_1 = require("@angular/compiler");
26
- exports.VERSION = new compiler_1.Version('11.1.0-next.4');
26
+ exports.VERSION = new compiler_1.Version('11.1.1');
27
27
  });
28
28
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyLWNsaS9zcmMvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7SUFFSDs7OztPQUlHO0lBRUgsOENBQTBDO0lBRTdCLFFBQUEsT0FBTyxHQUFHLElBQUksa0JBQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8qKlxuICogQG1vZHVsZVxuICogQGRlc2NyaXB0aW9uXG4gKiBFbnRyeSBwb2ludCBmb3IgYWxsIHB1YmxpYyBBUElzIG9mIHRoZSBjb21tb24gcGFja2FnZS5cbiAqL1xuXG5pbXBvcnQge1ZlcnNpb259IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyJztcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBuZXcgVmVyc2lvbignMC4wLjAtUExBQ0VIT0xERVInKTtcbiJdfQ==