@cdklabs/cdk-appmod-catalog-blueprints 1.0.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/.jsii +701 -204
  2. package/README.md +100 -160
  3. package/lib/document-processing/adapter/adapter.d.ts +47 -0
  4. package/lib/document-processing/adapter/adapter.js +5 -0
  5. package/lib/document-processing/adapter/index.d.ts +2 -0
  6. package/lib/document-processing/adapter/index.js +19 -0
  7. package/lib/document-processing/adapter/queued-s3-adapter.d.ts +66 -0
  8. package/lib/document-processing/adapter/queued-s3-adapter.js +230 -0
  9. package/lib/document-processing/agentic-document-processing.d.ts +22 -0
  10. package/lib/document-processing/agentic-document-processing.js +11 -14
  11. package/lib/document-processing/base-document-processing.d.ts +8 -44
  12. package/lib/document-processing/base-document-processing.js +23 -190
  13. package/lib/document-processing/bedrock-document-processing.js +3 -13
  14. package/lib/document-processing/default-document-processing-config.d.ts +3 -0
  15. package/lib/document-processing/default-document-processing-config.js +14 -0
  16. package/lib/document-processing/index.d.ts +2 -0
  17. package/lib/document-processing/index.js +3 -1
  18. package/lib/document-processing/resources/default-bedrock-invoke/index.py +36 -24
  19. package/lib/document-processing/resources/default-sqs-consumer/index.py +10 -5
  20. package/lib/document-processing/resources/default-strands-agent/index.py +8 -5
  21. package/lib/document-processing/tests/agentic-document-processing-nag.test.js +6 -2
  22. package/lib/document-processing/tests/agentic-document-processing.test.js +5 -19
  23. package/lib/document-processing/tests/bedrock-document-processing-nag.test.js +6 -2
  24. package/lib/framework/custom-resource/default-runtimes.js +1 -1
  25. package/lib/framework/foundation/access-log.js +1 -1
  26. package/lib/framework/foundation/eventbridge-broker.js +1 -1
  27. package/lib/framework/foundation/network.js +1 -1
  28. package/lib/tsconfig.tsbuildinfo +1 -1
  29. package/lib/utilities/data-loader.js +1 -1
  30. package/lib/utilities/lambda-iam-utils.js +1 -1
  31. package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +1 -1
  32. package/lib/utilities/observability/default-observability-config.d.ts +9 -0
  33. package/lib/utilities/observability/default-observability-config.js +20 -0
  34. package/lib/utilities/observability/index.d.ts +1 -0
  35. package/lib/utilities/observability/index.js +2 -1
  36. package/lib/utilities/observability/lambda-observability-property-injector.js +1 -1
  37. package/lib/utilities/observability/powertools-config.js +1 -1
  38. package/lib/utilities/observability/state-machine-observability-property-injector.js +1 -1
  39. package/lib/webapp/frontend-construct.js +1 -1
  40. package/package.json +9 -9
@@ -103,9 +103,6 @@ class BedrockDocumentProcessing extends base_document_processing_1.BaseDocumentP
103
103
  enableObservability: this.bedrockDocumentProcessingProps.enableObservability,
104
104
  });
105
105
  this.encryptionKey.grantEncryptDecrypt(role);
106
- if (this.bucketEncryptionKey) {
107
- this.bucketEncryptionKey.grantEncryptDecrypt(role);
108
- }
109
106
  const bedrockFunction = new aws_lambda_python_alpha_1.PythonFunction(this, 'BedrockClassificationFunction', {
110
107
  functionName: generatedLogPermissions.uniqueFunctionName,
111
108
  architecture: aws_lambda_1.Architecture.X86_64,
@@ -160,9 +157,6 @@ class BedrockDocumentProcessing extends base_document_processing_1.BaseDocumentP
160
157
  scope: this,
161
158
  });
162
159
  this.encryptionKey.grantEncryptDecrypt(role);
163
- if (this.bucketEncryptionKey) {
164
- this.bucketEncryptionKey.grantEncryptDecrypt(role);
165
- }
166
160
  const bedrockFunction = new aws_lambda_python_alpha_1.PythonFunction(this, 'BedrockExtractionFunction', {
167
161
  functionName: generatedLogPermissions.uniqueFunctionName,
168
162
  runtime: framework_1.DefaultRuntimes.PYTHON,
@@ -203,11 +197,7 @@ class BedrockDocumentProcessing extends base_document_processing_1.BaseDocumentP
203
197
  inlinePolicies: {
204
198
  BedrockInvokePolicy: new aws_iam_1.PolicyDocument({
205
199
  statements: [
206
- new aws_iam_1.PolicyStatement({
207
- effect: aws_iam_1.Effect.ALLOW,
208
- actions: ['s3:GetObject'],
209
- resources: [`${this.bucket.bucketArn}/*`],
210
- }),
200
+ ...this.ingressAdapter.generateAdapterIAMPolicies(),
211
201
  new aws_iam_1.PolicyStatement({
212
202
  effect: aws_iam_1.Effect.ALLOW,
213
203
  actions: [
@@ -263,7 +253,7 @@ class BedrockDocumentProcessing extends base_document_processing_1.BaseDocumentP
263
253
  }
264
254
  exports.BedrockDocumentProcessing = BedrockDocumentProcessing;
265
255
  _a = JSII_RTTI_SYMBOL_1;
266
- BedrockDocumentProcessing[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.BedrockDocumentProcessing", version: "1.0.1" };
256
+ BedrockDocumentProcessing[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.BedrockDocumentProcessing", version: "1.2.0" };
267
257
  BedrockDocumentProcessing.DEFAULT_CLASSIFICATION_MODEL_ID = aws_bedrock_1.FoundationModelIdentifier.ANTHROPIC_CLAUDE_3_7_SONNET_20250219_V1_0;
268
258
  BedrockDocumentProcessing.DEFAULT_PROCESSING_MODEL_ID = aws_bedrock_1.FoundationModelIdentifier.ANTHROPIC_CLAUDE_3_7_SONNET_20250219_V1_0;
269
259
  BedrockDocumentProcessing.DEFAULT_CLASSIFICATION_PROMPT = `
@@ -295,4 +285,4 @@ BedrockDocumentProcessing.DEFAULT_PROCESSING_PROMPT = `
295
285
  Attached document is as follows:
296
286
 
297
287
  `;
298
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscUVBQXFFO0FBQ3JFLHNDQUFzQztBQUV0Qyw2QkFBNkI7QUFDN0IsOEVBQWtFO0FBQ2xFLDZDQUE4QztBQUM5Qyx5REFBb0U7QUFDcEUsaURBQXFFO0FBQ3JFLGlEQUFzRztBQUN0Ryx1REFBZ0U7QUFFaEUsaUZBQW1FO0FBRW5FLHlFQUE2SDtBQUM3SCw0Q0FBK0M7QUFDL0MsNENBQThDO0FBQzlDLG9GQUFnRjtBQTBEaEY7OztHQUdHO0FBQ0gsSUFBWSxpQ0FLWDtBQUxELFdBQVksaUNBQWlDO0lBQzNDLDhDQUE4QztJQUM5Qyw4Q0FBUyxDQUFBO0lBQ1QsOENBQThDO0lBQzlDLDhDQUFTLENBQUE7QUFDWCxDQUFDLEVBTFcsaUNBQWlDLGlEQUFqQyxpQ0FBaUMsUUFLNUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxNQUFhLHlCQUEwQixTQUFRLGlEQUFzQjtJQTRDbkU7Ozs7Ozs7Ozs7T0FVRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBcUM7UUFDN0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLEVBQUUsd0NBQThCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUYsS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxzQkFBc0IsRUFBRSx3Q0FBOEIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5RyxDQUFDO1FBRUQsSUFBSSxDQUFDLDhCQUE4QixHQUFHLEtBQUssQ0FBQztRQUM1QyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsS0FBSyxDQUFDLDBCQUEwQixJQUFJLGlDQUFpQyxDQUFDLEVBQUUsQ0FBQztRQUMzRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNPLGtCQUFrQjtRQUMxQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsb0JBQW9CLElBQUkseUJBQXlCLENBQUMsNkJBQTZCLENBQUM7UUFDbkksTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLHFCQUFxQixJQUFJLHlCQUF5QixDQUFDLCtCQUErQixDQUFDO1FBQ3ZJLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ2hLLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztRQUNwRixNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLE1BQU0sdUJBQXVCLEdBQUcsMEJBQWMsQ0FBQyxxQkFBcUIsQ0FBQztZQUNuRSxPQUFPO1lBQ1AsWUFBWSxFQUFFLDRCQUE0QjtZQUMxQyxNQUFNO1lBQ04sS0FBSyxFQUFFLElBQUk7WUFDWCxtQkFBbUIsRUFBRSxJQUFJLENBQUMsOEJBQThCLENBQUMsbUJBQW1CO1NBQzdFLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFN0MsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUVELE1BQU0sZUFBZSxHQUFHLElBQUksd0NBQWMsQ0FBQyxJQUFJLEVBQUUsK0JBQStCLEVBQUU7WUFDaEYsWUFBWSxFQUFFLHVCQUF1QixDQUFDLGtCQUFrQjtZQUN4RCxZQUFZLEVBQUUseUJBQVksQ0FBQyxNQUFNO1lBQ2pDLE9BQU8sRUFBRSwyQkFBZSxDQUFDLE1BQU07WUFDL0IsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGtDQUFrQyxDQUFDO1lBQy9ELElBQUk7WUFDSixVQUFVLEVBQUUsR0FBRztZQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsOEJBQThCLENBQUMsWUFBWSxJQUFJLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNoRixXQUFXLEVBQUU7Z0JBQ1gsUUFBUSxFQUFFLGVBQWU7Z0JBQ3pCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLFdBQVcsRUFBRSxnQkFBZ0I7Z0JBQzdCLEdBQUcsb0NBQWdCLENBQUMsMkJBQTJCLENBQzdDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxtQkFBbUIsRUFDdkQsSUFBSSxDQUFDLGVBQWUsRUFDcEIsSUFBSSxDQUFDLGlCQUFpQixDQUN2QjthQUNGO1lBQ0QscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDekMsR0FBRyxFQUFFLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzlHLFVBQVUsRUFBRSxJQUFJLENBQUMsOEJBQThCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsT0FBTyxDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDL0ksQ0FBQyxDQUFDO1FBRUgsS0FBSyxNQUFNLFNBQVMsSUFBSSx1QkFBdUIsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2pFLGVBQWUsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hELGVBQWUsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLENBQUMsMEJBQWMsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLENBQUM7UUFDNUYsQ0FBQztRQUVELE9BQU8sSUFBSSxzQ0FBWSxDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRTtZQUNsRCxjQUFjLEVBQUUsZUFBZTtZQUMvQixVQUFVLEVBQUUsd0JBQXdCO1lBQ3BDLGNBQWMsRUFBRTtnQkFDZCwwQkFBMEIsRUFBRSxrQ0FBa0M7YUFDL0Q7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDTyxjQUFjO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxnQkFBZ0IsSUFBSSx5QkFBeUIsQ0FBQyx5QkFBeUIsQ0FBQztRQUMzSCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsaUJBQWlCLElBQUkseUJBQXlCLENBQUMsMkJBQTJCLENBQUM7UUFDL0gsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQywwQkFBMEIsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDaEssTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0MsTUFBTSx1QkFBdUIsR0FBRywwQkFBYyxDQUFDLHFCQUFxQixDQUFDO1lBQ25FLE9BQU87WUFDUCxZQUFZLEVBQUUsd0JBQXdCO1lBQ3RDLE1BQU07WUFDTixLQUFLLEVBQUUsSUFBSTtTQUNaLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0MsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUNELE1BQU0sZUFBZSxHQUFHLElBQUksd0NBQWMsQ0FBQyxJQUFJLEVBQUUsMkJBQTJCLEVBQUU7WUFDNUUsWUFBWSxFQUFFLHVCQUF1QixDQUFDLGtCQUFrQjtZQUN4RCxPQUFPLEVBQUUsMkJBQWUsQ0FBQyxNQUFNO1lBQy9CLFlBQVksRUFBRSx5QkFBWSxDQUFDLE1BQU07WUFDakMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGtDQUFrQyxDQUFDO1lBQy9ELElBQUk7WUFDSixVQUFVLEVBQUUsR0FBRztZQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsOEJBQThCLENBQUMsWUFBWSxJQUFJLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNoRixXQUFXLEVBQUU7Z0JBQ1gsUUFBUSxFQUFFLGVBQWU7Z0JBQ3pCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLFdBQVcsRUFBRSxZQUFZO2dCQUN6QixHQUFHLG9DQUFnQixDQUFDLDJCQUEyQixDQUM3QyxJQUFJLENBQUMsOEJBQThCLENBQUMsbUJBQW1CLEVBQ3ZELElBQUksQ0FBQyxlQUFlLEVBQ3BCLElBQUksQ0FBQyxpQkFBaUIsQ0FDdkI7YUFDRjtZQUNELHFCQUFxQixFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ3pDLEdBQUcsRUFBRSxJQUFJLENBQUMsOEJBQThCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUM5RyxVQUFVLEVBQUUsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQy9JLENBQUMsQ0FBQztRQUVILEtBQUssTUFBTSxTQUFTLElBQUksdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNqRSxlQUFlLENBQUMsSUFBSSxFQUFFLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoRCxlQUFlLENBQUMsSUFBSSxFQUFFLG9CQUFvQixDQUFDLDBCQUFjLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFFRCxPQUFPLElBQUksc0NBQVksQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFDOUMsY0FBYyxFQUFFLGVBQWU7WUFDL0IsVUFBVSxFQUFFLG9CQUFvQjtZQUNoQyxjQUFjLEVBQUU7Z0JBQ2QsMEJBQTBCLEVBQUUsa0NBQWtDO2dCQUM5RCxVQUFVLEVBQUUsa0JBQWtCO2FBQy9CO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLDRCQUE0QixDQUFDLE9BQWtDLEVBQUUsRUFBVTtRQUNuRixNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLE9BQU8sSUFBSSxjQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUN4QixTQUFTLEVBQUUsSUFBSSwwQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQztZQUN2RCxjQUFjLEVBQUU7Z0JBQ2QsbUJBQW1CLEVBQUUsSUFBSSx3QkFBYyxDQUFDO29CQUN0QyxVQUFVLEVBQUU7d0JBQ1YsSUFBSSx5QkFBZSxDQUFDOzRCQUNsQixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLOzRCQUNwQixPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUM7NEJBQ3pCLFNBQVMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksQ0FBQzt5QkFDMUMsQ0FBQzt3QkFDRixJQUFJLHlCQUFlLENBQUM7NEJBQ2xCLE1BQU0sRUFBRSxnQkFBTSxDQUFDLEtBQUs7NEJBQ3BCLE9BQU8sRUFBRTtnQ0FDUCxxQkFBcUI7Z0NBQ3JCLHVDQUF1Qzs2QkFDeEM7NEJBQ0QsU0FBUyxFQUFFO2dDQUNULHVDQUF1QyxPQUFPLENBQUMsT0FBTyxFQUFFO2dDQUN4RCxtQkFBbUIsTUFBTSxJQUFJLE9BQU8sc0JBQXNCLElBQUksQ0FBQywwQkFBMEIsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFOzZCQUMvRzt5QkFDRixDQUFDO3FCQUNIO2lCQUNGLENBQUM7YUFDSDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNPLGNBQWM7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ2xFLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxPQUFPLElBQUksc0NBQVksQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFDOUMsY0FBYyxFQUFFLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyx3QkFBd0I7WUFDNUUsVUFBVSxFQUFFLGtCQUFrQjtTQUMvQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDTyxrQkFBa0I7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1lBQ3RFLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxPQUFPLElBQUksc0NBQVksQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUU7WUFDbEQsY0FBYyxFQUFFLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyw0QkFBNEI7WUFDaEYsVUFBVSxFQUFFLHVCQUF1QjtTQUNwQyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQTlRSCw4REErUUM7OztBQTdRMkIseURBQStCLEdBQ3JELHVDQUF5QixDQUFDLHlDQUF5QyxDQUFDO0FBQzlDLHFEQUEyQixHQUNqRCx1Q0FBeUIsQ0FBQyx5Q0FBeUMsQ0FBQztBQUM5Qyx1REFBNkIsR0FBRzs7Ozs7Ozs7O0dBU3pELENBQUM7QUFFd0IsbURBQXlCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCckQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFB5dGhvbkZ1bmN0aW9uIH0gZnJvbSAnQGF3cy1jZGsvYXdzLWxhbWJkYS1weXRob24tYWxwaGEnO1xuaW1wb3J0IHsgRHVyYXRpb24sIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgRm91bmRhdGlvbk1vZGVsSWRlbnRpZmllciB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1iZWRyb2NrJztcbmltcG9ydCB7IEludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0IHsgUm9sZSwgU2VydmljZVByaW5jaXBhbCwgUG9saWN5U3RhdGVtZW50LCBQb2xpY3lEb2N1bWVudCwgRWZmZWN0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBGdW5jdGlvbiwgQXJjaGl0ZWN0dXJlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBTdGF0ZU1hY2hpbmUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9ucyc7XG5pbXBvcnQgeyBMYW1iZGFJbnZva2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9ucy10YXNrcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEJhc2VEb2N1bWVudFByb2Nlc3NpbmcsIEJhc2VEb2N1bWVudFByb2Nlc3NpbmdQcm9wcywgRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfSBmcm9tICcuL2Jhc2UtZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5pbXBvcnQgeyBEZWZhdWx0UnVudGltZXMgfSBmcm9tICcuLi9mcmFtZXdvcmsnO1xuaW1wb3J0IHsgTGFtYmRhSWFtVXRpbHMgfSBmcm9tICcuLi91dGlsaXRpZXMnO1xuaW1wb3J0IHsgUG93ZXJ0b29sc0NvbmZpZyB9IGZyb20gJy4uL3V0aWxpdGllcy9vYnNlcnZhYmlsaXR5L3Bvd2VydG9vbHMtY29uZmlnJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcgY29uc3RydWN0LlxuICogRXh0ZW5kcyBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMgd2l0aCBCZWRyb2NrLXNwZWNpZmljIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzIGV4dGVuZHMgQmFzZURvY3VtZW50UHJvY2Vzc2luZ1Byb3BzIHtcbiAgLyoqXG4gICAqIEJlZHJvY2sgZm91bmRhdGlvbiBtb2RlbCBmb3IgZG9jdW1lbnQgY2xhc3NpZmljYXRpb24gc3RlcC5cbiAgICogQGRlZmF1bHQgRm91bmRhdGlvbk1vZGVsSWRlbnRpZmllci5BTlRIUk9QSUNfQ0xBVURFXzNfN19TT05ORVRfMjAyNTAyMTlfVjFfMFxuICAgKi9cbiAgcmVhZG9ubHkgY2xhc3NpZmljYXRpb25Nb2RlbElkPzogRm91bmRhdGlvbk1vZGVsSWRlbnRpZmllcjtcbiAgLyoqXG4gICAqIEJlZHJvY2sgZm91bmRhdGlvbiBtb2RlbCBmb3IgZG9jdW1lbnQgZXh0cmFjdGlvbiBzdGVwLlxuICAgKiBAZGVmYXVsdCBGb3VuZGF0aW9uTW9kZWxJZGVudGlmaWVyLkFOVEhST1BJQ19DTEFVREVfM183X1NPTk5FVF8yMDI1MDIxOV9WMV8wXG4gICAqL1xuICByZWFkb25seSBwcm9jZXNzaW5nTW9kZWxJZD86IEZvdW5kYXRpb25Nb2RlbElkZW50aWZpZXI7XG4gIC8qKlxuICAgKiBDdXN0b20gcHJvbXB0IHRlbXBsYXRlIGZvciBkb2N1bWVudCBjbGFzc2lmaWNhdGlvbi5cbiAgICogTXVzdCBpbmNsdWRlIHBsYWNlaG9sZGVyIGZvciBkb2N1bWVudCBjb250ZW50LlxuICAgKiBAZGVmYXVsdCBERUZBVUxUX0NMQVNTSUZJQ0FUSU9OX1BST01QVFxuICAgKi9cbiAgcmVhZG9ubHkgY2xhc3NpZmljYXRpb25Qcm9tcHQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDdXN0b20gcHJvbXB0IHRlbXBsYXRlIGZvciBkb2N1bWVudCBleHRyYWN0aW9uLlxuICAgKiBNdXN0IGluY2x1ZGUgcGxhY2Vob2xkZXIgZm9yIGRvY3VtZW50IGNvbnRlbnQgYW5kIGNsYXNzaWZpY2F0aW9uIHJlc3VsdC5cbiAgICogQGRlZmF1bHQgREVGQVVMVF9FWFRSQUNUSU9OX1BST01QVFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvY2Vzc2luZ1Byb21wdD86IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIExhbWJkYSBmdW5jdGlvbiBmb3IgZG9jdW1lbnQgZW5yaWNobWVudCBzdGVwLlxuICAgKiBJZiBwcm92aWRlZCwgd2lsbCBiZSBpbnZva2VkIGFmdGVyIGV4dHJhY3Rpb24gd2l0aCB3b3JrZmxvdyBzdGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGVucmljaG1lbnRMYW1iZGFGdW5jdGlvbj86IEZ1bmN0aW9uO1xuICAvKipcbiAgICogT3B0aW9uYWwgTGFtYmRhIGZ1bmN0aW9uIGZvciBwb3N0LXByb2Nlc3Npbmcgc3RlcC5cbiAgICogSWYgcHJvdmlkZWQsIHdpbGwgYmUgaW52b2tlZCBhZnRlciBlbnJpY2htZW50IHdpdGggd29ya2Zsb3cgc3RhdGUuXG4gICAqL1xuICByZWFkb25seSBwb3N0UHJvY2Vzc2luZ0xhbWJkYUZ1bmN0aW9uPzogRnVuY3Rpb247XG4gIC8qKlxuICAgKiBUaW1lb3V0IGZvciBpbmRpdmlkdWFsIFN0ZXAgRnVuY3Rpb25zIHRhc2tzIChjbGFzc2lmaWNhdGlvbiwgZXh0cmFjdGlvbiwgZXRjLikuXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLm1pbnV0ZXMoNSlcbiAgICovXG4gIHJlYWRvbmx5IHN0ZXBUaW1lb3V0cz86IER1cmF0aW9uO1xuICAvKipcbiAgICogRW5hYmxlIGNyb3NzLXJlZ2lvbiBpbmZlcmVuY2UgZm9yIEJlZHJvY2sgbW9kZWxzIHRvIGltcHJvdmUgYXZhaWxhYmlsaXR5IGFuZCBwZXJmb3JtYW5jZS5cbiAgICogV2hlbiBlbmFibGVkLCB1c2VzIGluZmVyZW5jZSBwcm9maWxlcyBpbnN0ZWFkIG9mIGRpcmVjdCBtb2RlbCBpbnZvY2F0aW9uLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgdXNlQ3Jvc3NSZWdpb25JbmZlcmVuY2U/OiBib29sZWFuO1xuICAvKipcbiAgICogUHJlZml4IGZvciBjcm9zcy1yZWdpb24gaW5mZXJlbmNlIGNvbmZpZ3VyYXRpb24uXG4gICAqIE9ubHkgdXNlZCB3aGVuIHVzZUNyb3NzUmVnaW9uSW5mZXJlbmNlIGlzIHRydWUuXG4gICAqIEBkZWZhdWx0IEJlZHJvY2tDcm9zc1JlZ2lvbkluZmVyZW5jZVByZWZpeC5VU1xuICAgKi9cbiAgcmVhZG9ubHkgY3Jvc3NSZWdpb25JbmZlcmVuY2VQcmVmaXg/OiBCZWRyb2NrQ3Jvc3NSZWdpb25JbmZlcmVuY2VQcmVmaXg7XG59XG5cbi8qKlxuICogQ3Jvc3MtcmVnaW9uIGluZmVyZW5jZSBwcmVmaXggb3B0aW9ucyBmb3IgQmVkcm9jayBtb2RlbHMuXG4gKiBVc2VkIHRvIGNvbmZpZ3VyZSBpbmZlcmVuY2UgcHJvZmlsZXMgZm9yIGltcHJvdmVkIGF2YWlsYWJpbGl0eSBhbmQgcGVyZm9ybWFuY2UuXG4gKi9cbmV4cG9ydCBlbnVtIEJlZHJvY2tDcm9zc1JlZ2lvbkluZmVyZW5jZVByZWZpeCB7XG4gIC8qKiBVUy1iYXNlZCBjcm9zcy1yZWdpb24gaW5mZXJlbmNlIHByb2ZpbGUgKi9cbiAgVVMgPSAndXMnLFxuICAvKiogRVUtYmFzZWQgY3Jvc3MtcmVnaW9uIGluZmVyZW5jZSBwcm9maWxlICovXG4gIEVVID0gJ2V1Jyxcbn1cblxuLyoqXG4gKiBEb2N1bWVudCBwcm9jZXNzaW5nIHdvcmtmbG93IHBvd2VyZWQgYnkgQW1hem9uIEJlZHJvY2sgZm91bmRhdGlvbiBtb2RlbHMuXG4gKlxuICogRXh0ZW5kcyBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nIHRvIHByb3ZpZGUgQUktcG93ZXJlZCBkb2N1bWVudCBjbGFzc2lmaWNhdGlvbiBhbmQgZXh0cmFjdGlvblxuICogdXNpbmcgQW1hem9uIEJlZHJvY2sgZm91bmRhdGlvbiBtb2RlbHMuIFRoaXMgaW1wbGVtZW50YXRpb24gb2ZmZXJzOlxuICpcbiAqICMjIEtleSBGZWF0dXJlc1xuICogLSAqKkFJLVBvd2VyZWQgQ2xhc3NpZmljYXRpb24qKjogVXNlcyBDbGF1ZGUgMy43IFNvbm5ldCAoY29uZmlndXJhYmxlKSB0byBjbGFzc2lmeSBkb2N1bWVudCB0eXBlc1xuICogLSAqKkludGVsbGlnZW50IEV4dHJhY3Rpb24qKjogRXh0cmFjdHMgc3RydWN0dXJlZCBkYXRhIGZyb20gZG9jdW1lbnRzIHVzaW5nIGZvdW5kYXRpb24gbW9kZWxzXG4gKiAtICoqQ3Jvc3MtUmVnaW9uIEluZmVyZW5jZSoqOiBPcHRpb25hbCBzdXBwb3J0IGZvciBpbXByb3ZlZCBhdmFpbGFiaWxpdHkgdmlhIGluZmVyZW5jZSBwcm9maWxlc1xuICogLSAqKkZsZXhpYmxlIFByb2Nlc3NpbmcqKjogT3B0aW9uYWwgZW5yaWNobWVudCBhbmQgcG9zdC1wcm9jZXNzaW5nIExhbWJkYSBmdW5jdGlvbnNcbiAqIC0gKipDb3N0IE9wdGltaXplZCoqOiBDb25maWd1cmFibGUgdGltZW91dHMgYW5kIG1vZGVsIHNlbGVjdGlvbiBmb3IgY29zdCBjb250cm9sXG4gKlxuICogIyMgUHJvY2Vzc2luZyBXb3JrZmxvd1xuICogUzMgVXBsb2FkIOKGkiBDbGFzc2lmaWNhdGlvbiAoQmVkcm9jaykg4oaSIEV4dHJhY3Rpb24gKEJlZHJvY2spIOKGkiBbRW5yaWNobWVudF0g4oaSIFtQb3N0LVByb2Nlc3NpbmddIOKGkiBSZXN1bHRzXG4gKlxuICogIyMgRGVmYXVsdCBNb2RlbHNcbiAqIC0gQ2xhc3NpZmljYXRpb246IENsYXVkZSAzLjcgU29ubmV0IChhbnRocm9waWMuY2xhdWRlLTMtNy1zb25uZXQtMjAyNTAyMTktdjE6MClcbiAqIC0gRXh0cmFjdGlvbjogQ2xhdWRlIDMuNyBTb25uZXQgKGFudGhyb3BpYy5jbGF1ZGUtMy03LXNvbm5ldC0yMDI1MDIxOS12MTowKVxuICpcbiAqICMjIFByb21wdCBUZW1wbGF0ZXNcbiAqIFRoZSBjb25zdHJ1Y3QgdXNlcyBkZWZhdWx0IHByb21wdHMgdGhhdCBjYW4gYmUgY3VzdG9taXplZDpcbiAqIC0gKipDbGFzc2lmaWNhdGlvbioqOiBBbmFseXplcyBkb2N1bWVudCBhbmQgcmV0dXJucyBKU09OIHdpdGggZG9jdW1lbnRDbGFzc2lmaWNhdGlvbiBmaWVsZFxuICogLSAqKkV4dHJhY3Rpb24qKjogVXNlcyBjbGFzc2lmaWNhdGlvbiByZXN1bHQgdG8gZXh0cmFjdCBlbnRpdGllcyBpbiBzdHJ1Y3R1cmVkIEpTT04gZm9ybWF0XG4gKlxuICogIyMgQ3Jvc3MtUmVnaW9uIEluZmVyZW5jZVxuICogV2hlbiBlbmFibGVkLCB1c2VzIEJlZHJvY2sgaW5mZXJlbmNlIHByb2ZpbGVzIGZvciBpbXByb3ZlZCBhdmFpbGFiaWxpdHk6XG4gKiAtIFVTIHByZWZpeDogUm91dGVzIHRvIFVTLWJhc2VkIHJlZ2lvbnMgZm9yIGxvd2VyIGxhdGVuY3lcbiAqIC0gRVUgcHJlZml4OiBSb3V0ZXMgdG8gRVUtYmFzZWQgcmVnaW9ucyBmb3IgZGF0YSByZXNpZGVuY3kgY29tcGxpYW5jZVxuICovXG5leHBvcnQgY2xhc3MgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyBleHRlbmRzIEJhc2VEb2N1bWVudFByb2Nlc3Npbmcge1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9DTEFTU0lGSUNBVElPTl9NT0RFTF9JRDogRm91bmRhdGlvbk1vZGVsSWRlbnRpZmllclxuICAgID0gRm91bmRhdGlvbk1vZGVsSWRlbnRpZmllci5BTlRIUk9QSUNfQ0xBVURFXzNfN19TT05ORVRfMjAyNTAyMTlfVjFfMDtcbiAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1BST0NFU1NJTkdfTU9ERUxfSUQ6IEZvdW5kYXRpb25Nb2RlbElkZW50aWZpZXJcbiAgICA9IEZvdW5kYXRpb25Nb2RlbElkZW50aWZpZXIuQU5USFJPUElDX0NMQVVERV8zXzdfU09OTkVUXzIwMjUwMjE5X1YxXzA7XG4gIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9DTEFTU0lGSUNBVElPTl9QUk9NUFQgPSBgXG4gIEFuYWx5emUgdGhlIGRvY3VtZW50IGJlbG93LCBhbmQgY2xhc3NpZnkgdGhlIHR5cGUgb2YgZG9jdW1lbnQgaXQgaXMgKGVnLiBJTlZPSUNFLCBJREVOVElUWV9ET0NVTUVOVCwgUkVDRUlQVCwgZXRjKS4gVGhlIHJlc3VsdCBzaG91bGQgYmUgaW4gSlNPTiBhbmQgc2hvdWxkIGZvbGxvdyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSAob25seSByZXNwb25kIGluIEpTT04gd2l0aCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBhbmQgZG8gbm90IHVzZSBtYXJrZG93biB0byBpbmRpY2F0ZSB0aGUganNvbiwganVzdCBvdXRwdXQgcGxhaW4gb2xkIGpzb24gd2l0aCBub3RoaW5nIGVsc2UpOlxuXG4gIHtcbiAgICAgIGRvY3VtZW50Q2xhc3NpZmljYXRpb246IDxDTEFTU0lGSUNBVElPTj5cbiAgfVxuXG4gIEF0dGFjaGVkIGRvY3VtZW50IGlzIGFzIGZvbGxvd3M6XG5cbiAgYDtcblxuICBwcm90ZWN0ZWQgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfUFJPQ0VTU0lOR19QUk9NUFQgPSBgXG4gIFRoZSBkb2N1bWVudCBiZWxvdyBoYXMgYmVlbiBjbGFzc2lmaWVkIGFzIFtBQ1RVQUxfQ0xBU1NJRklDQVRJT05dLiBFeHRyYWN0IGltcG9ydGFudCBlbnRpdGllcyBmcm9tIHRoZSBkb2N1bWVudCBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgSlNPTiBmb2xsb3dpbmcgdGhlIHN0cnVjdHVyZSBiZWxvdyAob25seSByZXNwb25kIGluIEpTT04gd2l0aCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBhbmQgZG8gbm90IHVzZSBtYXJrZG93biB0byBpbmRpY2F0ZSB0aGUganNvbiwganVzdCBvdXRwdXQgcGxhaW4gb2xkIGpzb24gd2l0aCBub3RoaW5nIGVsc2UpOlxuXG4gIHtcbiAgICAgIGRvY3VtZW50Q2xhc3NpZmljYXRpb246IDxDTEFTU0lGSUNBVElPTj4sXG4gICAgICByZXN1bHQ6IHtcbiAgICAgICAgZW50aXRpZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiA8VFlQRSBPRiBFTlRJVFk+XG4gICAgICAgICAgICAgICAgdmFsdWU6IDxWQUxVRSBPRiBFTlRJVFk+XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uXG4gICAgICAgIF1cbiAgICAgIH1cbiAgfVxuXG4gIEF0dGFjaGVkIGRvY3VtZW50IGlzIGFzIGZvbGxvd3M6XG5cbiAgYDtcblxuICAvKiogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHNwZWNpZmljIHRvIEJlZHJvY2sgZG9jdW1lbnQgcHJvY2Vzc2luZyAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzOiBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHM7XG4gIC8qKiBDcm9zcy1yZWdpb24gaW5mZXJlbmNlIHByZWZpeCBmb3IgQmVkcm9jayBtb2RlbCByb3V0aW5nICovXG4gIHByb3RlY3RlZCByZWFkb25seSBjcm9zc1JlZ2lvbkluZmVyZW5jZVByZWZpeDogQmVkcm9ja0Nyb3NzUmVnaW9uSW5mZXJlbmNlUHJlZml4O1xuICAvKiogVGhlIFN0ZXAgRnVuY3Rpb25zIHN0YXRlIG1hY2hpbmUgdGhhdCBvcmNoZXN0cmF0ZXMgdGhlIGRvY3VtZW50IHByb2Nlc3Npbmcgd29ya2Zsb3cgKi9cbiAgcmVhZG9ubHkgc3RhdGVNYWNoaW5lOiBTdGF0ZU1hY2hpbmU7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyBjb25zdHJ1Y3QuXG4gICAqXG4gICAqIEluaXRpYWxpemVzIHRoZSBCZWRyb2NrLXBvd2VyZWQgZG9jdW1lbnQgcHJvY2Vzc2luZyBwaXBlbGluZSB3aXRoIEFJIGNsYXNzaWZpY2F0aW9uXG4gICAqIGFuZCBleHRyYWN0aW9uIGNhcGFiaWxpdGllcy4gQ3JlYXRlcyBMYW1iZGEgZnVuY3Rpb25zIHdpdGggYXBwcm9wcmlhdGUgSUFNIHJvbGVzXG4gICAqIGZvciBCZWRyb2NrIG1vZGVsIGludm9jYXRpb24gYW5kIFMzIGFjY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIC0gVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gaWQgLSBUaGUgc2NvcGVkIGNvbnN0cnVjdCBJRC4gTXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBzY29wZS5cbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgQmVkcm9jayBkb2N1bWVudCBwcm9jZXNzaW5nIHBpcGVsaW5lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgaWYgKHByb3BzLm5ldHdvcmspIHtcbiAgICAgIHByb3BzLm5ldHdvcmsuY3JlYXRlU2VydmljZUVuZHBvaW50KCd2cGNlLWJlZHJvY2snLCBJbnRlcmZhY2VWcGNFbmRwb2ludEF3c1NlcnZpY2UuQkVEUk9DSyk7XG4gICAgICBwcm9wcy5uZXR3b3JrLmNyZWF0ZVNlcnZpY2VFbmRwb2ludCgndnBjZS1iZWRyb2NrLXJ1bnRpbWUnLCBJbnRlcmZhY2VWcGNFbmRwb2ludEF3c1NlcnZpY2UuQkVEUk9DS19SVU5USU1FKTtcbiAgICB9XG5cbiAgICB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcyA9IHByb3BzO1xuICAgIHRoaXMuY3Jvc3NSZWdpb25JbmZlcmVuY2VQcmVmaXggPSBwcm9wcy5jcm9zc1JlZ2lvbkluZmVyZW5jZVByZWZpeCB8fCBCZWRyb2NrQ3Jvc3NSZWdpb25JbmZlcmVuY2VQcmVmaXguVVM7XG4gICAgdGhpcy5zdGF0ZU1hY2hpbmUgPSB0aGlzLmhhbmRsZVN0YXRlTWFjaGluZUNyZWF0aW9uKCdiZWRyb2NrLWRvY3VtZW50LXByb2Nlc3Npbmctd29ya2Zsb3cnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIHRoZSBkb2N1bWVudCBjbGFzc2lmaWNhdGlvbiBzdGVwIHVzaW5nIEFtYXpvbiBCZWRyb2NrLlxuICAgKlxuICAgKiBDcmVhdGVzIGEgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgY29uZmlndXJlZCBCZWRyb2NrIG1vZGVsIHRvIGNsYXNzaWZ5XG4gICAqIHRoZSBkb2N1bWVudCB0eXBlLiBUaGUgZnVuY3Rpb24gcmVhZHMgdGhlIGRvY3VtZW50IGZyb20gUzMgYW5kIHNlbmRzIGl0IHRvXG4gICAqIEJlZHJvY2sgd2l0aCB0aGUgY2xhc3NpZmljYXRpb24gcHJvbXB0LlxuICAgKlxuICAgKiBAcmV0dXJucyBMYW1iZGFJbnZva2UgdGFzayBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjbGFzc2lmaWNhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIGNsYXNzaWZpY2F0aW9uU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgY29uc3QgcHJvbXB0ID0gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuY2xhc3NpZmljYXRpb25Qcm9tcHQgfHwgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZy5ERUZBVUxUX0NMQVNTSUZJQ0FUSU9OX1BST01QVDtcbiAgICBjb25zdCBmbU1vZGVsID0gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuY2xhc3NpZmljYXRpb25Nb2RlbElkIHx8IEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcuREVGQVVMVF9DTEFTU0lGSUNBVElPTl9NT0RFTF9JRDtcbiAgICBjb25zdCBhZGp1c3RlZE1vZGVsSWQgPSB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy51c2VDcm9zc1JlZ2lvbkluZmVyZW5jZSA/IGAke3RoaXMuY3Jvc3NSZWdpb25JbmZlcmVuY2VQcmVmaXh9LiR7Zm1Nb2RlbC5tb2RlbElkfWAgOiBmbU1vZGVsLm1vZGVsSWQ7XG4gICAgY29uc3Qgcm9sZSA9IHRoaXMuZ2VuZXJhdGVMYW1iZGFSb2xlRm9yQmVkcm9jayhmbU1vZGVsLCAnQ2xhc3NpZmljYXRpb25MYW1iZGFSb2xlJyk7XG4gICAgY29uc3QgeyByZWdpb24sIGFjY291bnQgfSA9IFN0YWNrLm9mKHRoaXMpO1xuICAgIGNvbnN0IGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zID0gTGFtYmRhSWFtVXRpbHMuY3JlYXRlTG9nc1Blcm1pc3Npb25zKHtcbiAgICAgIGFjY291bnQsXG4gICAgICBmdW5jdGlvbk5hbWU6ICdiZWRyb2NrLWlkcC1jbGFzc2lmaWNhdGlvbicsXG4gICAgICByZWdpb24sXG4gICAgICBzY29wZTogdGhpcyxcbiAgICAgIGVuYWJsZU9ic2VydmFiaWxpdHk6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmVuYWJsZU9ic2VydmFiaWxpdHksXG4gICAgfSk7XG5cbiAgICB0aGlzLmVuY3J5cHRpb25LZXkuZ3JhbnRFbmNyeXB0RGVjcnlwdChyb2xlKTtcblxuICAgIGlmICh0aGlzLmJ1Y2tldEVuY3J5cHRpb25LZXkpIHtcbiAgICAgIHRoaXMuYnVja2V0RW5jcnlwdGlvbktleS5ncmFudEVuY3J5cHREZWNyeXB0KHJvbGUpO1xuICAgIH1cblxuICAgIGNvbnN0IGJlZHJvY2tGdW5jdGlvbiA9IG5ldyBQeXRob25GdW5jdGlvbih0aGlzLCAnQmVkcm9ja0NsYXNzaWZpY2F0aW9uRnVuY3Rpb24nLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnVuaXF1ZUZ1bmN0aW9uTmFtZSxcbiAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLlg4Nl82NCxcbiAgICAgIHJ1bnRpbWU6IERlZmF1bHRSdW50aW1lcy5QWVRIT04sXG4gICAgICBlbnRyeTogcGF0aC5qb2luKF9fZGlybmFtZSwgJ3Jlc291cmNlcy9kZWZhdWx0LWJlZHJvY2staW52b2tlJyksXG4gICAgICByb2xlLFxuICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgdGltZW91dDogdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuc3RlcFRpbWVvdXRzIHx8IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBNT0RFTF9JRDogYWRqdXN0ZWRNb2RlbElkLFxuICAgICAgICBQUk9NUFQ6IHByb21wdCxcbiAgICAgICAgSU5WT0tFX1RZUEU6ICdjbGFzc2lmaWNhdGlvbicsXG4gICAgICAgIC4uLlBvd2VydG9vbHNDb25maWcuZ2VuZXJhdGVEZWZhdWx0TGFtYmRhQ29uZmlnKFxuICAgICAgICAgIHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmVuYWJsZU9ic2VydmFiaWxpdHksXG4gICAgICAgICAgdGhpcy5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgICAgdGhpcy5tZXRyaWNTZXJ2aWNlTmFtZSxcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgICBlbnZpcm9ubWVudEVuY3J5cHRpb246IHRoaXMuZW5jcnlwdGlvbktleSxcbiAgICAgIHZwYzogdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yayA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsudnBjIDogdW5kZWZpbmVkLFxuICAgICAgdnBjU3VibmV0czogdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yayA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsuYXBwbGljYXRpb25TdWJuZXRTZWxlY3Rpb24oKSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnBvbGljeVN0YXRlbWVudHMpIHtcbiAgICAgIGJlZHJvY2tGdW5jdGlvbi5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrKSB7XG4gICAgICBiZWRyb2NrRnVuY3Rpb24ucm9sZT8uYWRkVG9QcmluY2lwYWxQb2xpY3koTGFtYmRhSWFtVXRpbHMuZ2VuZXJhdGVMYW1iZGFWUENQZXJtaXNzaW9ucygpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnQ2xhc3NpZmljYXRpb25TdGVwJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IGJlZHJvY2tGdW5jdGlvbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLmNsYXNzaWZpY2F0aW9uUmVzdWx0JyxcbiAgICAgIHJlc3VsdFNlbGVjdG9yOiB7XG4gICAgICAgICdkb2N1bWVudENsYXNzaWZpY2F0aW9uLiQnOiAnJC5QYXlsb2FkLmRvY3VtZW50Q2xhc3NpZmljYXRpb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIHRoZSBkb2N1bWVudCBleHRyYWN0aW9uIHN0ZXAgdXNpbmcgQW1hem9uIEJlZHJvY2suXG4gICAqXG4gICAqIENyZWF0ZXMgYSBMYW1iZGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBjb25maWd1cmVkIEJlZHJvY2sgbW9kZWwgdG8gZXh0cmFjdFxuICAgKiBzdHJ1Y3R1cmVkIGRhdGEgZnJvbSB0aGUgZG9jdW1lbnQuIFVzZXMgdGhlIGNsYXNzaWZpY2F0aW9uIHJlc3VsdCBmcm9tIHRoZVxuICAgKiBwcmV2aW91cyBzdGVwIHRvIHByb3ZpZGUgY29udGV4dCBmb3IgbW9yZSBhY2N1cmF0ZSBleHRyYWN0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBMYW1iZGFJbnZva2UgdGFzayBjb25maWd1cmVkIGZvciBkb2N1bWVudCBleHRyYWN0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUge1xuICAgIGNvbnN0IHByb21wdCA9IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLnByb2Nlc3NpbmdQcm9tcHQgfHwgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZy5ERUZBVUxUX1BST0NFU1NJTkdfUFJPTVBUO1xuICAgIGNvbnN0IGZtTW9kZWwgPSB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5wcm9jZXNzaW5nTW9kZWxJZCB8fCBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nLkRFRkFVTFRfUFJPQ0VTU0lOR19NT0RFTF9JRDtcbiAgICBjb25zdCBhZGp1c3RlZE1vZGVsSWQgPSB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy51c2VDcm9zc1JlZ2lvbkluZmVyZW5jZSA/IGAke3RoaXMuY3Jvc3NSZWdpb25JbmZlcmVuY2VQcmVmaXh9LiR7Zm1Nb2RlbC5tb2RlbElkfWAgOiBmbU1vZGVsLm1vZGVsSWQ7XG4gICAgY29uc3Qgcm9sZSA9IHRoaXMuZ2VuZXJhdGVMYW1iZGFSb2xlRm9yQmVkcm9jayhmbU1vZGVsLCAnUHJvY2Vzc2luZ0xhbWJkYVJvbGUnKTtcbiAgICBjb25zdCB7IHJlZ2lvbiwgYWNjb3VudCB9ID0gU3RhY2sub2YodGhpcyk7XG5cbiAgICBjb25zdCBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucyA9IExhbWJkYUlhbVV0aWxzLmNyZWF0ZUxvZ3NQZXJtaXNzaW9ucyh7XG4gICAgICBhY2NvdW50LFxuICAgICAgZnVuY3Rpb25OYW1lOiAnYmVkcm9jay1pZHAtcHJvY2Vzc2luZycsXG4gICAgICByZWdpb24sXG4gICAgICBzY29wZTogdGhpcyxcbiAgICB9KTtcbiAgICB0aGlzLmVuY3J5cHRpb25LZXkuZ3JhbnRFbmNyeXB0RGVjcnlwdChyb2xlKTtcbiAgICBpZiAodGhpcy5idWNrZXRFbmNyeXB0aW9uS2V5KSB7XG4gICAgICB0aGlzLmJ1Y2tldEVuY3J5cHRpb25LZXkuZ3JhbnRFbmNyeXB0RGVjcnlwdChyb2xlKTtcbiAgICB9XG4gICAgY29uc3QgYmVkcm9ja0Z1bmN0aW9uID0gbmV3IFB5dGhvbkZ1bmN0aW9uKHRoaXMsICdCZWRyb2NrRXh0cmFjdGlvbkZ1bmN0aW9uJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucy51bmlxdWVGdW5jdGlvbk5hbWUsXG4gICAgICBydW50aW1lOiBEZWZhdWx0UnVudGltZXMuUFlUSE9OLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuWDg2XzY0LFxuICAgICAgZW50cnk6IHBhdGguam9pbihfX2Rpcm5hbWUsICdyZXNvdXJjZXMvZGVmYXVsdC1iZWRyb2NrLWludm9rZScpLFxuICAgICAgcm9sZSxcbiAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgIHRpbWVvdXQ6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLnN0ZXBUaW1lb3V0cyB8fCBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgTU9ERUxfSUQ6IGFkanVzdGVkTW9kZWxJZCxcbiAgICAgICAgUFJPTVBUOiBwcm9tcHQsXG4gICAgICAgIElOVk9LRV9UWVBFOiAncHJvY2Vzc2luZycsXG4gICAgICAgIC4uLlBvd2VydG9vbHNDb25maWcuZ2VuZXJhdGVEZWZhdWx0TGFtYmRhQ29uZmlnKFxuICAgICAgICAgIHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmVuYWJsZU9ic2VydmFiaWxpdHksXG4gICAgICAgICAgdGhpcy5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgICAgdGhpcy5tZXRyaWNTZXJ2aWNlTmFtZSxcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgICBlbnZpcm9ubWVudEVuY3J5cHRpb246IHRoaXMuZW5jcnlwdGlvbktleSxcbiAgICAgIHZwYzogdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yayA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsudnBjIDogdW5kZWZpbmVkLFxuICAgICAgdnBjU3VibmV0czogdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yayA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsuYXBwbGljYXRpb25TdWJuZXRTZWxlY3Rpb24oKSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnBvbGljeVN0YXRlbWVudHMpIHtcbiAgICAgIGJlZHJvY2tGdW5jdGlvbi5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrKSB7XG4gICAgICBiZWRyb2NrRnVuY3Rpb24ucm9sZT8uYWRkVG9QcmluY2lwYWxQb2xpY3koTGFtYmRhSWFtVXRpbHMuZ2VuZXJhdGVMYW1iZGFWUENQZXJtaXNzaW9ucygpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnUHJvY2Vzc2luZ1N0ZXAnLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogYmVkcm9ja0Z1bmN0aW9uLFxuICAgICAgcmVzdWx0UGF0aDogJyQucHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgICByZXN1bHRTZWxlY3Rvcjoge1xuICAgICAgICAnZG9jdW1lbnRDbGFzc2lmaWNhdGlvbi4kJzogJyQuUGF5bG9hZC5kb2N1bWVudENsYXNzaWZpY2F0aW9uJyxcbiAgICAgICAgJ3Jlc3VsdC4kJzogJyQuUGF5bG9hZC5yZXN1bHQnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZW5lcmF0ZUxhbWJkYVJvbGVGb3JCZWRyb2NrKGZtTW9kZWw6IEZvdW5kYXRpb25Nb2RlbElkZW50aWZpZXIsIGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7IHJlZ2lvbiwgYWNjb3VudCB9ID0gU3RhY2sub2YodGhpcyk7XG4gICAgcmV0dXJuIG5ldyBSb2xlKHRoaXMsIGlkLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpLFxuICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgQmVkcm9ja0ludm9rZVBvbGljeTogbmV3IFBvbGljeURvY3VtZW50KHtcbiAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFsnczM6R2V0T2JqZWN0J10sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW2Ake3RoaXMuYnVja2V0LmJ1Y2tldEFybn0vKmBdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAnYmVkcm9jazpJbnZva2VNb2RlbCcsXG4gICAgICAgICAgICAgICAgJ2JlZHJvY2s6SW52b2tlTW9kZWxXaXRoUmVzcG9uc2VTdHJlYW0nLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICAgICAgICBgYXJuOmF3czpiZWRyb2NrOio6OmZvdW5kYXRpb24tbW9kZWwvJHtmbU1vZGVsLm1vZGVsSWR9YCxcbiAgICAgICAgICAgICAgICBgYXJuOmF3czpiZWRyb2NrOiR7cmVnaW9ufToke2FjY291bnR9OmluZmVyZW5jZS1wcm9maWxlLyR7dGhpcy5jcm9zc1JlZ2lvbkluZmVyZW5jZVByZWZpeH0uJHtmbU1vZGVsLm1vZGVsSWR9YCxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIHRoZSBvcHRpb25hbCBkb2N1bWVudCBlbnJpY2htZW50IHN0ZXAuXG4gICAqXG4gICAqIElmIGFuIGVucmljaG1lbnQgTGFtYmRhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGluIHRoZSBwcm9wcywgY3JlYXRlcyBhIExhbWJkYUludm9rZVxuICAgKiB0YXNrIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBwcm9jZXNzaW5nIG9uIHRoZSBleHRyYWN0ZWQgZGF0YS4gVGhpcyBzdGVwIGlzIHVzZWZ1bFxuICAgKiBmb3IgZGF0YSB2YWxpZGF0aW9uLCB0cmFuc2Zvcm1hdGlvbiwgb3IgaW50ZWdyYXRpb24gd2l0aCBleHRlcm5hbCBzeXN0ZW1zLlxuICAgKlxuICAgKiBAcmV0dXJucyBMYW1iZGFJbnZva2UgdGFzayBmb3IgZW5yaWNobWVudCwgb3IgdW5kZWZpbmVkIHRvIHNraXAgdGhpcyBzdGVwXG4gICAqL1xuICBwcm90ZWN0ZWQgZW5yaWNobWVudFN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuZW5yaWNobWVudExhbWJkYUZ1bmN0aW9uKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdFbnJpY2htZW50U3RlcCcsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbnJpY2htZW50TGFtYmRhRnVuY3Rpb24sXG4gICAgICByZXN1bHRQYXRoOiAnJC5lbnJpY2hlZFJlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyB0aGUgb3B0aW9uYWwgcG9zdC1wcm9jZXNzaW5nIHN0ZXAuXG4gICAqXG4gICAqIElmIGEgcG9zdC1wcm9jZXNzaW5nIExhbWJkYSBmdW5jdGlvbiBpcyBwcm92aWRlZCBpbiB0aGUgcHJvcHMsIGNyZWF0ZXMgYSBMYW1iZGFJbnZva2VcbiAgICogdGFzayB0byBwZXJmb3JtIGZpbmFsIHByb2Nlc3Npbmcgb24gdGhlIHdvcmtmbG93IHJlc3VsdHMuIFRoaXMgc3RlcCBpcyB1c2VmdWwgZm9yXG4gICAqIGRhdGEgZm9ybWF0dGluZywgbm90aWZpY2F0aW9ucywgb3IgaW50ZWdyYXRpb24gd2l0aCBkb3duc3RyZWFtIHN5c3RlbXMuXG4gICAqXG4gICAqIEByZXR1cm5zIExhbWJkYUludm9rZSB0YXNrIGZvciBwb3N0LXByb2Nlc3NpbmcsIG9yIHVuZGVmaW5lZCB0byBza2lwIHRoaXMgc3RlcFxuICAgKi9cbiAgcHJvdGVjdGVkIHBvc3RQcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5wb3N0UHJvY2Vzc2luZ0xhbWJkYUZ1bmN0aW9uKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdQb3N0UHJvY2Vzc2luZ1N0ZXAnLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMucG9zdFByb2Nlc3NpbmdMYW1iZGFGdW5jdGlvbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLnBvc3RQcm9jZXNzZWRSZXN1bHQnLFxuICAgIH0pO1xuICB9XG59Il19
288
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscUVBQXFFO0FBQ3JFLHNDQUFzQztBQUV0Qyw2QkFBNkI7QUFDN0IsOEVBQWtFO0FBQ2xFLDZDQUE4QztBQUM5Qyx5REFBb0U7QUFDcEUsaURBQXFFO0FBQ3JFLGlEQUFzRztBQUN0Ryx1REFBZ0U7QUFFaEUsaUZBQW1FO0FBRW5FLHlFQUE2SDtBQUM3SCw0Q0FBK0M7QUFDL0MsNENBQThDO0FBQzlDLG9GQUFnRjtBQTBEaEY7OztHQUdHO0FBQ0gsSUFBWSxpQ0FLWDtBQUxELFdBQVksaUNBQWlDO0lBQzNDLDhDQUE4QztJQUM5Qyw4Q0FBUyxDQUFBO0lBQ1QsOENBQThDO0lBQzlDLDhDQUFTLENBQUE7QUFDWCxDQUFDLEVBTFcsaUNBQWlDLGlEQUFqQyxpQ0FBaUMsUUFLNUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxNQUFhLHlCQUEwQixTQUFRLGlEQUFzQjtJQTRDbkU7Ozs7Ozs7Ozs7T0FVRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBcUM7UUFDN0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLEVBQUUsd0NBQThCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUYsS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxzQkFBc0IsRUFBRSx3Q0FBOEIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5RyxDQUFDO1FBRUQsSUFBSSxDQUFDLDhC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QixJQUFJLENBQUMsMEJBQTBCLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTs2QkFDL0c7eUJBQ0YsQ0FBQztxQkFDSDtpQkFDRixDQUFDO2FBQ0g7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDTyxjQUFjO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNsRSxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTyxJQUFJLHNDQUFZLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQzlDLGNBQWMsRUFBRSxJQUFJLENBQUMsOEJBQThCLENBQUMsd0JBQXdCO1lBQzVFLFVBQVUsRUFBRSxrQkFBa0I7U0FDL0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ08sa0JBQWtCO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztZQUN0RSxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTyxJQUFJLHNDQUFZLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFO1lBQ2xELGNBQWMsRUFBRSxJQUFJLENBQUMsOEJBQThCLENBQUMsNEJBQTRCO1lBQ2hGLFVBQVUsRUFBRSx1QkFBdUI7U0FDcEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFuUUgsOERBb1FDOzs7QUFsUTJCLHlEQUErQixHQUNyRCx1Q0FBeUIsQ0FBQyx5Q0FBeUMsQ0FBQztBQUM5QyxxREFBMkIsR0FDakQsdUNBQXlCLENBQUMseUNBQXlDLENBQUM7QUFDOUMsdURBQTZCLEdBQUc7Ozs7Ozs7OztHQVN6RCxDQUFDO0FBRXdCLG1EQUF5QixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQnJELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBQeXRob25GdW5jdGlvbiB9IGZyb20gJ0Bhd3MtY2RrL2F3cy1sYW1iZGEtcHl0aG9uLWFscGhhJztcbmltcG9ydCB7IER1cmF0aW9uLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEZvdW5kYXRpb25Nb2RlbElkZW50aWZpZXIgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYmVkcm9jayc7XG5pbXBvcnQgeyBJbnRlcmZhY2VWcGNFbmRwb2ludEF3c1NlcnZpY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB7IFJvbGUsIFNlcnZpY2VQcmluY2lwYWwsIFBvbGljeVN0YXRlbWVudCwgUG9saWN5RG9jdW1lbnQsIEVmZmVjdCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgRnVuY3Rpb24sIEFyY2hpdGVjdHVyZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgU3RhdGVNYWNoaW5lIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMnO1xuaW1wb3J0IHsgTGFtYmRhSW52b2tlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nLCBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMsIERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIH0gZnJvbSAnLi9iYXNlLWRvY3VtZW50LXByb2Nlc3NpbmcnO1xuaW1wb3J0IHsgRGVmYXVsdFJ1bnRpbWVzIH0gZnJvbSAnLi4vZnJhbWV3b3JrJztcbmltcG9ydCB7IExhbWJkYUlhbVV0aWxzIH0gZnJvbSAnLi4vdXRpbGl0aWVzJztcbmltcG9ydCB7IFBvd2VydG9vbHNDb25maWcgfSBmcm9tICcuLi91dGlsaXRpZXMvb2JzZXJ2YWJpbGl0eS9wb3dlcnRvb2xzLWNvbmZpZyc7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nIGNvbnN0cnVjdC5cbiAqIEV4dGVuZHMgQmFzZURvY3VtZW50UHJvY2Vzc2luZ1Byb3BzIHdpdGggQmVkcm9jay1zcGVjaWZpYyBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcyBleHRlbmRzIEJhc2VEb2N1bWVudFByb2Nlc3NpbmdQcm9wcyB7XG4gIC8qKlxuICAgKiBCZWRyb2NrIGZvdW5kYXRpb24gbW9kZWwgZm9yIGRvY3VtZW50IGNsYXNzaWZpY2F0aW9uIHN0ZXAuXG4gICAqIEBkZWZhdWx0IEZvdW5kYXRpb25Nb2RlbElkZW50aWZpZXIuQU5USFJPUElDX0NMQVVERV8zXzdfU09OTkVUXzIwMjUwMjE5X1YxXzBcbiAgICovXG4gIHJlYWRvbmx5IGNsYXNzaWZpY2F0aW9uTW9kZWxJZD86IEZvdW5kYXRpb25Nb2RlbElkZW50aWZpZXI7XG4gIC8qKlxuICAgKiBCZWRyb2NrIGZvdW5kYXRpb24gbW9kZWwgZm9yIGRvY3VtZW50IGV4dHJhY3Rpb24gc3RlcC5cbiAgICogQGRlZmF1bHQgRm91bmRhdGlvbk1vZGVsSWRlbnRpZmllci5BTlRIUk9QSUNfQ0xBVURFXzNfN19TT05ORVRfMjAyNTAyMTlfVjFfMFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvY2Vzc2luZ01vZGVsSWQ/OiBGb3VuZGF0aW9uTW9kZWxJZGVudGlmaWVyO1xuICAvKipcbiAgICogQ3VzdG9tIHByb21wdCB0ZW1wbGF0ZSBmb3IgZG9jdW1lbnQgY2xhc3NpZmljYXRpb24uXG4gICAqIE11c3QgaW5jbHVkZSBwbGFjZWhvbGRlciBmb3IgZG9jdW1lbnQgY29udGVudC5cbiAgICogQGRlZmF1bHQgREVGQVVMVF9DTEFTU0lGSUNBVElPTl9QUk9NUFRcbiAgICovXG4gIHJlYWRvbmx5IGNsYXNzaWZpY2F0aW9uUHJvbXB0Pzogc3RyaW5nO1xuICAvKipcbiAgICogQ3VzdG9tIHByb21wdCB0ZW1wbGF0ZSBmb3IgZG9jdW1lbnQgZXh0cmFjdGlvbi5cbiAgICogTXVzdCBpbmNsdWRlIHBsYWNlaG9sZGVyIGZvciBkb2N1bWVudCBjb250ZW50IGFuZCBjbGFzc2lmaWNhdGlvbiByZXN1bHQuXG4gICAqIEBkZWZhdWx0IERFRkFVTFRfRVhUUkFDVElPTl9QUk9NUFRcbiAgICovXG4gIHJlYWRvbmx5IHByb2Nlc3NpbmdQcm9tcHQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBMYW1iZGEgZnVuY3Rpb24gZm9yIGRvY3VtZW50IGVucmljaG1lbnQgc3RlcC5cbiAgICogSWYgcHJvdmlkZWQsIHdpbGwgYmUgaW52b2tlZCBhZnRlciBleHRyYWN0aW9uIHdpdGggd29ya2Zsb3cgc3RhdGUuXG4gICAqL1xuICByZWFkb25seSBlbnJpY2htZW50TGFtYmRhRnVuY3Rpb24/OiBGdW5jdGlvbjtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIExhbWJkYSBmdW5jdGlvbiBmb3IgcG9zdC1wcm9jZXNzaW5nIHN0ZXAuXG4gICAqIElmIHByb3ZpZGVkLCB3aWxsIGJlIGludm9rZWQgYWZ0ZXIgZW5yaWNobWVudCB3aXRoIHdvcmtmbG93IHN0YXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9zdFByb2Nlc3NpbmdMYW1iZGFGdW5jdGlvbj86IEZ1bmN0aW9uO1xuICAvKipcbiAgICogVGltZW91dCBmb3IgaW5kaXZpZHVhbCBTdGVwIEZ1bmN0aW9ucyB0YXNrcyAoY2xhc3NpZmljYXRpb24sIGV4dHJhY3Rpb24sIGV0Yy4pLlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5taW51dGVzKDUpXG4gICAqL1xuICByZWFkb25seSBzdGVwVGltZW91dHM/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIEVuYWJsZSBjcm9zcy1yZWdpb24gaW5mZXJlbmNlIGZvciBCZWRyb2NrIG1vZGVscyB0byBpbXByb3ZlIGF2YWlsYWJpbGl0eSBhbmQgcGVyZm9ybWFuY2UuXG4gICAqIFdoZW4gZW5hYmxlZCwgdXNlcyBpbmZlcmVuY2UgcHJvZmlsZXMgaW5zdGVhZCBvZiBkaXJlY3QgbW9kZWwgaW52b2NhdGlvbi5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHVzZUNyb3NzUmVnaW9uSW5mZXJlbmNlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFByZWZpeCBmb3IgY3Jvc3MtcmVnaW9uIGluZmVyZW5jZSBjb25maWd1cmF0aW9uLlxuICAgKiBPbmx5IHVzZWQgd2hlbiB1c2VDcm9zc1JlZ2lvbkluZmVyZW5jZSBpcyB0cnVlLlxuICAgKiBAZGVmYXVsdCBCZWRyb2NrQ3Jvc3NSZWdpb25JbmZlcmVuY2VQcmVmaXguVVNcbiAgICovXG4gIHJlYWRvbmx5IGNyb3NzUmVnaW9uSW5mZXJlbmNlUHJlZml4PzogQmVkcm9ja0Nyb3NzUmVnaW9uSW5mZXJlbmNlUHJlZml4O1xufVxuXG4vKipcbiAqIENyb3NzLXJlZ2lvbiBpbmZlcmVuY2UgcHJlZml4IG9wdGlvbnMgZm9yIEJlZHJvY2sgbW9kZWxzLlxuICogVXNlZCB0byBjb25maWd1cmUgaW5mZXJlbmNlIHByb2ZpbGVzIGZvciBpbXByb3ZlZCBhdmFpbGFiaWxpdHkgYW5kIHBlcmZvcm1hbmNlLlxuICovXG5leHBvcnQgZW51bSBCZWRyb2NrQ3Jvc3NSZWdpb25JbmZlcmVuY2VQcmVmaXgge1xuICAvKiogVVMtYmFzZWQgY3Jvc3MtcmVnaW9uIGluZmVyZW5jZSBwcm9maWxlICovXG4gIFVTID0gJ3VzJyxcbiAgLyoqIEVVLWJhc2VkIGNyb3NzLXJlZ2lvbiBpbmZlcmVuY2UgcHJvZmlsZSAqL1xuICBFVSA9ICdldScsXG59XG5cbi8qKlxuICogRG9jdW1lbnQgcHJvY2Vzc2luZyB3b3JrZmxvdyBwb3dlcmVkIGJ5IEFtYXpvbiBCZWRyb2NrIGZvdW5kYXRpb24gbW9kZWxzLlxuICpcbiAqIEV4dGVuZHMgQmFzZURvY3VtZW50UHJvY2Vzc2luZyB0byBwcm92aWRlIEFJLXBvd2VyZWQgZG9jdW1lbnQgY2xhc3NpZmljYXRpb24gYW5kIGV4dHJhY3Rpb25cbiAqIHVzaW5nIEFtYXpvbiBCZWRyb2NrIGZvdW5kYXRpb24gbW9kZWxzLiBUaGlzIGltcGxlbWVudGF0aW9uIG9mZmVyczpcbiAqXG4gKiAjIyBLZXkgRmVhdHVyZXNcbiAqIC0gKipBSS1Qb3dlcmVkIENsYXNzaWZpY2F0aW9uKio6IFVzZXMgQ2xhdWRlIDMuNyBTb25uZXQgKGNvbmZpZ3VyYWJsZSkgdG8gY2xhc3NpZnkgZG9jdW1lbnQgdHlwZXNcbiAqIC0gKipJbnRlbGxpZ2VudCBFeHRyYWN0aW9uKio6IEV4dHJhY3RzIHN0cnVjdHVyZWQgZGF0YSBmcm9tIGRvY3VtZW50cyB1c2luZyBmb3VuZGF0aW9uIG1vZGVsc1xuICogLSAqKkNyb3NzLVJlZ2lvbiBJbmZlcmVuY2UqKjogT3B0aW9uYWwgc3VwcG9ydCBmb3IgaW1wcm92ZWQgYXZhaWxhYmlsaXR5IHZpYSBpbmZlcmVuY2UgcHJvZmlsZXNcbiAqIC0gKipGbGV4aWJsZSBQcm9jZXNzaW5nKio6IE9wdGlvbmFsIGVucmljaG1lbnQgYW5kIHBvc3QtcHJvY2Vzc2luZyBMYW1iZGEgZnVuY3Rpb25zXG4gKiAtICoqQ29zdCBPcHRpbWl6ZWQqKjogQ29uZmlndXJhYmxlIHRpbWVvdXRzIGFuZCBtb2RlbCBzZWxlY3Rpb24gZm9yIGNvc3QgY29udHJvbFxuICpcbiAqICMjIFByb2Nlc3NpbmcgV29ya2Zsb3dcbiAqIFMzIFVwbG9hZCDihpIgQ2xhc3NpZmljYXRpb24gKEJlZHJvY2spIOKGkiBFeHRyYWN0aW9uIChCZWRyb2NrKSDihpIgW0VucmljaG1lbnRdIOKGkiBbUG9zdC1Qcm9jZXNzaW5nXSDihpIgUmVzdWx0c1xuICpcbiAqICMjIERlZmF1bHQgTW9kZWxzXG4gKiAtIENsYXNzaWZpY2F0aW9uOiBDbGF1ZGUgMy43IFNvbm5ldCAoYW50aHJvcGljLmNsYXVkZS0zLTctc29ubmV0LTIwMjUwMjE5LXYxOjApXG4gKiAtIEV4dHJhY3Rpb246IENsYXVkZSAzLjcgU29ubmV0IChhbnRocm9waWMuY2xhdWRlLTMtNy1zb25uZXQtMjAyNTAyMTktdjE6MClcbiAqXG4gKiAjIyBQcm9tcHQgVGVtcGxhdGVzXG4gKiBUaGUgY29uc3RydWN0IHVzZXMgZGVmYXVsdCBwcm9tcHRzIHRoYXQgY2FuIGJlIGN1c3RvbWl6ZWQ6XG4gKiAtICoqQ2xhc3NpZmljYXRpb24qKjogQW5hbHl6ZXMgZG9jdW1lbnQgYW5kIHJldHVybnMgSlNPTiB3aXRoIGRvY3VtZW50Q2xhc3NpZmljYXRpb24gZmllbGRcbiAqIC0gKipFeHRyYWN0aW9uKio6IFVzZXMgY2xhc3NpZmljYXRpb24gcmVzdWx0IHRvIGV4dHJhY3QgZW50aXRpZXMgaW4gc3RydWN0dXJlZCBKU09OIGZvcm1hdFxuICpcbiAqICMjIENyb3NzLVJlZ2lvbiBJbmZlcmVuY2VcbiAqIFdoZW4gZW5hYmxlZCwgdXNlcyBCZWRyb2NrIGluZmVyZW5jZSBwcm9maWxlcyBmb3IgaW1wcm92ZWQgYXZhaWxhYmlsaXR5OlxuICogLSBVUyBwcmVmaXg6IFJvdXRlcyB0byBVUy1iYXNlZCByZWdpb25zIGZvciBsb3dlciBsYXRlbmN5XG4gKiAtIEVVIHByZWZpeDogUm91dGVzIHRvIEVVLWJhc2VkIHJlZ2lvbnMgZm9yIGRhdGEgcmVzaWRlbmN5IGNvbXBsaWFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcgZXh0ZW5kcyBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nIHtcblxuICBwcm90ZWN0ZWQgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfQ0xBU1NJRklDQVRJT05fTU9ERUxfSUQ6IEZvdW5kYXRpb25Nb2RlbElkZW50aWZpZXJcbiAgICA9IEZvdW5kYXRpb25Nb2RlbElkZW50aWZpZXIuQU5USFJPUElDX0NMQVVERV8zXzdfU09OTkVUXzIwMjUwMjE5X1YxXzA7XG4gIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9QUk9DRVNTSU5HX01PREVMX0lEOiBGb3VuZGF0aW9uTW9kZWxJZGVudGlmaWVyXG4gICAgPSBGb3VuZGF0aW9uTW9kZWxJZGVudGlmaWVyLkFOVEhST1BJQ19DTEFVREVfM183X1NPTk5FVF8yMDI1MDIxOV9WMV8wO1xuICBwcm90ZWN0ZWQgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfQ0xBU1NJRklDQVRJT05fUFJPTVBUID0gYFxuICBBbmFseXplIHRoZSBkb2N1bWVudCBiZWxvdywgYW5kIGNsYXNzaWZ5IHRoZSB0eXBlIG9mIGRvY3VtZW50IGl0IGlzIChlZy4gSU5WT0lDRSwgSURFTlRJVFlfRE9DVU1FTlQsIFJFQ0VJUFQsIGV0YykuIFRoZSByZXN1bHQgc2hvdWxkIGJlIGluIEpTT04gYW5kIHNob3VsZCBmb2xsb3cgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgKG9ubHkgcmVzcG9uZCBpbiBKU09OIHdpdGggdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgYW5kIGRvIG5vdCB1c2UgbWFya2Rvd24gdG8gaW5kaWNhdGUgdGhlIGpzb24sIGp1c3Qgb3V0cHV0IHBsYWluIG9sZCBqc29uIHdpdGggbm90aGluZyBlbHNlKTpcblxuICB7XG4gICAgICBkb2N1bWVudENsYXNzaWZpY2F0aW9uOiA8Q0xBU1NJRklDQVRJT04+XG4gIH1cblxuICBBdHRhY2hlZCBkb2N1bWVudCBpcyBhcyBmb2xsb3dzOlxuXG4gIGA7XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1BST0NFU1NJTkdfUFJPTVBUID0gYFxuICBUaGUgZG9jdW1lbnQgYmVsb3cgaGFzIGJlZW4gY2xhc3NpZmllZCBhcyBbQUNUVUFMX0NMQVNTSUZJQ0FUSU9OXS4gRXh0cmFjdCBpbXBvcnRhbnQgZW50aXRpZXMgZnJvbSB0aGUgZG9jdW1lbnQgYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzIEpTT04gZm9sbG93aW5nIHRoZSBzdHJ1Y3R1cmUgYmVsb3cgKG9ubHkgcmVzcG9uZCBpbiBKU09OIHdpdGggdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgYW5kIGRvIG5vdCB1c2UgbWFya2Rvd24gdG8gaW5kaWNhdGUgdGhlIGpzb24sIGp1c3Qgb3V0cHV0IHBsYWluIG9sZCBqc29uIHdpdGggbm90aGluZyBlbHNlKTpcblxuICB7XG4gICAgICBkb2N1bWVudENsYXNzaWZpY2F0aW9uOiA8Q0xBU1NJRklDQVRJT04+LFxuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIGVudGl0aWVzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogPFRZUEUgT0YgRU5USVRZPlxuICAgICAgICAgICAgICAgIHZhbHVlOiA8VkFMVUUgT0YgRU5USVRZPlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLlxuICAgICAgICBdXG4gICAgICB9XG4gIH1cblxuICBBdHRhY2hlZCBkb2N1bWVudCBpcyBhcyBmb2xsb3dzOlxuXG4gIGA7XG5cbiAgLyoqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBzcGVjaWZpYyB0byBCZWRyb2NrIGRvY3VtZW50IHByb2Nlc3NpbmcgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wczogQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzO1xuICAvKiogQ3Jvc3MtcmVnaW9uIGluZmVyZW5jZSBwcmVmaXggZm9yIEJlZHJvY2sgbW9kZWwgcm91dGluZyAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3Jvc3NSZWdpb25JbmZlcmVuY2VQcmVmaXg6IEJlZHJvY2tDcm9zc1JlZ2lvbkluZmVyZW5jZVByZWZpeDtcbiAgLyoqIFRoZSBTdGVwIEZ1bmN0aW9ucyBzdGF0ZSBtYWNoaW5lIHRoYXQgb3JjaGVzdHJhdGVzIHRoZSBkb2N1bWVudCBwcm9jZXNzaW5nIHdvcmtmbG93ICovXG4gIHJlYWRvbmx5IHN0YXRlTWFjaGluZTogU3RhdGVNYWNoaW5lO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcgY29uc3RydWN0LlxuICAgKlxuICAgKiBJbml0aWFsaXplcyB0aGUgQmVkcm9jay1wb3dlcmVkIGRvY3VtZW50IHByb2Nlc3NpbmcgcGlwZWxpbmUgd2l0aCBBSSBjbGFzc2lmaWNhdGlvblxuICAgKiBhbmQgZXh0cmFjdGlvbiBjYXBhYmlsaXRpZXMuIENyZWF0ZXMgTGFtYmRhIGZ1bmN0aW9ucyB3aXRoIGFwcHJvcHJpYXRlIElBTSByb2xlc1xuICAgKiBmb3IgQmVkcm9jayBtb2RlbCBpbnZvY2F0aW9uIGFuZCBTMyBhY2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSAtIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGlkIC0gVGhlIHNjb3BlZCBjb25zdHJ1Y3QgSUQuIE11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUuXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIEJlZHJvY2sgZG9jdW1lbnQgcHJvY2Vzc2luZyBwaXBlbGluZVxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIGlmIChwcm9wcy5uZXR3b3JrKSB7XG4gICAgICBwcm9wcy5uZXR3b3JrLmNyZWF0ZVNlcnZpY2VFbmRwb2ludCgndnBjZS1iZWRyb2NrJywgSW50ZXJmYWNlVnBjRW5kcG9pbnRBd3NTZXJ2aWNlLkJFRFJPQ0spO1xuICAgICAgcHJvcHMubmV0d29yay5jcmVhdGVTZXJ2aWNlRW5kcG9pbnQoJ3ZwY2UtYmVkcm9jay1ydW50aW1lJywgSW50ZXJmYWNlVnBjRW5kcG9pbnRBd3NTZXJ2aWNlLkJFRFJPQ0tfUlVOVElNRSk7XG4gICAgfVxuXG4gICAgdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLmNyb3NzUmVnaW9uSW5mZXJlbmNlUHJlZml4ID0gcHJvcHMuY3Jvc3NSZWdpb25JbmZlcmVuY2VQcmVmaXggfHwgQmVkcm9ja0Nyb3NzUmVnaW9uSW5mZXJlbmNlUHJlZml4LlVTO1xuICAgIHRoaXMuc3RhdGVNYWNoaW5lID0gdGhpcy5oYW5kbGVTdGF0ZU1hY2hpbmVDcmVhdGlvbignYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nLXdvcmtmbG93Jyk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyB0aGUgZG9jdW1lbnQgY2xhc3NpZmljYXRpb24gc3RlcCB1c2luZyBBbWF6b24gQmVkcm9jay5cbiAgICpcbiAgICogQ3JlYXRlcyBhIExhbWJkYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIGNvbmZpZ3VyZWQgQmVkcm9jayBtb2RlbCB0byBjbGFzc2lmeVxuICAgKiB0aGUgZG9jdW1lbnQgdHlwZS4gVGhlIGZ1bmN0aW9uIHJlYWRzIHRoZSBkb2N1bWVudCBmcm9tIFMzIGFuZCBzZW5kcyBpdCB0b1xuICAgKiBCZWRyb2NrIHdpdGggdGhlIGNsYXNzaWZpY2F0aW9uIHByb21wdC5cbiAgICpcbiAgICogQHJldHVybnMgTGFtYmRhSW52b2tlIHRhc2sgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2xhc3NpZmljYXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBjbGFzc2lmaWNhdGlvblN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUge1xuICAgIGNvbnN0IHByb21wdCA9IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmNsYXNzaWZpY2F0aW9uUHJvbXB0IHx8IEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcuREVGQVVMVF9DTEFTU0lGSUNBVElPTl9QUk9NUFQ7XG4gICAgY29uc3QgZm1Nb2RlbCA9IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmNsYXNzaWZpY2F0aW9uTW9kZWxJZCB8fCBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nLkRFRkFVTFRfQ0xBU1NJRklDQVRJT05fTU9ERUxfSUQ7XG4gICAgY29uc3QgYWRqdXN0ZWRNb2RlbElkID0gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMudXNlQ3Jvc3NSZWdpb25JbmZlcmVuY2UgPyBgJHt0aGlzLmNyb3NzUmVnaW9uSW5mZXJlbmNlUHJlZml4fS4ke2ZtTW9kZWwubW9kZWxJZH1gIDogZm1Nb2RlbC5tb2RlbElkO1xuICAgIGNvbnN0IHJvbGUgPSB0aGlzLmdlbmVyYXRlTGFtYmRhUm9sZUZvckJlZHJvY2soZm1Nb2RlbCwgJ0NsYXNzaWZpY2F0aW9uTGFtYmRhUm9sZScpO1xuICAgIGNvbnN0IHsgcmVnaW9uLCBhY2NvdW50IH0gPSBTdGFjay5vZih0aGlzKTtcbiAgICBjb25zdCBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucyA9IExhbWJkYUlhbVV0aWxzLmNyZWF0ZUxvZ3NQZXJtaXNzaW9ucyh7XG4gICAgICBhY2NvdW50LFxuICAgICAgZnVuY3Rpb25OYW1lOiAnYmVkcm9jay1pZHAtY2xhc3NpZmljYXRpb24nLFxuICAgICAgcmVnaW9uLFxuICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICBlbmFibGVPYnNlcnZhYmlsaXR5OiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgIH0pO1xuXG4gICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQocm9sZSk7XG5cbiAgICBjb25zdCBiZWRyb2NrRnVuY3Rpb24gPSBuZXcgUHl0aG9uRnVuY3Rpb24odGhpcywgJ0JlZHJvY2tDbGFzc2lmaWNhdGlvbkZ1bmN0aW9uJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucy51bmlxdWVGdW5jdGlvbk5hbWUsXG4gICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5YODZfNjQsXG4gICAgICBydW50aW1lOiBEZWZhdWx0UnVudGltZXMuUFlUSE9OLFxuICAgICAgZW50cnk6IHBhdGguam9pbihfX2Rpcm5hbWUsICdyZXNvdXJjZXMvZGVmYXVsdC1iZWRyb2NrLWludm9rZScpLFxuICAgICAgcm9sZSxcbiAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgIHRpbWVvdXQ6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLnN0ZXBUaW1lb3V0cyB8fCBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgTU9ERUxfSUQ6IGFkanVzdGVkTW9kZWxJZCxcbiAgICAgICAgUFJPTVBUOiBwcm9tcHQsXG4gICAgICAgIElOVk9LRV9UWVBFOiAnY2xhc3NpZmljYXRpb24nLFxuICAgICAgICAuLi5Qb3dlcnRvb2xzQ29uZmlnLmdlbmVyYXRlRGVmYXVsdExhbWJkYUNvbmZpZyhcbiAgICAgICAgICB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgICAgICAgIHRoaXMubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICAgIHRoaXMubWV0cmljU2VydmljZU5hbWUsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgICAgZW52aXJvbm1lbnRFbmNyeXB0aW9uOiB0aGlzLmVuY3J5cHRpb25LZXksXG4gICAgICB2cGM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsgPyB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrLnZwYyA6IHVuZGVmaW5lZCxcbiAgICAgIHZwY1N1Ym5ldHM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsgPyB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrLmFwcGxpY2F0aW9uU3VibmV0U2VsZWN0aW9uKCkgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucy5wb2xpY3lTdGF0ZW1lbnRzKSB7XG4gICAgICBiZWRyb2NrRnVuY3Rpb24ucm9sZT8uYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yaykge1xuICAgICAgYmVkcm9ja0Z1bmN0aW9uLnJvbGU/LmFkZFRvUHJpbmNpcGFsUG9saWN5KExhbWJkYUlhbVV0aWxzLmdlbmVyYXRlTGFtYmRhVlBDUGVybWlzc2lvbnMoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ0NsYXNzaWZpY2F0aW9uU3RlcCcsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiBiZWRyb2NrRnVuY3Rpb24sXG4gICAgICByZXN1bHRQYXRoOiAnJC5jbGFzc2lmaWNhdGlvblJlc3VsdCcsXG4gICAgICByZXN1bHRTZWxlY3Rvcjoge1xuICAgICAgICAnZG9jdW1lbnRDbGFzc2lmaWNhdGlvbi4kJzogJyQuUGF5bG9hZC5kb2N1bWVudENsYXNzaWZpY2F0aW9uJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyB0aGUgZG9jdW1lbnQgZXh0cmFjdGlvbiBzdGVwIHVzaW5nIEFtYXpvbiBCZWRyb2NrLlxuICAgKlxuICAgKiBDcmVhdGVzIGEgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgY29uZmlndXJlZCBCZWRyb2NrIG1vZGVsIHRvIGV4dHJhY3RcbiAgICogc3RydWN0dXJlZCBkYXRhIGZyb20gdGhlIGRvY3VtZW50LiBVc2VzIHRoZSBjbGFzc2lmaWNhdGlvbiByZXN1bHQgZnJvbSB0aGVcbiAgICogcHJldmlvdXMgc3RlcCB0byBwcm92aWRlIGNvbnRleHQgZm9yIG1vcmUgYWNjdXJhdGUgZXh0cmFjdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgTGFtYmRhSW52b2tlIHRhc2sgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgZXh0cmFjdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIHByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHtcbiAgICBjb25zdCBwcm9tcHQgPSB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5wcm9jZXNzaW5nUHJvbXB0IHx8IEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcuREVGQVVMVF9QUk9DRVNTSU5HX1BST01QVDtcbiAgICBjb25zdCBmbU1vZGVsID0gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMucHJvY2Vzc2luZ01vZGVsSWQgfHwgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZy5ERUZBVUxUX1BST0NFU1NJTkdfTU9ERUxfSUQ7XG4gICAgY29uc3QgYWRqdXN0ZWRNb2RlbElkID0gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMudXNlQ3Jvc3NSZWdpb25JbmZlcmVuY2UgPyBgJHt0aGlzLmNyb3NzUmVnaW9uSW5mZXJlbmNlUHJlZml4fS4ke2ZtTW9kZWwubW9kZWxJZH1gIDogZm1Nb2RlbC5tb2RlbElkO1xuICAgIGNvbnN0IHJvbGUgPSB0aGlzLmdlbmVyYXRlTGFtYmRhUm9sZUZvckJlZHJvY2soZm1Nb2RlbCwgJ1Byb2Nlc3NpbmdMYW1iZGFSb2xlJyk7XG4gICAgY29uc3QgeyByZWdpb24sIGFjY291bnQgfSA9IFN0YWNrLm9mKHRoaXMpO1xuXG4gICAgY29uc3QgZ2VuZXJhdGVkTG9nUGVybWlzc2lvbnMgPSBMYW1iZGFJYW1VdGlscy5jcmVhdGVMb2dzUGVybWlzc2lvbnMoe1xuICAgICAgYWNjb3VudCxcbiAgICAgIGZ1bmN0aW9uTmFtZTogJ2JlZHJvY2staWRwLXByb2Nlc3NpbmcnLFxuICAgICAgcmVnaW9uLFxuICAgICAgc2NvcGU6IHRoaXMsXG4gICAgfSk7XG4gICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQocm9sZSk7XG4gICAgY29uc3QgYmVkcm9ja0Z1bmN0aW9uID0gbmV3IFB5dGhvbkZ1bmN0aW9uKHRoaXMsICdCZWRyb2NrRXh0cmFjdGlvbkZ1bmN0aW9uJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucy51bmlxdWVGdW5jdGlvbk5hbWUsXG4gICAgICBydW50aW1lOiBEZWZhdWx0UnVudGltZXMuUFlUSE9OLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuWDg2XzY0LFxuICAgICAgZW50cnk6IHBhdGguam9pbihfX2Rpcm5hbWUsICdyZXNvdXJjZXMvZGVmYXVsdC1iZWRyb2NrLWludm9rZScpLFxuICAgICAgcm9sZSxcbiAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgIHRpbWVvdXQ6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLnN0ZXBUaW1lb3V0cyB8fCBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgTU9ERUxfSUQ6IGFkanVzdGVkTW9kZWxJZCxcbiAgICAgICAgUFJPTVBUOiBwcm9tcHQsXG4gICAgICAgIElOVk9LRV9UWVBFOiAncHJvY2Vzc2luZycsXG4gICAgICAgIC4uLlBvd2VydG9vbHNDb25maWcuZ2VuZXJhdGVEZWZhdWx0TGFtYmRhQ29uZmlnKFxuICAgICAgICAgIHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmVuYWJsZU9ic2VydmFiaWxpdHksXG4gICAgICAgICAgdGhpcy5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgICAgdGhpcy5tZXRyaWNTZXJ2aWNlTmFtZSxcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgICBlbnZpcm9ubWVudEVuY3J5cHRpb246IHRoaXMuZW5jcnlwdGlvbktleSxcbiAgICAgIHZwYzogdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yayA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsudnBjIDogdW5kZWZpbmVkLFxuICAgICAgdnBjU3VibmV0czogdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yayA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsuYXBwbGljYXRpb25TdWJuZXRTZWxlY3Rpb24oKSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnBvbGljeVN0YXRlbWVudHMpIHtcbiAgICAgIGJlZHJvY2tGdW5jdGlvbi5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrKSB7XG4gICAgICBiZWRyb2NrRnVuY3Rpb24ucm9sZT8uYWRkVG9QcmluY2lwYWxQb2xpY3koTGFtYmRhSWFtVXRpbHMuZ2VuZXJhdGVMYW1iZGFWUENQZXJtaXNzaW9ucygpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnUHJvY2Vzc2luZ1N0ZXAnLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogYmVkcm9ja0Z1bmN0aW9uLFxuICAgICAgcmVzdWx0UGF0aDogJyQucHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgICByZXN1bHRTZWxlY3Rvcjoge1xuICAgICAgICAnZG9jdW1lbnRDbGFzc2lmaWNhdGlvbi4kJzogJyQuUGF5bG9hZC5kb2N1bWVudENsYXNzaWZpY2F0aW9uJyxcbiAgICAgICAgJ3Jlc3VsdC4kJzogJyQuUGF5bG9hZC5yZXN1bHQnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZW5lcmF0ZUxhbWJkYVJvbGVGb3JCZWRyb2NrKGZtTW9kZWw6IEZvdW5kYXRpb25Nb2RlbElkZW50aWZpZXIsIGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7IHJlZ2lvbiwgYWNjb3VudCB9ID0gU3RhY2sub2YodGhpcyk7XG4gICAgcmV0dXJuIG5ldyBSb2xlKHRoaXMsIGlkLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpLFxuICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgQmVkcm9ja0ludm9rZVBvbGljeTogbmV3IFBvbGljeURvY3VtZW50KHtcbiAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICAuLi50aGlzLmluZ3Jlc3NBZGFwdGVyLmdlbmVyYXRlQWRhcHRlcklBTVBvbGljaWVzKCksXG4gICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAnYmVkcm9jazpJbnZva2VNb2RlbCcsXG4gICAgICAgICAgICAgICAgJ2JlZHJvY2s6SW52b2tlTW9kZWxXaXRoUmVzcG9uc2VTdHJlYW0nLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICAgICAgICBgYXJuOmF3czpiZWRyb2NrOio6OmZvdW5kYXRpb24tbW9kZWwvJHtmbU1vZGVsLm1vZGVsSWR9YCxcbiAgICAgICAgICAgICAgICBgYXJuOmF3czpiZWRyb2NrOiR7cmVnaW9ufToke2FjY291bnR9OmluZmVyZW5jZS1wcm9maWxlLyR7dGhpcy5jcm9zc1JlZ2lvbkluZmVyZW5jZVByZWZpeH0uJHtmbU1vZGVsLm1vZGVsSWR9YCxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIHRoZSBvcHRpb25hbCBkb2N1bWVudCBlbnJpY2htZW50IHN0ZXAuXG4gICAqXG4gICAqIElmIGFuIGVucmljaG1lbnQgTGFtYmRhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGluIHRoZSBwcm9wcywgY3JlYXRlcyBhIExhbWJkYUludm9rZVxuICAgKiB0YXNrIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBwcm9jZXNzaW5nIG9uIHRoZSBleHRyYWN0ZWQgZGF0YS4gVGhpcyBzdGVwIGlzIHVzZWZ1bFxuICAgKiBmb3IgZGF0YSB2YWxpZGF0aW9uLCB0cmFuc2Zvcm1hdGlvbiwgb3IgaW50ZWdyYXRpb24gd2l0aCBleHRlcm5hbCBzeXN0ZW1zLlxuICAgKlxuICAgKiBAcmV0dXJucyBMYW1iZGFJbnZva2UgdGFzayBmb3IgZW5yaWNobWVudCwgb3IgdW5kZWZpbmVkIHRvIHNraXAgdGhpcyBzdGVwXG4gICAqL1xuICBwcm90ZWN0ZWQgZW5yaWNobWVudFN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuZW5yaWNobWVudExhbWJkYUZ1bmN0aW9uKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdFbnJpY2htZW50U3RlcCcsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbnJpY2htZW50TGFtYmRhRnVuY3Rpb24sXG4gICAgICByZXN1bHRQYXRoOiAnJC5lbnJpY2hlZFJlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyB0aGUgb3B0aW9uYWwgcG9zdC1wcm9jZXNzaW5nIHN0ZXAuXG4gICAqXG4gICAqIElmIGEgcG9zdC1wcm9jZXNzaW5nIExhbWJkYSBmdW5jdGlvbiBpcyBwcm92aWRlZCBpbiB0aGUgcHJvcHMsIGNyZWF0ZXMgYSBMYW1iZGFJbnZva2VcbiAgICogdGFzayB0byBwZXJmb3JtIGZpbmFsIHByb2Nlc3Npbmcgb24gdGhlIHdvcmtmbG93IHJlc3VsdHMuIFRoaXMgc3RlcCBpcyB1c2VmdWwgZm9yXG4gICAqIGRhdGEgZm9ybWF0dGluZywgbm90aWZpY2F0aW9ucywgb3IgaW50ZWdyYXRpb24gd2l0aCBkb3duc3RyZWFtIHN5c3RlbXMuXG4gICAqXG4gICAqIEByZXR1cm5zIExhbWJkYUludm9rZSB0YXNrIGZvciBwb3N0LXByb2Nlc3NpbmcsIG9yIHVuZGVmaW5lZCB0byBza2lwIHRoaXMgc3RlcFxuICAgKi9cbiAgcHJvdGVjdGVkIHBvc3RQcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5wb3N0UHJvY2Vzc2luZ0xhbWJkYUZ1bmN0aW9uKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdQb3N0UHJvY2Vzc2luZ1N0ZXAnLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMucG9zdFByb2Nlc3NpbmdMYW1iZGFGdW5jdGlvbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLnBvc3RQcm9jZXNzZWRSZXN1bHQnLFxuICAgIH0pO1xuICB9XG59Il19
@@ -0,0 +1,3 @@
1
+ export declare class DefaultDocumentProcessingConfig {
2
+ static readonly DEFAULT_OBSERVABILITY_METRIC_SVC_NAME = "document-processing";
3
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.DefaultDocumentProcessingConfig = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
7
+ // SPDX-License-Identifier: Apache-2.0
8
+ class DefaultDocumentProcessingConfig {
9
+ }
10
+ exports.DefaultDocumentProcessingConfig = DefaultDocumentProcessingConfig;
11
+ _a = JSII_RTTI_SYMBOL_1;
12
+ DefaultDocumentProcessingConfig[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.DefaultDocumentProcessingConfig", version: "1.2.0" };
13
+ DefaultDocumentProcessingConfig.DEFAULT_OBSERVABILITY_METRIC_SVC_NAME = 'document-processing';
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1kb2N1bWVudC1wcm9jZXNzaW5nLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3VzZS1jYXNlcy9kb2N1bWVudC1wcm9jZXNzaW5nL2RlZmF1bHQtZG9jdW1lbnQtcHJvY2Vzc2luZy1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxRUFBcUU7QUFDckUsc0NBQXNDO0FBRXRDLE1BQWEsK0JBQStCOztBQUE1QywwRUFFQzs7O0FBRHdCLHFFQUFxQyxHQUFHLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdERvY3VtZW50UHJvY2Vzc2luZ0NvbmZpZyB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9PQlNFUlZBQklMSVRZX01FVFJJQ19TVkNfTkFNRSA9ICdkb2N1bWVudC1wcm9jZXNzaW5nJztcbn0iXX0=
@@ -1,3 +1,5 @@
1
1
  export * from './base-document-processing';
2
2
  export * from './bedrock-document-processing';
3
3
  export * from './agentic-document-processing';
4
+ export * from './adapter';
5
+ export * from './default-document-processing-config';
@@ -17,4 +17,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./base-document-processing"), exports);
18
18
  __exportStar(require("./bedrock-document-processing"), exports);
19
19
  __exportStar(require("./agentic-document-processing"), exports);
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi91c2UtY2FzZXMvZG9jdW1lbnQtcHJvY2Vzc2luZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkRBQTJDO0FBQzNDLGdFQUE4QztBQUM5QyxnRUFBOEMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Jhc2UtZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5leHBvcnQgKiBmcm9tICcuL2JlZHJvY2stZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5leHBvcnQgKiBmcm9tICcuL2FnZW50aWMtZG9jdW1lbnQtcHJvY2Vzc2luZyc7Il19
20
+ __exportStar(require("./adapter"), exports);
21
+ __exportStar(require("./default-document-processing-config"), exports);
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi91c2UtY2FzZXMvZG9jdW1lbnQtcHJvY2Vzc2luZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkRBQTJDO0FBQzNDLGdFQUE4QztBQUM5QyxnRUFBOEM7QUFDOUMsNENBQTBCO0FBQzFCLHVFQUFxRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vYWRhcHRlcic7XG5leHBvcnQgKiBmcm9tICcuL2RlZmF1bHQtZG9jdW1lbnQtcHJvY2Vzc2luZy1jb25maWcnOyJdfQ==
@@ -13,28 +13,11 @@ tracer = Tracer()
13
13
  @metrics.log_metrics
14
14
  @tracer.capture_lambda_handler
15
15
  def handler(event, context):
16
- bucket = event['bucket']
17
- key = event['key']
18
16
  invoke_type = os.environ["INVOKE_TYPE"]
19
17
  tracer.put_annotation(key="invoke_type", value=invoke_type)
20
18
  tracer.put_annotation(key="documentId", value=event["documentId"])
21
19
  metrics.add_dimension(name="invoke_type", value=invoke_type)
22
-
23
- # Check file type
24
- ext = key.lower().split('.')[-1]
25
- if ext not in ['jpg', 'jpeg', 'png', 'pdf']:
26
- raise ValueError(f"Unsupported file type: {ext}")
27
-
28
- media_type = {'jpg': 'image/jpeg', 'jpeg': 'image/jpeg', 'png': 'image/png', 'pdf': 'application/pdf'}[ext]
29
-
30
- # Download file to /tmp
31
- local_path = f"/tmp/{key.split('/')[-1]}"
32
- s3.download_file(bucket, key, local_path)
33
-
34
- # Read and encode file
35
- with open(local_path, 'rb') as f:
36
- file_data = base64.b64encode(f.read()).decode('utf-8')
37
-
20
+ content_type = event["contentType"]
38
21
  # Format prompt if classification result exists
39
22
  prompt = os.environ['PROMPT']
40
23
  if 'classificationResult' in event:
@@ -43,21 +26,50 @@ def handler(event, context):
43
26
 
44
27
  # Build content based on file type
45
28
  content = [{'type': 'text', 'text': prompt}]
46
- if ext == 'pdf':
47
- content.append({'type': 'document', 'source': {'type': 'base64', 'media_type': media_type, 'data': file_data}})
48
- else:
49
- content.append({'type': 'image', 'source': {'type': 'base64', 'media_type': media_type, 'data': file_data}})
29
+ if content_type == 'file':
30
+ content_location = event['content']['location']
31
+
32
+ if content_location == 's3':
33
+ bucket = event['content']['bucket']
34
+ key = event['content']['key']
35
+
36
+ # Check file type
37
+ ext = key.lower().split('.')[-1]
38
+ if ext not in ['jpg', 'jpeg', 'png', 'pdf']:
39
+ raise ValueError(f"Unsupported file type: {ext}")
40
+
41
+ media_type = {'jpg': 'image/jpeg', 'jpeg': 'image/jpeg', 'png': 'image/png', 'pdf': 'application/pdf'}[ext]
42
+
43
+ # Download file to /tmp
44
+ local_path = f"/tmp/{key.split('/')[-1]}"
45
+ s3.download_file(bucket, key, local_path)
46
+
47
+ # Read and encode file
48
+ with open(local_path, 'rb') as f:
49
+ file_data = base64.b64encode(f.read()).decode('utf-8')
50
+
51
+
52
+ if ext == 'pdf':
53
+ content.append({'type': 'document', 'source': {'type': 'base64', 'media_type': media_type, 'data': file_data}})
54
+ else:
55
+ content.append({'type': 'image', 'source': {'type': 'base64', 'media_type': media_type, 'data': file_data}})
50
56
 
57
+ elif content_type == 'data':
58
+ content.append({
59
+ 'type': 'text',
60
+ 'text': event['content']['data']
61
+ })
62
+
51
63
  # Invoke Bedrock
52
64
  response = bedrock.invoke_model(
53
65
  modelId=os.environ['MODEL_ID'],
54
66
  body=json.dumps({
55
67
  'anthropic_version': 'bedrock-2023-05-31',
56
- 'max_tokens': 1000,
68
+ 'max_tokens': os.getenv('INVOKE_MAX_TOKENS', 1000),
57
69
  'messages': [{'role': 'user', 'content': content}]
58
70
  })
59
71
  )
60
-
72
+
61
73
  response_payload = response['body'].read()
62
74
  metrics.add_metric(name="SuccessfulInvocation", unit=MetricUnit.Count, value=1)
63
75
  return json.loads(json.loads(response_payload)["content"][0]["text"])
@@ -19,6 +19,7 @@ def handler(event, context):
19
19
  print(f'SQS Consumer: Received event: {json.dumps(event, indent=2)}')
20
20
 
21
21
  results = []
22
+ raw_prefix = os.getenv('RAW_PREFIX', 'raw/')
22
23
 
23
24
  for record in event['Records']:
24
25
  try:
@@ -53,20 +54,24 @@ def handler(event, context):
53
54
  # Generate unique document ID from S3 key and timestamp
54
55
  timestamp = int(time.time() * 1000)
55
56
  document_id = (key
56
- .replace('raw/', '', 1) # Remove raw/ prefix
57
+ .replace(raw_prefix, '', 1) # Remove raw/ prefix
57
58
  .rsplit('.', 1)[0] # Remove file extension
58
59
  )
59
60
  document_id = re.sub(r'[^a-zA-Z0-9-]', '-', document_id) + '-' + str(timestamp)
60
61
 
61
62
  # Extract filename from key
62
- filename = key.replace('raw/', '', 1) # Remove raw/ prefix
63
+ filename = key.replace(raw_prefix, '', 1) # Remove raw/ prefix
63
64
 
64
65
  # Prepare Step Functions execution input
65
66
  step_function_input = {
66
67
  'documentId': document_id,
67
- 'bucket': bucket,
68
- 'key': key,
69
- 'filename': filename,
68
+ 'contentType': 'file',
69
+ 'content': {
70
+ 'location': 's3',
71
+ 'bucket': bucket,
72
+ 'key': key,
73
+ 'filename': filename
74
+ },
70
75
  'eventTime': event_time,
71
76
  'eventName': event_name,
72
77
  'source': 'sqs-consumer'
@@ -66,8 +66,8 @@ def parse_s3_path(s3_path):
66
66
 
67
67
  @tracer.capture_method
68
68
  def download_attached_document(event):
69
- bucket = event['bucket']
70
- key = event['key']
69
+ bucket = event['content']['bucket']
70
+ key = event['content']['key']
71
71
 
72
72
  # Download file to /tmp
73
73
  local_path = f"/tmp/{key.split('/')[-1]}"
@@ -84,6 +84,7 @@ def handler(event, context):
84
84
  prompt = os.getenv("PROMPT")
85
85
  system_prompt = os.getenv("SYSTEM_PROMPT")
86
86
  invoke_type = os.environ["INVOKE_TYPE"]
87
+ content_type = event['contentType']
87
88
 
88
89
  tracer.put_annotation(key="invoke_type", value=invoke_type)
89
90
  metrics.add_dimension(name="invoke_type", value=invoke_type)
@@ -93,14 +94,16 @@ def handler(event, context):
93
94
 
94
95
  if system_prompt is None:
95
96
  system_prompt = "You're a document analysis specialist. You specialized in analyzing provided documents using the tools that have been provided."
96
-
97
- local_path_attached_doc = download_attached_document(event)
98
97
 
99
98
  if 'classificationResult' in event:
100
99
  classification = event['classificationResult']['documentClassification']
101
100
  prompt = prompt.replace("[ACTUAL_CLASSIFICATION]", classification)
102
101
 
103
- prompt += f" Attached document is located in {local_path_attached_doc}"
102
+ if content_type == 'file' and event['content']['location'] == 's3':
103
+ local_path_attached_doc = download_attached_document(event)
104
+ prompt += f" Attached document is located in {local_path_attached_doc}"
105
+ elif content_type == 'data':
106
+ prompt += f" Attached document content are as follows: {event['content']['data']}"
104
107
 
105
108
  agent = Agent(model=model_id, tools=agent_tools + [file_read], system_prompt=system_prompt)
106
109
  response = agent(prompt)
@@ -5,6 +5,7 @@ const assertions_1 = require("aws-cdk-lib/assertions");
5
5
  const aws_s3_1 = require("aws-cdk-lib/aws-s3");
6
6
  const cdk_nag_1 = require("cdk-nag");
7
7
  const framework_1 = require("../../framework");
8
+ const adapter_1 = require("../adapter");
8
9
  const agentic_document_processing_1 = require("../agentic-document-processing");
9
10
  // Create app and stack
10
11
  const app = new aws_cdk_lib_1.App();
@@ -21,9 +22,12 @@ const bucket = new aws_s3_1.Bucket(stack, 'AgenticDocumentProcessingBucket', {
21
22
  serverAccessLogsPrefix: accessLog.bucketPrefix,
22
23
  enforceSSL: true,
23
24
  });
25
+ const adapter = new adapter_1.QueuedS3Adapter({
26
+ bucket,
27
+ });
24
28
  // Create the main AgenticDocumentProcessing construct
25
29
  new agentic_document_processing_1.AgenticDocumentProcessing(stack, 'AgenticDocumentProcessing', {
26
- bucket,
30
+ ingressAdapter: adapter,
27
31
  useCrossRegionInference: true,
28
32
  processingAgentParameters: {
29
33
  agentSystemPrompt: `
@@ -104,4 +108,4 @@ test('No unsuppressed errors', () => {
104
108
  }
105
109
  expect(errors).toHaveLength(0);
106
110
  });
107
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvdGVzdHMvYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQWtEO0FBQ2xELHVEQUE0RDtBQUM1RCwrQ0FBNEM7QUFDNUMscUNBQThEO0FBQzlELCtDQUE0QztBQUM1QyxnRkFBMkU7QUFFM0UsdUJBQXVCO0FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksaUJBQUcsRUFBRSxDQUFDO0FBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUksbUJBQUssQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFO0lBQ3hDLEdBQUcsRUFBRTtRQUNILE9BQU8sRUFBRSxjQUFjO1FBQ3ZCLE1BQU0sRUFBRSxXQUFXO0tBQ3BCO0NBQ0YsQ0FBQyxDQUFDO0FBRUgsTUFBTSxTQUFTLEdBQUcsSUFBSSxxQkFBUyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztBQUVwRCxxQ0FBcUM7QUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsS0FBSyxFQUFFLGlDQUFpQyxFQUFFO0lBQ2xFLHNCQUFzQixFQUFFLFNBQVMsQ0FBQyxNQUFNO0lBQ3hDLHNCQUFzQixFQUFFLFNBQVMsQ0FBQyxZQUFZO0lBQzlDLFVBQVUsRUFBRSxJQUFJO0NBQ2pCLENBQUMsQ0FBQztBQUVILHNEQUFzRDtBQUN0RCxJQUFJLHVEQUF5QixDQUFDLEtBQUssRUFBRSwyQkFBMkIsRUFBRTtJQUNoRSxNQUFNO0lBQ04sdUJBQXVCLEVBQUUsSUFBSTtJQUM3Qix5QkFBeUIsRUFBRTtRQUN6QixpQkFBaUIsRUFBRTs7S0FFbEI7UUFDRCxhQUFhLEVBQUU7WUFDYixRQUFRLE1BQU0sQ0FBQyxVQUFVLG1DQUFtQztZQUM1RCxRQUFRLE1BQU0s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QVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHAsIFN0YWNrLCBBc3BlY3RzIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQW5ub3RhdGlvbnMsIE1hdGNoIH0gZnJvbSAnYXdzLWNkay1saWIvYXNzZXJ0aW9ucyc7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgQXdzU29sdXRpb25zQ2hlY2tzLCBOYWdTdXBwcmVzc2lvbnMgfSBmcm9tICdjZGstbmFnJztcbmltcG9ydCB7IEFjY2Vzc0xvZyB9IGZyb20gJy4uLy4uL2ZyYW1ld29yayc7XG5pbXBvcnQgeyBBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nIH0gZnJvbSAnLi4vYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nJztcblxuLy8gQ3JlYXRlIGFwcCBhbmQgc3RhY2tcbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbmNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ1Rlc3RTdGFjaycsIHtcbiAgZW52OiB7XG4gICAgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsXG4gICAgcmVnaW9uOiAndXMtZWFzdC0xJyxcbiAgfSxcbn0pO1xuXG5jb25zdCBhY2Nlc3NMb2cgPSBuZXcgQWNjZXNzTG9nKHN0YWNrLCAnQWNjZXNzTG9nJyk7XG5cbi8vIENyZWF0ZSBTMyBidWNrZXQgZm9yIGFnZW50aWMgdG9vbHNcbmNvbnN0IGJ1Y2tldCA9IG5ldyBCdWNrZXQoc3RhY2ssICdBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nQnVja2V0Jywge1xuICBzZXJ2ZXJBY2Nlc3NMb2dzQnVja2V0OiBhY2Nlc3NMb2cuYnVja2V0LFxuICBzZXJ2ZXJBY2Nlc3NMb2dzUHJlZml4OiBhY2Nlc3NMb2cuYnVja2V0UHJlZml4LFxuICBlbmZvcmNlU1NMOiB0cnVlLFxufSk7XG5cbi8vIENyZWF0ZSB0aGUgbWFpbiBBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nIGNvbnN0cnVjdFxubmV3IEFnZW50aWNEb2N1bWVudFByb2Nlc3Npbmcoc3RhY2ssICdBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nJywge1xuICBidWNrZXQsXG4gIHVzZUNyb3NzUmVnaW9uSW5mZXJlbmNlOiB0cnVlLFxuICBwcm9jZXNzaW5nQWdlbnRQYXJhbWV0ZXJzOiB7XG4gICAgYWdlbnRTeXN0ZW1Qcm9tcHQ6IGBcbiAgICAgIFlvdSdyZSBhbiBpbnN1cmFuY2UgY2xhaW1zIHNwZWNpYWxpc3QuIFVzZSB0aGUgcHJvdmlkZWQgdG9vbHMgdG8gZW5zdXJlIHRoYXQgdGhlIHN1Ym1pdHRlZCBjbGFpbXMgYW5kIHN1cHBvcnRpbmcgZG9jdW1lbnRzIGFyZSB2YWxpZCBhbmQgdGhlcmUgYXJlIG5vIGRpc2NyZXBhbmNpZXMuXG4gICAgYCxcbiAgICB0b29sc0xvY2F0aW9uOiBbXG4gICAgICBgczM6Ly8ke2J1Y2tldC5idWNrZXROYW1lfS9hZ2VudGljLXRvb2xzL2Rvd25sb2FkX3BvbGljeS5weWAsXG4gICAgICBgczM6Ly8ke2J1Y2tldC5idWNrZXROYW1lfS9hZ2VudGljLXRvb2xzL2Rvd25sb2FkX3N1cHBvcnRpbmdfZG9jdW1lbnRzLnB5YCxcbiAgICBdLFxuICB9LFxuICBwcm9jZXNzaW5nUHJvbXB0OiBgXG4gICAgQW5hbHl6ZSB0aGUgYXR0YWNoZWQgaW5zdXJhbmNlIGNsYWltIGRvY3VtZW50IGFuZCBjaGVjayBpZiB0aGlzIGlzIGEgdmFsaWQgY2xhaW0gb3Igbm90LlxuICAgIEZpbmFsIG91dHB1dCBzaG91bGQgaW4gSlNPTiBmb3JtYXQgd2l0aCBjbGFpbV9hcHByb3ZlZCBhbmQganVzdGlmaWNhdGlvbiBmaWVsZHMuXG4gIGAsXG4gIGVuYWJsZU9ic2VydmFiaWxpdHk6IHRydWUsXG59KTtcblxuLy8gU3VwcHJlc3MgQ0RLLW1hbmFnZWQgQnVja2V0Tm90aWZpY2F0aW9uc0hhbmRsZXIgQVdTIG1hbmFnZWQgcG9saWN5XG5OYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnNCeVBhdGgoXG4gIHN0YWNrLFxuICAnL1Rlc3RTdGFjay9CdWNrZXROb3RpZmljYXRpb25zSGFuZGxlcjA1MGEwNTg3Yjc1NDQ1NDdiZjMyNWYwOTRhM2RiODM0L1JvbGUnLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNCcsXG4gICAgICByZWFzb246ICdDREstbWFuYWdlZCBCdWNrZXROb3RpZmljYXRpb25zSGFuZGxlciByZXF1aXJlcyBBV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUgZm9yIFMzIGV2ZW50IHByb2Nlc3NpbmcnLFxuICAgICAgYXBwbGllc1RvOiBbJ1BvbGljeTo6YXJuOjxBV1M6OlBhcnRpdGlvbj46aWFtOjphd3M6cG9saWN5L3NlcnZpY2Utcm9sZS9BV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUnXSxcbiAgICB9LFxuICBdLFxuKTtcblxuLy8gU3VwcHJlc3MgUzMgYnVja2V0IHdpbGRjYXJkIHBlcm1pc3Npb25zIGZvciBMYW1iZGEgcm9sZXNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0xhbWJkYSBmdW5jdGlvbnMgcmVxdWlyZSB3aWxkY2FyZCBhY2Nlc3MgdG8gUzMgYnVja2V0IG9iamVjdHMgZm9yIGRvY3VtZW50IHByb2Nlc3NpbmcnLFxuICAgICAgYXBwbGllc1RvOiBbJ1Jlc291cmNlOjo8QWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZ0J1Y2tldEM0RTI1NEVDLkFybj4vKiddLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBCZWRyb2NrIGZvdW5kYXRpb24gbW9kZWwgd2lsZGNhcmQgcGVybWlzc2lvbnNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0Nyb3NzLXJlZ2lvbiBpbmZlcmVuY2UgcmVxdWlyZXMgd2lsZGNhcmQgcmVnaW9uIGFjY2VzcyB0byBCZWRyb2NrIGZvdW5kYXRpb24gbW9kZWxzJyxcbiAgICAgIGFwcGxpZXNUbzogWydSZXNvdXJjZTo6YXJuOmF3czpiZWRyb2NrOio6OmZvdW5kYXRpb24tbW9kZWwvYW50aHJvcGljLmNsYXVkZS0zLTctc29ubmV0LTIwMjUwMjE5LXYxOjAnXSxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gU3VwcHJlc3MgU1FTQ29uc3VtZXJSb2xlIHdpbGRjYXJkIHBlcm1pc3Npb25zIGZvciBMYW1iZGEgbG9nIHN0cmVhbXNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0xhbWJkYSBsb2cgc3RyZWFtIEFSTiBpcyBvbmx5IGtub3duIGF0IHJ1bnRpbWUsIHdpbGRjYXJkIHJlcXVpcmVkIGZvciBDbG91ZFdhdGNoIExvZ3MgYWNjZXNzJyxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gU3VwcHJlc3MgU3RhdGVNYWNoaW5lUm9sZSB3aWxkY2FyZCBwZXJtaXNzaW9ucyBmb3IgTGFtYmRhIGludm9jYXRpb25cbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9uc0J5UGF0aChcbiAgc3RhY2ssXG4gICcvVGVzdFN0YWNrL0FnZW50aWNEb2N1bWVudFByb2Nlc3NpbmcvU3RhdGVNYWNoaW5lUm9sZS9EZWZhdWx0UG9saWN5JyxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgcmVhc29uOiAnU3RlcCBGdW5jdGlvbnMgcmVxdWlyZXMgd2lsZGNhcmQgcGVybWlzc2lvbnMgdG8gaW52b2tlIExhbWJkYSBmdW5jdGlvbnMgd2l0aCB2ZXJzaW9uLXNwZWNpZmljIEFSTnMnLFxuICAgIH0sXG4gIF0sXG4pO1xuXG4vLyBTdXBwcmVzcyBMYW1iZGEgbG9nIGdyb3VwIHdpbGRjYXJkIHBlcm1pc3Npb25zXG5OYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gIHN0YWNrLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICByZWFzb246ICdMYW1iZGEgbG9nIHN0cmVhbSBuYW1lcyBhcmUgZ2VuZXJhdGVkIGF0IHJ1bnRpbWUsIHdpbGRjYXJkIHJlcXVpcmVkIGZvciBDbG91ZFdhdGNoIExvZ3MgYWNjZXNzJyxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuXG4vLyBBcHBseSBDREsgTmFnIGNoZWNrc1xuQXNwZWN0cy5vZihhcHApLmFkZChuZXcgQXdzU29sdXRpb25zQ2hlY2tzKHsgdmVyYm9zZTogdHJ1ZSB9KSk7XG5cbi8vIFN5bnRoZXNpemUgdGhlIHN0YWNrIGFuZCBjaGVjayBmb3IgdW5zdXBwcmVzc2VkIHdhcm5pbmdzIGFuZCBlcnJvcnNcbmNvbnN0IHdhcm5pbmdzID0gQW5ub3RhdGlvbnMuZnJvbVN0YWNrKHN0YWNrKS5maW5kV2FybmluZygnKicsIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ0F3c1NvbHV0aW9ucy0uKicpKTtcbmNvbnN0IGVycm9ycyA9IEFubm90YXRpb25zLmZyb21TdGFjayhzdGFjaykuZmluZEVycm9yKCcqJywgTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cCgnQXdzU29sdXRpb25zLS4qJykpO1xuXG4vLyBUZXN0OiBObyB1bnN1cHByZXNzZWQgd2FybmluZ3NcbnRlc3QoJ05vIHVuc3VwcHJlc3NlZCB3YXJuaW5ncycsICgpID0+IHtcbiAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZygnQ0RLIE5hZyBXYXJuaW5nczonLCBKU09OLnN0cmluZ2lmeSh3YXJuaW5ncywgbnVsbCwgMikpO1xuICB9XG4gIGV4cGVjdCh3YXJuaW5ncykudG9IYXZlTGVuZ3RoKDApO1xufSk7XG5cbi8vIFRlc3Q6IE5vIHVuc3VwcHJlc3NlZCBlcnJvcnNcbnRlc3QoJ05vIHVuc3VwcHJlc3NlZCBlcnJvcnMnLCAoKSA9PiB7XG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKCdDREsgTmFnIEVycm9yczonLCBKU09OLnN0cmluZ2lmeShlcnJvcnMsIG51bGwsIDIpKTtcbiAgfVxuICBleHBlY3QoZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG59KTtcbiJdfQ==
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvdGVzdHMvYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQWtEO0FBQ2xELHVEQUE0RDtBQUM1RCwrQ0FBNEM7QUFDNUMscUNBQThEO0FBQzlELCtDQUE0QztBQUM1Qyx3Q0FBNkM7QUFDN0MsZ0ZBQTJFO0FBRTNFLHVCQUF1QjtBQUN2QixNQUFNLEdBQUcsR0FBRyxJQUFJLGlCQUFHLEVBQUUsQ0FBQztBQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsR0FBRyxFQUFFLFdBQVcsRUFBRTtJQUN4QyxHQUFHLEVBQUU7UUFDSCxPQUFPLEVBQUUsY0FBYztRQUN2QixNQUFNLEVBQUUsV0FBVztLQUNwQjtDQUNGLENBQUMsQ0FBQztBQUVILE1BQU0sU0FBUyxHQUFHLElBQUkscUJBQVMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFFcEQscUNBQXFDO0FBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLEtBQUssRUFBRSxpQ0FBaUMsRUFBRTtJQUNsRSxzQkFBc0IsRUFBRSxTQUFTLENBQUMsTUFBTTtJQUN4QyxzQkFBc0IsRUFBRSxTQUFTLENBQUMsWUFBWTtJQUM5QyxVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDLENBQUM7QUFFSCxNQUFNLE9BQU8sR0FBRyxJQUFJLHlCQUFlLENBQUM7SUFDbEMsTUFBTTtDQUNQLENBQUMsQ0FBQztBQUVILHNEQUFzRDtBQUN0RCxJQUFJLHVEQUF5QixDQUFDLEtBQUssRUFBRSwyQkFBMkIsRUFBRTtJQUNoRSxjQUFjLEVBQUUsT0FBTztJQUN2Qix1QkFBdUIsRUFBRSxJQUFJO0lBQzdCLHlCQUF5QixFQUFFO1FBQ3pCLGlCQUFpQixFQUFFOztLQUVsQjtRQUNELGFBQWEsRUFBRTtZQUNiLFFBQVEsTUFBTSxDQUFDLFVBQVUsbUNBQW1DO1lBQzVELFFBQVEsTUFBTSxDQUFDLFVBQVUsaURBQWlEO1NBQzNFO0tBQ0Y7SUFDRCxnQkFBZ0IsRUFBRTs7O0dBR2pCO0lBQ0QsbUJBQW1CLEVBQUUsSUFBSTtDQUMxQixDQUFDLENBQUM7QUFFSCxxRUFBcUU7QUFDckUseUJBQWUsQ0FBQyw2QkFBNkIsQ0FDM0MsS0FBSyxFQUNMLDRFQUE0RSxFQUM1RTtJQUNFO1FBQ0UsRUFBRSxFQUFFLG1CQUFtQjtRQUN2QixNQUFNLEVBQUUscUdBQXFHO1FBQzdHLFNBQVMsRUFBRSxDQUFDLHVGQUF1RixDQUFDO0tBQ3JHO0NBQ0YsQ0FDRixDQUFDO0FBRUYsMkRBQTJEO0FBQzNELHlCQUFlLENBQUMsdUJBQXVCLENBQ3JDLEtBQUssRUFDTDtJQUNFO1FBQ0UsRUFBRSxFQUFFLG1CQUFtQjtRQUN2QixNQUFNLEVBQUUsdUZBQXVGO1FBQy9GLFNBQVMsRUFBRSxDQUFDLDJEQUEyRCxDQUFDO0tBQ3pFO0NBQ0YsRUFDRCxJQUFJLENBQ0wsQ0FBQztBQUVGLHlEQUF5RDtBQUN6RCx5QkFBZSxDQUFDLHVCQUF1QixDQUNyQyxLQUFLLEVBQ0w7SUFDRTtRQUNFLEVBQUUsRUFBRSxtQkFBbUI7UUFDdkIsTUFBTSxFQUFFLHFGQUFxRjtRQUM3RixTQUFTLEVBQUUsQ0FBQyx5RkFBeUYsQ0FBQztLQUN2RztDQUNGLEVBQ0QsSUFBSSxDQUNMLENBQUM7QUFFRix1RUFBdUU7QUFDdkUseUJBQWUsQ0FBQyx1QkFBdUIsQ0FDckMsS0FBSyxFQUNMO0lBQ0U7UUFDRSxFQUFFLEVBQUUsbUJBQW1CO1FBQ3ZCLE1BQU0sRUFBRSw4RkFBOEY7S0FDdkc7Q0FDRixFQUNELElBQUksQ0FDTCxDQUFDO0FBRUYsdUVBQXVFO0FBQ3ZFLHlCQUFlLENBQUMsNkJBQTZCLENBQzNDLEtBQUssRUFDTCxxRUFBcUUsRUFDckU7SUFDRTtRQUNFLEVBQUUsRUFBRSxtQkFBbUI7UUFDdkIsTUFBTSxFQUFFLG9HQUFvRztLQUM3RztDQUNGLENBQ0YsQ0FBQztBQUVGLGlEQUFpRDtBQUNqRCx5QkFBZSxDQUFDLHVCQUF1QixDQUNyQyxLQUFLLEVBQ0w7SUFDRTtRQUNFLEVBQUUsRUFBRSxtQkFBbUI7UUFDdkIsTUFBTSxFQUFFLGdHQUFnRztLQUN6RztDQUNGLEVBQ0QsSUFBSSxDQUNMLENBQUM7QUFHRix1QkFBdUI7QUFDdkIscUJBQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksNEJBQWtCLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRS9ELHNFQUFzRTtBQUN0RSxNQUFNLFFBQVEsR0FBRyx3QkFBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLGtCQUFLLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0FBQzFHLE1BQU0sTUFBTSxHQUFHLHdCQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsa0JBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7QUFFdEcsaUNBQWlDO0FBQ2pDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7SUFDcEMsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNELE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQyxDQUFDLENBQUM7QUFFSCwrQkFBK0I7QUFDL0IsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEdBQUcsRUFBRTtJQUNsQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcCwgU3RhY2ssIEFzcGVjdHMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBBbm5vdGF0aW9ucywgTWF0Y2ggfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCB7IEJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBBd3NTb2x1dGlvbnNDaGVja3MsIE5hZ1N1cHByZXNzaW9ucyB9IGZyb20gJ2Nkay1uYWcnO1xuaW1wb3J0IHsgQWNjZXNzTG9nIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrJztcbmltcG9ydCB7IFF1ZXVlZFMzQWRhcHRlciB9IGZyb20gJy4uL2FkYXB0ZXInO1xuaW1wb3J0IHsgQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZyB9IGZyb20gJy4uL2FnZW50aWMtZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5cbi8vIENyZWF0ZSBhcHAgYW5kIHN0YWNrXG5jb25zdCBhcHAgPSBuZXcgQXBwKCk7XG5jb25zdCBzdGFjayA9IG5ldyBTdGFjayhhcHAsICdUZXN0U3RhY2snLCB7XG4gIGVudjoge1xuICAgIGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLFxuICAgIHJlZ2lvbjogJ3VzLWVhc3QtMScsXG4gIH0sXG59KTtcblxuY29uc3QgYWNjZXNzTG9nID0gbmV3IEFjY2Vzc0xvZyhzdGFjaywgJ0FjY2Vzc0xvZycpO1xuXG4vLyBDcmVhdGUgUzMgYnVja2V0IGZvciBhZ2VudGljIHRvb2xzXG5jb25zdCBidWNrZXQgPSBuZXcgQnVja2V0KHN0YWNrLCAnQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZ0J1Y2tldCcsIHtcbiAgc2VydmVyQWNjZXNzTG9nc0J1Y2tldDogYWNjZXNzTG9nLmJ1Y2tldCxcbiAgc2VydmVyQWNjZXNzTG9nc1ByZWZpeDogYWNjZXNzTG9nLmJ1Y2tldFByZWZpeCxcbiAgZW5mb3JjZVNTTDogdHJ1ZSxcbn0pO1xuXG5jb25zdCBhZGFwdGVyID0gbmV3IFF1ZXVlZFMzQWRhcHRlcih7XG4gIGJ1Y2tldCxcbn0pO1xuXG4vLyBDcmVhdGUgdGhlIG1haW4gQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZyBjb25zdHJ1Y3Rcbm5ldyBBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nKHN0YWNrLCAnQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZycsIHtcbiAgaW5ncmVzc0FkYXB0ZXI6IGFkYXB0ZXIsXG4gIHVzZUNyb3NzUmVnaW9uSW5mZXJlbmNlOiB0cnVlLFxuICBwcm9jZXNzaW5nQWdlbnRQYXJhbWV0ZXJzOiB7XG4gICAgYWdlbnRTeXN0ZW1Qcm9tcHQ6IGBcbiAgICAgIFlvdSdyZSBhbiBpbnN1cmFuY2UgY2xhaW1zIHNwZWNpYWxpc3QuIFVzZSB0aGUgcHJvdmlkZWQgdG9vbHMgdG8gZW5zdXJlIHRoYXQgdGhlIHN1Ym1pdHRlZCBjbGFpbXMgYW5kIHN1cHBvcnRpbmcgZG9jdW1lbnRzIGFyZSB2YWxpZCBhbmQgdGhlcmUgYXJlIG5vIGRpc2NyZXBhbmNpZXMuXG4gICAgYCxcbiAgICB0b29sc0xvY2F0aW9uOiBbXG4gICAgICBgczM6Ly8ke2J1Y2tldC5idWNrZXROYW1lfS9hZ2VudGljLXRvb2xzL2Rvd25sb2FkX3BvbGljeS5weWAsXG4gICAgICBgczM6Ly8ke2J1Y2tldC5idWNrZXROYW1lfS9hZ2VudGljLXRvb2xzL2Rvd25sb2FkX3N1cHBvcnRpbmdfZG9jdW1lbnRzLnB5YCxcbiAgICBdLFxuICB9LFxuICBwcm9jZXNzaW5nUHJvbXB0OiBgXG4gICAgQW5hbHl6ZSB0aGUgYXR0YWNoZWQgaW5zdXJhbmNlIGNsYWltIGRvY3VtZW50IGFuZCBjaGVjayBpZiB0aGlzIGlzIGEgdmFsaWQgY2xhaW0gb3Igbm90LlxuICAgIEZpbmFsIG91dHB1dCBzaG91bGQgaW4gSlNPTiBmb3JtYXQgd2l0aCBjbGFpbV9hcHByb3ZlZCBhbmQganVzdGlmaWNhdGlvbiBmaWVsZHMuXG4gIGAsXG4gIGVuYWJsZU9ic2VydmFiaWxpdHk6IHRydWUsXG59KTtcblxuLy8gU3VwcHJlc3MgQ0RLLW1hbmFnZWQgQnVja2V0Tm90aWZpY2F0aW9uc0hhbmRsZXIgQVdTIG1hbmFnZWQgcG9saWN5XG5OYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnNCeVBhdGgoXG4gIHN0YWNrLFxuICAnL1Rlc3RTdGFjay9CdWNrZXROb3RpZmljYXRpb25zSGFuZGxlcjA1MGEwNTg3Yjc1NDQ1NDdiZjMyNWYwOTRhM2RiODM0L1JvbGUnLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNCcsXG4gICAgICByZWFzb246ICdDREstbWFuYWdlZCBCdWNrZXROb3RpZmljYXRpb25zSGFuZGxlciByZXF1aXJlcyBBV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUgZm9yIFMzIGV2ZW50IHByb2Nlc3NpbmcnLFxuICAgICAgYXBwbGllc1RvOiBbJ1BvbGljeTo6YXJuOjxBV1M6OlBhcnRpdGlvbj46aWFtOjphd3M6cG9saWN5L3NlcnZpY2Utcm9sZS9BV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUnXSxcbiAgICB9LFxuICBdLFxuKTtcblxuLy8gU3VwcHJlc3MgUzMgYnVja2V0IHdpbGRjYXJkIHBlcm1pc3Npb25zIGZvciBMYW1iZGEgcm9sZXNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0xhbWJkYSBmdW5jdGlvbnMgcmVxdWlyZSB3aWxkY2FyZCBhY2Nlc3MgdG8gUzMgYnVja2V0IG9iamVjdHMgZm9yIGRvY3VtZW50IHByb2Nlc3NpbmcnLFxuICAgICAgYXBwbGllc1RvOiBbJ1Jlc291cmNlOjo8QWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZ0J1Y2tldEM0RTI1NEVDLkFybj4vKiddLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBCZWRyb2NrIGZvdW5kYXRpb24gbW9kZWwgd2lsZGNhcmQgcGVybWlzc2lvbnNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0Nyb3NzLXJlZ2lvbiBpbmZlcmVuY2UgcmVxdWlyZXMgd2lsZGNhcmQgcmVnaW9uIGFjY2VzcyB0byBCZWRyb2NrIGZvdW5kYXRpb24gbW9kZWxzJyxcbiAgICAgIGFwcGxpZXNUbzogWydSZXNvdXJjZTo6YXJuOmF3czpiZWRyb2NrOio6OmZvdW5kYXRpb24tbW9kZWwvYW50aHJvcGljLmNsYXVkZS0zLTctc29ubmV0LTIwMjUwMjE5LXYxOjAnXSxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gU3VwcHJlc3MgU1FTQ29uc3VtZXJSb2xlIHdpbGRjYXJkIHBlcm1pc3Npb25zIGZvciBMYW1iZGEgbG9nIHN0cmVhbXNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0xhbWJkYSBsb2cgc3RyZWFtIEFSTiBpcyBvbmx5IGtub3duIGF0IHJ1bnRpbWUsIHdpbGRjYXJkIHJlcXVpcmVkIGZvciBDbG91ZFdhdGNoIExvZ3MgYWNjZXNzJyxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gU3VwcHJlc3MgU3RhdGVNYWNoaW5lUm9sZSB3aWxkY2FyZCBwZXJtaXNzaW9ucyBmb3IgTGFtYmRhIGludm9jYXRpb25cbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9uc0J5UGF0aChcbiAgc3RhY2ssXG4gICcvVGVzdFN0YWNrL0FnZW50aWNEb2N1bWVudFByb2Nlc3NpbmcvU3RhdGVNYWNoaW5lUm9sZS9EZWZhdWx0UG9saWN5JyxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgcmVhc29uOiAnU3RlcCBGdW5jdGlvbnMgcmVxdWlyZXMgd2lsZGNhcmQgcGVybWlzc2lvbnMgdG8gaW52b2tlIExhbWJkYSBmdW5jdGlvbnMgd2l0aCB2ZXJzaW9uLXNwZWNpZmljIEFSTnMnLFxuICAgIH0sXG4gIF0sXG4pO1xuXG4vLyBTdXBwcmVzcyBMYW1iZGEgbG9nIGdyb3VwIHdpbGRjYXJkIHBlcm1pc3Npb25zXG5OYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gIHN0YWNrLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICByZWFzb246ICdMYW1iZGEgbG9nIHN0cmVhbSBuYW1lcyBhcmUgZ2VuZXJhdGVkIGF0IHJ1bnRpbWUsIHdpbGRjYXJkIHJlcXVpcmVkIGZvciBDbG91ZFdhdGNoIExvZ3MgYWNjZXNzJyxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuXG4vLyBBcHBseSBDREsgTmFnIGNoZWNrc1xuQXNwZWN0cy5vZihhcHApLmFkZChuZXcgQXdzU29sdXRpb25zQ2hlY2tzKHsgdmVyYm9zZTogdHJ1ZSB9KSk7XG5cbi8vIFN5bnRoZXNpemUgdGhlIHN0YWNrIGFuZCBjaGVjayBmb3IgdW5zdXBwcmVzc2VkIHdhcm5pbmdzIGFuZCBlcnJvcnNcbmNvbnN0IHdhcm5pbmdzID0gQW5ub3RhdGlvbnMuZnJvbVN0YWNrKHN0YWNrKS5maW5kV2FybmluZygnKicsIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ0F3c1NvbHV0aW9ucy0uKicpKTtcbmNvbnN0IGVycm9ycyA9IEFubm90YXRpb25zLmZyb21TdGFjayhzdGFjaykuZmluZEVycm9yKCcqJywgTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cCgnQXdzU29sdXRpb25zLS4qJykpO1xuXG4vLyBUZXN0OiBObyB1bnN1cHByZXNzZWQgd2FybmluZ3NcbnRlc3QoJ05vIHVuc3VwcHJlc3NlZCB3YXJuaW5ncycsICgpID0+IHtcbiAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZygnQ0RLIE5hZyBXYXJuaW5nczonLCBKU09OLnN0cmluZ2lmeSh3YXJuaW5ncywgbnVsbCwgMikpO1xuICB9XG4gIGV4cGVjdCh3YXJuaW5ncykudG9IYXZlTGVuZ3RoKDApO1xufSk7XG5cbi8vIFRlc3Q6IE5vIHVuc3VwcHJlc3NlZCBlcnJvcnNcbnRlc3QoJ05vIHVuc3VwcHJlc3NlZCBlcnJvcnMnLCAoKSA9PiB7XG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKCdDREsgTmFnIEVycm9yczonLCBKU09OLnN0cmluZ2lmeShlcnJvcnMsIG51bGwsIDIpKTtcbiAgfVxuICBleHBlY3QoZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG59KTtcbiJdfQ==
@@ -72,26 +72,12 @@ describe('AgenticDocumentProcessing', () => {
72
72
  basicTemplate.hasResourceProperties('AWS::IAM::Role', {
73
73
  Policies: [{
74
74
  PolicyDocument: {
75
- Statement: [
76
- {
77
- Effect: 'Allow',
78
- Action: 's3:GetObject',
79
- Resource: {
80
- 'Fn::Join': [
81
- '',
82
- [
83
- { 'Fn::GetAtt': [assertions_1.Match.anyValue(), 'Arn'] },
84
- '/*',
85
- ],
86
- ],
87
- },
88
- },
89
- {
75
+ Statement: assertions_1.Match.arrayWith([
76
+ assertions_1.Match.objectLike({
90
77
  Effect: 'Allow',
91
78
  Action: ['bedrock:InvokeModel', 'bedrock:InvokeModelWithResponseStream'],
92
- Resource: assertions_1.Match.anyValue(),
93
- },
94
- ],
79
+ }),
80
+ ]),
95
81
  },
96
82
  PolicyName: 'BedrockInvokePolicy',
97
83
  }],
@@ -122,4 +108,4 @@ describe('AgenticDocumentProcessing', () => {
122
108
  });
123
109
  });
124
110
  });
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZG9jdW1lbnQtcHJvY2Vzc2luZy90ZXN0cy9hZ2VudGljLWRvY3VtZW50LXByb2Nlc3NpbmcudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFvQztBQUNwQyx1REFBeUQ7QUFDekQsZ0ZBQTJFO0FBRTNFLFFBQVEsQ0FBQywyQkFBMkIsRUFBRSxHQUFHLEVBQUU7SUFDekMsSUFBSSxVQUFpQixDQUFDO0lBQ3RCLElBQUksZ0JBQXVCLENBQUM7SUFDNUIsSUFBSSxpQkFBd0IsQ0FBQztJQUM3QixJQUFJLGFBQXVCLENBQUM7SUFDNUIsSUFBSSxtQkFBNkIsQ0FBQztJQUNsQyxJQUFJLG9CQUE4QixDQUFDO0lBRW5DLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYix5Q0FBeUM7UUFDekMsVUFBVSxHQUFHLElBQUksbUJBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksdURBQXlCLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRTtZQUNyRCxnQkFBZ0IsRUFBRSwwQkFBMEI7WUFDNUMseUJBQXlCLEVBQUU7Z0JBQ3pCLGlCQUFpQixFQUFFLG9CQUFvQjtnQkFDdkMsYUFBYSxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQzthQUNsQztTQUNGLENBQUMsQ0FBQztRQUVILGdCQUFnQixHQUFHLElBQUksbUJBQUssRUFBRSxDQUFDO1FBQy9CLElBQUksdURBQXlCLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUU7WUFDakUsdUJBQXVCLEVBQUUsSUFBSTtTQUM5QixDQUFDLENBQUM7UUFFSCxpQkFBaUIsR0FBRyxJQUFJLG1CQUFLLEVBQUUsQ0FBQztRQUNoQyxJQUFJLHVEQUF5QixDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFO1lBQ25FLHVCQUF1QixFQUFFLEtBQUs7U0FDL0IsQ0FBQyxD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akIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsMENBQTBDLEVBQUUsR0FBRyxFQUFFO1FBQ3BELG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLHVCQUF1QixFQUFFO1lBQ2pFLFdBQVcsRUFBRTtnQkFDWCxTQUFTLEVBQUU7b0JBQ1QsUUFBUSxFQUFFLDhDQUE4QztpQkFDekQ7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLDREQUE0RCxFQUFFLEdBQUcsRUFBRTtRQUN0RSxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyx1QkFBdUIsRUFBRTtZQUNsRSxXQUFXLEVBQUU7Z0JBQ1gsU0FBUyxFQUFFO29CQUNULFFBQVEsRUFBRSwyQ0FBMkM7aUJBQ3REO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBUZW1wbGF0ZSwgTWF0Y2ggfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCB7IEFnZW50aWNEb2N1bWVudFByb2Nlc3NpbmcgfSBmcm9tICcuLi9hZ2VudGljLWRvY3VtZW50LXByb2Nlc3NpbmcnO1xuXG5kZXNjcmliZSgnQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZycsICgpID0+IHtcbiAgbGV0IGJhc2ljU3RhY2s6IFN0YWNrO1xuICBsZXQgY3Jvc3NSZWdpb25TdGFjazogU3RhY2s7XG4gIGxldCBkZWZhdWx0TW9kZWxTdGFjazogU3RhY2s7XG4gIGxldCBiYXNpY1RlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgbGV0IGNyb3NzUmVnaW9uVGVtcGxhdGU6IFRlbXBsYXRlO1xuICBsZXQgZGVmYXVsdE1vZGVsVGVtcGxhdGU6IFRlbXBsYXRlO1xuXG4gIGJlZm9yZUFsbCgoKSA9PiB7XG4gICAgLy8gQ3JlYXRlIGFsbCBzdGFja3MgYW5kIGNvbnN0cnVjdHMgZmlyc3RcbiAgICBiYXNpY1N0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgbmV3IEFnZW50aWNEb2N1bWVudFByb2Nlc3NpbmcoYmFzaWNTdGFjaywgJ0Jhc2ljVGVzdCcsIHtcbiAgICAgIHByb2Nlc3NpbmdQcm9tcHQ6ICdDdXN0b20gcHJvY2Vzc2luZyBwcm9tcHQnLFxuICAgICAgcHJvY2Vzc2luZ0FnZW50UGFyYW1ldGVyczoge1xuICAgICAgICBhZ2VudFN5c3RlbVByb21wdDogJ1Rlc3Qgc3lzdGVtIHByb21wdCcsXG4gICAgICAgIHRvb2xzTG9jYXRpb246IFsndG9vbDEnLCAndG9vbDInXSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjcm9zc1JlZ2lvblN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgbmV3IEFnZW50aWNEb2N1bWVudFByb2Nlc3NpbmcoY3Jvc3NSZWdpb25TdGFjaywgJ0Nyb3NzUmVnaW9uVGVzdCcsIHtcbiAgICAgIHVzZUNyb3NzUmVnaW9uSW5mZXJlbmNlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgZGVmYXVsdE1vZGVsU3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgICBuZXcgQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZyhkZWZhdWx0TW9kZWxTdGFjaywgJ0RlZmF1bHRNb2RlbFRlc3QnLCB7XG4gICAgICB1c2VDcm9zc1JlZ2lvbkluZmVyZW5jZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICAvLyBHZW5lcmF0ZSB0ZW1wbGF0ZXMgb25jZSBhZnRlciBhbGwgY29uc3RydWN0cyBhcmUgY3JlYXRlZFxuICAgIGJhc2ljVGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soYmFzaWNTdGFjayk7XG4gICAgY3Jvc3NSZWdpb25UZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhjcm9zc1JlZ2lvblN0YWNrKTtcbiAgICBkZWZhdWx0TW9kZWxUZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhkZWZhdWx0TW9kZWxTdGFjayk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NyZWF0ZXMgYmFzaWMgaW5mcmFzdHJ1Y3R1cmUnLCAoKSA9PiB7XG4gICAgYmFzaWNUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHt9KTtcbiAgICBiYXNpY1RlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgUnVudGltZTogJ3B5dGhvbjMuMTMnLFxuICAgIH0pO1xuICAgIGJhc2ljVGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCA1KTtcbiAgfSk7XG5cbiAgdGVzdCgnY29uZmlndXJlcyBhbGwgYWdlbnQgcGFyYW1ldGVycycsICgpID0+IHtcbiAgICBiYXNpY1RlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgVmFyaWFibGVzOiB7XG4gICAgICAgICAgU1lTVEVNX1BST01QVDogJ1Rlc3Qgc3lzdGVtIHByb21wdCcsXG4gICAgICAgICAgVE9PTFNfQ09ORklHOiAnW1widG9vbDFcIixcInRvb2wyXCJdJyxcbiAgICAgICAgICBQUk9NUFQ6ICdDdXN0b20gcHJvY2Vzc2luZyBwcm9tcHQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnaW5oZXJpdHMgYmVkcm9jayBkb2N1bWVudCBwcm9jZXNzaW5nIGZ1bmN0aW9uYWxpdHknLCAoKSA9PiB7XG4gICAgYmFzaWNUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHt9KTtcbiAgICBiYXNpY1RlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpEeW5hbW9EQjo6VGFibGUnLCB7fSk7XG4gICAgYmFzaWNUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U1FTOjpRdWV1ZScsIHt9KTtcbiAgICBiYXNpY1RlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnLCB7fSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NyZWF0ZXMgSUFNIHJvbGUgd2l0aCBjb3JyZWN0IHBlcm1pc3Npb25zJywgKCkgPT4ge1xuICAgIGJhc2ljVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OklBTTo6Um9sZScsIHtcbiAgICAgIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICBTdGF0ZW1lbnQ6IFt7XG4gICAgICAgICAgQWN0aW9uOiAnc3RzOkFzc3VtZVJvbGUnLFxuICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICBQcmluY2lwYWw6IHtcbiAgICAgICAgICAgIFNlcnZpY2U6ICdsYW1iZGEuYW1hem9uYXdzLmNvbScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfV0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYmFzaWNUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6SUFNOjpSb2xlJywge1xuICAgICAgUG9saWNpZXM6IFt7XG4gICAgICAgIFBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgICAgQWN0aW9uOiAnczM6R2V0T2JqZWN0JyxcbiAgICAgICAgICAgICAgUmVzb3VyY2U6IHtcbiAgICAgICAgICAgICAgICAnRm46OkpvaW4nOiBbXG4gICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgeyAnRm46OkdldEF0dCc6IFtNYXRjaC5hbnlWYWx1ZSgpLCAnQXJuJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgJy8qJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgICAgQWN0aW9uOiBbJ2JlZHJvY2s6SW52b2tlTW9kZWwnLCAnYmVkcm9jazpJbnZva2VNb2RlbFdpdGhSZXNwb25zZVN0cmVhbSddLFxuICAgICAgICAgICAgICBSZXNvdXJjZTogTWF0Y2guYW55VmFsdWUoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgUG9saWN5TmFtZTogJ0JlZHJvY2tJbnZva2VQb2xpY3knLFxuICAgICAgfV0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NvbmZpZ3VyZXMgdGltZW91dCBhbmQgbWVtb3J5IGZvciBwcm9jZXNzaW5nIGZ1bmN0aW9uJywgKCkgPT4ge1xuICAgIGJhc2ljVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCB7XG4gICAgICBUaW1lb3V0OiAzMDAsXG4gICAgICBNZW1vcnlTaXplOiAxMDI0LFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCd1c2VzIGNyb3NzLXJlZ2lvbiBpbmZlcmVuY2Ugd2hlbiBlbmFibGVkJywgKCkgPT4ge1xuICAgIGNyb3NzUmVnaW9uVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCB7XG4gICAgICBFbnZpcm9ubWVudDoge1xuICAgICAgICBWYXJpYWJsZXM6IHtcbiAgICAgICAgICBNT0RFTF9JRDogJ3VzLmFudGhyb3BpYy5jbGF1ZGUtMy03LXNvbm5ldC0yMDI1MDIxOS12MTowJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3VzZXMgZGVmYXVsdCBtb2RlbCB3aGVuIGNyb3NzLXJlZ2lvbiBpbmZlcmVuY2UgaXMgZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgZGVmYXVsdE1vZGVsVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCB7XG4gICAgICBFbnZpcm9ubWVudDoge1xuICAgICAgICBWYXJpYWJsZXM6IHtcbiAgICAgICAgICBNT0RFTF9JRDogJ2FudGhyb3BpYy5jbGF1ZGUtMy03LXNvbm5ldC0yMDI1MDIxOS12MTowJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZG9jdW1lbnQtcHJvY2Vzc2luZy90ZXN0cy9hZ2VudGljLWRvY3VtZW50LXByb2Nlc3NpbmcudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFvQztBQUNwQyx1REFBeUQ7QUFDekQsZ0ZBQTJFO0FBRTNFLFFBQVEsQ0FBQywyQkFBMkIsRUFBRSxHQUFHLEVBQUU7SUFDekMsSUFBSSxVQUFpQixDQUFDO0lBQ3RCLElBQUksZ0JBQXVCLENBQUM7SUFDNUIsSUFBSSxpQkFBd0IsQ0FBQztJQUM3QixJQUFJLGFBQXVCLENBQUM7SUFDNUIsSUFBSSxtQkFBNkIsQ0FBQztJQUNsQyxJQUFJLG9CQUE4QixDQUFDO0lBRW5DLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYix5Q0FBeUM7UUFDekMsVUFBVSxHQUFHLElBQUksbUJBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksdURBQXlCLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRTtZQUNyRCxnQkFBZ0IsRUFBRSwwQkFBMEI7WUFDNUMseUJBQXlCLEVBQUU7Z0JBQ3pCLGlCQUFpQixFQUFFLG9CQUFvQjtnQkFDdkMsYUFBYSxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQzthQUNsQztTQUNGLENBQUMsQ0FBQztRQUVILGdCQUFnQixHQUFHLElBQUksbUJBQUssRUFBRSxDQUFDO1FBQy9CLElBQUksdURBQXlCLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUU7WUFDakUsdUJBQXVCLEVBQUUsSUFBSTtTQUM5QixDQUFDLENBQUM7UUFFSCxpQkFBaUIsR0FBRyxJQUFJLG1CQUFLLEVBQUUsQ0FBQztRQUNoQyxJQUFJLHVEQUF5QixDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFO1lBQ25FLHVCQUF1QixFQUFFLEtBQUs7U0FDL0IsQ0FBQyxD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QUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLDREQUE0RCxFQUFFLEdBQUcsRUFBRTtRQUN0RSxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyx1QkFBdUIsRUFBRTtZQUNsRSxXQUFXLEVBQUU7Z0JBQ1gsU0FBUyxFQUFFO29CQUNULFFBQVEsRUFBRSwyQ0FBMkM7aUJBQ3REO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBUZW1wbGF0ZSwgTWF0Y2ggfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCB7IEFnZW50aWNEb2N1bWVudFByb2Nlc3NpbmcgfSBmcm9tICcuLi9hZ2VudGljLWRvY3VtZW50LXByb2Nlc3NpbmcnO1xuXG5kZXNjcmliZSgnQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZycsICgpID0+IHtcbiAgbGV0IGJhc2ljU3RhY2s6IFN0YWNrO1xuICBsZXQgY3Jvc3NSZWdpb25TdGFjazogU3RhY2s7XG4gIGxldCBkZWZhdWx0TW9kZWxTdGFjazogU3RhY2s7XG4gIGxldCBiYXNpY1RlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgbGV0IGNyb3NzUmVnaW9uVGVtcGxhdGU6IFRlbXBsYXRlO1xuICBsZXQgZGVmYXVsdE1vZGVsVGVtcGxhdGU6IFRlbXBsYXRlO1xuXG4gIGJlZm9yZUFsbCgoKSA9PiB7XG4gICAgLy8gQ3JlYXRlIGFsbCBzdGFja3MgYW5kIGNvbnN0cnVjdHMgZmlyc3RcbiAgICBiYXNpY1N0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgbmV3IEFnZW50aWNEb2N1bWVudFByb2Nlc3NpbmcoYmFzaWNTdGFjaywgJ0Jhc2ljVGVzdCcsIHtcbiAgICAgIHByb2Nlc3NpbmdQcm9tcHQ6ICdDdXN0b20gcHJvY2Vzc2luZyBwcm9tcHQnLFxuICAgICAgcHJvY2Vzc2luZ0FnZW50UGFyYW1ldGVyczoge1xuICAgICAgICBhZ2VudFN5c3RlbVByb21wdDogJ1Rlc3Qgc3lzdGVtIHByb21wdCcsXG4gICAgICAgIHRvb2xzTG9jYXRpb246IFsndG9vbDEnLCAndG9vbDInXSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjcm9zc1JlZ2lvblN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgbmV3IEFnZW50aWNEb2N1bWVudFByb2Nlc3NpbmcoY3Jvc3NSZWdpb25TdGFjaywgJ0Nyb3NzUmVnaW9uVGVzdCcsIHtcbiAgICAgIHVzZUNyb3NzUmVnaW9uSW5mZXJlbmNlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgZGVmYXVsdE1vZGVsU3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgICBuZXcgQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZyhkZWZhdWx0TW9kZWxTdGFjaywgJ0RlZmF1bHRNb2RlbFRlc3QnLCB7XG4gICAgICB1c2VDcm9zc1JlZ2lvbkluZmVyZW5jZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICAvLyBHZW5lcmF0ZSB0ZW1wbGF0ZXMgb25jZSBhZnRlciBhbGwgY29uc3RydWN0cyBhcmUgY3JlYXRlZFxuICAgIGJhc2ljVGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soYmFzaWNTdGFjayk7XG4gICAgY3Jvc3NSZWdpb25UZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhjcm9zc1JlZ2lvblN0YWNrKTtcbiAgICBkZWZhdWx0TW9kZWxUZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhkZWZhdWx0TW9kZWxTdGFjayk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NyZWF0ZXMgYmFzaWMgaW5mcmFzdHJ1Y3R1cmUnLCAoKSA9PiB7XG4gICAgYmFzaWNUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHt9KTtcbiAgICBiYXNpY1RlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgUnVudGltZTogJ3B5dGhvbjMuMTMnLFxuICAgIH0pO1xuICAgIGJhc2ljVGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCA1KTtcbiAgfSk7XG5cbiAgdGVzdCgnY29uZmlndXJlcyBhbGwgYWdlbnQgcGFyYW1ldGVycycsICgpID0+IHtcbiAgICBiYXNpY1RlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgVmFyaWFibGVzOiB7XG4gICAgICAgICAgU1lTVEVNX1BST01QVDogJ1Rlc3Qgc3lzdGVtIHByb21wdCcsXG4gICAgICAgICAgVE9PTFNfQ09ORklHOiAnW1widG9vbDFcIixcInRvb2wyXCJdJyxcbiAgICAgICAgICBQUk9NUFQ6ICdDdXN0b20gcHJvY2Vzc2luZyBwcm9tcHQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnaW5oZXJpdHMgYmVkcm9jayBkb2N1bWVudCBwcm9jZXNzaW5nIGZ1bmN0aW9uYWxpdHknLCAoKSA9PiB7XG4gICAgYmFzaWNUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHt9KTtcbiAgICBiYXNpY1RlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpEeW5hbW9EQjo6VGFibGUnLCB7fSk7XG4gICAgYmFzaWNUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U1FTOjpRdWV1ZScsIHt9KTtcbiAgICBiYXNpY1RlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnLCB7fSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NyZWF0ZXMgSUFNIHJvbGUgd2l0aCBjb3JyZWN0IHBlcm1pc3Npb25zJywgKCkgPT4ge1xuICAgIGJhc2ljVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OklBTTo6Um9sZScsIHtcbiAgICAgIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICBTdGF0ZW1lbnQ6IFt7XG4gICAgICAgICAgQWN0aW9uOiAnc3RzOkFzc3VtZVJvbGUnLFxuICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICBQcmluY2lwYWw6IHtcbiAgICAgICAgICAgIFNlcnZpY2U6ICdsYW1iZGEuYW1hem9uYXdzLmNvbScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfV0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYmFzaWNUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6SUFNOjpSb2xlJywge1xuICAgICAgUG9saWNpZXM6IFt7XG4gICAgICAgIFBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgU3RhdGVtZW50OiBNYXRjaC5hcnJheVdpdGgoW1xuICAgICAgICAgICAgTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgICAgQWN0aW9uOiBbJ2JlZHJvY2s6SW52b2tlTW9kZWwnLCAnYmVkcm9jazpJbnZva2VNb2RlbFdpdGhSZXNwb25zZVN0cmVhbSddLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXSksXG4gICAgICAgIH0sXG4gICAgICAgIFBvbGljeU5hbWU6ICdCZWRyb2NrSW52b2tlUG9saWN5JyxcbiAgICAgIH1dLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdjb25maWd1cmVzIHRpbWVvdXQgYW5kIG1lbW9yeSBmb3IgcHJvY2Vzc2luZyBmdW5jdGlvbicsICgpID0+IHtcbiAgICBiYXNpY1RlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgVGltZW91dDogMzAwLFxuICAgICAgTWVtb3J5U2l6ZTogMTAyNCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgndXNlcyBjcm9zcy1yZWdpb24gaW5mZXJlbmNlIHdoZW4gZW5hYmxlZCcsICgpID0+IHtcbiAgICBjcm9zc1JlZ2lvblRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgVmFyaWFibGVzOiB7XG4gICAgICAgICAgTU9ERUxfSUQ6ICd1cy5hbnRocm9waWMuY2xhdWRlLTMtNy1zb25uZXQtMjAyNTAyMTktdjE6MCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCd1c2VzIGRlZmF1bHQgbW9kZWwgd2hlbiBjcm9zcy1yZWdpb24gaW5mZXJlbmNlIGlzIGRpc2FibGVkJywgKCkgPT4ge1xuICAgIGRlZmF1bHRNb2RlbFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgVmFyaWFibGVzOiB7XG4gICAgICAgICAgTU9ERUxfSUQ6ICdhbnRocm9waWMuY2xhdWRlLTMtNy1zb25uZXQtMjAyNTAyMTktdjE6MCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19