@browserstack/testcafe
Version:
Automated browser testing for the modern web development stack.
271 lines (252 loc) • 44.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const lodash_1 = require("lodash");
const types_1 = require("../types");
const utils_1 = require("./utils");
const EXTERNAL_LINKS = {
createNewIssue: 'https://github.com/DevExpress/testcafe/issues/new?template=bug-report.md',
troubleshootNetwork: 'https://go.devexpress.com/TestCafe_FAQ_ARequestHasFailed.aspx',
viewportSizes: 'https://github.com/DevExpress/device-specs/blob/master/viewport-sizes.json'
};
exports.default = {
[types_1.TEST_RUN_ERRORS.actionIntegerOptionError]: err => `
The "${err.optionName}" option is expected to be an integer, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionPositiveIntegerOptionError]: err => `
The "${err.optionName}" option is expected to be a positive integer, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionBooleanOptionError]: err => `
The "${err.optionName}" option is expected to be a boolean value, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionSpeedOptionError]: err => `
The "${err.optionName}" option is expected to be a number between 0.01 and 1, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.pageLoadError]: err => `
A request to ${utils_1.formatUrl(err.url)} has failed.
Use quarantine mode to perform additional attempts to execute this test.
You can find troubleshooting information for this issue at ${utils_1.formatUrl(EXTERNAL_LINKS.troubleshootNetwork)}.
Error details:
${err.errMsg}
`,
[types_1.TEST_RUN_ERRORS.uncaughtErrorOnPage]: err => `
A JavaScript error occurred on ${utils_1.formatUrl(err.pageDestUrl)}.
Repeat test actions in the browser and check the console for errors.
If you see this error, it means that the tested website caused it. You can fix it or disable tracking JavaScript errors in TestCafe. To do the latter, enable the "--skip-js-errors" option.
If this error does not occur, please write a new issue at:
${utils_1.formatUrl(EXTERNAL_LINKS.createNewIssue)}.
JavaScript error details:
${utils_1.replaceLeadingSpacesWithNbsp(lodash_1.escape(err.errStack))}
`,
[types_1.TEST_RUN_ERRORS.uncaughtErrorInTestCode]: err => `
${lodash_1.escape(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.nativeDialogNotHandledError]: err => `
A native ${err.dialogType} dialog was invoked on page ${utils_1.formatUrl(err.pageUrl)}, but no handler was set for it. Use the "setNativeDialogHandler" function to introduce a handler function for native dialogs.
`,
[types_1.TEST_RUN_ERRORS.uncaughtErrorInNativeDialogHandler]: err => `
An error occurred in the native dialog handler called for a native ${err.dialogType} dialog on page ${utils_1.formatUrl(err.pageUrl)}:
${lodash_1.escape(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.setTestSpeedArgumentError]: err => `
Speed is expected to be a number between 0.01 and 1, but ${err.actualValue} was passed.
`,
[types_1.TEST_RUN_ERRORS.setNativeDialogHandlerCodeWrongTypeError]: err => `
The native dialog handler is expected to be a function, ClientFunction or null, but it was ${err.actualType}.
`,
[types_1.TEST_RUN_ERRORS.uncaughtErrorInClientFunctionCode]: err => `
An error occurred in ${err.instantiationCallsiteName} code:
${lodash_1.escape(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomDOMPropertyCode]: err => `
An error occurred when trying to calculate a custom Selector property "${err.property}":
${lodash_1.escape(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.clientFunctionExecutionInterruptionError]: err => `
${err.instantiationCallsiteName} execution was interrupted by page unload. This problem may appear if you trigger page navigation from ${err.instantiationCallsiteName} code.
`,
[types_1.TEST_RUN_ERRORS.uncaughtNonErrorObjectInTestCode]: err => `
Uncaught ${err.objType} "${lodash_1.escape(err.objStr)}" was thrown. Throw Error instead.
`,
[types_1.TEST_RUN_ERRORS.unhandledPromiseRejection]: err => `
Unhandled promise rejection:
${lodash_1.escape(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.uncaughtException]: err => `
Uncaught exception:
${lodash_1.escape(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.actionOptionsTypeError]: err => `
Action options is expected to be an object, null or undefined but it was ${err.actualType}.
`,
[types_1.TEST_RUN_ERRORS.actionStringArgumentError]: err => `
The "${err.argumentName}" argument is expected to be a non-empty string, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionBooleanArgumentError]: err => `
The "${err.argumentName}" argument is expected to be a boolean value, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionNullableStringArgumentError]: err => `
The "${err.argumentName}" argument is expected to be a null or a string, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionStringOrStringArrayArgumentError]: err => `
The "${err.argumentName}" argument is expected to be a non-empty string or a string array, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionStringArrayElementError]: err => `
Elements of the "${err.argumentName}" argument are expected to be non-empty strings, but the element at index ${err.elementIndex} was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionIntegerArgumentError]: err => `
The "${err.argumentName}" argument is expected to be an integer, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionRoleArgumentError]: err => `
The "${err.argumentName}" argument is expected to be a Role instance, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionPositiveIntegerArgumentError]: err => `
The "${err.argumentName}" argument is expected to be a positive integer, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionElementNotFoundError]: (err, viewportWidth) => `
The specified selector does not match any element in the DOM tree.
${utils_1.formatSelectorCallstack(err.apiFnChain, err.apiFnIndex, viewportWidth)}
`,
[types_1.TEST_RUN_ERRORS.actionElementIsInvisibleError]: () => `
The element that matches the specified selector is not visible.
`,
[types_1.TEST_RUN_ERRORS.actionSelectorMatchesWrongNodeTypeError]: err => `
The specified selector is expected to match a DOM element, but it matches a ${err.nodeDescription} node.
`,
[types_1.TEST_RUN_ERRORS.actionAdditionalElementNotFoundError]: (err, viewportWidth) => `
The specified "${err.argumentName}" does not match any element in the DOM tree.
${utils_1.formatSelectorCallstack(err.apiFnChain, err.apiFnIndex, viewportWidth)}
`,
[types_1.TEST_RUN_ERRORS.actionAdditionalElementIsInvisibleError]: err => `
The element that matches the specified "${err.argumentName}" is not visible.
`,
[types_1.TEST_RUN_ERRORS.actionAdditionalSelectorMatchesWrongNodeTypeError]: err => `
The specified "${err.argumentName}" is expected to match a DOM element, but it matches a ${err.nodeDescription} node.
`,
[types_1.TEST_RUN_ERRORS.actionElementNonEditableError]: () => `
The action element is expected to be editable (an input, textarea or element with the contentEditable attribute).
`,
[types_1.TEST_RUN_ERRORS.actionElementNonContentEditableError]: err => `
The element that matches the specified "${err.argumentName}" is expected to have the contentEditable attribute enabled or the entire document should be in design mode.
`,
[types_1.TEST_RUN_ERRORS.actionRootContainerNotFoundError]: () => `
Content between the action elements cannot be selected because the root container for the selection range cannot be found, i.e. these elements do not have a common ancestor with the contentEditable attribute.
`,
[types_1.TEST_RUN_ERRORS.actionElementIsNotFileInputError]: () => `
The specified selector does not match a file input element.
`,
[types_1.TEST_RUN_ERRORS.actionCannotFindFileToUploadError]: err => `
Cannot find the following file(s) to upload:
${err.filePaths.map(path => lodash_1.escape(path)).join('\n')}
The following locations were scanned for the missing upload files:
${err.scannedFilePaths.map(path => lodash_1.escape(path)).join('\n')}
Ensure these files exist or change the working directory.
`,
[types_1.TEST_RUN_ERRORS.actionElementNotTextAreaError]: () => `
The action element is expected to be a <textarea>.
`,
[types_1.TEST_RUN_ERRORS.actionElementNotIframeError]: () => `
The action element is expected to be an <iframe>.
`,
[types_1.TEST_RUN_ERRORS.actionIncorrectKeysError]: err => `
The "${err.argumentName}" argument contains an incorrect key or key combination.
`,
[types_1.TEST_RUN_ERRORS.actionUnsupportedDeviceTypeError]: err => `
The "${err.argumentName}" argument specifies an unsupported "${err.actualValue}" device. For a list of supported devices, refer to ${utils_1.formatUrl(EXTERNAL_LINKS.viewportSizes)}.
`,
[types_1.TEST_RUN_ERRORS.actionInvalidScrollTargetError]: err => `
Unable to scroll to the specified point because a point with the specified ${err.properties} is not located inside the element's cropping region.
`,
[types_1.TEST_RUN_ERRORS.actionIframeIsNotLoadedError]: () => `
Content of the iframe to which you are switching did not load.
`,
[types_1.TEST_RUN_ERRORS.currentIframeIsNotLoadedError]: () => `
Content of the iframe in which the test is currently operating did not load.
`,
[types_1.TEST_RUN_ERRORS.currentIframeNotFoundError]: () => `
The iframe in which the test is currently operating does not exist anymore.
`,
[types_1.TEST_RUN_ERRORS.currentIframeIsInvisibleError]: () => `
The iframe in which the test is currently operating is not visible anymore.
`,
[types_1.TEST_RUN_ERRORS.missingAwaitError]: () => `
A call to an async function is not awaited. Use the "await" keyword before actions, assertions or chains of them to ensure that they run in the right sequence.
`,
[types_1.TEST_RUN_ERRORS.externalAssertionLibraryError]: err => `
${lodash_1.escape(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.domNodeClientFunctionResultError]: err => `
${err.instantiationCallsiteName} cannot return DOM elements. Use Selector functions for this purpose.
`,
[types_1.TEST_RUN_ERRORS.invalidSelectorResultError]: () => `
Function that specifies a selector can only return a DOM node, an array of nodes, NodeList, HTMLCollection, null or undefined. Use ClientFunction to return other values.
`,
[types_1.TEST_RUN_ERRORS.actionSelectorError]: err => `
Action "${err.selectorName}" argument error:
${lodash_1.escape(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.cannotObtainInfoForElementSpecifiedBySelectorError]: (err, viewportWidth) => `
Cannot obtain information about the node because the specified selector does not match any node in the DOM tree.
${utils_1.formatSelectorCallstack(err.apiFnChain, err.apiFnIndex, viewportWidth)}
`,
[types_1.TEST_RUN_ERRORS.windowDimensionsOverflowError]: () => `
Unable to resize the window because the specified size exceeds the screen size. On macOS, a window cannot be larger than the screen.
`,
[types_1.TEST_RUN_ERRORS.forbiddenCharactersInScreenshotPathError]: err => `
There are forbidden characters in the "${err.screenshotPath}" screenshot path:
${utils_1.renderForbiddenCharsList(err.forbiddenCharsList)}
`,
[types_1.TEST_RUN_ERRORS.invalidElementScreenshotDimensionsError]: err => `
Unable to capture an element image because the resulting image ${err.dimensions} ${err.verb} zero or negative.
`,
[types_1.TEST_RUN_ERRORS.roleSwitchInRoleInitializerError]: () => `
Role cannot be switched while another role is being initialized.
`,
[types_1.TEST_RUN_ERRORS.assertionExecutableArgumentError]: err => `
Cannot evaluate the "${err.actualValue}" expression in the "${err.argumentName}" parameter because of the following error:
${err.errMsg}
`,
[types_1.TEST_RUN_ERRORS.assertionWithoutMethodCallError]: () => `
An assertion method is not specified.
`,
[types_1.TEST_RUN_ERRORS.assertionUnawaitedPromiseError]: () => `
Attempted to run assertions on a Promise object. Did you forget to await it? If not, pass "{ allowUnawaitedPromise: true }" to the assertion options.
`,
[types_1.TEST_RUN_ERRORS.requestHookNotImplementedError]: err => `
You should implement the "${err.methodName}" method in the "${err.hookClassName}" class.
`,
[types_1.TEST_RUN_ERRORS.requestHookUnhandledError]: err => `
An unhandled error occurred in the "${err.methodName}" method of the "${err.hookClassName}" class:
${lodash_1.escape(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomClientScriptCode]: err => `
An error occurred in a script injected into the tested page:
${lodash_1.escape(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomClientScriptCodeLoadedFromModule]: err => `
An error occurred in the '${err.moduleName}' module injected into the tested page. Make sure that this module can be executed in the browser environment.
Error details:
${lodash_1.escape(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomScript]: err => `
An unhandled error occurred in the custom script:
Error details: ${lodash_1.escape(err.errMsg)}
${utils_1.formatExpressionMessage(err.expression, err.line, err.column)}
`,
[types_1.TEST_RUN_ERRORS.childWindowIsNotLoadedError]: () => `
The page in the child window is not loaded.
`,
[types_1.TEST_RUN_ERRORS.childWindowNotFoundError]: () => `
The child window is not found.
`,
[types_1.TEST_RUN_ERRORS.cannotSwitchToWindowError]: () => `
Cannot switch to the window.
`,
[types_1.TEST_RUN_ERRORS.closeChildWindowError]: () => `
An error occurred while closing child windows.
`,
[types_1.TEST_RUN_ERRORS.childWindowClosedBeforeSwitchingError]: () => `
The child window was closed before TestCafe could switch to it.
`
};
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Vycm9ycy90ZXN0LXJ1bi90ZW1wbGF0ZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtQ0FBOEM7QUFDOUMsb0NBQTJDO0FBQzNDLG1DQU1pQjtBQUVqQixNQUFNLGNBQWMsR0FBRztJQUNuQixjQUFjLEVBQU8sMEVBQTBFO0lBQy9GLG1CQUFtQixFQUFFLCtEQUErRDtJQUNwRixhQUFhLEVBQVEsNEVBQTRFO0NBQ3BHLENBQUM7QUFFRixrQkFBZTtJQUNYLENBQUMsdUJBQWUsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7ZUFDeEMsR0FBRyxDQUFDLFVBQVUscURBQXFELEdBQUcsQ0FBQyxXQUFXO0tBQzVGO0lBRUQsQ0FBQyx1QkFBZSxDQUFDLGdDQUFnQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztlQUNoRCxHQUFHLENBQUMsVUFBVSw2REFBNkQsR0FBRyxDQUFDLFdBQVc7S0FDcEc7SUFFRCxDQUFDLHVCQUFlLENBQUMsd0JBQXdCLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO2VBQ3hDLEdBQUcsQ0FBQyxVQUFVLDBEQUEwRCxHQUFHLENBQUMsV0FBVztLQUNqRztJQUVELENBQUMsdUJBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7ZUFDdEMsR0FBRyxDQUFDLFVBQVUsc0VBQXNFLEdBQUcsQ0FBQyxXQUFXO0tBQzdHO0lBRUQsQ0FBQyx1QkFBZSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7dUJBQ3JCLGlCQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQzs7cUVBRTRCLGlCQUFTLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDOzs7VUFHeEcsR0FBRyxDQUFDLE1BQU07S0FDZjtJQUVELENBQUMsdUJBQWUsQ0FBQyxtQkFB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cUIsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDOztLQUU5QztJQUVELENBQUMsdUJBQWUsQ0FBQyxxQ0FBcUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDOztLQUU5RDtDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlc2NhcGUgYXMgZXNjYXBlSHRtbCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBURVNUX1JVTl9FUlJPUlMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge1xuICAgIHJlbmRlckZvcmJpZGRlbkNoYXJzTGlzdCxcbiAgICBmb3JtYXRTZWxlY3RvckNhbGxzdGFjayxcbiAgICBmb3JtYXRVcmwsXG4gICAgcmVwbGFjZUxlYWRpbmdTcGFjZXNXaXRoTmJzcCxcbiAgICBmb3JtYXRFeHByZXNzaW9uTWVzc2FnZVxufSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgRVhURVJOQUxfTElOS1MgPSB7XG4gICAgY3JlYXRlTmV3SXNzdWU6ICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9EZXZFeHByZXNzL3Rlc3RjYWZlL2lzc3Vlcy9uZXc/dGVtcGxhdGU9YnVnLXJlcG9ydC5tZCcsXG4gICAgdHJvdWJsZXNob290TmV0d29yazogJ2h0dHBzOi8vZ28uZGV2ZXhwcmVzcy5jb20vVGVzdENhZmVfRkFRX0FSZXF1ZXN0SGFzRmFpbGVkLmFzcHgnLFxuICAgIHZpZXdwb3J0U2l6ZXM6ICAgICAgICdodHRwczovL2dpdGh1Yi5jb20vRGV2RXhwcmVzcy9kZXZpY2Utc3BlY3MvYmxvYi9tYXN0ZXIvdmlld3BvcnQtc2l6ZXMuanNvbidcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkludGVnZXJPcHRpb25FcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLm9wdGlvbk5hbWV9XCIgb3B0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGludGVnZXIsIGJ1dCBpdCB3YXMgJHtlcnIuYWN0dWFsVmFsdWV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvblBvc2l0aXZlSW50ZWdlck9wdGlvbkVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIFwiJHtlcnIub3B0aW9uTmFtZX1cIiBvcHRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBidXQgaXQgd2FzICR7ZXJyLmFjdHVhbFZhbHVlfS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25Cb29sZWFuT3B0aW9uRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgXCIke2Vyci5vcHRpb25OYW1lfVwiIG9wdGlvbiBpcyBleHBlY3RlZCB0byBiZSBhIGJvb2xlYW4gdmFsdWUsIGJ1dCBpdCB3YXMgJHtlcnIuYWN0dWFsVmFsdWV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvblNwZWVkT3B0aW9uRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgXCIke2Vyci5vcHRpb25OYW1lfVwiIG9wdGlvbiBpcyBleHBlY3RlZCB0byBiZSBhIG51bWJlciBiZXR3ZWVuIDAuMDEgYW5kIDEsIGJ1dCBpdCB3YXMgJHtlcnIuYWN0dWFsVmFsdWV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLnBhZ2VMb2FkRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBBIHJlcXVlc3QgdG8gJHtmb3JtYXRVcmwoZXJyLnVybCl9IGhhcyBmYWlsZWQuXG4gICAgICAgIFVzZSBxdWFyYW50aW5lIG1vZGUgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIGF0dGVtcHRzIHRvIGV4ZWN1dGUgdGhpcyB0ZXN0LlxuICAgICAgICBZb3UgY2FuIGZpbmQgdHJvdWJsZXNob290aW5nIGluZm9ybWF0aW9uIGZvciB0aGlzIGlzc3VlIGF0ICR7Zm9ybWF0VXJsKEVYVEVSTkFMX0xJTktTLnRyb3VibGVzaG9vdE5ldHdvcmspfS5cblxuICAgICAgICBFcnJvciBkZXRhaWxzOlxuICAgICAgICAke2Vyci5lcnJNc2d9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvck9uUGFnZV06IGVyciA9PiBgXG4gICAgICAgIEEgSmF2YVNjcmlwdCBlcnJvciBvY2N1cnJlZCBvbiAke2Zvcm1hdFVybChlcnIucGFnZURlc3RVcmwpfS5cbiAgICAgICAgUmVwZWF0IHRlc3QgYWN0aW9ucyBpbiB0aGUgYnJvd3NlciBhbmQgY2hlY2sgdGhlIGNvbnNvbGUgZm9yIGVycm9ycy5cbiAgICAgICAgSWYgeW91IHNlZSB0aGlzIGVycm9yLCBpdCBtZWFucyB0aGF0IHRoZSB0ZXN0ZWQgd2Vic2l0ZSBjYXVzZWQgaXQuIFlvdSBjYW4gZml4IGl0IG9yIGRpc2FibGUgdHJhY2tpbmcgSmF2YVNjcmlwdCBlcnJvcnMgaW4gVGVzdENhZmUuIFRvIGRvIHRoZSBsYXR0ZXIsIGVuYWJsZSB0aGUgXCItLXNraXAtanMtZXJyb3JzXCIgb3B0aW9uLlxuICAgICAgICBJZiB0aGlzIGVycm9yIGRvZXMgbm90IG9jY3VyLCBwbGVhc2Ugd3JpdGUgYSBuZXcgaXNzdWUgYXQ6XG4gICAgICAgICR7Zm9ybWF0VXJsKEVYVEVSTkFMX0xJTktTLmNyZWF0ZU5ld0lzc3VlKX0uXG5cbiAgICAgICAgSmF2YVNjcmlwdCBlcnJvciBkZXRhaWxzOlxuICAgICAgICAke3JlcGxhY2VMZWFkaW5nU3BhY2VzV2l0aE5ic3AoZXNjYXBlSHRtbChlcnIuZXJyU3RhY2spKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy51bmNhdWdodEVycm9ySW5UZXN0Q29kZV06IGVyciA9PiBgXG4gICAgICAgICR7ZXNjYXBlSHRtbChlcnIuZXJyTXNnKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5uYXRpdmVEaWFsb2dOb3RIYW5kbGVkRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBBIG5hdGl2ZSAke2Vyci5kaWFsb2dUeXBlfSBkaWFsb2cgd2FzIGludm9rZWQgb24gcGFnZSAke2Zvcm1hdFVybChlcnIucGFnZVVybCl9LCBidXQgbm8gaGFuZGxlciB3YXMgc2V0IGZvciBpdC4gVXNlIHRoZSBcInNldE5hdGl2ZURpYWxvZ0hhbmRsZXJcIiBmdW5jdGlvbiB0byBpbnRyb2R1Y2UgYSBoYW5kbGVyIGZ1bmN0aW9uIGZvciBuYXRpdmUgZGlhbG9ncy5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy51bmNhdWdodEVycm9ySW5OYXRpdmVEaWFsb2dIYW5kbGVyXTogZXJyID0+IGBcbiAgICAgICAgQW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIG5hdGl2ZSBkaWFsb2cgaGFuZGxlciBjYWxsZWQgZm9yIGEgbmF0aXZlICR7ZXJyLmRpYWxvZ1R5cGV9IGRpYWxvZyBvbiBwYWdlICR7Zm9ybWF0VXJsKGVyci5wYWdlVXJsKX06XG5cbiAgICAgICAgJHtlc2NhcGVIdG1sKGVyci5lcnJNc2cpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLnNldFRlc3RTcGVlZEFyZ3VtZW50RXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBTcGVlZCBpcyBleHBlY3RlZCB0byBiZSBhIG51bWJlciBiZXR3ZWVuIDAuMDEgYW5kIDEsIGJ1dCAke2Vyci5hY3R1YWxWYWx1ZX0gd2FzIHBhc3NlZC5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5zZXROYXRpdmVEaWFsb2dIYW5kbGVyQ29kZVdyb25nVHlwZUVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIG5hdGl2ZSBkaWFsb2cgaGFuZGxlciBpcyBleHBlY3RlZCB0byBiZSBhIGZ1bmN0aW9uLCBDbGllbnRGdW5jdGlvbiBvciBudWxsLCBidXQgaXQgd2FzICR7ZXJyLmFjdHVhbFR5cGV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0RXJyb3JJbkNsaWVudEZ1bmN0aW9uQ29kZV06IGVyciA9PiBgXG4gICAgICAgIEFuIGVycm9yIG9jY3VycmVkIGluICR7ZXJyLmluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWV9IGNvZGU6XG5cbiAgICAgICAgJHtlc2NhcGVIdG1sKGVyci5lcnJNc2cpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0RXJyb3JJbkN1c3RvbURPTVByb3BlcnR5Q29kZV06IGVyciA9PiBgXG4gICAgICAgIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gdHJ5aW5nIHRvIGNhbGN1bGF0ZSBhIGN1c3RvbSBTZWxlY3RvciBwcm9wZXJ0eSBcIiR7ZXJyLnByb3BlcnR5fVwiOlxuXG4gICAgICAgICR7ZXNjYXBlSHRtbChlcnIuZXJyTXNnKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5jbGllbnRGdW5jdGlvbkV4ZWN1dGlvbkludGVycnVwdGlvbkVycm9yXTogZXJyID0+IGBcbiAgICAgICAgJHtlcnIuaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZX0gZXhlY3V0aW9uIHdhcyBpbnRlcnJ1cHRlZCBieSBwYWdlIHVubG9hZC4gVGhpcyBwcm9ibGVtIG1heSBhcHBlYXIgaWYgeW91IHRyaWdnZXIgcGFnZSBuYXZpZ2F0aW9uIGZyb20gJHtlcnIuaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZX0gY29kZS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy51bmNhdWdodE5vbkVycm9yT2JqZWN0SW5UZXN0Q29kZV06IGVyciA9PiBgXG4gICAgICAgIFVuY2F1Z2h0ICR7ZXJyLm9ialR5cGV9IFwiJHtlc2NhcGVIdG1sKGVyci5vYmpTdHIpfVwiIHdhcyB0aHJvd24uIFRocm93IEVycm9yIGluc3RlYWQuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMudW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvbl06IGVyciA9PiBgXG4gICAgICAgIFVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbjpcblxuICAgICAgICAke2VzY2FwZUh0bWwoZXJyLmVyck1zZyl9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFeGNlcHRpb25dOiBlcnIgPT4gYFxuICAgICAgICBVbmNhdWdodCBleGNlcHRpb246XG5cbiAgICAgICAgJHtlc2NhcGVIdG1sKGVyci5lcnJNc2cpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbk9wdGlvbnNUeXBlRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBBY3Rpb24gb3B0aW9ucyBpcyBleHBlY3RlZCB0byBiZSBhbiBvYmplY3QsIG51bGwgb3IgdW5kZWZpbmVkIGJ1dCBpdCB3YXMgJHtlcnIuYWN0dWFsVHlwZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uU3RyaW5nQXJndW1lbnRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBhcmd1bWVudCBpcyBleHBlY3RlZCB0byBiZSBhIG5vbi1lbXB0eSBzdHJpbmcsIGJ1dCBpdCB3YXMgJHtlcnIuYWN0dWFsVmFsdWV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkJvb2xlYW5Bcmd1bWVudEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGFyZ3VtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGEgYm9vbGVhbiB2YWx1ZSwgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uTnVsbGFibGVTdHJpbmdBcmd1bWVudEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGFyZ3VtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGEgbnVsbCBvciBhIHN0cmluZywgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uU3RyaW5nT3JTdHJpbmdBcnJheUFyZ3VtZW50RXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgXCIke2Vyci5hcmd1bWVudE5hbWV9XCIgYXJndW1lbnQgaXMgZXhwZWN0ZWQgdG8gYmUgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgc3RyaW5nIGFycmF5LCBidXQgaXQgd2FzICR7ZXJyLmFjdHVhbFZhbHVlfS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25TdHJpbmdBcnJheUVsZW1lbnRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIEVsZW1lbnRzIG9mIHRoZSBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBhcmd1bWVudCBhcmUgZXhwZWN0ZWQgdG8gYmUgbm9uLWVtcHR5IHN0cmluZ3MsIGJ1dCB0aGUgZWxlbWVudCBhdCBpbmRleCAke2Vyci5lbGVtZW50SW5kZXh9IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uSW50ZWdlckFyZ3VtZW50RXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgXCIke2Vyci5hcmd1bWVudE5hbWV9XCIgYXJndW1lbnQgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gaW50ZWdlciwgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uUm9sZUFyZ3VtZW50RXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgXCIke2Vyci5hcmd1bWVudE5hbWV9XCIgYXJndW1lbnQgaXMgZXhwZWN0ZWQgdG8gYmUgYSBSb2xlIGluc3RhbmNlLCBidXQgaXQgd2FzICR7ZXJyLmFjdHVhbFZhbHVlfS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25Qb3NpdGl2ZUludGVnZXJBcmd1bWVudEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGFyZ3VtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uRWxlbWVudE5vdEZvdW5kRXJyb3JdOiAoZXJyLCB2aWV3cG9ydFdpZHRoKSA9PiBgXG4gICAgICAgIFRoZSBzcGVjaWZpZWQgc2VsZWN0b3IgZG9lcyBub3QgbWF0Y2ggYW55IGVsZW1lbnQgaW4gdGhlIERPTSB0cmVlLlxuXG4gICAgICAgICR7Zm9ybWF0U2VsZWN0b3JDYWxsc3RhY2soZXJyLmFwaUZuQ2hhaW4sIGVyci5hcGlGbkluZGV4LCB2aWV3cG9ydFdpZHRoKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25FbGVtZW50SXNJbnZpc2libGVFcnJvcl06ICgpID0+IGBcbiAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IgaXMgbm90IHZpc2libGUuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uU2VsZWN0b3JNYXRjaGVzV3JvbmdOb2RlVHlwZUVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIHNwZWNpZmllZCBzZWxlY3RvciBpcyBleHBlY3RlZCB0byBtYXRjaCBhIERPTSBlbGVtZW50LCBidXQgaXQgbWF0Y2hlcyBhICR7ZXJyLm5vZGVEZXNjcmlwdGlvbn0gbm9kZS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25BZGRpdGlvbmFsRWxlbWVudE5vdEZvdW5kRXJyb3JdOiAoZXJyLCB2aWV3cG9ydFdpZHRoKSA9PiBgXG4gICAgICAgIFRoZSBzcGVjaWZpZWQgXCIke2Vyci5hcmd1bWVudE5hbWV9XCIgZG9lcyBub3QgbWF0Y2ggYW55IGVsZW1lbnQgaW4gdGhlIERPTSB0cmVlLlxuXG4gICAgICAgICR7Zm9ybWF0U2VsZWN0b3JDYWxsc3RhY2soZXJyLmFwaUZuQ2hhaW4sIGVyci5hcGlGbkluZGV4LCB2aWV3cG9ydFdpZHRoKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25BZGRpdGlvbmFsRWxlbWVudElzSW52aXNpYmxlRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBpcyBub3QgdmlzaWJsZS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25BZGRpdGlvbmFsU2VsZWN0b3JNYXRjaGVzV3JvbmdOb2RlVHlwZUVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIHNwZWNpZmllZCBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBpcyBleHBlY3RlZCB0byBtYXRjaCBhIERPTSBlbGVtZW50LCBidXQgaXQgbWF0Y2hlcyBhICR7ZXJyLm5vZGVEZXNjcmlwdGlvbn0gbm9kZS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25FbGVtZW50Tm9uRWRpdGFibGVFcnJvcl06ICgpID0+IGBcbiAgICAgICAgVGhlIGFjdGlvbiBlbGVtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGVkaXRhYmxlIChhbiBpbnB1dCwgdGV4dGFyZWEgb3IgZWxlbWVudCB3aXRoIHRoZSBjb250ZW50RWRpdGFibGUgYXR0cmlidXRlKS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25FbGVtZW50Tm9uQ29udGVudEVkaXRhYmxlRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBpcyBleHBlY3RlZCB0byBoYXZlIHRoZSBjb250ZW50RWRpdGFibGUgYXR0cmlidXRlIGVuYWJsZWQgb3IgdGhlIGVudGlyZSBkb2N1bWVudCBzaG91bGQgYmUgaW4gZGVzaWduIG1vZGUuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uUm9vdENvbnRhaW5lck5vdEZvdW5kRXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIENvbnRlbnQgYmV0d2VlbiB0aGUgYWN0aW9uIGVsZW1lbnRzIGNhbm5vdCBiZSBzZWxlY3RlZCBiZWNhdXNlIHRoZSByb290IGNvbnRhaW5lciBmb3IgdGhlIHNlbGVjdGlvbiByYW5nZSBjYW5ub3QgYmUgZm91bmQsIGkuZS4gdGhlc2UgZWxlbWVudHMgZG8gbm90IGhhdmUgYSBjb21tb24gYW5jZXN0b3Igd2l0aCB0aGUgY29udGVudEVkaXRhYmxlIGF0dHJpYnV0ZS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25FbGVtZW50SXNOb3RGaWxlSW5wdXRFcnJvcl06ICgpID0+IGBcbiAgICAgICAgVGhlIHNwZWNpZmllZCBzZWxlY3RvciBkb2VzIG5vdCBtYXRjaCBhIGZpbGUgaW5wdXQgZWxlbWVudC5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25DYW5ub3RGaW5kRmlsZVRvVXBsb2FkRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBDYW5ub3QgZmluZCB0aGUgZm9sbG93aW5nIGZpbGUocykgdG8gdXBsb2FkOlxuICAgICAgICAke2Vyci5maWxlUGF0aHMubWFwKHBhdGggPT4gZXNjYXBlSHRtbChwYXRoKSkuam9pbignXFxuJyl9XG5cbiAgICAgICAgVGhlIGZvbGxvd2luZyBsb2NhdGlvbnMgd2VyZSBzY2FubmVkIGZvciB0aGUgbWlzc2luZyB1cGxvYWQgZmlsZXM6XG4gICAgICAgICR7ZXJyLnNjYW5uZWRGaWxlUGF0aHMubWFwKHBhdGggPT4gZXNjYXBlSHRtbChwYXRoKSkuam9pbignXFxuJyl9XG5cbiAgICAgICAgRW5zdXJlIHRoZXNlIGZpbGVzIGV4aXN0IG9yIGNoYW5nZSB0aGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uRWxlbWVudE5vdFRleHRBcmVhRXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIFRoZSBhY3Rpb24gZWxlbWVudCBpcyBleHBlY3RlZCB0byBiZSBhICZsdDt0ZXh0YXJlYSZndDsuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uRWxlbWVudE5vdElmcmFtZUVycm9yXTogKCkgPT4gYFxuICAgICAgICBUaGUgYWN0aW9uIGVsZW1lbnQgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gJmx0O2lmcmFtZSZndC5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25JbmNvcnJlY3RLZXlzRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgXCIke2Vyci5hcmd1bWVudE5hbWV9XCIgYXJndW1lbnQgY29udGFpbnMgYW4gaW5jb3JyZWN0IGtleSBvciBrZXkgY29tYmluYXRpb24uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uVW5zdXBwb3J0ZWREZXZpY2VUeXBlRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgXCIke2Vyci5hcmd1bWVudE5hbWV9XCIgYXJndW1lbnQgc3BlY2lmaWVzIGFuIHVuc3VwcG9ydGVkIFwiJHtlcnIuYWN0dWFsVmFsdWV9XCIgZGV2aWNlLiBGb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCBkZXZpY2VzLCByZWZlciB0byAke2Zvcm1hdFVybChFWFRFUk5BTF9MSU5LUy52aWV3cG9ydFNpemVzKX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uSW52YWxpZFNjcm9sbFRhcmdldEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVW5hYmxlIHRvIHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIHBvaW50IGJlY2F1c2UgYSBwb2ludCB3aXRoIHRoZSBzcGVjaWZpZWQgJHtlcnIucHJvcGVydGllc30gaXMgbm90IGxvY2F0ZWQgaW5zaWRlIHRoZSBlbGVtZW50J3MgY3JvcHBpbmcgcmVnaW9uLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbklmcmFtZUlzTm90TG9hZGVkRXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIENvbnRlbnQgb2YgdGhlIGlmcmFtZSB0byB3aGljaCB5b3UgYXJlIHN3aXRjaGluZyBkaWQgbm90IGxvYWQuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuY3VycmVudElmcmFtZUlzTm90TG9hZGVkRXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIENvbnRlbnQgb2YgdGhlIGlmcmFtZSBpbiB3aGljaCB0aGUgdGVzdCBpcyBjdXJyZW50bHkgb3BlcmF0aW5nIGRpZCBub3QgbG9hZC5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5jdXJyZW50SWZyYW1lTm90Rm91bmRFcnJvcl06ICgpID0+IGBcbiAgICAgICAgVGhlIGlmcmFtZSBpbiB3aGljaCB0aGUgdGVzdCBpcyBjdXJyZW50bHkgb3BlcmF0aW5nIGRvZXMgbm90IGV4aXN0IGFueW1vcmUuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuY3VycmVudElmcmFtZUlzSW52aXNpYmxlRXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIFRoZSBpZnJhbWUgaW4gd2hpY2ggdGhlIHRlc3QgaXMgY3VycmVudGx5IG9wZXJhdGluZyBpcyBub3QgdmlzaWJsZSBhbnltb3JlLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLm1pc3NpbmdBd2FpdEVycm9yXTogKCkgPT4gYFxuICAgICAgICBBIGNhbGwgdG8gYW4gYXN5bmMgZnVuY3Rpb24gaXMgbm90IGF3YWl0ZWQuIFVzZSB0aGUgXCJhd2FpdFwiIGtleXdvcmQgYmVmb3JlIGFjdGlvbnMsIGFzc2VydGlvbnMgb3IgY2hhaW5zIG9mIHRoZW0gdG8gZW5zdXJlIHRoYXQgdGhleSBydW4gaW4gdGhlIHJpZ2h0IHNlcXVlbmNlLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmV4dGVybmFsQXNzZXJ0aW9uTGlicmFyeUVycm9yXTogZXJyID0+IGBcbiAgICAgICAgJHtlc2NhcGVIdG1sKGVyci5lcnJNc2cpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmRvbU5vZGVDbGllbnRGdW5jdGlvblJlc3VsdEVycm9yXTogZXJyID0+IGBcbiAgICAgICAke2Vyci5pbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lfSBjYW5ub3QgcmV0dXJuIERPTSBlbGVtZW50cy4gVXNlIFNlbGVjdG9yIGZ1bmN0aW9ucyBmb3IgdGhpcyBwdXJwb3NlLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmludmFsaWRTZWxlY3RvclJlc3VsdEVycm9yXTogKCkgPT4gYFxuICAgICAgICBGdW5jdGlvbiB0aGF0IHNwZWNpZmllcyBhIHNlbGVjdG9yIGNhbiBvbmx5IHJldHVybiBhIERPTSBub2RlLCBhbiBhcnJheSBvZiBub2RlcywgTm9kZUxpc3QsIEhUTUxDb2xsZWN0aW9uLCBudWxsIG9yIHVuZGVmaW5lZC4gVXNlIENsaWVudEZ1bmN0aW9uIHRvIHJldHVybiBvdGhlciB2YWx1ZXMuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uU2VsZWN0b3JFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIEFjdGlvbiBcIiR7ZXJyLnNlbGVjdG9yTmFtZX1cIiBhcmd1bWVudCBlcnJvcjpcblxuICAgICAgICAke2VzY2FwZUh0bWwoZXJyLmVyck1zZyl9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuY2Fubm90T2J0YWluSW5mb0ZvckVsZW1lbnRTcGVjaWZpZWRCeVNlbGVjdG9yRXJyb3JdOiAoZXJyLCB2aWV3cG9ydFdpZHRoKSA9PiBgXG4gICAgICAgIENhbm5vdCBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5vZGUgYmVjYXVzZSB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yIGRvZXMgbm90IG1hdGNoIGFueSBub2RlIGluIHRoZSBET00gdHJlZS5cblxuICAgICAgICAke2Zvcm1hdFNlbGVjdG9yQ2FsbHN0YWNrKGVyci5hcGlGbkNoYWluLCBlcnIuYXBpRm5JbmRleCwgdmlld3BvcnRXaWR0aCl9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMud2luZG93RGltZW5zaW9uc092ZXJmbG93RXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIFVuYWJsZSB0byByZXNpemUgdGhlIHdpbmRvdyBiZWNhdXNlIHRoZSBzcGVjaWZpZWQgc2l6ZSBleGNlZWRzIHRoZSBzY3JlZW4gc2l6ZS4gT24gbWFjT1MsIGEgd2luZG93IGNhbm5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgc2NyZWVuLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmZvcmJpZGRlbkNoYXJhY3RlcnNJblNjcmVlbnNob3RQYXRoRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGVyZSBhcmUgZm9yYmlkZGVuIGNoYXJhY3RlcnMgaW4gdGhlIFwiJHtlcnIuc2NyZWVuc2hvdFBhdGh9XCIgc2NyZWVuc2hvdCBwYXRoOlxuICAgICAgICAke3JlbmRlckZvcmJpZGRlbkNoYXJzTGlzdChlcnIuZm9yYmlkZGVuQ2hhcnNMaXN0KX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5pbnZhbGlkRWxlbWVudFNjcmVlbnNob3REaW1lbnNpb25zRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICAgVW5hYmxlIHRvIGNhcHR1cmUgYW4gZWxlbWVudCBpbWFnZSBiZWNhdXNlIHRoZSByZXN1bHRpbmcgaW1hZ2UgJHtlcnIuZGltZW5zaW9uc30gJHtlcnIudmVyYn0gemVybyBvciBuZWdhdGl2ZS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5yb2xlU3dpdGNoSW5Sb2xlSW5pdGlhbGl6ZXJFcnJvcl06ICgpID0+IGBcbiAgICAgICAgUm9sZSBjYW5ub3QgYmUgc3dpdGNoZWQgd2hpbGUgYW5vdGhlciByb2xlIGlzIGJlaW5nIGluaXRpYWxpemVkLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFzc2VydGlvbkV4ZWN1dGFibGVBcmd1bWVudEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgQ2Fubm90IGV2YWx1YXRlIHRoZSBcIiR7ZXJyLmFjdHVhbFZhbHVlfVwiIGV4cHJlc3Npb24gaW4gdGhlIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIHBhcmFtZXRlciBiZWNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3I6XG5cbiAgICAgICAgJHtlcnIuZXJyTXNnfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFzc2VydGlvbldpdGhvdXRNZXRob2RDYWxsRXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIEFuIGFzc2VydGlvbiBtZXRob2QgaXMgbm90IHNwZWNpZmllZC5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hc3NlcnRpb25VbmF3YWl0ZWRQcm9taXNlRXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIEF0dGVtcHRlZCB0byBydW4gYXNzZXJ0aW9ucyBvbiBhIFByb21pc2Ugb2JqZWN0LiBEaWQgeW91IGZvcmdldCB0byBhd2FpdCBpdD8gSWYgbm90LCBwYXNzIFwieyBhbGxvd1VuYXdhaXRlZFByb21pc2U6IHRydWUgfVwiIHRvIHRoZSBhc3NlcnRpb24gb3B0aW9ucy5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5yZXF1ZXN0SG9va05vdEltcGxlbWVudGVkRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBZb3Ugc2hvdWxkIGltcGxlbWVudCB0aGUgXCIke2Vyci5tZXRob2ROYW1lfVwiIG1ldGhvZCBpbiB0aGUgXCIke2Vyci5ob29rQ2xhc3NOYW1lfVwiIGNsYXNzLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLnJlcXVlc3RIb29rVW5oYW5kbGVkRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBBbiB1bmhhbmRsZWQgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIFwiJHtlcnIubWV0aG9kTmFtZX1cIiBtZXRob2Qgb2YgdGhlIFwiJHtlcnIuaG9va0NsYXNzTmFtZX1cIiBjbGFzczpcblxuICAgICAgICAke2VzY2FwZUh0bWwoZXJyLmVyck1zZyl9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvckluQ3VzdG9tQ2xpZW50U2NyaXB0Q29kZV06IGVyciA9PiBgXG4gICAgICAgIEFuIGVycm9yIG9jY3VycmVkIGluIGEgc2NyaXB0IGluamVjdGVkIGludG8gdGhlIHRlc3RlZCBwYWdlOlxuXG4gICAgICAgICR7ZXNjYXBlSHRtbChlcnIuZXJyTXNnKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy51bmNhdWdodEVycm9ySW5DdXN0b21DbGllbnRTY3JpcHRDb2RlTG9hZGVkRnJvbU1vZHVsZV06IGVyciA9PiBgXG4gICAgICAgIEFuIGVycm9yIG9jY3VycmVkIGluIHRoZSAnJHtlcnIubW9kdWxlTmFtZX0nIG1vZHVsZSBpbmplY3RlZCBpbnRvIHRoZSB0ZXN0ZWQgcGFnZS4gTWFrZSBzdXJlIHRoYXQgdGhpcyBtb2R1bGUgY2FuIGJlIGV4ZWN1dGVkIGluIHRoZSBicm93c2VyIGVudmlyb25tZW50LlxuXG4gICAgICAgIEVycm9yIGRldGFpbHM6XG4gICAgICAgICR7ZXNjYXBlSHRtbChlcnIuZXJyTXNnKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy51bmNhdWdodEVycm9ySW5DdXN0b21TY3JpcHRdOiBlcnIgPT4gYFxuICAgICAgICBBbiB1bmhhbmRsZWQgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGN1c3RvbSBzY3JpcHQ6XG5cbiAgICAgICAgRXJyb3IgZGV0YWlsczogJHtlc2NhcGVIdG1sKGVyci5lcnJNc2cpfVxuXG4gICAgICAgICR7Zm9ybWF0RXhwcmVzc2lvbk1lc3NhZ2UoZXJyLmV4cHJlc3Npb24sIGVyci5saW5lLCBlcnIuY29sdW1uKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5jaGlsZFdpbmRvd0lzTm90TG9hZGVkRXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIFRoZSBwYWdlIGluIHRoZSBjaGlsZCB3aW5kb3cgaXMgbm90IGxvYWRlZC5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5jaGlsZFdpbmRvd05vdEZvdW5kRXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIFRoZSBjaGlsZCB3aW5kb3cgaXMgbm90IGZvdW5kLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmNhbm5vdFN3aXRjaFRvV2luZG93RXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIENhbm5vdCBzd2l0Y2ggdG8gdGhlIHdpbmRvdy5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5jbG9zZUNoaWxkV2luZG93RXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGNsb3NpbmcgY2hpbGQgd2luZG93cy5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5jaGlsZFdpbmRvd0Nsb3NlZEJlZm9yZVN3aXRjaGluZ0Vycm9yXTogKCkgPT4gYFxuICAgICAgICBUaGUgY2hpbGQgd2luZG93IHdhcyBjbG9zZWQgYmVmb3JlIFRlc3RDYWZlIGNvdWxkIHN3aXRjaCB0byBpdC5cbiAgICBgXG59O1xuIl19