@aws-amplify/graphql-api-construct 1.15.1 → 1.16.0-ai-streaming.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. package/.jsii +30 -30
  2. package/CHANGELOG.md +15 -0
  3. package/lib/amplify-dynamodb-table-wrapper.js +1 -1
  4. package/lib/amplify-graphql-api.js +9 -12
  5. package/lib/amplify-graphql-definition.js +1 -1
  6. package/lib/internal/metadata.d.ts +4 -0
  7. package/lib/internal/metadata.js +42 -0
  8. package/lib/sql-model-datasource-strategy.js +1 -1
  9. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/conversation_handler_construct.d.ts +12 -1
  10. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/conversation_handler_construct.js +22 -2
  11. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/index.d.ts +2 -2
  12. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/index.js +1 -1
  13. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/bedrock_converse_adapter.d.ts +8 -2
  14. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/bedrock_converse_adapter.js +196 -34
  15. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/conversation_message_history_retriever.js +34 -8
  16. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/conversation_turn_executor.d.ts +5 -3
  17. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/conversation_turn_executor.js +20 -5
  18. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/conversation_turn_response_sender.d.ts +3 -1
  19. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/conversation_turn_response_sender.js +6 -7
  20. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/conversation_turn_streaming_response_sender.d.ts +22 -0
  21. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/conversation_turn_streaming_response_sender.js +38 -0
  22. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/default_handler.d.ts +1 -1
  23. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/event-tools-provider/event_tools_provider.js +2 -2
  24. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/event-tools-provider/graphql_tool.d.ts +7 -7
  25. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/event-tools-provider/graphql_tool.js +3 -2
  26. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/executable_tool_factory.d.ts +7 -0
  27. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/executable_tool_factory.js +16 -0
  28. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/graphql_request_executor.d.ts +2 -1
  29. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/graphql_request_executor.js +4 -2
  30. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/index.d.ts +3 -2
  31. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/index.js +4 -2
  32. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/types.d.ts +47 -14
  33. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/types.js +1 -1
  34. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/README.md +4 -0
  35. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/ai/conversation/index.d.ts +23 -0
  36. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/ai/conversation/index.js +10 -0
  37. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/ai/conversation/v1.d.ts +22 -0
  38. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/ai/conversation/v1.js +11 -0
  39. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/auth/index.d.ts +113 -0
  40. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/auth/index.js +10 -0
  41. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/auth/v1.d.ts +112 -0
  42. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/auth/v1.js +30 -0
  43. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/custom/index.d.ts +23 -0
  44. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/custom/index.js +10 -0
  45. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/custom/v1.d.ts +22 -0
  46. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/custom/v1.js +11 -0
  47. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/function/index.d.ts +23 -0
  48. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/function/index.js +10 -0
  49. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/function/v1.d.ts +22 -0
  50. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/function/v1.js +11 -0
  51. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/graphql/index.d.ts +59 -0
  52. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/graphql/index.js +12 -0
  53. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/graphql/v1.d.ts +59 -0
  54. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/graphql/v1.js +25 -0
  55. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/index.d.ts +508 -0
  56. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/index.js +112 -0
  57. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/platform/index.d.ts +2 -0
  58. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/platform/index.js +18 -0
  59. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/platform/stack_metadata_schemas.d.ts +42 -0
  60. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/platform/stack_metadata_schemas.js +22 -0
  61. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/stack/index.d.ts +28 -0
  62. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/stack/index.js +10 -0
  63. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/stack/v1.d.ts +27 -0
  64. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/stack/v1.js +12 -0
  65. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/storage/index.d.ts +33 -0
  66. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/storage/index.js +10 -0
  67. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/storage/v1.d.ts +32 -0
  68. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/lib/storage/v1.js +33 -0
  69. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/backend-output-schemas/package.json +27 -0
  70. package/node_modules/@aws-amplify/ai-constructs/package.json +9 -2
  71. package/node_modules/@aws-amplify/graphql-auth-transformer/API.md +0 -2
  72. package/node_modules/@aws-amplify/graphql-auth-transformer/CHANGELOG.md +6 -0
  73. package/node_modules/@aws-amplify/graphql-auth-transformer/lib/graphql-auth-transformer.d.ts +4 -3
  74. package/node_modules/@aws-amplify/graphql-auth-transformer/lib/graphql-auth-transformer.d.ts.map +1 -1
  75. package/node_modules/@aws-amplify/graphql-auth-transformer/lib/graphql-auth-transformer.js +20 -9
  76. package/node_modules/@aws-amplify/graphql-auth-transformer/lib/graphql-auth-transformer.js.map +1 -1
  77. package/node_modules/@aws-amplify/graphql-auth-transformer/lib/utils/schema.d.ts +1 -0
  78. package/node_modules/@aws-amplify/graphql-auth-transformer/lib/utils/schema.d.ts.map +1 -1
  79. package/node_modules/@aws-amplify/graphql-auth-transformer/lib/utils/schema.js +8 -1
  80. package/node_modules/@aws-amplify/graphql-auth-transformer/lib/utils/schema.js.map +1 -1
  81. package/node_modules/@aws-amplify/graphql-auth-transformer/package.json +12 -12
  82. package/node_modules/@aws-amplify/graphql-conversation-transformer/CHANGELOG.md +10 -0
  83. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/graphql-types/message-model.d.ts +3 -0
  84. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/graphql-types/message-model.d.ts.map +1 -1
  85. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/graphql-types/message-model.js +53 -5
  86. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/graphql-types/message-model.js.map +1 -1
  87. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/resolvers/assistant-streaming-mutation-reduce-chunks-resolver-fn.template.js +105 -0
  88. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/resolvers/assistant-streaming-mutation-reduce-chunks-resolver.d.ts +4 -0
  89. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/resolvers/assistant-streaming-mutation-reduce-chunks-resolver.d.ts.map +1 -0
  90. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/resolvers/assistant-streaming-mutation-reduce-chunks-resolver.js +25 -0
  91. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/resolvers/assistant-streaming-mutation-reduce-chunks-resolver.js.map +1 -0
  92. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/resolvers/assistant-streaming-mutation-resolver-fn.template.js +125 -0
  93. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/resolvers/assistant-streaming-mutation-resolver.d.ts +4 -0
  94. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/resolvers/assistant-streaming-mutation-resolver.d.ts.map +1 -0
  95. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/resolvers/assistant-streaming-mutation-resolver.js +25 -0
  96. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/resolvers/assistant-streaming-mutation-resolver.js.map +1 -0
  97. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/resolvers/invoke-lambda-resolver-fn.template.js +14 -1
  98. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/resolvers/invoke-lambda-resolver.d.ts.map +1 -1
  99. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/resolvers/invoke-lambda-resolver.js +8 -1
  100. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/resolvers/invoke-lambda-resolver.js.map +1 -1
  101. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/transformer-steps/conversation-prepare-handler.d.ts.map +1 -1
  102. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/transformer-steps/conversation-prepare-handler.js +3 -2
  103. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/transformer-steps/conversation-prepare-handler.js.map +1 -1
  104. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/transformer-steps/conversation-resolver-generator.d.ts +1 -0
  105. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/transformer-steps/conversation-resolver-generator.d.ts.map +1 -1
  106. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/transformer-steps/conversation-resolver-generator.js +19 -0
  107. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/transformer-steps/conversation-resolver-generator.js.map +1 -1
  108. package/node_modules/@aws-amplify/graphql-conversation-transformer/package.json +10 -10
  109. package/node_modules/@aws-amplify/graphql-default-value-transformer/CHANGELOG.md +4 -0
  110. package/node_modules/@aws-amplify/graphql-default-value-transformer/package.json +7 -7
  111. package/node_modules/@aws-amplify/graphql-directives/CHANGELOG.md +4 -0
  112. package/node_modules/@aws-amplify/graphql-directives/package.json +2 -2
  113. package/node_modules/@aws-amplify/graphql-function-transformer/CHANGELOG.md +4 -0
  114. package/node_modules/@aws-amplify/graphql-function-transformer/package.json +6 -6
  115. package/node_modules/@aws-amplify/graphql-generation-transformer/CHANGELOG.md +4 -0
  116. package/node_modules/@aws-amplify/graphql-generation-transformer/package.json +6 -6
  117. package/node_modules/@aws-amplify/graphql-http-transformer/CHANGELOG.md +4 -0
  118. package/node_modules/@aws-amplify/graphql-http-transformer/package.json +6 -6
  119. package/node_modules/@aws-amplify/graphql-index-transformer/CHANGELOG.md +4 -0
  120. package/node_modules/@aws-amplify/graphql-index-transformer/package.json +7 -7
  121. package/node_modules/@aws-amplify/graphql-maps-to-transformer/CHANGELOG.md +4 -0
  122. package/node_modules/@aws-amplify/graphql-maps-to-transformer/lib/assets/mapping-lambda.zip +0 -0
  123. package/node_modules/@aws-amplify/graphql-maps-to-transformer/package.json +10 -10
  124. package/node_modules/@aws-amplify/graphql-model-transformer/CHANGELOG.md +4 -0
  125. package/node_modules/@aws-amplify/graphql-model-transformer/lib/rds-lambda.zip +0 -0
  126. package/node_modules/@aws-amplify/graphql-model-transformer/lib/rds-notification-lambda.zip +0 -0
  127. package/node_modules/@aws-amplify/graphql-model-transformer/lib/rds-patching-lambda.zip +0 -0
  128. package/node_modules/@aws-amplify/graphql-model-transformer/package.json +6 -6
  129. package/node_modules/@aws-amplify/graphql-predictions-transformer/CHANGELOG.md +4 -0
  130. package/node_modules/@aws-amplify/graphql-predictions-transformer/lib/predictionsLambdaFunction.zip +0 -0
  131. package/node_modules/@aws-amplify/graphql-predictions-transformer/package.json +6 -6
  132. package/node_modules/@aws-amplify/graphql-relational-transformer/CHANGELOG.md +4 -0
  133. package/node_modules/@aws-amplify/graphql-relational-transformer/package.json +8 -8
  134. package/node_modules/@aws-amplify/graphql-searchable-transformer/CHANGELOG.md +4 -0
  135. package/node_modules/@aws-amplify/graphql-searchable-transformer/lib/streaming-lambda.zip +0 -0
  136. package/node_modules/@aws-amplify/graphql-searchable-transformer/package.json +7 -7
  137. package/node_modules/@aws-amplify/graphql-sql-transformer/CHANGELOG.md +4 -0
  138. package/node_modules/@aws-amplify/graphql-sql-transformer/package.json +7 -7
  139. package/node_modules/@aws-amplify/graphql-transformer/CHANGELOG.md +4 -0
  140. package/node_modules/@aws-amplify/graphql-transformer/package.json +17 -17
  141. package/node_modules/@aws-amplify/graphql-transformer-core/API.md +3 -0
  142. package/node_modules/@aws-amplify/graphql-transformer-core/CHANGELOG.md +6 -0
  143. package/node_modules/@aws-amplify/graphql-transformer-core/lib/index.d.ts +1 -1
  144. package/node_modules/@aws-amplify/graphql-transformer-core/lib/index.d.ts.map +1 -1
  145. package/node_modules/@aws-amplify/graphql-transformer-core/lib/index.js +3 -2
  146. package/node_modules/@aws-amplify/graphql-transformer-core/lib/index.js.map +1 -1
  147. package/node_modules/@aws-amplify/graphql-transformer-core/lib/utils/graphql-utils.d.ts +1 -0
  148. package/node_modules/@aws-amplify/graphql-transformer-core/lib/utils/graphql-utils.d.ts.map +1 -1
  149. package/node_modules/@aws-amplify/graphql-transformer-core/lib/utils/graphql-utils.js +6 -1
  150. package/node_modules/@aws-amplify/graphql-transformer-core/lib/utils/graphql-utils.js.map +1 -1
  151. package/node_modules/@aws-amplify/graphql-transformer-core/package.json +4 -4
  152. package/node_modules/graphql-transformer-common/API.md +3 -0
  153. package/node_modules/graphql-transformer-common/CHANGELOG.md +6 -0
  154. package/node_modules/graphql-transformer-common/LICENSE +201 -0
  155. package/node_modules/graphql-transformer-common/lib/definition.d.ts +1 -0
  156. package/node_modules/graphql-transformer-common/lib/definition.d.ts.map +1 -1
  157. package/node_modules/graphql-transformer-common/lib/definition.js +20 -1
  158. package/node_modules/graphql-transformer-common/lib/definition.js.map +1 -1
  159. package/node_modules/graphql-transformer-common/package.json +3 -2
  160. package/package.json +21 -21
  161. package/src/amplify-graphql-api.ts +12 -12
  162. package/src/internal/metadata.ts +40 -0
@@ -11,6 +11,8 @@ const aws_lambda_nodejs_1 = require("aws-cdk-lib/aws-lambda-nodejs");
11
11
  const aws_logs_1 = require("aws-cdk-lib/aws-logs");
12
12
  const constructs_1 = require("constructs");
13
13
  const path_1 = __importDefault(require("path"));
14
+ const platform_core_1 = require("@aws-amplify/platform-core");
15
+ const backend_output_schemas_1 = require("@aws-amplify/backend-output-schemas");
14
16
  const resourcesRoot = path_1.default.normalize(path_1.default.join(__dirname, 'runtime'));
15
17
  const defaultHandlerFilePath = path_1.default.join(resourcesRoot, 'default_handler.js');
16
18
  /**
@@ -31,9 +33,21 @@ class ConversationHandlerFunction extends constructs_1.Construct {
31
33
  var _a;
32
34
  super(scope, id);
33
35
  this.props = props;
36
+ /**
37
+ * Append conversation handler to defined functions.
38
+ */
39
+ this.storeOutput = (outputStorageStrategy) => {
40
+ outputStorageStrategy === null || outputStorageStrategy === void 0 ? void 0 : outputStorageStrategy.appendToBackendOutputList(backend_output_schemas_1.aiConversationOutputKey, {
41
+ version: '1',
42
+ payload: {
43
+ definedConversationHandlers: this.resources.lambda.functionName,
44
+ },
45
+ });
46
+ };
34
47
  if (this.props.entry && !path_1.default.isAbsolute(this.props.entry)) {
35
48
  throw new Error('Entry must be absolute path');
36
49
  }
50
+ aws_cdk_lib_1.Tags.of(this).add(platform_core_1.TagName.FRIENDLY_NAME, id);
37
51
  const conversationHandler = new aws_lambda_nodejs_1.NodejsFunction(this, `conversationHandlerFunction`, {
38
52
  runtime: aws_lambda_1.Runtime.NODEJS_18_X,
39
53
  timeout: aws_cdk_lib_1.Duration.seconds(60),
@@ -45,6 +59,7 @@ class ConversationHandlerFunction extends constructs_1.Construct {
45
59
  // For custom entry we do bundle SDK as we can't control version customer is coding against.
46
60
  bundleAwsSDK: !!this.props.entry,
47
61
  },
62
+ loggingFormat: aws_lambda_1.LoggingFormat.JSON,
48
63
  logGroup: new aws_logs_1.LogGroup(this, 'conversationHandlerFunctionLogGroup', {
49
64
  retention: aws_logs_1.RetentionDays.INFINITE,
50
65
  dataProtectionPolicy: new aws_logs_1.DataProtectionPolicy({
@@ -61,7 +76,10 @@ class ConversationHandlerFunction extends constructs_1.Construct {
61
76
  });
62
77
  conversationHandler.addToRolePolicy(new aws_iam_1.PolicyStatement({
63
78
  effect: aws_iam_1.Effect.ALLOW,
64
- actions: ['bedrock:InvokeModel'],
79
+ actions: [
80
+ 'bedrock:InvokeModel',
81
+ 'bedrock:InvokeModelWithResponseStream',
82
+ ],
65
83
  resources,
66
84
  }));
67
85
  }
@@ -71,7 +89,9 @@ class ConversationHandlerFunction extends constructs_1.Construct {
71
89
  cfnFunction: conversationHandler.node.findChild('Resource'),
72
90
  },
73
91
  };
92
+ this.storeOutput(this.props.outputStorageStrategy);
74
93
  }
75
94
  }
76
95
  exports.ConversationHandlerFunction = ConversationHandlerFunction;
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVyc2F0aW9uX2hhbmRsZXJfY29uc3RydWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnZlcnNhdGlvbi9jb252ZXJzYXRpb25faGFuZGxlcl9jb25zdHJ1Y3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsNkNBQThDO0FBQzlDLGlEQUE4RDtBQUM5RCx1REFBK0U7QUFDL0UscUVBQStEO0FBQy9ELG1EQUs4QjtBQUM5QiwyQ0FBdUM7QUFDdkMsZ0RBQXdCO0FBRXhCLE1BQU0sYUFBYSxHQUFHLGNBQUksQ0FBQyxTQUFTLENBQUMsY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUN0RSxNQUFNLHNCQUFzQixHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLG9CQUFvQixDQUFDLENBQUM7QUFVOUU7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBYSwyQkFDWCxTQUFRLHNCQUFTO0lBS2pCOztPQUVHO0lBQ0gsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ08sS0FBdUM7O1FBRXhELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFGQSxVQUFLLEdBQUwsS0FBSyxDQUFrQztRQUl4RCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsY0FBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzFELE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztTQUNoRDtRQUVELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxrQ0FBYyxDQUM1QyxJQUFJLEVBQ0osNkJBQTZCLEVBQzdCO1lBQ0UsT0FBTyxFQUFFLG9CQUFhLENBQUMsV0FBVztZQUNsQyxPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzdCLEtBQUssRUFBRSxNQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxtQ0FBSSxzQkFBc0I7WUFDakQsT0FBTyxFQUFFLFNBQVM7WUFDbEIsUUFBUSxFQUFFO2dCQUNSLHlGQUF5RjtnQkFDekYsdUNBQXVDO2dCQUN2Qyw0RkFBNEY7Z0JBQzVGLFlBQVksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLO2FBQ2pDO1lBQ0QsUUFBUSxFQUFFLElBQUksbUJBQVEsQ0FBQyxJQUFJLEVBQUUscUNBQXFDLEVBQUU7Z0JBQ2xFLFNBQVMsRUFBRSx3QkFBYSxDQUFDLFFBQVE7Z0JBQ2pDLG9CQUFvQixFQUFFLElBQUksK0JBQW9CLENBQUM7b0JBQzdDLFdBQVcsRUFBRTt3QkFDWCxJQUFJLCtCQUFvQixDQUN0QixVQUFVLEVBQ1YsMkRBQTJELENBQzVEO3FCQUNGO2lCQUNGLENBQUM7YUFDSCxDQUFDO1NBQ0gsQ0FDRixDQUFDO1FBRUYsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3JELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FDckMsQ0FBQyxLQUFLLEVBQUUsRUFBRTs7Z0JBQ1IsT0FBQSxtQkFDRSxNQUFBLEtBQUssQ0FBQyxNQUFNLG1DQUFJLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQ2pDLHNCQUFzQixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUE7YUFBQSxDQUN4QyxDQUFDO1lBQ0YsbUJBQW1CLENBQUMsZUFBZSxDQUNqQyxJQUFJLHlCQUFlLENBQUM7Z0JBQ2xCLE1BQU0sRUFBRSxnQkFBTSxDQUFDLEtBQUs7Z0JBQ3BCLE9BQU8sRUFBRSxDQUFDLHFCQUFxQixDQUFDO2dCQUNoQyxTQUFTO2FBQ1YsQ0FBQyxDQUNILENBQUM7U0FDSDtRQUVELElBQUksQ0FBQyxTQUFTLEdBQUc7WUFDZixNQUFNLEVBQUUsbUJBQW1CO1lBQzNCLFlBQVksRUFBRTtnQkFDWixXQUFXLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDN0MsVUFBVSxDQUNJO2FBQ2pCO1NBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXpFRCxrRUF5RUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGdW5jdGlvblJlc291cmNlcywgUmVzb3VyY2VQcm92aWRlciB9IGZyb20gJ0Bhd3MtYW1wbGlmeS9wbHVnaW4tdHlwZXMnO1xuaW1wb3J0IHsgRHVyYXRpb24sIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgRWZmZWN0LCBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IENmbkZ1bmN0aW9uLCBSdW50aW1lIGFzIExhbWJkYVJ1bnRpbWUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IE5vZGVqc0Z1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanMnO1xuaW1wb3J0IHtcbiAgQ3VzdG9tRGF0YUlkZW50aWZpZXIsXG4gIERhdGFQcm90ZWN0aW9uUG9saWN5LFxuICBMb2dHcm91cCxcbiAgUmV0ZW50aW9uRGF5cyxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuY29uc3QgcmVzb3VyY2VzUm9vdCA9IHBhdGgubm9ybWFsaXplKHBhdGguam9pbihfX2Rpcm5hbWUsICdydW50aW1lJykpO1xuY29uc3QgZGVmYXVsdEhhbmRsZXJGaWxlUGF0aCA9IHBhdGguam9pbihyZXNvdXJjZXNSb290LCAnZGVmYXVsdF9oYW5kbGVyLmpzJyk7XG5cbmV4cG9ydCB0eXBlIENvbnZlcnNhdGlvbkhhbmRsZXJGdW5jdGlvblByb3BzID0ge1xuICBlbnRyeT86IHN0cmluZztcbiAgbW9kZWxzOiBBcnJheTx7XG4gICAgbW9kZWxJZDogc3RyaW5nO1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgfT47XG59O1xuXG4vKipcbiAqIENvbnZlcnNhdGlvbiBIYW5kbGVyIEZ1bmN0aW9uIENESyBjb25zdHJ1Y3QuXG4gKiBUaGlzIGNvbnN0cnVjdCBkZXBsb3lzIHJlc291cmNlcyB0aGF0IGludGVncmF0ZSBjb252ZXJzYXRpb24gcm91dGVzXG4gKiBkZWZpbmVkIGluIGRhdGEgc2NoZW1hIHdpdGggQUkgbW9kZWxzIGF2YWlsYWJsZSBpbiBBV1MgQmVkcm9jay4gSS5lLlxuICogMS4gQVdTIExhbWJkYSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgY29udmVyc2F0aW9uIHR1cm4gZXZlbnRzLlxuICogICAgV2l0aCBBbXBsaWZ5IHByb3ZpZGVkIGltcGxlbWVudGF0aW9uIGJ5IGRlZmF1bHQgYW5kIG9wdGlvbiB0byBzcGVjaWZ5XG4gKiAgICBjdXN0b20gaGFuZGxlci5cbiAqIDIuIEFXUyBDbG91ZFdhdGNoIGxvZyBncm91cCBwb2xpY3kgd2l0aCBhcHByb3ByaWF0ZSBkYXRhIHByb3RlY3Rpb24gcG9saWNpZXMuXG4gKiAzLiBBV1MgSUFNIHBvbGljeSB0aGF0IGdyYW50cyBhY2Nlc3MgdG8gc2VsZWN0ZWQgQVdTIEJlZHJvY2sgbW9kZWxzLlxuICovXG5leHBvcnQgY2xhc3MgQ29udmVyc2F0aW9uSGFuZGxlckZ1bmN0aW9uXG4gIGV4dGVuZHMgQ29uc3RydWN0XG4gIGltcGxlbWVudHMgUmVzb3VyY2VQcm92aWRlcjxGdW5jdGlvblJlc291cmNlcz5cbntcbiAgcmVzb3VyY2VzOiBGdW5jdGlvblJlc291cmNlcztcblxuICAvKipcbiAgICogQ3JlYXRlcyBDb252ZXJzYXRpb24gSGFuZGxlciBGdW5jdGlvbiBDREsgY29uc3RydWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IENvbnZlcnNhdGlvbkhhbmRsZXJGdW5jdGlvblByb3BzXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5lbnRyeSAmJiAhcGF0aC5pc0Fic29sdXRlKHRoaXMucHJvcHMuZW50cnkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VudHJ5IG11c3QgYmUgYWJzb2x1dGUgcGF0aCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnZlcnNhdGlvbkhhbmRsZXIgPSBuZXcgTm9kZWpzRnVuY3Rpb24oXG4gICAgICB0aGlzLFxuICAgICAgYGNvbnZlcnNhdGlvbkhhbmRsZXJGdW5jdGlvbmAsXG4gICAgICB7XG4gICAgICAgIHJ1bnRpbWU6IExhbWJkYVJ1bnRpbWUuTk9ERUpTXzE4X1gsXG4gICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgICBlbnRyeTogdGhpcy5wcm9wcy5lbnRyeSA/PyBkZWZhdWx0SGFuZGxlckZpbGVQYXRoLFxuICAgICAgICBoYW5kbGVyOiAnaGFuZGxlcicsXG4gICAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgICAgLy8gRG8gbm90IGJ1bmRsZSBTREsgaWYgY29udmVyc2F0aW9uIGhhbmRsZXIgaXMgdXNpbmcgb3VyIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggaXNcbiAgICAgICAgICAvLyBjb21wYXRpYmxlIHdpdGggTGFtYmRhIHByb3ZpZGVkIFNESy5cbiAgICAgICAgICAvLyBGb3IgY3VzdG9tIGVudHJ5IHdlIGRvIGJ1bmRsZSBTREsgYXMgd2UgY2FuJ3QgY29udHJvbCB2ZXJzaW9uIGN1c3RvbWVyIGlzIGNvZGluZyBhZ2FpbnN0LlxuICAgICAgICAgIGJ1bmRsZUF3c1NESzogISF0aGlzLnByb3BzLmVudHJ5LFxuICAgICAgICB9LFxuICAgICAgICBsb2dHcm91cDogbmV3IExvZ0dyb3VwKHRoaXMsICdjb252ZXJzYXRpb25IYW5kbGVyRnVuY3Rpb25Mb2dHcm91cCcsIHtcbiAgICAgICAgICByZXRlbnRpb246IFJldGVudGlvbkRheXMuSU5GSU5JVEUsXG4gICAgICAgICAgZGF0YVByb3RlY3Rpb25Qb2xpY3k6IG5ldyBEYXRhUHJvdGVjdGlvblBvbGljeSh7XG4gICAgICAgICAgICBpZGVudGlmaWVyczogW1xuICAgICAgICAgICAgICBuZXcgQ3VzdG9tRGF0YUlkZW50aWZpZXIoXG4gICAgICAgICAgICAgICAgJ0pXVFRva2VuJyxcbiAgICAgICAgICAgICAgICAnZXlbQS1aYS16MC05LV89XStcXFxcLltBLVphLXowLTktXz1dK1xcXFwuP1tBLVphLXowLTktXy4rLz1dKidcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pLFxuICAgICAgfVxuICAgICk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5tb2RlbHMgJiYgdGhpcy5wcm9wcy5tb2RlbHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcmVzb3VyY2VzID0gdGhpcy5wcm9wcy5tb2RlbHMubWFwKFxuICAgICAgICAobW9kZWwpID0+XG4gICAgICAgICAgYGFybjphd3M6YmVkcm9jazoke1xuICAgICAgICAgICAgbW9kZWwucmVnaW9uID8/IFN0YWNrLm9mKHRoaXMpLnJlZ2lvblxuICAgICAgICAgIH06OmZvdW5kYXRpb24tbW9kZWwvJHttb2RlbC5tb2RlbElkfWBcbiAgICAgICk7XG4gICAgICBjb252ZXJzYXRpb25IYW5kbGVyLmFkZFRvUm9sZVBvbGljeShcbiAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgYWN0aW9uczogWydiZWRyb2NrOkludm9rZU1vZGVsJ10sXG4gICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc291cmNlcyA9IHtcbiAgICAgIGxhbWJkYTogY29udmVyc2F0aW9uSGFuZGxlcixcbiAgICAgIGNmblJlc291cmNlczoge1xuICAgICAgICBjZm5GdW5jdGlvbjogY29udmVyc2F0aW9uSGFuZGxlci5ub2RlLmZpbmRDaGlsZChcbiAgICAgICAgICAnUmVzb3VyY2UnXG4gICAgICAgICkgYXMgQ2ZuRnVuY3Rpb24sXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
96
+ ConversationHandlerFunction.eventVersion = '1.0';
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVyc2F0aW9uX2hhbmRsZXJfY29uc3RydWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnZlcnNhdGlvbi9jb252ZXJzYXRpb25faGFuZGxlcl9jb25zdHJ1Y3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBS0EsNkNBQW9EO0FBQ3BELGlEQUE4RDtBQUM5RCx1REFJZ0M7QUFDaEMscUVBQStEO0FBQy9ELG1EQUs4QjtBQUM5QiwyQ0FBdUM7QUFDdkMsZ0RBQXdCO0FBQ3hCLDhEQUFxRDtBQUNyRCxnRkFHNkM7QUFFN0MsTUFBTSxhQUFhLEdBQUcsY0FBSSxDQUFDLFNBQVMsQ0FBQyxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ3RFLE1BQU0sc0JBQXNCLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztBQW1COUU7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBYSwyQkFDWCxTQUFRLHNCQUFTO0lBTWpCOztPQUVHO0lBQ0gsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ08sS0FBdUM7O1FBRXhELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFGQSxVQUFLLEdBQUwsS0FBSyxDQUFrQztRQXNFMUQ7O1dBRUc7UUFDSyxnQkFBVyxHQUFHLENBQ3BCLHFCQUVhLEVBQ1AsRUFBRTtZQUNSLHFCQUFxQixhQUFyQixxQkFBcUIsdUJBQXJCLHFCQUFxQixDQUFFLHlCQUF5QixDQUFDLGdEQUF1QixFQUFFO2dCQUN4RSxPQUFPLEVBQUUsR0FBRztnQkFDWixPQUFPLEVBQUU7b0JBQ1AsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsWUFBWTtpQkFDaEU7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7UUFoRkEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLGNBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMxRCxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7U0FDaEQ7UUFFRCxrQkFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsdUJBQU8sQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFN0MsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLGtDQUFjLENBQzVDLElBQUksRUFDSiw2QkFBNkIsRUFDN0I7WUFDRSxPQUFPLEVBQUUsb0JBQWEsQ0FBQyxXQUFXO1lBQ2xDLE9BQU8sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDN0IsS0FBSyxFQUFFLE1BQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLG1DQUFJLHNCQUFzQjtZQUNqRCxPQUFPLEVBQUUsU0FBUztZQUNsQixRQUFRLEVBQUU7Z0JBQ1IseUZBQXlGO2dCQUN6Rix1Q0FBdUM7Z0JBQ3ZDLDRGQUE0RjtnQkFDNUYsWUFBWSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUs7YUFDakM7WUFDRCxhQUFhLEVBQUUsMEJBQWEsQ0FBQyxJQUFJO1lBQ2pDLFFBQVEsRUFBRSxJQUFJLG1CQUFRLENBQUMsSUFBSSxFQUFFLHFDQUFxQyxFQUFFO2dCQUNsRSxTQUFTLEVBQUUsd0JBQWEsQ0FBQyxRQUFRO2dCQUNqQyxvQkFBb0IsRUFBRSxJQUFJLCtCQUFvQixDQUFDO29CQUM3QyxXQUFXLEVBQUU7d0JBQ1gsSUFBSSwrQkFBb0IsQ0FDdEIsVUFBVSxFQUNWLDJEQUEyRCxDQUM1RDtxQkFDRjtpQkFDRixDQUFDO2FBQ0gsQ0FBQztTQUNILENBQ0YsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNyRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQ3JDLENBQUMsS0FBSyxFQUFFLEVBQUU7O2dCQUNSLE9BQUEsbUJBQ0UsTUFBQSxLQUFLLENBQUMsTUFBTSxtQ0FBSSxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUNqQyxzQkFBc0IsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFBO2FBQUEsQ0FDeEMsQ0FBQztZQUNGLG1CQUFtQixDQUFDLGVBQWUsQ0FDakMsSUFBSSx5QkFBZSxDQUFDO2dCQUNsQixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO2dCQUNwQixPQUFPLEVBQUU7b0JBQ1AscUJBQXFCO29CQUNyQix1Q0FBdUM7aUJBQ3hDO2dCQUNELFNBQVM7YUFDVixDQUFDLENBQ0gsQ0FBQztTQUNIO1FBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRztZQUNmLE1BQU0sRUFBRSxtQkFBbUI7WUFDM0IsWUFBWSxFQUFFO2dCQUNaLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUM3QyxVQUFVLENBQ0k7YUFDakI7U0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDckQsQ0FBQzs7QUFqRkgsa0VBa0dDO0FBOUZpQix3Q0FBWSxHQUFpQyxLQUFLLEFBQXRDLENBQXVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmFja2VuZE91dHB1dFN0b3JhZ2VTdHJhdGVneSxcbiAgRnVuY3Rpb25SZXNvdXJjZXMsXG4gIFJlc291cmNlUHJvdmlkZXIsXG59IGZyb20gJ0Bhd3MtYW1wbGlmeS9wbHVnaW4tdHlwZXMnO1xuaW1wb3J0IHsgRHVyYXRpb24sIFN0YWNrLCBUYWdzIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgRWZmZWN0LCBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7XG4gIENmbkZ1bmN0aW9uLFxuICBSdW50aW1lIGFzIExhbWJkYVJ1bnRpbWUsXG4gIExvZ2dpbmdGb3JtYXQsXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgTm9kZWpzRnVuY3Rpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqcyc7XG5pbXBvcnQge1xuICBDdXN0b21EYXRhSWRlbnRpZmllcixcbiAgRGF0YVByb3RlY3Rpb25Qb2xpY3ksXG4gIExvZ0dyb3VwLFxuICBSZXRlbnRpb25EYXlzLFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgVGFnTmFtZSB9IGZyb20gJ0Bhd3MtYW1wbGlmeS9wbGF0Zm9ybS1jb3JlJztcbmltcG9ydCB7XG4gIEFJQ29udmVyc2F0aW9uT3V0cHV0LFxuICBhaUNvbnZlcnNhdGlvbk91dHB1dEtleSxcbn0gZnJvbSAnQGF3cy1hbXBsaWZ5L2JhY2tlbmQtb3V0cHV0LXNjaGVtYXMnO1xuXG5jb25zdCByZXNvdXJjZXNSb290ID0gcGF0aC5ub3JtYWxpemUocGF0aC5qb2luKF9fZGlybmFtZSwgJ3J1bnRpbWUnKSk7XG5jb25zdCBkZWZhdWx0SGFuZGxlckZpbGVQYXRoID0gcGF0aC5qb2luKHJlc291cmNlc1Jvb3QsICdkZWZhdWx0X2hhbmRsZXIuanMnKTtcblxuZXhwb3J0IHR5cGUgQ29udmVyc2F0aW9uSGFuZGxlckZ1bmN0aW9uUHJvcHMgPSB7XG4gIGVudHJ5Pzogc3RyaW5nO1xuICBtb2RlbHM6IEFycmF5PHtcbiAgICBtb2RlbElkOiBzdHJpbmc7XG4gICAgcmVnaW9uPzogc3RyaW5nO1xuICB9PjtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb3V0cHV0U3RvcmFnZVN0cmF0ZWd5PzogQmFja2VuZE91dHB1dFN0b3JhZ2VTdHJhdGVneTxBSUNvbnZlcnNhdGlvbk91dHB1dD47XG59O1xuXG4vLyBFdmVudCBpcyBhIHByb3RvY29sIGJldHdlZW4gQXBwU3luYyBhbmQgTGFtYmRhIGhhbmRsZXIuIFRoZXJlZm9yZSwgWC5ZIHN1YnNldCBvZiBzZW12ZXIgaXMgZW5vdWdoLlxuLy8gVHlwaW5nIHRoaXMgYXMgMS5YIHNvIHRoYXQgbWFqb3IgdmVyc2lvbiBjaGFuZ2VzIGFyZSBjYXVnaHQgYnkgY29tcGlsZXIgaWYgY29uc3VtZXIgb2YgdGhpcyBjb25zdHJ1Y3QgaW5zcGVjdHNcbi8vIGV2ZW50IHZlcnNpb24uXG5leHBvcnQgdHlwZSBDb252ZXJzYXRpb25UdXJuRXZlbnRWZXJzaW9uID0gYDEuJHtudW1iZXJ9YDtcblxuLyoqXG4gKiBDb252ZXJzYXRpb24gSGFuZGxlciBGdW5jdGlvbiBDREsgY29uc3RydWN0LlxuICogVGhpcyBjb25zdHJ1Y3QgZGVwbG95cyByZXNvdXJjZXMgdGhhdCBpbnRlZ3JhdGUgY29udmVyc2F0aW9uIHJvdXRlc1xuICogZGVmaW5lZCBpbiBkYXRhIHNjaGVtYSB3aXRoIEFJIG1vZGVscyBhdmFpbGFibGUgaW4gQVdTIEJlZHJvY2suIEkuZS5cbiAqIDEuIEFXUyBMYW1iZGEgZnVuY3Rpb24gdGhhdCBoYW5kbGVzIGNvbnZlcnNhdGlvbiB0dXJuIGV2ZW50cy5cbiAqICAgIFdpdGggQW1wbGlmeSBwcm92aWRlZCBpbXBsZW1lbnRhdGlvbiBieSBkZWZhdWx0IGFuZCBvcHRpb24gdG8gc3BlY2lmeVxuICogICAgY3VzdG9tIGhhbmRsZXIuXG4gKiAyLiBBV1MgQ2xvdWRXYXRjaCBsb2cgZ3JvdXAgcG9saWN5IHdpdGggYXBwcm9wcmlhdGUgZGF0YSBwcm90ZWN0aW9uIHBvbGljaWVzLlxuICogMy4gQVdTIElBTSBwb2xpY3kgdGhhdCBncmFudHMgYWNjZXNzIHRvIHNlbGVjdGVkIEFXUyBCZWRyb2NrIG1vZGVscy5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnZlcnNhdGlvbkhhbmRsZXJGdW5jdGlvblxuICBleHRlbmRzIENvbnN0cnVjdFxuICBpbXBsZW1lbnRzIFJlc291cmNlUHJvdmlkZXI8RnVuY3Rpb25SZXNvdXJjZXM+XG57XG4gIHN0YXRpYyByZWFkb25seSBldmVudFZlcnNpb246IENvbnZlcnNhdGlvblR1cm5FdmVudFZlcnNpb24gPSAnMS4wJztcbiAgcmVzb3VyY2VzOiBGdW5jdGlvblJlc291cmNlcztcblxuICAvKipcbiAgICogQ3JlYXRlcyBDb252ZXJzYXRpb24gSGFuZGxlciBGdW5jdGlvbiBDREsgY29uc3RydWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IENvbnZlcnNhdGlvbkhhbmRsZXJGdW5jdGlvblByb3BzXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5lbnRyeSAmJiAhcGF0aC5pc0Fic29sdXRlKHRoaXMucHJvcHMuZW50cnkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VudHJ5IG11c3QgYmUgYWJzb2x1dGUgcGF0aCcpO1xuICAgIH1cblxuICAgIFRhZ3Mub2YodGhpcykuYWRkKFRhZ05hbWUuRlJJRU5ETFlfTkFNRSwgaWQpO1xuXG4gICAgY29uc3QgY29udmVyc2F0aW9uSGFuZGxlciA9IG5ldyBOb2RlanNGdW5jdGlvbihcbiAgICAgIHRoaXMsXG4gICAgICBgY29udmVyc2F0aW9uSGFuZGxlckZ1bmN0aW9uYCxcbiAgICAgIHtcbiAgICAgICAgcnVudGltZTogTGFtYmRhUnVudGltZS5OT0RFSlNfMThfWCxcbiAgICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICAgIGVudHJ5OiB0aGlzLnByb3BzLmVudHJ5ID8/IGRlZmF1bHRIYW5kbGVyRmlsZVBhdGgsXG4gICAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgICAgYnVuZGxpbmc6IHtcbiAgICAgICAgICAvLyBEbyBub3QgYnVuZGxlIFNESyBpZiBjb252ZXJzYXRpb24gaGFuZGxlciBpcyB1c2luZyBvdXIgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBpc1xuICAgICAgICAgIC8vIGNvbXBhdGlibGUgd2l0aCBMYW1iZGEgcHJvdmlkZWQgU0RLLlxuICAgICAgICAgIC8vIEZvciBjdXN0b20gZW50cnkgd2UgZG8gYnVuZGxlIFNESyBhcyB3ZSBjYW4ndCBjb250cm9sIHZlcnNpb24gY3VzdG9tZXIgaXMgY29kaW5nIGFnYWluc3QuXG4gICAgICAgICAgYnVuZGxlQXdzU0RLOiAhIXRoaXMucHJvcHMuZW50cnksXG4gICAgICAgIH0sXG4gICAgICAgIGxvZ2dpbmdGb3JtYXQ6IExvZ2dpbmdGb3JtYXQuSlNPTixcbiAgICAgICAgbG9nR3JvdXA6IG5ldyBMb2dHcm91cCh0aGlzLCAnY29udmVyc2F0aW9uSGFuZGxlckZ1bmN0aW9uTG9nR3JvdXAnLCB7XG4gICAgICAgICAgcmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLklORklOSVRFLFxuICAgICAgICAgIGRhdGFQcm90ZWN0aW9uUG9saWN5OiBuZXcgRGF0YVByb3RlY3Rpb25Qb2xpY3koe1xuICAgICAgICAgICAgaWRlbnRpZmllcnM6IFtcbiAgICAgICAgICAgICAgbmV3IEN1c3RvbURhdGFJZGVudGlmaWVyKFxuICAgICAgICAgICAgICAgICdKV1RUb2tlbicsXG4gICAgICAgICAgICAgICAgJ2V5W0EtWmEtejAtOS1fPV0rXFxcXC5bQS1aYS16MC05LV89XStcXFxcLj9bQS1aYS16MC05LV8uKy89XSonXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KSxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgaWYgKHRoaXMucHJvcHMubW9kZWxzICYmIHRoaXMucHJvcHMubW9kZWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMucHJvcHMubW9kZWxzLm1hcChcbiAgICAgICAgKG1vZGVsKSA9PlxuICAgICAgICAgIGBhcm46YXdzOmJlZHJvY2s6JHtcbiAgICAgICAgICAgIG1vZGVsLnJlZ2lvbiA/PyBTdGFjay5vZih0aGlzKS5yZWdpb25cbiAgICAgICAgICB9Ojpmb3VuZGF0aW9uLW1vZGVsLyR7bW9kZWwubW9kZWxJZH1gXG4gICAgICApO1xuICAgICAgY29udmVyc2F0aW9uSGFuZGxlci5hZGRUb1JvbGVQb2xpY3koXG4gICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICdiZWRyb2NrOkludm9rZU1vZGVsJyxcbiAgICAgICAgICAgICdiZWRyb2NrOkludm9rZU1vZGVsV2l0aFJlc3BvbnNlU3RyZWFtJyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNvdXJjZXMgPSB7XG4gICAgICBsYW1iZGE6IGNvbnZlcnNhdGlvbkhhbmRsZXIsXG4gICAgICBjZm5SZXNvdXJjZXM6IHtcbiAgICAgICAgY2ZuRnVuY3Rpb246IGNvbnZlcnNhdGlvbkhhbmRsZXIubm9kZS5maW5kQ2hpbGQoXG4gICAgICAgICAgJ1Jlc291cmNlJ1xuICAgICAgICApIGFzIENmbkZ1bmN0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgdGhpcy5zdG9yZU91dHB1dCh0aGlzLnByb3BzLm91dHB1dFN0b3JhZ2VTdHJhdGVneSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kIGNvbnZlcnNhdGlvbiBoYW5kbGVyIHRvIGRlZmluZWQgZnVuY3Rpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBzdG9yZU91dHB1dCA9IChcbiAgICBvdXRwdXRTdG9yYWdlU3RyYXRlZ3k6XG4gICAgICB8IEJhY2tlbmRPdXRwdXRTdG9yYWdlU3RyYXRlZ3k8QUlDb252ZXJzYXRpb25PdXRwdXQ+XG4gICAgICB8IHVuZGVmaW5lZFxuICApOiB2b2lkID0+IHtcbiAgICBvdXRwdXRTdG9yYWdlU3RyYXRlZ3k/LmFwcGVuZFRvQmFja2VuZE91dHB1dExpc3QoYWlDb252ZXJzYXRpb25PdXRwdXRLZXksIHtcbiAgICAgIHZlcnNpb246ICcxJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgZGVmaW5lZENvbnZlcnNhdGlvbkhhbmRsZXJzOiB0aGlzLnJlc291cmNlcy5sYW1iZGEuZnVuY3Rpb25OYW1lLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcbn1cbiJdfQ==
@@ -1,3 +1,3 @@
1
- import { ConversationHandlerFunction, ConversationHandlerFunctionProps } from './conversation_handler_construct.js';
2
- export { ConversationHandlerFunction, ConversationHandlerFunctionProps };
1
+ import { ConversationHandlerFunction, ConversationHandlerFunctionProps, ConversationTurnEventVersion } from './conversation_handler_construct.js';
2
+ export { ConversationHandlerFunction, ConversationHandlerFunctionProps, ConversationTurnEventVersion, };
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -3,4 +3,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ConversationHandlerFunction = void 0;
4
4
  const conversation_handler_construct_js_1 = require("./conversation_handler_construct.js");
5
5
  Object.defineProperty(exports, "ConversationHandlerFunction", { enumerable: true, get: function () { return conversation_handler_construct_js_1.ConversationHandlerFunction; } });
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udmVyc2F0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJGQUc2QztBQUVwQyw0R0FKUCwrREFBMkIsT0FJTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbnZlcnNhdGlvbkhhbmRsZXJGdW5jdGlvbixcbiAgQ29udmVyc2F0aW9uSGFuZGxlckZ1bmN0aW9uUHJvcHMsXG59IGZyb20gJy4vY29udmVyc2F0aW9uX2hhbmRsZXJfY29uc3RydWN0LmpzJztcblxuZXhwb3J0IHsgQ29udmVyc2F0aW9uSGFuZGxlckZ1bmN0aW9uLCBDb252ZXJzYXRpb25IYW5kbGVyRnVuY3Rpb25Qcm9wcyB9O1xuIl19
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udmVyc2F0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJGQUk2QztBQUczQyw0R0FOQSwrREFBMkIsT0FNQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbnZlcnNhdGlvbkhhbmRsZXJGdW5jdGlvbixcbiAgQ29udmVyc2F0aW9uSGFuZGxlckZ1bmN0aW9uUHJvcHMsXG4gIENvbnZlcnNhdGlvblR1cm5FdmVudFZlcnNpb24sXG59IGZyb20gJy4vY29udmVyc2F0aW9uX2hhbmRsZXJfY29uc3RydWN0LmpzJztcblxuZXhwb3J0IHtcbiAgQ29udmVyc2F0aW9uSGFuZGxlckZ1bmN0aW9uLFxuICBDb252ZXJzYXRpb25IYW5kbGVyRnVuY3Rpb25Qcm9wcyxcbiAgQ29udmVyc2F0aW9uVHVybkV2ZW50VmVyc2lvbixcbn07XG4iXX0=
@@ -1,5 +1,6 @@
1
+ /// <reference types="node" />
1
2
  import { BedrockRuntimeClient, ContentBlock } from '@aws-sdk/client-bedrock-runtime';
2
- import { ConversationTurnEvent, ExecutableTool } from './types.js';
3
+ import { ConversationTurnEvent, ExecutableTool, StreamingResponseChunk } from './types.js';
3
4
  import { ConversationTurnEventToolsProvider } from './event-tools-provider';
4
5
  import { ConversationMessageHistoryRetriever } from './conversation_message_history_retriever';
5
6
  /**
@@ -10,6 +11,7 @@ export declare class BedrockConverseAdapter {
10
11
  private readonly event;
11
12
  private readonly bedrockClient;
12
13
  private readonly messageHistoryRetriever;
14
+ private readonly logger;
13
15
  private readonly allTools;
14
16
  private readonly executableTools;
15
17
  private readonly clientTools;
@@ -18,8 +20,12 @@ export declare class BedrockConverseAdapter {
18
20
  /**
19
21
  * Creates Bedrock Converse Adapter.
20
22
  */
21
- constructor(event: ConversationTurnEvent, additionalTools: Array<ExecutableTool>, bedrockClient?: BedrockRuntimeClient, eventToolsProvider?: ConversationTurnEventToolsProvider, messageHistoryRetriever?: ConversationMessageHistoryRetriever);
23
+ constructor(event: ConversationTurnEvent, additionalTools: Array<ExecutableTool>, bedrockClient?: BedrockRuntimeClient, eventToolsProvider?: ConversationTurnEventToolsProvider, messageHistoryRetriever?: ConversationMessageHistoryRetriever, logger?: Console);
22
24
  askBedrock: () => Promise<ContentBlock[]>;
25
+ /**
26
+ * Asks Bedrock for response using streaming version of Converse API.
27
+ */
28
+ askBedrockStreaming(): AsyncGenerator<StreamingResponseChunk>;
23
29
  /**
24
30
  * Maps event messages to Bedrock types.
25
31
  * 1. Makes a copy so that we don't mutate event.
@@ -12,11 +12,12 @@ class BedrockConverseAdapter {
12
12
  /**
13
13
  * Creates Bedrock Converse Adapter.
14
14
  */
15
- constructor(event, additionalTools, bedrockClient = new client_bedrock_runtime_1.BedrockRuntimeClient({ region: event.modelConfiguration.region }), eventToolsProvider = new event_tools_provider_1.ConversationTurnEventToolsProvider(event), messageHistoryRetriever = new conversation_message_history_retriever_1.ConversationMessageHistoryRetriever(event)) {
15
+ constructor(event, additionalTools, bedrockClient = new client_bedrock_runtime_1.BedrockRuntimeClient({ region: event.modelConfiguration.region }), eventToolsProvider = new event_tools_provider_1.ConversationTurnEventToolsProvider(event), messageHistoryRetriever = new conversation_message_history_retriever_1.ConversationMessageHistoryRetriever(event), logger = console) {
16
16
  var _a, _b;
17
17
  this.event = event;
18
18
  this.bedrockClient = bedrockClient;
19
19
  this.messageHistoryRetriever = messageHistoryRetriever;
20
+ this.logger = logger;
20
21
  this.executableToolByName = new Map();
21
22
  this.clientToolByName = new Map();
22
23
  this.askBedrock = async () => {
@@ -33,7 +34,11 @@ class BedrockConverseAdapter {
33
34
  inferenceConfig: inferenceConfiguration,
34
35
  toolConfig,
35
36
  };
37
+ this.logger.info('Sending Bedrock Converse request');
38
+ this.logger.debug('Bedrock Converse request:', converseCommandInput);
36
39
  bedrockResponse = await this.bedrockClient.send(new client_bedrock_runtime_1.ConverseCommand(converseCommandInput));
40
+ this.logger.info(`Received Bedrock Converse response, requestId=${bedrockResponse.$metadata.requestId}`, bedrockResponse.usage);
41
+ this.logger.debug('Bedrock Converse response:', bedrockResponse);
37
42
  if ((_a = bedrockResponse.output) === null || _a === void 0 ? void 0 : _a.message) {
38
43
  messages.push((_b = bedrockResponse.output) === null || _b === void 0 ? void 0 : _b.message);
39
44
  }
@@ -50,11 +55,16 @@ class BedrockConverseAdapter {
50
55
  // and propagate result back to client.
51
56
  return clientToolUseBlocks;
52
57
  }
58
+ const toolResponseContentBlocks = [];
53
59
  for (const responseContentBlock of toolUseBlocks) {
54
60
  const toolUseBlock = responseContentBlock;
55
- const toolMessage = await this.executeTool(toolUseBlock);
56
- messages.push(toolMessage);
61
+ const toolResultContentBlock = await this.executeTool(toolUseBlock);
62
+ toolResponseContentBlocks.push(toolResultContentBlock);
57
63
  }
64
+ messages.push({
65
+ role: 'user',
66
+ content: toolResponseContentBlocks,
67
+ });
58
68
  }
59
69
  } while (bedrockResponse.stopReason === 'tool_use');
60
70
  return (_h = (_g = (_f = bedrockResponse.output) === null || _f === void 0 ? void 0 : _f.message) === null || _g === void 0 ? void 0 : _g.content) !== null && _h !== void 0 ? _h : [];
@@ -103,6 +113,8 @@ class BedrockConverseAdapter {
103
113
  toolSpec: {
104
114
  name: t.name,
105
115
  description: t.description,
116
+ // We have to cast to bedrock type as we're using different types to describe JSON schema in our API.
117
+ // These types are runtime compatible.
106
118
  inputSchema: t.inputSchema,
107
119
  },
108
120
  };
@@ -118,49 +130,50 @@ class BedrockConverseAdapter {
118
130
  throw Error(`Bedrock tool use response contains unknown tool '${toolUseBlock.toolUse.name}'`);
119
131
  }
120
132
  try {
133
+ this.logger.info(`Invoking tool ${tool.name}`);
134
+ this.logger.debug('Tool input:', toolUseBlock.toolUse.input);
121
135
  const toolResponse = await tool.execute(toolUseBlock.toolUse.input);
136
+ this.logger.info(`Received response from ${tool.name} tool`);
137
+ this.logger.debug(toolResponse);
122
138
  return {
123
- role: 'user',
124
- content: [
125
- {
126
- toolResult: {
127
- toolUseId: toolUseBlock.toolUse.toolUseId,
128
- content: [toolResponse],
129
- status: 'success',
130
- },
131
- },
132
- ],
139
+ toolResult: {
140
+ toolUseId: toolUseBlock.toolUse.toolUseId,
141
+ content: [toolResponse],
142
+ status: 'success',
143
+ },
133
144
  };
134
145
  }
135
146
  catch (e) {
136
147
  if (e instanceof Error) {
137
148
  return {
138
- role: 'user',
139
- content: [
140
- {
141
- toolResult: {
142
- toolUseId: toolUseBlock.toolUse.toolUseId,
143
- content: [{ text: e.toString() }],
144
- status: 'error',
145
- },
146
- },
147
- ],
149
+ toolResult: {
150
+ toolUseId: toolUseBlock.toolUse.toolUseId,
151
+ content: [{ text: e.toString() }],
152
+ status: 'error',
153
+ },
148
154
  };
149
155
  }
150
156
  return {
151
- role: 'user',
152
- content: [
153
- {
154
- toolResult: {
155
- toolUseId: toolUseBlock.toolUse.toolUseId,
156
- content: [{ text: 'unknown error occurred' }],
157
- status: 'error',
158
- },
159
- },
160
- ],
157
+ toolResult: {
158
+ toolUseId: toolUseBlock.toolUse.toolUseId,
159
+ content: [{ text: 'unknown error occurred' }],
160
+ status: 'error',
161
+ },
161
162
  };
162
163
  }
163
164
  };
165
+ if (event.request.headers['x-amz-user-agent']) {
166
+ this.bedrockClient.middlewareStack.add((next) => (args) => {
167
+ // @ts-expect-error Request is typed as unknown.
168
+ // But this is recommended way to alter headers per https://github.com/aws/aws-sdk-js-v3/blob/main/README.md.
169
+ args.request.headers['x-amz-user-agent'] =
170
+ event.request.headers['x-amz-user-agent'];
171
+ return next(args);
172
+ }, {
173
+ step: 'build',
174
+ name: 'amplify-user-agent-injector',
175
+ });
176
+ }
164
177
  this.executableTools = [
165
178
  ...eventToolsProvider.getEventTools(),
166
179
  ...additionalTools,
@@ -189,6 +202,155 @@ class BedrockConverseAdapter {
189
202
  ].join(', ')}.`);
190
203
  }
191
204
  }
205
+ /**
206
+ * Asks Bedrock for response using streaming version of Converse API.
207
+ */
208
+ async *askBedrockStreaming() {
209
+ var _a, _b, _c, _d, _e, _f, _g, _h;
210
+ const { modelId, systemPrompt, inferenceConfiguration } = this.event.modelConfiguration;
211
+ const messages = await this.getEventMessagesAsBedrockMessages();
212
+ let bedrockResponse;
213
+ // keep our own indexing for blocks instead of using Bedrock's indexes
214
+ // since we stream subset of these upstream.
215
+ let blockIndex = 0;
216
+ let lastBlockIndex = 0;
217
+ let stopReason = '';
218
+ do {
219
+ const toolConfig = this.createToolConfiguration();
220
+ const converseCommandInput = {
221
+ modelId,
222
+ messages: [...messages],
223
+ system: [{ text: systemPrompt }],
224
+ inferenceConfig: inferenceConfiguration,
225
+ toolConfig,
226
+ };
227
+ this.logger.info('Sending Bedrock Converse Stream request');
228
+ this.logger.debug('Bedrock Converse Stream request:', converseCommandInput);
229
+ bedrockResponse = await this.bedrockClient.send(new client_bedrock_runtime_1.ConverseStreamCommand(converseCommandInput));
230
+ this.logger.info(`Received Bedrock Converse Stream response, requestId=${bedrockResponse.$metadata.requestId}`);
231
+ if (!bedrockResponse.stream) {
232
+ throw new Error('Bedrock response is missing stream');
233
+ }
234
+ let toolUseBlock;
235
+ let clientToolsRequested = false;
236
+ let text = '';
237
+ let toolUseInput = '';
238
+ let blockDeltaIndex = 0;
239
+ let lastBlockDeltaIndex = 0;
240
+ const accumulatedAssistantMessage = {
241
+ role: undefined,
242
+ content: [],
243
+ };
244
+ for await (const chunk of bedrockResponse.stream) {
245
+ this.logger.debug('Bedrock Converse Stream response chunk:', chunk);
246
+ if (chunk.messageStart) {
247
+ accumulatedAssistantMessage.role = chunk.messageStart.role;
248
+ }
249
+ else if (chunk.contentBlockStart) {
250
+ blockDeltaIndex = 0;
251
+ lastBlockDeltaIndex = 0;
252
+ if ((_a = chunk.contentBlockStart.start) === null || _a === void 0 ? void 0 : _a.toolUse) {
253
+ toolUseBlock = {
254
+ toolUse: {
255
+ ...(_b = chunk.contentBlockStart.start) === null || _b === void 0 ? void 0 : _b.toolUse,
256
+ input: undefined,
257
+ },
258
+ };
259
+ }
260
+ }
261
+ else if (chunk.contentBlockDelta) {
262
+ if ((_c = chunk.contentBlockDelta.delta) === null || _c === void 0 ? void 0 : _c.toolUse) {
263
+ if (!chunk.contentBlockDelta.delta.toolUse.input) {
264
+ toolUseInput = '';
265
+ }
266
+ toolUseInput += chunk.contentBlockDelta.delta.toolUse.input;
267
+ }
268
+ else if ((_d = chunk.contentBlockDelta.delta) === null || _d === void 0 ? void 0 : _d.text) {
269
+ text += chunk.contentBlockDelta.delta.text;
270
+ yield {
271
+ conversationId: this.event.conversationId,
272
+ associatedUserMessageId: this.event.currentMessageId,
273
+ contentBlockText: chunk.contentBlockDelta.delta.text,
274
+ contentBlockIndex: blockIndex,
275
+ contentBlockDeltaIndex: blockDeltaIndex,
276
+ };
277
+ lastBlockDeltaIndex = blockDeltaIndex;
278
+ blockDeltaIndex++;
279
+ }
280
+ }
281
+ else if (chunk.contentBlockStop) {
282
+ if (toolUseBlock) {
283
+ toolUseBlock.toolUse.input = JSON.parse(toolUseInput);
284
+ (_e = accumulatedAssistantMessage.content) === null || _e === void 0 ? void 0 : _e.push(toolUseBlock);
285
+ if (toolUseBlock.toolUse.name &&
286
+ this.clientToolByName.has(toolUseBlock.toolUse.name)) {
287
+ clientToolsRequested = true;
288
+ yield {
289
+ conversationId: this.event.conversationId,
290
+ associatedUserMessageId: this.event.currentMessageId,
291
+ contentBlockIndex: blockIndex,
292
+ contentBlockToolUse: JSON.stringify(toolUseBlock),
293
+ };
294
+ lastBlockIndex = blockIndex;
295
+ blockIndex++;
296
+ }
297
+ toolUseBlock = undefined;
298
+ toolUseInput = '';
299
+ }
300
+ else {
301
+ (_f = accumulatedAssistantMessage.content) === null || _f === void 0 ? void 0 : _f.push({
302
+ text,
303
+ });
304
+ yield {
305
+ conversationId: this.event.conversationId,
306
+ associatedUserMessageId: this.event.currentMessageId,
307
+ contentBlockIndex: blockIndex,
308
+ contentBlockDoneAtIndex: lastBlockDeltaIndex,
309
+ };
310
+ text = '';
311
+ lastBlockIndex = blockIndex;
312
+ blockIndex++;
313
+ }
314
+ }
315
+ else if (chunk.messageStop) {
316
+ stopReason = (_g = chunk.messageStop.stopReason) !== null && _g !== void 0 ? _g : '';
317
+ }
318
+ }
319
+ this.logger.debug('Accumulated Bedrock Converse Stream response:', accumulatedAssistantMessage);
320
+ if (clientToolsRequested) {
321
+ // For now if any of client tools is used we ignore executable tools
322
+ // and propagate result back to client.
323
+ yield {
324
+ conversationId: this.event.conversationId,
325
+ associatedUserMessageId: this.event.currentMessageId,
326
+ contentBlockIndex: lastBlockIndex,
327
+ stopReason: stopReason,
328
+ };
329
+ return;
330
+ }
331
+ messages.push(accumulatedAssistantMessage);
332
+ if (stopReason === 'tool_use') {
333
+ const responseContentBlocks = (_h = accumulatedAssistantMessage.content) !== null && _h !== void 0 ? _h : [];
334
+ const toolUseBlocks = responseContentBlocks.filter((block) => 'toolUse' in block);
335
+ const toolResponseContentBlocks = [];
336
+ for (const responseContentBlock of toolUseBlocks) {
337
+ const toolUseBlock = responseContentBlock;
338
+ const toolResultContentBlock = await this.executeTool(toolUseBlock);
339
+ toolResponseContentBlocks.push(toolResultContentBlock);
340
+ }
341
+ messages.push({
342
+ role: 'user',
343
+ content: toolResponseContentBlocks,
344
+ });
345
+ }
346
+ } while (stopReason === 'tool_use');
347
+ yield {
348
+ conversationId: this.event.conversationId,
349
+ associatedUserMessageId: this.event.currentMessageId,
350
+ contentBlockIndex: lastBlockIndex,
351
+ stopReason: stopReason,
352
+ };
353
+ }
192
354
  }
193
355
  exports.BedrockConverseAdapter = BedrockConverseAdapter;
194
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVkcm9ja19jb252ZXJzZV9hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnZlcnNhdGlvbi9ydW50aW1lL2JlZHJvY2tfY29udmVyc2VfYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0RUFTeUM7QUFNekMsaUVBQTRFO0FBQzVFLHFHQUErRjtBQUUvRjs7O0dBR0c7QUFDSCxNQUFhLHNCQUFzQjtJQVFqQzs7T0FFRztJQUNILFlBQ21CLEtBQTRCLEVBQzdDLGVBQXNDLEVBQ3JCLGdCQUFzQyxJQUFJLDZDQUFvQixDQUM3RSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQzVDLEVBQ0Qsa0JBQWtCLEdBQUcsSUFBSSx5REFBa0MsQ0FBQyxLQUFLLENBQUMsRUFDakQsMEJBQTBCLElBQUksNEVBQW1DLENBQ2hGLEtBQUssQ0FDTjs7UUFSZ0IsVUFBSyxHQUFMLEtBQUssQ0FBdUI7UUFFNUIsa0JBQWEsR0FBYixhQUFhLENBRTdCO1FBRWdCLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FFdkM7UUFoQmMseUJBQW9CLEdBQ25DLElBQUksR0FBRyxFQUFFLENBQUM7UUFDSyxxQkFBZ0IsR0FBZ0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQStDM0UsZUFBVSxHQUFHLEtBQUssSUFBNkIsRUFBRTs7WUFDL0MsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsc0JBQXNCLEVBQUUsR0FDckQsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztZQUVoQyxNQUFNLFFBQVEsR0FDWixNQUFNLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDO1lBRWpELElBQUksZUFBc0MsQ0FBQztZQUMzQyxHQUFHO2dCQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUNsRCxNQUFNLG9CQUFvQixHQUF5QjtvQkFDakQsT0FBTztvQkFDUCxRQUFRLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQztvQkFDdkIsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7b0JBQ2hDLGVBQWUsRUFBRSxzQkFBc0I7b0JBQ3ZDLFVBQVU7aUJBQ1gsQ0FBQztnQkFDRixlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDN0MsSUFBSSx3Q0FBZSxDQUFDLG9CQUFvQixDQUFDLENBQzFDLENBQUM7Z0JBQ0YsSUFBSSxNQUFBLGVBQWUsQ0FBQyxNQUFNLDBDQUFFLE9BQU8sRUFBRTtvQkFDbkMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFBLGVBQWUsQ0FBQyxNQUFNLDBDQUFFLE9BQU8sQ0FBQyxDQUFDO2lCQUNoRDtnQkFDRCxJQUFJLGVBQWUsQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFO29CQUM3QyxNQUFNLHFCQUFxQixHQUN6QixNQUFBLE1BQUEsTUFBQSxlQUFlLENBQUMsTUFBTSwwQ0FBRSxPQUFPLDBDQUFFLE9BQU8sbUNBQUksRUFBRSxDQUFDO29CQUNqRCxNQUFNLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLENBQ2hELENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxTQUFTLElBQUksS0FBSyxDQUNPLENBQUM7b0JBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcscUJBQXFCLENBQUMsTUFBTSxDQUN0RCxDQUFDLEtBQUssRUFBRSxFQUFFOzt3QkFDUixPQUFBLENBQUEsTUFBQSxLQUFLLENBQUMsT0FBTywwQ0FBRSxJQUFJOzRCQUNuQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQUEsS0FBSyxDQUFDLE9BQU8sMENBQUUsSUFBSSxDQUFDLENBQUE7cUJBQUEsQ0FDakQsQ0FBQztvQkFDRixJQUFJLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQ2xDLG9FQUFvRTt3QkFDcEUsdUNBQXVDO3dCQUN2QyxPQUFPLG1CQUFtQixDQUFDO3FCQUM1QjtvQkFDRCxLQUFLLE1BQU0sb0JBQW9CLElBQUksYUFBYSxFQUFFO3dCQUNoRCxNQUFNLFlBQVksR0FDaEIsb0JBQWtELENBQUM7d0JBQ3JELE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFDekQsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztxQkFDNUI7aUJBQ0Y7YUFDRixRQUFRLGVBQWUsQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFO1lBRXBELE9BQU8sTUFBQSxNQUFBLE1BQUEsZUFBZSxDQUFDLE1BQU0sMENBQUUsT0FBTywwQ0FBRSxPQUFPLG1DQUFJLEVBQUUsQ0FBQztRQUN4RCxDQUFDLENBQUM7UUFFRjs7OztXQUlHO1FBQ0ssc0NBQWlDLEdBQUcsS0FBSyxJQUUvQyxFQUFFOztZQUNGLE1BQU0sUUFBUSxHQUFtQixFQUFFLENBQUM7WUFDcEMsTUFBTSxhQUFhLEdBQ2pCLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekQsS0FBSyxNQUFNLE9BQU8sSUFBSSxhQUFhLEVBQUU7Z0JBQ25DLE1BQU0sY0FBYyxHQUF3QixFQUFFLENBQUM7Z0JBQy9DLEtBQUssTUFBTSxjQUFjLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtvQkFDNUMsSUFBSSxPQUFPLENBQUEsTUFBQSxNQUFBLGNBQWMsQ0FBQyxLQUFLLDBDQUFFLE1BQU0sMENBQUUsS0FBSyxDQUFBLEtBQUssUUFBUSxFQUFFO3dCQUMzRCxjQUFjLENBQUMsSUFBSSxDQUFDOzRCQUNsQixLQUFLLEVBQUU7Z0NBQ0wsTUFBTSxFQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUMsTUFBTTtnQ0FDbkMsTUFBTSxFQUFFO29DQUNOLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUM7aUNBQ2hFOzZCQUNGO3lCQUNGLENBQUMsQ0FBQztxQkFDSjt5QkFBTTt3QkFDTCxtRUFBbUU7d0JBQ25FLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBOEIsQ0FBQyxDQUFDO3FCQUNyRDtpQkFDRjtnQkFDRCxRQUFRLENBQUMsSUFBSSxDQUFDO29CQUNaLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtvQkFDbEIsT0FBTyxFQUFFLGNBQWM7aUJBQ3hCLENBQUMsQ0FBQzthQUNKO1lBQ0QsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQyxDQUFDO1FBRU0sNEJBQXVCLEdBQUcsR0FBa0MsRUFBRTtZQUNwRSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDOUIsT0FBTyxTQUFTLENBQUM7YUFDbEI7WUFFRCxPQUFPO2dCQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBUSxFQUFFO29CQUNuQyxPQUFPO3dCQUNMLFFBQVEsRUFBRTs0QkFDUixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7NEJBQ1osV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXOzRCQUMxQixXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVc7eUJBQzNCO3FCQUNGLENBQUM7Z0JBQ0osQ0FBQyxDQUFDO2FBQ0gsQ0FBQztRQUNKLENBQUMsQ0FBQztRQUVNLGdCQUFXLEdBQUcsS0FBSyxFQUN6QixZQUF3QyxFQUN0QixFQUFFO1lBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtnQkFDOUIsTUFBTSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQzthQUNqRTtZQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0RSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNULE1BQU0sS0FBSyxDQUNULG9EQUFvRCxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxDQUNqRixDQUFDO2FBQ0g7WUFDRCxJQUFJO2dCQUNGLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwRSxPQUFPO29CQUNMLElBQUksRUFBRSxNQUFNO29CQUNaLE9BQU8sRUFBRTt3QkFDUDs0QkFDRSxVQUFVLEVBQUU7Z0NBQ1YsU0FBUyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUztnQ0FDekMsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO2dDQUN2QixNQUFNLEVBQUUsU0FBUzs2QkFDbEI7eUJBQ0Y7cUJBQ0Y7aUJBQ0YsQ0FBQzthQUNIO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLFlBQVksS0FBSyxFQUFFO29CQUN0QixPQUFPO3dCQUNMLElBQUksRUFBRSxNQUFNO3dCQUNaLE9BQU8sRUFBRTs0QkFDUDtnQ0FDRSxVQUFVLEVBQUU7b0NBQ1YsU0FBUyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUztvQ0FDekMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7b0NBQ2pDLE1BQU0sRUFBRSxPQUFPO2lDQUNoQjs2QkFDRjt5QkFDRjtxQkFDRixDQUFDO2lCQUNIO2dCQUNELE9BQU87b0JBQ0wsSUFBSSxFQUFFLE1BQU07b0JBQ1osT0FBTyxFQUFFO3dCQUNQOzRCQUNFLFVBQVUsRUFBRTtnQ0FDVixTQUFTLEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTO2dDQUN6QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSx3QkFBd0IsRUFBRSxDQUFDO2dDQUM3QyxNQUFNLEVBQUUsT0FBTzs2QkFDaEI7eUJBQ0Y7cUJBQ0Y7aUJBQ0YsQ0FBQzthQUNIO1FBQ0gsQ0FBQyxDQUFDO1FBOUxBLElBQUksQ0FBQyxlQUFlLEdBQUc7WUFDckIsR0FBRyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUU7WUFDckMsR0FBRyxlQUFlO1NBQ25CLENBQUM7UUFDRixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQUEsTUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQiwwQ0FBRSxXQUFXLG1DQUFJLEVBQUUsQ0FBQztRQUNwRSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDekMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNqQyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN6QyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM1QjtZQUNELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDN0IsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDekMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDNUI7WUFDRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNyQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM1QjtZQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksY0FBYyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUU7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FDYixrREFBa0Q7Z0JBQ2hELEdBQUcsY0FBYzthQUNsQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNoQixDQUFDO1NBQ0g7SUFDSCxDQUFDO0NBa0tGO0FBck5ELHdEQXFOQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJlZHJvY2tSdW50aW1lQ2xpZW50LFxuICBDb250ZW50QmxvY2ssXG4gIENvbnZlcnNlQ29tbWFuZCxcbiAgQ29udmVyc2VDb21tYW5kSW5wdXQsXG4gIENvbnZlcnNlQ29tbWFuZE91dHB1dCxcbiAgTWVzc2FnZSxcbiAgVG9vbCxcbiAgVG9vbENvbmZpZ3VyYXRpb24sXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1iZWRyb2NrLXJ1bnRpbWUnO1xuaW1wb3J0IHtcbiAgQ29udmVyc2F0aW9uVHVybkV2ZW50LFxuICBFeGVjdXRhYmxlVG9vbCxcbiAgVG9vbERlZmluaXRpb24sXG59IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgQ29udmVyc2F0aW9uVHVybkV2ZW50VG9vbHNQcm92aWRlciB9IGZyb20gJy4vZXZlbnQtdG9vbHMtcHJvdmlkZXInO1xuaW1wb3J0IHsgQ29udmVyc2F0aW9uTWVzc2FnZUhpc3RvcnlSZXRyaWV2ZXIgfSBmcm9tICcuL2NvbnZlcnNhdGlvbl9tZXNzYWdlX2hpc3RvcnlfcmV0cmlldmVyJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBpbnRlcmFjdGluZyB3aXRoIEJlZHJvY2sgQ29udmVyc2UgQVBJXG4gKiBpbiBvcmRlciB0byBwcm9kdWNlIGZpbmFsIHJlc3BvbnNlIHRoYXQgY2FuIGJlIHNlbnQgYmFjayB0byBjYWxsZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBCZWRyb2NrQ29udmVyc2VBZGFwdGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxUb29sczogQXJyYXk8VG9vbERlZmluaXRpb24+O1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dGFibGVUb29sczogQXJyYXk8RXhlY3V0YWJsZVRvb2w+O1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudFRvb2xzOiBBcnJheTxUb29sRGVmaW5pdGlvbj47XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhlY3V0YWJsZVRvb2xCeU5hbWU6IE1hcDxzdHJpbmcsIEV4ZWN1dGFibGVUb29sPiA9XG4gICAgbmV3IE1hcCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudFRvb2xCeU5hbWU6IE1hcDxzdHJpbmcsIFRvb2xEZWZpbml0aW9uPiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBCZWRyb2NrIENvbnZlcnNlIEFkYXB0ZXIuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50OiBDb252ZXJzYXRpb25UdXJuRXZlbnQsXG4gICAgYWRkaXRpb25hbFRvb2xzOiBBcnJheTxFeGVjdXRhYmxlVG9vbD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBiZWRyb2NrQ2xpZW50OiBCZWRyb2NrUnVudGltZUNsaWVudCA9IG5ldyBCZWRyb2NrUnVudGltZUNsaWVudChcbiAgICAgIHsgcmVnaW9uOiBldmVudC5tb2RlbENvbmZpZ3VyYXRpb24ucmVnaW9uIH1cbiAgICApLFxuICAgIGV2ZW50VG9vbHNQcm92aWRlciA9IG5ldyBDb252ZXJzYXRpb25UdXJuRXZlbnRUb29sc1Byb3ZpZGVyKGV2ZW50KSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VIaXN0b3J5UmV0cmlldmVyID0gbmV3IENvbnZlcnNhdGlvbk1lc3NhZ2VIaXN0b3J5UmV0cmlldmVyKFxuICAgICAgZXZlbnRcbiAgICApXG4gICkge1xuICAgIHRoaXMuZXhlY3V0YWJsZVRvb2xzID0gW1xuICAgICAgLi4uZXZlbnRUb29sc1Byb3ZpZGVyLmdldEV2ZW50VG9vbHMoKSxcbiAgICAgIC4uLmFkZGl0aW9uYWxUb29scyxcbiAgICBdO1xuICAgIHRoaXMuY2xpZW50VG9vbHMgPSB0aGlzLmV2ZW50LnRvb2xzQ29uZmlndXJhdGlvbj8uY2xpZW50VG9vbHMgPz8gW107XG4gICAgdGhpcy5hbGxUb29scyA9IFsuLi50aGlzLmV4ZWN1dGFibGVUb29scywgLi4udGhpcy5jbGllbnRUb29sc107XG4gICAgY29uc3QgZHVwbGljYXRlVG9vbHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLmV4ZWN1dGFibGVUb29scy5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICBpZiAodGhpcy5leGVjdXRhYmxlVG9vbEJ5TmFtZS5oYXModC5uYW1lKSkge1xuICAgICAgICBkdXBsaWNhdGVUb29scy5hZGQodC5uYW1lKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhlY3V0YWJsZVRvb2xCeU5hbWUuc2V0KHQubmFtZSwgdCk7XG4gICAgfSk7XG4gICAgdGhpcy5jbGllbnRUb29scy5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICBpZiAodGhpcy5leGVjdXRhYmxlVG9vbEJ5TmFtZS5oYXModC5uYW1lKSkge1xuICAgICAgICBkdXBsaWNhdGVUb29scy5hZGQodC5uYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNsaWVudFRvb2xCeU5hbWUuaGFzKHQubmFtZSkpIHtcbiAgICAgICAgZHVwbGljYXRlVG9vbHMuYWRkKHQubmFtZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNsaWVudFRvb2xCeU5hbWUuc2V0KHQubmFtZSwgdCk7XG4gICAgfSk7XG4gICAgaWYgKGR1cGxpY2F0ZVRvb2xzLnNpemUgPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUb29scyBtdXN0IGhhdmUgdW5pcXVlIG5hbWVzLiBEdXBsaWNhdGUgdG9vbHM6ICR7W1xuICAgICAgICAgIC4uLmR1cGxpY2F0ZVRvb2xzLFxuICAgICAgICBdLmpvaW4oJywgJyl9LmBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXNrQmVkcm9jayA9IGFzeW5jICgpOiBQcm9taXNlPENvbnRlbnRCbG9ja1tdPiA9PiB7XG4gICAgY29uc3QgeyBtb2RlbElkLCBzeXN0ZW1Qcm9tcHQsIGluZmVyZW5jZUNvbmZpZ3VyYXRpb24gfSA9XG4gICAgICB0aGlzLmV2ZW50Lm1vZGVsQ29uZmlndXJhdGlvbjtcblxuICAgIGNvbnN0IG1lc3NhZ2VzOiBBcnJheTxNZXNzYWdlPiA9XG4gICAgICBhd2FpdCB0aGlzLmdldEV2ZW50TWVzc2FnZXNBc0JlZHJvY2tNZXNzYWdlcygpO1xuXG4gICAgbGV0IGJlZHJvY2tSZXNwb25zZTogQ29udmVyc2VDb21tYW5kT3V0cHV0O1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IHRvb2xDb25maWcgPSB0aGlzLmNyZWF0ZVRvb2xDb25maWd1cmF0aW9uKCk7XG4gICAgICBjb25zdCBjb252ZXJzZUNvbW1hbmRJbnB1dDogQ29udmVyc2VDb21tYW5kSW5wdXQgPSB7XG4gICAgICAgIG1vZGVsSWQsXG4gICAgICAgIG1lc3NhZ2VzOiBbLi4ubWVzc2FnZXNdLFxuICAgICAgICBzeXN0ZW06IFt7IHRleHQ6IHN5c3RlbVByb21wdCB9XSxcbiAgICAgICAgaW5mZXJlbmNlQ29uZmlnOiBpbmZlcmVuY2VDb25maWd1cmF0aW9uLFxuICAgICAgICB0b29sQ29uZmlnLFxuICAgICAgfTtcbiAgICAgIGJlZHJvY2tSZXNwb25zZSA9IGF3YWl0IHRoaXMuYmVkcm9ja0NsaWVudC5zZW5kKFxuICAgICAgICBuZXcgQ29udmVyc2VDb21tYW5kKGNvbnZlcnNlQ29tbWFuZElucHV0KVxuICAgICAgKTtcbiAgICAgIGlmIChiZWRyb2NrUmVzcG9uc2Uub3V0cHV0Py5tZXNzYWdlKSB7XG4gICAgICAgIG1lc3NhZ2VzLnB1c2goYmVkcm9ja1Jlc3BvbnNlLm91dHB1dD8ubWVzc2FnZSk7XG4gICAgICB9XG4gICAgICBpZiAoYmVkcm9ja1Jlc3BvbnNlLnN0b3BSZWFzb24gPT09ICd0b29sX3VzZScpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VDb250ZW50QmxvY2tzID1cbiAgICAgICAgICBiZWRyb2NrUmVzcG9uc2Uub3V0cHV0Py5tZXNzYWdlPy5jb250ZW50ID8/IFtdO1xuICAgICAgICBjb25zdCB0b29sVXNlQmxvY2tzID0gcmVzcG9uc2VDb250ZW50QmxvY2tzLmZpbHRlcihcbiAgICAgICAgICAoYmxvY2spID0+ICd0b29sVXNlJyBpbiBibG9ja1xuICAgICAgICApIGFzIEFycmF5PENvbnRlbnRCbG9jay5Ub29sVXNlTWVtYmVyPjtcbiAgICAgICAgY29uc3QgY2xpZW50VG9vbFVzZUJsb2NrcyA9IHJlc3BvbnNlQ29udGVudEJsb2Nrcy5maWx0ZXIoXG4gICAgICAgICAgKGJsb2NrKSA9PlxuICAgICAgICAgICAgYmxvY2sudG9vbFVzZT8ubmFtZSAmJlxuICAgICAgICAgICAgdGhpcy5jbGllbnRUb29sQnlOYW1lLmhhcyhibG9jay50b29sVXNlPy5uYW1lKVxuICAgICAgICApO1xuICAgICAgICBpZiAoY2xpZW50VG9vbFVzZUJsb2Nrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gRm9yIG5vdyBpZiBhbnkgb2YgY2xpZW50IHRvb2xzIGlzIHVzZWQgd2UgaWdub3JlIGV4ZWN1dGFibGUgdG9vbHNcbiAgICAgICAgICAvLyBhbmQgcHJvcGFnYXRlIHJlc3VsdCBiYWNrIHRvIGNsaWVudC5cbiAgICAgICAgICByZXR1cm4gY2xpZW50VG9vbFVzZUJsb2NrcztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlQ29udGVudEJsb2NrIG9mIHRvb2xVc2VCbG9ja3MpIHtcbiAgICAgICAgICBjb25zdCB0b29sVXNlQmxvY2sgPVxuICAgICAgICAgICAgcmVzcG9uc2VDb250ZW50QmxvY2sgYXMgQ29udGVudEJsb2NrLlRvb2xVc2VNZW1iZXI7XG4gICAgICAgICAgY29uc3QgdG9vbE1lc3NhZ2UgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUb29sKHRvb2xVc2VCbG9jayk7XG4gICAgICAgICAgbWVzc2FnZXMucHVzaCh0b29sTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IHdoaWxlIChiZWRyb2NrUmVzcG9uc2Uuc3RvcFJlYXNvbiA9PT0gJ3Rvb2xfdXNlJyk7XG5cbiAgICByZXR1cm4gYmVkcm9ja1Jlc3BvbnNlLm91dHB1dD8ubWVzc2FnZT8uY29udGVudCA/PyBbXTtcbiAgfTtcblxuICAvKipcbiAgICogTWFwcyBldmVudCBtZXNzYWdlcyB0byBCZWRyb2NrIHR5cGVzLlxuICAgKiAxLiBNYWtlcyBhIGNvcHkgc28gdGhhdCB3ZSBkb24ndCBtdXRhdGUgZXZlbnQuXG4gICAqIDIuIERlY29kZXMgQmFzZTY0IGVuY29kZWQgaW1hZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFdmVudE1lc3NhZ2VzQXNCZWRyb2NrTWVzc2FnZXMgPSBhc3luYyAoKTogUHJvbWlzZTxcbiAgICBBcnJheTxNZXNzYWdlPlxuICA+ID0+IHtcbiAgICBjb25zdCBtZXNzYWdlczogQXJyYXk8TWVzc2FnZT4gPSBbXTtcbiAgICBjb25zdCBldmVudE1lc3NhZ2VzID1cbiAgICAgIGF3YWl0IHRoaXMubWVzc2FnZUhpc3RvcnlSZXRyaWV2ZXIuZ2V0TWVzc2FnZUhpc3RvcnkoKTtcbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgZXZlbnRNZXNzYWdlcykge1xuICAgICAgY29uc3QgbWVzc2FnZUNvbnRlbnQ6IEFycmF5PENvbnRlbnRCbG9jaz4gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgY29udGVudEVsZW1lbnQgb2YgbWVzc2FnZS5jb250ZW50KSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29udGVudEVsZW1lbnQuaW1hZ2U/LnNvdXJjZT8uYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgbWVzc2FnZUNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICBpbWFnZToge1xuICAgICAgICAgICAgICBmb3JtYXQ6IGNvbnRlbnRFbGVtZW50LmltYWdlLmZvcm1hdCxcbiAgICAgICAgICAgICAgc291cmNlOiB7XG4gICAgICAgICAgICAgICAgYnl0ZXM6IEJ1ZmZlci5mcm9tKGNvbnRlbnRFbGVtZW50LmltYWdlLnNvdXJjZS5ieXRlcywgJ2Jhc2U2NCcpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBPdGhlcndpc2UgdHlwZSBjb25mb3JtcyB0byBCZWRyb2NrJ3MgdHlwZSBhbmQgaXQncyBzYWZlIHRvIGNhc3QuXG4gICAgICAgICAgbWVzc2FnZUNvbnRlbnQucHVzaChjb250ZW50RWxlbWVudCBhcyBDb250ZW50QmxvY2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgcm9sZTogbWVzc2FnZS5yb2xlLFxuICAgICAgICBjb250ZW50OiBtZXNzYWdlQ29udGVudCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZXM7XG4gIH07XG5cbiAgcHJpdmF0ZSBjcmVhdGVUb29sQ29uZmlndXJhdGlvbiA9ICgpOiBUb29sQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHRoaXMuYWxsVG9vbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0b29sczogdGhpcy5hbGxUb29scy5tYXAoKHQpOiBUb29sID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0b29sU3BlYzoge1xuICAgICAgICAgICAgbmFtZTogdC5uYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHQuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBpbnB1dFNjaGVtYTogdC5pbnB1dFNjaGVtYSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfTtcbiAgfTtcblxuICBwcml2YXRlIGV4ZWN1dGVUb29sID0gYXN5bmMgKFxuICAgIHRvb2xVc2VCbG9jazogQ29udGVudEJsb2NrLlRvb2xVc2VNZW1iZXJcbiAgKTogUHJvbWlzZTxNZXNzYWdlPiA9PiB7XG4gICAgaWYgKCF0b29sVXNlQmxvY2sudG9vbFVzZS5uYW1lKSB7XG4gICAgICB0aHJvdyBFcnJvcignQmVkcm9jayB0b29sIHVzZSByZXNwb25zZSBpcyBtaXNzaW5nIGEgdG9vbCBuYW1lJyk7XG4gICAgfVxuICAgIGNvbnN0IHRvb2wgPSB0aGlzLmV4ZWN1dGFibGVUb29sQnlOYW1lLmdldCh0b29sVXNlQmxvY2sudG9vbFVzZS5uYW1lKTtcbiAgICBpZiAoIXRvb2wpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgQmVkcm9jayB0b29sIHVzZSByZXNwb25zZSBjb250YWlucyB1bmtub3duIHRvb2wgJyR7dG9vbFVzZUJsb2NrLnRvb2xVc2UubmFtZX0nYFxuICAgICAgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRvb2xSZXNwb25zZSA9IGF3YWl0IHRvb2wuZXhlY3V0ZSh0b29sVXNlQmxvY2sudG9vbFVzZS5pbnB1dCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByb2xlOiAndXNlcicsXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0b29sUmVzdWx0OiB7XG4gICAgICAgICAgICAgIHRvb2xVc2VJZDogdG9vbFVzZUJsb2NrLnRvb2xVc2UudG9vbFVzZUlkLFxuICAgICAgICAgICAgICBjb250ZW50OiBbdG9vbFJlc3BvbnNlXSxcbiAgICAgICAgICAgICAgc3RhdHVzOiAnc3VjY2VzcycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByb2xlOiAndXNlcicsXG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0b29sUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgdG9vbFVzZUlkOiB0b29sVXNlQmxvY2sudG9vbFVzZS50b29sVXNlSWQsXG4gICAgICAgICAgICAgICAgY29udGVudDogW3sgdGV4dDogZS50b1N0cmluZygpIH1dLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJvbGU6ICd1c2VyJyxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRvb2xSZXN1bHQ6IHtcbiAgICAgICAgICAgICAgdG9vbFVzZUlkOiB0b29sVXNlQmxvY2sudG9vbFVzZS50b29sVXNlSWQsXG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7IHRleHQ6ICd1bmtub3duIGVycm9yIG9jY3VycmVkJyB9XSxcbiAgICAgICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH07XG59XG4iXX0=
356
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVkcm9ja19jb252ZXJzZV9hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnZlcnNhdGlvbi9ydW50aW1lL2JlZHJvY2tfY29udmVyc2VfYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0RUFheUM7QUFPekMsaUVBQTRFO0FBQzVFLHFHQUErRjtBQUUvRjs7O0dBR0c7QUFDSCxNQUFhLHNCQUFzQjtJQVFqQzs7T0FFRztJQUNILFlBQ21CLEtBQTRCLEVBQzdDLGVBQXNDLEVBQ3JCLGdCQUFzQyxJQUFJLDZDQUFvQixDQUM3RSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQzVDLEVBQ0Qsa0JBQWtCLEdBQUcsSUFBSSx5REFBa0MsQ0FBQyxLQUFLLENBQUMsRUFDakQsMEJBQTBCLElBQUksNEVBQW1DLENBQ2hGLEtBQUssQ0FDTixFQUNnQixTQUFTLE9BQU87O1FBVGhCLFVBQUssR0FBTCxLQUFLLENBQXVCO1FBRTVCLGtCQUFhLEdBQWIsYUFBYSxDQUU3QjtRQUVnQiw0QkFBdUIsR0FBdkIsdUJBQXVCLENBRXZDO1FBQ2dCLFdBQU0sR0FBTixNQUFNLENBQVU7UUFqQmxCLHlCQUFvQixHQUNuQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ0sscUJBQWdCLEdBQWdDLElBQUksR0FBRyxFQUFFLENBQUM7UUErRDNFLGVBQVUsR0FBRyxLQUFLLElBQTZCLEVBQUU7O1lBQy9DLE1BQU0sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLHNCQUFzQixFQUFFLEdBQ3JELElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUM7WUFFaEMsTUFBTSxRQUFRLEdBQ1osTUFBTSxJQUFJLENBQUMsaUNBQWlDLEVBQUUsQ0FBQztZQUVqRCxJQUFJLGVBQXNDLENBQUM7WUFDM0MsR0FBRztnQkFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVB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QUFLLFVBQVUsRUFBRTtRQUVwQyxNQUFNO1lBQ0osY0FBYyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYztZQUN6Qyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQjtZQUNwRCxpQkFBaUIsRUFBRSxjQUFjO1lBQ2pDLFVBQVUsRUFBRSxVQUFVO1NBQ3ZCLENBQUM7SUFDSixDQUFDO0NBc0dGO0FBM1lELHdEQTJZQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJlZHJvY2tSdW50aW1lQ2xpZW50LFxuICBDb250ZW50QmxvY2ssXG4gIENvbnZlcnNlQ29tbWFuZCxcbiAgQ29udmVyc2VDb21tYW5kSW5wdXQsXG4gIENvbnZlcnNlQ29tbWFuZE91dHB1dCxcbiAgQ29udmVyc2VTdHJlYW1Db21tYW5kLFxuICBDb252ZXJzZVN0cmVhbUNvbW1hbmRJbnB1dCxcbiAgQ29udmVyc2VTdHJlYW1Db21tYW5kT3V0cHV0LFxuICBNZXNzYWdlLFxuICBUb29sLFxuICBUb29sQ29uZmlndXJhdGlvbixcbiAgVG9vbElucHV0U2NoZW1hLFxufSBmcm9tICdAYXdzLXNkay9jbGllbnQtYmVkcm9jay1ydW50aW1lJztcbmltcG9ydCB7XG4gIENvbnZlcnNhdGlvblR1cm5FdmVudCxcbiAgRXhlY3V0YWJsZVRvb2wsXG4gIFN0cmVhbWluZ1Jlc3BvbnNlQ2h1bmssXG4gIFRvb2xEZWZpbml0aW9uLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IENvbnZlcnNhdGlvblR1cm5FdmVudFRvb2xzUHJvdmlkZXIgfSBmcm9tICcuL2V2ZW50LXRvb2xzLXByb3ZpZGVyJztcbmltcG9ydCB7IENvbnZlcnNhdGlvbk1lc3NhZ2VIaXN0b3J5UmV0cmlldmVyIH0gZnJvbSAnLi9jb252ZXJzYXRpb25fbWVzc2FnZV9oaXN0b3J5X3JldHJpZXZlcic7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBCZWRyb2NrIENvbnZlcnNlIEFQSVxuICogaW4gb3JkZXIgdG8gcHJvZHVjZSBmaW5hbCByZXNwb25zZSB0aGF0IGNhbiBiZSBzZW50IGJhY2sgdG8gY2FsbGVyLlxuICovXG5leHBvcnQgY2xhc3MgQmVkcm9ja0NvbnZlcnNlQWRhcHRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsVG9vbHM6IEFycmF5PFRvb2xEZWZpbml0aW9uPjtcbiAgcHJpdmF0ZSByZWFkb25seSBleGVjdXRhYmxlVG9vbHM6IEFycmF5PEV4ZWN1dGFibGVUb29sPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnRUb29sczogQXJyYXk8VG9vbERlZmluaXRpb24+O1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dGFibGVUb29sQnlOYW1lOiBNYXA8c3RyaW5nLCBFeGVjdXRhYmxlVG9vbD4gPVxuICAgIG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnRUb29sQnlOYW1lOiBNYXA8c3RyaW5nLCBUb29sRGVmaW5pdGlvbj4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgQmVkcm9jayBDb252ZXJzZSBBZGFwdGVyLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudDogQ29udmVyc2F0aW9uVHVybkV2ZW50LFxuICAgIGFkZGl0aW9uYWxUb29sczogQXJyYXk8RXhlY3V0YWJsZVRvb2w+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYmVkcm9ja0NsaWVudDogQmVkcm9ja1J1bnRpbWVDbGllbnQgPSBuZXcgQmVkcm9ja1J1bnRpbWVDbGllbnQoXG4gICAgICB7IHJlZ2lvbjogZXZlbnQubW9kZWxDb25maWd1cmF0aW9uLnJlZ2lvbiB9XG4gICAgKSxcbiAgICBldmVudFRvb2xzUHJvdmlkZXIgPSBuZXcgQ29udmVyc2F0aW9uVHVybkV2ZW50VG9vbHNQcm92aWRlcihldmVudCksXG4gICAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlSGlzdG9yeVJldHJpZXZlciA9IG5ldyBDb252ZXJzYXRpb25NZXNzYWdlSGlzdG9yeVJldHJpZXZlcihcbiAgICAgIGV2ZW50XG4gICAgKSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IGNvbnNvbGVcbiAgKSB7XG4gICAgaWYgKGV2ZW50LnJlcXVlc3QuaGVhZGVyc1sneC1hbXotdXNlci1hZ2VudCddKSB7XG4gICAgICB0aGlzLmJlZHJvY2tDbGllbnQubWlkZGxld2FyZVN0YWNrLmFkZChcbiAgICAgICAgKG5leHQpID0+IChhcmdzKSA9PiB7XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBSZXF1ZXN0IGlzIHR5cGVkIGFzIHVua25vd24uXG4gICAgICAgICAgLy8gQnV0IHRoaXMgaXMgcmVjb21tZW5kZWQgd2F5IHRvIGFsdGVyIGhlYWRlcnMgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1qcy12My9ibG9iL21haW4vUkVBRE1FLm1kLlxuICAgICAgICAgIGFyZ3MucmVxdWVzdC5oZWFkZXJzWyd4LWFtei11c2VyLWFnZW50J10gPVxuICAgICAgICAgICAgZXZlbnQucmVxdWVzdC5oZWFkZXJzWyd4LWFtei11c2VyLWFnZW50J107XG4gICAgICAgICAgcmV0dXJuIG5leHQoYXJncyk7XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzdGVwOiAnYnVpbGQnLFxuICAgICAgICAgIG5hbWU6ICdhbXBsaWZ5LXVzZXItYWdlbnQtaW5qZWN0b3InLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmV4ZWN1dGFibGVUb29scyA9IFtcbiAgICAgIC4uLmV2ZW50VG9vbHNQcm92aWRlci5nZXRFdmVudFRvb2xzKCksXG4gICAgICAuLi5hZGRpdGlvbmFsVG9vbHMsXG4gICAgXTtcbiAgICB0aGlzLmNsaWVudFRvb2xzID0gdGhpcy5ldmVudC50b29sc0NvbmZpZ3VyYXRpb24/LmNsaWVudFRvb2xzID8/IFtdO1xuICAgIHRoaXMuYWxsVG9vbHMgPSBbLi4udGhpcy5leGVjdXRhYmxlVG9vbHMsIC4uLnRoaXMuY2xpZW50VG9vbHNdO1xuICAgIGNvbnN0IGR1cGxpY2F0ZVRvb2xzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgdGhpcy5leGVjdXRhYmxlVG9vbHMuZm9yRWFjaCgodCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZXhlY3V0YWJsZVRvb2xCeU5hbWUuaGFzKHQubmFtZSkpIHtcbiAgICAgICAgZHVwbGljYXRlVG9vbHMuYWRkKHQubmFtZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmV4ZWN1dGFibGVUb29sQnlOYW1lLnNldCh0Lm5hbWUsIHQpO1xuICAgIH0pO1xuICAgIHRoaXMuY2xpZW50VG9vbHMuZm9yRWFjaCgodCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZXhlY3V0YWJsZVRvb2xCeU5hbWUuaGFzKHQubmFtZSkpIHtcbiAgICAgICAgZHVwbGljYXRlVG9vbHMuYWRkKHQubmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jbGllbnRUb29sQnlOYW1lLmhhcyh0Lm5hbWUpKSB7XG4gICAgICAgIGR1cGxpY2F0ZVRvb2xzLmFkZCh0Lm5hbWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5jbGllbnRUb29sQnlOYW1lLnNldCh0Lm5hbWUsIHQpO1xuICAgIH0pO1xuICAgIGlmIChkdXBsaWNhdGVUb29scy5zaXplID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVG9vbHMgbXVzdCBoYXZlIHVuaXF1ZSBuYW1lcy4gRHVwbGljYXRlIHRvb2xzOiAke1tcbiAgICAgICAgICAuLi5kdXBsaWNhdGVUb29scyxcbiAgICAgICAgXS5qb2luKCcsICcpfS5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFza0JlZHJvY2sgPSBhc3luYyAoKTogUHJvbWlzZTxDb250ZW50QmxvY2tbXT4gPT4ge1xuICAgIGNvbnN0IHsgbW9kZWxJZCwgc3lzdGVtUHJvbXB0LCBpbmZlcmVuY2VDb25maWd1cmF0aW9uIH0gPVxuICAgICAgdGhpcy5ldmVudC5tb2RlbENvbmZpZ3VyYXRpb247XG5cbiAgICBjb25zdCBtZXNzYWdlczogQXJyYXk8TWVzc2FnZT4gPVxuICAgICAgYXdhaXQgdGhpcy5nZXRFdmVudE1lc3NhZ2VzQXNCZWRyb2NrTWVzc2FnZXMoKTtcblxuICAgIGxldCBiZWRyb2NrUmVzcG9uc2U6IENvbnZlcnNlQ29tbWFuZE91dHB1dDtcbiAgICBkbyB7XG4gICAgICBjb25zdCB0b29sQ29uZmlnID0gdGhpcy5jcmVhdGVUb29sQ29uZmlndXJhdGlvbigpO1xuICAgICAgY29uc3QgY29udmVyc2VDb21tYW5kSW5wdXQ6IENvbnZlcnNlQ29tbWFuZElucHV0ID0ge1xuICAgICAgICBtb2RlbElkLFxuICAgICAgICBtZXNzYWdlczogWy4uLm1lc3NhZ2VzXSxcbiAgICAgICAgc3lzdGVtOiBbeyB0ZXh0OiBzeXN0ZW1Qcm9tcHQgfV0sXG4gICAgICAgIGluZmVyZW5jZUNvbmZpZzogaW5mZXJlbmNlQ29uZmlndXJhdGlvbixcbiAgICAgICAgdG9vbENvbmZpZyxcbiAgICAgIH07XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKCdTZW5kaW5nIEJlZHJvY2sgQ29udmVyc2UgcmVxdWVzdCcpO1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0JlZHJvY2sgQ29udmVyc2UgcmVxdWVzdDonLCBjb252ZXJzZUNvbW1hbmRJbnB1dCk7XG4gICAgICBiZWRyb2NrUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJlZHJvY2tDbGllbnQuc2VuZChcbiAgICAgICAgbmV3IENvbnZlcnNlQ29tbWFuZChjb252ZXJzZUNvbW1hbmRJbnB1dClcbiAgICAgICk7XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICBgUmVjZWl2ZWQgQmVkcm9jayBDb252ZXJzZSByZXNwb25zZSwgcmVxdWVzdElkPSR7YmVkcm9ja1Jlc3BvbnNlLiRtZXRhZGF0YS5yZXF1ZXN0SWR9YCxcbiAgICAgICAgYmVkcm9ja1Jlc3BvbnNlLnVzYWdlXG4gICAgICApO1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0JlZHJvY2sgQ29udmVyc2UgcmVzcG9uc2U6JywgYmVkcm9ja1Jlc3BvbnNlKTtcbiAgICAgIGlmIChiZWRyb2NrUmVzcG9uc2Uub3V0cHV0Py5tZXNzYWdlKSB7XG4gICAgICAgIG1lc3NhZ2VzLnB1c2goYmVkcm9ja1Jlc3BvbnNlLm91dHB1dD8ubWVzc2FnZSk7XG4gICAgICB9XG4gICAgICBpZiAoYmVkcm9ja1Jlc3BvbnNlLnN0b3BSZWFzb24gPT09ICd0b29sX3VzZScpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VDb250ZW50QmxvY2tzID1cbiAgICAgICAgICBiZWRyb2NrUmVzcG9uc2Uub3V0cHV0Py5tZXNzYWdlPy5jb250ZW50ID8/IFtdO1xuICAgICAgICBjb25zdCB0b29sVXNlQmxvY2tzID0gcmVzcG9uc2VDb250ZW50QmxvY2tzLmZpbHRlcihcbiAgICAgICAgICAoYmxvY2spID0+ICd0b29sVXNlJyBpbiBibG9ja1xuICAgICAgICApIGFzIEFycmF5PENvbnRlbnRCbG9jay5Ub29sVXNlTWVtYmVyPjtcbiAgICAgICAgY29uc3QgY2xpZW50VG9vbFVzZUJsb2NrcyA9IHJlc3BvbnNlQ29udGVudEJsb2Nrcy5maWx0ZXIoXG4gICAgICAgICAgKGJsb2NrKSA9PlxuICAgICAgICAgICAgYmxvY2sudG9vbFVzZT8ubmFtZSAmJlxuICAgICAgICAgICAgdGhpcy5jbGllbnRUb29sQnlOYW1lLmhhcyhibG9jay50b29sVXNlPy5uYW1lKVxuICAgICAgICApO1xuICAgICAgICBpZiAoY2xpZW50VG9vbFVzZUJsb2Nrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gRm9yIG5vdyBpZiBhbnkgb2YgY2xpZW50IHRvb2xzIGlzIHVzZWQgd2UgaWdub3JlIGV4ZWN1dGFibGUgdG9vbHNcbiAgICAgICAgICAvLyBhbmQgcHJvcGFnYXRlIHJlc3VsdCBiYWNrIHRvIGNsaWVudC5cbiAgICAgICAgICByZXR1cm4gY2xpZW50VG9vbFVzZUJsb2NrcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b29sUmVzcG9uc2VDb250ZW50QmxvY2tzOiBBcnJheTxDb250ZW50QmxvY2s+ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2VDb250ZW50QmxvY2sgb2YgdG9vbFVzZUJsb2Nrcykge1xuICAgICAgICAgIGNvbnN0IHRvb2xVc2VCbG9jayA9XG4gICAgICAgICAgICByZXNwb25zZUNvbnRlbnRCbG9jayBhcyBDb250ZW50QmxvY2suVG9vbFVzZU1lbWJlcjtcbiAgICAgICAgICBjb25zdCB0b29sUmVzdWx0Q29udGVudEJsb2NrID0gYXdhaXQgdGhpcy5leGVjdXRlVG9vbCh0b29sVXNlQmxvY2spO1xuICAgICAgICAgIHRvb2xSZXNwb25zZUNvbnRlbnRCbG9ja3MucHVzaCh0b29sUmVzdWx0Q29udGVudEJsb2NrKTtcbiAgICAgICAgfVxuICAgICAgICBtZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgICByb2xlOiAndXNlcicsXG4gICAgICAgICAgY29udGVudDogdG9vbFJlc3BvbnNlQ29udGVudEJsb2NrcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoYmVkcm9ja1Jlc3BvbnNlLnN0b3BSZWFzb24gPT09ICd0b29sX3VzZScpO1xuXG4gICAgcmV0dXJuIGJlZHJvY2tSZXNwb25zZS5vdXRwdXQ/Lm1lc3NhZ2U/LmNvbnRlbnQgPz8gW107XG4gIH07XG5cbiAgLyoqXG4gICAqIEFza3MgQmVkcm9jayBmb3IgcmVzcG9uc2UgdXNpbmcgc3RyZWFtaW5nIHZlcnNpb24gb2YgQ29udmVyc2UgQVBJLlxuICAgKi9cbiAgYXN5bmMgKmFza0JlZHJvY2tTdHJlYW1pbmcoKTogQXN5bmNHZW5lcmF0b3I8U3RyZWFtaW5nUmVzcG9uc2VDaHVuaz4ge1xuICAgIGNvbnN0IHsgbW9kZWxJZCwgc3lzdGVtUHJvbXB0LCBpbmZlcmVuY2VDb25maWd1cmF0aW9uIH0gPVxuICAgICAgdGhpcy5ldmVudC5tb2RlbENvbmZpZ3VyYXRpb247XG5cbiAgICBjb25zdCBtZXNzYWdlczogQXJyYXk8TWVzc2FnZT4gPVxuICAgICAgYXdhaXQgdGhpcy5nZXRFdmVudE1lc3NhZ2VzQXNCZWRyb2NrTWVzc2FnZXMoKTtcblxuICAgIGxldCBiZWRyb2NrUmVzcG9uc2U6IENvbnZlcnNlU3RyZWFtQ29tbWFuZE91dHB1dDtcbiAgICAvLyBrZWVwIG91ciBvd24gaW5kZXhpbmcgZm9yIGJsb2NrcyBpbnN0ZWFkIG9mIHVzaW5nIEJlZHJvY2sncyBpbmRleGVzXG4gICAgLy8gc2luY2Ugd2Ugc3RyZWFtIHN1YnNldCBvZiB0aGVzZSB1cHN0cmVhbS5cbiAgICBsZXQgYmxvY2tJbmRleCA9IDA7XG4gICAgbGV0IGxhc3RCbG9ja0luZGV4ID0gMDtcbiAgICBsZXQgc3RvcFJlYXNvbiA9ICcnO1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IHRvb2xDb25maWcgPSB0aGlzLmNyZWF0ZVRvb2xDb25maWd1cmF0aW9uKCk7XG4gICAgICBjb25zdCBjb252ZXJzZUNvbW1hbmRJbnB1dDogQ29udmVyc2VTdHJlYW1Db21tYW5kSW5wdXQgPSB7XG4gICAgICAgIG1vZGVsSWQsXG4gICAgICAgIG1lc3NhZ2VzOiBbLi4ubWVzc2FnZXNdLFxuICAgICAgICBzeXN0ZW06IFt7IHRleHQ6IHN5c3RlbVByb21wdCB9XSxcbiAgICAgICAgaW5mZXJlbmNlQ29uZmlnOiBpbmZlcmVuY2VDb25maWd1cmF0aW9uLFxuICAgICAgICB0b29sQ29uZmlnLFxuICAgICAgfTtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ1NlbmRpbmcgQmVkcm9jayBDb252ZXJzZSBTdHJlYW0gcmVxdWVzdCcpO1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICdCZWRyb2NrIENvbnZlcnNlIFN0cmVhbSByZXF1ZXN0OicsXG4gICAgICAgIGNvbnZlcnNlQ29tbWFuZElucHV0XG4gICAgICApO1xuICAgICAgYmVkcm9ja1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5iZWRyb2NrQ2xpZW50LnNlbmQoXG4gICAgICAgIG5ldyBDb252ZXJzZVN0cmVhbUNvbW1hbmQoY29udmVyc2VDb21tYW5kSW5wdXQpXG4gICAgICApO1xuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgYFJlY2VpdmVkIEJlZHJvY2sgQ29udmVyc2UgU3RyZWFtIHJlc3BvbnNlLCByZXF1ZXN0SWQ9JHtiZWRyb2NrUmVzcG9uc2UuJG1ldGFkYXRhLnJlcXVlc3RJZH1gXG4gICAgICApO1xuICAgICAgaWYgKCFiZWRyb2NrUmVzcG9uc2Uuc3RyZWFtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQmVkcm9jayByZXNwb25zZSBpcyBtaXNzaW5nIHN0cmVhbScpO1xuICAgICAgfVxuICAgICAgbGV0IHRvb2xVc2VCbG9jazogQ29udGVudEJsb2NrLlRvb2xVc2VNZW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgY2xpZW50VG9vbHNSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICAgIGxldCB0ZXh0OiBzdHJpbmcgPSAnJztcbiAgICAgIGxldCB0b29sVXNlSW5wdXQ6IHN0cmluZyA9ICcnO1xuICAgICAgbGV0IGJsb2NrRGVsdGFJbmRleCA9IDA7XG4gICAgICBsZXQgbGFzdEJsb2NrRGVsdGFJbmRleCA9IDA7XG4gICAgICBjb25zdCBhY2N1bXVsYXRlZEFzc2lzdGFudE1lc3NhZ2U6IE1lc3NhZ2UgPSB7XG4gICAgICAgIHJvbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGVudDogW10sXG4gICAgICB9O1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBiZWRyb2NrUmVzcG9uc2Uuc3RyZWFtKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdCZWRyb2NrIENvbnZlcnNlIFN0cmVhbSByZXNwb25zZSBjaHVuazonLCBjaHVuayk7XG4gICAgICAgIGlmIChjaHVuay5tZXNzYWdlU3RhcnQpIHtcbiAgICAgICAgICBhY2N1bXVsYXRlZEFzc2lzdGFudE1lc3NhZ2Uucm9sZSA9IGNodW5rLm1lc3NhZ2VTdGFydC5yb2xlO1xuICAgICAgICB9IGVsc2UgaWYgKGNodW5rLmNvbnRlbnRCbG9ja1N0YXJ0KSB7XG4gICAgICAgICAgYmxvY2tEZWx0YUluZGV4ID0gMDtcbiAgICAgICAgICBsYXN0QmxvY2tEZWx0YUluZGV4ID0gMDtcbiAgICAgICAgICBpZiAoY2h1bmsuY29udGVudEJsb2NrU3RhcnQuc3RhcnQ/LnRvb2xVc2UpIHtcbiAgICAgICAgICAgIHRvb2xVc2VCbG9jayA9IHtcbiAgICAgICAgICAgICAgdG9vbFVzZToge1xuICAgICAgICAgICAgICAgIC4uLmNodW5rLmNvbnRlbnRCbG9ja1N0YXJ0LnN0YXJ0Py50b29sVXNlLFxuICAgICAgICAgICAgICAgIGlucHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjaHVuay5jb250ZW50QmxvY2tEZWx0YSkge1xuICAgICAgICAgIGlmIChjaHVuay5jb250ZW50QmxvY2tEZWx0YS5kZWx0YT8udG9vbFVzZSkge1xuICAgICAgICAgICAgaWYgKCFjaHVuay5jb250ZW50QmxvY2tEZWx0YS5kZWx0YS50b29sVXNlLmlucHV0KSB7XG4gICAgICAgICAgICAgIHRvb2xVc2VJbnB1dCA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9vbFVzZUlucHV0ICs9IGNodW5rLmNvbnRlbnRCbG9ja0RlbHRhLmRlbHRhLnRvb2xVc2UuaW5wdXQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaHVuay5jb250ZW50QmxvY2tEZWx0YS5kZWx0YT8udGV4dCkge1xuICAgICAgICAgICAgdGV4dCArPSBjaHVuay5jb250ZW50QmxvY2tEZWx0YS5kZWx0YS50ZXh0O1xuICAgICAgICAgICAgeWllbGQge1xuICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZDogdGhpcy5ldmVudC5jb252ZXJzYXRpb25JZCxcbiAgICAgICAgICAgICAgYXNzb2NpYXRlZFVzZXJNZXNzYWdlSWQ6IHRoaXMuZXZlbnQuY3VycmVudE1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgY29udGVudEJsb2NrVGV4dDogY2h1bmsuY29udGVudEJsb2NrRGVsdGEuZGVsdGEudGV4dCxcbiAgICAgICAgICAgICAgY29udGVudEJsb2NrSW5kZXg6IGJsb2NrSW5kZXgsXG4gICAgICAgICAgICAgIGNvbnRlbnRCbG9ja0RlbHRhSW5kZXg6IGJsb2NrRGVsdGFJbmRleCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsYXN0QmxvY2tEZWx0YUluZGV4ID0gYmxvY2tEZWx0YUluZGV4O1xuICAgICAgICAgICAgYmxvY2tEZWx0YUluZGV4Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNodW5rLmNvbnRlbnRCbG9ja1N0b3ApIHtcbiAgICAgICAgICBpZiAodG9vbFVzZUJsb2NrKSB7XG4gICAgICAgICAgICB0b29sVXNlQmxvY2sudG9vbFVzZS5pbnB1dCA9IEpTT04ucGFyc2UodG9vbFVzZUlucHV0KTtcbiAgICAgICAgICAgIGFjY3VtdWxhdGVkQXNzaXN0YW50TWVzc2FnZS5jb250ZW50Py5wdXNoKHRvb2xVc2VCbG9jayk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHRvb2xVc2VCbG9jay50b29sVXNlLm5hbWUgJiZcbiAgICAgICAgICAgICAgdGhpcy5jbGllbnRUb29sQnlOYW1lLmhhcyh0b29sVXNlQmxvY2sudG9vbFVzZS5uYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNsaWVudFRvb2xzUmVxdWVzdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgeWllbGQge1xuICAgICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkOiB0aGlzLmV2ZW50LmNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgICAgICAgIGFzc29jaWF0ZWRVc2VyTWVzc2FnZUlkOiB0aGlzLmV2ZW50LmN1cnJlbnRNZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgY29udGVudEJsb2NrSW5kZXg6IGJsb2NrSW5kZXgsXG4gICAgICAgICAgICAgICAgY29udGVudEJsb2NrVG9vbFVzZTogSlNPTi5zdHJpbmdpZnkodG9vbFVzZUJsb2NrKSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgbGFzdEJsb2NrSW5kZXggPSBibG9ja0luZGV4O1xuICAgICAgICAgICAgICBibG9ja0luZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b29sVXNlQmxvY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0b29sVXNlSW5wdXQgPSAnJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjdW11bGF0ZWRBc3Npc3RhbnRNZXNzYWdlLmNvbnRlbnQ/LnB1c2goe1xuICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkOiB0aGlzLmV2ZW50LmNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgICAgICBhc3NvY2lhdGVkVXNlck1lc3NhZ2VJZDogdGhpcy5ldmVudC5jdXJyZW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgICBjb250ZW50QmxvY2tJbmRleDogYmxvY2tJbmRleCxcbiAgICAgICAgICAgICAgY29udGVudEJsb2NrRG9uZUF0SW5kZXg6IGxhc3RCbG9ja0RlbHRhSW5kZXgsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGV4dCA9ICcnO1xuICAgICAgICAgICAgbGFzdEJsb2NrSW5kZXggPSBibG9ja0luZGV4O1xuICAgICAgICAgICAgYmxvY2tJbmRleCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjaHVuay5tZXNzYWdlU3RvcCkge1xuICAgICAgICAgIHN0b3BSZWFzb24gPSBjaHVuay5tZXNzYWdlU3RvcC5zdG9wUmVhc29uID8/ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgJ0FjY3VtdWxhdGVkIEJlZHJvY2sgQ29udmVyc2UgU3RyZWFtIHJlc3BvbnNlOicsXG4gICAgICAgIGFjY3VtdWxhdGVkQXNzaXN0YW50TWVzc2FnZVxuICAgICAgKTtcbiAgICAgIGlmIChjbGllbnRUb29sc1JlcXVlc3RlZCkge1xuICAgICAgICAvLyBGb3Igbm93IGlmIGFueSBvZiBjbGllbnQgdG9vbHMgaXMgdXNlZCB3ZSBpZ25vcmUgZXhlY3V0YWJsZSB0b29sc1xuICAgICAgICAvLyBhbmQgcHJvcGFnYXRlIHJlc3VsdCBiYWNrIHRvIGNsaWVudC5cbiAgICAgICAgeWllbGQge1xuICAgICAgICAgIGNvbnZlcnNhdGlvbklkOiB0aGlzLmV2ZW50LmNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgIGFzc29jaWF0ZWRVc2VyTWVzc2FnZUlkOiB0aGlzLmV2ZW50LmN1cnJlbnRNZXNzYWdlSWQsXG4gICAgICAgICAgY29udGVudEJsb2NrSW5kZXg6IGxhc3RCbG9ja0luZGV4LFxuICAgICAgICAgIHN0b3BSZWFzb246IHN0b3BSZWFzb24sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG1lc3NhZ2VzLnB1c2goYWNjdW11bGF0ZWRBc3Npc3RhbnRNZXNzYWdlKTtcbiAgICAgIGlmIChzdG9wUmVhc29uID09PSAndG9vbF91c2UnKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQ29udGVudEJsb2NrcyA9IGFjY3VtdWxhdGVkQXNzaXN0YW50TWVzc2FnZS5jb250ZW50ID8/IFtdO1xuICAgICAgICBjb25zdCB0b29sVXNlQmxvY2tzID0gcmVzcG9uc2VDb250ZW50QmxvY2tzLmZpbHRlcihcbiAgICAgICAgICAoYmxvY2spID0+ICd0b29sVXNlJyBpbiBibG9ja1xuICAgICAgICApIGFzIEFycmF5PENvbnRlbnRCbG9jay5Ub29sVXNlTWVtYmVyPjtcbiAgICAgICAgY29uc3QgdG9vbFJlc3BvbnNlQ29udGVudEJsb2NrczogQXJyYXk8Q29udGVudEJsb2NrPiA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlQ29udGVudEJsb2NrIG9mIHRvb2xVc2VCbG9ja3MpIHtcbiAgICAgICAgICBjb25zdCB0b29sVXNlQmxvY2sgPVxuICAgICAgICAgICAgcmVzcG9uc2VDb250ZW50QmxvY2sgYXMgQ29udGVudEJsb2NrLlRvb2xVc2VNZW1iZXI7XG4gICAgICAgICAgY29uc3QgdG9vbFJlc3VsdENvbnRlbnRCbG9jayA9IGF3YWl0IHRoaXMuZXhlY3V0ZVRvb2wodG9vbFVzZUJsb2NrKTtcbiAgICAgICAgICB0b29sUmVzcG9uc2VDb250ZW50QmxvY2tzLnB1c2godG9vbFJlc3VsdENvbnRlbnRCbG9jayk7XG4gICAgICAgIH1cbiAgICAgICAgbWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgcm9sZTogJ3VzZXInLFxuICAgICAgICAgIGNvbnRlbnQ6IHRvb2xSZXNwb25zZUNvbnRlbnRCbG9ja3MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKHN0b3BSZWFzb24gPT09ICd0b29sX3VzZScpO1xuXG4gICAgeWllbGQge1xuICAgICAgY29udmVyc2F0aW9uSWQ6IHRoaXMuZXZlbnQuY29udmVyc2F0aW9uSWQsXG4gICAgICBhc3NvY2lhdGVkVXNlck1lc3NhZ2VJZDogdGhpcy5ldmVudC5jdXJyZW50TWVzc2FnZUlkLFxuICAgICAgY29udGVudEJsb2NrSW5kZXg6IGxhc3RCbG9ja0luZGV4LFxuICAgICAgc3RvcFJlYXNvbjogc3RvcFJlYXNvbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgZXZlbnQgbWVzc2FnZXMgdG8gQmVkcm9jayB0eXBlcy5cbiAgICogMS4gTWFrZXMgYSBjb3B5IHNvIHRoYXQgd2UgZG9uJ3QgbXV0YXRlIGV2ZW50LlxuICAgKiAyLiBEZWNvZGVzIEJhc2U2NCBlbmNvZGVkIGltYWdlcy5cbiAgICovXG4gIHByaXZhdGUgZ2V0RXZlbnRNZXNzYWdlc0FzQmVkcm9ja01lc3NhZ2VzID0gYXN5bmMgKCk6IFByb21pc2U8XG4gICAgQXJyYXk8TWVzc2FnZT5cbiAgPiA9PiB7XG4gICAgY29uc3QgbWVzc2FnZXM6IEFycmF5PE1lc3NhZ2U+ID0gW107XG4gICAgY29uc3QgZXZlbnRNZXNzYWdlcyA9XG4gICAgICBhd2FpdCB0aGlzLm1lc3NhZ2VIaXN0b3J5UmV0cmlldmVyLmdldE1lc3NhZ2VIaXN0b3J5KCk7XG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIGV2ZW50TWVzc2FnZXMpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VDb250ZW50OiBBcnJheTxDb250ZW50QmxvY2s+ID0gW107XG4gICAgICBmb3IgKGNvbnN0IGNvbnRlbnRFbGVtZW50IG9mIG1lc3NhZ2UuY29udGVudCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnRFbGVtZW50LmltYWdlPy5zb3VyY2U/LmJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIG1lc3NhZ2VDb250ZW50LnB1c2goe1xuICAgICAgICAgICAgaW1hZ2U6IHtcbiAgICAgICAgICAgICAgZm9ybWF0OiBjb250ZW50RWxlbWVudC5pbWFnZS5mb3JtYXQsXG4gICAgICAgICAgICAgIHNvdXJjZToge1xuICAgICAgICAgICAgICAgIGJ5dGVzOiBCdWZmZXIuZnJvbShjb250ZW50RWxlbWVudC5pbWFnZS5zb3VyY2UuYnl0ZXMsICdiYXNlNjQnKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIHR5cGUgY29uZm9ybXMgdG8gQmVkcm9jaydzIHR5cGUgYW5kIGl0J3Mgc2FmZSB0byBjYXN0LlxuICAgICAgICAgIG1lc3NhZ2VDb250ZW50LnB1c2goY29udGVudEVsZW1lbnQgYXMgQ29udGVudEJsb2NrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWVzc2FnZXMucHVzaCh7XG4gICAgICAgIHJvbGU6IG1lc3NhZ2Uucm9sZSxcbiAgICAgICAgY29udGVudDogbWVzc2FnZUNvbnRlbnQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2VzO1xuICB9O1xuXG4gIHByaXZhdGUgY3JlYXRlVG9vbENvbmZpZ3VyYXRpb24gPSAoKTogVG9vbENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmICh0aGlzLmFsbFRvb2xzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG9vbHM6IHRoaXMuYWxsVG9vbHMubWFwKCh0KTogVG9vbCA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9vbFNwZWM6IHtcbiAgICAgICAgICAgIG5hbWU6IHQubmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0LmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBjYXN0IHRvIGJlZHJvY2sgdHlwZSBhcyB3ZSdyZSB1c2luZyBkaWZmZXJlbnQgdHlwZXMgdG8gZGVzY3JpYmUgSlNPTiBzY2hlbWEgaW4gb3VyIEFQSS5cbiAgICAgICAgICAgIC8vIFRoZXNlIHR5cGVzIGFyZSBydW50aW1lIGNvbXBhdGlibGUuXG4gICAgICAgICAgICBpbnB1dFNjaGVtYTogdC5pbnB1dFNjaGVtYSBhcyBUb29sSW5wdXRTY2hlbWEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgIH07XG4gIH07XG5cbiAgcHJpdmF0ZSBleGVjdXRlVG9vbCA9IGFzeW5jIChcbiAgICB0b29sVXNlQmxvY2s6IENvbnRlbnRCbG9jay5Ub29sVXNlTWVtYmVyXG4gICk6IFByb21pc2U8Q29udGVudEJsb2NrPiA9PiB7XG4gICAgaWYgKCF0b29sVXNlQmxvY2sudG9vbFVzZS5uYW1lKSB7XG4gICAgICB0aHJvdyBFcnJvcignQmVkcm9jayB0b29sIHVzZSByZXNwb25zZSBpcyBtaXNzaW5nIGEgdG9vbCBuYW1lJyk7XG4gICAgfVxuICAgIGNvbnN0IHRvb2wgPSB0aGlzLmV4ZWN1dGFibGVUb29sQnlOYW1lLmdldCh0b29sVXNlQmxvY2sudG9vbFVzZS5uYW1lKTtcbiAgICBpZiAoIXRvb2wpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgQmVkcm9jayB0b29sIHVzZSByZXNwb25zZSBjb250YWlucyB1bmtub3duIHRvb2wgJyR7dG9vbFVzZUJsb2NrLnRvb2xVc2UubmFtZX0nYFxuICAgICAgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oYEludm9raW5nIHRvb2wgJHt0b29sLm5hbWV9YCk7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnVG9vbCBpbnB1dDonLCB0b29sVXNlQmxvY2sudG9vbFVzZS5pbnB1dCk7XG4gICAgICBjb25zdCB0b29sUmVzcG9uc2UgPSBhd2FpdCB0b29sLmV4ZWN1dGUodG9vbFVzZUJsb2NrLnRvb2xVc2UuaW5wdXQpO1xuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgUmVjZWl2ZWQgcmVzcG9uc2UgZnJvbSAke3Rvb2wubmFtZX0gdG9vbGApO1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcodG9vbFJlc3BvbnNlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvb2xSZXN1bHQ6IHtcbiAgICAgICAgICB0b29sVXNlSWQ6IHRvb2xVc2VCbG9jay50b29sVXNlLnRvb2xVc2VJZCxcbiAgICAgICAgICBjb250ZW50OiBbdG9vbFJlc3BvbnNlXSxcbiAgICAgICAgICBzdGF0dXM6ICdzdWNjZXNzJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRvb2xSZXN1bHQ6IHtcbiAgICAgICAgICAgIHRvb2xVc2VJZDogdG9vbFVzZUJsb2NrLnRvb2xVc2UudG9vbFVzZUlkLFxuICAgICAgICAgICAgY29udGVudDogW3sgdGV4dDogZS50b1N0cmluZygpIH1dLFxuICAgICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b29sUmVzdWx0OiB7XG4gICAgICAgICAgdG9vbFVzZUlkOiB0b29sVXNlQmxvY2sudG9vbFVzZS50b29sVXNlSWQsXG4gICAgICAgICAgY29udGVudDogW3sgdGV4dDogJ3Vua25vd24gZXJyb3Igb2NjdXJyZWQnIH1dLFxuICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9O1xufVxuIl19