cdktn 0.22.0 → 0.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +29 -28
- package/eslint.config.mjs +4 -0
- package/lib/annotations.js +1 -1
- package/lib/app.js +1 -1
- package/lib/aspect.js +1 -1
- package/lib/backends/azurerm-backend.js +3 -3
- package/lib/backends/cloud-backend.js +4 -4
- package/lib/backends/consul-backend.js +3 -3
- package/lib/backends/cos-backend.js +3 -3
- package/lib/backends/gcs-backend.js +3 -3
- package/lib/backends/http-backend.js +3 -3
- package/lib/backends/local-backend.js +3 -3
- package/lib/backends/oss-backend.js +3 -3
- package/lib/backends/pg-backend.js +3 -3
- package/lib/backends/remote-backend.js +5 -5
- package/lib/backends/s3-backend.js +3 -3
- package/lib/backends/swift-backend.js +3 -3
- package/lib/complex-computed-list.js +22 -22
- package/lib/errors.js +23 -23
- package/lib/functions/terraform-functions.generated.js +1 -1
- package/lib/importable-resource.js +1 -1
- package/lib/manifest.js +1 -1
- package/lib/resource.js +1 -1
- package/lib/terraform-asset.js +1 -1
- package/lib/terraform-backend.js +1 -1
- package/lib/terraform-count.js +1 -1
- package/lib/terraform-data-resource.js +1 -1
- package/lib/terraform-data-source.js +1 -1
- package/lib/terraform-element.js +1 -1
- package/lib/terraform-functions.js +1 -1
- package/lib/terraform-hcl-module.js +1 -1
- package/lib/terraform-iterator.d.ts +4 -4
- package/lib/terraform-iterator.js +10 -10
- package/lib/terraform-local.js +1 -1
- package/lib/terraform-module.js +1 -1
- package/lib/terraform-operators.js +1 -1
- package/lib/terraform-output.js +3 -4
- package/lib/terraform-provider.js +1 -1
- package/lib/terraform-provisioner.js +1 -1
- package/lib/terraform-remote-state.js +1 -1
- package/lib/terraform-resource-targets.js +1 -1
- package/lib/terraform-resource.js +1 -1
- package/lib/terraform-stack.js +1 -1
- package/lib/terraform-variable.js +2 -2
- package/lib/testing/index.js +1 -1
- package/lib/testing/matchers.js +1 -1
- package/lib/tokens/lazy.js +2 -2
- package/lib/tokens/resolvable.js +2 -2
- package/lib/tokens/string-fragments.js +1 -1
- package/lib/tokens/token.js +2 -2
- package/lib/upgrade-id-aspect.js +4 -4
- package/node_modules/semver/README.md +3 -2
- package/node_modules/semver/bin/semver.js +1 -1
- package/node_modules/semver/classes/range.js +1 -0
- package/node_modules/semver/classes/semver.js +19 -5
- package/node_modules/semver/functions/diff.js +1 -1
- package/node_modules/semver/internal/identifiers.js +4 -0
- package/node_modules/semver/internal/re.js +2 -2
- package/node_modules/semver/package.json +4 -4
- package/node_modules/semver/ranges/subset.js +1 -1
- package/package.json +13 -12
- package/tsconfig.tsbuildinfo +1 -1
package/lib/errors.js
CHANGED
|
@@ -8,7 +8,7 @@ exports.unableToResolveCircularReference = exports.intrinsicNewError = exports.a
|
|
|
8
8
|
exports.terraformModuleHasChildren = exports.assetCanNotCreateZipArchive = exports.IdIncludesUnresolvedTokens = exports.unrecognizedTokenKey = exports.unknownNumberTokenFound = exports.mapKeyMustResolveToString = exports.constructsCannotBeResolved = exports.encodedMapTokenInScalarNumberContext = exports.encodedMapTokenInScalarStringContext = exports.encodedListTokenInScalarStringContext = exports.cannotResolveFunction = void 0;
|
|
9
9
|
const noAppFound = (constructPath) => new Error(`No app could be identified for the construct at path '${constructPath}' (likely a TerraformStack).
|
|
10
10
|
The scope of CDKTN's TerraformStack class is a single App instance created by 'const app = new App()'. The App is your project's root, holding project configuration and validations.
|
|
11
|
-
Learn more about the App: https://
|
|
11
|
+
Learn more about the App: https://cdktn.io/docs/concepts/cdktn-architecture#app-class
|
|
12
12
|
`);
|
|
13
13
|
exports.noAppFound = noAppFound;
|
|
14
14
|
const appValidationFailure = (errorList) => new Error(`App-level validation failed with the following errors:\n ${errorList}
|
|
@@ -24,18 +24,18 @@ const assetOutOfScopeOfCDKTFJson = (id, configPath) => new Error(`TerraformAsset
|
|
|
24
24
|
|
|
25
25
|
The cdktf.json file is needed to establish the base for the relative path (the '.' in './foo/bar').
|
|
26
26
|
|
|
27
|
-
Place a cdktf.json at the root of your project. Learn more: https://
|
|
28
|
-
Learn more about TerraformAsset: https://
|
|
27
|
+
Place a cdktf.json at the root of your project. Learn more: https://cdktn.io/docs/create-and-deploy/configuration-file
|
|
28
|
+
Learn more about TerraformAsset: https://cdktn.io/docs/concepts/assets
|
|
29
29
|
`);
|
|
30
30
|
exports.assetOutOfScopeOfCDKTFJson = assetOutOfScopeOfCDKTFJson;
|
|
31
31
|
const assetExpectsDirectory = (id, configPath) => new Error(`TerraformAsset ${id} expects path to point to a directory. Instead, this file was passed: '${configPath}'. Please correct the path to point to a directory.
|
|
32
|
-
Learn more about TerraformAsset: https://
|
|
32
|
+
Learn more about TerraformAsset: https://cdktn.io/docs/concepts/assets
|
|
33
33
|
`);
|
|
34
34
|
exports.assetExpectsDirectory = assetExpectsDirectory;
|
|
35
35
|
const assetTypeNotImplemented = () => new Error(`Asset type is not implemented.
|
|
36
36
|
Possible Asset types include: FILE, DIRECTORY, and ARCHIVE.
|
|
37
37
|
Take one of these values from the AssetType Enum.
|
|
38
|
-
Learn more about TerraformAsset: https://
|
|
38
|
+
Learn more about TerraformAsset: https://cdktn.io/docs/concepts/assets
|
|
39
39
|
`);
|
|
40
40
|
exports.assetTypeNotImplemented = assetTypeNotImplemented;
|
|
41
41
|
const dynamicBlockNotSupported = (_foreachExpression) => new Error(`We do not support directly resolving a TerraformDynamicBlock. Dynamic blocks are only supported on block attributes of resources, data sources, and providers.
|
|
@@ -79,7 +79,7 @@ const movedToResourceOfDifferentType = (moveTarget, originalResourceType, destin
|
|
|
79
79
|
The destination "${moveTarget}"'s resource type ${destinationResourceType} differs from the original resource type (${originalResourceType}) you are trying to move.
|
|
80
80
|
|
|
81
81
|
If this was intentional, try importing the existing resource into your target instead. Learn more:
|
|
82
|
-
https://
|
|
82
|
+
https://cdktn.io/docs/concepts/resources#importing-resources
|
|
83
83
|
|
|
84
84
|
Note that you must manually remove the original resource from your state file after importing it. Use the "terraform state rm" command in the output directory of the stack you defined this resource in. Learn more:
|
|
85
85
|
https://developer.hashicorp.com/terraform/cli/commands/state/rm
|
|
@@ -96,7 +96,7 @@ Move by id: {
|
|
|
96
96
|
|
|
97
97
|
Only one move operation can occur per plan/apply. Remove one of the operations.
|
|
98
98
|
|
|
99
|
-
Learn more about moving resources: https://
|
|
99
|
+
Learn more about moving resources: https://cdktn.io/docs/examples-and-guides/refactoring#:~:text=Moving%20%26%20Renaming%20Resources%20Within%20a%20Stack
|
|
100
100
|
`);
|
|
101
101
|
exports.resourceGivenTwoMoveOperationsByTargetAndId = resourceGivenTwoMoveOperationsByTargetAndId;
|
|
102
102
|
const resourceGivenTwoMoveOperationsById = (id, existingMove, newMove) => new Error(`
|
|
@@ -113,14 +113,14 @@ The resource ${id} has been given two different move operations.
|
|
|
113
113
|
|
|
114
114
|
Only one move operation can occur per plan/apply. Remove one of the operations.
|
|
115
115
|
|
|
116
|
-
Learn more about moving resources: https://
|
|
116
|
+
Learn more about moving resources: https://cdktn.io/docs/examples-and-guides/refactoring#:~:text=Moving%20%26%20Renaming%20Resources%20Within%20a%20Stack
|
|
117
117
|
`);
|
|
118
118
|
exports.resourceGivenTwoMoveOperationsById = resourceGivenTwoMoveOperationsById;
|
|
119
119
|
const resourceGivenTwoMoveOperationsByTarget = (resourceId, existingMoveTarget, newMoveTarget) => new Error(`The resource ${resourceId} has been given two different moveTargets: "${newMoveTarget}" and "${existingMoveTarget}"
|
|
120
120
|
|
|
121
121
|
A resource can only be moved once per plan/apply.
|
|
122
122
|
|
|
123
|
-
Learn more about moving resources: https://
|
|
123
|
+
Learn more about moving resources: https://cdktn.io/docs/examples-and-guides/refactoring#:~:text=Moving%20%26%20Renaming%20Resources%20Within%20a%20Stack
|
|
124
124
|
`);
|
|
125
125
|
exports.resourceGivenTwoMoveOperationsByTarget = resourceGivenTwoMoveOperationsByTarget;
|
|
126
126
|
const stackContainsDisallowedChar = (stackId, invalidChar) => new Error(`Cannot create Terraform stack with id "${stackId}". It contains an invalid glob character: "${invalidChar}".
|
|
@@ -137,14 +137,14 @@ const noStackForConstruct = (constructPath, hint) => new Error(`No stack could b
|
|
|
137
137
|
|
|
138
138
|
You can only use constructs as part of a TerraformStack.
|
|
139
139
|
|
|
140
|
-
To learn more about Constructs vs. TerraformStacks, refer to: https://
|
|
140
|
+
To learn more about Constructs vs. TerraformStacks, refer to: https://cdktn.io/docs/concepts/constructs#:~:text=Constructs%20vs.%20Stacks
|
|
141
141
|
`);
|
|
142
142
|
exports.noStackForConstruct = noStackForConstruct;
|
|
143
143
|
const stackHasCircularDependency = (thisStack, dependency) => new Error(`Cannot add dependency ${dependency} to ${thisStack}, because it would cause a circular dependency.
|
|
144
144
|
|
|
145
145
|
TerraformStack ${dependency} is already dependent on ${thisStack} directly, or dependent on a TerraformStack within ${thisStack}.
|
|
146
146
|
|
|
147
|
-
To learn more about circular dependency references, refer to: https://
|
|
147
|
+
To learn more about circular dependency references, refer to: https://cdktn.io/docs/concepts/stacks#:~:text=Cross%2DStack%20References
|
|
148
148
|
`);
|
|
149
149
|
exports.stackHasCircularDependency = stackHasCircularDependency;
|
|
150
150
|
const stackValidationFailure = (errorList) => new Error(`Validation failed with the following errors:\n ${errorList}
|
|
@@ -158,7 +158,7 @@ Ensure you are passing the result of Testing.fullSynth('stack instance') to '${f
|
|
|
158
158
|
|
|
159
159
|
Testing.fullSynth returns a file path to a temporary testing environment. Testing.synth returns the JSON representation of your stack.
|
|
160
160
|
|
|
161
|
-
To learn more about testing in CDKTN, refer to: https://
|
|
161
|
+
To learn more about testing in CDKTN, refer to: https://cdktn.io/docs/test/unit-tests`);
|
|
162
162
|
exports.matchersPathIsNotDirectory = matchersPathIsNotDirectory;
|
|
163
163
|
const matchersFoundErrorsInStack = (errorCount, stackName, diagnostics) => new Error(`Found ${errorCount} Errors in stack ${stackName}: ${diagnostics}
|
|
164
164
|
|
|
@@ -169,12 +169,12 @@ const jestNotInstantiated = () => new Error(`Jest was not properly instantiated.
|
|
|
169
169
|
|
|
170
170
|
Ensure you have a 'setup.js' file in your project's directory that calls 'cdktn.Testing.setupJest()'.
|
|
171
171
|
|
|
172
|
-
To learn more about setting up testing, refer to: https://
|
|
172
|
+
To learn more about setting up testing, refer to: https://cdktn.io/docs/test/unit-tests#:~:text=Add%20Testing%20to%20Your%20Application
|
|
173
173
|
`);
|
|
174
174
|
exports.jestNotInstantiated = jestNotInstantiated;
|
|
175
175
|
const expectNotGloballyAccessible = () => new Error(`The expect function is not globally accessible.
|
|
176
176
|
|
|
177
|
-
To learn more about setting up testing, refer to: https://
|
|
177
|
+
To learn more about setting up testing, refer to: https://cdktn.io/docs/test/unit-tests#:~:text=Add%20Testing%20to%20Your%20Application
|
|
178
178
|
`);
|
|
179
179
|
exports.expectNotGloballyAccessible = expectNotGloballyAccessible;
|
|
180
180
|
const invalidStack = (functionName, stackContent) => new Error(`Invalid JSON string passed: ${stackContent}
|
|
@@ -187,12 +187,12 @@ Testing.synth returns the JSON representation of your stack. CDKTN can use asser
|
|
|
187
187
|
|
|
188
188
|
Testing.fullSynth returns a file path to a temporary testing environment.
|
|
189
189
|
|
|
190
|
-
To learn more about testing in CDKTN, refer to: https://
|
|
190
|
+
To learn more about testing in CDKTN, refer to: https://cdktn.io/docs/test/unit-tests
|
|
191
191
|
`);
|
|
192
192
|
exports.invalidStack = invalidStack;
|
|
193
193
|
const targetNotResolvableWithOverrides = (target) => new Error(`Target (${target}) cannot be a resolvable token if you specified overrides. Replace the value of the field you are overriding with a static value.
|
|
194
194
|
|
|
195
|
-
To learn more about Tokens, refer to: https://
|
|
195
|
+
To learn more about Tokens, refer to: https://cdktn.io/docs/concepts/tokens
|
|
196
196
|
`);
|
|
197
197
|
exports.targetNotResolvableWithOverrides = targetNotResolvableWithOverrides;
|
|
198
198
|
const sourceOrTargetNotAnObject = (source, sourceType, target, targetType) => new Error(`An issue occurred during the synthesization of your Terraform configuration.
|
|
@@ -217,7 +217,7 @@ new CloudBackend(stack, {
|
|
|
217
217
|
workspaces: new NamedCloudWorkspace("my-app"),
|
|
218
218
|
});
|
|
219
219
|
|
|
220
|
-
To learn more about Remote Backends, refer to: https://
|
|
220
|
+
To learn more about Remote Backends, refer to: https://cdktn.io/docs/concepts/remote-backends
|
|
221
221
|
`);
|
|
222
222
|
exports.cloudBackendWorkspaceIsNotDefinedByName = cloudBackendWorkspaceIsNotDefinedByName;
|
|
223
223
|
const valueContainsUnescapedQuotes = (value) => new Error(`Your value, '${value}', has unescaped double quotes in it, so it cannot be used as a value.
|
|
@@ -228,7 +228,7 @@ Fn.rawString('${value}')
|
|
|
228
228
|
|
|
229
229
|
Doing this ensures CDKTN and Terraform interpret your values correctly.
|
|
230
230
|
|
|
231
|
-
To learn more about built in Terraform functions within CDKTN, refer to: https://
|
|
231
|
+
To learn more about built in Terraform functions within CDKTN, refer to: https://cdktn.io/docs/concepts/functions
|
|
232
232
|
`);
|
|
233
233
|
exports.valueContainsUnescapedQuotes = valueContainsUnescapedQuotes;
|
|
234
234
|
const encounteredAnnotationWithLevelError = (errors) => new Error(`Encountered Annotations with level "ERROR":\n${errors}
|
|
@@ -316,8 +316,8 @@ Because we don't know the length of the list, we can not differentiate if the li
|
|
|
316
316
|
- If you want to access a singular item, use 'Fn.element(list, 0)'. Do not use 'list[0]'.
|
|
317
317
|
- If you want to loop over the list use 'TerraformIterator.fromList(list)'. Do not use a 'for' or 'forEach' loop.
|
|
318
318
|
|
|
319
|
-
Learn more about tokens: https://
|
|
320
|
-
Learn more about iterators: https://
|
|
319
|
+
Learn more about tokens: https://cdktn.io/docs/concepts/tokens
|
|
320
|
+
Learn more about iterators: https://cdktn.io/docs/concepts/iterators`;
|
|
321
321
|
const MAP_ERROR_EXPLANATION = `
|
|
322
322
|
In CDKTN, we represent maps, with values unknown until after runtime, as objects with a single key-value pair where the value is a string token. For example: '{ "&{TfToken[Token.1]}": "String Map Token Value" }'.
|
|
323
323
|
|
|
@@ -328,8 +328,8 @@ Because we don't know the contents of the map, we can not differentiate if the m
|
|
|
328
328
|
- To access a singular item use 'Fn.lookup(map, key)'. Do not use 'map[key]'.
|
|
329
329
|
- If you want to loop over the map use 'TerraformIterator.fromMap(map)'. Do not use a 'for' loop or iterate over 'Object.entries(map)' with 'forEach'.
|
|
330
330
|
|
|
331
|
-
Learn more about tokens: https://
|
|
332
|
-
Learn more about iterators: https://
|
|
331
|
+
Learn more about tokens: https://cdktn.io/docs/concepts/tokens
|
|
332
|
+
Learn more about iterators: https://cdktn.io/docs/concepts/iterators`;
|
|
333
333
|
const encodedListTokenInScalarStringContext = () => new Error(`Found an encoded list token string in a scalar string context.
|
|
334
334
|
${LIST_ERROR_EXPLANATION}`);
|
|
335
335
|
exports.encodedListTokenInScalarStringContext = encodedListTokenInScalarStringContext;
|
|
@@ -363,4 +363,4 @@ const terraformModuleHasChildren = (pathName) => {
|
|
|
363
363
|
return new Error(`Trying to add children to a TerraformModule at '${pathName}'. TerraformModules cannot have children, if you want to group resources or constructs in general together please use the Constructs class instead. See https://cdk.tf/constructs for more details.`);
|
|
364
364
|
};
|
|
365
365
|
exports.terraformModuleHasChildren = terraformModuleHasChildren;
|
|
366
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7QUFLSSxNQUFNLFVBQVUsR0FBRyxDQUFDLGFBQXFCLEVBQUUsRUFBRSxDQUNsRCxJQUFJLEtBQUssQ0FDUCx5REFBeUQsYUFBYTs7O0tBR3JFLENBQ0YsQ0FBQztBQU5TLFFBQUEsVUFBVSxjQU1uQjtBQUVHLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FDeEQsSUFBSSxLQUFLLENBQ1AsNkRBQTZELFNBQVM7OztLQUdyRSxDQUNGLENBQUM7QUFOUyxRQUFBLG9CQUFvQix3QkFNN0I7QUFFRyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsRUFBRSxDQUMxQyxJQUFJLEtBQUssQ0FDUDs7S0FFQyxDQUNGLENBQUM7QUFMUyxRQUFBLHVCQUF1QiwyQkFLaEM7QUFFRyxNQUFNLDBCQUEwQixHQUFHLENBQUMsRUFBVSxFQUFFLFVBQWtCLEVBQUUsRUFBRSxDQUMzRSxJQUFJLEtBQUssQ0FDUCxrQkFBa0IsRUFBRSxzQ0FBc0MsVUFBVSwrRUFBK0UsT0FBTyxDQUFDLEdBQUcsRUFBRTs7Ozs7O0NBTW5LLENBQ0UsQ0FBQztBQVRTLFFBQUEsMEJBQTBCLDhCQVNuQztBQUVHLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxFQUFVLEVBQUUsVUFBa0IsRUFBRSxFQUFFLENBQ3RFLElBQUksS0FBSyxDQUNQLGtCQUFrQixFQUFFLDBFQUEwRSxVQUFVOztLQUV2RyxDQUNGLENBQUM7QUFMUyxRQUFBLHFCQUFxQix5QkFLOUI7QUFFRyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsRUFBRSxDQUMxQyxJQUFJLEtBQUssQ0FBQzs7OztHQUlULENBQUMsQ0FBQztBQUxRLFFBQUEsdUJBQXVCLDJCQUsvQjtBQUVFLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxrQkFBMEIsRUFBRSxFQUFFLENBQ3JFLElBQUksS0FBSyxD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QVUsSUFBSSxZQUFZLEtBQUssRUFBRSxDQUNoRixDQUFDO0FBUFMsUUFBQSwyQkFBMkIsK0JBT3BDO0FBRUcsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLFFBQWdCLEVBQUUsRUFBRTtJQUM3RCxPQUFPLElBQUksS0FBSyxDQUNkLG1EQUFtRCxRQUFRLHFNQUFxTSxDQUNqUSxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBSlcsUUFBQSwwQkFBMEIsOEJBSXJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbiAqL1xuXG5pbXBvcnQgeyBJRGVwZW5kYWJsZSB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1TdGFjayB9IGZyb20gXCIuL3RlcnJhZm9ybS1zdGFja1wiO1xuXG5leHBvcnQgY29uc3Qgbm9BcHBGb3VuZCA9IChjb25zdHJ1Y3RQYXRoOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgTm8gYXBwIGNvdWxkIGJlIGlkZW50aWZpZWQgZm9yIHRoZSBjb25zdHJ1Y3QgYXQgcGF0aCAnJHtjb25zdHJ1Y3RQYXRofScgKGxpa2VseSBhIFRlcnJhZm9ybVN0YWNrKS5cblRoZSBzY29wZSBvZiBDREtUTidzIFRlcnJhZm9ybVN0YWNrIGNsYXNzIGlzIGEgc2luZ2xlIEFwcCBpbnN0YW5jZSBjcmVhdGVkIGJ5ICdjb25zdCBhcHAgPSBuZXcgQXBwKCknLiBUaGUgQXBwIGlzIHlvdXIgcHJvamVjdCdzIHJvb3QsIGhvbGRpbmcgcHJvamVjdCBjb25maWd1cmF0aW9uIGFuZCB2YWxpZGF0aW9ucy5cbkxlYXJuIG1vcmUgYWJvdXQgdGhlIEFwcDogaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vY2RrdGYvY29uY2VwdHMvY2RrdGYtYXJjaGl0ZWN0dXJlI2FwcC1jbGFzczp+OnRleHQ9YW5kJTIwUmVzb3VyY2UuLSxBcHAlMjBDbGFzcywtRWFjaCUyMENES1RGJTIwcHJvamVjdFxuICAgIGAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBhcHBWYWxpZGF0aW9uRmFpbHVyZSA9IChlcnJvckxpc3Q6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBBcHAtbGV2ZWwgdmFsaWRhdGlvbiBmYWlsZWQgd2l0aCB0aGUgZm9sbG93aW5nIGVycm9yczpcXG4gICR7ZXJyb3JMaXN0fVxuVmFsaWRhdGlvbnMgYWxsb3cgZm9yIGR5bmFtaWMgdmVyaWZpY2F0aW9uIG9mIHlvdXIgcHJvamVjdC5cblRvIHNraXAgdmFsaWRhdGlvbnMsIGFkZCAnc2tpcFZhbGlkYXRpb246IHRydWUnIHRvIHlvdXIgQXBwIGNvbmZpZy5cbiAgICBgLFxuICApO1xuXG5leHBvcnQgY29uc3QgcHJvdmlkZXJWZXJzaW9uTWlzbWF0Y2ggPSAoKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFZlcnNpb24gbWlzbWF0Y2ggZGV0ZWN0ZWQ6IFlvdXIgcHJvdmlkZXIgYmluZGluZ3MgYXJlIGJ1aWx0IGZvciBhbiBvbGRlciB2ZXJzaW9uIG9mIENES1RuLlxuVXBncmFkZSB5b3VyIHByZS1idWlsdCBwcm92aWRlciBvciByZS1ydW4gY2RrdG4gZ2V0IHdpdGggYSBtb3JlIHJlY2VudCB2ZXJzaW9uICg+PSAwLjEwKSBvZiB0aGUgY2RrdG4tY2xpLlxuICAgIGAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBhc3NldE91dE9mU2NvcGVPZkNES1RGSnNvbiA9IChpZDogc3RyaW5nLCBjb25maWdQYXRoOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgVGVycmFmb3JtQXNzZXQgJHtpZH0gd2FzIGNyZWF0ZWQgd2l0aCBhIHJlbGF0aXZlIHBhdGggJyR7Y29uZmlnUGF0aH0nLCBidXQgd2UgY2Fubm90IGZpbmQgdGhlIGNka3RmLmpzb24gd2l0aGluIHlvdXIgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAnJHtwcm9jZXNzLmN3ZCgpfSdcblxuVGhlIGNka3RmLmpzb24gZmlsZSBpcyBuZWVkZWQgdG8gZXN0YWJsaXNoIHRoZSBiYXNlIGZvciB0aGUgcmVsYXRpdmUgcGF0aCAodGhlICcuJyBpbiAnLi9mb28vYmFyJykuXG5cblBsYWNlIGEgY2RrdGYuanNvbiBhdCB0aGUgcm9vdCBvZiB5b3VyIHByb2plY3QuIExlYXJuIG1vcmU6IGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2Nka3RmL2NyZWF0ZS1hbmQtZGVwbG95L2NvbmZpZ3VyYXRpb24tZmlsZVxuTGVhcm4gbW9yZSBhYm91dCBUZXJyYWZvcm1Bc3NldDogaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vY2RrdGYvY29uY2VwdHMvYXNzZXRzXG5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgYXNzZXRFeHBlY3RzRGlyZWN0b3J5ID0gKGlkOiBzdHJpbmcsIGNvbmZpZ1BhdGg6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBUZXJyYWZvcm1Bc3NldCAke2lkfSBleHBlY3RzIHBhdGggdG8gcG9pbnQgdG8gYSBkaXJlY3RvcnkuIEluc3RlYWQsIHRoaXMgZmlsZSB3YXMgcGFzc2VkOiAnJHtjb25maWdQYXRofScuIFBsZWFzZSBjb3JyZWN0IHRoZSBwYXRoIHRvIHBvaW50IHRvIGEgZGlyZWN0b3J5LlxuTGVhcm4gbW9yZSBhYm91dCBUZXJyYWZvcm1Bc3NldDogaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vY2RrdGYvY29uY2VwdHMvYXNzZXRzXG4gICAgYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFzc2V0VHlwZU5vdEltcGxlbWVudGVkID0gKCkgPT5cbiAgbmV3IEVycm9yKGBBc3NldCB0eXBlIGlzIG5vdCBpbXBsZW1lbnRlZC5cblBvc3NpYmxlIEFzc2V0IHR5cGVzIGluY2x1ZGU6IEZJTEUsIERJUkVDVE9SWSwgYW5kIEFSQ0hJVkUuXG5UYWtlIG9uZSBvZiB0aGVzZSB2YWx1ZXMgZnJvbSB0aGUgQXNzZXRUeXBlIEVudW0uXG5MZWFybiBtb3JlIGFib3V0IFRlcnJhZm9ybUFzc2V0OiBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9jZGt0Zi9jb25jZXB0cy9hc3NldHNcbiAgYCk7XG5cbmV4cG9ydCBjb25zdCBkeW5hbWljQmxvY2tOb3RTdXBwb3J0ZWQgPSAoX2ZvcmVhY2hFeHByZXNzaW9uOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgV2UgZG8gbm90IHN1cHBvcnQgZGlyZWN0bHkgcmVzb2x2aW5nIGEgVGVycmFmb3JtRHluYW1pY0Jsb2NrLiBEeW5hbWljIGJsb2NrcyBhcmUgb25seSBzdXBwb3J0ZWQgb24gYmxvY2sgYXR0cmlidXRlcyBvZiByZXNvdXJjZXMsIGRhdGEgc291cmNlcywgYW5kIHByb3ZpZGVycy5cblxuWW91IGNhbiBjcmVhdGUgYSBUZXJyYWZvcm1EeW5hbWljQmxvY2sgYnkgY2FsbGluZyAnLmR5bmFtaWMnIG9uIGEgVGVycmFmb3JtSXRlcmF0b3IgaW5zdGFuY2UuXG5cblRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbiB3YXMgdXNlZCBmb3IgdGhlIGR5bmFtaWMgYmxvY2s6IC5keW5hbWljKHtcbiAgJHtfZm9yZWFjaEV4cHJlc3Npb259XG59KVxuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IHVucmVzb2x2ZWRUb2tlbkluQ29uc3RydWN0SWQgPSAoaWQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBZb3UgY2Fubm90IHVzZSBhIHRva2VuIChlLmcuLCBhIHJlZmVyZW5jZSB0byBhbiBhdHRyaWJ1dGUpIGFzIHRoZSBpZCBvZiBhIGNvbnN0cnVjdC4gSWRzIG9mIGNvbnN0cnVjdHMgbXVzdCBiZSBrbm93biBhdCBzeW50aGVzaXMgdGltZSwgYW5kIHRva2VuIHZhbHVlcyBhcmUgb25seSBrbm93biB3aGVuIFRlcnJhZm9ybSBydW5zLiBQbGVhc2UgdXNlIGEgY29uY3JldGUgdmFsdWUgZm9yIHlvdXIgY29uc3RydWN0cyBJRCBpbnN0ZWFkLlxuWW91IHBhc3NlZCB0aGUgZm9sbG93aW5nIGlkOiBcIiR7aWR9XCJcbmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBpdGVyYXRvck9uUmVzb3VyY2VXaXRoQ291bnQgPSAoKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFlvdSBjYW5ub3QgY3JlYXRlIGFuIGl0ZXJhdG9yIGZyb20gYSByZXNvdXJjZSB3aXRoIGEgY291bnQgYXJndW1lbnQuXG5JbnN0ZWFkLCByZXVzZSB0aGlzIHJlc291cmNlJ3MgVGVycmFmb3JtQ291bnQgaW5zdGFuY2UgaW4gdGhlIHJlc291cmNlIHlvdSB3YW50IHRvIHVzZSBhcyBhbiBpdGVyYXRvci5cblxuSWYgeW91IHdhbnQgdG8gdXNlIGFuIGl0ZXJhdG9yIHRvIHBvcHVsYXRlIGEgbGlzdCBhdHRyaWJ1dGUsIHJlcGxhY2UgdGhlIGNvdW50IG9uIHRoZSByZXNvdXJjZSB3aXRoIGFuIGl0ZXJhdG9yIHBhc3NlZCBpbnRvIHRoZSBmb3JFYWNoIGFyZ3VtZW50LmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBpdGVyYXRvck9uUmVzb3VyY2VXaXRob3V0Rm9yRWFjaCA9ICgpID0+XG4gIG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBhbiBpdGVyYXRvciBmcm9tIGEgcmVzb3VyY2Ugd2l0aG91dCBhIGZvckVhY2ggYXJndW1lbnQuIElmIHlvdSB3YW50IHRvIGNyZWF0ZSBtb3JlIGluc3RhbmNlcyBvZiB0aGlzIHJlc291cmNlLCBwYXNzIGFuIGl0ZXJhdG9yIHRvIHRoZSBmb3JFYWNoIGFyZ3VtZW50IG9mIHRoZSByZXNvdXJjZSBmaXJzdC5cbiAgYCk7XG5cbmV4cG9ydCBjb25zdCBtb2R1bGVzV2l0aFNhbWVBbGlhcyA9IChhbGlhczogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYE11bHRpcGxlIHByb3ZpZGVycyBoYXZlIHRoZSBzYW1lIGFsaWFzOiBcIiR7YWxpYXN9XCJcbkVhY2ggcHJvdmlkZXIgbXVzdCBoYXZlIGEgdW5pcXVlIGFsaWFzIHdoZW4gcGFzc2luZyBtdWx0aXBsZSBwcm92aWRlcnMgb2YgdGhlIHNhbWUgdHlwZSB0byBtb2R1bGVzLlxuICBgKTtcblxuZXhwb3J0IGNvbnN0IG1vdmVUYXJnZXRBbHJlYWR5U2V0ID0gKFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgZnJpZW5kbHlVbmlxdWVJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKSA9PlxuICBuZXcgRXJyb3IoYFRhcmdldCBcIiR7dGFyZ2V0fVwiIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBmb3IgdGhlIGNvbnN0cnVjdCAke2ZyaWVuZGx5VW5pcXVlSWR9LlxuVGFyZ2V0IG11c3QgYmUgYSBzdHJpbmcgdGhhdCBpcyB1bmlxdWUgYWNyb3NzIGFsbCByZXNvdXJjZXMgaW4gdGhlIHNhbWUgc3RhY2suYCk7XG5cbmV4cG9ydCBjb25zdCBtb3ZlVGFyZ2V0Tm90U2V0ID0gKHRhcmdldDogc3RyaW5nLCBlbnRyaWVzOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVGFyZ2V0IFwiJHt0YXJnZXR9XCIgaGFzIG5vdCBiZWVuIHNldC5cbllvdSB0cmllZCB0byBtb3ZlIGEgcmVzb3VyY2Ugd2l0aG91dCBhIHRhcmdldC5cbkNhbGwgLmFkZE1vdmVUYXJnZXQoXCIke3RhcmdldH1cIikgb24gdGhlIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZSB5b3Ugd2FudCB0byBtb3ZlIHRoaXMgcmVzb3VyY2UgdG8uXG5cbkFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRhcmdldHMgKGluIGNhc2UgeW91IGhhZCBhIHR5cG8pOlxuJHtlbnRyaWVzfVxuYCk7XG5cbmV4cG9ydCBjb25zdCBtb3ZlZFRvUmVzb3VyY2VPZkRpZmZlcmVudFR5cGUgPSAoXG4gIG1vdmVUYXJnZXQ6IHN0cmluZyxcbiAgb3JpZ2luYWxSZXNvdXJjZVR5cGU6IHN0cmluZyxcbiAgZGVzdGluYXRpb25SZXNvdXJjZVR5cGU6IHN0cmluZyxcbikgPT5cbiAgbmV3IEVycm9yKGBXZSBkbyBub3Qgc3VwcG9ydCBtb3ZpbmcgcmVzb3VyY2VzIHRvIGEgZGlmZmVyZW50IHR5cGUuXG5cblRoZSBkZXN0aW5hdGlvbiBcIiR7bW92ZVRhcmdldH1cIidzIHJlc291cmNlIHR5cGUgJHtkZXN0aW5hdGlvblJlc291cmNlVHlwZX0gZGlmZmVycyBmcm9tIHRoZSBvcmlnaW5hbCByZXNvdXJjZSB0eXBlICgke29yaWdpbmFsUmVzb3VyY2VUeXBlfSkgeW91IGFyZSB0cnlpbmcgdG8gbW92ZS5cblxuSWYgdGhpcyB3YXMgaW50ZW50aW9uYWwsIHRyeSBpbXBvcnRpbmcgdGhlIGV4aXN0aW5nIHJlc291cmNlIGludG8geW91ciB0YXJnZXQgaW5zdGVhZC4gTGVhcm4gbW9yZTpcbmh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2Nka3RmL2NvbmNlcHRzL3Jlc291cmNlcyNpbXBvcnRpbmctcmVzb3VyY2VzXG5cbk5vdGUgdGhhdCB5b3UgbXVzdCBtYW51YWxseSByZW1vdmUgdGhlIG9yaWdpbmFsIHJlc291cmNlIGZyb20geW91ciBzdGF0ZSBmaWxlIGFmdGVyIGltcG9ydGluZyBpdC4gVXNlIHRoZSBcInRlcnJhZm9ybSBzdGF0ZSBybVwiIGNvbW1hbmQgaW4gdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgdGhlIHN0YWNrIHlvdSBkZWZpbmVkIHRoaXMgcmVzb3VyY2UgaW4uIExlYXJuIG1vcmU6XG5odHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9jbGkvY29tbWFuZHMvc3RhdGUvcm1cbmApO1xuXG5leHBvcnQgY29uc3QgcmVzb3VyY2VHaXZlblR3b01vdmVPcGVyYXRpb25zQnlUYXJnZXRBbmRJZCA9IChcbiAgaWQ6IHN0cmluZyxcbiAgZXhpc3RpbmdUYXJnZXQ6IHN0cmluZyxcbiAgbmV3TW92ZTogeyB0bzogc3RyaW5nOyBmcm9tOiBzdHJpbmcgfSxcbikgPT5cbiAgbmV3IEVycm9yKGBcblRoZSByZXNvdXJjZSAke2lkfSBoYXMgYmVlbiBnaXZlbiB0d28gZGlmZmVyZW50IG1vdmUgb3BlcmF0aW9ucy5cblxuTW92ZSB0YXJnZXQ6IFwiJHtleGlzdGluZ1RhcmdldH1cIlxuTW92ZSBieSBpZDoge1xuICBmcm9tOiAke25ld01vdmUuZnJvbX1cbiAgdG86ICR7bmV3TW92ZS50b31cbn1cblxuT25seSBvbmUgbW92ZSBvcGVyYXRpb24gY2FuIG9jY3VyIHBlciBwbGFuL2FwcGx5LiBSZW1vdmUgb25lIG9mIHRoZSBvcGVyYXRpb25zLlxuXG5MZWFybiBtb3JlIGFib3V0IG1vdmluZyByZXNvdXJjZXM6IGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2Nka3RmL2V4YW1wbGVzLWFuZC1ndWlkZXMvcmVmYWN0b3JpbmcjOn46dGV4dD1Nb3ZpbmclMjAlMjYlMjBSZW5hbWluZyUyMFJlc291cmNlcyUyMFdpdGhpbiUyMGElMjBTdGFja1xuYCk7XG5cbmV4cG9ydCBjb25zdCByZXNvdXJjZUdpdmVuVHdvTW92ZU9wZXJhdGlvbnNCeUlkID0gKFxuICBpZDogc3RyaW5nLFxuICBleGlzdGluZ01vdmU6IHsgdG86IHN0cmluZzsgZnJvbTogc3RyaW5nIH0sXG4gIG5ld01vdmU6IHsgdG86IHN0cmluZzsgZnJvbTogc3RyaW5nIH0sXG4pID0+XG4gIG5ldyBFcnJvcihgXG5UaGUgcmVzb3VyY2UgJHtpZH0gaGFzIGJlZW4gZ2l2ZW4gdHdvIGRpZmZlcmVudCBtb3ZlIG9wZXJhdGlvbnMuXG5cbntcbiAgZnJvbTogJHtleGlzdGluZ01vdmUuZnJvbX1cbiAgdG86ICR7ZXhpc3RpbmdNb3ZlLnRvfVxufVxue1xuICBmcm9tOiAke25ld01vdmUuZnJvbX1cbiAgdG86ICR7bmV3TW92ZS50b30gKFJlc291cmNlIGNhbGxpbmcgdGhlIG1vdmUgdG8gb3BlcmF0aW9uKVxufVxuXG5Pbmx5IG9uZSBtb3ZlIG9wZXJhdGlvbiBjYW4gb2NjdXIgcGVyIHBsYW4vYXBwbHkuIFJlbW92ZSBvbmUgb2YgdGhlIG9wZXJhdGlvbnMuXG5cbkxlYXJuIG1vcmUgYWJvdXQgbW92aW5nIHJlc291cmNlczogaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vY2RrdGYvZXhhbXBsZXMtYW5kLWd1aWRlcy9yZWZhY3RvcmluZyM6fjp0ZXh0PU1vdmluZyUyMCUyNiUyMFJlbmFtaW5nJTIwUmVzb3VyY2VzJTIwV2l0aGluJTIwYSUyMFN0YWNrXG5gKTtcblxuZXhwb3J0IGNvbnN0IHJlc291cmNlR2l2ZW5Ud29Nb3ZlT3BlcmF0aW9uc0J5VGFyZ2V0ID0gKFxuICByZXNvdXJjZUlkOiBzdHJpbmcsXG4gIGV4aXN0aW5nTW92ZVRhcmdldDogc3RyaW5nLFxuICBuZXdNb3ZlVGFyZ2V0OiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihgVGhlIHJlc291cmNlICR7cmVzb3VyY2VJZH0gaGFzIGJlZW4gZ2l2ZW4gdHdvIGRpZmZlcmVudCBtb3ZlVGFyZ2V0czogXCIke25ld01vdmVUYXJnZXR9XCIgYW5kIFwiJHtleGlzdGluZ01vdmVUYXJnZXR9XCJcblxuQSByZXNvdXJjZSBjYW4gb25seSBiZSBtb3ZlZCBvbmNlIHBlciBwbGFuL2FwcGx5LlxuXG5MZWFybiBtb3JlIGFib3V0IG1vdmluZyByZXNvdXJjZXM6IGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2Nka3RmL2V4YW1wbGVzLWFuZC1ndWlkZXMvcmVmYWN0b3JpbmcjOn46dGV4dD1Nb3ZpbmclMjAlMjYlMjBSZW5hbWluZyUyMFJlc291cmNlcyUyMFdpdGhpbiUyMGElMjBTdGFja1xuYCk7XG5cbmV4cG9ydCBjb25zdCBzdGFja0NvbnRhaW5zRGlzYWxsb3dlZENoYXIgPSAoXG4gIHN0YWNrSWQ6IHN0cmluZyxcbiAgaW52YWxpZENoYXI6IHN0cmluZyxcbikgPT5cbiAgbmV3IEVycm9yKGBDYW5ub3QgY3JlYXRlIFRlcnJhZm9ybSBzdGFjayB3aXRoIGlkIFwiJHtzdGFja0lkfVwiLiBJdCBjb250YWlucyBhbiBpbnZhbGlkIGdsb2IgY2hhcmFjdGVyOiBcIiR7aW52YWxpZENoYXJ9XCIuXG5cbkdsb2IgY2hhcmFjdGVycyBhcmUgbm90IHN1cHBvcnRlZCBpbiBzdGFjayBuYW1lcyBiZWNhdXNlIHdlIHVzZSB0aGVtIHRvIGRlcGxveSBhbmQgZGVzdHJveSBtdWx0aXBsZSBzdGFja3MuIEZvciBleGFtcGxlLCAnY2RrdG4gZGVwbG95IFxcYCotcHJvZHVjdGlvblxcYCcgZGVwbG95cyBhbGwgc3RhY2tzIHdpdGggbmFtZXMgdGhhdCBlbmQgaW4gJy1wcm9kdWN0aW9uJy5cbmApO1xuXG5leHBvcnQgY29uc3Qgc3RhY2tJZENvbnRhaW5zV2hpdGVzcGFjZSA9IChzdGFja0lkOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBUZXJyYWZvcm1TdGFjayB3aXRoIGlkIFwiJHtzdGFja0lkfVwiLiBJdCBjb250YWlucyBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyLlxuXG5QbGVhc2UgcmVtb3ZlIGFueSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgaW4geW91ciBUZXJyYWZvcm1TdGFjayBpZCwgbGlrZSBzbzogXCIke3N0YWNrSWQucmVwbGFjZShcbiAgICAvXFxzL2csXG4gICAgXCJcIixcbiAgKX1cIlxuYCk7XG5cbmV4cG9ydCBjb25zdCBub1N0YWNrRm9yQ29uc3RydWN0ID0gKGNvbnN0cnVjdFBhdGg6IHN0cmluZywgaGludDogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYE5vIHN0YWNrIGNvdWxkIGJlIGlkZW50aWZpZWQgZm9yIHRoZSBjb25zdHJ1Y3QgYXQgcGF0aCAnJHtjb25zdHJ1Y3RQYXRofScke2hpbnR9XG5cbllvdSBjYW4gb25seSB1c2UgY29uc3RydWN0cyBhcyBwYXJ0IG9mIGEgVGVycmFmb3JtU3RhY2suXG5cblRvIGxlYXJuIG1vcmUgYWJvdXQgQ29uc3RydWN0cyB2cy4gVGVycmFmb3JtU3RhY2tzLCByZWZlciB0bzogaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vY2RrdGYvY29uY2VwdHMvY29uc3RydWN0cyM6fjp0ZXh0PUNvbnN0cnVjdHMlMjB2cy4lMjBTdGFja3NcbmApO1xuXG5leHBvcnQgY29uc3Qgc3RhY2tIYXNDaXJjdWxhckRlcGVuZGVuY3kgPSAoXG4gIHRoaXNTdGFjazogVGVycmFmb3JtU3RhY2ssXG4gIGRlcGVuZGVuY3k6IFRlcnJhZm9ybVN0YWNrLFxuKSA9PlxuICBuZXcgRXJyb3IoYENhbm5vdCBhZGQgZGVwZW5kZW5jeSAke2RlcGVuZGVuY3l9IHRvICR7dGhpc1N0YWNrfSwgYmVjYXVzZSBpdCB3b3VsZCBjYXVzZSBhIGNpcmN1bGFyIGRlcGVuZGVuY3kuXG5cblRlcnJhZm9ybVN0YWNrICR7ZGVwZW5kZW5jeX0gaXMgYWxyZWFkeSBkZXBlbmRlbnQgb24gJHt0aGlzU3RhY2t9IGRpcmVjdGx5LCBvciBkZXBlbmRlbnQgb24gYSBUZXJyYWZvcm1TdGFjayB3aXRoaW4gJHt0aGlzU3RhY2t9LlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IGNpcmN1bGFyIGRlcGVuZGVuY3kgcmVmZXJlbmNlcywgcmVmZXIgdG86IGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2Nka3RmL2NvbmNlcHRzL3N0YWNrcyM6fjp0ZXh0PUNyb3NzJTJEU3RhY2slMjBSZWZlcmVuY2VzXG5gKTtcblxuZXhwb3J0IGNvbnN0IHN0YWNrVmFsaWRhdGlvbkZhaWx1cmUgPSAoZXJyb3JMaXN0OiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVmFsaWRhdGlvbiBmYWlsZWQgd2l0aCB0aGUgZm9sbG93aW5nIGVycm9yczpcXG4gICR7ZXJyb3JMaXN0fVxuXG5JZiB5b3Ugd2lzaCB0byBpZ25vcmUgdGhlc2UgdmFsaWRhdGlvbnMsIHBhc3MgJ3NraXBWYWxpZGF0aW9uOiB0cnVlJyB0byB5b3VyIEFwcCBjb25maWd1cmF0aW9uLlxuYCk7XG5cbmV4cG9ydCBjb25zdCBtYXRjaGVyc1BhdGhJc05vdERpcmVjdG9yeSA9IChmdW5jdGlvbk5hbWU6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBQYXRoIGlzIG5vdCBhIGRpcmVjdG9yeS5cblxuRW5zdXJlIHlvdSBhcmUgcGFzc2luZyB0aGUgcmVzdWx0IG9mIFRlc3RpbmcuZnVsbFN5bnRoKCdzdGFjayBpbnN0YW5jZScpIHRvICcke2Z1bmN0aW9uTmFtZX0nLCBub3QgVGVzdGluZy5zeW50aCgnc3RhY2sgaW5zdGFuY2UnKS5cblxuVGVzdGluZy5mdWxsU3ludGggcmV0dXJucyBhIGZpbGUgcGF0aCB0byBhIHRlbXBvcmFyeSB0ZXN0aW5nIGVudmlyb25tZW50LiBUZXN0aW5nLnN5bnRoIHJldHVybnMgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgeW91ciBzdGFjay5cblxuVG8gbGVhcm4gbW9yZSBhYm91dCB0ZXN0aW5nIGluIENES1ROLCByZWZlciB0bzogaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vY2RrdGYvdGVzdC91bml0LXRlc3RzYCk7XG5cbmV4cG9ydCBjb25zdCBtYXRjaGVyc0ZvdW5kRXJyb3JzSW5TdGFjayA9IChcbiAgZXJyb3JDb3VudDogYW55LFxuICBzdGFja05hbWU6IHN0cmluZyxcbiAgZGlhZ25vc3RpY3M6IHN0cmluZyxcbikgPT5cbiAgbmV3IEVycm9yKGBGb3VuZCAke2Vycm9yQ291bnR9IEVycm9ycyBpbiBzdGFjayAke3N0YWNrTmFtZX06ICR7ZGlhZ25vc3RpY3N9XG5cblRoZXNlIGVycm9ycyBhcmUgbm90IHRlc3QgZmFpbHVyZXMsIGJ1dCBpc3N1ZXMgd2l0aCB0aGUgdW5kZXJseWluZyBUZXJyYWZvcm1TdGFjayBiZWluZyB0ZXN0ZWQuIEZpeCB0aGUgYWJvdmUgaXNzdWVzIGJlZm9yZSBydW5uaW5nIHlvdXIgdGVzdHMgYWdhaW4uXG5gKTtcblxuZXhwb3J0IGNvbnN0IGplc3ROb3RJbnN0YW50aWF0ZWQgPSAoKSA9PlxuICBuZXcgRXJyb3IoYEplc3Qgd2FzIG5vdCBwcm9wZXJseSBpbnN0YW50aWF0ZWQuXG5cbkVuc3VyZSB5b3UgaGF2ZSBhICdzZXR1cC5qcycgZmlsZSBpbiB5b3VyIHByb2plY3QncyBkaXJlY3RvcnkgdGhhdCBjYWxscyAnY2RrdG4uVGVzdGluZy5zZXR1cEplc3QoKScuXG5cblRvIGxlYXJuIG1vcmUgYWJvdXQgc2V0dGluZyB1cCB0ZXN0aW5nLCByZWZlciB0bzogaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vY2RrdGYvdGVzdC91bml0LXRlc3RzIzp+OnRleHQ9QWRkJTIwVGVzdGluZyUyMHRvJTIwWW91ciUyMEFwcGxpY2F0aW9uXG5gKTtcblxuZXhwb3J0IGNvbnN0IGV4cGVjdE5vdEdsb2JhbGx5QWNjZXNzaWJsZSA9ICgpID0+XG4gIG5ldyBFcnJvcihgVGhlIGV4cGVjdCBmdW5jdGlvbiBpcyBub3QgZ2xvYmFsbHkgYWNjZXNzaWJsZS5cblxuVG8gbGVhcm4gbW9yZSBhYm91dCBzZXR0aW5nIHVwIHRlc3RpbmcsIHJlZmVyIHRvOiBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9jZGt0Zi90ZXN0L3VuaXQtdGVzdHMjOn46dGV4dD1BZGQlMjBUZXN0aW5nJTIwdG8lMjBZb3VyJTIwQXBwbGljYXRpb25cbmApO1xuXG5leHBvcnQgY29uc3QgaW52YWxpZFN0YWNrID0gKGZ1bmN0aW9uTmFtZTogc3RyaW5nLCBzdGFja0NvbnRlbnQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBJbnZhbGlkIEpTT04gc3RyaW5nIHBhc3NlZDogJHtzdGFja0NvbnRlbnR9XG5cblxuRW5zdXJlIHlvdSBhcmUgcGFzc2luZyB0aGUgcmVzdWx0IG9mIFRlc3Rpbmcuc3ludGgoJ3N0YWNrIGluc3RhbmNlJykgdG8gJyR7ZnVuY3Rpb25OYW1lfScsIG5vdCBUZXN0aW5nLmZ1bGxTeW50aCgnc3RhY2sgaW5zdGFuY2UnKS5cblxuXG5UZXN0aW5nLnN5bnRoIHJldHVybnMgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgeW91ciBzdGFjay4gQ0RLVE4gY2FuIHVzZSBhc3NlcnRpb25zIHdpdGggdGhpcyBKU09OIHRvIGNoZWNrIHRoZSBjb21wb3NpdGlvbiBvZiB5b3VyIHN0YWNrcywgbGlrZSBzbzogXCJUZXN0aW5nLnRvSGF2ZVJlc291cmNlKFRlc3Rpbmcuc3ludGgoJ1RlcnJhZm9ybVN0YWNrIGluc3RhbmNlJyksIFMzQnVja2V0KVwiXG5cblRlc3RpbmcuZnVsbFN5bnRoIHJldHVybnMgYSBmaWxlIHBhdGggdG8gYSB0ZW1wb3JhcnkgdGVzdGluZyBlbnZpcm9ubWVudC5cblxuVG8gbGVhcm4gbW9yZSBhYm91dCB0ZXN0aW5nIGluIENES1ROLCByZWZlciB0bzogaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vY2RrdGYvdGVzdC91bml0LXRlc3RzXG5gKTtcblxuZXhwb3J0IGNvbnN0IHRhcmdldE5vdFJlc29sdmFibGVXaXRoT3ZlcnJpZGVzID0gKHRhcmdldDogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYFRhcmdldCAoJHt0YXJnZXR9KSBjYW5ub3QgYmUgYSByZXNvbHZhYmxlIHRva2VuIGlmIHlvdSBzcGVjaWZpZWQgb3ZlcnJpZGVzLiBSZXBsYWNlIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgeW91IGFyZSBvdmVycmlkaW5nIHdpdGggYSBzdGF0aWMgdmFsdWUuXG5cblRvIGxlYXJuIG1vcmUgYWJvdXQgVG9rZW5zLCByZWZlciB0bzogaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vY2RrdGYvY29uY2VwdHMvdG9rZW5zXG5gKTtcblxuZXhwb3J0IGNvbnN0IHNvdXJjZU9yVGFyZ2V0Tm90QW5PYmplY3QgPSAoXG4gIHNvdXJjZTogc3RyaW5nLFxuICBzb3VyY2VUeXBlOiBzdHJpbmcsXG4gIHRhcmdldDogc3RyaW5nLFxuICB0YXJnZXRUeXBlOiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihgQW4gaXNzdWUgb2NjdXJyZWQgZHVyaW5nIHRoZSBzeW50aGVzaXphdGlvbiBvZiB5b3VyIFRlcnJhZm9ybSBjb25maWd1cmF0aW9uLlxuXG5Cb3RoIHRoZSBzb3VyY2UgZWxlbWVudCAoJHtzb3VyY2V9KSBhbmQgaXRzIGNvbnRhaW5pbmcgdGFyZ2V0IGVsZW1lbnQgKCR7dGFyZ2V0fSkgbXVzdCBiZSBvYmplY3RzLlxuXG5UeXBlIG9mIHNvdXJjZTogJHtzb3VyY2VUeXBlfVxuVHlwZSBvZiB0YXJnZXQ6ICR7dGFyZ2V0VHlwZX1cbmApO1xuXG5leHBvcnQgY29uc3QgY29uc3RydWN0RGVwZW5kZW5jeUJlbG93VjEwID0gKCkgPT5cbiAgbmV3IEVycm9yKGBWZXJzaW9uIG1pc21hdGNoISBDREtUTiB2ZXJzaW9uIDAuNiByZXF1aXJlcyB5b3VyIGNvbnN0cnVjdHMgdmVyc2lvbiB0byBiZSB2MTAgb3IgYWJvdmUuXG5cblVwZGF0ZSB5b3VyIGNvbnN0cnVjdHMgZGVwZW5kZW5jeTogaHR0cHM6Ly9jZGsudGYvdXBncmFkZS1jb25zdHJ1Y3RzLXYxMFxuYCk7XG5cbmV4cG9ydCBjb25zdCBjbG91ZEJhY2tlbmRXb3Jrc3BhY2VJc05vdERlZmluZWRCeU5hbWUgPSAoKSA9PlxuICBuZXcgRXJyb3IoYFRoZSBDbG91ZCBiYWNrZW5kIG9ubHkgc3VwcG9ydHMgY3Jvc3Mtc3RhY2sgcmVmZXJlbmNlcyBpZiB0aGUgd29ya3NwYWNlIGlzIGRlZmluZWQgYnkgbmFtZSAobm90IGJ5IHRhZ3MpLlxuXG5UbyB1c2UgY3Jvc3Mtc3RhY2sgcmVmZXJlbmNlcywgcmVwbGFjZSBhbGwgbWVudGlvbnMgb2YgJ1RhZ2dlZENsb3VkV29ya3NwYWNlcycgd2l0aCAnTmFtZWRDbG91ZFdvcmtzcGFjZScsIGxpa2Ugc286XG5cbm5ldyBDbG91ZEJhY2tlbmQoc3RhY2ssIHtcbiAgLi4uXG4gIHdvcmtzcGFjZXM6IG5ldyBOYW1lZENsb3VkV29ya3NwYWNlKFwibXktYXBwXCIpLFxufSk7XG5cblRvIGxlYXJuIG1vcmUgYWJvdXQgUmVtb3RlIEJhY2tlbmRzLCByZWZlciB0bzogaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vY2RrdGYvY29uY2VwdHMvcmVtb3RlLWJhY2tlbmRzXG5gKTtcblxuZXhwb3J0IGNvbnN0IHZhbHVlQ29udGFpbnNVbmVzY2FwZWRRdW90ZXMgPSAodmFsdWU6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBZb3VyIHZhbHVlLCAnJHt2YWx1ZX0nLCBoYXMgdW5lc2NhcGVkIGRvdWJsZSBxdW90ZXMgaW4gaXQsIHNvIGl0IGNhbm5vdCBiZSB1c2VkIGFzIGEgdmFsdWUuXG5cblRvIHNhZmVseSB1c2UgdGhlIHZhbHVlLCB1c2UgRm4ucmF3U3RyaW5nIG9uIHlvdXIgc3RyaW5nLCBsaWtlIHNvOlxuXG5Gbi5yYXdTdHJpbmcoJyR7dmFsdWV9JylcblxuRG9pbmcgdGhpcyBlbnN1cmVzIENES1ROIGFuZCBUZXJyYWZvcm0gaW50ZXJwcmV0IHlvdXIgdmFsdWVzIGNvcnJlY3RseS5cblxuVG8gbGVhcm4gbW9yZSBhYm91dCBidWlsdCBpbiBUZXJyYWZvcm0gZnVuY3Rpb25zIHdpdGhpbiBDREtUTiwgcmVmZXIgdG86IGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2Nka3RmL2NvbmNlcHRzL2Z1bmN0aW9uc1xuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGVuY291bnRlcmVkQW5ub3RhdGlvbldpdGhMZXZlbEVycm9yID0gKGVycm9yczogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYEVuY291bnRlcmVkIEFubm90YXRpb25zIHdpdGggbGV2ZWwgXCJFUlJPUlwiOlxcbiR7ZXJyb3JzfVxuXG5FaXRoZXIgZml4IHRoZSBpc3N1ZXMgYWJvdmUsIG9yIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQ0RLVEZfQ09OVElOVUVfU1lOVEhfT05fRVJST1JfQU5OT1RBVElPTlMgdG8gaWdub3JlIHRoZXNlIGFubm90YXRpb25zLlxuYCk7XG5cbmV4cG9ydCBjb25zdCB2YWx1ZUlzSW52YWxpZFN0cmluZ09yVG9rZW4gPSAodmFsdWU6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGAnJHt2YWx1ZX0nIGlzIG5vdCBhIHZhbGlkIHN0cmluZyBub3IgYSB0b2tlbi4gVGhpcyBmdW5jdGlvbiBvbmx5IGFjY2VwdHMgc3RyaW5ncyBvciB0b2tlbnMgcmVzb2x2aW5nIHRvIHN0cmluZ3MuIFBsZWFzZSBjaGFuZ2UgeW91ciBjb2RlIGFjY29yZGluZ2x5LmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCB2YWx1ZUlzSW52YWxpZE51bWJlck9yVG9rZW4gPSAodmFsdWU6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGAke3ZhbHVlfSBpcyBub3QgYSB2YWxpZCBudW1iZXIgbm9yIGEgdG9rZW4uIFRoaXMgZnVuY3Rpb24gb25seSBhY2NlcHRzIG51bWJlcnMgb3IgdG9rZW5zIHJlc29sdmluZyB0byBudW1iZXJzLiBQbGVhc2UgY2hhbmdlIHlvdXIgY29kZSBhY2NvcmRpbmdseS5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgbGlzdEVsZW1lbnRJc09mV3JvbmdUeXBlID0gKFxuICB2YWx1ZTogYW55W10sXG4gIHBvc2l0aW9uOiBudW1iZXIsXG4gIGVycm9yOiB1bmtub3duLFxuKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEVsZW1lbnQgaW4gbGlzdCAke3ZhbHVlfSBhdCBwb3NpdGlvbiAke3Bvc2l0aW9ufSBpcyBub3QgdGhlIHJpZ2h0IHR5cGU6ICR7ZXJyb3J9LlxuICAgIFBsZWFzZSBlbnN1cmUgYWxsIGVsZW1lbnRzIGluIHRoZSBsaXN0IGFyZSB0aGUgY29ycmVjdCB0eXBlIGZvciB0aGlzIGZ1bmN0aW9uLmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvblJlY2VpdmVkV3JvbmdOdW1iZXJPZkFyZ3MgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgYXJnVmFsaWRhdG9yc0xlbmd0aDogbnVtYmVyLFxuICBhcmdzTGVuZ3RoOiBudW1iZXIsXG4pID0+XG4gIG5ldyBFcnJvcihcbiAgICBgRnVuY3Rpb24gJHtuYW1lfSB0YWtlcyAke2FyZ1ZhbGlkYXRvcnNMZW5ndGh9IGFyZ3VtZW50cywgYnV0ICR7YXJnc0xlbmd0aH0gd2VyZSBwcm92aWRlZC4gUGxlYXNlIGFkZCB0aGUgbWlzc2luZyBhcmd1bWVudHMgdG8gdGhlIGZ1bmN0aW9uLmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvbkFyZ3VtZW50VmFsaWRhdGlvbkZhaWx1cmUgPSAoXG4gIGFyZ051bWJlcjogbnVtYmVyLFxuICBuYW1lOiBzdHJpbmcsXG4gIGVycm9yOiB1bmtub3duLFxuKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEFyZ3VtZW50ICR7YXJnTnVtYmVyfSBvZiAke25hbWV9IGZhaWxlZCB0aGUgdmFsaWRhdGlvbjogJHtlcnJvcn0uIFBsZWFzZSBjaGFuZ2UgeW91ciBjb2RlIHRvIHBhc3MgYSB2YWxpZCB2YWx1ZSBmb3IgdGhpcyBhcmd1bWVudC5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgY2Fubm90Q2FsY0lkRm9yRW1wdHlTZXRPZkNvbXBvbmVudHMgPSAoKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFVuYWJsZSB0byBjYWxjdWxhdGUgYSB1bmlxdWUgaWQgZm9yIGFuIGVtcHR5IHNldCBvZiBjb21wb25lbnRzLlxuXG4gICAgVGhpcyBoYXBwZW5zIHdoZW4geW91IGF0dGVtcHQgdG8gY3JlYXRlIGEgdW5pcXVlIGlkLCBidXQgZG8gbm90IHBhc3MgaW4gYW55IGNvbnN0cnVjdCBub2RlIGlkcy4gVGhpcyBtZWFucyB5b3VyIGNvbnN0cnVjdCBsaWtlbHkgaGFzIG5vIHBhcmVudCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuXG5cbiAgICBQbGVhc2UgbWFrZSBzdXJlIHlvdXIgY29uc3RydWN0IGhhcyBhIHBhcmVudC4gRm9yIGV4YW1wbGU6ICduZXcgQXBwKHRoaXMpJyBvciAnbmV3IFRlcnJhZm9ybVN0YWNrKHRoaXMsICdzdGFjaycpJy5gLFxuICApO1xuXG5leHBvcnQgY29uc3Qgc3RyaW5nVmFsdWVBZGRlZFRvUmVmZXJlbmNlTGlzdCA9IChsaXN0VG9rZW46IHN0cmluZ1tdKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYENhbm5vdCBhZGQgZWxlbWVudHMgdG8gbGlzdCB0b2tlbiwgZ290OiAke2xpc3RUb2tlbn0uXG5cbiAgICBXZSBleHBlY3QgdGhlIGVsZW1lbnRzIG9mIGEgdG9rZW5pemVkIHN0cmluZyBhcnJheSB0byBiZSBhIHNpbmdsZSB0b2tlbiBzdHJpbmcuIEZvciBleGFtcGxlLCBbXCIme1RmVG9rZW5bVG9rZW4uMV19XCJdLlxuXG4gICAgT25lIGVsZW1lbnQgaW4geW91ciBhcnJheSBjb25zaXN0cyBvZiBtb3JlIHRoYW4gYSBzaW5nbGUgdmFsdWUuIFRvIGFkZCB2YWx1ZXMgdG8gYSB0b2tlbml6ZWQgbGlzdCwgdXNlIFRlcnJhZm9ybSBmdW5jdGlvbnMgaW5zdGVhZC4gRm9yIGV4YW1wbGU6ICdGbi5jb25jYXQoW3lvdXJSZWZlcmVuY2VkTGlzdCwgW1wibXlcIiwgXCJuZXdcIiwgXCJpdGVtc1wiXV0pJy5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgY2Fubm90Q29uY2F0ZW5hdGVTdHJpbmdzSW5Ub2tlbml6ZWRTdHJpbmdBcnJheSA9IChcbiAgbGlzdFRva2VuOiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihcbiAgICBgQ2Fubm90IGNvbmNhdGVuYXRlIHN0cmluZ3MgaW4gYSB0b2tlbml6ZWQgc3RyaW5nIGFycmF5LCBnb3Q6ICR7bGlzdFRva2VufS5cblxuICAgIFdlIGV4cGVjdCB0aGUgZWxlbWVudHMgb2YgYSB0b2tlbml6ZWQgc3RyaW5nIGFycmF5IHRvIGJlIGEgc2luZ2xlIHRva2VuIHN0cmluZy4gRm9yIGV4YW1wbGUsIFtcIiZ7VGZUb2tlbltUb2tlbi4xXX1cIl0uIE9uZSBlbGVtZW50IGluIHlvdXIgYXJyYXkgY29uc2lzdHMgb2Ygc29tZXRoaW5nIG90aGVyIHRoYW4gYSBzaW5nbGUgdG9rZW4uXG5cbiAgICBZb3UgYXJlIGxpa2VseSBtdXRhdGluZyB0aGUgdmFsdWUgaW5zaWRlIHlvdXIgYXJyYXksIHdoaWNoIENES1ROIGNhbm5vdCByZXNvbHZlIGludG8gdGhlIGFwcHJvcHJpYXRlIHJ1bnRpbWUgdmFsdWUuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IG51bWJlclZhbHVlQWRkZWRUb1JlZmVyZW5jZUxpc3QgPSAobGlzdFRva2VuOiBudW1iZXJbXSkgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBDYW5ub3QgYWRkIGVsZW1lbnRzIHRvIGxpc3QgdG9rZW4sIGdvdDogJHtsaXN0VG9rZW59LlxuXG4gICAgV2UgdXNlIHRva2VucyB0byByZXByZXNlbnQgcnVudGltZSB2YWx1ZXMgKGUuZy4sIHJlZmVyZW5jZXMgdG8gYXR0cmlidXRlcyBvZiByZXNvdXJjZSBvciBkYXRhIHNvdXJjZXMpLiBMaXN0IHRva2VucyBkb24ndCBjb250YWluIHRoZSBhY3R1YWwgdmFsdWVzIGJlY2F1c2UgdGhvc2UgYXJlIG9ubHkgYXZhaWxhYmxlIGF0IGFwcGx5IHRpbWUsIHdoZXJlYXMgdG9rZW5zIGFyZSBwcmVzZW50IGR1cmluZyBjb21waWxlIHRpbWUuXG5cbiAgICBJZiB5b3Ugd2FudCB0byBhZGQgYSB2YWx1ZSB0byBhIHRva2VuaXplZCBsaXN0LCB1c2UgYSBUZXJyYWZvcm0gZnVuY3Rpb24gaW5zdGVhZC4gRm9yIGV4YW1wbGU6IEZuLmNvbmNhdChbeW91clJlZmVyZW5jZWRMaXN0LCBbNDIsIDQzLCA0NF1dKS5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgbWFwVmFsdWVBZGRlZFRvUmVmZXJlbmNlTGlzdCA9IChtYXBUb2tlbjogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYENhbm5vdCBhZGQgZWxlbWVudHMgdG8gbWFwIHRva2VuLCBnb3Q6ICR7bWFwVG9rZW59LiBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IG1lcmdlIG11bHRpcGxlIG1hcHMsIG9yIGlmIHlvdSBhZGQgYSBuZXcga2V5IHZhbHVlIHBhaXIgdG8gdGhlIG1hcCB0b2tlbi5cblxuICAgIFdlIHVzZSB0b2tlbnMgdG8gcmVwcmVzZW50IHJ1bnRpbWUgdmFsdWVzIChlLmcuLCByZWZlcmVuY2VzIHRvIGF0dHJpYnV0ZXMgb2YgcmVzb3VyY2Ugb3IgZGF0YSBzb3VyY2VzKS4gTGlzdCB0b2tlbnMgZG9uJ3QgY29udGFpbiB0aGUgYWN0dWFsIHZhbHVlcyBiZWNhdXNlIHRob3NlIGFyZSBvbmx5IGF2YWlsYWJsZSBhdCBhcHBseSB0aW1lLCB3aGVyZWFzIHRva2VucyBhcmUgcHJlc2VudCBkdXJpbmcgY29tcGlsZSB0aW1lLlxuXG4gICAgSW5zdGVhZCBvZiBhZGRpbmcgdGhlIHZhbHVlIHRvIHRoZSB0b2tlbml6ZWQgbWFwLCB1c2UgYSBUZXJyYWZvcm0gZnVuY3Rpb24uIEZvciBleGFtcGxlOiBGbi5tZXJnZShbeW91clJlZmVyZW5jZWRNYXAsIHsgeW91cjogJ3ZhbHVlJyB9XSkuIFRoaXMgY3JlYXRlcyBhIG5ldyBtYXAgVG9rZW4gZm9yIGEgdmFsdWUsIHdoaWNoIGNvdWxkIGdldCByZW5kZXJlZCBhczpcbiAgICBtZXJnZShteV9yZXNvdXJjZS5yZXNvdXJjZV9uYW1lLm9uZV9zcGVjaWZpY19tYXBfYXR0cmlidXRlLCB7IHlvdXI6ICcgdmFsdWUnIH0pYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGNhbm5vdENvbmNhdGVuYXRlU3RyaW5nc0luVG9rZW5pemVkTWFwID0gKHRva2VuaXplZE1hcDogYW55KSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYENhbm5vdCBjb25jYXRlbmF0ZSBzdHJpbmdzIGluIGEgdG9rZW5pemVkIG1hcCwgZ290OiAke3Rva2VuaXplZE1hcH0uXG5cbiAgICBXZSBleHBlY3QgdGhlIGVsZW1lbnRzIG9mIGEgdG9rZW5pemVkIHN0cmluZyBhcnJheSB0byBiZSBhIHNpbmdsZSB0b2tlbiBzdHJpbmcuIEZvciBleGFtcGxlLCBbXCIme1RmVG9rZW5bVG9rZW4uMV19XCJdLiBBIGtleSBpbiB5b3VyIG1hcCBjb25zaXN0cyBvZiBtb3JlIHRoYW4gYSBzdHJpbmcgdG9rZW4gKGUuZy4sIHRoZSBUb2tlbiBhbmQgYSBzdGF0aWMgc3RyaW5nIG9yIG11bHRpcGxlIFRva2VucykuXG5cbiAgICBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IG11dGF0ZSB0aGUga2V5IG9mIHRoZSBtYXAuIERvIG5vdCBtdXRhdGUgdG9rZW5pemVkIE1hcHMsIGJlY2F1c2UgaXQgbWFrZXMgaXQgaW1wb3NzaWJsZSBmb3IgQ0RLVE4gdG8gdHJhbnNsYXRlIHRoZW0uYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGRvZXNOb3RJbXBsZW1lbnREZXBlbmRhYmxlVHJhaXQgPSAoaW5zdGFuY2U6IElEZXBlbmRhYmxlKSA9PlxuICBuZXcgRXJyb3IoYCR7aW5zdGFuY2V9IGRvZXMgbm90IGltcGxlbWVudCBEZXBlbmRhYmxlVHJhaXRgKTtcblxuZXhwb3J0IGNvbnN0IGNhbk9ubHlFbmNvZGVQb3NpdGl2ZUludGVnZXJzID0gKCkgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBDYW4gb25seSBlbmNvZGUgcG9zaXRpdmUgaW50ZWdlcnMgaW50byBUb2tlbnMuIFRoaXMgaXMgYSBidWcgaW4gQ0RLVE4sIHBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydC5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgaW5kZXhUb29MYXJnZVRvRW5jb2RlID0gKGluZGV4OiBudW1iZXIpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgUmVjZWl2ZWQgYW4gaW5kZXggdG9vIGxhcmdlIHRvIGVuY29kZSBpbnRvIGEgVG9rZW4gOiR7aW5kZXh9LlxuXG4gICAgVGhpcyBoYXBwZW5zIGlmIHlvdSBoYXZlIHRvbyBtYW55IFRva2VucyBpbiBhIHNpbmdsZSBDREtUTiBhcHBsaWNhdGlvbi4gVGhpcyBjYW4gYWxzbyBvY2N1ciBpZiB5b3UgYXJlIGFjY2lkZW50YWxseSBjcmVhdGluZyBudW1lcmljIHRva2VucyBpbiBhbiBpbmZpbml0ZSBsb29wLiBGb3IgZXhhbXBsZSwgY2FsbGluZyAnVG9rZW4uYXNOdW1iZXIoKScgdG9vIG1hbnkgdGltZXMuXG5cbiAgICBJZiB5b3UgcmVhY2ggdGhlIG1heGltdW0gbnVtYmVyIG9mIGFsbG93ZWQgVG9rZW5zIChhIGxpbWl0YXRpb24gaW1wb3NlZCBieSB0aGUgd2F5IHdlIGVuY29kZSBUb2tlbnMgYW5kIHNlcGFyYXRlIHRoZW0gZnJvbSByZWFsIG51bWVyaWMgdmFsdWVzKSB5b3UgY2FuIHdvcmsgYXJvdW5kIHRoaXMgaXNzdWUgYnkgZGl2aWRpbmcgYSBzaW5nbGUgYXBwbGljYXRpb24gaW50byBtdWx0aXBsZSBhcHBsaWNhdGlvbnMuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFyZ1RvSW50cmluc2ljTXVzdEJlUGxhaW5WYWx1ZSA9IChcbiAgdmFsdWU6IGFueSxcbiAgY3JlYXRpb25TdGFjazogc3RyaW5nW10sXG4pID0+XG4gIG5ldyBFcnJvcihcbiAgICBgWW91IGNhbiBvbmx5IHVzZSBhIHBsYWluIHZhbHVlIChub3QgYSBmdW5jdGlvbikgd2hpbGUgY3JlYXRpbmcgYW4gSW50cmluc2ljIHRva2VuLiBXZSByZWNlaXZlZCB0aGUgdmFsdWUgJyR7dmFsdWV9JyBjcmVhdGVkIGF0OlxcbiR7Y3JlYXRpb25TdGFjay5qb2luKFxuICAgICAgXCJcXG5cIixcbiAgICApfS4gSWYgeW91IHdhbnQgdG8gdXNlIGEgZnVuY3Rpb24sIHBsZWFzZSB1c2UgdGhlIExhenkgY2xhc3MuIEZvciBleGFtcGxlOiAgTGF6eS5hbnlWYWx1ZSh7IHByb2R1Y2U6ICgpID0+IFwiSGVsbG8gV29ybGRcIiB9KS5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgaW50cmluc2ljTmV3RXJyb3IgPSAobWVzc2FnZTogc3RyaW5nLCBjcmVhdGVkQXQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGAke21lc3NhZ2V9XFxuVG9rZW4gY3JlYXRlZDpcXG4gICAgYXQgJHtjcmVhdGVkQXR9XFxuRXJyb3IgdGhyb3duOmApO1xuXG5leHBvcnQgY29uc3QgdW5hYmxlVG9SZXNvbHZlQ2lyY3VsYXJSZWZlcmVuY2UgPSAocGF0aE5hbWU6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBVbmFibGUgdG8gcmVzb2x2ZSBvYmplY3QgdHJlZSB3aXRoIGNpcmN1bGFyIHJlZmVyZW5jZSBhdCAnJHtwYXRoTmFtZX0nLlxuXG5UaGUgZGVwdGggb2YgeW91ciBvYmplY3QgdHJlZSBpcyBvdmVyIDIwMCwgaW5kaWNhdGluZyB5b3UgcHJvYmFibHkgaGF2ZSBhIGN5Y2xpY2FsIHJlZmVyZW5jZS4gSW5zcGVjdCB0aGUgY29uc3RydWN0IGNyZWF0aW5nIHRoaXMgY3ljbGljIHJlZmVyZW5jZSAobW9zdCBsaWtlbHkgaW4gJyR7cGF0aE5hbWV9JykgYW5kIGVuc3VyZSBpdCBkb2VzIG5vdCBpbmZpbml0ZWx5IG5lc3QgY29uc3RydWN0cy5gKTtcblxuZXhwb3J0IGNvbnN0IGNhbm5vdFJlc29sdmVGdW5jdGlvbiA9IChwYXRoTmFtZTogc3RyaW5nLCBvYmo6IGFueSkgPT5cbiAgbmV3IEVycm9yKGBUcnlpbmcgdG8gcmVzb2x2ZSBhIG5vbi1kYXRhIG9iamVjdCAoZS5nLiwgYSBmdW5jdGlvbikgYXQgJyR7cGF0aE5hbWV9JzogJHtvYmp9LiBPbmx5IHRva2VucyBhcmUgc3VwcG9ydGVkIGZvciBsYXp5IGV2YWx1YXRpb24uXG5cbklmIHlvdSB3YW50IHRvIHVzZSBhIGxhemlseSBjb21wdXRlZCB2YWx1ZSwgdXNlIHRoZSBMYXp5IGNsYXNzLiBGb3IgZXhhbXBsZTogIExhenkuc3RyaW5nVmFsdWUoeyBwcm9kdWNlOiAoKSA9PiBcIkhlbGxvIFdvcmxkXCIgfSlgKTtcblxuY29uc3QgTElTVF9FUlJPUl9FWFBMQU5BVElPTiA9IGBJbiBDREtUTiwgd2UgcmVwcmVzZW50IGxpc3RzLCB3aXRoIHZhbHVlcyB1bmtub3duIHVudGlsIGFmdGVyIHJ1bnRpbWUsIGFzIGFycmF5cyB3aXRoIGEgc2luZ2xlIGVsZW1lbnTigJQgYSBzdHJpbmcgdG9rZW4gKFtcIlRva2VuLjFcIl0pLlxuXG5cbldlIGRvIHRoaXMgYmVjYXVzZSBDREtUTiBkb2VzIG5vdCBrbm93IHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXQgY29tcGlsZSB0aW1lLCBtZWFuaW5nIENES1ROIGhhcyB5ZXQgdG8gaW52b2tlIFRlcnJhZm9ybSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBjbG91ZCBwcm92aWRlci4gQ0RLVE4gbGF0ZXIgaW52b2tlcyBUZXJyYWZvcm0gb24gdGhlIHN5bnRoZXNpemVkIHN0YXRpYyBKU09OIGZpbGUuXG5cbkJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0LCB3ZSBjYW4gbm90IGRpZmZlcmVudGlhdGUgaWYgdGhlIGxpc3Qgd2FzIGFjY2Vzc2VkIGF0IHRoZSBmaXJzdCBvciBsYXN0IGluZGV4LCBvciBhcyBwYXJ0IG9mIGEgbG9vcC4gVG8gYXZvaWQgdGhpcyBhbWJpZ3VpdHk6XG5cbi0gSWYgeW91IHdhbnQgdG8gYWNjZXNzIGEgc2luZ3VsYXIgaXRlbSwgdXNlICdGbi5lbGVtZW50KGxpc3QsIDApJy4gRG8gbm90IHVzZSAnbGlzdFswXScuXG4tIElmIHlvdSB3YW50IHRvIGxvb3Agb3ZlciB0aGUgbGlzdCB1c2UgJ1RlcnJhZm9ybUl0ZXJhdG9yLmZyb21MaXN0KGxpc3QpJy4gRG8gbm90IHVzZSBhICdmb3InIG9yICdmb3JFYWNoJyBsb29wLlxuXG5MZWFybiBtb3JlIGFib3V0IHRva2VuczogaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vY2RrdGYvY29uY2VwdHMvdG9rZW5zXG5MZWFybiBtb3JlIGFib3V0IGl0ZXJhdG9yczogaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vY2RrdGYvY29uY2VwdHMvaXRlcmF0b3JzYDtcblxuY29uc3QgTUFQX0VSUk9SX0VYUExBTkFUSU9OID0gYFxuSW4gQ0RLVE4sIHdlIHJlcHJlc2VudCBtYXBzLCB3aXRoIHZhbHVlcyB1bmtub3duIHVudGlsIGFmdGVyIHJ1bnRpbWUsIGFzIG9iamVjdHMgd2l0aCBhIHNpbmdsZSBrZXktdmFsdWUgcGFpciB3aGVyZSB0aGUgdmFsdWUgaXMgYSBzdHJpbmcgdG9rZW4uIEZvciBleGFtcGxlOiAneyBcIiZ7VGZUb2tlbltUb2tlbi4xXX1cIjogXCJTdHJpbmcgTWFwIFRva2VuIFZhbHVlXCIgfScuXG5cbldlIGRvIHRoaXMgYmVjYXVzZSBDREtUTiBkb2VzIG5vdCBrbm93IHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXQgY29tcGlsZSB0aW1lLCBtZWFuaW5nIENES1ROIGhhcyB5ZXQgdG8gaW52b2tlIFRlcnJhZm9ybSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBjbG91ZCBwcm92aWRlci4gQ0RLVE4gbGF0ZXIgaW52b2tlcyBUZXJyYWZvcm0gb24gdGhlIHN5bnRoZXNpemVkIHN0YXRpYyBKU09OIGZpbGUuXG5cbkJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgY29udGVudHMgb2YgdGhlIG1hcCwgd2UgY2FuIG5vdCBkaWZmZXJlbnRpYXRlIGlmIHRoZSBtYXAgd2FzIGFjY2Vzc2VkLCBvciB1c2VkIGFzIHBhcnQgb2YgYSBsb29wLiBUbyBhdm9pZCB0aGlzIGFtYmlndWl0eTpcblxuLSBUbyBhY2Nlc3MgYSBzaW5ndWxhciBpdGVtIHVzZSAnRm4ubG9va3VwKG1hcCwga2V5KScuIERvIG5vdCB1c2UgJ21hcFtrZXldJy5cbi0gSWYgeW91IHdhbnQgdG8gbG9vcCBvdmVyIHRoZSBtYXAgdXNlICdUZXJyYWZvcm1JdGVyYXRvci5mcm9tTWFwKG1hcCknLiBEbyBub3QgdXNlIGEgJ2ZvcicgbG9vcCBvciBpdGVyYXRlIG92ZXIgJ09iamVjdC5lbnRyaWVzKG1hcCknIHdpdGggJ2ZvckVhY2gnLlxuXG5MZWFybiBtb3JlIGFib3V0IHRva2VuczogaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vY2RrdGYvY29uY2VwdHMvdG9rZW5zXG5MZWFybiBtb3JlIGFib3V0IGl0ZXJhdG9yczogaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vY2RrdGYvY29uY2VwdHMvaXRlcmF0b3JzYDtcblxuZXhwb3J0IGNvbnN0IGVuY29kZWRMaXN0VG9rZW5JblNjYWxhclN0cmluZ0NvbnRleHQgPSAoKSA9PlxuICBuZXcgRXJyb3IoYEZvdW5kIGFuIGVuY29kZWQgbGlzdCB0b2tlbiBzdHJpbmcgaW4gYSBzY2FsYXIgc3RyaW5nIGNvbnRleHQuXG4ke0xJU1RfRVJST1JfRVhQTEFOQVRJT059YCk7XG5cbmV4cG9ydCBjb25zdCBlbmNvZGVkTWFwVG9rZW5JblNjYWxhclN0cmluZ0NvbnRleHQgPSAoKSA9PlxuICBuZXcgRXJyb3IoYEZvdW5kIGFuIGVuY29kZWQgbWFwIHRva2VuIGluIGEgc2NhbGFyIHN0cmluZyBjb250ZXh0LlxuJHtNQVBfRVJST1JfRVhQTEFOQVRJT059YCk7XG5cbmV4cG9ydCBjb25zdCBlbmNvZGVkTWFwVG9rZW5JblNjYWxhck51bWJlckNvbnRleHQgPSAoKSA9PlxuICBuZXcgRXJyb3IoYEZvdW5kIGFuIGVuY29kZWQgbWFwIHRva2VuIGluIGEgc2NhbGFyIG51bWJlciBjb250ZXh0LlxuJHtNQVBfRVJST1JfRVhQTEFOQVRJT059YCk7XG5cbmV4cG9ydCBjb25zdCBjb25zdHJ1Y3RzQ2Fubm90QmVSZXNvbHZlZCA9IChwYXRoTmFtZTogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYFRyeWluZyB0byAncmVzb2x2ZSgpJyBhIENvbnN0cnVjdCBhdCAnJHtwYXRoTmFtZX0nLlxuXG5UaGlzIG9mdGVuIG1lYW5zIGFuIHVuaW50ZW5kZWQgY3ljbGljIGRlcGVuZGVuY3kgaW4geW91ciBjb25zdHJ1Y3QgdHJlZSwgbGVhZGluZyB0byB0aGUgcmVzb2x1dGlvbiBzdHVjayBpbiBhbiBpbmZpbml0ZSBsb29wIHRoYXQgZmFpbHMuXG5UaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHNjb3BlIHBhc3NlZCBpbnRvIHRoaXMgY29uc3RydWN0IGlzIGFsc28gcGFydCBvZiBpdHMgc3VidHJlZS5cblxuVG8gcmVzb2x2ZSB0aGlzIGlzc3VlLCByZWZhY3RvciB5b3VyIGNvZGUgdG8gYXZvaWQgdGhpcyBjeWNsaWMgZGVwZW5kZW5jeSBieSBjaGFuZ2luZyB0aGUgc2NvcGUgb2YgdGhpcyBjb25zdHJ1Y3QuYCk7XG5cbmV4cG9ydCBjb25zdCBtYXBLZXlNdXN0UmVzb2x2ZVRvU3RyaW5nID0gKFxuICBwYXRoTmFtZTogc3RyaW5nLFxuICBrZXk6IHN0cmluZyxcbiAgcmVzb2x2ZWRLZXk6IGFueSxcbikgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBBdCBcIiR7cGF0aE5hbWV9XCIgYSBtYXAgdXNlcyB0aGUga2V5IFwiJHtrZXl9XCIsIG1lYW5pbmcgdGhhdCBrZXkgbXVzdCByZXNvbHZlIHRvIGEgc3RyaW5nLiBIb3dldmVyLCBpdCByZXNvbHZlcyB0byBhICR7dHlwZW9mIHJlc29sdmVkS2V5fSB3aXRoIHRoZSB2YWx1ZSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgcmVzb2x2ZWRLZXksXG4gICAgKX0uIFRvIGZpeCB0aGlzLCBjaGFuZ2UgdGhlIFRva2VuIHRvIHJlc29sdmUgdG8gYSBzdHJpbmcuYCxcbiAgKTtcblxuY29uc3QgdW5rbm93blRva2VuRXhwbGFuYXRpb24gPSBgVGhpcyBtZWFucyB5b3UgYXJlIHRyeWluZyB0byBhY2Nlc3MgYSBUb2tlbiB2YWx1ZSB0aGF0IGRvZXMgbm90IGV4aXN0LiBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgVG9rZW4gaXMgZnJvbSBhbm90aGVyIENESyAoaS5lLiwgQVdTIENESywgQ0RLOHMsIGV0Yy4pIGFuZCBpcyB1bmtub3duIHRvIHRoaXMgQ0RLVE4gQXBwbGljYXRpb24uIFlvdSBlaXRoZXIgbmVlZCB0byBtYWtlIHRoZSBvdGhlciBDREsgcmVzb2x2ZSB0aGlzIFRva2VuIGJlZm9yZSBDREtUTiB0cmllcyB0byByZXNvbHZlIGl0LCBvciB3b3JrIGFyb3VuZCB1c2luZyB0aGlzIFRva2VuIGF0IGFsbC5cblxuSWYgdGhpcyBlcnJvciBvY2N1cnMgd2l0aG91dCBhbm90aGVyIENESyAob3IgYSB2YWx1ZSBsb29raW5nIGxpa2UgYSBUb2tlbikgaW52b2x2ZWQsIHBsZWFzZSBmaWxlIGEgYnVnLmA7XG5cbmV4cG9ydCBjb25zdCB1bmtub3duTnVtYmVyVG9rZW5Gb3VuZCA9ICgpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgRW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB1bmtub3duIG51bWJlciBUb2tlbiBmb3VuZC4gJHt1bmtub3duVG9rZW5FeHBsYW5hdGlvbn1gLFxuICApO1xuXG5leHBvcnQgY29uc3QgdW5yZWNvZ25pemVkVG9rZW5LZXkgPSAoa2V5OiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIFRva2VuIEtleSAnJHtrZXl9Jy4gJHt1bmtub3duVG9rZW5FeHBsYW5hdGlvbn1gKTtcblxuZXhwb3J0IGNvbnN0IElkSW5jbHVkZXNVbnJlc29sdmVkVG9rZW5zID0gKHVucmVzb2x2ZWRUb2tlbnM6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBUaGlzIGNvbnN0cnVjdCAob3IgaXRzIHBhcmVudCBjb25zdHJ1Y3QpIGlzIGNvbmZpZ3VyZWQgd2l0aCBhbiBJRCB0aGF0IGNvbnRhaW5zIGEgVG9rZW46ICR7dW5yZXNvbHZlZFRva2Vuc30uIFRoaXMgaXMgbm90IGFsbG93ZWQgYmVjYXVzZSBJRHMgbXVzdCBiZSBrbm93biBzdGF0aWNhbGx5IGR1cmluZyBzeW50aGVzaXMuIFRva2VuIHZhbHVlcyBhcmUgb25seSBrbm93biBkdXJpbmcgdGhlIGFwcGx5IHN0YWdlLCB0aGVyZWZvcmUgdGhleSBjYW5ub3QgYmUgdXNlZCBpbiBJRHMuIFBsZWFzZSB1c2UgYSBjb25jcmV0ZSB2YWx1ZSBmb3IgeW91ciBjb25zdHJ1Y3RzIElEIGluc3RlYWQuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFzc2V0Q2FuTm90Q3JlYXRlWmlwQXJjaGl2ZSA9IChcbiAgc3JjOiBzdHJpbmcsXG4gIGRlc3Q6IHN0cmluZyxcbiAgZXJyb3I6IEVycm9yLFxuKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEEgVGVycmFmb3JtQXNzZXQgdHJ5aW5nIHRvIHppcCBhcmNoaXZlICcke3NyY30nIGludG8gJHtkZXN0fSBmYWlsZWQ6ICR7ZXJyb3J9YCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IHRlcnJhZm9ybU1vZHVsZUhhc0NoaWxkcmVuID0gKHBhdGhOYW1lOiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICBgVHJ5aW5nIHRvIGFkZCBjaGlsZHJlbiB0byBhIFRlcnJhZm9ybU1vZHVsZSBhdCAnJHtwYXRoTmFtZX0nLiBUZXJyYWZvcm1Nb2R1bGVzIGNhbm5vdCBoYXZlIGNoaWxkcmVuLCBpZiB5b3Ugd2FudCB0byBncm91cCByZXNvdXJjZXMgb3IgY29uc3RydWN0cyBpbiBnZW5lcmFsIHRvZ2V0aGVyIHBsZWFzZSB1c2UgdGhlIENvbnN0cnVjdHMgY2xhc3MgaW5zdGVhZC4gU2VlIGh0dHBzOi8vY2RrLnRmL2NvbnN0cnVjdHMgZm9yIG1vcmUgZGV0YWlscy5gLFxuICApO1xufTtcbiJdfQ==
|
|
366
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7QUFLSSxNQUFNLFVBQVUsR0FBRyxDQUFDLGFBQXFCLEVBQUUsRUFBRSxDQUNsRCxJQUFJLEtBQUssQ0FDUCx5REFBeUQsYUFBYTs7O0tBR3JFLENBQ0YsQ0FBQztBQU5TLFFBQUEsVUFBVSxjQU1uQjtBQUVHLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FDeEQsSUFBSSxLQUFLLENBQ1AsNkRBQTZELFNBQVM7OztLQUdyRSxDQUNGLENBQUM7QUFOUyxRQUFBLG9CQUFvQix3QkFNN0I7QUFFRyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsRUFBRSxDQUMxQyxJQUFJLEtBQUssQ0FDUDs7S0FFQyxDQUNGLENBQUM7QUFMUyxRQUFBLHVCQUF1QiwyQkFLaEM7QUFFRyxNQUFNLDBCQUEwQixHQUFHLENBQUMsRUFBVSxFQUFFLFVBQWtCLEVBQUUsRUFBRSxDQUMzRSxJQUFJLEtBQUssQ0FDUCxrQkFBa0IsRUFBRSxzQ0FBc0MsVUFBVSwrRUFBK0UsT0FBTyxDQUFDLEdBQUcsRUFBRTs7Ozs7O0NBTW5LLENBQ0UsQ0FBQztBQVRTLFFBQUEsMEJBQTBCLDhCQVNuQztBQUVHLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxFQUFVLEVBQUUsVUFBa0IsRUFBRSxFQUFFLENBQ3RFLElBQUksS0FBSyxDQUNQLGtCQUFrQixFQUFFLDBFQUEwRSxVQUFVOztLQUV2RyxDQUNGLENBQUM7QUFMUyxRQUFBLHFCQUFxQix5QkFLOUI7QUFFRyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsRUFBRSxDQUMxQyxJQUFJLEtBQUssQ0FBQzs7OztHQUlULENBQUMsQ0FBQztBQUxRLFFBQUEsdUJBQXVCLDJCQUsvQjtBQUVFLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxrQkFBMEIsRUFBRSxFQUFFLENBQ3JFLElBQUksS0FBSyxD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VSxJQUFJLFlBQVksS0FBSyxFQUFFLENBQ2hGLENBQUM7QUFQUyxRQUFBLDJCQUEyQiwrQkFPcEM7QUFFRyxNQUFNLDBCQUEwQixHQUFHLENBQUMsUUFBZ0IsRUFBRSxFQUFFO0lBQzdELE9BQU8sSUFBSSxLQUFLLENBQ2QsbURBQW1ELFFBQVEscU1BQXFNLENBQ2pRLENBQUM7QUFDSixDQUFDLENBQUM7QUFKVyxRQUFBLDBCQUEwQiw4QkFJckMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuICovXG5cbmltcG9ydCB7IElEZXBlbmRhYmxlIH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFRlcnJhZm9ybVN0YWNrIH0gZnJvbSBcIi4vdGVycmFmb3JtLXN0YWNrXCI7XG5cbmV4cG9ydCBjb25zdCBub0FwcEZvdW5kID0gKGNvbnN0cnVjdFBhdGg6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBObyBhcHAgY291bGQgYmUgaWRlbnRpZmllZCBmb3IgdGhlIGNvbnN0cnVjdCBhdCBwYXRoICcke2NvbnN0cnVjdFBhdGh9JyAobGlrZWx5IGEgVGVycmFmb3JtU3RhY2spLlxuVGhlIHNjb3BlIG9mIENES1ROJ3MgVGVycmFmb3JtU3RhY2sgY2xhc3MgaXMgYSBzaW5nbGUgQXBwIGluc3RhbmNlIGNyZWF0ZWQgYnkgJ2NvbnN0IGFwcCA9IG5ldyBBcHAoKScuIFRoZSBBcHAgaXMgeW91ciBwcm9qZWN0J3Mgcm9vdCwgaG9sZGluZyBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gYW5kIHZhbGlkYXRpb25zLlxuTGVhcm4gbW9yZSBhYm91dCB0aGUgQXBwOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvY2RrdG4tYXJjaGl0ZWN0dXJlI2FwcC1jbGFzc1xuICAgIGAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBhcHBWYWxpZGF0aW9uRmFpbHVyZSA9IChlcnJvckxpc3Q6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBBcHAtbGV2ZWwgdmFsaWRhdGlvbiBmYWlsZWQgd2l0aCB0aGUgZm9sbG93aW5nIGVycm9yczpcXG4gICR7ZXJyb3JMaXN0fVxuVmFsaWRhdGlvbnMgYWxsb3cgZm9yIGR5bmFtaWMgdmVyaWZpY2F0aW9uIG9mIHlvdXIgcHJvamVjdC5cblRvIHNraXAgdmFsaWRhdGlvbnMsIGFkZCAnc2tpcFZhbGlkYXRpb246IHRydWUnIHRvIHlvdXIgQXBwIGNvbmZpZy5cbiAgICBgLFxuICApO1xuXG5leHBvcnQgY29uc3QgcHJvdmlkZXJWZXJzaW9uTWlzbWF0Y2ggPSAoKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFZlcnNpb24gbWlzbWF0Y2ggZGV0ZWN0ZWQ6IFlvdXIgcHJvdmlkZXIgYmluZGluZ3MgYXJlIGJ1aWx0IGZvciBhbiBvbGRlciB2ZXJzaW9uIG9mIENES1RuLlxuVXBncmFkZSB5b3VyIHByZS1idWlsdCBwcm92aWRlciBvciByZS1ydW4gY2RrdG4gZ2V0IHdpdGggYSBtb3JlIHJlY2VudCB2ZXJzaW9uICg+PSAwLjEwKSBvZiB0aGUgY2RrdG4tY2xpLlxuICAgIGAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBhc3NldE91dE9mU2NvcGVPZkNES1RGSnNvbiA9IChpZDogc3RyaW5nLCBjb25maWdQYXRoOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgVGVycmFmb3JtQXNzZXQgJHtpZH0gd2FzIGNyZWF0ZWQgd2l0aCBhIHJlbGF0aXZlIHBhdGggJyR7Y29uZmlnUGF0aH0nLCBidXQgd2UgY2Fubm90IGZpbmQgdGhlIGNka3RmLmpzb24gd2l0aGluIHlvdXIgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAnJHtwcm9jZXNzLmN3ZCgpfSdcblxuVGhlIGNka3RmLmpzb24gZmlsZSBpcyBuZWVkZWQgdG8gZXN0YWJsaXNoIHRoZSBiYXNlIGZvciB0aGUgcmVsYXRpdmUgcGF0aCAodGhlICcuJyBpbiAnLi9mb28vYmFyJykuXG5cblBsYWNlIGEgY2RrdGYuanNvbiBhdCB0aGUgcm9vdCBvZiB5b3VyIHByb2plY3QuIExlYXJuIG1vcmU6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jcmVhdGUtYW5kLWRlcGxveS9jb25maWd1cmF0aW9uLWZpbGVcbkxlYXJuIG1vcmUgYWJvdXQgVGVycmFmb3JtQXNzZXQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9hc3NldHNcbmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBhc3NldEV4cGVjdHNEaXJlY3RvcnkgPSAoaWQ6IHN0cmluZywgY29uZmlnUGF0aDogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFRlcnJhZm9ybUFzc2V0ICR7aWR9IGV4cGVjdHMgcGF0aCB0byBwb2ludCB0byBhIGRpcmVjdG9yeS4gSW5zdGVhZCwgdGhpcyBmaWxlIHdhcyBwYXNzZWQ6ICcke2NvbmZpZ1BhdGh9Jy4gUGxlYXNlIGNvcnJlY3QgdGhlIHBhdGggdG8gcG9pbnQgdG8gYSBkaXJlY3RvcnkuXG5MZWFybiBtb3JlIGFib3V0IFRlcnJhZm9ybUFzc2V0OiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvYXNzZXRzXG4gICAgYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFzc2V0VHlwZU5vdEltcGxlbWVudGVkID0gKCkgPT5cbiAgbmV3IEVycm9yKGBBc3NldCB0eXBlIGlzIG5vdCBpbXBsZW1lbnRlZC5cblBvc3NpYmxlIEFzc2V0IHR5cGVzIGluY2x1ZGU6IEZJTEUsIERJUkVDVE9SWSwgYW5kIEFSQ0hJVkUuXG5UYWtlIG9uZSBvZiB0aGVzZSB2YWx1ZXMgZnJvbSB0aGUgQXNzZXRUeXBlIEVudW0uXG5MZWFybiBtb3JlIGFib3V0IFRlcnJhZm9ybUFzc2V0OiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvYXNzZXRzXG4gIGApO1xuXG5leHBvcnQgY29uc3QgZHluYW1pY0Jsb2NrTm90U3VwcG9ydGVkID0gKF9mb3JlYWNoRXhwcmVzc2lvbjogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFdlIGRvIG5vdCBzdXBwb3J0IGRpcmVjdGx5IHJlc29sdmluZyBhIFRlcnJhZm9ybUR5bmFtaWNCbG9jay4gRHluYW1pYyBibG9ja3MgYXJlIG9ubHkgc3VwcG9ydGVkIG9uIGJsb2NrIGF0dHJpYnV0ZXMgb2YgcmVzb3VyY2VzLCBkYXRhIHNvdXJjZXMsIGFuZCBwcm92aWRlcnMuXG5cbllvdSBjYW4gY3JlYXRlIGEgVGVycmFmb3JtRHluYW1pY0Jsb2NrIGJ5IGNhbGxpbmcgJy5keW5hbWljJyBvbiBhIFRlcnJhZm9ybUl0ZXJhdG9yIGluc3RhbmNlLlxuXG5UaGUgZm9sbG93aW5nIGV4cHJlc3Npb24gd2FzIHVzZWQgZm9yIHRoZSBkeW5hbWljIGJsb2NrOiAuZHluYW1pYyh7XG4gICR7X2ZvcmVhY2hFeHByZXNzaW9ufVxufSlcbmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCB1bnJlc29sdmVkVG9rZW5JbkNvbnN0cnVjdElkID0gKGlkOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgWW91IGNhbm5vdCB1c2UgYSB0b2tlbiAoZS5nLiwgYSByZWZlcmVuY2UgdG8gYW4gYXR0cmlidXRlKSBhcyB0aGUgaWQgb2YgYSBjb25zdHJ1Y3QuIElkcyBvZiBjb25zdHJ1Y3RzIG11c3QgYmUga25vd24gYXQgc3ludGhlc2lzIHRpbWUsIGFuZCB0b2tlbiB2YWx1ZXMgYXJlIG9ubHkga25vd24gd2hlbiBUZXJyYWZvcm0gcnVucy4gUGxlYXNlIHVzZSBhIGNvbmNyZXRlIHZhbHVlIGZvciB5b3VyIGNvbnN0cnVjdHMgSUQgaW5zdGVhZC5cbllvdSBwYXNzZWQgdGhlIGZvbGxvd2luZyBpZDogXCIke2lkfVwiXG5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgaXRlcmF0b3JPblJlc291cmNlV2l0aENvdW50ID0gKCkgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBZb3UgY2Fubm90IGNyZWF0ZSBhbiBpdGVyYXRvciBmcm9tIGEgcmVzb3VyY2Ugd2l0aCBhIGNvdW50IGFyZ3VtZW50LlxuSW5zdGVhZCwgcmV1c2UgdGhpcyByZXNvdXJjZSdzIFRlcnJhZm9ybUNvdW50IGluc3RhbmNlIGluIHRoZSByZXNvdXJjZSB5b3Ugd2FudCB0byB1c2UgYXMgYW4gaXRlcmF0b3IuXG5cbklmIHlvdSB3YW50IHRvIHVzZSBhbiBpdGVyYXRvciB0byBwb3B1bGF0ZSBhIGxpc3QgYXR0cmlidXRlLCByZXBsYWNlIHRoZSBjb3VudCBvbiB0aGUgcmVzb3VyY2Ugd2l0aCBhbiBpdGVyYXRvciBwYXNzZWQgaW50byB0aGUgZm9yRWFjaCBhcmd1bWVudC5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgaXRlcmF0b3JPblJlc291cmNlV2l0aG91dEZvckVhY2ggPSAoKSA9PlxuICBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUgYW4gaXRlcmF0b3IgZnJvbSBhIHJlc291cmNlIHdpdGhvdXQgYSBmb3JFYWNoIGFyZ3VtZW50LiBJZiB5b3Ugd2FudCB0byBjcmVhdGUgbW9yZSBpbnN0YW5jZXMgb2YgdGhpcyByZXNvdXJjZSwgcGFzcyBhbiBpdGVyYXRvciB0byB0aGUgZm9yRWFjaCBhcmd1bWVudCBvZiB0aGUgcmVzb3VyY2UgZmlyc3QuXG4gIGApO1xuXG5leHBvcnQgY29uc3QgbW9kdWxlc1dpdGhTYW1lQWxpYXMgPSAoYWxpYXM6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBNdWx0aXBsZSBwcm92aWRlcnMgaGF2ZSB0aGUgc2FtZSBhbGlhczogXCIke2FsaWFzfVwiXG5FYWNoIHByb3ZpZGVyIG11c3QgaGF2ZSBhIHVuaXF1ZSBhbGlhcyB3aGVuIHBhc3NpbmcgbXVsdGlwbGUgcHJvdmlkZXJzIG9mIHRoZSBzYW1lIHR5cGUgdG8gbW9kdWxlcy5cbiAgYCk7XG5cbmV4cG9ydCBjb25zdCBtb3ZlVGFyZ2V0QWxyZWFkeVNldCA9IChcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIGZyaWVuZGx5VW5pcXVlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbikgPT5cbiAgbmV3IEVycm9yKGBUYXJnZXQgXCIke3RhcmdldH1cIiBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgZm9yIHRoZSBjb25zdHJ1Y3QgJHtmcmllbmRseVVuaXF1ZUlkfS5cblRhcmdldCBtdXN0IGJlIGEgc3RyaW5nIHRoYXQgaXMgdW5pcXVlIGFjcm9zcyBhbGwgcmVzb3VyY2VzIGluIHRoZSBzYW1lIHN0YWNrLmApO1xuXG5leHBvcnQgY29uc3QgbW92ZVRhcmdldE5vdFNldCA9ICh0YXJnZXQ6IHN0cmluZywgZW50cmllczogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYFRhcmdldCBcIiR7dGFyZ2V0fVwiIGhhcyBub3QgYmVlbiBzZXQuXG5Zb3UgdHJpZWQgdG8gbW92ZSBhIHJlc291cmNlIHdpdGhvdXQgYSB0YXJnZXQuXG5DYWxsIC5hZGRNb3ZlVGFyZ2V0KFwiJHt0YXJnZXR9XCIpIG9uIHRoZSBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UgeW91IHdhbnQgdG8gbW92ZSB0aGlzIHJlc291cmNlIHRvLlxuXG5BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB0YXJnZXRzIChpbiBjYXNlIHlvdSBoYWQgYSB0eXBvKTpcbiR7ZW50cmllc31cbmApO1xuXG5leHBvcnQgY29uc3QgbW92ZWRUb1Jlc291cmNlT2ZEaWZmZXJlbnRUeXBlID0gKFxuICBtb3ZlVGFyZ2V0OiBzdHJpbmcsXG4gIG9yaWdpbmFsUmVzb3VyY2VUeXBlOiBzdHJpbmcsXG4gIGRlc3RpbmF0aW9uUmVzb3VyY2VUeXBlOiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihgV2UgZG8gbm90IHN1cHBvcnQgbW92aW5nIHJlc291cmNlcyB0byBhIGRpZmZlcmVudCB0eXBlLlxuXG5UaGUgZGVzdGluYXRpb24gXCIke21vdmVUYXJnZXR9XCIncyByZXNvdXJjZSB0eXBlICR7ZGVzdGluYXRpb25SZXNvdXJjZVR5cGV9IGRpZmZlcnMgZnJvbSB0aGUgb3JpZ2luYWwgcmVzb3VyY2UgdHlwZSAoJHtvcmlnaW5hbFJlc291cmNlVHlwZX0pIHlvdSBhcmUgdHJ5aW5nIHRvIG1vdmUuXG5cbklmIHRoaXMgd2FzIGludGVudGlvbmFsLCB0cnkgaW1wb3J0aW5nIHRoZSBleGlzdGluZyByZXNvdXJjZSBpbnRvIHlvdXIgdGFyZ2V0IGluc3RlYWQuIExlYXJuIG1vcmU6XG5odHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVzb3VyY2VzI2ltcG9ydGluZy1yZXNvdXJjZXNcblxuTm90ZSB0aGF0IHlvdSBtdXN0IG1hbnVhbGx5IHJlbW92ZSB0aGUgb3JpZ2luYWwgcmVzb3VyY2UgZnJvbSB5b3VyIHN0YXRlIGZpbGUgYWZ0ZXIgaW1wb3J0aW5nIGl0LiBVc2UgdGhlIFwidGVycmFmb3JtIHN0YXRlIHJtXCIgY29tbWFuZCBpbiB0aGUgb3V0cHV0IGRpcmVjdG9yeSBvZiB0aGUgc3RhY2sgeW91IGRlZmluZWQgdGhpcyByZXNvdXJjZSBpbi4gTGVhcm4gbW9yZTpcbmh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2NsaS9jb21tYW5kcy9zdGF0ZS9ybVxuYCk7XG5cbmV4cG9ydCBjb25zdCByZXNvdXJjZUdpdmVuVHdvTW92ZU9wZXJhdGlvbnNCeVRhcmdldEFuZElkID0gKFxuICBpZDogc3RyaW5nLFxuICBleGlzdGluZ1RhcmdldDogc3RyaW5nLFxuICBuZXdNb3ZlOiB7IHRvOiBzdHJpbmc7IGZyb206IHN0cmluZyB9LFxuKSA9PlxuICBuZXcgRXJyb3IoYFxuVGhlIHJlc291cmNlICR7aWR9IGhhcyBiZWVuIGdpdmVuIHR3byBkaWZmZXJlbnQgbW92ZSBvcGVyYXRpb25zLlxuXG5Nb3ZlIHRhcmdldDogXCIke2V4aXN0aW5nVGFyZ2V0fVwiXG5Nb3ZlIGJ5IGlkOiB7XG4gIGZyb206ICR7bmV3TW92ZS5mcm9tfVxuICB0bzogJHtuZXdNb3ZlLnRvfVxufVxuXG5Pbmx5IG9uZSBtb3ZlIG9wZXJhdGlvbiBjYW4gb2NjdXIgcGVyIHBsYW4vYXBwbHkuIFJlbW92ZSBvbmUgb2YgdGhlIG9wZXJhdGlvbnMuXG5cbkxlYXJuIG1vcmUgYWJvdXQgbW92aW5nIHJlc291cmNlczogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2V4YW1wbGVzLWFuZC1ndWlkZXMvcmVmYWN0b3JpbmcjOn46dGV4dD1Nb3ZpbmclMjAlMjYlMjBSZW5hbWluZyUyMFJlc291cmNlcyUyMFdpdGhpbiUyMGElMjBTdGFja1xuYCk7XG5cbmV4cG9ydCBjb25zdCByZXNvdXJjZUdpdmVuVHdvTW92ZU9wZXJhdGlvbnNCeUlkID0gKFxuICBpZDogc3RyaW5nLFxuICBleGlzdGluZ01vdmU6IHsgdG86IHN0cmluZzsgZnJvbTogc3RyaW5nIH0sXG4gIG5ld01vdmU6IHsgdG86IHN0cmluZzsgZnJvbTogc3RyaW5nIH0sXG4pID0+XG4gIG5ldyBFcnJvcihgXG5UaGUgcmVzb3VyY2UgJHtpZH0gaGFzIGJlZW4gZ2l2ZW4gdHdvIGRpZmZlcmVudCBtb3ZlIG9wZXJhdGlvbnMuXG5cbntcbiAgZnJvbTogJHtleGlzdGluZ01vdmUuZnJvbX1cbiAgdG86ICR7ZXhpc3RpbmdNb3ZlLnRvfVxufVxue1xuICBmcm9tOiAke25ld01vdmUuZnJvbX1cbiAgdG86ICR7bmV3TW92ZS50b30gKFJlc291cmNlIGNhbGxpbmcgdGhlIG1vdmUgdG8gb3BlcmF0aW9uKVxufVxuXG5Pbmx5IG9uZSBtb3ZlIG9wZXJhdGlvbiBjYW4gb2NjdXIgcGVyIHBsYW4vYXBwbHkuIFJlbW92ZSBvbmUgb2YgdGhlIG9wZXJhdGlvbnMuXG5cbkxlYXJuIG1vcmUgYWJvdXQgbW92aW5nIHJlc291cmNlczogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2V4YW1wbGVzLWFuZC1ndWlkZXMvcmVmYWN0b3JpbmcjOn46dGV4dD1Nb3ZpbmclMjAlMjYlMjBSZW5hbWluZyUyMFJlc291cmNlcyUyMFdpdGhpbiUyMGElMjBTdGFja1xuYCk7XG5cbmV4cG9ydCBjb25zdCByZXNvdXJjZUdpdmVuVHdvTW92ZU9wZXJhdGlvbnNCeVRhcmdldCA9IChcbiAgcmVzb3VyY2VJZDogc3RyaW5nLFxuICBleGlzdGluZ01vdmVUYXJnZXQ6IHN0cmluZyxcbiAgbmV3TW92ZVRhcmdldDogc3RyaW5nLFxuKSA9PlxuICBuZXcgRXJyb3IoYFRoZSByZXNvdXJjZSAke3Jlc291cmNlSWR9IGhhcyBiZWVuIGdpdmVuIHR3byBkaWZmZXJlbnQgbW92ZVRhcmdldHM6IFwiJHtuZXdNb3ZlVGFyZ2V0fVwiIGFuZCBcIiR7ZXhpc3RpbmdNb3ZlVGFyZ2V0fVwiXG5cbkEgcmVzb3VyY2UgY2FuIG9ubHkgYmUgbW92ZWQgb25jZSBwZXIgcGxhbi9hcHBseS5cblxuTGVhcm4gbW9yZSBhYm91dCBtb3ZpbmcgcmVzb3VyY2VzOiBodHRwczovL2Nka3RuLmlvL2RvY3MvZXhhbXBsZXMtYW5kLWd1aWRlcy9yZWZhY3RvcmluZyM6fjp0ZXh0PU1vdmluZyUyMCUyNiUyMFJlbmFtaW5nJTIwUmVzb3VyY2VzJTIwV2l0aGluJTIwYSUyMFN0YWNrXG5gKTtcblxuZXhwb3J0IGNvbnN0IHN0YWNrQ29udGFpbnNEaXNhbGxvd2VkQ2hhciA9IChcbiAgc3RhY2tJZDogc3RyaW5nLFxuICBpbnZhbGlkQ2hhcjogc3RyaW5nLFxuKSA9PlxuICBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUgVGVycmFmb3JtIHN0YWNrIHdpdGggaWQgXCIke3N0YWNrSWR9XCIuIEl0IGNvbnRhaW5zIGFuIGludmFsaWQgZ2xvYiBjaGFyYWN0ZXI6IFwiJHtpbnZhbGlkQ2hhcn1cIi5cblxuR2xvYiBjaGFyYWN0ZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHN0YWNrIG5hbWVzIGJlY2F1c2Ugd2UgdXNlIHRoZW0gdG8gZGVwbG95IGFuZCBkZXN0cm95IG11bHRpcGxlIHN0YWNrcy4gRm9yIGV4YW1wbGUsICdjZGt0biBkZXBsb3kgXFxgKi1wcm9kdWN0aW9uXFxgJyBkZXBsb3lzIGFsbCBzdGFja3Mgd2l0aCBuYW1lcyB0aGF0IGVuZCBpbiAnLXByb2R1Y3Rpb24nLlxuYCk7XG5cbmV4cG9ydCBjb25zdCBzdGFja0lkQ29udGFpbnNXaGl0ZXNwYWNlID0gKHN0YWNrSWQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBDYW5ub3QgY3JlYXRlIFRlcnJhZm9ybVN0YWNrIHdpdGggaWQgXCIke3N0YWNrSWR9XCIuIEl0IGNvbnRhaW5zIGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuXG5cblBsZWFzZSByZW1vdmUgYW55IHdoaXRlc3BhY2UgY2hhcmFjdGVycyBpbiB5b3VyIFRlcnJhZm9ybVN0YWNrIGlkLCBsaWtlIHNvOiBcIiR7c3RhY2tJZC5yZXBsYWNlKFxuICAgIC9cXHMvZyxcbiAgICBcIlwiLFxuICApfVwiXG5gKTtcblxuZXhwb3J0IGNvbnN0IG5vU3RhY2tGb3JDb25zdHJ1Y3QgPSAoY29uc3RydWN0UGF0aDogc3RyaW5nLCBoaW50OiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgTm8gc3RhY2sgY291bGQgYmUgaWRlbnRpZmllZCBmb3IgdGhlIGNvbnN0cnVjdCBhdCBwYXRoICcke2NvbnN0cnVjdFBhdGh9JyR7aGludH1cblxuWW91IGNhbiBvbmx5IHVzZSBjb25zdHJ1Y3RzIGFzIHBhcnQgb2YgYSBUZXJyYWZvcm1TdGFjay5cblxuVG8gbGVhcm4gbW9yZSBhYm91dCBDb25zdHJ1Y3RzIHZzLiBUZXJyYWZvcm1TdGFja3MsIHJlZmVyIHRvOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvY29uc3RydWN0cyM6fjp0ZXh0PUNvbnN0cnVjdHMlMjB2cy4lMjBTdGFja3NcbmApO1xuXG5leHBvcnQgY29uc3Qgc3RhY2tIYXNDaXJjdWxhckRlcGVuZGVuY3kgPSAoXG4gIHRoaXNTdGFjazogVGVycmFmb3JtU3RhY2ssXG4gIGRlcGVuZGVuY3k6IFRlcnJhZm9ybVN0YWNrLFxuKSA9PlxuICBuZXcgRXJyb3IoYENhbm5vdCBhZGQgZGVwZW5kZW5jeSAke2RlcGVuZGVuY3l9IHRvICR7dGhpc1N0YWNrfSwgYmVjYXVzZSBpdCB3b3VsZCBjYXVzZSBhIGNpcmN1bGFyIGRlcGVuZGVuY3kuXG5cblRlcnJhZm9ybVN0YWNrICR7ZGVwZW5kZW5jeX0gaXMgYWxyZWFkeSBkZXBlbmRlbnQgb24gJHt0aGlzU3RhY2t9IGRpcmVjdGx5LCBvciBkZXBlbmRlbnQgb24gYSBUZXJyYWZvcm1TdGFjayB3aXRoaW4gJHt0aGlzU3RhY2t9LlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IGNpcmN1bGFyIGRlcGVuZGVuY3kgcmVmZXJlbmNlcywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9zdGFja3MjOn46dGV4dD1Dcm9zcyUyRFN0YWNrJTIwUmVmZXJlbmNlc1xuYCk7XG5cbmV4cG9ydCBjb25zdCBzdGFja1ZhbGlkYXRpb25GYWlsdXJlID0gKGVycm9yTGlzdDogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYFZhbGlkYXRpb24gZmFpbGVkIHdpdGggdGhlIGZvbGxvd2luZyBlcnJvcnM6XFxuICAke2Vycm9yTGlzdH1cblxuSWYgeW91IHdpc2ggdG8gaWdub3JlIHRoZXNlIHZhbGlkYXRpb25zLCBwYXNzICdza2lwVmFsaWRhdGlvbjogdHJ1ZScgdG8geW91ciBBcHAgY29uZmlndXJhdGlvbi5cbmApO1xuXG5leHBvcnQgY29uc3QgbWF0Y2hlcnNQYXRoSXNOb3REaXJlY3RvcnkgPSAoZnVuY3Rpb25OYW1lOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgUGF0aCBpcyBub3QgYSBkaXJlY3RvcnkuXG5cbkVuc3VyZSB5b3UgYXJlIHBhc3NpbmcgdGhlIHJlc3VsdCBvZiBUZXN0aW5nLmZ1bGxTeW50aCgnc3RhY2sgaW5zdGFuY2UnKSB0byAnJHtmdW5jdGlvbk5hbWV9Jywgbm90IFRlc3Rpbmcuc3ludGgoJ3N0YWNrIGluc3RhbmNlJykuXG5cblRlc3RpbmcuZnVsbFN5bnRoIHJldHVybnMgYSBmaWxlIHBhdGggdG8gYSB0ZW1wb3JhcnkgdGVzdGluZyBlbnZpcm9ubWVudC4gVGVzdGluZy5zeW50aCByZXR1cm5zIHRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHlvdXIgc3RhY2suXG5cblRvIGxlYXJuIG1vcmUgYWJvdXQgdGVzdGluZyBpbiBDREtUTiwgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy90ZXN0L3VuaXQtdGVzdHNgKTtcblxuZXhwb3J0IGNvbnN0IG1hdGNoZXJzRm91bmRFcnJvcnNJblN0YWNrID0gKFxuICBlcnJvckNvdW50OiBhbnksXG4gIHN0YWNrTmFtZTogc3RyaW5nLFxuICBkaWFnbm9zdGljczogc3RyaW5nLFxuKSA9PlxuICBuZXcgRXJyb3IoYEZvdW5kICR7ZXJyb3JDb3VudH0gRXJyb3JzIGluIHN0YWNrICR7c3RhY2tOYW1lfTogJHtkaWFnbm9zdGljc31cblxuVGhlc2UgZXJyb3JzIGFyZSBub3QgdGVzdCBmYWlsdXJlcywgYnV0IGlzc3VlcyB3aXRoIHRoZSB1bmRlcmx5aW5nIFRlcnJhZm9ybVN0YWNrIGJlaW5nIHRlc3RlZC4gRml4IHRoZSBhYm92ZSBpc3N1ZXMgYmVmb3JlIHJ1bm5pbmcgeW91ciB0ZXN0cyBhZ2Fpbi5cbmApO1xuXG5leHBvcnQgY29uc3QgamVzdE5vdEluc3RhbnRpYXRlZCA9ICgpID0+XG4gIG5ldyBFcnJvcihgSmVzdCB3YXMgbm90IHByb3Blcmx5IGluc3RhbnRpYXRlZC5cblxuRW5zdXJlIHlvdSBoYXZlIGEgJ3NldHVwLmpzJyBmaWxlIGluIHlvdXIgcHJvamVjdCdzIGRpcmVjdG9yeSB0aGF0IGNhbGxzICdjZGt0bi5UZXN0aW5nLnNldHVwSmVzdCgpJy5cblxuVG8gbGVhcm4gbW9yZSBhYm91dCBzZXR0aW5nIHVwIHRlc3RpbmcsIHJlZmVyIHRvOiBodHRwczovL2Nka3RuLmlvL2RvY3MvdGVzdC91bml0LXRlc3RzIzp+OnRleHQ9QWRkJTIwVGVzdGluZyUyMHRvJTIwWW91ciUyMEFwcGxpY2F0aW9uXG5gKTtcblxuZXhwb3J0IGNvbnN0IGV4cGVjdE5vdEdsb2JhbGx5QWNjZXNzaWJsZSA9ICgpID0+XG4gIG5ldyBFcnJvcihgVGhlIGV4cGVjdCBmdW5jdGlvbiBpcyBub3QgZ2xvYmFsbHkgYWNjZXNzaWJsZS5cblxuVG8gbGVhcm4gbW9yZSBhYm91dCBzZXR0aW5nIHVwIHRlc3RpbmcsIHJlZmVyIHRvOiBodHRwczovL2Nka3RuLmlvL2RvY3MvdGVzdC91bml0LXRlc3RzIzp+OnRleHQ9QWRkJTIwVGVzdGluZyUyMHRvJTIwWW91ciUyMEFwcGxpY2F0aW9uXG5gKTtcblxuZXhwb3J0IGNvbnN0IGludmFsaWRTdGFjayA9IChmdW5jdGlvbk5hbWU6IHN0cmluZywgc3RhY2tDb250ZW50OiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgSW52YWxpZCBKU09OIHN0cmluZyBwYXNzZWQ6ICR7c3RhY2tDb250ZW50fVxuXG5cbkVuc3VyZSB5b3UgYXJlIHBhc3NpbmcgdGhlIHJlc3VsdCBvZiBUZXN0aW5nLnN5bnRoKCdzdGFjayBpbnN0YW5jZScpIHRvICcke2Z1bmN0aW9uTmFtZX0nLCBub3QgVGVzdGluZy5mdWxsU3ludGgoJ3N0YWNrIGluc3RhbmNlJykuXG5cblxuVGVzdGluZy5zeW50aCByZXR1cm5zIHRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHlvdXIgc3RhY2suIENES1ROIGNhbiB1c2UgYXNzZXJ0aW9ucyB3aXRoIHRoaXMgSlNPTiB0byBjaGVjayB0aGUgY29tcG9zaXRpb24gb2YgeW91ciBzdGFja3MsIGxpa2Ugc286IFwiVGVzdGluZy50b0hhdmVSZXNvdXJjZShUZXN0aW5nLnN5bnRoKCdUZXJyYWZvcm1TdGFjayBpbnN0YW5jZScpLCBTM0J1Y2tldClcIlxuXG5UZXN0aW5nLmZ1bGxTeW50aCByZXR1cm5zIGEgZmlsZSBwYXRoIHRvIGEgdGVtcG9yYXJ5IHRlc3RpbmcgZW52aXJvbm1lbnQuXG5cblRvIGxlYXJuIG1vcmUgYWJvdXQgdGVzdGluZyBpbiBDREtUTiwgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy90ZXN0L3VuaXQtdGVzdHNcbmApO1xuXG5leHBvcnQgY29uc3QgdGFyZ2V0Tm90UmVzb2x2YWJsZVdpdGhPdmVycmlkZXMgPSAodGFyZ2V0OiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVGFyZ2V0ICgke3RhcmdldH0pIGNhbm5vdCBiZSBhIHJlc29sdmFibGUgdG9rZW4gaWYgeW91IHNwZWNpZmllZCBvdmVycmlkZXMuIFJlcGxhY2UgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCB5b3UgYXJlIG92ZXJyaWRpbmcgd2l0aCBhIHN0YXRpYyB2YWx1ZS5cblxuVG8gbGVhcm4gbW9yZSBhYm91dCBUb2tlbnMsIHJlZmVyIHRvOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvdG9rZW5zXG5gKTtcblxuZXhwb3J0IGNvbnN0IHNvdXJjZU9yVGFyZ2V0Tm90QW5PYmplY3QgPSAoXG4gIHNvdXJjZTogc3RyaW5nLFxuICBzb3VyY2VUeXBlOiBzdHJpbmcsXG4gIHRhcmdldDogc3RyaW5nLFxuICB0YXJnZXRUeXBlOiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihgQW4gaXNzdWUgb2NjdXJyZWQgZHVyaW5nIHRoZSBzeW50aGVzaXphdGlvbiBvZiB5b3VyIFRlcnJhZm9ybSBjb25maWd1cmF0aW9uLlxuXG5Cb3RoIHRoZSBzb3VyY2UgZWxlbWVudCAoJHtzb3VyY2V9KSBhbmQgaXRzIGNvbnRhaW5pbmcgdGFyZ2V0IGVsZW1lbnQgKCR7dGFyZ2V0fSkgbXVzdCBiZSBvYmplY3RzLlxuXG5UeXBlIG9mIHNvdXJjZTogJHtzb3VyY2VUeXBlfVxuVHlwZSBvZiB0YXJnZXQ6ICR7dGFyZ2V0VHlwZX1cbmApO1xuXG5leHBvcnQgY29uc3QgY29uc3RydWN0RGVwZW5kZW5jeUJlbG93VjEwID0gKCkgPT5cbiAgbmV3IEVycm9yKGBWZXJzaW9uIG1pc21hdGNoISBDREtUTiB2ZXJzaW9uIDAuNiByZXF1aXJlcyB5b3VyIGNvbnN0cnVjdHMgdmVyc2lvbiB0byBiZSB2MTAgb3IgYWJvdmUuXG5cblVwZGF0ZSB5b3VyIGNvbnN0cnVjdHMgZGVwZW5kZW5jeTogaHR0cHM6Ly9jZGsudGYvdXBncmFkZS1jb25zdHJ1Y3RzLXYxMFxuYCk7XG5cbmV4cG9ydCBjb25zdCBjbG91ZEJhY2tlbmRXb3Jrc3BhY2VJc05vdERlZmluZWRCeU5hbWUgPSAoKSA9PlxuICBuZXcgRXJyb3IoYFRoZSBDbG91ZCBiYWNrZW5kIG9ubHkgc3VwcG9ydHMgY3Jvc3Mtc3RhY2sgcmVmZXJlbmNlcyBpZiB0aGUgd29ya3NwYWNlIGlzIGRlZmluZWQgYnkgbmFtZSAobm90IGJ5IHRhZ3MpLlxuXG5UbyB1c2UgY3Jvc3Mtc3RhY2sgcmVmZXJlbmNlcywgcmVwbGFjZSBhbGwgbWVudGlvbnMgb2YgJ1RhZ2dlZENsb3VkV29ya3NwYWNlcycgd2l0aCAnTmFtZWRDbG91ZFdvcmtzcGFjZScsIGxpa2Ugc286XG5cbm5ldyBDbG91ZEJhY2tlbmQoc3RhY2ssIHtcbiAgLi4uXG4gIHdvcmtzcGFjZXM6IG5ldyBOYW1lZENsb3VkV29ya3NwYWNlKFwibXktYXBwXCIpLFxufSk7XG5cblRvIGxlYXJuIG1vcmUgYWJvdXQgUmVtb3RlIEJhY2tlbmRzLCByZWZlciB0bzogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3JlbW90ZS1iYWNrZW5kc1xuYCk7XG5cbmV4cG9ydCBjb25zdCB2YWx1ZUNvbnRhaW5zVW5lc2NhcGVkUXVvdGVzID0gKHZhbHVlOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgWW91ciB2YWx1ZSwgJyR7dmFsdWV9JywgaGFzIHVuZXNjYXBlZCBkb3VibGUgcXVvdGVzIGluIGl0LCBzbyBpdCBjYW5ub3QgYmUgdXNlZCBhcyBhIHZhbHVlLlxuXG5UbyBzYWZlbHkgdXNlIHRoZSB2YWx1ZSwgdXNlIEZuLnJhd1N0cmluZyBvbiB5b3VyIHN0cmluZywgbGlrZSBzbzpcblxuRm4ucmF3U3RyaW5nKCcke3ZhbHVlfScpXG5cbkRvaW5nIHRoaXMgZW5zdXJlcyBDREtUTiBhbmQgVGVycmFmb3JtIGludGVycHJldCB5b3VyIHZhbHVlcyBjb3JyZWN0bHkuXG5cblRvIGxlYXJuIG1vcmUgYWJvdXQgYnVpbHQgaW4gVGVycmFmb3JtIGZ1bmN0aW9ucyB3aXRoaW4gQ0RLVE4sIHJlZmVyIHRvOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvZnVuY3Rpb25zXG5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgZW5jb3VudGVyZWRBbm5vdGF0aW9uV2l0aExldmVsRXJyb3IgPSAoZXJyb3JzOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgRW5jb3VudGVyZWQgQW5ub3RhdGlvbnMgd2l0aCBsZXZlbCBcIkVSUk9SXCI6XFxuJHtlcnJvcnN9XG5cbkVpdGhlciBmaXggdGhlIGlzc3VlcyBhYm92ZSwgb3Igc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBDREtURl9DT05USU5VRV9TWU5USF9PTl9FUlJPUl9BTk5PVEFUSU9OUyB0byBpZ25vcmUgdGhlc2UgYW5ub3RhdGlvbnMuXG5gKTtcblxuZXhwb3J0IGNvbnN0IHZhbHVlSXNJbnZhbGlkU3RyaW5nT3JUb2tlbiA9ICh2YWx1ZTogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYCcke3ZhbHVlfScgaXMgbm90IGEgdmFsaWQgc3RyaW5nIG5vciBhIHRva2VuLiBUaGlzIGZ1bmN0aW9uIG9ubHkgYWNjZXB0cyBzdHJpbmdzIG9yIHRva2VucyByZXNvbHZpbmcgdG8gc3RyaW5ncy4gUGxlYXNlIGNoYW5nZSB5b3VyIGNvZGUgYWNjb3JkaW5nbHkuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IHZhbHVlSXNJbnZhbGlkTnVtYmVyT3JUb2tlbiA9ICh2YWx1ZTogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYCR7dmFsdWV9IGlzIG5vdCBhIHZhbGlkIG51bWJlciBub3IgYSB0b2tlbi4gVGhpcyBmdW5jdGlvbiBvbmx5IGFjY2VwdHMgbnVtYmVycyBvciB0b2tlbnMgcmVzb2x2aW5nIHRvIG51bWJlcnMuIFBsZWFzZSBjaGFuZ2UgeW91ciBjb2RlIGFjY29yZGluZ2x5LmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBsaXN0RWxlbWVudElzT2ZXcm9uZ1R5cGUgPSAoXG4gIHZhbHVlOiBhbnlbXSxcbiAgcG9zaXRpb246IG51bWJlcixcbiAgZXJyb3I6IHVua25vd24sXG4pID0+XG4gIG5ldyBFcnJvcihcbiAgICBgRWxlbWVudCBpbiBsaXN0ICR7dmFsdWV9IGF0IHBvc2l0aW9uICR7cG9zaXRpb259IGlzIG5vdCB0aGUgcmlnaHQgdHlwZTogJHtlcnJvcn0uXG4gICAgUGxlYXNlIGVuc3VyZSBhbGwgZWxlbWVudHMgaW4gdGhlIGxpc3QgYXJlIHRoZSBjb3JyZWN0IHR5cGUgZm9yIHRoaXMgZnVuY3Rpb24uYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uUmVjZWl2ZWRXcm9uZ051bWJlck9mQXJncyA9IChcbiAgbmFtZTogc3RyaW5nLFxuICBhcmdWYWxpZGF0b3JzTGVuZ3RoOiBudW1iZXIsXG4gIGFyZ3NMZW5ndGg6IG51bWJlcixcbikgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBGdW5jdGlvbiAke25hbWV9IHRha2VzICR7YXJnVmFsaWRhdG9yc0xlbmd0aH0gYXJndW1lbnRzLCBidXQgJHthcmdzTGVuZ3RofSB3ZXJlIHByb3ZpZGVkLiBQbGVhc2UgYWRkIHRoZSBtaXNzaW5nIGFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24uYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uQXJndW1lbnRWYWxpZGF0aW9uRmFpbHVyZSA9IChcbiAgYXJnTnVtYmVyOiBudW1iZXIsXG4gIG5hbWU6IHN0cmluZyxcbiAgZXJyb3I6IHVua25vd24sXG4pID0+XG4gIG5ldyBFcnJvcihcbiAgICBgQXJndW1lbnQgJHthcmdOdW1iZXJ9IG9mICR7bmFtZX0gZmFpbGVkIHRoZSB2YWxpZGF0aW9uOiAke2Vycm9yfS4gUGxlYXNlIGNoYW5nZSB5b3VyIGNvZGUgdG8gcGFzcyBhIHZhbGlkIHZhbHVlIGZvciB0aGlzIGFyZ3VtZW50LmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBjYW5ub3RDYWxjSWRGb3JFbXB0eVNldE9mQ29tcG9uZW50cyA9ICgpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgVW5hYmxlIHRvIGNhbGN1bGF0ZSBhIHVuaXF1ZSBpZCBmb3IgYW4gZW1wdHkgc2V0IG9mIGNvbXBvbmVudHMuXG5cbiAgICBUaGlzIGhhcHBlbnMgd2hlbiB5b3UgYXR0ZW1wdCB0byBjcmVhdGUgYSB1bmlxdWUgaWQsIGJ1dCBkbyBub3QgcGFzcyBpbiBhbnkgY29uc3RydWN0IG5vZGUgaWRzLiBUaGlzIG1lYW5zIHlvdXIgY29uc3RydWN0IGxpa2VseSBoYXMgbm8gcGFyZW50LCB3aGljaCBpcyBub3QgYWxsb3dlZC5cblxuICAgIFBsZWFzZSBtYWtlIHN1cmUgeW91ciBjb25zdHJ1Y3QgaGFzIGEgcGFyZW50LiBGb3IgZXhhbXBsZTogJ25ldyBBcHAodGhpcyknIG9yICduZXcgVGVycmFmb3JtU3RhY2sodGhpcywgJ3N0YWNrJyknLmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBzdHJpbmdWYWx1ZUFkZGVkVG9SZWZlcmVuY2VMaXN0ID0gKGxpc3RUb2tlbjogc3RyaW5nW10pID0+XG4gIG5ldyBFcnJvcihcbiAgICBgQ2Fubm90IGFkZCBlbGVtZW50cyB0byBsaXN0IHRva2VuLCBnb3Q6ICR7bGlzdFRva2VufS5cblxuICAgIFdlIGV4cGVjdCB0aGUgZWxlbWVudHMgb2YgYSB0b2tlbml6ZWQgc3RyaW5nIGFycmF5IHRvIGJlIGEgc2luZ2xlIHRva2VuIHN0cmluZy4gRm9yIGV4YW1wbGUsIFtcIiZ7VGZUb2tlbltUb2tlbi4xXX1cIl0uXG5cbiAgICBPbmUgZWxlbWVudCBpbiB5b3VyIGFycmF5IGNvbnNpc3RzIG9mIG1vcmUgdGhhbiBhIHNpbmdsZSB2YWx1ZS4gVG8gYWRkIHZhbHVlcyB0byBhIHRva2VuaXplZCBsaXN0LCB1c2UgVGVycmFmb3JtIGZ1bmN0aW9ucyBpbnN0ZWFkLiBGb3IgZXhhbXBsZTogJ0ZuLmNvbmNhdChbeW91clJlZmVyZW5jZWRMaXN0LCBbXCJteVwiLCBcIm5ld1wiLCBcIml0ZW1zXCJdXSknLmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBjYW5ub3RDb25jYXRlbmF0ZVN0cmluZ3NJblRva2VuaXplZFN0cmluZ0FycmF5ID0gKFxuICBsaXN0VG9rZW46IHN0cmluZyxcbikgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBDYW5ub3QgY29uY2F0ZW5hdGUgc3RyaW5ncyBpbiBhIHRva2VuaXplZCBzdHJpbmcgYXJyYXksIGdvdDogJHtsaXN0VG9rZW59LlxuXG4gICAgV2UgZXhwZWN0IHRoZSBlbGVtZW50cyBvZiBhIHRva2VuaXplZCBzdHJpbmcgYXJyYXkgdG8gYmUgYSBzaW5nbGUgdG9rZW4gc3RyaW5nLiBGb3IgZXhhbXBsZSwgW1wiJntUZlRva2VuW1Rva2VuLjFdfVwiXS4gT25lIGVsZW1lbnQgaW4geW91ciBhcnJheSBjb25zaXN0cyBvZiBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIHNpbmdsZSB0b2tlbi5cblxuICAgIFlvdSBhcmUgbGlrZWx5IG11dGF0aW5nIHRoZSB2YWx1ZSBpbnNpZGUgeW91ciBhcnJheSwgd2hpY2ggQ0RLVE4gY2Fubm90IHJlc29sdmUgaW50byB0aGUgYXBwcm9wcmlhdGUgcnVudGltZSB2YWx1ZS5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgbnVtYmVyVmFsdWVBZGRlZFRvUmVmZXJlbmNlTGlzdCA9IChsaXN0VG9rZW46IG51bWJlcltdKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYENhbm5vdCBhZGQgZWxlbWVudHMgdG8gbGlzdCB0b2tlbiwgZ290OiAke2xpc3RUb2tlbn0uXG5cbiAgICBXZSB1c2UgdG9rZW5zIHRvIHJlcHJlc2VudCBydW50aW1lIHZhbHVlcyAoZS5nLiwgcmVmZXJlbmNlcyB0byBhdHRyaWJ1dGVzIG9mIHJlc291cmNlIG9yIGRhdGEgc291cmNlcykuIExpc3QgdG9rZW5zIGRvbid0IGNvbnRhaW4gdGhlIGFjdHVhbCB2YWx1ZXMgYmVjYXVzZSB0aG9zZSBhcmUgb25seSBhdmFpbGFibGUgYXQgYXBwbHkgdGltZSwgd2hlcmVhcyB0b2tlbnMgYXJlIHByZXNlbnQgZHVyaW5nIGNvbXBpbGUgdGltZS5cblxuICAgIElmIHlvdSB3YW50IHRvIGFkZCBhIHZhbHVlIHRvIGEgdG9rZW5pemVkIGxpc3QsIHVzZSBhIFRlcnJhZm9ybSBmdW5jdGlvbiBpbnN0ZWFkLiBGb3IgZXhhbXBsZTogRm4uY29uY2F0KFt5b3VyUmVmZXJlbmNlZExpc3QsIFs0MiwgNDMsIDQ0XV0pLmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBtYXBWYWx1ZUFkZGVkVG9SZWZlcmVuY2VMaXN0ID0gKG1hcFRva2VuOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgQ2Fubm90IGFkZCBlbGVtZW50cyB0byBtYXAgdG9rZW4sIGdvdDogJHttYXBUb2tlbn0uIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgbWVyZ2UgbXVsdGlwbGUgbWFwcywgb3IgaWYgeW91IGFkZCBhIG5ldyBrZXkgdmFsdWUgcGFpciB0byB0aGUgbWFwIHRva2VuLlxuXG4gICAgV2UgdXNlIHRva2VucyB0byByZXByZXNlbnQgcnVudGltZSB2YWx1ZXMgKGUuZy4sIHJlZmVyZW5jZXMgdG8gYXR0cmlidXRlcyBvZiByZXNvdXJjZSBvciBkYXRhIHNvdXJjZXMpLiBMaXN0IHRva2VucyBkb24ndCBjb250YWluIHRoZSBhY3R1YWwgdmFsdWVzIGJlY2F1c2UgdGhvc2UgYXJlIG9ubHkgYXZhaWxhYmxlIGF0IGFwcGx5IHRpbWUsIHdoZXJlYXMgdG9rZW5zIGFyZSBwcmVzZW50IGR1cmluZyBjb21waWxlIHRpbWUuXG5cbiAgICBJbnN0ZWFkIG9mIGFkZGluZyB0aGUgdmFsdWUgdG8gdGhlIHRva2VuaXplZCBtYXAsIHVzZSBhIFRlcnJhZm9ybSBmdW5jdGlvbi4gRm9yIGV4YW1wbGU6IEZuLm1lcmdlKFt5b3VyUmVmZXJlbmNlZE1hcCwgeyB5b3VyOiAndmFsdWUnIH1dKS4gVGhpcyBjcmVhdGVzIGEgbmV3IG1hcCBUb2tlbiBmb3IgYSB2YWx1ZSwgd2hpY2ggY291bGQgZ2V0IHJlbmRlcmVkIGFzOlxuICAgIG1lcmdlKG15X3Jlc291cmNlLnJlc291cmNlX25hbWUub25lX3NwZWNpZmljX21hcF9hdHRyaWJ1dGUsIHsgeW91cjogJyB2YWx1ZScgfSlgLFxuICApO1xuXG5leHBvcnQgY29uc3QgY2Fubm90Q29uY2F0ZW5hdGVTdHJpbmdzSW5Ub2tlbml6ZWRNYXAgPSAodG9rZW5pemVkTWFwOiBhbnkpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgQ2Fubm90IGNvbmNhdGVuYXRlIHN0cmluZ3MgaW4gYSB0b2tlbml6ZWQgbWFwLCBnb3Q6ICR7dG9rZW5pemVkTWFwfS5cblxuICAgIFdlIGV4cGVjdCB0aGUgZWxlbWVudHMgb2YgYSB0b2tlbml6ZWQgc3RyaW5nIGFycmF5IHRvIGJlIGEgc2luZ2xlIHRva2VuIHN0cmluZy4gRm9yIGV4YW1wbGUsIFtcIiZ7VGZUb2tlbltUb2tlbi4xXX1cIl0uIEEga2V5IGluIHlvdXIgbWFwIGNvbnNpc3RzIG9mIG1vcmUgdGhhbiBhIHN0cmluZyB0b2tlbiAoZS5nLiwgdGhlIFRva2VuIGFuZCBhIHN0YXRpYyBzdHJpbmcgb3IgbXVsdGlwbGUgVG9rZW5zKS5cblxuICAgIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgbXV0YXRlIHRoZSBrZXkgb2YgdGhlIG1hcC4gRG8gbm90IG11dGF0ZSB0b2tlbml6ZWQgTWFwcywgYmVjYXVzZSBpdCBtYWtlcyBpdCBpbXBvc3NpYmxlIGZvciBDREtUTiB0byB0cmFuc2xhdGUgdGhlbS5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgZG9lc05vdEltcGxlbWVudERlcGVuZGFibGVUcmFpdCA9IChpbnN0YW5jZTogSURlcGVuZGFibGUpID0+XG4gIG5ldyBFcnJvcihgJHtpbnN0YW5jZX0gZG9lcyBub3QgaW1wbGVtZW50IERlcGVuZGFibGVUcmFpdGApO1xuXG5leHBvcnQgY29uc3QgY2FuT25seUVuY29kZVBvc2l0aXZlSW50ZWdlcnMgPSAoKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYENhbiBvbmx5IGVuY29kZSBwb3NpdGl2ZSBpbnRlZ2VycyBpbnRvIFRva2Vucy4gVGhpcyBpcyBhIGJ1ZyBpbiBDREtUTiwgcGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0LmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBpbmRleFRvb0xhcmdlVG9FbmNvZGUgPSAoaW5kZXg6IG51bWJlcikgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBSZWNlaXZlZCBhbiBpbmRleCB0b28gbGFyZ2UgdG8gZW5jb2RlIGludG8gYSBUb2tlbiA6JHtpbmRleH0uXG5cbiAgICBUaGlzIGhhcHBlbnMgaWYgeW91IGhhdmUgdG9vIG1hbnkgVG9rZW5zIGluIGEgc2luZ2xlIENES1ROIGFwcGxpY2F0aW9uLiBUaGlzIGNhbiBhbHNvIG9jY3VyIGlmIHlvdSBhcmUgYWNjaWRlbnRhbGx5IGNyZWF0aW5nIG51bWVyaWMgdG9rZW5zIGluIGFuIGluZmluaXRlIGxvb3AuIEZvciBleGFtcGxlLCBjYWxsaW5nICdUb2tlbi5hc051bWJlcigpJyB0b28gbWFueSB0aW1lcy5cblxuICAgIElmIHlvdSByZWFjaCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYWxsb3dlZCBUb2tlbnMgKGEgbGltaXRhdGlvbiBpbXBvc2VkIGJ5IHRoZSB3YXkgd2UgZW5jb2RlIFRva2VucyBhbmQgc2VwYXJhdGUgdGhlbSBmcm9tIHJlYWwgbnVtZXJpYyB2YWx1ZXMpIHlvdSBjYW4gd29yayBhcm91bmQgdGhpcyBpc3N1ZSBieSBkaXZpZGluZyBhIHNpbmdsZSBhcHBsaWNhdGlvbiBpbnRvIG11bHRpcGxlIGFwcGxpY2F0aW9ucy5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgYXJnVG9JbnRyaW5zaWNNdXN0QmVQbGFpblZhbHVlID0gKFxuICB2YWx1ZTogYW55LFxuICBjcmVhdGlvblN0YWNrOiBzdHJpbmdbXSxcbikgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBZb3UgY2FuIG9ubHkgdXNlIGEgcGxhaW4gdmFsdWUgKG5vdCBhIGZ1bmN0aW9uKSB3aGlsZSBjcmVhdGluZyBhbiBJbnRyaW5zaWMgdG9rZW4uIFdlIHJlY2VpdmVkIHRoZSB2YWx1ZSAnJHt2YWx1ZX0nIGNyZWF0ZWQgYXQ6XFxuJHtjcmVhdGlvblN0YWNrLmpvaW4oXG4gICAgICBcIlxcblwiLFxuICAgICl9LiBJZiB5b3Ugd2FudCB0byB1c2UgYSBmdW5jdGlvbiwgcGxlYXNlIHVzZSB0aGUgTGF6eSBjbGFzcy4gRm9yIGV4YW1wbGU6ICBMYXp5LmFueVZhbHVlKHsgcHJvZHVjZTogKCkgPT4gXCJIZWxsbyBXb3JsZFwiIH0pLmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBpbnRyaW5zaWNOZXdFcnJvciA9IChtZXNzYWdlOiBzdHJpbmcsIGNyZWF0ZWRBdDogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYCR7bWVzc2FnZX1cXG5Ub2tlbiBjcmVhdGVkOlxcbiAgICBhdCAke2NyZWF0ZWRBdH1cXG5FcnJvciB0aHJvd246YCk7XG5cbmV4cG9ydCBjb25zdCB1bmFibGVUb1Jlc29sdmVDaXJjdWxhclJlZmVyZW5jZSA9IChwYXRoTmFtZTogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYFVuYWJsZSB0byByZXNvbHZlIG9iamVjdCB0cmVlIHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlIGF0ICcke3BhdGhOYW1lfScuXG5cblRoZSBkZXB0aCBvZiB5b3VyIG9iamVjdCB0cmVlIGlzIG92ZXIgMjAwLCBpbmRpY2F0aW5nIHlvdSBwcm9iYWJseSBoYXZlIGEgY3ljbGljYWwgcmVmZXJlbmNlLiBJbnNwZWN0IHRoZSBjb25zdHJ1Y3QgY3JlYXRpbmcgdGhpcyBjeWNsaWMgcmVmZXJlbmNlIChtb3N0IGxpa2VseSBpbiAnJHtwYXRoTmFtZX0nKSBhbmQgZW5zdXJlIGl0IGRvZXMgbm90IGluZmluaXRlbHkgbmVzdCBjb25zdHJ1Y3RzLmApO1xuXG5leHBvcnQgY29uc3QgY2Fubm90UmVzb2x2ZUZ1bmN0aW9uID0gKHBhdGhOYW1lOiBzdHJpbmcsIG9iajogYW55KSA9PlxuICBuZXcgRXJyb3IoYFRyeWluZyB0byByZXNvbHZlIGEgbm9uLWRhdGEgb2JqZWN0IChlLmcuLCBhIGZ1bmN0aW9uKSBhdCAnJHtwYXRoTmFtZX0nOiAke29ian0uIE9ubHkgdG9rZW5zIGFyZSBzdXBwb3J0ZWQgZm9yIGxhenkgZXZhbHVhdGlvbi5cblxuSWYgeW91IHdhbnQgdG8gdXNlIGEgbGF6aWx5IGNvbXB1dGVkIHZhbHVlLCB1c2UgdGhlIExhenkgY2xhc3MuIEZvciBleGFtcGxlOiAgTGF6eS5zdHJpbmdWYWx1ZSh7IHByb2R1Y2U6ICgpID0+IFwiSGVsbG8gV29ybGRcIiB9KWApO1xuXG5jb25zdCBMSVNUX0VSUk9SX0VYUExBTkFUSU9OID0gYEluIENES1ROLCB3ZSByZXByZXNlbnQgbGlzdHMsIHdpdGggdmFsdWVzIHVua25vd24gdW50aWwgYWZ0ZXIgcnVudGltZSwgYXMgYXJyYXlzIHdpdGggYSBzaW5nbGUgZWxlbWVudOKAlCBhIHN0cmluZyB0b2tlbiAoW1wiVG9rZW4uMVwiXSkuXG5cblxuV2UgZG8gdGhpcyBiZWNhdXNlIENES1ROIGRvZXMgbm90IGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBhdCBjb21waWxlIHRpbWUsIG1lYW5pbmcgQ0RLVE4gaGFzIHlldCB0byBpbnZva2UgVGVycmFmb3JtIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGNsb3VkIHByb3ZpZGVyLiBDREtUTiBsYXRlciBpbnZva2VzIFRlcnJhZm9ybSBvbiB0aGUgc3ludGhlc2l6ZWQgc3RhdGljIEpTT04gZmlsZS5cblxuQmVjYXVzZSB3ZSBkb24ndCBrbm93IHRoZSBsZW5ndGggb2YgdGhlIGxpc3QsIHdlIGNhbiBub3QgZGlmZmVyZW50aWF0ZSBpZiB0aGUgbGlzdCB3YXMgYWNjZXNzZWQgYXQgdGhlIGZpcnN0IG9yIGxhc3QgaW5kZXgsIG9yIGFzIHBhcnQgb2YgYSBsb29wLiBUbyBhdm9pZCB0aGlzIGFtYmlndWl0eTpcblxuLSBJZiB5b3Ugd2FudCB0byBhY2Nlc3MgYSBzaW5ndWxhciBpdGVtLCB1c2UgJ0ZuLmVsZW1lbnQobGlzdCwgMCknLiBEbyBub3QgdXNlICdsaXN0WzBdJy5cbi0gSWYgeW91IHdhbnQgdG8gbG9vcCBvdmVyIHRoZSBsaXN0IHVzZSAnVGVycmFmb3JtSXRlcmF0b3IuZnJvbUxpc3QobGlzdCknLiBEbyBub3QgdXNlIGEgJ2Zvcicgb3IgJ2ZvckVhY2gnIGxvb3AuXG5cbkxlYXJuIG1vcmUgYWJvdXQgdG9rZW5zOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvdG9rZW5zXG5MZWFybiBtb3JlIGFib3V0IGl0ZXJhdG9yczogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL2l0ZXJhdG9yc2A7XG5cbmNvbnN0IE1BUF9FUlJPUl9FWFBMQU5BVElPTiA9IGBcbkluIENES1ROLCB3ZSByZXByZXNlbnQgbWFwcywgd2l0aCB2YWx1ZXMgdW5rbm93biB1bnRpbCBhZnRlciBydW50aW1lLCBhcyBvYmplY3RzIHdpdGggYSBzaW5nbGUga2V5LXZhbHVlIHBhaXIgd2hlcmUgdGhlIHZhbHVlIGlzIGEgc3RyaW5nIHRva2VuLiBGb3IgZXhhbXBsZTogJ3sgXCIme1RmVG9rZW5bVG9rZW4uMV19XCI6IFwiU3RyaW5nIE1hcCBUb2tlbiBWYWx1ZVwiIH0nLlxuXG5XZSBkbyB0aGlzIGJlY2F1c2UgQ0RLVE4gZG9lcyBub3Qga25vdyB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGF0IGNvbXBpbGUgdGltZSwgbWVhbmluZyBDREtUTiBoYXMgeWV0IHRvIGludm9rZSBUZXJyYWZvcm0gdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgY2xvdWQgcHJvdmlkZXIuIENES1ROIGxhdGVyIGludm9rZXMgVGVycmFmb3JtIG9uIHRoZSBzeW50aGVzaXplZCBzdGF0aWMgSlNPTiBmaWxlLlxuXG5CZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIGNvbnRlbnRzIG9mIHRoZSBtYXAsIHdlIGNhbiBub3QgZGlmZmVyZW50aWF0ZSBpZiB0aGUgbWFwIHdhcyBhY2Nlc3NlZCwgb3IgdXNlZCBhcyBwYXJ0IG9mIGEgbG9vcC4gVG8gYXZvaWQgdGhpcyBhbWJpZ3VpdHk6XG5cbi0gVG8gYWNjZXNzIGEgc2luZ3VsYXIgaXRlbSB1c2UgJ0ZuLmxvb2t1cChtYXAsIGtleSknLiBEbyBub3QgdXNlICdtYXBba2V5XScuXG4tIElmIHlvdSB3YW50IHRvIGxvb3Agb3ZlciB0aGUgbWFwIHVzZSAnVGVycmFmb3JtSXRlcmF0b3IuZnJvbU1hcChtYXApJy4gRG8gbm90IHVzZSBhICdmb3InIGxvb3Agb3IgaXRlcmF0ZSBvdmVyICdPYmplY3QuZW50cmllcyhtYXApJyB3aXRoICdmb3JFYWNoJy5cblxuTGVhcm4gbW9yZSBhYm91dCB0b2tlbnM6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy90b2tlbnNcbkxlYXJuIG1vcmUgYWJvdXQgaXRlcmF0b3JzOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvaXRlcmF0b3JzYDtcblxuZXhwb3J0IGNvbnN0IGVuY29kZWRMaXN0VG9rZW5JblNjYWxhclN0cmluZ0NvbnRleHQgPSAoKSA9PlxuICBuZXcgRXJyb3IoYEZvdW5kIGFuIGVuY29kZWQgbGlzdCB0b2tlbiBzdHJpbmcgaW4gYSBzY2FsYXIgc3RyaW5nIGNvbnRleHQuXG4ke0xJU1RfRVJST1JfRVhQTEFOQVRJT059YCk7XG5cbmV4cG9ydCBjb25zdCBlbmNvZGVkTWFwVG9rZW5JblNjYWxhclN0cmluZ0NvbnRleHQgPSAoKSA9PlxuICBuZXcgRXJyb3IoYEZvdW5kIGFuIGVuY29kZWQgbWFwIHRva2VuIGluIGEgc2NhbGFyIHN0cmluZyBjb250ZXh0LlxuJHtNQVBfRVJST1JfRVhQTEFOQVRJT059YCk7XG5cbmV4cG9ydCBjb25zdCBlbmNvZGVkTWFwVG9rZW5JblNjYWxhck51bWJlckNvbnRleHQgPSAoKSA9PlxuICBuZXcgRXJyb3IoYEZvdW5kIGFuIGVuY29kZWQgbWFwIHRva2VuIGluIGEgc2NhbGFyIG51bWJlciBjb250ZXh0LlxuJHtNQVBfRVJST1JfRVhQTEFOQVRJT059YCk7XG5cbmV4cG9ydCBjb25zdCBjb25zdHJ1Y3RzQ2Fubm90QmVSZXNvbHZlZCA9IChwYXRoTmFtZTogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYFRyeWluZyB0byAncmVzb2x2ZSgpJyBhIENvbnN0cnVjdCBhdCAnJHtwYXRoTmFtZX0nLlxuXG5UaGlzIG9mdGVuIG1lYW5zIGFuIHVuaW50ZW5kZWQgY3ljbGljIGRlcGVuZGVuY3kgaW4geW91ciBjb25zdHJ1Y3QgdHJlZSwgbGVhZGluZyB0byB0aGUgcmVzb2x1dGlvbiBzdHVjayBpbiBhbiBpbmZpbml0ZSBsb29wIHRoYXQgZmFpbHMuXG5UaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHNjb3BlIHBhc3NlZCBpbnRvIHRoaXMgY29uc3RydWN0IGlzIGFsc28gcGFydCBvZiBpdHMgc3VidHJlZS5cblxuVG8gcmVzb2x2ZSB0aGlzIGlzc3VlLCByZWZhY3RvciB5b3VyIGNvZGUgdG8gYXZvaWQgdGhpcyBjeWNsaWMgZGVwZW5kZW5jeSBieSBjaGFuZ2luZyB0aGUgc2NvcGUgb2YgdGhpcyBjb25zdHJ1Y3QuYCk7XG5cbmV4cG9ydCBjb25zdCBtYXBLZXlNdXN0UmVzb2x2ZVRvU3RyaW5nID0gKFxuICBwYXRoTmFtZTogc3RyaW5nLFxuICBrZXk6IHN0cmluZyxcbiAgcmVzb2x2ZWRLZXk6IGFueSxcbikgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBBdCBcIiR7cGF0aE5hbWV9XCIgYSBtYXAgdXNlcyB0aGUga2V5IFwiJHtrZXl9XCIsIG1lYW5pbmcgdGhhdCBrZXkgbXVzdCByZXNvbHZlIHRvIGEgc3RyaW5nLiBIb3dldmVyLCBpdCByZXNvbHZlcyB0byBhICR7dHlwZW9mIHJlc29sdmVkS2V5fSB3aXRoIHRoZSB2YWx1ZSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgcmVzb2x2ZWRLZXksXG4gICAgKX0uIFRvIGZpeCB0aGlzLCBjaGFuZ2UgdGhlIFRva2VuIHRvIHJlc29sdmUgdG8gYSBzdHJpbmcuYCxcbiAgKTtcblxuY29uc3QgdW5rbm93blRva2VuRXhwbGFuYXRpb24gPSBgVGhpcyBtZWFucyB5b3UgYXJlIHRyeWluZyB0byBhY2Nlc3MgYSBUb2tlbiB2YWx1ZSB0aGF0IGRvZXMgbm90IGV4aXN0LiBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgVG9rZW4gaXMgZnJvbSBhbm90aGVyIENESyAoaS5lLiwgQVdTIENESywgQ0RLOHMsIGV0Yy4pIGFuZCBpcyB1bmtub3duIHRvIHRoaXMgQ0RLVE4gQXBwbGljYXRpb24uIFlvdSBlaXRoZXIgbmVlZCB0byBtYWtlIHRoZSBvdGhlciBDREsgcmVzb2x2ZSB0aGlzIFRva2VuIGJlZm9yZSBDREtUTiB0cmllcyB0byByZXNvbHZlIGl0LCBvciB3b3JrIGFyb3VuZCB1c2luZyB0aGlzIFRva2VuIGF0IGFsbC5cblxuSWYgdGhpcyBlcnJvciBvY2N1cnMgd2l0aG91dCBhbm90aGVyIENESyAob3IgYSB2YWx1ZSBsb29raW5nIGxpa2UgYSBUb2tlbikgaW52b2x2ZWQsIHBsZWFzZSBmaWxlIGEgYnVnLmA7XG5cbmV4cG9ydCBjb25zdCB1bmtub3duTnVtYmVyVG9rZW5Gb3VuZCA9ICgpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgRW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB1bmtub3duIG51bWJlciBUb2tlbiBmb3VuZC4gJHt1bmtub3duVG9rZW5FeHBsYW5hdGlvbn1gLFxuICApO1xuXG5leHBvcnQgY29uc3QgdW5yZWNvZ25pemVkVG9rZW5LZXkgPSAoa2V5OiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIFRva2VuIEtleSAnJHtrZXl9Jy4gJHt1bmtub3duVG9rZW5FeHBsYW5hdGlvbn1gKTtcblxuZXhwb3J0IGNvbnN0IElkSW5jbHVkZXNVbnJlc29sdmVkVG9rZW5zID0gKHVucmVzb2x2ZWRUb2tlbnM6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBUaGlzIGNvbnN0cnVjdCAob3IgaXRzIHBhcmVudCBjb25zdHJ1Y3QpIGlzIGNvbmZpZ3VyZWQgd2l0aCBhbiBJRCB0aGF0IGNvbnRhaW5zIGEgVG9rZW46ICR7dW5yZXNvbHZlZFRva2Vuc30uIFRoaXMgaXMgbm90IGFsbG93ZWQgYmVjYXVzZSBJRHMgbXVzdCBiZSBrbm93biBzdGF0aWNhbGx5IGR1cmluZyBzeW50aGVzaXMuIFRva2VuIHZhbHVlcyBhcmUgb25seSBrbm93biBkdXJpbmcgdGhlIGFwcGx5IHN0YWdlLCB0aGVyZWZvcmUgdGhleSBjYW5ub3QgYmUgdXNlZCBpbiBJRHMuIFBsZWFzZSB1c2UgYSBjb25jcmV0ZSB2YWx1ZSBmb3IgeW91ciBjb25zdHJ1Y3RzIElEIGluc3RlYWQuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFzc2V0Q2FuTm90Q3JlYXRlWmlwQXJjaGl2ZSA9IChcbiAgc3JjOiBzdHJpbmcsXG4gIGRlc3Q6IHN0cmluZyxcbiAgZXJyb3I6IEVycm9yLFxuKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEEgVGVycmFmb3JtQXNzZXQgdHJ5aW5nIHRvIHppcCBhcmNoaXZlICcke3NyY30nIGludG8gJHtkZXN0fSBmYWlsZWQ6ICR7ZXJyb3J9YCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IHRlcnJhZm9ybU1vZHVsZUhhc0NoaWxkcmVuID0gKHBhdGhOYW1lOiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICBgVHJ5aW5nIHRvIGFkZCBjaGlsZHJlbiB0byBhIFRlcnJhZm9ybU1vZHVsZSBhdCAnJHtwYXRoTmFtZX0nLiBUZXJyYWZvcm1Nb2R1bGVzIGNhbm5vdCBoYXZlIGNoaWxkcmVuLCBpZiB5b3Ugd2FudCB0byBncm91cCByZXNvdXJjZXMgb3IgY29uc3RydWN0cyBpbiBnZW5lcmFsIHRvZ2V0aGVyIHBsZWFzZSB1c2UgdGhlIENvbnN0cnVjdHMgY2xhc3MgaW5zdGVhZC4gU2VlIGh0dHBzOi8vY2RrLnRmL2NvbnN0cnVjdHMgZm9yIG1vcmUgZGV0YWlscy5gLFxuICApO1xufTtcbiJdfQ==
|
|
@@ -883,5 +883,5 @@ class FnGenerated {
|
|
|
883
883
|
}
|
|
884
884
|
exports.FnGenerated = FnGenerated;
|
|
885
885
|
_a = JSII_RTTI_SYMBOL_1;
|
|
886
|
-
FnGenerated[_a] = { fqn: "cdktn.FnGenerated", version: "0.22.
|
|
886
|
+
FnGenerated[_a] = { fqn: "cdktn.FnGenerated", version: "0.22.1" };
|
|
887
887
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVycmFmb3JtLWZ1bmN0aW9ucy5nZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0ZXJyYWZvcm0tZnVuY3Rpb25zLmdlbmVyYXRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkM7OztHQUdHO0FBQ0gsdUNBYW1CO0FBQ25CLCtDQUErQztBQUMvQyxNQUFhLFdBQVc7SUFDdEI7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFXO1FBQ3BCLE9BQU8sSUFBQSxrQkFBUSxFQUFDLElBQUEsMkJBQWlCLEVBQUMsS0FBSyxFQUFFLENBQUMsc0JBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFZO1FBQ3pCLE9BQU8sSUFBQSxrQkFBUSxFQUFDLElBQUEsMkJBQWlCLEVBQUMsU0FBUyxFQUFFLENBQUMscUJBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFXO1FBQ3hCLE9BQU8sSUFBQSxtQkFBUyxFQUFDLElBQUEsMkJBQWlCLEVBQUMsU0FBUyxFQUFFLENBQUMsSUFBQSxnQkFBTSxFQUFDLGtCQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFXO1FBQ3hCLE9BQU8sSUFBQSxtQkFBUyxFQUFDLElBQUEsMkJBQWlCLEVBQUMsU0FBUyxFQUFFLENBQUMsSUFBQSxnQkFBTSxFQUFDLGtCQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsTUFB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Ozs7O09BSUc7SUFDSCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQWMsRUFBRSxNQUFXO1FBQ3ZDLE9BQU8sSUFBQSxlQUFLLEVBQ1YsSUFBQSwyQkFBaUIsRUFBQyxRQUFRLEVBQUUsQ0FBQyxJQUFBLGdCQUFNLEVBQUMsa0JBQVEsQ0FBQyxFQUFFLGtCQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FDeEUsQ0FBQztJQUNKLENBQUM7O0FBai9CSCxrQ0FrL0JDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbi8qXG4gKiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IHRvb2xzL2dlbmVyYXRlLWZ1bmN0aW9uLWJpbmRpbmdzLlxuICogVG8gdXBkYXRlIHRoaXMgZmlsZSBleGVjdXRlICd5YXJuIHJ1biBnZW5lcmF0ZS1mdW5jdGlvbi1iaW5kaW5ncycgaW4gdGhlIHJvb3Qgb2YgdGhlIHJlcG9zaXRvcnlcbiAqL1xuaW1wb3J0IHtcbiAgYW55VmFsdWUsXG4gIGFzQW55LFxuICBhc0Jvb2xlYW4sXG4gIGFzTGlzdCxcbiAgYXNOdW1iZXIsXG4gIGFzU3RyaW5nLFxuICBsaXN0T2YsXG4gIG1hcFZhbHVlLFxuICBudW1lcmljVmFsdWUsXG4gIHN0cmluZ1ZhbHVlLFxuICB0ZXJyYWZvcm1GdW5jdGlvbixcbiAgdmFyaWFkaWMsXG59IGZyb20gXCIuL2hlbHBlcnNcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgY2xhc3MgRm5HZW5lcmF0ZWQge1xuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9hYnMgYWJzfSByZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gbnVtYmVyLiBJbiBvdGhlciB3b3JkcywgaWYgdGhlIG51bWJlciBpcyB6ZXJvIG9yIHBvc2l0aXZlIHRoZW4gaXQgaXMgcmV0dXJuZWQgYXMtaXMsIGJ1dCBpZiBpdCBpcyBuZWdhdGl2ZSB0aGVuIGl0IGlzIG11bHRpcGxpZWQgYnkgLTEgdG8gbWFrZSBpdCBwb3NpdGl2ZSBiZWZvcmUgcmV0dXJuaW5nIGl0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtXG4gICAqL1xuICBzdGF0aWMgYWJzKG51bTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyKHRlcnJhZm9ybUZ1bmN0aW9uKFwiYWJzXCIsIFtudW1lcmljVmFsdWVdKShudW0pKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9hYnNwYXRoIGFic3BhdGh9IHRha2VzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBmaWxlc3lzdGVtIHBhdGggYW5kIGNvbnZlcnRzIGl0IHRvIGFuIGFic29sdXRlIHBhdGguIFRoYXQgaXMsIGlmIHRoZSBwYXRoIGlzIG5vdCBhYnNvbHV0ZSwgaXQgd2lsbCBiZSBqb2luZWQgd2l0aCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIHN0YXRpYyBhYnNwYXRoKHBhdGg6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcImFic3BhdGhcIiwgW3N0cmluZ1ZhbHVlXSkocGF0aCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2FsbHRydWUgYWxsdHJ1ZX0gcmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIGluIGEgZ2l2ZW4gY29sbGVjdGlvbiBhcmUgYHRydWVgIG9yIGBcInRydWVcImAuIEl0IGFsc28gcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGNvbGxlY3Rpb24gaXMgZW1wdHkuXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gbGlzdFxuICAgKi9cbiAgc3RhdGljIGFsbHRydWUobGlzdDogYW55W10pIHtcbiAgICByZXR1cm4gYXNCb29sZWFuKHRlcnJhZm9ybUZ1bmN0aW9uKFwiYWxsdHJ1ZVwiLCBbbGlzdE9mKGFueVZhbHVlKV0pKGxpc3QpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9hbnl0cnVlIGFueXRydWV9IHJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IGluIGEgZ2l2ZW4gY29sbGVjdGlvbiBpcyBgdHJ1ZWAgb3IgYFwidHJ1ZVwiYC4gSXQgYWxzbyByZXR1cm5zIGBmYWxzZWAgaWYgdGhlIGNvbGxlY3Rpb24gaXMgZW1wdHkuXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gbGlzdFxuICAgKi9cbiAgc3RhdGljIGFueXRydWUobGlzdDogYW55W10pIHtcbiAgICByZXR1cm4gYXNCb29sZWFuKHRlcnJhZm9ybUZ1bmN0aW9uKFwiYW55dHJ1ZVwiLCBbbGlzdE9mKGFueVZhbHVlKV0pKGxpc3QpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9iYXNlNjRkZWNvZGUgYmFzZTY0ZGVjb2RlfSB0YWtlcyBhIHN0cmluZyBjb250YWluaW5nIGEgQmFzZTY0IGNoYXJhY3RlciBzZXF1ZW5jZSBhbmQgcmV0dXJucyB0aGUgb3JpZ2luYWwgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqL1xuICBzdGF0aWMgYmFzZTY0ZGVjb2RlKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiYmFzZTY0ZGVjb2RlXCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2Jhc2U2NGVuY29kZSBiYXNlNjRlbmNvZGV9IGFwcGxpZXMgQmFzZTY0IGVuY29kaW5nIHRvIGEgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqL1xuICBzdGF0aWMgYmFzZTY0ZW5jb2RlKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiYmFzZTY0ZW5jb2RlXCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2Jhc2U2NGd6aXAgYmFzZTY0Z3ppcH0gY29tcHJlc3NlcyBhIHN0cmluZyB3aXRoIGd6aXAgYW5kIHRoZW4gZW5jb2RlcyB0aGUgcmVzdWx0IGluIEJhc2U2NCBlbmNvZGluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIGJhc2U2NGd6aXAoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJiYXNlNjRnemlwXCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2Jhc2U2NHNoYTI1NiBiYXNlNjRzaGEyNTZ9IGNvbXB1dGVzIHRoZSBTSEEyNTYgaGFzaCBvZiBhIGdpdmVuIHN0cmluZyBhbmQgZW5jb2RlcyBpdCB3aXRoIEJhc2U2NC4gVGhpcyBpcyBub3QgZXF1aXZhbGVudCB0byBgYmFzZTY0ZW5jb2RlKHNoYTI1NihcInRlc3RcIikpYCBzaW5jZSBgc2hhMjU2KClgIHJldHVybnMgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyBiYXNlNjRzaGEyNTYoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJiYXNlNjRzaGEyNTZcIiwgW3N0cmluZ1ZhbHVlXSkoc3RyKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvYmFzZTY0c2hhNTEyIGJhc2U2NHNoYTUxMn0gY29tcHV0ZXMgdGhlIFNIQTUxMiBoYXNoIG9mIGEgZ2l2ZW4gc3RyaW5nIGFuZCBlbmNvZGVzIGl0IHdpdGggQmFzZTY0LiBUaGlzIGlzIG5vdCBlcXVpdmFsZW50IHRvIGBiYXNlNjRlbmNvZGUoc2hhNTEyKFwidGVzdFwiKSlgIHNpbmNlIGBzaGE1MTIoKWAgcmV0dXJucyBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIGJhc2U2NHNoYTUxMihzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcImJhc2U2NHNoYTUxMlwiLCBbc3RyaW5nVmFsdWVdKShzdHIpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9iYXNlbmFtZSBiYXNlbmFtZX0gdGFrZXMgYSBzdHJpbmcgY29udGFpbmluZyBhIGZpbGVzeXN0ZW0gcGF0aCBhbmQgcmVtb3ZlcyBhbGwgZXhjZXB0IHRoZSBsYXN0IHBvcnRpb24gZnJvbSBpdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIHN0YXRpYyBiYXNlbmFtZShwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJiYXNlbmFtZVwiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2JjcnlwdCBiY3J5cHR9IGNvbXB1dGVzIGEgaGFzaCBvZiB0aGUgZ2l2ZW4gc3RyaW5nIHVzaW5nIHRoZSBCbG93ZmlzaCBjaXBoZXIsIHJldHVybmluZyBhIHN0cmluZyBpbiBbdGhlIF9Nb2R1bGFyIENyeXB0IEZvcm1hdF9dKGh0dHBzOi8vcGFzc2xpYi5yZWFkdGhlZG9jcy5pby9lbi9zdGFibGUvbW9kdWxhcl9jcnlwdF9mb3JtYXQuaHRtbCkgdXN1YWxseSBleHBlY3RlZCBpbiB0aGUgc2hhZG93IHBhc3N3b3JkIGZpbGUgb24gbWFueSBVbml4IHN5c3RlbXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBjb3N0XG4gICAqL1xuICBzdGF0aWMgX2JjcnlwdChzdHI6IHN0cmluZywgY29zdDogbnVtYmVyW10pIHtcbiAgICByZXR1cm4gYXNTdHJpbmcoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcImJjcnlwdFwiLCBbc3RyaW5nVmFsdWUsIHZhcmlhZGljKG51bWVyaWNWYWx1ZSldKShcbiAgICAgICAgc3RyLFxuICAgICAgICBjb3N0LFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2NhbiBjYW59IGV2YWx1YXRlcyB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhbmQgcmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBleHByZXNzaW9uIHByb2R1Y2VkIGEgcmVzdWx0IHdpdGhvdXQgYW55IGVycm9ycy5cbiAgICogQHBhcmFtIHthbnl9IGV4cHJlc3Npb25cbiAgICovXG4gIHN0YXRpYyBjYW4oZXhwcmVzc2lvbjogYW55KSB7XG4gICAgcmV0dXJuIGFzQm9vbGVhbih0ZXJyYWZvcm1GdW5jdGlvbihcImNhblwiLCBbYW55VmFsdWVdKShleHByZXNzaW9uKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvY2VpbCBjZWlsfSByZXR1cm5zIHRoZSBjbG9zZXN0IHdob2xlIG51bWJlciB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gdmFsdWUsIHdoaWNoIG1heSBiZSBhIGZyYWN0aW9uLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtXG4gICAqL1xuICBzdGF0aWMgY2VpbChudW06IG51bWJlcikge1xuICAgIHJldHVybiBhc051bWJlcih0ZXJyYWZvcm1GdW5jdGlvbihcImNlaWxcIiwgW251bWVyaWNWYWx1ZV0pKG51bSkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2Nob21wIGNob21wfSByZW1vdmVzIG5ld2xpbmUgY2hhcmFjdGVycyBhdCB0aGUgZW5kIG9mIGEgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqL1xuICBzdGF0aWMgY2hvbXAoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJjaG9tcFwiLCBbc3RyaW5nVmFsdWVdKShzdHIpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9jaHVua2xpc3QgY2h1bmtsaXN0fSBzcGxpdHMgYSBzaW5nbGUgbGlzdCBpbnRvIGZpeGVkLXNpemUgY2h1bmtzLCByZXR1cm5pbmcgYSBsaXN0IG9mIGxpc3RzLlxuICAgKiBAcGFyYW0ge0FycmF5PGFueT59IGxpc3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAgICovXG4gIHN0YXRpYyBjaHVua2xpc3QobGlzdDogYW55W10sIHNpemU6IG51bWJlcikge1xuICAgIHJldHVybiBhc0xpc3QoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcImNodW5rbGlzdFwiLCBbbGlzdE9mKGFueVZhbHVlKSwgbnVtZXJpY1ZhbHVlXSkoXG4gICAgICAgIGxpc3QsXG4gICAgICAgIHNpemUsXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvY2lkcmhvc3QgY2lkcmhvc3R9IGNhbGN1bGF0ZXMgYSBmdWxsIGhvc3QgSVAgYWRkcmVzcyBmb3IgYSBnaXZlbiBob3N0IG51bWJlciB3aXRoaW4gYSBnaXZlbiBJUCBuZXR3b3JrIGFkZHJlc3MgcHJlZml4LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBob3N0bnVtXG4gICAqL1xuICBzdGF0aWMgY2lkcmhvc3QocHJlZml4OiBzdHJpbmcsIGhvc3RudW06IG51bWJlcikge1xuICAgIHJldHVybiBhc1N0cmluZyhcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwiY2lkcmhvc3RcIiwgW3N0cmluZ1ZhbHVlLCBudW1lcmljVmFsdWVdKShcbiAgICAgICAgcHJlZml4LFxuICAgICAgICBob3N0bnVtLFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2NpZHJuZXRtYXNrIGNpZHJuZXRtYXNrfSBjb252ZXJ0cyBhbiBJUHY0IGFkZHJlc3MgcHJlZml4IGdpdmVuIGluIENJRFIgbm90YXRpb24gaW50byBhIHN1Ym5ldCBtYXNrIGFkZHJlc3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICovXG4gIHN0YXRpYyBjaWRybmV0bWFzayhwcmVmaXg6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcImNpZHJuZXRtYXNrXCIsIFtzdHJpbmdWYWx1ZV0pKHByZWZpeCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2NpZHJzdWJuZXQgY2lkcnN1Ym5ldH0gY2FsY3VsYXRlcyBhIHN1Ym5ldCBhZGRyZXNzIHdpdGhpbiBnaXZlbiBJUCBuZXR3b3JrIGFkZHJlc3MgcHJlZml4LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdiaXRzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuZXRudW1cbiAgICovXG4gIHN0YXRpYyBjaWRyc3VibmV0KHByZWZpeDogc3RyaW5nLCBuZXdiaXRzOiBudW1iZXIsIG5ldG51bTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJjaWRyc3VibmV0XCIsIFtcbiAgICAgICAgc3RyaW5nVmFsdWUsXG4gICAgICAgIG51bWVyaWNWYWx1ZSxcbiAgICAgICAgbnVtZXJpY1ZhbHVlLFxuICAgICAgXSkocHJlZml4LCBuZXdiaXRzLCBuZXRudW0pLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvY2lkcnN1Ym5ldHMgY2lkcnN1Ym5ldHN9IGNhbGN1bGF0ZXMgYSBzZXF1ZW5jZSBvZiBjb25zZWN1dGl2ZSBJUCBhZGRyZXNzIHJhbmdlcyB3aXRoaW4gYSBwYXJ0aWN1bGFyIENJRFIgcHJlZml4LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gbmV3Yml0c1xuICAgKi9cbiAgc3RhdGljIGNpZHJzdWJuZXRzKHByZWZpeDogc3RyaW5nLCBuZXdiaXRzOiBudW1iZXJbXSkge1xuICAgIHJldHVybiBhc0xpc3QoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcImNpZHJzdWJuZXRzXCIsIFtzdHJpbmdWYWx1ZSwgdmFyaWFkaWMobnVtZXJpY1ZhbHVlKV0pKFxuICAgICAgICBwcmVmaXgsXG4gICAgICAgIG5ld2JpdHMsXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvY29hbGVzY2UgY29hbGVzY2V9IHRha2VzIGFueSBudW1iZXIgb2YgYXJndW1lbnRzIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCBudWxsIG9yIGFuIGVtcHR5IHN0cmluZy5cbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSB2YWxzXG4gICAqL1xuICBzdGF0aWMgY29hbGVzY2UodmFsczogYW55W10pIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJjb2FsZXNjZVwiLCBbdmFyaWFkaWMoYW55VmFsdWUpXSkodmFscykpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2NvYWxlc2NlbGlzdCBjb2FsZXNjZWxpc3R9IHRha2VzIGFueSBudW1iZXIgb2YgbGlzdCBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IGVtcHR5LlxuICAgKiBAcGFyYW0ge0FycmF5PGFueT59IHZhbHNcbiAgICovXG4gIHN0YXRpYyBjb2FsZXNjZWxpc3QodmFsczogYW55W10pIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJjb2FsZXNjZWxpc3RcIiwgW3ZhcmlhZGljKGFueVZhbHVlKV0pKHZhbHMpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9jb21wYWN0IGNvbXBhY3R9IHRha2VzIGEgbGlzdCBvZiBzdHJpbmdzIGFuZCByZXR1cm5zIGEgbmV3IGxpc3Qgd2l0aCBhbnkgZW1wdHkgc3RyaW5nIGVsZW1lbnRzIHJlbW92ZWQuXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gbGlzdFxuICAgKi9cbiAgc3RhdGljIGNvbXBhY3QobGlzdDogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gYXNMaXN0KHRlcnJhZm9ybUZ1bmN0aW9uKFwiY29tcGFjdFwiLCBbbGlzdE9mKGFueVZhbHVlKV0pKGxpc3QpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9jb25jYXQgY29uY2F0fSB0YWtlcyB0d28gb3IgbW9yZSBsaXN0cyBhbmQgY29tYmluZXMgdGhlbSBpbnRvIGEgc2luZ2xlIGxpc3QuXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gc2Vxc1xuICAgKi9cbiAgc3RhdGljIGNvbmNhdChzZXFzOiBhbnlbXSkge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcImNvbmNhdFwiLCBbdmFyaWFkaWMoYW55VmFsdWUpXSkoc2VxcykpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2NvbnRhaW5zIGNvbnRhaW5zfSBkZXRlcm1pbmVzIHdoZXRoZXIgYSBnaXZlbiBsaXN0IG9yIHNldCBjb250YWlucyBhIGdpdmVuIHNpbmdsZSB2YWx1ZSBhcyBvbmUgb2YgaXRzIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0ge2FueX0gbGlzdFxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICovXG4gIHN0YXRpYyBjb250YWlucyhsaXN0OiBhbnksIHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gYXNBbnkoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcImNvbnRhaW5zXCIsIFthbnlWYWx1ZSwgYW55VmFsdWVdKShsaXN0LCB2YWx1ZSksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9jc3ZkZWNvZGUgY3N2ZGVjb2RlfSBkZWNvZGVzIGEgc3RyaW5nIGNvbnRhaW5pbmcgQ1NWLWZvcm1hdHRlZCBkYXRhIGFuZCBwcm9kdWNlcyBhIGxpc3Qgb2YgbWFwcyByZXByZXNlbnRpbmcgdGhhdCBkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqL1xuICBzdGF0aWMgY3N2ZGVjb2RlKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzQW55KHRlcnJhZm9ybUZ1bmN0aW9uKFwiY3N2ZGVjb2RlXCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2Rpcm5hbWUgZGlybmFtZX0gdGFrZXMgYSBzdHJpbmcgY29udGFpbmluZyBhIGZpbGVzeXN0ZW0gcGF0aCBhbmQgcmVtb3ZlcyB0aGUgbGFzdCBwb3J0aW9uIGZyb20gaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBzdGF0aWMgZGlybmFtZShwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJkaXJuYW1lXCIsIFtzdHJpbmdWYWx1ZV0pKHBhdGgpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9kaXN0aW5jdCBkaXN0aW5jdH0gdGFrZXMgYSBsaXN0IGFuZCByZXR1cm5zIGEgbmV3IGxpc3Qgd2l0aCBhbnkgZHVwbGljYXRlIGVsZW1lbnRzIHJlbW92ZWQuXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gbGlzdFxuICAgKi9cbiAgc3RhdGljIGRpc3RpbmN0KGxpc3Q6IGFueVtdKSB7XG4gICAgcmV0dXJuIGFzTGlzdCh0ZXJyYWZvcm1GdW5jdGlvbihcImRpc3RpbmN0XCIsIFtsaXN0T2YoYW55VmFsdWUpXSkobGlzdCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2VsZW1lbnQgZWxlbWVudH0gcmV0cmlldmVzIGEgc2luZ2xlIGVsZW1lbnQgZnJvbSBhIGxpc3QuXG4gICAqIEBwYXJhbSB7YW55fSBsaXN0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICAgKi9cbiAgc3RhdGljIGVsZW1lbnQobGlzdDogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGFzQW55KFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJlbGVtZW50XCIsIFthbnlWYWx1ZSwgbnVtZXJpY1ZhbHVlXSkobGlzdCwgaW5kZXgpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZW5kc3dpdGggZW5kc3dpdGh9IHRha2VzIHR3byB2YWx1ZXM6IGEgc3RyaW5nIHRvIGNoZWNrIGFuZCBhIHN1ZmZpeCBzdHJpbmcuIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIGZpcnN0IHN0cmluZyBlbmRzIHdpdGggdGhhdCBleGFjdCBzdWZmaXguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeFxuICAgKi9cbiAgc3RhdGljIGVuZHN3aXRoKHN0cjogc3RyaW5nLCBzdWZmaXg6IHN0cmluZykge1xuICAgIHJldHVybiBhc0Jvb2xlYW4oXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcImVuZHN3aXRoXCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShzdHIsIHN1ZmZpeCksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9maWxlIGZpbGV9IHJlYWRzIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgYXQgdGhlIGdpdmVuIHBhdGggYW5kIHJldHVybnMgdGhlbSBhcyBhIHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIHN0YXRpYyBmaWxlKHBhdGg6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcImZpbGVcIiwgW3N0cmluZ1ZhbHVlXSkocGF0aCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2ZpbGViYXNlNjQgZmlsZWJhc2U2NH0gcmVhZHMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBhdCB0aGUgZ2l2ZW4gcGF0aCBhbmQgcmV0dXJucyB0aGVtIGFzIGEgYmFzZTY0LWVuY29kZWQgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgc3RhdGljIGZpbGViYXNlNjQocGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiZmlsZWJhc2U2NFwiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmlsZWJhc2U2NHNoYTI1NiBmaWxlYmFzZTY0c2hhMjU2fSBpcyBhIHZhcmlhbnQgb2YgYGJhc2U2NHNoYTI1NmAgdGhhdCBoYXNoZXMgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gZmlsZSByYXRoZXIgdGhhbiBhIGxpdGVyYWwgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgc3RhdGljIGZpbGViYXNlNjRzaGEyNTYocGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiZmlsZWJhc2U2NHNoYTI1NlwiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmlsZWJhc2U2NHNoYTUxMiBmaWxlYmFzZTY0c2hhNTEyfSBpcyBhIHZhcmlhbnQgb2YgYGJhc2U2NHNoYTUxMmAgdGhhdCBoYXNoZXMgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gZmlsZSByYXRoZXIgdGhhbiBhIGxpdGVyYWwgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgc3RhdGljIGZpbGViYXNlNjRzaGE1MTIocGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiZmlsZWJhc2U2NHNoYTUxMlwiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmlsZWV4aXN0cyBmaWxlZXhpc3RzfSBkZXRlcm1pbmVzIHdoZXRoZXIgYSBmaWxlIGV4aXN0cyBhdCBhIGdpdmVuIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBzdGF0aWMgZmlsZWV4aXN0cyhwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNCb29sZWFuKHRlcnJhZm9ybUZ1bmN0aW9uKFwiZmlsZWV4aXN0c1wiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmlsZW1kNSBmaWxlbWQ1fSBpcyBhIHZhcmlhbnQgb2YgYG1kNWAgdGhhdCBoYXNoZXMgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gZmlsZSByYXRoZXIgdGhhbiBhIGxpdGVyYWwgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgc3RhdGljIGZpbGVtZDUocGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiZmlsZW1kNVwiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmlsZXNldCBmaWxlc2V0fSBlbnVtZXJhdGVzIGEgc2V0IG9mIHJlZ3VsYXIgZmlsZSBuYW1lcyBnaXZlbiBhIHBhdGggYW5kIHBhdHRlcm4uIFRoZSBwYXRoIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoZSByZXN1bHRpbmcgc2V0IG9mIGZpbGUgbmFtZXMgYW5kIGFueSByZXN1bHQgc3RpbGwgY29udGFpbmluZyBwYXRoIHNlcGFyYXRvcnMgYWx3YXlzIHJldHVybnMgZm9yd2FyZCBzbGFzaCAoYC9gKSBhcyB0aGUgcGF0aCBzZXBhcmF0b3IgZm9yIGNyb3NzLXN5c3RlbSBjb21wYXRpYmlsaXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVyblxuICAgKi9cbiAgc3RhdGljIGZpbGVzZXQocGF0aDogc3RyaW5nLCBwYXR0ZXJuOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNMaXN0KFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJmaWxlc2V0XCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShwYXRoLCBwYXR0ZXJuKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2ZpbGVzaGExIGZpbGVzaGExfSBpcyBhIHZhcmlhbnQgb2YgYHNoYTFgIHRoYXQgaGFzaGVzIHRoZSBjb250ZW50cyBvZiBhIGdpdmVuIGZpbGUgcmF0aGVyIHRoYW4gYSBsaXRlcmFsIHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIHN0YXRpYyBmaWxlc2hhMShwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJmaWxlc2hhMVwiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmlsZXNoYTI1NiBmaWxlc2hhMjU2fSBpcyBhIHZhcmlhbnQgb2YgYHNoYTI1NmAgdGhhdCBoYXNoZXMgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gZmlsZSByYXRoZXIgdGhhbiBhIGxpdGVyYWwgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgc3RhdGljIGZpbGVzaGEyNTYocGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiZmlsZXNoYTI1NlwiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmlsZXNoYTUxMiBmaWxlc2hhNTEyfSBpcyBhIHZhcmlhbnQgb2YgYHNoYTUxMmAgdGhhdCBoYXNoZXMgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gZmlsZSByYXRoZXIgdGhhbiBhIGxpdGVyYWwgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgc3RhdGljIGZpbGVzaGE1MTIocGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiZmlsZXNoYTUxMlwiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmxhdHRlbiBmbGF0dGVufSB0YWtlcyBhIGxpc3QgYW5kIHJlcGxhY2VzIGFueSBlbGVtZW50cyB0aGF0IGFyZSBsaXN0cyB3aXRoIGEgZmxhdHRlbmVkIHNlcXVlbmNlIG9mIHRoZSBsaXN0IGNvbnRlbnRzLlxuICAgKiBAcGFyYW0ge2FueX0gbGlzdFxuICAgKi9cbiAgc3RhdGljIGZsYXR0ZW4obGlzdDogYW55KSB7XG4gICAgcmV0dXJuIGFzQW55KHRlcnJhZm9ybUZ1bmN0aW9uKFwiZmxhdHRlblwiLCBbYW55VmFsdWVdKShsaXN0KSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmxvb3IgZmxvb3J9IHJldHVybnMgdGhlIGNsb3Nlc3Qgd2hvbGUgbnVtYmVyIHRoYXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiB2YWx1ZSwgd2hpY2ggbWF5IGJlIGEgZnJhY3Rpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW1cbiAgICovXG4gIHN0YXRpYyBmbG9vcihudW06IG51bWJlcikge1xuICAgIHJldHVybiBhc051bWJlcih0ZXJyYWZvcm1GdW5jdGlvbihcImZsb29yXCIsIFtudW1lcmljVmFsdWVdKShudW0pKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZm9ybWF0IGZvcm1hdH0gZnVuY3Rpb24gcHJvZHVjZXMgYSBzdHJpbmcgYnkgZm9ybWF0dGluZyBhIG51bWJlciBvZiBvdGhlciB2YWx1ZXMgYWNjb3JkaW5nIHRvIGEgc3BlY2lmaWNhdGlvbiBzdHJpbmcuIEl0IGlzIHNpbWlsYXIgdG8gdGhlIGBwcmludGZgIGZ1bmN0aW9uIGluIEMsIGFuZCBvdGhlciBzaW1pbGFyIGZ1bmN0aW9ucyBpbiBvdGhlciBwcm9ncmFtbWluZyBsYW5ndWFnZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXRcbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcmdzXG4gICAqL1xuICBzdGF0aWMgZm9ybWF0KGZvcm1hdDogc3RyaW5nLCBhcmdzOiBhbnlbXSkge1xuICAgIHJldHVybiBhc0FueShcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwiZm9ybWF0XCIsIFtzdHJpbmdWYWx1ZSwgdmFyaWFkaWMoYW55VmFsdWUpXSkoXG4gICAgICAgIGZvcm1hdCxcbiAgICAgICAgYXJncyxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9mb3JtYXRkYXRlIGZvcm1hdGRhdGV9IGNvbnZlcnRzIGEgdGltZXN0YW1wIGludG8gYSBkaWZmZXJlbnQgdGltZSBmb3JtYXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVcbiAgICovXG4gIHN0YXRpYyBmb3JtYXRkYXRlKGZvcm1hdDogc3RyaW5nLCB0aW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcImZvcm1hdGRhdGVcIiwgW3N0cmluZ1ZhbHVlLCBzdHJpbmdWYWx1ZV0pKGZvcm1hdCwgdGltZSksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9mb3JtYXRsaXN0IGZvcm1hdGxpc3R9IHByb2R1Y2VzIGEgbGlzdCBvZiBzdHJpbmdzIGJ5IGZvcm1hdHRpbmcgYSBudW1iZXIgb2Ygb3RoZXIgdmFsdWVzIGFjY29yZGluZyB0byBhIHNwZWNpZmljYXRpb24gc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0XG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gYXJnc1xuICAgKi9cbiAgc3RhdGljIGZvcm1hdGxpc3QoZm9ybWF0OiBzdHJpbmcsIGFyZ3M6IGFueVtdKSB7XG4gICAgcmV0dXJuIGFzQW55KFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJmb3JtYXRsaXN0XCIsIFtzdHJpbmdWYWx1ZSwgdmFyaWFkaWMoYW55VmFsdWUpXSkoXG4gICAgICAgIGZvcm1hdCxcbiAgICAgICAgYXJncyxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9pbmRlbnQgaW5kZW50fSBhZGRzIGEgZ2l2ZW4gbnVtYmVyIG9mIHNwYWNlcyB0byB0aGUgYmVnaW5uaW5ncyBvZiBhbGwgYnV0IHRoZSBmaXJzdCBsaW5lIGluIGEgZ2l2ZW4gbXVsdGktbGluZSBzdHJpbmcuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzcGFjZXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIGluZGVudChzcGFjZXM6IG51bWJlciwgc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcImluZGVudFwiLCBbbnVtZXJpY1ZhbHVlLCBzdHJpbmdWYWx1ZV0pKHNwYWNlcywgc3RyKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2luZGV4IGluZGV4fSBmaW5kcyB0aGUgZWxlbWVudCBpbmRleCBmb3IgYSBnaXZlbiB2YWx1ZSBpbiBhIGxpc3QuXG4gICAqIEBwYXJhbSB7YW55fSBsaXN0XG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKi9cbiAgc3RhdGljIGluZGV4KGxpc3Q6IGFueSwgdmFsdWU6IGFueSkge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcImluZGV4XCIsIFthbnlWYWx1ZSwgYW55VmFsdWVdKShsaXN0LCB2YWx1ZSkpO1xuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9qb2luIGpvaW59IHByb2R1Y2VzIGEgc3RyaW5nIGJ5IGNvbmNhdGVuYXRpbmcgdG9nZXRoZXIgYWxsIGVsZW1lbnRzIG9mIGEgZ2l2ZW4gbGlzdCBvZiBzdHJpbmdzIHdpdGggdGhlIGdpdmVuIGRlbGltaXRlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlcGFyYXRvclxuICAgKiBAcGFyYW0ge0FycmF5PEFycmF5PHN0cmluZz4+fSBsaXN0c1xuICAgKi9cbiAgc3RhdGljIF9qb2luKHNlcGFyYXRvcjogc3RyaW5nLCBsaXN0czogc3RyaW5nW11bXSkge1xuICAgIHJldHVybiBhc1N0cmluZyhcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwiam9pblwiLCBbc3RyaW5nVmFsdWUsIHZhcmlhZGljKGxpc3RPZihhbnlWYWx1ZSkpXSkoXG4gICAgICAgIHNlcGFyYXRvcixcbiAgICAgICAgbGlzdHMsXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvanNvbmRlY29kZSBqc29uZGVjb2RlfSBpbnRlcnByZXRzIGEgZ2l2ZW4gc3RyaW5nIGFzIEpTT04sIHJldHVybmluZyBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXN1bHQgb2YgZGVjb2RpbmcgdGhhdCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyBqc29uZGVjb2RlKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzQW55KHRlcnJhZm9ybUZ1bmN0aW9uKFwianNvbmRlY29kZVwiLCBbc3RyaW5nVmFsdWVdKShzdHIpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9qc29uZW5jb2RlIGpzb25lbmNvZGV9IGVuY29kZXMgYSBnaXZlbiB2YWx1ZSB0byBhIHN0cmluZyB1c2luZyBKU09OIHN5bnRheC5cbiAgICogQHBhcmFtIHthbnl9IHZhbFxuICAgKi9cbiAgc3RhdGljIGpzb25lbmNvZGUodmFsOiBhbnkpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJqc29uZW5jb2RlXCIsIFthbnlWYWx1ZV0pKHZhbCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2tleXMga2V5c30gdGFrZXMgYSBtYXAgYW5kIHJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIGtleXMgZnJvbSB0aGF0IG1hcC5cbiAgICogQHBhcmFtIHthbnl9IGlucHV0TWFwXG4gICAqL1xuICBzdGF0aWMga2V5cyhpbnB1dE1hcDogYW55KSB7XG4gICAgcmV0dXJuIGFzQW55KHRlcnJhZm9ybUZ1bmN0aW9uKFwia2V5c1wiLCBbYW55VmFsdWVdKShpbnB1dE1hcCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2xlbmd0aCBsZW5ndGh9IGRldGVybWluZXMgdGhlIGxlbmd0aCBvZiBhIGdpdmVuIGxpc3QsIG1hcCwgb3Igc3RyaW5nLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICovXG4gIHN0YXRpYyBsZW5ndGhPZih2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyKHRlcnJhZm9ybUZ1bmN0aW9uKFwibGVuZ3RoXCIsIFthbnlWYWx1ZV0pKHZhbHVlKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvbG9nIGxvZ30gcmV0dXJucyB0aGUgbG9nYXJpdGhtIG9mIGEgZ2l2ZW4gbnVtYmVyIGluIGEgZ2l2ZW4gYmFzZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG51bVxuICAgKiBAcGFyYW0ge251bWJlcn0gYmFzZVxuICAgKi9cbiAgc3RhdGljIGxvZyhudW06IG51bWJlciwgYmFzZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJsb2dcIiwgW251bWVyaWNWYWx1ZSwgbnVtZXJpY1ZhbHVlXSkobnVtLCBiYXNlKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9sb29rdXAgbG9va3VwfSByZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgc2luZ2xlIGVsZW1lbnQgZnJvbSBhIG1hcCwgZ2l2ZW4gaXRzIGtleS4gSWYgdGhlIGdpdmVuIGtleSBkb2VzIG5vdCBleGlzdCwgdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUgaXMgcmV0dXJuZWQgaW5zdGVhZC5cbiAgICogQHBhcmFtIHthbnl9IGlucHV0TWFwXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBkZWZhdWx0VmFsdWVcbiAgICovXG4gIHN0YXRpYyBfbG9va3VwKGlucHV0TWFwOiBhbnksIGtleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IGFueVtdKSB7XG4gICAgcmV0dXJuIGFzQW55KFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJsb29rdXBcIiwgW2FueVZhbHVlLCBzdHJpbmdWYWx1ZSwgdmFyaWFkaWMoYW55VmFsdWUpXSkoXG4gICAgICAgIGlucHV0TWFwLFxuICAgICAgICBrZXksXG4gICAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9sb3dlciBsb3dlcn0gY29udmVydHMgYWxsIGNhc2VkIGxldHRlcnMgaW4gdGhlIGdpdmVuIHN0cmluZyB0byBsb3dlcmNhc2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyBsb3dlcihzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcImxvd2VyXCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL21hdGNoa2V5cyBtYXRjaGtleXN9IGNvbnN0cnVjdHMgYSBuZXcgbGlzdCBieSB0YWtpbmcgYSBzdWJzZXQgb2YgZWxlbWVudHMgZnJvbSBvbmUgbGlzdCB3aG9zZSBpbmRleGVzIG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIGluZGV4ZXMgb2YgdmFsdWVzIGluIGFub3RoZXIgbGlzdC5cbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSB2YWx1ZXNcbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBrZXlzXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gc2VhcmNoc2V0XG4gICAqL1xuICBzdGF0aWMgbWF0Y2hrZXlzKHZhbHVlczogYW55W10sIGtleXM6IGFueVtdLCBzZWFyY2hzZXQ6IGFueVtdKSB7XG4gICAgcmV0dXJuIGFzTGlzdChcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwibWF0Y2hrZXlzXCIsIFtcbiAgICAgICAgbGlzdE9mKGFueVZhbHVlKSxcbiAgICAgICAgbGlzdE9mKGFueVZhbHVlKSxcbiAgICAgICAgbGlzdE9mKGFueVZhbHVlKSxcbiAgICAgIF0pKHZhbHVlcywga2V5cywgc2VhcmNoc2V0KSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL21heCBtYXh9IHRha2VzIG9uZSBvciBtb3JlIG51bWJlcnMgYW5kIHJldHVybnMgdGhlIGdyZWF0ZXN0IG51bWJlciBmcm9tIHRoZSBzZXQuXG4gICAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gbnVtYmVyc1xuICAgKi9cbiAgc3RhdGljIG1heChudW1iZXJzOiBudW1iZXJbXSkge1xuICAgIHJldHVybiBhc051bWJlcihcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwibWF4XCIsIFt2YXJpYWRpYyhudW1lcmljVmFsdWUpXSkobnVtYmVycyksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9tZDUgbWQ1fSBjb21wdXRlcyB0aGUgTUQ1IGhhc2ggb2YgYSBnaXZlbiBzdHJpbmcgYW5kIGVuY29kZXMgaXQgd2l0aCBoZXhhZGVjaW1hbCBkaWdpdHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyBtZDUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJtZDVcIiwgW3N0cmluZ1ZhbHVlXSkoc3RyKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvbWVyZ2UgbWVyZ2V9IHRha2VzIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgbWFwcyBvciBvYmplY3RzLCBhbmQgcmV0dXJucyBhIHNpbmdsZSBtYXAgb3Igb2JqZWN0IHRoYXQgY29udGFpbnMgYSBtZXJnZWQgc2V0IG9mIGVsZW1lbnRzIGZyb20gYWxsIGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBtYXBzXG4gICAqL1xuICBzdGF0aWMgbWVyZ2UobWFwczogYW55W10pIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJtZXJnZVwiLCBbdmFyaWFkaWMoYW55VmFsdWUpXSkobWFwcykpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL21pbiBtaW59IHRha2VzIG9uZSBvciBtb3JlIG51bWJlcnMgYW5kIHJldHVybnMgdGhlIHNtYWxsZXN0IG51bWJlciBmcm9tIHRoZSBzZXQuXG4gICAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gbnVtYmVyc1xuICAgKi9cbiAgc3RhdGljIG1pbihudW1iZXJzOiBudW1iZXJbXSkge1xuICAgIHJldHVybiBhc051bWJlcihcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwibWluXCIsIFt2YXJpYWRpYyhudW1lcmljVmFsdWUpXSkobnVtYmVycyksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9ub25zZW5zaXRpdmUgbm9uc2Vuc2l0aXZlfSB0YWtlcyBhIHNlbnNpdGl2ZSB2YWx1ZSBhbmQgcmV0dXJucyBhIGNvcHkgb2YgdGhhdCB2YWx1ZSB3aXRoIHRoZSBzZW5zaXRpdmUgbWFya2luZyByZW1vdmVkLCB0aGVyZWJ5IGV4cG9zaW5nIHRoZSBzZW5zaXRpdmUgdmFsdWUuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKi9cbiAgc3RhdGljIG5vbnNlbnNpdGl2ZSh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIGFzQW55KHRlcnJhZm9ybUZ1bmN0aW9uKFwibm9uc2Vuc2l0aXZlXCIsIFthbnlWYWx1ZV0pKHZhbHVlKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvb25lIG9uZX0gdGFrZXMgYSBsaXN0LCBzZXQsIG9yIHR1cGxlIHZhbHVlIHdpdGggZWl0aGVyIHplcm8gb3Igb25lIGVsZW1lbnRzLiBJZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eSwgYG9uZWAgcmV0dXJucyBgbnVsbGAuIE90aGVyd2lzZSwgYG9uZWAgcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudC4gSWYgdGhlcmUgYXJlIHR3byBvciBtb3JlIGVsZW1lbnRzIHRoZW4gYG9uZWAgd2lsbCByZXR1cm4gYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7YW55fSBsaXN0XG4gICAqL1xuICBzdGF0aWMgb25lKGxpc3Q6IGFueSkge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcIm9uZVwiLCBbYW55VmFsdWVdKShsaXN0KSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvcGFyc2VpbnQgcGFyc2VpbnR9IHBhcnNlcyB0aGUgZ2l2ZW4gc3RyaW5nIGFzIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciBpbiB0aGUgc3BlY2lmaWVkIGJhc2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyBudW1iZXIuIFRoZSBiYXNlIG11c3QgYmUgYmV0d2VlbiAyIGFuZCA2MiBpbmNsdXNpdmUuXG4gICAqIEBwYXJhbSB7YW55fSBudW1iZXJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGJhc2VcbiAgICovXG4gIHN0YXRpYyBwYXJzZWludChudW1iZXI6IGFueSwgYmFzZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGFzQW55KFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJwYXJzZWludFwiLCBbYW55VmFsdWUsIG51bWVyaWNWYWx1ZV0pKG51bWJlciwgYmFzZSksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9wYXRoZXhwYW5kIHBhdGhleHBhbmR9IHRha2VzIGEgZmlsZXN5c3RlbSBwYXRoIHRoYXQgbWlnaHQgYmVnaW4gd2l0aCBhIGB+YCBzZWdtZW50LCBhbmQgaWYgc28gaXQgcmVwbGFjZXMgdGhhdCBzZWdtZW50IHdpdGggdGhlIGN1cnJlbnQgdXNlcidzIGhvbWUgZGlyZWN0b3J5IHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBzdGF0aWMgcGF0aGV4cGFuZChwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJwYXRoZXhwYW5kXCIsIFtzdHJpbmdWYWx1ZV0pKHBhdGgpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9wbGFudGltZXN0YW1wIHBsYW50aW1lc3RhbXB9IHJldHVybnMgYSBVVEMgdGltZXN0YW1wIHN0cmluZyBpbiBbUkZDIDMzMzldKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzMzM5KSBmb3JtYXQsIGZpeGVkIHRvIGEgY29uc3RhbnQgdGltZSByZXByZXNlbnRpbmcgdGhlIHRpbWUgb2YgdGhlIHBsYW4uXG4gICAqL1xuICBzdGF0aWMgcGxhbnRpbWVzdGFtcCgpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJwbGFudGltZXN0YW1wXCIsIFtdKSgpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9wb3cgcG93fSBjYWxjdWxhdGVzIGFuIGV4cG9uZW50LCBieSByYWlzaW5nIGl0cyBmaXJzdCBhcmd1bWVudCB0byB0aGUgcG93ZXIgb2YgdGhlIHNlY29uZCBhcmd1bWVudC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG51bVxuICAgKiBAcGFyYW0ge251bWJlcn0gcG93ZXJcbiAgICovXG4gIHN0YXRpYyBwb3cobnVtOiBudW1iZXIsIHBvd2VyOiBudW1iZXIpIHtcbiAgICByZXR1cm4gYXNOdW1iZXIoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInBvd1wiLCBbbnVtZXJpY1ZhbHVlLCBudW1lcmljVmFsdWVdKShudW0sIHBvd2VyKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9yYW5nZSByYW5nZX0gZ2VuZXJhdGVzIGEgbGlzdCBvZiBudW1iZXJzIHVzaW5nIGEgc3RhcnQgdmFsdWUsIGEgbGltaXQgdmFsdWUsIGFuZCBhIHN0ZXAgdmFsdWUuXG4gICAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gcGFyYW1zXG4gICAqL1xuICBzdGF0aWMgX3JhbmdlKHBhcmFtczogbnVtYmVyW10pIHtcbiAgICByZXR1cm4gYXNMaXN0KHRlcnJhZm9ybUZ1bmN0aW9uKFwicmFuZ2VcIiwgW3ZhcmlhZGljKG51bWVyaWNWYWx1ZSldKShwYXJhbXMpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9yZWdleCByZWdleH0gYXBwbGllcyBhIFtyZWd1bGFyIGV4cHJlc3Npb25dKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JlZ3VsYXJfZXhwcmVzc2lvbikgdG8gYSBzdHJpbmcgYW5kIHJldHVybnMgdGhlIG1hdGNoaW5nIHN1YnN0cmluZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyByZWdleChwYXR0ZXJuOiBzdHJpbmcsIHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzQW55KFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJyZWdleFwiLCBbc3RyaW5nVmFsdWUsIHN0cmluZ1ZhbHVlXSkocGF0dGVybiwgc3RyKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3JlZ2V4YWxsIHJlZ2V4YWxsfSBhcHBsaWVzIGEgW3JlZ3VsYXIgZXhwcmVzc2lvbl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUmVndWxhcl9leHByZXNzaW9uKSB0byBhIHN0cmluZyBhbmQgcmV0dXJucyBhIGxpc3Qgb2YgYWxsIG1hdGNoZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyByZWdleGFsbChwYXR0ZXJuOiBzdHJpbmcsIHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzTGlzdChcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwicmVnZXhhbGxcIiwgW3N0cmluZ1ZhbHVlLCBzdHJpbmdWYWx1ZV0pKHBhdHRlcm4sIHN0ciksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9yZXBsYWNlIHJlcGxhY2V9IHNlYXJjaGVzIGEgZ2l2ZW4gc3RyaW5nIGZvciBhbm90aGVyIGdpdmVuIHN1YnN0cmluZywgYW5kIHJlcGxhY2VzIGVhY2ggb2NjdXJyZW5jZSB3aXRoIGEgZ2l2ZW4gcmVwbGFjZW1lbnQgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWJzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlcGxhY2VcbiAgICovXG4gIHN0YXRpYyByZXBsYWNlKHN0cjogc3RyaW5nLCBzdWJzdHI6IHN0cmluZywgcmVwbGFjZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJyZXBsYWNlXCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWUsIHN0cmluZ1ZhbHVlXSkoXG4gICAgICAgIHN0cixcbiAgICAgICAgc3Vic3RyLFxuICAgICAgICByZXBsYWNlLFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3JldmVyc2UgcmV2ZXJzZX0gdGFrZXMgYSBzZXF1ZW5jZSBhbmQgcHJvZHVjZXMgYSBuZXcgc2VxdWVuY2Ugb2YgdGhlIHNhbWUgbGVuZ3RoIHdpdGggYWxsIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFzIHRoZSBnaXZlbiBzZXF1ZW5jZSBidXQgaW4gcmV2ZXJzZSBvcmRlci5cbiAgICogQHBhcmFtIHthbnl9IGxpc3RcbiAgICovXG4gIHN0YXRpYyByZXZlcnNlKGxpc3Q6IGFueSkge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcInJldmVyc2VcIiwgW2FueVZhbHVlXSkobGlzdCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3JzYWRlY3J5cHQgcnNhZGVjcnlwdH0gZGVjcnlwdHMgYW4gUlNBLWVuY3J5cHRlZCBjaXBoZXJ0ZXh0LCByZXR1cm5pbmcgdGhlIGNvcnJlc3BvbmRpbmcgY2xlYXJ0ZXh0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2lwaGVydGV4dFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJpdmF0ZWtleVxuICAgKi9cbiAgc3RhdGljIHJzYWRlY3J5cHQoY2lwaGVydGV4dDogc3RyaW5nLCBwcml2YXRla2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInJzYWRlY3J5cHRcIiwgW3N0cmluZ1ZhbHVlLCBzdHJpbmdWYWx1ZV0pKFxuICAgICAgICBjaXBoZXJ0ZXh0LFxuICAgICAgICBwcml2YXRla2V5LFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3NlbnNpdGl2ZSBzZW5zaXRpdmV9IHRha2VzIGFueSB2YWx1ZSBhbmQgcmV0dXJucyBhIGNvcHkgb2YgaXQgbWFya2VkIHNvIHRoYXQgVGVycmFmb3JtIHdpbGwgdHJlYXQgaXQgYXMgc2Vuc2l0aXZlLCB3aXRoIHRoZSBzYW1lIG1lYW5pbmcgYW5kIGJlaGF2aW9yIGFzIGZvciBbc2Vuc2l0aXZlIGlucHV0IHZhcmlhYmxlc10oL3RlcnJhZm9ybS9sYW5ndWFnZS92YWx1ZXMvdmFyaWFibGVzI3N1cHByZXNzaW5nLXZhbHVlcy1pbi1jbGktb3V0cHV0KS5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqL1xuICBzdGF0aWMgc2Vuc2l0aXZlKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJzZW5zaXRpdmVcIiwgW2FueVZhbHVlXSkodmFsdWUpKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvc2V0aW50ZXJzZWN0aW9uIHNldGludGVyc2VjdGlvbn0gZnVuY3Rpb24gdGFrZXMgbXVsdGlwbGUgc2V0cyBhbmQgcHJvZHVjZXMgYSBzaW5nbGUgc2V0IGNvbnRhaW5pbmcgb25seSB0aGUgZWxlbWVudHMgdGhhdCBhbGwgb2YgdGhlIGdpdmVuIHNldHMgaGF2ZSBpbiBjb21tb24uIEluIG90aGVyIHdvcmRzLCBpdCBjb21wdXRlcyB0aGUgW2ludGVyc2VjdGlvbl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSW50ZXJzZWN0aW9uX1xcKHNldF90aGVvcnlcXCkpIG9mIHRoZSBzZXRzLlxuICAgKiBAcGFyYW0ge0FycmF5PGFueT59IGZpcnN0X3NldFxuICAgKiBAcGFyYW0ge0FycmF5PEFycmF5PGFueT4+fSBvdGhlcl9zZXRzXG4gICAqL1xuICBzdGF0aWMgc2V0aW50ZXJzZWN0aW9uKGZpcnN0X3NldDogYW55W10sIG90aGVyX3NldHM6IGFueVtdW10pIHtcbiAgICByZXR1cm4gYXNMaXN0KFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJzZXRpbnRlcnNlY3Rpb25cIiwgW1xuICAgICAgICBsaXN0T2YoYW55VmFsdWUpLFxuICAgICAgICB2YXJpYWRpYyhsaXN0T2YoYW55VmFsdWUpKSxcbiAgICAgIF0pKGZpcnN0X3NldCwgb3RoZXJfc2V0cyksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvc2V0cHJvZHVjdCBzZXRwcm9kdWN0fSBmdW5jdGlvbiBmaW5kcyBhbGwgb2YgdGhlIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiBlbGVtZW50cyBmcm9tIGFsbCBvZiB0aGUgZ2l2ZW4gc2V0cyBieSBjb21wdXRpbmcgdGhlIFtDYXJ0ZXNpYW4gcHJvZHVjdF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2FydGVzaWFuX3Byb2R1Y3QpLlxuICAgKiBAcGFyYW0ge0FycmF5PGFueT59IHNldHNcbiAgICovXG4gIHN0YXRpYyBzZXRwcm9kdWN0KHNldHM6IGFueVtdKSB7XG4gICAgcmV0dXJuIGFzQW55KHRlcnJhZm9ybUZ1bmN0aW9uKFwic2V0cHJvZHVjdFwiLCBbdmFyaWFkaWMoYW55VmFsdWUpXSkoc2V0cykpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9zZXRzdWJ0cmFjdCBzZXRzdWJ0cmFjdH0gZnVuY3Rpb24gcmV0dXJucyBhIG5ldyBzZXQgY29udGFpbmluZyB0aGUgZWxlbWVudHMgZnJvbSB0aGUgZmlyc3Qgc2V0IHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBzZWNvbmQgc2V0LiBJbiBvdGhlciB3b3JkcywgaXQgY29tcHV0ZXMgdGhlIFtyZWxhdGl2ZSBjb21wbGVtZW50XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21wbGVtZW50X1xcKHNldF90aGVvcnlcXCkjUmVsYXRpdmVfY29tcGxlbWVudCkgb2YgdGhlIHNlY29uZCBzZXQuXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gYVxuICAgKiBAcGFyYW0ge0FycmF5PGFueT59IGJcbiAgICovXG4gIHN0YXRpYyBzZXRzdWJ0cmFjdChhOiBhbnlbXSwgYjogYW55W10pIHtcbiAgICByZXR1cm4gYXNMaXN0KFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJzZXRzdWJ0cmFjdFwiLCBbbGlzdE9mKGFueVZhbHVlKSwgbGlzdE9mKGFueVZhbHVlKV0pKFxuICAgICAgICBhLFxuICAgICAgICBiLFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9zZXR1bmlvbiBzZXR1bmlvbn0gZnVuY3Rpb24gdGFrZXMgbXVsdGlwbGUgc2V0cyBhbmQgcHJvZHVjZXMgYSBzaW5nbGUgc2V0IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGZyb20gYWxsIG9mIHRoZSBnaXZlbiBzZXRzLiBJbiBvdGhlciB3b3JkcywgaXQgY29tcHV0ZXMgdGhlIFt1bmlvbl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pb25fXFwoc2V0X3RoZW9yeVxcKSkgb2YgdGhlIHNldHMuXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gZmlyc3Rfc2V0XG4gICAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8YW55Pj59IG90aGVyX3NldHNcbiAgICovXG4gIHN0YXRpYyBzZXR1bmlvbihmaXJzdF9zZXQ6IGFueVtdLCBvdGhlcl9zZXRzOiBhbnlbXVtdKSB7XG4gICAgcmV0dXJuIGFzTGlzdChcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwic2V0dW5pb25cIiwgW1xuICAgICAgICBsaXN0T2YoYW55VmFsdWUpLFxuICAgICAgICB2YXJpYWRpYyhsaXN0T2YoYW55VmFsdWUpKSxcbiAgICAgIF0pKGZpcnN0X3NldCwgb3RoZXJfc2V0cyksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9zaGExIHNoYTF9IGNvbXB1dGVzIHRoZSBTSEExIGhhc2ggb2YgYSBnaXZlbiBzdHJpbmcgYW5kIGVuY29kZXMgaXQgd2l0aCBoZXhhZGVjaW1hbCBkaWdpdHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyBzaGExKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwic2hhMVwiLCBbc3RyaW5nVmFsdWVdKShzdHIpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9zaGEyNTYgc2hhMjU2fSBjb21wdXRlcyB0aGUgU0hBMjU2IGhhc2ggb2YgYSBnaXZlbiBzdHJpbmcgYW5kIGVuY29kZXMgaXQgd2l0aCBoZXhhZGVjaW1hbCBkaWdpdHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyBzaGEyNTYoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJzaGEyNTZcIiwgW3N0cmluZ1ZhbHVlXSkoc3RyKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvc2hhNTEyIHNoYTUxMn0gY29tcHV0ZXMgdGhlIFNIQTUxMiBoYXNoIG9mIGEgZ2l2ZW4gc3RyaW5nIGFuZCBlbmNvZGVzIGl0IHdpdGggaGV4YWRlY2ltYWwgZGlnaXRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqL1xuICBzdGF0aWMgc2hhNTEyKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwic2hhNTEyXCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3NpZ251bSBzaWdudW19IGRldGVybWluZXMgdGhlIHNpZ24gb2YgYSBudW1iZXIsIHJldHVybmluZyBhIG51bWJlciBiZXR3ZWVuIC0xIGFuZCAxIHRvIHJlcHJlc2VudCB0aGUgc2lnbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG51bVxuICAgKi9cbiAgc3RhdGljIHNpZ251bShudW06IG51bWJlcikge1xuICAgIHJldHVybiBhc051bWJlcih0ZXJyYWZvcm1GdW5jdGlvbihcInNpZ251bVwiLCBbbnVtZXJpY1ZhbHVlXSkobnVtKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvc2xpY2Ugc2xpY2V9IGV4dHJhY3RzIHNvbWUgY29uc2VjdXRpdmUgZWxlbWVudHMgZnJvbSB3aXRoaW4gYSBsaXN0LlxuICAgKiBAcGFyYW0ge2FueX0gbGlzdFxuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnRfaW5kZXhcbiAgICogQHBhcmFtIHtudW1iZXJ9IGVuZF9pbmRleFxuICAgKi9cbiAgc3RhdGljIHNsaWNlKGxpc3Q6IGFueSwgc3RhcnRfaW5kZXg6IG51bWJlciwgZW5kX2luZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gYXNBbnkoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInNsaWNlXCIsIFthbnlWYWx1ZSwgbnVtZXJpY1ZhbHVlLCBudW1lcmljVmFsdWVdKShcbiAgICAgICAgbGlzdCxcbiAgICAgICAgc3RhcnRfaW5kZXgsXG4gICAgICAgIGVuZF9pbmRleCxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9zb3J0IHNvcnR9IHRha2VzIGEgbGlzdCBvZiBzdHJpbmdzIGFuZCByZXR1cm5zIGEgbmV3IGxpc3Qgd2l0aCB0aG9zZSBzdHJpbmdzIHNvcnRlZCBsZXhpY29ncmFwaGljYWxseS5cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBsaXN0XG4gICAqL1xuICBzdGF0aWMgc29ydChsaXN0OiBzdHJpbmdbXSkge1xuICAgIHJldHVybiBhc0xpc3QodGVycmFmb3JtRnVuY3Rpb24oXCJzb3J0XCIsIFtsaXN0T2YoYW55VmFsdWUpXSkobGlzdCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3NwbGl0IHNwbGl0fSBwcm9kdWNlcyBhIGxpc3QgYnkgZGl2aWRpbmcgYSBnaXZlbiBzdHJpbmcgYXQgYWxsIG9jY3VycmVuY2VzIG9mIGEgZ2l2ZW4gc2VwYXJhdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VwYXJhdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyBzcGxpdChzZXBhcmF0b3I6IHN0cmluZywgc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNMaXN0KFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJzcGxpdFwiLCBbc3RyaW5nVmFsdWUsIHN0cmluZ1ZhbHVlXSkoc2VwYXJhdG9yLCBzdHIpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvc3RhcnRzd2l0aCBzdGFydHN3aXRofSB0YWtlcyB0d28gdmFsdWVzOiBhIHN0cmluZyB0byBjaGVjayBhbmQgYSBwcmVmaXggc3RyaW5nLiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBzdHJpbmcgYmVnaW5zIHdpdGggdGhhdCBleGFjdCBwcmVmaXguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgKi9cbiAgc3RhdGljIHN0YXJ0c3dpdGgoc3RyOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzQm9vbGVhbihcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwic3RhcnRzd2l0aFwiLCBbc3RyaW5nVmFsdWUsIHN0cmluZ1ZhbHVlXSkoc3RyLCBwcmVmaXgpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvc3RyY29udGFpbnMgc3RyY29udGFpbnN9IHRha2VzIHR3byB2YWx1ZXM6IGEgc3RyaW5nIHRvIGNoZWNrIGFuZCBhbiBleHBlY3RlZCBzdWJzdHJpbmcuIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIHN0cmluZyBoYXMgdGhlIHN1YnN0cmluZyBjb250YWluZWQgd2l0aGluIGl0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWJzdHJcbiAgICovXG4gIHN0YXRpYyBzdHJjb250YWlucyhzdHI6IHN0cmluZywgc3Vic3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNCb29sZWFuKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJzdHJjb250YWluc1wiLCBbc3RyaW5nVmFsdWUsIHN0cmluZ1ZhbHVlXSkoc3RyLCBzdWJzdHIpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvc3RycmV2IHN0cnJldn0gcmV2ZXJzZXMgdGhlIGNoYXJhY3RlcnMgaW4gYSBzdHJpbmcuIE5vdGUgdGhhdCB0aGUgY2hhcmFjdGVycyBhcmUgdHJlYXRlZCBhcyBfVW5pY29kZSBjaGFyYWN0ZXJzXyAoaW4gdGVjaG5pY2FsIHRlcm1zLCBVbmljb2RlIFtncmFwaGVtZSBjbHVzdGVyIGJvdW5kYXJpZXNdKGh0dHBzOi8vdW5pY29kZS5vcmcvcmVwb3J0cy90cjI5LyNHcmFwaGVtZV9DbHVzdGVyX0JvdW5kYXJpZXMpIGFyZSByZXNwZWN0ZWQpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqL1xuICBzdGF0aWMgc3RycmV2KHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwic3RycmV2XCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3N1YnN0ciBzdWJzdHJ9IGV4dHJhY3RzIGEgc3Vic3RyaW5nIGZyb20gYSBnaXZlbiBzdHJpbmcgYnkgb2Zmc2V0IGFuZCAobWF4aW11bSkgbGVuZ3RoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aFxuICAgKi9cbiAgc3RhdGljIHN1YnN0cihzdHI6IHN0cmluZywgb2Zmc2V0OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJzdWJzdHJcIiwgW3N0cmluZ1ZhbHVlLCBudW1lcmljVmFsdWUsIG51bWVyaWNWYWx1ZV0pKFxuICAgICAgICBzdHIsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgbGVuZ3RoLFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3N1bSBzdW19IHRha2VzIGEgbGlzdCBvciBzZXQgb2YgbnVtYmVycyBhbmQgcmV0dXJucyB0aGUgc3VtIG9mIHRob3NlIG51bWJlcnMuXG4gICAqIEBwYXJhbSB7YW55fSBsaXN0XG4gICAqL1xuICBzdGF0aWMgc3VtKGxpc3Q6IGFueSkge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcInN1bVwiLCBbYW55VmFsdWVdKShsaXN0KSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdGVtcGxhdGVmaWxlIHRlbXBsYXRlZmlsZX0gcmVhZHMgdGhlIGZpbGUgYXQgdGhlIGdpdmVuIHBhdGggYW5kIHJlbmRlcnMgaXRzIGNvbnRlbnQgYXMgYSB0ZW1wbGF0ZSB1c2luZyBhIHN1cHBsaWVkIHNldCBvZiB0ZW1wbGF0ZSB2YXJpYWJsZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7YW55fSB2YXJzXG4gICAqL1xuICBzdGF0aWMgdGVtcGxhdGVmaWxlKHBhdGg6IHN0cmluZywgdmFyczogYW55KSB7XG4gICAgcmV0dXJuIGFzQW55KFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJ0ZW1wbGF0ZWZpbGVcIiwgW3N0cmluZ1ZhbHVlLCBhbnlWYWx1ZV0pKHBhdGgsIHZhcnMpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdGV4dGRlY29kZWJhc2U2NCB0ZXh0ZGVjb2RlYmFzZTY0fSBmdW5jdGlvbiBkZWNvZGVzIGEgc3RyaW5nIHRoYXQgd2FzIHByZXZpb3VzbHkgQmFzZTY0LWVuY29kZWQsIGFuZCB0aGVuIGludGVycHJldHMgdGhlIHJlc3VsdCBhcyBjaGFyYWN0ZXJzIGluIGEgc3BlY2lmaWVkIGNoYXJhY3RlciBlbmNvZGluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RpbmdcbiAgICovXG4gIHN0YXRpYyB0ZXh0ZGVjb2RlYmFzZTY0KHNvdXJjZTogc3RyaW5nLCBlbmNvZGluZzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJ0ZXh0ZGVjb2RlYmFzZTY0XCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShcbiAgICAgICAgc291cmNlLFxuICAgICAgICBlbmNvZGluZyxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90ZXh0ZW5jb2RlYmFzZTY0IHRleHRlbmNvZGViYXNlNjR9IGVuY29kZXMgdGhlIHVuaWNvZGUgY2hhcmFjdGVycyBpbiBhIGdpdmVuIHN0cmluZyB1c2luZyBhIHNwZWNpZmllZCBjaGFyYWN0ZXIgZW5jb2RpbmcsIHJldHVybmluZyB0aGUgcmVzdWx0IGJhc2U2NCBlbmNvZGVkIGJlY2F1c2UgVGVycmFmb3JtIGxhbmd1YWdlIHN0cmluZ3MgYXJlIGFsd2F5cyBzZXF1ZW5jZXMgb2YgdW5pY29kZSBjaGFyYWN0ZXJzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGluZ1xuICAgKi9cbiAgc3RhdGljIHRleHRlbmNvZGViYXNlNjQoc3RyOiBzdHJpbmcsIGVuY29kaW5nOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInRleHRlbmNvZGViYXNlNjRcIiwgW3N0cmluZ1ZhbHVlLCBzdHJpbmdWYWx1ZV0pKFxuICAgICAgICBzdHIsXG4gICAgICAgIGVuY29kaW5nLFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3RpbWVhZGQgdGltZWFkZH0gYWRkcyBhIGR1cmF0aW9uIHRvIGEgdGltZXN0YW1wLCByZXR1cm5pbmcgYSBuZXcgdGltZXN0YW1wLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGltZXN0YW1wXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkdXJhdGlvblxuICAgKi9cbiAgc3RhdGljIHRpbWVhZGQodGltZXN0YW1wOiBzdHJpbmcsIGR1cmF0aW9uOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInRpbWVhZGRcIiwgW3N0cmluZ1ZhbHVlLCBzdHJpbmdWYWx1ZV0pKFxuICAgICAgICB0aW1lc3RhbXAsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3RpbWVjbXAgdGltZWNtcH0gY29tcGFyZXMgdHdvIHRpbWVzdGFtcHMgYW5kIHJldHVybnMgYSBudW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSBvcmRlcmluZyBvZiB0aGUgaW5zdGFudHMgdGhvc2UgdGltZXN0YW1wcyByZXByZXNlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lc3RhbXBfYVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGltZXN0YW1wX2JcbiAgICovXG4gIHN0YXRpYyB0aW1lY21wKHRpbWVzdGFtcF9hOiBzdHJpbmcsIHRpbWVzdGFtcF9iOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNOdW1iZXIoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInRpbWVjbXBcIiwgW3N0cmluZ1ZhbHVlLCBzdHJpbmdWYWx1ZV0pKFxuICAgICAgICB0aW1lc3RhbXBfYSxcbiAgICAgICAgdGltZXN0YW1wX2IsXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdGltZXN0YW1wIHRpbWVzdGFtcH0gcmV0dXJucyBhIFVUQyB0aW1lc3RhbXAgc3RyaW5nIGluIFtSRkMgMzMzOV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzMzMzkpIGZvcm1hdC5cbiAgICovXG4gIHN0YXRpYyB0aW1lc3RhbXAoKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwidGltZXN0YW1wXCIsIFtdKSgpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90aXRsZSB0aXRsZX0gY29udmVydHMgdGhlIGZpcnN0IGxldHRlciBvZiBlYWNoIHdvcmQgaW4gdGhlIGdpdmVuIHN0cmluZyB0byB1cHBlcmNhc2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyB0aXRsZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcInRpdGxlXCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3RvYm9vbCB0b2Jvb2x9IGNvbnZlcnRzIGl0cyBhcmd1bWVudCB0byBhIGJvb2xlYW4gdmFsdWUuXG4gICAqIEBwYXJhbSB7YW55fSB2XG4gICAqL1xuICBzdGF0aWMgdG9ib29sKHY6IGFueSkge1xuICAgIHJldHVybiBhc0Jvb2xlYW4odGVycmFmb3JtRnVuY3Rpb24oXCJ0b2Jvb2xcIiwgW2FueVZhbHVlXSkodikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3RvbGlzdCB0b2xpc3R9IGNvbnZlcnRzIGl0cyBhcmd1bWVudCB0byBhIGxpc3QgdmFsdWUuXG4gICAqIEBwYXJhbSB7YW55fSB2XG4gICAqL1xuICBzdGF0aWMgdG9saXN0KHY6IGFueSkge1xuICAgIHJldHVybiBhc0xpc3QodGVycmFmb3JtRnVuY3Rpb24oXCJ0b2xpc3RcIiwgW2FueVZhbHVlXSkodikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3RvbWFwIHRvbWFwfSBjb252ZXJ0cyBpdHMgYXJndW1lbnQgdG8gYSBtYXAgdmFsdWUuXG4gICAqIEBwYXJhbSB7YW55fSB2XG4gICAqL1xuICBzdGF0aWMgdG9tYXAodjogYW55KSB7XG4gICAgcmV0dXJuIGFzQW55KHRlcnJhZm9ybUZ1bmN0aW9uKFwidG9tYXBcIiwgW2FueVZhbHVlXSkodikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3RvbnVtYmVyIHRvbnVtYmVyfSBjb252ZXJ0cyBpdHMgYXJndW1lbnQgdG8gYSBudW1iZXIgdmFsdWUuXG4gICAqIEBwYXJhbSB7YW55fSB2XG4gICAqL1xuICBzdGF0aWMgdG9udW1iZXIodjogYW55KSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyKHRlcnJhZm9ybUZ1bmN0aW9uKFwidG9udW1iZXJcIiwgW2FueVZhbHVlXSkodikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3Rvc2V0IHRvc2V0fSBjb252ZXJ0cyBpdHMgYXJndW1lbnQgdG8gYSBzZXQgdmFsdWUuXG4gICAqIEBwYXJhbSB7YW55fSB2XG4gICAqL1xuICBzdGF0aWMgdG9zZXQodjogYW55KSB7XG4gICAgcmV0dXJuIGFzTGlzdCh0ZXJyYWZvcm1GdW5jdGlvbihcInRvc2V0XCIsIFthbnlWYWx1ZV0pKHYpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90b3N0cmluZyB0b3N0cmluZ30gY29udmVydHMgaXRzIGFyZ3VtZW50IHRvIGEgc3RyaW5nIHZhbHVlLlxuICAgKiBAcGFyYW0ge2FueX0gdlxuICAgKi9cbiAgc3RhdGljIHRvc3RyaW5nKHY6IGFueSkge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcInRvc3RyaW5nXCIsIFthbnlWYWx1ZV0pKHYpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90cmFuc3Bvc2UgdHJhbnNwb3NlfSB0YWtlcyBhIG1hcCBvZiBsaXN0cyBvZiBzdHJpbmdzIGFuZCBzd2FwcyB0aGUga2V5cyBhbmQgdmFsdWVzIHRvIHByb2R1Y2UgYSBuZXcgbWFwIG9mIGxpc3RzIG9mIHN0cmluZ3MuXG4gICAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgQXJyYXk8c3RyaW5nPj59IHZhbHVlc1xuICAgKi9cbiAgc3RhdGljIHRyYW5zcG9zZSh2YWx1ZXM6IGFueSkge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcInRyYW5zcG9zZVwiLCBbbWFwVmFsdWVdKSh2YWx1ZXMpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90cmltIHRyaW19IHJlbW92ZXMgdGhlIHNwZWNpZmllZCBzZXQgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBnaXZlbiBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGN1dHNldFxuICAgKi9cbiAgc3RhdGljIHRyaW0oc3RyOiBzdHJpbmcsIGN1dHNldDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJ0cmltXCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShzdHIsIGN1dHNldCksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90cmltcHJlZml4IHRyaW1wcmVmaXh9IHJlbW92ZXMgdGhlIHNwZWNpZmllZCBwcmVmaXggZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGdpdmVuIHN0cmluZy4gSWYgdGhlIHN0cmluZyBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBwcmVmaXgsIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICovXG4gIHN0YXRpYyB0cmltcHJlZml4KHN0cjogc3RyaW5nLCBwcmVmaXg6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyhcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwidHJpbXByZWZpeFwiLCBbc3RyaW5nVmFsdWUsIHN0cmluZ1ZhbHVlXSkoc3RyLCBwcmVmaXgpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdHJpbXNwYWNlIHRyaW1zcGFjZX0gcmVtb3ZlcyBhbnkgc3BhY2UgY2hhcmFjdGVycyBmcm9tIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBnaXZlbiBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyB0cmltc3BhY2Uoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJ0cmltc3BhY2VcIiwgW3N0cmluZ1ZhbHVlXSkoc3RyKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdHJpbXN1ZmZpeCB0cmltc3VmZml4fSByZW1vdmVzIHRoZSBzcGVjaWZpZWQgc3VmZml4IGZyb20gdGhlIGVuZCBvZiB0aGUgZ2l2ZW4gc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWZmaXhcbiAgICovXG4gIHN0YXRpYyB0cmltc3VmZml4KHN0cjogc3RyaW5nLCBzdWZmaXg6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyhcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwidHJpbXN1ZmZpeFwiLCBbc3RyaW5nVmFsdWUsIHN0cmluZ1ZhbHVlXSkoc3RyLCBzdWZmaXgpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdHJ5IHRyeX0gZXZhbHVhdGVzIGFsbCBvZiBpdHMgYXJndW1lbnQgZXhwcmVzc2lvbnMgaW4gdHVybiBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBmaXJzdCBvbmUgdGhhdCBkb2VzIG5vdCBwcm9kdWNlIGFueSBlcnJvcnMuXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gZXhwcmVzc2lvbnNcbiAgICovXG4gIHN0YXRpYyB0cnkoZXhwcmVzc2lvbnM6IGFueVtdKSB7XG4gICAgcmV0dXJuIGFzQW55KHRlcnJhZm9ybUZ1bmN0aW9uKFwidHJ5XCIsIFt2YXJpYWRpYyhhbnlWYWx1ZSldKShleHByZXNzaW9ucykpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3VwcGVyIHVwcGVyfSBjb252ZXJ0cyBhbGwgY2FzZWQgbGV0dGVycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nIHRvIHVwcGVyY2FzZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIHVwcGVyKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwidXBwZXJcIiwgW3N0cmluZ1ZhbHVlXSkoc3RyKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdXJsZW5jb2RlIHVybGVuY29kZX0gYXBwbGllcyBVUkwgZW5jb2RpbmcgdG8gYSBnaXZlbiBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyB1cmxlbmNvZGUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJ1cmxlbmNvZGVcIiwgW3N0cmluZ1ZhbHVlXSkoc3RyKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdXVpZCB1dWlkfSBnZW5lcmF0ZXMgYSB1bmlxdWUgaWRlbnRpZmllciBzdHJpbmcuXG4gICAqL1xuICBzdGF0aWMgdXVpZCgpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJ1dWlkXCIsIFtdKSgpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy91dWlkdjUgdXVpZHY1fSBnZW5lcmF0ZXMgYSBfbmFtZS1iYXNlZF8gVVVJRCwgYXMgZGVzY3JpYmVkIGluIFtSRkMgNDEyMiBzZWN0aW9uIDQuM10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQxMjIjc2VjdGlvbi00LjMpLCBhbHNvIGtub3duIGFzIGEgXCJ2ZXJzaW9uIDVcIiBVVUlELlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBzdGF0aWMgdXVpZHY1KG5hbWVzcGFjZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInV1aWR2NVwiLCBbc3RyaW5nVmFsdWUsIHN0cmluZ1ZhbHVlXSkobmFtZXNwYWNlLCBuYW1lKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3ZhbHVlcyB2YWx1ZXN9IHRha2VzIGEgbWFwIGFuZCByZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIHRoZSB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoYXQgbWFwLlxuICAgKiBAcGFyYW0ge2FueX0gbWFwcGluZ1xuICAgKi9cbiAgc3RhdGljIHZhbHVlcyhtYXBwaW5nOiBhbnkpIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJ2YWx1ZXNcIiwgW2FueVZhbHVlXSkobWFwcGluZykpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3lhbWxkZWNvZGUgeWFtbGRlY29kZX0gcGFyc2VzIGEgc3RyaW5nIGFzIGEgc3Vic2V0IG9mIFlBTUwsIGFuZCBwcm9kdWNlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGl0cyB2YWx1ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNyY1xuICAgKi9cbiAgc3RhdGljIHlhbWxkZWNvZGUoc3JjOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJ5YW1sZGVjb2RlXCIsIFtzdHJpbmdWYWx1ZV0pKHNyYykpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3lhbWxlbmNvZGUgeWFtbGVuY29kZX0gZW5jb2RlcyBhIGdpdmVuIHZhbHVlIHRvIGEgc3RyaW5nIHVzaW5nIFtZQU1MIDEuMl0oaHR0cHM6Ly95YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwpIGJsb2NrIHN5bnRheC5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqL1xuICBzdGF0aWMgeWFtbGVuY29kZSh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwieWFtbGVuY29kZVwiLCBbYW55VmFsdWVdKSh2YWx1ZSkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3ppcG1hcCB6aXBtYXB9IGNvbnN0cnVjdHMgYSBtYXAgZnJvbSBhIGxpc3Qgb2Yga2V5cyBhbmQgYSBjb3JyZXNwb25kaW5nIGxpc3Qgb2YgdmFsdWVzLlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGtleXNcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlc1xuICAgKi9cbiAgc3RhdGljIHppcG1hcChrZXlzOiBzdHJpbmdbXSwgdmFsdWVzOiBhbnkpIHtcbiAgICByZXR1cm4gYXNBbnkoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInppcG1hcFwiLCBbbGlzdE9mKGFueVZhbHVlKSwgYW55VmFsdWVdKShrZXlzLCB2YWx1ZXMpLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|