@dontirun/state-machine-semaphore 0.1.0 → 0.1.3

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.
package/.gitattributes CHANGED
@@ -16,6 +16,7 @@
16
16
  /.projen/deps.json linguist-generated
17
17
  /.projen/files.json linguist-generated
18
18
  /.projen/tasks.json linguist-generated
19
+ /API.md linguist-generated
19
20
  /LICENSE linguist-generated
20
21
  /package.json linguist-generated
21
22
  /tsconfig.dev.json linguist-generated
package/.jsii CHANGED
@@ -2989,7 +2989,7 @@
2989
2989
  },
2990
2990
  "name": "@dontirun/state-machine-semaphore",
2991
2991
  "readme": {
2992
- "markdown": "# @dontirun/state-machine-semaphore\n\n[![npm version](https://img.shields.io/npm/v/@dontirun/state-machine-semaphore.svg)](https://img.shields.io/npm/v/@dontirun/state-machine-semaphore)\n[![PyPI version](https://img.shields.io/pypi/v/state-machine-semaphore.svg)](https://pypi.org/project/state-machine-semaphore)\n[![NuGet version](https://img.shields.io/nuget/v/Dontirun.StateMachineSemaphore)](https://www.nuget.org/packages/Dontirun.StateMachineSemaphore)\n\n[![View on Construct Hub](https://constructs.dev/badge?package=%40dontirun%2Fstate-machine-semaphore)](https://constructs.dev/packages/@dontirun/state-machine-semaphore)\n\nAn [aws-cdk](https://github.com/aws/aws-cdk) construct that enables you to use AWS Step Functions to control concurrency in your distributed system. You can use this construct to distributed state machine semaphores to control concurrent invocations of contentious work.\n\nThis construct is based off of [Justin Callison's](https://github.com/JustinCallison) example [code](https://github.com/aws-samples/aws-stepfunctions-examples/blob/main/sam/app-control-concurrency-with-dynamodb/statemachines/dynamodb-semaphore.asl.json). Make sure to check out Justin's [blogpost](https://aws.amazon.com/blogs/compute/controlling-concurrency-in-distributed-systems-using-aws-step-functions/) to learn about how the system works.\n\n## Examples\n\n### Example 1) A state machine with a controlled job\n\n<details>\n\n<summary>Click to see code</summary>\n\n```typescript\nimport { Function } from 'aws-cdk-lib/aws-lambda';\nimport { Duration, Stack, StackProps } from 'aws-cdk-lib';\nimport { StateMachine, Succeed, Wait, WaitTime } from 'aws-cdk-lib/aws-stepfunctions';\nimport { LambdaInvoke } from 'aws-cdk-lib/aws-stepfunctions-tasks';\nimport { Construct } from 'constructs';\nimport { Semaphore } from '@dontirun/state-machine-semaphore';\n\n\nexport class CdkTestStack extends Stack {\n constructor(scope: Construct, id: string, props?: StackProps) {\n super(scope, id, props);\n\n const contestedJob = new LambdaInvoke(this, 'ContestedJobPart1', {\n lambdaFunction: Function.fromFunctionName(this, 'JobFunctionPart1', 'cool-function'),\n }).next(new Wait(this, 'Wait', { time: WaitTime.duration(Duration.seconds(7)) }))\n .next(new Wait(this, 'AnotherWait', { time: WaitTime.duration(Duration.seconds(7)) }))\n .next(new Wait(this, 'YetAnotherWait', { time: WaitTime.duration(Duration.seconds(7)) }));\n\n const afterContestedJob = new Succeed(this, 'Succeed');\n\n const stateMachineFragment = new Semaphore(stack, 'Semaphore', { lockName: 'life', limit: 42, job: contestedJob, nextState: afterContestedJob });\n\n new StateMachine(this, 'StateMachine', {\n definition: stateMachineFragment,\n });\n }\n}\n```\n\n</details>\n\n\n<details>\n\n<summary>Click to see the state machine definition</summary>\n\n![Example 1 Definition](./images/Example1_Graph_Edit.png)\n</details>\n\n\n### Example 2) A state machine with multiple semaphores\n\n<details>\n\n<summary>Click to see code</summary>\n\n```typescript\nimport { Function } from 'aws-cdk-lib/aws-lambda';\nimport { Duration, Stack, StackProps } from 'aws-cdk-lib';\nimport { StateMachine, Succeed, Wait, WaitTime } from 'aws-cdk-lib/aws-stepfunctions';\nimport { LambdaInvoke } from 'aws-cdk-lib/aws-stepfunctions-tasks';\nimport { Construct } from 'constructs';\nimport { Semaphore } from '@dontirun/state-machine-semaphore';\n\n\nexport class CdkTestStack extends Stack {\n constructor(scope: Construct, id: string, props?: StackProps) {\n super(scope, id, props);\n\n const contestedJob = new LambdaInvoke(this, 'ContestedJobPart1', {\n lambdaFunction: Function.fromFunctionName(this, 'JobFunctionPart1', 'cool-function'),\n })\n const notContestedJob = new LambdaInvoke(this, 'NotContestedJob', {\n lambdaFunction: Function.fromFunctionName(this, 'NotContestedJobFunction', 'cooler-function'),\n })\n const contestedJob2 = new LambdaInvoke(this, 'ContestedJobPart2', {\n lambdaFunction: Function.fromFunctionName(this, 'JobFunctionPart2', 'coolest-function'),\n })\n const afterContestedJob2 = new Succeed(this, 'Succeed');\n\n const definition = new Semaphore(stack, 'Semaphore', { lockName: 'life', limit: 42, job: contestedJob, nextState: notContestedJob })\n .next(new Semaphore(stack, 'Semaphore2', { lockName: 'liberty', limit: 7, job: contestedJob2, nextState: afterContestedJob2 }));\n\n new StateMachine(this, 'StateMachine', {\n definition: definition,\n });\n }\n}\n```\n\n</details>\n\n<details>\n\n<summary>Click to see the state machine definition</summary>\n\n![Example 2 Definition](./images/Example2_Graph_Edit.png)\n</details>\n\n## API Reference\n\nSee [API.md](./API.md).\n\n## License\n\nThis project is licensed under the Apache-2.0 License.\n"
2992
+ "markdown": "# @dontirun/state-machine-semaphore\n\n[![npm version](https://img.shields.io/npm/v/@dontirun/state-machine-semaphore.svg)](https://img.shields.io/npm/v/@dontirun/state-machine-semaphore)\n[![PyPI version](https://img.shields.io/pypi/v/state-machine-semaphore.svg)](https://pypi.org/project/state-machine-semaphore)\n[![NuGet version](https://img.shields.io/nuget/v/Dontirun.StateMachineSemaphore)](https://www.nuget.org/packages/Dontirun.StateMachineSemaphore)\n[![Maven version](https://img.shields.io/maven-central/v/io.github.dontirun/statemachinesemaphore)](https://search.maven.org/artifact/io.github.dontirun/statemachinesemaphore)\n[![NuGet version](https://img.shields.io/nuget/v/Dontirun.StateMachineSemaphore)](https://www.nuget.org/packages/Dontirun.StateMachineSemaphore)\n\n[![View on Construct Hub](https://constructs.dev/badge?package=%40dontirun%2Fstate-machine-semaphore)](https://constructs.dev/packages/@dontirun/state-machine-semaphore)\n\nAn [aws-cdk](https://github.com/aws/aws-cdk) construct that enables you to use AWS Step Functions to control concurrency in your distributed system. You can use this construct to distributed state machine semaphores to control concurrent invocations of contentious work.\n\nThis construct is based off of [Justin Callison's](https://github.com/JustinCallison) example [code](https://github.com/aws-samples/aws-stepfunctions-examples/blob/main/sam/app-control-concurrency-with-dynamodb/statemachines/dynamodb-semaphore.asl.json). Make sure to check out Justin's [blogpost](https://aws.amazon.com/blogs/compute/controlling-concurrency-in-distributed-systems-using-aws-step-functions/) to learn about how the system works.\n\n## Examples\n\n### Example 1) A state machine with a controlled job\n\n<details>\n\n<summary>Click to see code</summary>\n\n```typescript\nimport { Function } from 'aws-cdk-lib/aws-lambda';\nimport { Duration, Stack, StackProps } from 'aws-cdk-lib';\nimport { StateMachine, Succeed, Wait, WaitTime } from 'aws-cdk-lib/aws-stepfunctions';\nimport { LambdaInvoke } from 'aws-cdk-lib/aws-stepfunctions-tasks';\nimport { Construct } from 'constructs';\nimport { Semaphore } from '@dontirun/state-machine-semaphore';\n\n\nexport class CdkTestStack extends Stack {\n constructor(scope: Construct, id: string, props?: StackProps) {\n super(scope, id, props);\n\n const contestedJob = new LambdaInvoke(this, 'ContestedJobPart1', {\n lambdaFunction: Function.fromFunctionName(this, 'JobFunctionPart1', 'cool-function'),\n }).next(new Wait(this, 'Wait', { time: WaitTime.duration(Duration.seconds(7)) }))\n .next(new Wait(this, 'AnotherWait', { time: WaitTime.duration(Duration.seconds(7)) }))\n .next(new Wait(this, 'YetAnotherWait', { time: WaitTime.duration(Duration.seconds(7)) }));\n\n const afterContestedJob = new Succeed(this, 'Succeed');\n\n const stateMachineFragment = new Semaphore(stack, 'Semaphore', { lockName: 'life', limit: 42, job: contestedJob, nextState: afterContestedJob });\n\n new StateMachine(this, 'StateMachine', {\n definition: stateMachineFragment,\n });\n }\n}\n```\n\n</details>\n\n\n<details>\n\n<summary>Click to see the state machine definition</summary>\n\n![Example 1 Definition](./images/Example1_Graph_Edit.png)\n</details>\n\n\n### Example 2) A state machine with multiple semaphores\n\n<details>\n\n<summary>Click to see code</summary>\n\n```typescript\nimport { Function } from 'aws-cdk-lib/aws-lambda';\nimport { Duration, Stack, StackProps } from 'aws-cdk-lib';\nimport { StateMachine, Succeed, Wait, WaitTime } from 'aws-cdk-lib/aws-stepfunctions';\nimport { LambdaInvoke } from 'aws-cdk-lib/aws-stepfunctions-tasks';\nimport { Construct } from 'constructs';\nimport { Semaphore } from '@dontirun/state-machine-semaphore';\n\n\nexport class CdkTestStack extends Stack {\n constructor(scope: Construct, id: string, props?: StackProps) {\n super(scope, id, props);\n\n const contestedJob = new LambdaInvoke(this, 'ContestedJobPart1', {\n lambdaFunction: Function.fromFunctionName(this, 'JobFunctionPart1', 'cool-function'),\n })\n const notContestedJob = new LambdaInvoke(this, 'NotContestedJob', {\n lambdaFunction: Function.fromFunctionName(this, 'NotContestedJobFunction', 'cooler-function'),\n })\n const contestedJob2 = new LambdaInvoke(this, 'ContestedJobPart2', {\n lambdaFunction: Function.fromFunctionName(this, 'JobFunctionPart2', 'coolest-function'),\n })\n const afterContestedJob2 = new Succeed(this, 'Succeed');\n\n const definition = new Semaphore(stack, 'Semaphore', { lockName: 'life', limit: 42, job: contestedJob, nextState: notContestedJob })\n .next(new Semaphore(stack, 'Semaphore2', { lockName: 'liberty', limit: 7, job: contestedJob2, nextState: afterContestedJob2 }));\n\n new StateMachine(this, 'StateMachine', {\n definition: definition,\n });\n }\n}\n```\n\n</details>\n\n<details>\n\n<summary>Click to see the state machine definition</summary>\n\n![Example 2 Definition](./images/Example2_Graph_Edit.png)\n</details>\n\n## API Reference\n\nSee [API.md](./API.md).\n\n## License\n\nThis project is licensed under the Apache-2.0 License.\n"
2993
2993
  },
2994
2994
  "repository": {
2995
2995
  "type": "git",
@@ -3001,6 +3001,13 @@
3001
3001
  "namespace": "Dontirun.StateMachineSemaphore",
3002
3002
  "packageId": "Dontirun.StateMachineSemaphore"
3003
3003
  },
3004
+ "java": {
3005
+ "maven": {
3006
+ "artifactId": "statemachinesemaphore",
3007
+ "groupId": "io.github.dontirun"
3008
+ },
3009
+ "package": "io.github.dontirun.statemachinesemaphore"
3010
+ },
3004
3011
  "js": {
3005
3012
  "npm": "@dontirun/state-machine-semaphore"
3006
3013
  },
@@ -3298,6 +3305,6 @@
3298
3305
  "symbolId": "src/index:TableReadWriteCapacity"
3299
3306
  }
3300
3307
  },
3301
- "version": "0.1.0",
3302
- "fingerprint": "y6oYFeIJXupfNQnaMCZlL8ffdTZGJuqJ0qGm58Mz1gE="
3308
+ "version": "0.1.3",
3309
+ "fingerprint": "1rn+UNba0giHEMzM34GntGKWZuje7LpAeLOTmek1fyU="
3303
3310
  }
package/README.md CHANGED
@@ -3,6 +3,8 @@
3
3
  [![npm version](https://img.shields.io/npm/v/@dontirun/state-machine-semaphore.svg)](https://img.shields.io/npm/v/@dontirun/state-machine-semaphore)
4
4
  [![PyPI version](https://img.shields.io/pypi/v/state-machine-semaphore.svg)](https://pypi.org/project/state-machine-semaphore)
5
5
  [![NuGet version](https://img.shields.io/nuget/v/Dontirun.StateMachineSemaphore)](https://www.nuget.org/packages/Dontirun.StateMachineSemaphore)
6
+ [![Maven version](https://img.shields.io/maven-central/v/io.github.dontirun/statemachinesemaphore)](https://search.maven.org/artifact/io.github.dontirun/statemachinesemaphore)
7
+ [![NuGet version](https://img.shields.io/nuget/v/Dontirun.StateMachineSemaphore)](https://www.nuget.org/packages/Dontirun.StateMachineSemaphore)
6
8
 
7
9
  [![View on Construct Hub](https://constructs.dev/badge?package=%40dontirun%2Fstate-machine-semaphore)](https://constructs.dev/packages/@dontirun/state-machine-semaphore)
8
10
 
package/lib/index.js CHANGED
@@ -155,6 +155,9 @@ class Semaphore extends aws_stepfunctions_1.StateMachineFragment {
155
155
  ensureTable(props) {
156
156
  const existing = aws_cdk_lib_1.Stack.of(this).node.tryFindChild(this.tableName);
157
157
  if (existing) {
158
+ if (props.tableReadWriteCapacity) {
159
+ throw new Error('`tableReadWriteCapacity` can only be specified on the first instance of the `Semaphore` construct in each stack.');
160
+ }
158
161
  // Just assume this is true
159
162
  return existing;
160
163
  }
@@ -173,9 +176,9 @@ class Semaphore extends aws_stepfunctions_1.StateMachineFragment {
173
176
  }
174
177
  exports.Semaphore = Semaphore;
175
178
  _a = JSII_RTTI_SYMBOL_1;
176
- Semaphore[_a] = { fqn: "@dontirun/state-machine-semaphore.Semaphore", version: "0.1.0" };
179
+ Semaphore[_a] = { fqn: "@dontirun/state-machine-semaphore.Semaphore", version: "0.1.3" };
177
180
  /**
178
181
  * The names and associated concurrency limits and number of uses of the sempahores.
179
182
  */
180
183
  Semaphore.semaphoreTracker = new Map();
181
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBcUQ7QUFDckQsMkRBQTZFO0FBQzdFLHFFQUFnSztBQUNoSyxpRkFBMks7QUF3RDNLOztHQUVHO0FBQ0gsTUFBYSxTQUFVLFNBQVEsd0NBQW9CO0lBb0JqRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXFCO1FBQzdELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFWbkI7O1dBRUc7UUFDSyxjQUFTLEdBQUcsNERBQTRELENBQUM7UUFRL0UsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxJQUFJLFFBQVEsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxJQUFJLFFBQVEsRUFBRTtZQUNaLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRTtnQkFDbkIsSUFBSSxRQUFRLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7b0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLEtBQUssQ0FBQyxRQUFRLHFFQUFxRSxLQUFLLENBQUMsS0FBSyxlQUFlLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2lCQUM3SztxQkFBTTtvQkFDTCxRQUFRLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDeEUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2lCQUM1QzthQUNGO2lCQUFNO2dCQUNMLE1BQU0sSUFB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QUFXLENBQUMsQ0FBQyxDQUFDLDBCQUFXLENBQUMsZUFBZTthQUNsRyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7O0FBckxILDhCQXNMQzs7O0FBcExDOztHQUVHO0FBQ1ksMEJBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQXFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiwgTmFtZXMsIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgVGFibGUsIEJpbGxpbmdNb2RlLCBBdHRyaWJ1dGVUeXBlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWR5bmFtb2RiJztcbmltcG9ydCB7IFBhcmFsbGVsLCBTdGF0ZU1hY2hpbmVGcmFnbWVudCwgSnNvblBhdGgsIENob2ljZSwgUGFzcywgV2FpdCwgV2FpdFRpbWUsIENvbmRpdGlvbiwgU3RhdGUsIElDaGFpbmFibGUsIElOZXh0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zJztcbmltcG9ydCB7IER5bmFtb0F0dHJpYnV0ZVZhbHVlLCBEeW5hbW9HZXRJdGVtLCBEeW5hbW9Qcm9qZWN0aW9uRXhwcmVzc2lvbiwgRHluYW1vUHV0SXRlbSwgRHluYW1vUmV0dXJuVmFsdWVzLCBEeW5hbW9VcGRhdGVJdGVtIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGNyZWF0aW5nIGEgU2VtYXBob3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VtYXBob3JlUHJvcHMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHNlbWFwaG9yZS5cbiAgICovXG4gIHJlYWRvbmx5IGxvY2tOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCBleGVjdXRpb25zIGZvciB0aGUgZ2l2ZW4gbG9jay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbWl0OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgam9iIChvciBjaGFpbmVkIGpvYnMpIHRvIGJlIHNlbWFwaG9yZWQuXG4gICAqL1xuICByZWFkb25seSBqb2I6IElDaGFpbk5leHRhYmxlO1xuICAvKipcbiAgICogVGhlIFN0YXRlIHRvIGdvIHRvIGFmdGVyIHRoZSBzZW1hcGhvcmVkIGpvYiBjb21wbGV0ZXMuXG4gICAqL1xuICByZWFkb25seSBuZXh0U3RhdGU6IFN0YXRlO1xuICAvKipcbiAgICogIEV4cGxpY2lsaXR5IGFsbG93IHRoZSByZXVzZSBvZiBhIG5hbWVkIGxvY2sgZnJvbSBhIHByZXZpb3VzbHkgZ2VuZXJhdGVkIGpvYi4gVGhyb3dzIGFuIGVycm9yIGlmIGEgZGlmZmVyZW50IGBsaW1pdGAgaXMgc3BlY2lmaWVkLiBEZWZhdWx0OiBmYWxzZS5cbiAgICovXG4gIHJlYWRvbmx5IHJldXNlTG9jaz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBZGQgZGV0YWlsZWQgY29tbWVudHMgdG8gbG9jayByZWxhdGVkIHN0YXRlcy4gU2lnbmlmaWNhbnRseSBpbmNyZWFzZXMgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgc2l6ZS4gRGVmYXVsdDogZmFsc2UuXG4gICAqL1xuICByZWFkb25seSBjb21tZW50cz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBPcHRpb25hbGx5IHNldCB0aGUgRHluYW1vREIgdGFibGUgdG8gaGF2ZSBhIHNwZWNpZmljIHJlYWQvd3JpdGUgY2FwYWNpdHkgd2l0aCBQUk9WSVNJT05FRCBiaWxsaW5nLlxuICAgKiBOb3RlOiBUaGlzIHByb3BlcnR5IGNhbiBvbmx5IGJlIHNldCBvbiB0aGUgZmlyc3QgaW5zdGFudGlhdGlvbiBvZiBhIGBTZW1hcGhvcmVgIHBlciBzdGFja1xuICAgKiBAZGVmYXVsdCBQQVlfUEVSX1JFUVVFU1RcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlUmVhZFdyaXRlQ2FwYWNpdHk/OiBUYWJsZVJlYWRXcml0ZUNhcGFjaXR5O1xufVxuXG4vKipcbiAqIFJlYWQgYW5kIHdyaXRlIGNhcGFjaXR5IGZvciBhIFBST1ZJU0lPTkVEIGJpbGxpbmcgRHluYW1vREIgdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVSZWFkV3JpdGVDYXBhY2l0eSB7XG4gIHJlYWRvbmx5IHJlYWRDYXBhY2l0eTogbnVtYmVyO1xuICByZWFkb25seSB3cml0ZUNhcGFjaXR5OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBVc2FnZVRyYWNrZXIge1xuICByZWFkb25seSBsaW1pdDogbnVtYmVyO1xuICByZWFkb25seSB0aW1lc1VzZWQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2hhaW5OZXh0YWJsZSBleHRlbmRzIElDaGFpbmFibGUsIElOZXh0YWJsZSB7IH1cblxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHNlbWFwaG9yZSBmb3IgYSBTdGVwRnVuY3Rpb24gam9iIChvciBjaGFpbmVkIHNldCBvZiBqb2JzKSB0byBsaW1pdCBwYXJhbGxlbGlzbSBhY3Jvc3MgZXhlY3V0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlbWFwaG9yZSBleHRlbmRzIFN0YXRlTWFjaGluZUZyYWdtZW50IHtcblxuICAvKipcbiAgICogVGhlIG5hbWVzIGFuZCBhc3NvY2lhdGVkIGNvbmN1cnJlbmN5IGxpbWl0cyBhbmQgbnVtYmVyIG9mIHVzZXMgb2YgdGhlIHNlbXBhaG9yZXMuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBzZW1hcGhvcmVUcmFja2VyID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIFVzYWdlVHJhY2tlcj4+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBEeW5hbW9EQiB0YWJsZSB1c2VkIHRvIHN0b3JlIHNlbWFwaG9yZXMuXG4gICAqL1xuICBwcml2YXRlIHNlbWFwaG9yZVRhYmxlOiBUYWJsZTtcbiAgLyoqXG4gICAqIFRoZSBEeW5hbW9EQiB0YWJsZSB1c2VkIHRvIHN0b3JlIHNlbWFwaG9yZXMuXG4gICAqL1xuICBwcml2YXRlIHRhYmxlTmFtZSA9ICdTdGF0ZU1hY2hpbmVTZW1wYWhvcmVUYWJsZTkyMDc1MWE2NWE1ODRlOGFiNzU4MzQ2MGY2ZGI2ODZhJztcblxuICBwdWJsaWMgcmVhZG9ubHkgc3RhcnRTdGF0ZTogU3RhdGU7XG4gIHB1YmxpYyByZWFkb25seSBlbmRTdGF0ZXM6IElOZXh0YWJsZVtdO1xuXG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFNlbWFwaG9yZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICBjb25zdCBzdGFja1RyYWNrZXIgPSB0aGlzLnNldFVwTWFwKCk7XG4gICAgdGhpcy5zZW1hcGhvcmVUYWJsZSA9IHRoaXMuZW5zdXJlVGFibGUocHJvcHMpO1xuICAgIGxldCBsb2NrSW5mbyA9IHN0YWNrVHJhY2tlci5nZXQocHJvcHMubG9ja05hbWUpO1xuICAgIGlmIChsb2NrSW5mbykge1xuICAgICAgaWYgKHByb3BzLnJldXNlTG9jaykge1xuICAgICAgICBpZiAobG9ja0luZm8ubGltaXQgIT0gcHJvcHMubGltaXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByZXVzZWQgXFxgbG9ja05hbWVcXGAgXCIke3Byb3BzLmxvY2tOYW1lfVwiIHdhcyBnaXZlbiBhIGRpZmZlcmVudCBcXGBsaW1pdFxcYCB0aGFuIHByZXZpb3VzbHkgZGVmaW5lZC4gR2l2ZW46ICR7cHJvcHMubGltaXR9LCBQcmV2aW91czogJHtsb2NrSW5mby5saW1pdH0uYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9ja0luZm8gPSB7IGxpbWl0OiBsb2NrSW5mby5saW1pdCwgdGltZXNVc2VkOiBsb2NrSW5mby50aW1lc1VzZWQgKyAxIH07XG4gICAgICAgICAgc3RhY2tUcmFja2VyLnNldChwcm9wcy5sb2NrTmFtZSwgbG9ja0luZm8pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBcXGBsb2NrTmFtZVxcYCBcIiR7cHJvcHMubG9ja05hbWV9XCIgd2FzIHJldXNlZCB3aXRob3V0IGV4cGxpY2l0bHkgYWxsb3dpbmcgcmV1c2UuIFNldCBcXGByZXVzZUxvY2tcXGAgdG8gXFxgdHJ1ZVxcYCBpZiB5b3Ugd2FudCB0byByZXVzZSB0aGUgbG9jay5gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9ja0luZm8gPSB7IGxpbWl0OiBwcm9wcy5saW1pdCwgdGltZXNVc2VkOiAxIH07XG4gICAgICBzdGFja1RyYWNrZXIuc2V0KHByb3BzLmxvY2tOYW1lLCBsb2NrSW5mbyk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2V0TG9jayA9IG5ldyBQYXJhbGxlbCh0aGlzLCBgR2V0ICR7cHJvcHMubG9ja05hbWV9IExvY2s6ICR7bG9ja0luZm8udGltZXNVc2VkfWAsIHsgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCB9KTtcbiAgICBjb25zdCBhY3F1aXJlTG9jayA9IG5ldyBEeW5hbW9VcGRhdGVJdGVtKHRoaXMsIGBBY3F1aXJlICR7cHJvcHMubG9ja05hbWV9IExvY2s6ICR7bG9ja0luZm8udGltZXNVc2VkfWAsXG4gICAgICB7XG4gICAgICAgIGNvbW1lbnQ6IHByb3BzLmNvbW1lbnRzID8gYEFjcXVpcmUgYSBsb2NrIHVzaW5nIGEgY29uZGl0aW9uYWwgdXBkYXRlIHRvIER5bmFtb0RCLiBUaGlzIHVwZGF0ZSB3aWxsIGRvIHR3byB0aGluZ3M6XG4gICAgICAgICAgMSkgaW5jcmVtZW50IGEgY291bnRlciBmb3IgdGhlIG51bWJlciBvZiBoZWxkIGxvY2tzXG4gICAgICAgICAgMikgYWRkIGFuIGF0dHJpYnV0ZSB0byB0aGUgRHluYW1vREIgSXRlbSB3aXRoIGEgdW5pcXVlIGtleSBmb3IgdGhpcyBleGVjdXRpb24gYW5kIHdpdGggYSB2YWx1ZSBvZiB0aGUgdGltZSB3aGVuIHRoZSBsb2NrIHdhcyBBY3F1aXJlZFxuICAgICAgICAgIFRoZSBVcGRhdGUgaW5jbHVkZXMgYSBjb25kaXRpb25hbCBleHByZXNzaW9uIHRoYXQgd2lsbCBmYWlsIHVuZGVyIHR3byBjaXJjdW1zdGFuY2VzOlxuICAgICAgICAgIDEpIGlmIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsb2NrcyBoYXZlIGFscmVhZHkgYmVlbiBkaXN0cmlidXRlZFxuICAgICAgICAgIDIpIGlmIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBhbHJlYWR5IG93bnMgYSBsb2NrLiBUaGUgbGF0dGVyIGNoZWNrIGlzIGltcG9ydGFudCB0byBlbnN1cmUgdGhlIHNhbWUgZXhlY3V0aW9uIGRvZXNuJ3QgaW5jcmVhc2UgdGhlIGNvdW50ZXIgbW9yZSB0aGFuIG9uY2VcbiAgICAgICAgICBJZiBlaXRoZXIgb2YgdGhlc2UgY29uZGl0aW9ucyBhcmUgbm90IG1ldCwgdGhlbiB0aGUgdGFzayB3aWxsIGZhaWwgd2l0aCBhIER5bmFtb0RCLkNvbmRpdGlvbmFsQ2hlY2tGYWlsZWRFeGNlcHRpb24gZXJyb3IsIHJldHJ5IGEgZmV3IHRpbWVzLCB0aGVuIGlmIGl0IGlzIHN0aWxsIG5vdCBzdWNjZXNzZnVsIFxcXG4gICAgICAgICAgaXQgd2lsbCBtb3ZlIG9mZiB0byBhbm90aGVyIGJyYW5jaCBvZiB0aGUgd29ya2Zsb3cuIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhhdCBhIGdpdmVuIGxvY2tuYW1lIGhhcyBiZWVuIHVzZWQsIHRoZXJlIHdpbGwgbm90IGJlIGEgcm93IGluIER5bmFtb0RCIFxcXG4gICAgICAgICAgc28gdGhlIHVwZGF0ZSB3aWxsIGZhaWwgd2l0aCBEeW5hbW9EQi5BbWF6b25EeW5hbW9EQkV4Y2VwdGlvbi4gSW4gdGhhdCBjYXNlLCB0aGlzIHN0YXRlIHNlbmRzIHRoZSB3b3JrZmxvdyB0byBzdGF0ZSB0aGF0IHdpbGwgY3JlYXRlIHRoYXQgcm93IHRvIGluaXRpYWxpemUuXG4gICAgICAgICAgYCA6IHVuZGVmaW5lZCxcbiAgICAgICAgdGFibGU6IHRoaXMuc2VtYXBob3JlVGFibGUsXG4gICAgICAgIGtleTogeyBMb2NrTmFtZTogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhwcm9wcy5sb2NrTmFtZSkgfSxcbiAgICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzOiB7XG4gICAgICAgICAgJyNjdXJyZW50bG9ja2NvdW50JzogJ2N1cnJlbnRsb2NrY291bnQnLFxuICAgICAgICAgICcjbG9ja293bmVyaWQuJCc6ICckJC5FeGVjdXRpb24uSWQnLFxuICAgICAgICB9LFxuICAgICAgICBleHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICAgJzppbmNyZWFzZSc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21OdW1iZXIoMSksXG4gICAgICAgICAgJzpsaW1pdCc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21OdW1iZXIocHJvcHMubGltaXQpLFxuICAgICAgICAgICc6bG9ja2FjcXVpcmVkdGltZSc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoSnNvblBhdGguc3RyaW5nQXQoJyQkLlN0YXRlLkVudGVyZWRUaW1lJykpLFxuICAgICAgICB9LFxuICAgICAgICB1cGRhdGVFeHByZXNzaW9uOiAnU0VUICNjdXJyZW50bG9ja2NvdW50ID0gI2N1cnJlbnRsb2NrY291bnQgKyA6aW5jcmVhc2UsICNsb2Nrb3duZXJpZCA9IDpsb2NrYWNxdWlyZWR0aW1lJyxcbiAgICAgICAgY29uZGl0aW9uRXhwcmVzc2lvbjogJ2N1cnJlbnRsb2NrY291bnQgPD4gOmxpbWl0IGFuZCBhdHRyaWJ1dGVfbm90X2V4aXN0cygjbG9ja293bmVyaWQpJyxcbiAgICAgICAgcmV0dXJuVmFsdWVzOiBEeW5hbW9SZXR1cm5WYWx1ZXMuVVBEQVRFRF9ORVcsXG4gICAgICAgIHJlc3VsdFBhdGg6ICckLmxvY2tpbmZvLmFjcXVpcmVsb2NrJyxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBjb25zdCBpbml0aWFsaXplTG9ja0l0ZW0gPSBuZXcgRHluYW1vUHV0SXRlbSh0aGlzLCBgSW5pdGlhbGl6ZSAke3Byb3BzLmxvY2tOYW1lfSBMb2NrIEl0ZW06ICR7bG9ja0luZm8udGltZXNVc2VkfWAsIHtcbiAgICAgIGNvbW1lbnQ6IHByb3BzLmNvbW1lbnRzID8gYFRoaXMgc3RhdGUgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBhbiBpdGVtIGhhc24ndCBiZWVuIGNyZWF0ZWQgZm9yIHRoaXMgbG9jayB5ZXQuIFxcXG4gICAgICBJbiB0aGF0IGNhc2UsIGl0IHdpbGwgaW5zZXJ0IGFuIGluaXRpYWwgaXRlbSB0aGF0IGluY2x1ZGVzIHRoZSBsb2NrIG5hbWUgYXMgdGhlIGtleSBhbmQgY3VycmVudGxvY2tjb3VudCBvZiAwLiBcXCBcbiAgICAgIFRoZSBQdXQgdG8gRHluYW1vREIgaW5jbHVkZXMgYSBjb25kaXRvbmFsIGV4cHJlc3Npb24gdG8gZmFpbCBpZiB0aGUgYW4gaXRlbSB3aXRoIHRoYXQga2V5IGFscmVhZHkgZXhpc3RzLCB3aGljaCBhdm9pZHMgYSByYWNlIGNvbmRpdGlvbiBpZiBtdWx0aXBsZSBleGVjdXRpb25zIHN0YXJ0IGF0IHRoZSBzYW1lIHRpbWUuIFxcIFxuICAgICAgVGhlcmUgYXJlIG90aGVyIHJlYXNvbnMgdGhhdCB0aGUgcHJldmlvdXMgc3RhdGUgY291bGQgZmFpbCBhbmQgZW5kIHVwIGhlcmUsIHNvIHRoaXMgaXMgc2FmZSBpbiB0aG9zZSBjYXNlcyB0b28uYCA6IHVuZGVmaW5lZCxcbiAgICAgIHRhYmxlOiB0aGlzLnNlbWFwaG9yZVRhYmxlLFxuICAgICAgaXRlbToge1xuICAgICAgICBMb2NrTmFtZTogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhwcm9wcy5sb2NrTmFtZSksXG4gICAgICAgIGN1cnJlbnRsb2NrY291bnQ6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21OdW1iZXIoMCksXG4gICAgICB9LFxuICAgICAgY29uZGl0aW9uRXhwcmVzc2lvbjogJ0xvY2tOYW1lIDw+IDpsb2NrbmFtZScsXG4gICAgICBleHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICc6bG9ja25hbWUnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKHByb3BzLmxvY2tOYW1lKSxcbiAgICAgIH0sXG4gICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgIH0pO1xuXG4gICAgY29uc3QgZ2V0Q3VycmVudExvY2tSZWNvcmQgPSBuZXcgRHluYW1vR2V0SXRlbSh0aGlzLCBgR2V0IEN1cnJlbnQgJHtwcm9wcy5sb2NrTmFtZX0gTG9jayBSZWNvcmQ6ICR7bG9ja0luZm8udGltZXNVc2VkfWAsIHtcbiAgICAgIGNvbW1lbnQ6IHByb3BzLmNvbW1lbnRzID8gJ1RoaXMgc3RhdGUgaXMgY2FsbGVkIHdoZW4gdGhlIGV4ZWN1dGlvbiBpcyB1bmFibGUgdG8gYWNxdWlyZSBhIGxvY2sgYmVjYXVzZSB0aGVyZSBsaW1pdCBoYXMgZWl0aGVyIGJlZW4gZXhjZWVkZWQgb3IgYmVjYXVzZSB0aGlzIGV4ZWN1dGlvbiBhbHJlYWR5IGhvbGRzIGEgbG9jay4gXFxcbiAgICAgIEluIHRoYXQgY2FzZSwgdGhpcyB0YXNrIGxvYWRzIGluZm8gZnJvbSBEREIgZm9yIHRoZSBjdXJyZW50IGxvY2sgaXRlbSBzbyB0aGF0IHRoZSByaWdodCBkZWNpc2lvbiBjYW4gYmUgbWFkZSBpbiBzdWJzZXF1ZW50IHN0YXRlcy4nOiB1bmRlZmluZWQsXG4gICAgICB0YWJsZTogdGhpcy5zZW1hcGhvcmVUYWJsZSxcbiAgICAgIGtleTogeyBMb2NrTmFtZTogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhwcm9wcy5sb2NrTmFtZSkgfSxcbiAgICAgIGV4cHJlc3Npb25BdHRyaWJ1dGVOYW1lczogeyAnI2xvY2tvd25lcmlkLiQnOiAnJCQuRXhlY3V0aW9uLklkJyB9LFxuICAgICAgcHJvamVjdGlvbkV4cHJlc3Npb246IFtuZXcgRHluYW1vUHJvamVjdGlvbkV4cHJlc3Npb24oKS53aXRoQXR0cmlidXRlKCcjbG9ja293bmVyaWQnKV0sXG4gICAgICByZXN1bHRTZWxlY3Rvcjoge1xuICAgICAgICAnSXRlbS4kJzogJyQuSXRlbScsXG4gICAgICAgICdJdGVtU3RyaW5nLiQnOiAnU3RhdGVzLkpzb25Ub1N0cmluZygkLkl0ZW0pJyxcbiAgICAgIH0sXG4gICAgICByZXN1bHRQYXRoOiAnJC5sb2NraW5mby5jdXJyZW50bG9ja2l0ZW0nLFxuICAgIH0pO1xuICAgIGNvbnN0IGNoZWNrSWZMb2NrQWNxdWlyZWQgPSBuZXcgQ2hvaWNlKHRoaXMsIGBDaGVjayBpZiAke3Byb3BzLmxvY2tOYW1lfSBMb2NrIEFscmVhZHkgQWNxdWlyZWQ6ICR7bG9ja0luZm8udGltZXNVc2VkfWAsIHtcbiAgICAgIGNvbW1lbnQ6IHByb3BzLmNvbW1lbnRzID8gYFRoaXMgc3RhdGUgY2hlY2tzIHRvIHNlZSBpZiB0aGUgY3VycmVudCBleGVjdXRpb24gYWxyZWFkeSBob2xkcyBhIGxvY2suIEl0IGNhbiB0ZWxsIHRoYXQgYnkgbG9va2luZyBmb3IgWiwgd2hpY2ggd2lsbCBiZSBpbmRpY2F0aXZlIG9mIHRoZSB0aW1lc3RhbXAgdmFsdWUuIFxcIFxuICAgICAgVGhhdCB3aWxsIG9ubHkgYmUgdGhlcmUgaW4gdGhlIHN0cmluZ2lmaWVkIHZlcnNpb24gb2YgdGhlIGRhdGEgcmV0dXJuZWQgZnJvbSBEREIgaWYgdGhpcyBleGVjdXRpb24gaG9sZHMgYSBsb2NrLmA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICBjb25zdCBjb250aW51ZUJlY2F1c2VMb2NrV2FzQWxyZWFkeUFjcXVpcmVkID0gbmV3IFBhc3ModGhpcywgYENvbnRpbnVlIEJlY2F1c2UgJHtwcm9wcy5sb2NrTmFtZX0gTG9jayBXYXMgQWxyZWFkeSBBY3F1aXJlZDogJHtsb2NrSW5mby50aW1lc1VzZWR9YCwge1xuICAgICAgY29tbWVudDogcHJvcHMuY29tbWVudHMgPyAnSW4gdGhpcyBzdGF0ZSwgd2UgaGF2ZSBjb25maW1lZCB0aGF0IGxvY2sgaXMgYWxyZWFkeSBoZWxkLCBzbyB3ZSBwYXNzIHRoZSBvcmlnaW5hbCBleGVjdXRpb24gaW5wdXQgaW50byB0aGUgdGhlIGZ1bmN0aW9uIHRoYXQgZG9lcyB0aGUgd29yay4nIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICAgIGNvbnN0IHdhaXRUb0dldExvY2sgPSBuZXcgV2FpdCh0aGlzLCBgV2FpdCB0byBHZXQgJHtwcm9wcy5sb2NrTmFtZX0gTG9jazogJHtsb2NrSW5mby50aW1lc1VzZWR9YCwge1xuICAgICAgY29tbWVudDogcHJvcHMuY29tbWVudHMgPyAnSWYgdGhlIGxvY2sgaW5kZWVkIG5vdCBiZWVuIHN1Y2Nlc2Z1bGx5IEFjcXVpcmVkLCB0aGVuIHdhaXQgZm9yIGEgYml0IGJlZm9yZSB0cnlpbmcgYWdhaW4uJyA6IHVuZGVmaW5lZCxcbiAgICAgIHRpbWU6IFdhaXRUaW1lLmR1cmF0aW9uKER1cmF0aW9uLnNlY29uZHMoMykpLFxuICAgIH0pO1xuICAgIGFjcXVpcmVMb2NrLmFkZFJldHJ5KHsgZXJyb3JzOiBbJ0R5bmFtb0RCLkFtYXpvbkR5bmFtb0RCRXhjZXB0aW9uJ10sIG1heEF0dGVtcHRzOiAwIH0pXG4gICAgICAuYWRkUmV0cnkoeyBtYXhBdHRlbXB0czogNiwgYmFja29mZlJhdGU6IDIgfSlcbiAgICAgIC5hZGRDYXRjaChpbml0aWFsaXplTG9ja0l0ZW0sIHsgZXJyb3JzOiBbJ0R5bmFtb0RCLkFtYXpvbkR5bmFtb0RCRXhjZXB0aW9uJ10sIHJlc3VsdFBhdGg6ICckLmxvY2tpbmZvLmFjcXVpc2l0aW9uZXJyb3InIH0pXG4gICAgICAuYWRkQ2F0Y2goZ2V0Q3VycmVudExvY2tSZWNvcmQsIHsgZXJyb3JzOiBbJ0R5bmFtb0RCLkNvbmRpdGlvbmFsQ2hlY2tGYWlsZWRFeGNlcHRpb24nXSwgcmVzdWx0UGF0aDogJyQubG9ja2luZm8uYWNxdWlzaXRpb25lcnJvcicgfSk7XG4gICAgaW5pdGlhbGl6ZUxvY2tJdGVtLmFkZENhdGNoKGFjcXVpcmVMb2NrLCB7IHJlc3VsdFBhdGg6IEpzb25QYXRoLkRJU0NBUkQgfSk7XG4gICAgZ2V0Q3VycmVudExvY2tSZWNvcmQubmV4dChjaGVja0lmTG9ja0FjcXVpcmVkKTtcbiAgICBjaGVja0lmTG9ja0FjcXVpcmVkLndoZW4oQ29uZGl0aW9uLmFuZChcbiAgICAgIENvbmRpdGlvbi5pc1ByZXNlbnQoJyQubG9ja2luZm8uY3VycmVudGxvY2tpdGVtLkl0ZW1TdHJpbmcnKSxcbiAgICAgIENvbmRpdGlvbi5zdHJpbmdNYXRjaGVzKCckLmxvY2tpbmZvLmN1cnJlbnRsb2NraXRlbS5JdGVtU3RyaW5nJywgJypaJykpLCBjb250aW51ZUJlY2F1c2VMb2NrV2FzQWxyZWFkeUFjcXVpcmVkLFxuICAgICk7XG4gICAgY2hlY2tJZkxvY2tBY3F1aXJlZC5vdGhlcndpc2Uod2FpdFRvR2V0TG9jayk7XG4gICAgd2FpdFRvR2V0TG9jay5uZXh0KGFjcXVpcmVMb2NrKTtcblxuICAgIGNvbnN0IHJlbGVhc2VMb2NrID0gbmV3IER5bmFtb1VwZGF0ZUl0ZW0odGhpcywgYFJlbGVhc2UgJHtwcm9wcy5sb2NrTmFtZX0gTG9jazogJHtsb2NrSW5mby50aW1lc1VzZWR9YCwge1xuICAgICAgdGFibGU6IHRoaXMuc2VtYXBob3JlVGFibGUsXG4gICAgICBrZXk6IHsgTG9ja05hbWU6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcocHJvcHMubG9ja05hbWUpIH0sXG4gICAgICBleHByZXNzaW9uQXR0cmlidXRlTmFtZXM6IHtcbiAgICAgICAgJyNjdXJyZW50bG9ja2NvdW50JzogJ2N1cnJlbnRsb2NrY291bnQnLFxuICAgICAgICAnI2xvY2tvd25lcmlkLiQnOiAnJCQuRXhlY3V0aW9uLklkJyxcbiAgICAgIH0sXG4gICAgICBleHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICc6ZGVjcmVhc2UnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tTnVtYmVyKDEpLFxuICAgICAgfSxcbiAgICAgIHVwZGF0ZUV4cHJlc3Npb246ICdTRVQgI2N1cnJlbnRsb2NrY291bnQgPSAjY3VycmVudGxvY2tjb3VudCAtIDpkZWNyZWFzZSBSRU1PVkUgI2xvY2tvd25lcmlkJyxcbiAgICAgIGNvbmRpdGlvbkV4cHJlc3Npb246ICdhdHRyaWJ1dGVfZXhpc3RzKCNsb2Nrb3duZXJpZCknLFxuICAgICAgcmV0dXJuVmFsdWVzOiBEeW5hbW9SZXR1cm5WYWx1ZXMuVVBEQVRFRF9ORVcsXG4gICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgIH0pO1xuXG4gICAgcmVsZWFzZUxvY2suYWRkUmV0cnkoeyBlcnJvcnM6IFsnRHluYW1vREIuQ29uZGl0aW9uYWxDaGVja0ZhaWxlZEV4Y2VwdGlvbiddLCBtYXhBdHRlbXB0czogMCB9KVxuICAgICAgLmFkZFJldHJ5KHsgbWF4QXR0ZW1wdHM6IDUsIGJhY2tvZmZSYXRlOiAxLjUgfSlcbiAgICAgIC5hZGRDYXRjaChwcm9wcy5uZXh0U3RhdGUsIHsgZXJyb3JzOiBbJ0R5bmFtb0RCLkNvbmRpdGlvbmFsQ2hlY2tGYWlsZWRFeGNlcHRpb24nXSwgcmVzdWx0UGF0aDogJyQubG9ja2luZm8uYWNxdWlzaXRpb25lcnJvcicgfSlcbiAgICAgIC5uZXh0KHByb3BzLm5leHRTdGF0ZSk7XG4gICAgZ2V0TG9jay5icmFuY2goYWNxdWlyZUxvY2spO1xuICAgIGdldExvY2suZW5kU3RhdGVzLmZvckVhY2goaiA9PiBqLm5leHQocHJvcHMuam9iKSk7XG4gICAgcHJvcHMuam9iLm5leHQocmVsZWFzZUxvY2spO1xuXG4gICAgdGhpcy5zdGFydFN0YXRlID0gZ2V0TG9jaztcbiAgICB0aGlzLmVuZFN0YXRlcyA9IHByb3BzLm5leHRTdGF0ZS5lbmRTdGF0ZXM7XG4gIH1cblxuICBwcml2YXRlIHNldFVwTWFwKCk6IE1hcDxzdHJpbmcsIFVzYWdlVHJhY2tlcj4ge1xuICAgIGNvbnN0IHN0YWNrSWQgPSBOYW1lcy51bmlxdWVJZChTdGFjay5vZih0aGlzKSk7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBTdGFjay5vZih0aGlzKS5ub2RlLnRyeUZpbmRDaGlsZCh0aGlzLnRhYmxlTmFtZSk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICByZXR1cm4gPE1hcDxzdHJpbmcsIFVzYWdlVHJhY2tlcj4+KFNlbWFwaG9yZS5zZW1hcGhvcmVUcmFja2VyLmdldChzdGFja0lkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG0gPSBuZXcgTWFwPHN0cmluZywgVXNhZ2VUcmFja2VyPigpO1xuICAgICAgU2VtYXBob3JlLnNlbWFwaG9yZVRyYWNrZXIuc2V0KHN0YWNrSWQsIG0pO1xuICAgICAgcmV0dXJuIG07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVUYWJsZShwcm9wczogU2VtYXBob3JlUHJvcHMpOiBUYWJsZSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBTdGFjay5vZih0aGlzKS5ub2RlLnRyeUZpbmRDaGlsZCh0aGlzLnRhYmxlTmFtZSk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAvLyBKdXN0IGFzc3VtZSB0aGlzIGlzIHRydWVcbiAgICAgIHJldHVybiBleGlzdGluZyBhcyBUYWJsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBUYWJsZShTdGFjay5vZih0aGlzKSwgdGhpcy50YWJsZU5hbWUsIHtcbiAgICAgICAgcGFydGl0aW9uS2V5OiB7XG4gICAgICAgICAgbmFtZTogJ0xvY2tOYW1lJyxcbiAgICAgICAgICB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVhZENhcGFjaXR5OiBwcm9wcy50YWJsZVJlYWRXcml0ZUNhcGFjaXR5Py5yZWFkQ2FwYWNpdHksXG4gICAgICAgIHdyaXRlQ2FwYWNpdHk6IHByb3BzLnRhYmxlUmVhZFdyaXRlQ2FwYWNpdHk/LndyaXRlQ2FwYWNpdHksXG4gICAgICAgIGJpbGxpbmdNb2RlOiBwcm9wcy50YWJsZVJlYWRXcml0ZUNhcGFjaXR5ID8gQmlsbGluZ01vZGUuUFJPVklTSU9ORUQgOiBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
184
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBcUQ7QUFDckQsMkRBQTZFO0FBQzdFLHFFQUFnSztBQUNoSyxpRkFBMks7QUF3RDNLOztHQUVHO0FBQ0gsTUFBYSxTQUFVLFNBQVEsd0NBQW9CO0lBb0JqRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXFCO1FBQzdELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFWbkI7O1dBRUc7UUFDSyxjQUFTLEdBQUcsNERBQTRELENBQUM7UUFRL0UsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxJQUFJLFFBQVEsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxJQUFJLFFBQVEsRUFBRTtZQUNaLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRTtnQkFDbkIsSUFBSSxRQUFRLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7b0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLEtBQUssQ0FBQyxRQUFRLHFFQUFxRSxLQUFLLENBQUMsS0FBSyxlQUFlLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2lCQUM3SztxQkFBTTtvQkFDTCxRQUFRLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDeEUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2lCQUM1QzthQUNGO2lCQUFNO2dCQUNMLE1BQU0sSUFB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QUFDLHNCQUFzQixFQUFFLGFBQWE7Z0JBQzFELFdBQVcsRUFBRSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLDBCQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQywwQkFBVyxDQUFDLGVBQWU7YUFDbEcsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDOztBQXhMSCw4QkF5TEM7OztBQXZMQzs7R0FFRztBQUNZLDBCQUFnQixHQUFHLElBQUksR0FBRyxFQUFxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24sIE5hbWVzLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IFRhYmxlLCBCaWxsaW5nTW9kZSwgQXR0cmlidXRlVHlwZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1keW5hbW9kYic7XG5pbXBvcnQgeyBQYXJhbGxlbCwgU3RhdGVNYWNoaW5lRnJhZ21lbnQsIEpzb25QYXRoLCBDaG9pY2UsIFBhc3MsIFdhaXQsIFdhaXRUaW1lLCBDb25kaXRpb24sIFN0YXRlLCBJQ2hhaW5hYmxlLCBJTmV4dGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9ucyc7XG5pbXBvcnQgeyBEeW5hbW9BdHRyaWJ1dGVWYWx1ZSwgRHluYW1vR2V0SXRlbSwgRHluYW1vUHJvamVjdGlvbkV4cHJlc3Npb24sIER5bmFtb1B1dEl0ZW0sIER5bmFtb1JldHVyblZhbHVlcywgRHluYW1vVXBkYXRlSXRlbSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zLXRhc2tzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBjcmVhdGluZyBhIFNlbWFwaG9yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbWFwaG9yZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzZW1hcGhvcmUuXG4gICAqL1xuICByZWFkb25seSBsb2NrTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgZXhlY3V0aW9ucyBmb3IgdGhlIGdpdmVuIGxvY2suXG4gICAqL1xuICByZWFkb25seSBsaW1pdDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGpvYiAob3IgY2hhaW5lZCBqb2JzKSB0byBiZSBzZW1hcGhvcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgam9iOiBJQ2hhaW5OZXh0YWJsZTtcbiAgLyoqXG4gICAqIFRoZSBTdGF0ZSB0byBnbyB0byBhZnRlciB0aGUgc2VtYXBob3JlZCBqb2IgY29tcGxldGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV4dFN0YXRlOiBTdGF0ZTtcbiAgLyoqXG4gICAqICBFeHBsaWNpbGl0eSBhbGxvdyB0aGUgcmV1c2Ugb2YgYSBuYW1lZCBsb2NrIGZyb20gYSBwcmV2aW91c2x5IGdlbmVyYXRlZCBqb2IuIFRocm93cyBhbiBlcnJvciBpZiBhIGRpZmZlcmVudCBgbGltaXRgIGlzIHNwZWNpZmllZC4gRGVmYXVsdDogZmFsc2UuXG4gICAqL1xuICByZWFkb25seSByZXVzZUxvY2s/OiBib29sZWFuO1xuICAvKipcbiAgICogQWRkIGRldGFpbGVkIGNvbW1lbnRzIHRvIGxvY2sgcmVsYXRlZCBzdGF0ZXMuIFNpZ25pZmljYW50bHkgaW5jcmVhc2VzIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlIHNpemUuIERlZmF1bHQ6IGZhbHNlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWVudHM/OiBib29sZWFuO1xuICAvKipcbiAgICogT3B0aW9uYWxseSBzZXQgdGhlIER5bmFtb0RCIHRhYmxlIHRvIGhhdmUgYSBzcGVjaWZpYyByZWFkL3dyaXRlIGNhcGFjaXR5IHdpdGggUFJPVklTSU9ORUQgYmlsbGluZy5cbiAgICogTm90ZTogVGhpcyBwcm9wZXJ0eSBjYW4gb25seSBiZSBzZXQgb24gdGhlIGZpcnN0IGluc3RhbnRpYXRpb24gb2YgYSBgU2VtYXBob3JlYCBwZXIgc3RhY2tcbiAgICogQGRlZmF1bHQgUEFZX1BFUl9SRVFVRVNUXG4gICAqL1xuICByZWFkb25seSB0YWJsZVJlYWRXcml0ZUNhcGFjaXR5PzogVGFibGVSZWFkV3JpdGVDYXBhY2l0eTtcbn1cblxuLyoqXG4gKiBSZWFkIGFuZCB3cml0ZSBjYXBhY2l0eSBmb3IgYSBQUk9WSVNJT05FRCBiaWxsaW5nIER5bmFtb0RCIHRhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlUmVhZFdyaXRlQ2FwYWNpdHkge1xuICByZWFkb25seSByZWFkQ2FwYWNpdHk6IG51bWJlcjtcbiAgcmVhZG9ubHkgd3JpdGVDYXBhY2l0eTogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVXNhZ2VUcmFja2VyIHtcbiAgcmVhZG9ubHkgbGltaXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgdGltZXNVc2VkOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNoYWluTmV4dGFibGUgZXh0ZW5kcyBJQ2hhaW5hYmxlLCBJTmV4dGFibGUgeyB9XG5cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBzZW1hcGhvcmUgZm9yIGEgU3RlcEZ1bmN0aW9uIGpvYiAob3IgY2hhaW5lZCBzZXQgb2Ygam9icykgdG8gbGltaXQgcGFyYWxsZWxpc20gYWNyb3NzIGV4ZWN1dGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZW1hcGhvcmUgZXh0ZW5kcyBTdGF0ZU1hY2hpbmVGcmFnbWVudCB7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lcyBhbmQgYXNzb2NpYXRlZCBjb25jdXJyZW5jeSBsaW1pdHMgYW5kIG51bWJlciBvZiB1c2VzIG9mIHRoZSBzZW1wYWhvcmVzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgc2VtYXBob3JlVHJhY2tlciA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBVc2FnZVRyYWNrZXI+PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgRHluYW1vREIgdGFibGUgdXNlZCB0byBzdG9yZSBzZW1hcGhvcmVzLlxuICAgKi9cbiAgcHJpdmF0ZSBzZW1hcGhvcmVUYWJsZTogVGFibGU7XG4gIC8qKlxuICAgKiBUaGUgRHluYW1vREIgdGFibGUgdXNlZCB0byBzdG9yZSBzZW1hcGhvcmVzLlxuICAgKi9cbiAgcHJpdmF0ZSB0YWJsZU5hbWUgPSAnU3RhdGVNYWNoaW5lU2VtcGFob3JlVGFibGU5MjA3NTFhNjVhNTg0ZThhYjc1ODM0NjBmNmRiNjg2YSc7XG5cbiAgcHVibGljIHJlYWRvbmx5IHN0YXJ0U3RhdGU6IFN0YXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgZW5kU3RhdGVzOiBJTmV4dGFibGVbXTtcblxuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTZW1hcGhvcmVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgY29uc3Qgc3RhY2tUcmFja2VyID0gdGhpcy5zZXRVcE1hcCgpO1xuICAgIHRoaXMuc2VtYXBob3JlVGFibGUgPSB0aGlzLmVuc3VyZVRhYmxlKHByb3BzKTtcbiAgICBsZXQgbG9ja0luZm8gPSBzdGFja1RyYWNrZXIuZ2V0KHByb3BzLmxvY2tOYW1lKTtcbiAgICBpZiAobG9ja0luZm8pIHtcbiAgICAgIGlmIChwcm9wcy5yZXVzZUxvY2spIHtcbiAgICAgICAgaWYgKGxvY2tJbmZvLmxpbWl0ICE9IHByb3BzLmxpbWl0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcmV1c2VkIFxcYGxvY2tOYW1lXFxgIFwiJHtwcm9wcy5sb2NrTmFtZX1cIiB3YXMgZ2l2ZW4gYSBkaWZmZXJlbnQgXFxgbGltaXRcXGAgdGhhbiBwcmV2aW91c2x5IGRlZmluZWQuIEdpdmVuOiAke3Byb3BzLmxpbWl0fSwgUHJldmlvdXM6ICR7bG9ja0luZm8ubGltaXR9LmApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvY2tJbmZvID0geyBsaW1pdDogbG9ja0luZm8ubGltaXQsIHRpbWVzVXNlZDogbG9ja0luZm8udGltZXNVc2VkICsgMSB9O1xuICAgICAgICAgIHN0YWNrVHJhY2tlci5zZXQocHJvcHMubG9ja05hbWUsIGxvY2tJbmZvKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgXFxgbG9ja05hbWVcXGAgXCIke3Byb3BzLmxvY2tOYW1lfVwiIHdhcyByZXVzZWQgd2l0aG91dCBleHBsaWNpdGx5IGFsbG93aW5nIHJldXNlLiBTZXQgXFxgcmV1c2VMb2NrXFxgIHRvIFxcYHRydWVcXGAgaWYgeW91IHdhbnQgdG8gcmV1c2UgdGhlIGxvY2suYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvY2tJbmZvID0geyBsaW1pdDogcHJvcHMubGltaXQsIHRpbWVzVXNlZDogMSB9O1xuICAgICAgc3RhY2tUcmFja2VyLnNldChwcm9wcy5sb2NrTmFtZSwgbG9ja0luZm8pO1xuICAgIH1cblxuICAgIGNvbnN0IGdldExvY2sgPSBuZXcgUGFyYWxsZWwodGhpcywgYEdldCAke3Byb3BzLmxvY2tOYW1lfSBMb2NrOiAke2xvY2tJbmZvLnRpbWVzVXNlZH1gLCB7IHJlc3VsdFBhdGg6IEpzb25QYXRoLkRJU0NBUkQgfSk7XG4gICAgY29uc3QgYWNxdWlyZUxvY2sgPSBuZXcgRHluYW1vVXBkYXRlSXRlbSh0aGlzLCBgQWNxdWlyZSAke3Byb3BzLmxvY2tOYW1lfSBMb2NrOiAke2xvY2tJbmZvLnRpbWVzVXNlZH1gLFxuICAgICAge1xuICAgICAgICBjb21tZW50OiBwcm9wcy5jb21tZW50cyA/IGBBY3F1aXJlIGEgbG9jayB1c2luZyBhIGNvbmRpdGlvbmFsIHVwZGF0ZSB0byBEeW5hbW9EQi4gVGhpcyB1cGRhdGUgd2lsbCBkbyB0d28gdGhpbmdzOlxuICAgICAgICAgIDEpIGluY3JlbWVudCBhIGNvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2YgaGVsZCBsb2Nrc1xuICAgICAgICAgIDIpIGFkZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIER5bmFtb0RCIEl0ZW0gd2l0aCBhIHVuaXF1ZSBrZXkgZm9yIHRoaXMgZXhlY3V0aW9uIGFuZCB3aXRoIGEgdmFsdWUgb2YgdGhlIHRpbWUgd2hlbiB0aGUgbG9jayB3YXMgQWNxdWlyZWRcbiAgICAgICAgICBUaGUgVXBkYXRlIGluY2x1ZGVzIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiB0aGF0IHdpbGwgZmFpbCB1bmRlciB0d28gY2lyY3Vtc3RhbmNlczpcbiAgICAgICAgICAxKSBpZiB0aGUgbWF4aW11bSBudW1iZXIgb2YgbG9ja3MgaGF2ZSBhbHJlYWR5IGJlZW4gZGlzdHJpYnV0ZWRcbiAgICAgICAgICAyKSBpZiB0aGUgY3VycmVudCBleGVjdXRpb24gYWxyZWFkeSBvd25zIGEgbG9jay4gVGhlIGxhdHRlciBjaGVjayBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoZSBzYW1lIGV4ZWN1dGlvbiBkb2Vzbid0IGluY3JlYXNlIHRoZSBjb3VudGVyIG1vcmUgdGhhbiBvbmNlXG4gICAgICAgICAgSWYgZWl0aGVyIG9mIHRoZXNlIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIHRoZW4gdGhlIHRhc2sgd2lsbCBmYWlsIHdpdGggYSBEeW5hbW9EQi5Db25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIGVycm9yLCByZXRyeSBhIGZldyB0aW1lcywgdGhlbiBpZiBpdCBpcyBzdGlsbCBub3Qgc3VjY2Vzc2Z1bCBcXFxuICAgICAgICAgIGl0IHdpbGwgbW92ZSBvZmYgdG8gYW5vdGhlciBicmFuY2ggb2YgdGhlIHdvcmtmbG93LiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoYXQgYSBnaXZlbiBsb2NrbmFtZSBoYXMgYmVlbiB1c2VkLCB0aGVyZSB3aWxsIG5vdCBiZSBhIHJvdyBpbiBEeW5hbW9EQiBcXFxuICAgICAgICAgIHNvIHRoZSB1cGRhdGUgd2lsbCBmYWlsIHdpdGggRHluYW1vREIuQW1hem9uRHluYW1vREJFeGNlcHRpb24uIEluIHRoYXQgY2FzZSwgdGhpcyBzdGF0ZSBzZW5kcyB0aGUgd29ya2Zsb3cgdG8gc3RhdGUgdGhhdCB3aWxsIGNyZWF0ZSB0aGF0IHJvdyB0byBpbml0aWFsaXplLlxuICAgICAgICAgIGAgOiB1bmRlZmluZWQsXG4gICAgICAgIHRhYmxlOiB0aGlzLnNlbWFwaG9yZVRhYmxlLFxuICAgICAgICBrZXk6IHsgTG9ja05hbWU6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcocHJvcHMubG9ja05hbWUpIH0sXG4gICAgICAgIGV4cHJlc3Npb25BdHRyaWJ1dGVOYW1lczoge1xuICAgICAgICAgICcjY3VycmVudGxvY2tjb3VudCc6ICdjdXJyZW50bG9ja2NvdW50JyxcbiAgICAgICAgICAnI2xvY2tvd25lcmlkLiQnOiAnJCQuRXhlY3V0aW9uLklkJyxcbiAgICAgICAgfSxcbiAgICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICc6aW5jcmVhc2UnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tTnVtYmVyKDEpLFxuICAgICAgICAgICc6bGltaXQnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tTnVtYmVyKHByb3BzLmxpbWl0KSxcbiAgICAgICAgICAnOmxvY2thY3F1aXJlZHRpbWUnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckJC5TdGF0ZS5FbnRlcmVkVGltZScpKSxcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCAjY3VycmVudGxvY2tjb3VudCA9ICNjdXJyZW50bG9ja2NvdW50ICsgOmluY3JlYXNlLCAjbG9ja293bmVyaWQgPSA6bG9ja2FjcXVpcmVkdGltZScsXG4gICAgICAgIGNvbmRpdGlvbkV4cHJlc3Npb246ICdjdXJyZW50bG9ja2NvdW50IDw+IDpsaW1pdCBhbmQgYXR0cmlidXRlX25vdF9leGlzdHMoI2xvY2tvd25lcmlkKScsXG4gICAgICAgIHJldHVyblZhbHVlczogRHluYW1vUmV0dXJuVmFsdWVzLlVQREFURURfTkVXLFxuICAgICAgICByZXN1bHRQYXRoOiAnJC5sb2NraW5mby5hY3F1aXJlbG9jaycsXG4gICAgICB9LFxuICAgICk7XG4gICAgY29uc3QgaW5pdGlhbGl6ZUxvY2tJdGVtID0gbmV3IER5bmFtb1B1dEl0ZW0odGhpcywgYEluaXRpYWxpemUgJHtwcm9wcy5sb2NrTmFtZX0gTG9jayBJdGVtOiAke2xvY2tJbmZvLnRpbWVzVXNlZH1gLCB7XG4gICAgICBjb21tZW50OiBwcm9wcy5jb21tZW50cyA/IGBUaGlzIHN0YXRlIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgYW4gaXRlbSBoYXNuJ3QgYmVlbiBjcmVhdGVkIGZvciB0aGlzIGxvY2sgeWV0LiBcXFxuICAgICAgSW4gdGhhdCBjYXNlLCBpdCB3aWxsIGluc2VydCBhbiBpbml0aWFsIGl0ZW0gdGhhdCBpbmNsdWRlcyB0aGUgbG9jayBuYW1lIGFzIHRoZSBrZXkgYW5kIGN1cnJlbnRsb2NrY291bnQgb2YgMC4gXFwgXG4gICAgICBUaGUgUHV0IHRvIER5bmFtb0RCIGluY2x1ZGVzIGEgY29uZGl0b25hbCBleHByZXNzaW9uIHRvIGZhaWwgaWYgdGhlIGFuIGl0ZW0gd2l0aCB0aGF0IGtleSBhbHJlYWR5IGV4aXN0cywgd2hpY2ggYXZvaWRzIGEgcmFjZSBjb25kaXRpb24gaWYgbXVsdGlwbGUgZXhlY3V0aW9ucyBzdGFydCBhdCB0aGUgc2FtZSB0aW1lLiBcXCBcbiAgICAgIFRoZXJlIGFyZSBvdGhlciByZWFzb25zIHRoYXQgdGhlIHByZXZpb3VzIHN0YXRlIGNvdWxkIGZhaWwgYW5kIGVuZCB1cCBoZXJlLCBzbyB0aGlzIGlzIHNhZmUgaW4gdGhvc2UgY2FzZXMgdG9vLmAgOiB1bmRlZmluZWQsXG4gICAgICB0YWJsZTogdGhpcy5zZW1hcGhvcmVUYWJsZSxcbiAgICAgIGl0ZW06IHtcbiAgICAgICAgTG9ja05hbWU6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcocHJvcHMubG9ja05hbWUpLFxuICAgICAgICBjdXJyZW50bG9ja2NvdW50OiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tTnVtYmVyKDApLFxuICAgICAgfSxcbiAgICAgIGNvbmRpdGlvbkV4cHJlc3Npb246ICdMb2NrTmFtZSA8PiA6bG9ja25hbWUnLFxuICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAnOmxvY2tuYW1lJzogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhwcm9wcy5sb2NrTmFtZSksXG4gICAgICB9LFxuICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICB9KTtcblxuICAgIGNvbnN0IGdldEN1cnJlbnRMb2NrUmVjb3JkID0gbmV3IER5bmFtb0dldEl0ZW0odGhpcywgYEdldCBDdXJyZW50ICR7cHJvcHMubG9ja05hbWV9IExvY2sgUmVjb3JkOiAke2xvY2tJbmZvLnRpbWVzVXNlZH1gLCB7XG4gICAgICBjb21tZW50OiBwcm9wcy5jb21tZW50cyA/ICdUaGlzIHN0YXRlIGlzIGNhbGxlZCB3aGVuIHRoZSBleGVjdXRpb24gaXMgdW5hYmxlIHRvIGFjcXVpcmUgYSBsb2NrIGJlY2F1c2UgdGhlcmUgbGltaXQgaGFzIGVpdGhlciBiZWVuIGV4Y2VlZGVkIG9yIGJlY2F1c2UgdGhpcyBleGVjdXRpb24gYWxyZWFkeSBob2xkcyBhIGxvY2suIFxcXG4gICAgICBJbiB0aGF0IGNhc2UsIHRoaXMgdGFzayBsb2FkcyBpbmZvIGZyb20gRERCIGZvciB0aGUgY3VycmVudCBsb2NrIGl0ZW0gc28gdGhhdCB0aGUgcmlnaHQgZGVjaXNpb24gY2FuIGJlIG1hZGUgaW4gc3Vic2VxdWVudCBzdGF0ZXMuJzogdW5kZWZpbmVkLFxuICAgICAgdGFibGU6IHRoaXMuc2VtYXBob3JlVGFibGUsXG4gICAgICBrZXk6IHsgTG9ja05hbWU6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcocHJvcHMubG9ja05hbWUpIH0sXG4gICAgICBleHByZXNzaW9uQXR0cmlidXRlTmFtZXM6IHsgJyNsb2Nrb3duZXJpZC4kJzogJyQkLkV4ZWN1dGlvbi5JZCcgfSxcbiAgICAgIHByb2plY3Rpb25FeHByZXNzaW9uOiBbbmV3IER5bmFtb1Byb2plY3Rpb25FeHByZXNzaW9uKCkud2l0aEF0dHJpYnV0ZSgnI2xvY2tvd25lcmlkJyldLFxuICAgICAgcmVzdWx0U2VsZWN0b3I6IHtcbiAgICAgICAgJ0l0ZW0uJCc6ICckLkl0ZW0nLFxuICAgICAgICAnSXRlbVN0cmluZy4kJzogJ1N0YXRlcy5Kc29uVG9TdHJpbmcoJC5JdGVtKScsXG4gICAgICB9LFxuICAgICAgcmVzdWx0UGF0aDogJyQubG9ja2luZm8uY3VycmVudGxvY2tpdGVtJyxcbiAgICB9KTtcbiAgICBjb25zdCBjaGVja0lmTG9ja0FjcXVpcmVkID0gbmV3IENob2ljZSh0aGlzLCBgQ2hlY2sgaWYgJHtwcm9wcy5sb2NrTmFtZX0gTG9jayBBbHJlYWR5IEFjcXVpcmVkOiAke2xvY2tJbmZvLnRpbWVzVXNlZH1gLCB7XG4gICAgICBjb21tZW50OiBwcm9wcy5jb21tZW50cyA/IGBUaGlzIHN0YXRlIGNoZWNrcyB0byBzZWUgaWYgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGFscmVhZHkgaG9sZHMgYSBsb2NrLiBJdCBjYW4gdGVsbCB0aGF0IGJ5IGxvb2tpbmcgZm9yIFosIHdoaWNoIHdpbGwgYmUgaW5kaWNhdGl2ZSBvZiB0aGUgdGltZXN0YW1wIHZhbHVlLiBcXCBcbiAgICAgIFRoYXQgd2lsbCBvbmx5IGJlIHRoZXJlIGluIHRoZSBzdHJpbmdpZmllZCB2ZXJzaW9uIG9mIHRoZSBkYXRhIHJldHVybmVkIGZyb20gRERCIGlmIHRoaXMgZXhlY3V0aW9uIGhvbGRzIGEgbG9jay5gOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgY29uc3QgY29udGludWVCZWNhdXNlTG9ja1dhc0FscmVhZHlBY3F1aXJlZCA9IG5ldyBQYXNzKHRoaXMsIGBDb250aW51ZSBCZWNhdXNlICR7cHJvcHMubG9ja05hbWV9IExvY2sgV2FzIEFscmVhZHkgQWNxdWlyZWQ6ICR7bG9ja0luZm8udGltZXNVc2VkfWAsIHtcbiAgICAgIGNvbW1lbnQ6IHByb3BzLmNvbW1lbnRzID8gJ0luIHRoaXMgc3RhdGUsIHdlIGhhdmUgY29uZmltZWQgdGhhdCBsb2NrIGlzIGFscmVhZHkgaGVsZCwgc28gd2UgcGFzcyB0aGUgb3JpZ2luYWwgZXhlY3V0aW9uIGlucHV0IGludG8gdGhlIHRoZSBmdW5jdGlvbiB0aGF0IGRvZXMgdGhlIHdvcmsuJyA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICBjb25zdCB3YWl0VG9HZXRMb2NrID0gbmV3IFdhaXQodGhpcywgYFdhaXQgdG8gR2V0ICR7cHJvcHMubG9ja05hbWV9IExvY2s6ICR7bG9ja0luZm8udGltZXNVc2VkfWAsIHtcbiAgICAgIGNvbW1lbnQ6IHByb3BzLmNvbW1lbnRzID8gJ0lmIHRoZSBsb2NrIGluZGVlZCBub3QgYmVlbiBzdWNjZXNmdWxseSBBY3F1aXJlZCwgdGhlbiB3YWl0IGZvciBhIGJpdCBiZWZvcmUgdHJ5aW5nIGFnYWluLicgOiB1bmRlZmluZWQsXG4gICAgICB0aW1lOiBXYWl0VGltZS5kdXJhdGlvbihEdXJhdGlvbi5zZWNvbmRzKDMpKSxcbiAgICB9KTtcbiAgICBhY3F1aXJlTG9jay5hZGRSZXRyeSh7IGVycm9yczogWydEeW5hbW9EQi5BbWF6b25EeW5hbW9EQkV4Y2VwdGlvbiddLCBtYXhBdHRlbXB0czogMCB9KVxuICAgICAgLmFkZFJldHJ5KHsgbWF4QXR0ZW1wdHM6IDYsIGJhY2tvZmZSYXRlOiAyIH0pXG4gICAgICAuYWRkQ2F0Y2goaW5pdGlhbGl6ZUxvY2tJdGVtLCB7IGVycm9yczogWydEeW5hbW9EQi5BbWF6b25EeW5hbW9EQkV4Y2VwdGlvbiddLCByZXN1bHRQYXRoOiAnJC5sb2NraW5mby5hY3F1aXNpdGlvbmVycm9yJyB9KVxuICAgICAgLmFkZENhdGNoKGdldEN1cnJlbnRMb2NrUmVjb3JkLCB7IGVycm9yczogWydEeW5hbW9EQi5Db25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uJ10sIHJlc3VsdFBhdGg6ICckLmxvY2tpbmZvLmFjcXVpc2l0aW9uZXJyb3InIH0pO1xuICAgIGluaXRpYWxpemVMb2NrSXRlbS5hZGRDYXRjaChhY3F1aXJlTG9jaywgeyByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJEIH0pO1xuICAgIGdldEN1cnJlbnRMb2NrUmVjb3JkLm5leHQoY2hlY2tJZkxvY2tBY3F1aXJlZCk7XG4gICAgY2hlY2tJZkxvY2tBY3F1aXJlZC53aGVuKENvbmRpdGlvbi5hbmQoXG4gICAgICBDb25kaXRpb24uaXNQcmVzZW50KCckLmxvY2tpbmZvLmN1cnJlbnRsb2NraXRlbS5JdGVtU3RyaW5nJyksXG4gICAgICBDb25kaXRpb24uc3RyaW5nTWF0Y2hlcygnJC5sb2NraW5mby5jdXJyZW50bG9ja2l0ZW0uSXRlbVN0cmluZycsICcqWicpKSwgY29udGludWVCZWNhdXNlTG9ja1dhc0FscmVhZHlBY3F1aXJlZCxcbiAgICApO1xuICAgIGNoZWNrSWZMb2NrQWNxdWlyZWQub3RoZXJ3aXNlKHdhaXRUb0dldExvY2spO1xuICAgIHdhaXRUb0dldExvY2submV4dChhY3F1aXJlTG9jayk7XG5cbiAgICBjb25zdCByZWxlYXNlTG9jayA9IG5ldyBEeW5hbW9VcGRhdGVJdGVtKHRoaXMsIGBSZWxlYXNlICR7cHJvcHMubG9ja05hbWV9IExvY2s6ICR7bG9ja0luZm8udGltZXNVc2VkfWAsIHtcbiAgICAgIHRhYmxlOiB0aGlzLnNlbWFwaG9yZVRhYmxlLFxuICAgICAga2V5OiB7IExvY2tOYW1lOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKHByb3BzLmxvY2tOYW1lKSB9LFxuICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzOiB7XG4gICAgICAgICcjY3VycmVudGxvY2tjb3VudCc6ICdjdXJyZW50bG9ja2NvdW50JyxcbiAgICAgICAgJyNsb2Nrb3duZXJpZC4kJzogJyQkLkV4ZWN1dGlvbi5JZCcsXG4gICAgICB9LFxuICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAnOmRlY3JlYXNlJzogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbU51bWJlcigxKSxcbiAgICAgIH0sXG4gICAgICB1cGRhdGVFeHByZXNzaW9uOiAnU0VUICNjdXJyZW50bG9ja2NvdW50ID0gI2N1cnJlbnRsb2NrY291bnQgLSA6ZGVjcmVhc2UgUkVNT1ZFICNsb2Nrb3duZXJpZCcsXG4gICAgICBjb25kaXRpb25FeHByZXNzaW9uOiAnYXR0cmlidXRlX2V4aXN0cygjbG9ja293bmVyaWQpJyxcbiAgICAgIHJldHVyblZhbHVlczogRHluYW1vUmV0dXJuVmFsdWVzLlVQREFURURfTkVXLFxuICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICB9KTtcblxuICAgIHJlbGVhc2VMb2NrLmFkZFJldHJ5KHsgZXJyb3JzOiBbJ0R5bmFtb0RCLkNvbmRpdGlvbmFsQ2hlY2tGYWlsZWRFeGNlcHRpb24nXSwgbWF4QXR0ZW1wdHM6IDAgfSlcbiAgICAgIC5hZGRSZXRyeSh7IG1heEF0dGVtcHRzOiA1LCBiYWNrb2ZmUmF0ZTogMS41IH0pXG4gICAgICAuYWRkQ2F0Y2gocHJvcHMubmV4dFN0YXRlLCB7IGVycm9yczogWydEeW5hbW9EQi5Db25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uJ10sIHJlc3VsdFBhdGg6ICckLmxvY2tpbmZvLmFjcXVpc2l0aW9uZXJyb3InIH0pXG4gICAgICAubmV4dChwcm9wcy5uZXh0U3RhdGUpO1xuICAgIGdldExvY2suYnJhbmNoKGFjcXVpcmVMb2NrKTtcbiAgICBnZXRMb2NrLmVuZFN0YXRlcy5mb3JFYWNoKGogPT4gai5uZXh0KHByb3BzLmpvYikpO1xuICAgIHByb3BzLmpvYi5uZXh0KHJlbGVhc2VMb2NrKTtcblxuICAgIHRoaXMuc3RhcnRTdGF0ZSA9IGdldExvY2s7XG4gICAgdGhpcy5lbmRTdGF0ZXMgPSBwcm9wcy5uZXh0U3RhdGUuZW5kU3RhdGVzO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRVcE1hcCgpOiBNYXA8c3RyaW5nLCBVc2FnZVRyYWNrZXI+IHtcbiAgICBjb25zdCBzdGFja0lkID0gTmFtZXMudW5pcXVlSWQoU3RhY2sub2YodGhpcykpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gU3RhY2sub2YodGhpcykubm9kZS50cnlGaW5kQ2hpbGQodGhpcy50YWJsZU5hbWUpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgcmV0dXJuIDxNYXA8c3RyaW5nLCBVc2FnZVRyYWNrZXI+PihTZW1hcGhvcmUuc2VtYXBob3JlVHJhY2tlci5nZXQoc3RhY2tJZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtID0gbmV3IE1hcDxzdHJpbmcsIFVzYWdlVHJhY2tlcj4oKTtcbiAgICAgIFNlbWFwaG9yZS5zZW1hcGhvcmVUcmFja2VyLnNldChzdGFja0lkLCBtKTtcbiAgICAgIHJldHVybiBtO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlVGFibGUocHJvcHM6IFNlbWFwaG9yZVByb3BzKTogVGFibGUge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gU3RhY2sub2YodGhpcykubm9kZS50cnlGaW5kQ2hpbGQodGhpcy50YWJsZU5hbWUpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgaWYgKHByb3BzLnRhYmxlUmVhZFdyaXRlQ2FwYWNpdHkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdgdGFibGVSZWFkV3JpdGVDYXBhY2l0eWAgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIG9uIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgYFNlbWFwaG9yZWAgY29uc3RydWN0IGluIGVhY2ggc3RhY2suJyk7XG4gICAgICB9XG4gICAgICAvLyBKdXN0IGFzc3VtZSB0aGlzIGlzIHRydWVcbiAgICAgIHJldHVybiBleGlzdGluZyBhcyBUYWJsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBUYWJsZShTdGFjay5vZih0aGlzKSwgdGhpcy50YWJsZU5hbWUsIHtcbiAgICAgICAgcGFydGl0aW9uS2V5OiB7XG4gICAgICAgICAgbmFtZTogJ0xvY2tOYW1lJyxcbiAgICAgICAgICB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVhZENhcGFjaXR5OiBwcm9wcy50YWJsZVJlYWRXcml0ZUNhcGFjaXR5Py5yZWFkQ2FwYWNpdHksXG4gICAgICAgIHdyaXRlQ2FwYWNpdHk6IHByb3BzLnRhYmxlUmVhZFdyaXRlQ2FwYWNpdHk/LndyaXRlQ2FwYWNpdHksXG4gICAgICAgIGJpbGxpbmdNb2RlOiBwcm9wcy50YWJsZVJlYWRXcml0ZUNhcGFjaXR5ID8gQmlsbGluZ01vZGUuUFJPVklTSU9ORUQgOiBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -18,6 +18,7 @@
18
18
  "package": "npx projen package",
19
19
  "package-all": "npx projen package-all",
20
20
  "package:dotnet": "npx projen package:dotnet",
21
+ "package:java": "npx projen package:java",
21
22
  "package:js": "npx projen package:js",
22
23
  "package:python": "npx projen package:python",
23
24
  "post-compile": "npx projen post-compile",
@@ -53,11 +54,11 @@
53
54
  "jest-junit": "^13",
54
55
  "jsii": "^1.63.2",
55
56
  "jsii-diff": "^1.63.2",
56
- "jsii-docgen": "^7.0.61",
57
+ "jsii-docgen": "^7.0.65",
57
58
  "jsii-pacmak": "^1.63.2",
58
59
  "json-schema": "^0.4.0",
59
60
  "npm-check-updates": "^15",
60
- "projen": "^0.60.10",
61
+ "projen": "^0.61.2",
61
62
  "standard-version": "^9",
62
63
  "ts-jest": "^27",
63
64
  "typescript": "^4.7.4"
@@ -74,7 +75,7 @@
74
75
  ],
75
76
  "main": "lib/index.js",
76
77
  "license": "Apache-2.0",
77
- "version": "0.1.0",
78
+ "version": "0.1.3",
78
79
  "jest": {
79
80
  "testMatch": [
80
81
  "<rootDir>/src/**/__tests__/**/*.ts?(x)",
@@ -120,6 +121,13 @@
120
121
  "jsii": {
121
122
  "outdir": "dist",
122
123
  "targets": {
124
+ "java": {
125
+ "package": "io.github.dontirun.statemachinesemaphore",
126
+ "maven": {
127
+ "groupId": "io.github.dontirun",
128
+ "artifactId": "statemachinesemaphore"
129
+ }
130
+ },
123
131
  "python": {
124
132
  "distName": "state-machine-semaphore",
125
133
  "module": "state_machine_semaphore"