@dotglitch/ngx-common 1.2.0 → 3.0.0-beta.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/README.md +37 -22
- package/esm2022/components/lazy-loader/lazy-loader.component.mjs +4 -4
- package/esm2022/components/lazy-loader/lazy-loader.module.mjs +5 -5
- package/esm2022/components/lazy-loader/lazy-loader.service.mjs +4 -4
- package/esm2022/components/menu/menu.component.mjs +4 -4
- package/esm2022/components/parallax-card/parallax-card.component.mjs +4 -4
- package/esm2022/components/tooltip/tooltip.component.mjs +4 -4
- package/esm2022/directives/image-cache.directive.mjs +7 -4
- package/esm2022/directives/menu.directive.mjs +4 -4
- package/esm2022/directives/tooltip.directive.mjs +7 -7
- package/esm2022/pipes/html-bypass.pipe.mjs +4 -4
- package/esm2022/pipes/resource-bypass.pipe.mjs +4 -4
- package/esm2022/pipes/script-bypass.pipe.mjs +4 -4
- package/esm2022/pipes/style-bypass.pipe.mjs +4 -4
- package/esm2022/pipes/url-bypass.pipe.mjs +4 -4
- package/esm2022/public-api.mjs +7 -23
- package/esm2022/services/dependency.service.mjs +4 -4
- package/esm2022/services/dialog.service.mjs +4 -4
- package/esm2022/services/fetch.service.mjs +4 -4
- package/esm2022/services/file.service.mjs +4 -4
- package/esm2022/services/keyboard.service.mjs +4 -4
- package/esm2022/services/navigation.service.mjs +4 -4
- package/esm2022/services/theme.service.mjs +50 -15
- package/fesm2022/dotglitch-ngx-common.mjs +1105 -10155
- package/fesm2022/dotglitch-ngx-common.mjs.map +1 -1
- package/package.json +27 -10
- package/public-api.d.ts +6 -19
- package/services/theme.service.d.ts +12 -2
- package/assets/mat-icons.d.ts +0 -5705
- package/components/command-palette/breadcrumb/breadcrumb.component.d.ts +0 -16
- package/components/command-palette/command-palette.component.d.ts +0 -38
- package/components/command-palette/shortcut/shortcut.component.d.ts +0 -9
- package/components/dynamic-html/dynamic-html.component.d.ts +0 -15
- package/components/dynamic-html/dynamic-html.module.d.ts +0 -10
- package/components/dynamic-html/dynamic-html.service.d.ts +0 -18
- package/components/dynamic-html/types.d.ts +0 -12
- package/components/filemanager/file-grid/file-grid.component.d.ts +0 -101
- package/components/filemanager/filemanager.component.d.ts +0 -207
- package/components/filemanager/folder-rename/folder-rename.component.d.ts +0 -18
- package/components/filemanager/helpers.d.ts +0 -5
- package/components/filemanager/icon-resolver.d.ts +0 -13
- package/components/filemanager/textextensions.d.ts +0 -3
- package/components/filemanager/toolbar/breadcrumb/breadcrumb.component.d.ts +0 -16
- package/components/filemanager/toolbar/icon-button/icon-button.component.d.ts +0 -11
- package/components/filemanager/toolbar/toolbar.component.d.ts +0 -31
- package/components/filemanager/tree-view/tree-view.component.d.ts +0 -21
- package/components/react-magic-wrapper/react-magic-wrapper.component.d.ts +0 -63
- package/components/tabulator/tabulator.component.d.ts +0 -30
- package/components/vscode/ts-type-resolver/dependency-parser.d.ts +0 -6
- package/components/vscode/ts-type-resolver/dummy-source-cache.d.ts +0 -7
- package/components/vscode/ts-type-resolver/import-resolver.d.ts +0 -28
- package/components/vscode/ts-type-resolver/main.d.ts +0 -22
- package/components/vscode/ts-type-resolver/recursion-depth.d.ts +0 -11
- package/components/vscode/ts-type-resolver/types.d.ts +0 -179
- package/components/vscode/ts-type-resolver/unpkg-source-resolver.d.ts +0 -5
- package/components/vscode/ts-type-resolver/update-emitter.d.ts +0 -2
- package/components/vscode/vscode.component.d.ts +0 -52
- package/esm2022/assets/mat-icons.mjs +0 -5705
- package/esm2022/components/command-palette/breadcrumb/breadcrumb.component.mjs +0 -30
- package/esm2022/components/command-palette/command-palette.component.mjs +0 -257
- package/esm2022/components/command-palette/shortcut/shortcut.component.mjs +0 -19
- package/esm2022/components/dynamic-html/dynamic-html.component.mjs +0 -43
- package/esm2022/components/dynamic-html/dynamic-html.module.mjs +0 -27
- package/esm2022/components/dynamic-html/dynamic-html.service.mjs +0 -66
- package/esm2022/components/dynamic-html/types.mjs +0 -7
- package/esm2022/components/filemanager/file-grid/file-grid.component.mjs +0 -674
- package/esm2022/components/filemanager/filemanager.component.mjs +0 -314
- package/esm2022/components/filemanager/folder-rename/folder-rename.component.mjs +0 -57
- package/esm2022/components/filemanager/helpers.mjs +0 -26
- package/esm2022/components/filemanager/icon-resolver.mjs +0 -155
- package/esm2022/components/filemanager/textextensions.mjs +0 -294
- package/esm2022/components/filemanager/toolbar/breadcrumb/breadcrumb.component.mjs +0 -22
- package/esm2022/components/filemanager/toolbar/icon-button/icon-button.component.mjs +0 -32
- package/esm2022/components/filemanager/toolbar/toolbar.component.mjs +0 -165
- package/esm2022/components/filemanager/tree-view/tree-view.component.mjs +0 -51
- package/esm2022/components/react-magic-wrapper/react-magic-wrapper.component.mjs +0 -160
- package/esm2022/components/tabulator/tabulator.component.mjs +0 -93
- package/esm2022/components/vscode/ts-type-resolver/dependency-parser.mjs +0 -91
- package/esm2022/components/vscode/ts-type-resolver/dummy-source-cache.mjs +0 -15
- package/esm2022/components/vscode/ts-type-resolver/import-resolver.mjs +0 -311
- package/esm2022/components/vscode/ts-type-resolver/main.mjs +0 -112
- package/esm2022/components/vscode/ts-type-resolver/recursion-depth.mjs +0 -21
- package/esm2022/components/vscode/ts-type-resolver/types.mjs +0 -14
- package/esm2022/components/vscode/ts-type-resolver/unpkg-source-resolver.mjs +0 -21
- package/esm2022/components/vscode/ts-type-resolver/update-emitter.mjs +0 -37
- package/esm2022/components/vscode/vscode.component.mjs +0 -232
- package/esm2022/services/command-palette.service.mjs +0 -209
- package/fesm2022/dotglitch-ngx-common-folder-rename.component-6j7OjwOo.mjs +0 -83
- package/fesm2022/dotglitch-ngx-common-folder-rename.component-6j7OjwOo.mjs.map +0 -1
- package/services/command-palette.service.d.ts +0 -128
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
export const invokeUpdate = (progress, options) => {
|
|
2
|
-
let textual = `${progress.type}: `;
|
|
3
|
-
switch (progress.type) {
|
|
4
|
-
case 'CodeChanged':
|
|
5
|
-
textual += ``;
|
|
6
|
-
break;
|
|
7
|
-
case 'ResolveNewImports':
|
|
8
|
-
textual += ``;
|
|
9
|
-
break;
|
|
10
|
-
// case 'DetectedImport':
|
|
11
|
-
// textual += `at "${progress.source}" the import "${progress.importPath}" was detected`;
|
|
12
|
-
// break;
|
|
13
|
-
// case 'CompletedImport':
|
|
14
|
-
// textual += `at "${progress.source}" the import "${progress.importPath}" was completed`;
|
|
15
|
-
// break;
|
|
16
|
-
case 'LookedUpTypeFile':
|
|
17
|
-
textual += `"${progress.path}" was ${progress.success ? 'sucessfully' : 'not sucessfully'} looked up`;
|
|
18
|
-
break;
|
|
19
|
-
case 'AttemptedLookUpFile':
|
|
20
|
-
textual += `"${progress.path}" was ${progress.success ? 'sucessfully' : 'not sucessfully'} attempted to looked up`; // What in the hell is this grammar?
|
|
21
|
-
break;
|
|
22
|
-
case 'LookedUpPackage':
|
|
23
|
-
textual += `package.json for package "${progress.package}" was ${progress.success ? 'sucessfully' : 'not sucessfully'} looked up${progress.definitelyTyped ? ' (found in definitely typed repo)' : ''}`;
|
|
24
|
-
break;
|
|
25
|
-
case 'LoadedFromCache':
|
|
26
|
-
textual += `"${progress.importPath}" was loaded from cache`;
|
|
27
|
-
break;
|
|
28
|
-
case 'StoredToCache':
|
|
29
|
-
textual += `"${progress.importPath}" was stored to cache`;
|
|
30
|
-
break;
|
|
31
|
-
}
|
|
32
|
-
if (textual.endsWith(': ')) {
|
|
33
|
-
textual = textual.slice(undefined, -2);
|
|
34
|
-
}
|
|
35
|
-
options.onUpdate?.(progress, textual);
|
|
36
|
-
};
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWVtaXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL2NvbXBvbmVudHMvdnNjb2RlL3RzLXR5cGUtcmVzb2x2ZXIvdXBkYXRlLWVtaXR0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsUUFBd0IsRUFBRSxPQUFnQixFQUFFLEVBQUU7SUFDdkUsSUFBSSxPQUFPLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUM7SUFFbkMsUUFBUSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEIsS0FBSyxhQUFhO1lBQ2QsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUNkLE1BQU07UUFDVixLQUFLLG1CQUFtQjtZQUNwQixPQUFPLElBQUksRUFBRSxDQUFDO1lBQ2QsTUFBTTtRQUNWLHlCQUF5QjtRQUN6Qiw2RkFBNkY7UUFDN0YsYUFBYTtRQUNiLDBCQUEwQjtRQUMxQiw4RkFBOEY7UUFDOUYsYUFBYTtRQUNiLEtBQUssa0JBQWtCO1lBQ25CLE9BQU8sSUFBSSxJQUFJLFFBQVEsQ0FBQyxJQUFJLFNBQVMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsWUFBWSxDQUFDO1lBQ3RHLE1BQU07UUFDVixLQUFLLHFCQUFxQjtZQUN0QixPQUFPLElBQUksSUFBSSxRQUFRLENBQUMsSUFBSSxTQUN4QixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGlCQUN2Qyx5QkFBeUIsQ0FBQyxDQUFDLG9DQUFvQztZQUMvRCxNQUFNO1FBQ1YsS0FBSyxpQkFBaUI7WUFDbEIsT0FBTyxJQUFJLDZCQUE2QixRQUFRLENBQUMsT0FBTyxTQUNwRCxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGlCQUN2QyxhQUFhLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNuRixNQUFNO1FBQ1YsS0FBSyxpQkFBaUI7WUFDbEIsT0FBTyxJQUFJLElBQUksUUFBUSxDQUFDLFVBQVUseUJBQXlCLENBQUM7WUFDNUQsTUFBTTtRQUNWLEtBQUssZUFBZTtZQUNoQixPQUFPLElBQUksSUFBSSxRQUFRLENBQUMsVUFBVSx1QkFBdUIsQ0FBQztZQUMxRCxNQUFNO0lBQ2QsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb2dyZXNzVXBkYXRlLCBPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBpbnZva2VVcGRhdGUgPSAocHJvZ3Jlc3M6IFByb2dyZXNzVXBkYXRlLCBvcHRpb25zOiBPcHRpb25zKSA9PiB7XG4gICAgbGV0IHRleHR1YWwgPSBgJHtwcm9ncmVzcy50eXBlfTogYDtcblxuICAgIHN3aXRjaCAocHJvZ3Jlc3MudHlwZSkge1xuICAgICAgICBjYXNlICdDb2RlQ2hhbmdlZCc6XG4gICAgICAgICAgICB0ZXh0dWFsICs9IGBgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1Jlc29sdmVOZXdJbXBvcnRzJzpcbiAgICAgICAgICAgIHRleHR1YWwgKz0gYGA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gY2FzZSAnRGV0ZWN0ZWRJbXBvcnQnOlxuICAgICAgICAvLyAgICAgdGV4dHVhbCArPSBgYXQgXCIke3Byb2dyZXNzLnNvdXJjZX1cIiB0aGUgaW1wb3J0IFwiJHtwcm9ncmVzcy5pbXBvcnRQYXRofVwiIHdhcyBkZXRlY3RlZGA7XG4gICAgICAgIC8vICAgICBicmVhaztcbiAgICAgICAgLy8gY2FzZSAnQ29tcGxldGVkSW1wb3J0JzpcbiAgICAgICAgLy8gICAgIHRleHR1YWwgKz0gYGF0IFwiJHtwcm9ncmVzcy5zb3VyY2V9XCIgdGhlIGltcG9ydCBcIiR7cHJvZ3Jlc3MuaW1wb3J0UGF0aH1cIiB3YXMgY29tcGxldGVkYDtcbiAgICAgICAgLy8gICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdMb29rZWRVcFR5cGVGaWxlJzpcbiAgICAgICAgICAgIHRleHR1YWwgKz0gYFwiJHtwcm9ncmVzcy5wYXRofVwiIHdhcyAke3Byb2dyZXNzLnN1Y2Nlc3MgPyAnc3VjZXNzZnVsbHknIDogJ25vdCBzdWNlc3NmdWxseSd9IGxvb2tlZCB1cGA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnQXR0ZW1wdGVkTG9va1VwRmlsZSc6XG4gICAgICAgICAgICB0ZXh0dWFsICs9IGBcIiR7cHJvZ3Jlc3MucGF0aH1cIiB3YXMgJHtcbiAgICAgICAgICAgICAgICBwcm9ncmVzcy5zdWNjZXNzID8gJ3N1Y2Vzc2Z1bGx5JyA6ICdub3Qgc3VjZXNzZnVsbHknXG4gICAgICAgICAgICB9IGF0dGVtcHRlZCB0byBsb29rZWQgdXBgOyAvLyBXaGF0IGluIHRoZSBoZWxsIGlzIHRoaXMgZ3JhbW1hcj9cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdMb29rZWRVcFBhY2thZ2UnOlxuICAgICAgICAgICAgdGV4dHVhbCArPSBgcGFja2FnZS5qc29uIGZvciBwYWNrYWdlIFwiJHtwcm9ncmVzcy5wYWNrYWdlfVwiIHdhcyAke1xuICAgICAgICAgICAgICAgIHByb2dyZXNzLnN1Y2Nlc3MgPyAnc3VjZXNzZnVsbHknIDogJ25vdCBzdWNlc3NmdWxseSdcbiAgICAgICAgICAgIH0gbG9va2VkIHVwJHtwcm9ncmVzcy5kZWZpbml0ZWx5VHlwZWQgPyAnIChmb3VuZCBpbiBkZWZpbml0ZWx5IHR5cGVkIHJlcG8pJyA6ICcnfWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnTG9hZGVkRnJvbUNhY2hlJzpcbiAgICAgICAgICAgIHRleHR1YWwgKz0gYFwiJHtwcm9ncmVzcy5pbXBvcnRQYXRofVwiIHdhcyBsb2FkZWQgZnJvbSBjYWNoZWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnU3RvcmVkVG9DYWNoZSc6XG4gICAgICAgICAgICB0ZXh0dWFsICs9IGBcIiR7cHJvZ3Jlc3MuaW1wb3J0UGF0aH1cIiB3YXMgc3RvcmVkIHRvIGNhY2hlYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICh0ZXh0dWFsLmVuZHNXaXRoKCc6ICcpKSB7XG4gICAgICAgIHRleHR1YWwgPSB0ZXh0dWFsLnNsaWNlKHVuZGVmaW5lZCwgLTIpO1xuICAgIH1cblxuICAgIG9wdGlvbnMub25VcGRhdGU/Lihwcm9ncmVzcywgdGV4dHVhbCk7XG59O1xuIl19
|
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
|
|
2
|
-
import { MonacoAutoTypeImporter } from './ts-type-resolver/main';
|
|
3
|
-
import { debounceTime } from 'rxjs';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
let Monaco;
|
|
6
|
-
export class VscodeComponent {
|
|
7
|
-
set code(value) {
|
|
8
|
-
if (value == this._code)
|
|
9
|
-
return;
|
|
10
|
-
if (typeof value != "string")
|
|
11
|
-
throw new TypeError("Value must be of type string");
|
|
12
|
-
this._code = value;
|
|
13
|
-
this.editor?.setValue(this.code);
|
|
14
|
-
}
|
|
15
|
-
;
|
|
16
|
-
get code() { return this._code?.trim(); }
|
|
17
|
-
set language(value) {
|
|
18
|
-
this._language = {
|
|
19
|
-
'ts': "typescript",
|
|
20
|
-
'html': 'xml',
|
|
21
|
-
'scss': 'css'
|
|
22
|
-
}[value] || value || "auto";
|
|
23
|
-
}
|
|
24
|
-
get language() { return this._language; }
|
|
25
|
-
get settings() {
|
|
26
|
-
return {
|
|
27
|
-
...this.restSettings,
|
|
28
|
-
theme: this.theme,
|
|
29
|
-
language: this.language,
|
|
30
|
-
tabSize: this.tabSize,
|
|
31
|
-
readOnly: this.readOnly,
|
|
32
|
-
fontFamily: this.fontFamily,
|
|
33
|
-
fontSize: this.fontSize,
|
|
34
|
-
automaticLayout: this.automaticLayout,
|
|
35
|
-
scrollBeyondLastLine: this.scrollBeyondLastLine,
|
|
36
|
-
colorDecorators: this.colorDecorators,
|
|
37
|
-
folding: this.folding,
|
|
38
|
-
scrollBeyondLastColumn: this.scrollBeyondLastColumn,
|
|
39
|
-
minimap: this.minimap,
|
|
40
|
-
scrollbar: this.scrollbar,
|
|
41
|
-
smoothScrolling: this.smoothScrolling,
|
|
42
|
-
mouseWheelScrollSensitivity: this.mouseWheelScrollSensitivity,
|
|
43
|
-
lineNumbers: this.lineNumbers
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
constructor(viewContainer) {
|
|
47
|
-
this.viewContainer = viewContainer;
|
|
48
|
-
this.isDirty = false;
|
|
49
|
-
this.codeChange = new EventEmitter();
|
|
50
|
-
this.onCodeType = new EventEmitter();
|
|
51
|
-
this.typeDebounce = this.onCodeType.pipe(debounceTime(100));
|
|
52
|
-
this.installationLocation = "/lib/monaco/vs";
|
|
53
|
-
this.tabSize = 2;
|
|
54
|
-
this.readOnly = false;
|
|
55
|
-
this.theme = "vs-dark";
|
|
56
|
-
this.fontFamily = "Droid Sans Mono";
|
|
57
|
-
this.fontSize = 14;
|
|
58
|
-
this.automaticLayout = true;
|
|
59
|
-
this.colorDecorators = true;
|
|
60
|
-
this.folding = true;
|
|
61
|
-
this.minimapEnabled = true;
|
|
62
|
-
this.minimap = {
|
|
63
|
-
enabled: true
|
|
64
|
-
};
|
|
65
|
-
this.scrollbar = {
|
|
66
|
-
alwaysConsumeMouseWheel: false,
|
|
67
|
-
// scrollByPage: true
|
|
68
|
-
};
|
|
69
|
-
this.smoothScrolling = true;
|
|
70
|
-
this.mouseWheelScrollSensitivity = 2;
|
|
71
|
-
this.scrollBeyondLastLine = false;
|
|
72
|
-
this.scrollBeyondLastColumn = 0;
|
|
73
|
-
this.lineNumbers = "on";
|
|
74
|
-
this.restSettings = {};
|
|
75
|
-
this.resize = () => {
|
|
76
|
-
this.editor?.layout();
|
|
77
|
-
};
|
|
78
|
-
InstallMonacoUMD(this.installationLocation);
|
|
79
|
-
this._sub = this.typeDebounce.subscribe(t => {
|
|
80
|
-
this.codeChange.next(this._code = this.editor.getValue());
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
ngOnChanges(changes) {
|
|
84
|
-
// If we changed anything OTHER than code, reload the editor
|
|
85
|
-
if (Object.keys(changes).length > 1 || !changes['code']) {
|
|
86
|
-
if (this.editor) {
|
|
87
|
-
this.editor?.dispose();
|
|
88
|
-
this.createEditor();
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
if (changes['theme'])
|
|
92
|
-
window['monaco']?.editor.setTheme(this.theme);
|
|
93
|
-
}
|
|
94
|
-
async ngAfterViewInit() {
|
|
95
|
-
await InstallMonacoUMD();
|
|
96
|
-
this.createEditor();
|
|
97
|
-
}
|
|
98
|
-
ngOnDestroy() {
|
|
99
|
-
this.editor?.dispose();
|
|
100
|
-
this._sub?.unsubscribe();
|
|
101
|
-
}
|
|
102
|
-
createEditor() {
|
|
103
|
-
if (this.customLanguage) {
|
|
104
|
-
this.customLanguage.init(window['monaco']);
|
|
105
|
-
}
|
|
106
|
-
let editor = this.editor = window['monaco'].editor.create(this.viewContainer?.element?.nativeElement, this.settings);
|
|
107
|
-
// const autoTypings = await
|
|
108
|
-
MonacoAutoTypeImporter.create(editor, {
|
|
109
|
-
monaco: Monaco,
|
|
110
|
-
});
|
|
111
|
-
this.configureLanguageSupport();
|
|
112
|
-
if (this.code) {
|
|
113
|
-
editor.setValue(this.code);
|
|
114
|
-
}
|
|
115
|
-
editor.getModel().onDidChangeContent(() => this.onCodeType.emit());
|
|
116
|
-
}
|
|
117
|
-
configureLanguageSupport() {
|
|
118
|
-
}
|
|
119
|
-
download() {
|
|
120
|
-
const code = this.editor.getValue();
|
|
121
|
-
let blob = new Blob([code], { type: 'text/log' });
|
|
122
|
-
let elm = document.createElement('a');
|
|
123
|
-
let blobURL = URL.createObjectURL(blob);
|
|
124
|
-
// Set the data values.
|
|
125
|
-
elm.href = blobURL;
|
|
126
|
-
elm.download = this.filename;
|
|
127
|
-
document.body.appendChild(elm);
|
|
128
|
-
elm.click();
|
|
129
|
-
document.body.removeChild(elm);
|
|
130
|
-
elm.remove();
|
|
131
|
-
URL.revokeObjectURL(blobURL);
|
|
132
|
-
}
|
|
133
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: VscodeComponent, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
134
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: VscodeComponent, isStandalone: true, selector: "app-vscode", inputs: { code: "code", customLanguage: "customLanguage", language: "language", installationLocation: "installationLocation", tabSize: "tabSize", readOnly: "readOnly", theme: "theme", fontFamily: "fontFamily", fontSize: "fontSize", automaticLayout: "automaticLayout", colorDecorators: "colorDecorators", folding: "folding", minimapEnabled: "minimapEnabled", minimap: "minimap", scrollbar: "scrollbar", smoothScrolling: "smoothScrolling", mouseWheelScrollSensitivity: "mouseWheelScrollSensitivity", scrollBeyondLastLine: "scrollBeyondLastLine", scrollBeyondLastColumn: "scrollBeyondLastColumn", lineNumbers: "lineNumbers", restSettings: "restSettings" }, outputs: { codeChange: "codeChange" }, host: { listeners: { "window:resize": "resize($event)" } }, usesOnChanges: true, ngImport: i0, template: '', isInline: true, styles: [":host{display:block;height:100%;max-height:100vh;max-width:100vw}\n"] }); }
|
|
135
|
-
}
|
|
136
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: VscodeComponent, decorators: [{
|
|
137
|
-
type: Component,
|
|
138
|
-
args: [{ selector: 'app-vscode', template: '', standalone: true, styles: [":host{display:block;height:100%;max-height:100vh;max-width:100vw}\n"] }]
|
|
139
|
-
}], ctorParameters: () => [{ type: i0.ViewContainerRef }], propDecorators: { code: [{
|
|
140
|
-
type: Input
|
|
141
|
-
}], codeChange: [{
|
|
142
|
-
type: Output
|
|
143
|
-
}], customLanguage: [{
|
|
144
|
-
type: Input
|
|
145
|
-
}], language: [{
|
|
146
|
-
type: Input
|
|
147
|
-
}], installationLocation: [{
|
|
148
|
-
type: Input
|
|
149
|
-
}], tabSize: [{
|
|
150
|
-
type: Input
|
|
151
|
-
}], readOnly: [{
|
|
152
|
-
type: Input
|
|
153
|
-
}], theme: [{
|
|
154
|
-
type: Input
|
|
155
|
-
}], fontFamily: [{
|
|
156
|
-
type: Input
|
|
157
|
-
}], fontSize: [{
|
|
158
|
-
type: Input
|
|
159
|
-
}], automaticLayout: [{
|
|
160
|
-
type: Input
|
|
161
|
-
}], colorDecorators: [{
|
|
162
|
-
type: Input
|
|
163
|
-
}], folding: [{
|
|
164
|
-
type: Input
|
|
165
|
-
}], minimapEnabled: [{
|
|
166
|
-
type: Input
|
|
167
|
-
}], minimap: [{
|
|
168
|
-
type: Input
|
|
169
|
-
}], scrollbar: [{
|
|
170
|
-
type: Input
|
|
171
|
-
}], smoothScrolling: [{
|
|
172
|
-
type: Input
|
|
173
|
-
}], mouseWheelScrollSensitivity: [{
|
|
174
|
-
type: Input
|
|
175
|
-
}], scrollBeyondLastLine: [{
|
|
176
|
-
type: Input
|
|
177
|
-
}], scrollBeyondLastColumn: [{
|
|
178
|
-
type: Input
|
|
179
|
-
}], lineNumbers: [{
|
|
180
|
-
type: Input
|
|
181
|
-
}], restSettings: [{
|
|
182
|
-
type: Input
|
|
183
|
-
}], resize: [{
|
|
184
|
-
type: HostListener,
|
|
185
|
-
args: ['window:resize', ['$event']]
|
|
186
|
-
}] } });
|
|
187
|
-
export const InstallMonacoUMD = async (path) => {
|
|
188
|
-
if (window['monaco'])
|
|
189
|
-
return window['monaco'];
|
|
190
|
-
// Prevent duplicate injection
|
|
191
|
-
const scriptEls = document.querySelectorAll('body>script[monaco][defer][src]');
|
|
192
|
-
// Only perform installation if a path is specified.
|
|
193
|
-
if (path && scriptEls.length == 0) {
|
|
194
|
-
// Monaco has a UMD loader that requires this
|
|
195
|
-
// Merge with any pre-existing global require objects.
|
|
196
|
-
if (!window['require'])
|
|
197
|
-
window['require'] = {};
|
|
198
|
-
if (!window['require']['paths'])
|
|
199
|
-
window['require']['paths'] = {};
|
|
200
|
-
if (path.endsWith('/'))
|
|
201
|
-
path = path.slice(0, -1);
|
|
202
|
-
window['require']['paths'].vs = path;
|
|
203
|
-
const monacoFiles = [
|
|
204
|
-
'loader.js',
|
|
205
|
-
'editor/editor.main.nls.js',
|
|
206
|
-
'editor/editor.main.js',
|
|
207
|
-
];
|
|
208
|
-
for (let i = 0; i < monacoFiles.length; i++) {
|
|
209
|
-
const script = document.createElement("script");
|
|
210
|
-
script.setAttribute("monaco", "");
|
|
211
|
-
script.setAttribute("defer", "");
|
|
212
|
-
script.setAttribute("src", path + '/' + monacoFiles[i]);
|
|
213
|
-
document.body.append(script);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
// Return a promise that will resolve when monaco finishes loading
|
|
217
|
-
return await new Promise((res, rej) => {
|
|
218
|
-
let count = 0;
|
|
219
|
-
let i = window.setInterval(() => {
|
|
220
|
-
count++;
|
|
221
|
-
if (window['monaco'] != undefined) {
|
|
222
|
-
window.clearInterval(i);
|
|
223
|
-
res(true);
|
|
224
|
-
}
|
|
225
|
-
else if (count >= 100) {
|
|
226
|
-
window.clearInterval(i);
|
|
227
|
-
res(false);
|
|
228
|
-
}
|
|
229
|
-
}, 100);
|
|
230
|
-
});
|
|
231
|
-
};
|
|
232
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnNjb2RlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvY29tcG9uZW50cy92c2NvZGUvdnNjb2RlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQThDLE1BQU0sZUFBZSxDQUFDO0FBRzNKLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBRXBDLElBQUksTUFBMkIsQ0FBQztBQWVoQyxNQUFNLE9BQU8sZUFBZTtJQU14QixJQUFhLElBQUksQ0FBQyxLQUFhO1FBQzNCLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQ25CLE9BQU87UUFDWCxJQUFJLE9BQU8sS0FBSyxJQUFJLFFBQVE7WUFDeEIsTUFBTSxJQUFJLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBRXhELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQUEsQ0FBQztJQUNGLElBQUksSUFBSSxLQUFLLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQSxDQUFDLENBQUM7SUFTeEMsSUFBYSxRQUFRLENBQUMsS0FBYTtRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHO1lBQ2IsSUFBSSxFQUFFLFlBQVk7WUFDbEIsTUFBTSxFQUFFLEtBQUs7WUFDYixNQUFNLEVBQUUsS0FBSztTQUNoQixDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUE7SUFDL0IsQ0FBQztJQUNELElBQUksUUFBUSxLQUFLLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQSxDQUFDLENBQUM7SUFnQ3hDLElBQUksUUFBUTtRQUNSLE9BQU87WUFDSCxHQUFHLElBQUksQ0FBQyxZQUFZO1lBQ3BCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtZQUNyQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsb0JBQW9CO1lBQy9DLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtZQUNyQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLHNCQUFzQjtZQUNuRCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtZQUNyQywyQkFBMkIsRUFBRSxJQUFJLENBQUMsMkJBQTJCO1lBQzdELFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztTQUM0QixDQUFDO0lBQ2xFLENBQUM7SUFHRCxZQUFvQixhQUErQjtRQUEvQixrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUFyRm5ELFlBQU8sR0FBRyxLQUFLLENBQUM7UUFlTixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUMxQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN4QyxpQkFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBZXRELHlCQUFvQixHQUFHLGdCQUFnQixDQUFDO1FBR3hDLFlBQU8sR0FBRyxDQUFDLENBQUM7UUFDWixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFVBQUssR0FBRyxTQUFTLENBQUM7UUFDbEIsZUFBVSxHQUFHLGlCQUFpQixDQUFDO1FBQy9CLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFFZCxvQkFBZSxHQUFHLElBQUksQ0FBQztRQUN2QixvQkFBZSxHQUFHLElBQUksQ0FBQztRQUN2QixZQUFPLEdBQUcsSUFBSSxDQUFDO1FBRWYsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFDdEIsWUFBTyxHQUE4QztZQUMxRCxPQUFPLEVBQUUsSUFBSTtTQUNoQixDQUFDO1FBQ08sY0FBUyxHQUFnRDtZQUM5RCx1QkFBdUIsRUFBRSxLQUFLO1lBQzlCLHFCQUFxQjtTQUN4QixDQUFDO1FBQ08sb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFDdkIsZ0NBQTJCLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUM3QiwyQkFBc0IsR0FBRyxDQUFDLENBQUM7UUFFM0IsZ0JBQVcsR0FBd0MsSUFBSSxDQUFDO1FBRXhELGlCQUFZLEdBQTZELEVBQUUsQ0FBQztRQXlHckYsV0FBTSxHQUFHLEdBQVMsRUFBRTtZQUNoQixJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQztRQWpGRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUU1QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUM5Qiw0REFBNEQ7UUFDNUQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN0RCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDZCxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEIsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDaEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZTtRQUNqQixNQUFNLGdCQUFnQixFQUFFLENBQUM7UUFFekIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTyxZQUFZO1FBQ2hCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUNyRCxJQUFJLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQzFDLElBQUksQ0FBQyxRQUFlLENBQ3ZCLENBQUM7UUFFRiw0QkFBNEI7UUFDNUIsc0JBQXNCLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNsQyxNQUFNLEVBQUUsTUFBTTtTQUNqQixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUVoQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNaLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFFRCxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFTyx3QkFBd0I7SUFFaEMsQ0FBQztJQUVELFFBQVE7UUFDSixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXBDLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNsRCxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEMsdUJBQXVCO1FBQ3ZCLEdBQUcsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO1FBQ25CLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUU3QixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFWixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFYixHQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7OEdBbktRLGVBQWU7a0dBQWYsZUFBZSw0MEJBWGQsRUFBRTs7MkZBV0gsZUFBZTtrQkFiM0IsU0FBUzsrQkFDSSxZQUFZLFlBQ1osRUFBRSxjQVNBLElBQUk7cUZBUUgsSUFBSTtzQkFBaEIsS0FBSztnQkFVSSxVQUFVO3NCQUFuQixNQUFNO2dCQUlFLGNBQWM7c0JBQXRCLEtBQUs7Z0JBSU8sUUFBUTtzQkFBcEIsS0FBSztnQkFTRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBR0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBSUcsZUFBZTtzQkFBdkIsS0FBSztnQkFDRywyQkFBMkI7c0JBQW5DLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBeUdOLE1BQU07c0JBREwsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7O0FBTTdDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLEtBQUssRUFBRSxJQUFhLEVBQUUsRUFBRTtJQUNwRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUU5Qyw4QkFBOEI7SUFDOUIsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFFL0Usb0RBQW9EO0lBQ3BELElBQUksSUFBSSxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDaEMsNkNBQTZDO1FBQzdDLHNEQUFzRDtRQUN0RCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFTLENBQUM7UUFDdEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRWpFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFDbEIsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFN0IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFckMsTUFBTSxXQUFXLEdBQUc7WUFDaEIsV0FBVztZQUNYLDJCQUEyQjtZQUMzQix1QkFBdUI7U0FDMUIsQ0FBQztRQUVGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNqQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hELFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLENBQUM7SUFDTCxDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLE9BQU8sTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNsQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUM1QixLQUFLLEVBQUUsQ0FBQztZQUVSLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDZCxDQUFDO2lCQUNJLElBQUksS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNwQixNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDZixDQUFDO1FBQ0wsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0ICogYXMgTW9uYWNvRWRpdG9yIGZyb20gJ21vbmFjby1lZGl0b3InO1xyXG5pbXBvcnQgeyBNb25hY29BdXRvVHlwZUltcG9ydGVyIH0gZnJvbSAnLi90cy10eXBlLXJlc29sdmVyL21haW4nO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzJztcclxuXHJcbmxldCBNb25hY286IHR5cGVvZiBNb25hY29FZGl0b3I7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYXBwLXZzY29kZScsXHJcbiAgICB0ZW1wbGF0ZTogJycsXHJcbiAgICBzdHlsZXM6IFtgXHJcbjpob3N0IHtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgbWF4LWhlaWdodDogMTAwdmg7XHJcbiAgICBtYXgtd2lkdGg6IDEwMHZ3O1xyXG59XHJcbiAgICBgXSxcclxuICAgIHN0YW5kYWxvbmU6IHRydWVcclxufSlcclxuZXhwb3J0IGNsYXNzIFZzY29kZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgICBpc0RpcnR5ID0gZmFsc2U7XHJcbiAgICBlZGl0b3I6IE1vbmFjb0VkaXRvci5lZGl0b3IuSVN0YW5kYWxvbmVDb2RlRWRpdG9yO1xyXG4gICAgZmlsZW5hbWU6IHN0cmluZztcclxuXHJcbiAgICBwcml2YXRlIF9jb2RlOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBzZXQgY29kZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09IHRoaXMuX2NvZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9IFwic3RyaW5nXCIpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJWYWx1ZSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9jb2RlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5lZGl0b3I/LnNldFZhbHVlKHRoaXMuY29kZSk7XHJcbiAgICB9O1xyXG4gICAgZ2V0IGNvZGUoKSB7IHJldHVybiB0aGlzLl9jb2RlPy50cmltKCkgfVxyXG4gICAgQE91dHB1dCgpIGNvZGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICAgIHByaXZhdGUgb25Db2RlVHlwZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gICAgcHJpdmF0ZSB0eXBlRGVib3VuY2UgPSB0aGlzLm9uQ29kZVR5cGUucGlwZShkZWJvdW5jZVRpbWUoMTAwKSk7XHJcblxyXG4gICAgQElucHV0KCkgY3VzdG9tTGFuZ3VhZ2U6IHsgaW5pdDogRnVuY3Rpb247IH07XHJcblxyXG5cclxuICAgIHByaXZhdGUgX2xhbmd1YWdlOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBzZXQgbGFuZ3VhZ2UodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX2xhbmd1YWdlID0ge1xyXG4gICAgICAgICAgICAndHMnOiBcInR5cGVzY3JpcHRcIixcclxuICAgICAgICAgICAgJ2h0bWwnOiAneG1sJyxcclxuICAgICAgICAgICAgJ3Njc3MnOiAnY3NzJ1xyXG4gICAgICAgIH1bdmFsdWVdIHx8IHZhbHVlIHx8IFwiYXV0b1wiXHJcbiAgICB9XHJcbiAgICBnZXQgbGFuZ3VhZ2UoKSB7IHJldHVybiB0aGlzLl9sYW5ndWFnZSB9XHJcblxyXG4gICAgQElucHV0KCkgaW5zdGFsbGF0aW9uTG9jYXRpb24gPSBcIi9saWIvbW9uYWNvL3ZzXCI7XHJcblxyXG5cclxuICAgIEBJbnB1dCgpIHRhYlNpemUgPSAyO1xyXG4gICAgQElucHV0KCkgcmVhZE9ubHkgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHRoZW1lID0gXCJ2cy1kYXJrXCI7XHJcbiAgICBASW5wdXQoKSBmb250RmFtaWx5ID0gXCJEcm9pZCBTYW5zIE1vbm9cIjtcclxuICAgIEBJbnB1dCgpIGZvbnRTaXplID0gMTQ7XHJcblxyXG4gICAgQElucHV0KCkgYXV0b21hdGljTGF5b3V0ID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIGNvbG9yRGVjb3JhdG9ycyA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBmb2xkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKSBtaW5pbWFwRW5hYmxlZCA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBtaW5pbWFwOiBNb25hY29FZGl0b3IuZWRpdG9yLklFZGl0b3JNaW5pbWFwT3B0aW9ucyA9IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlXHJcbiAgICB9O1xyXG4gICAgQElucHV0KCkgc2Nyb2xsYmFyOiBNb25hY29FZGl0b3IuZWRpdG9yLklFZGl0b3JTY3JvbGxiYXJPcHRpb25zID0ge1xyXG4gICAgICAgIGFsd2F5c0NvbnN1bWVNb3VzZVdoZWVsOiBmYWxzZSxcclxuICAgICAgICAvLyBzY3JvbGxCeVBhZ2U6IHRydWVcclxuICAgIH07XHJcbiAgICBASW5wdXQoKSBzbW9vdGhTY3JvbGxpbmcgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgbW91c2VXaGVlbFNjcm9sbFNlbnNpdGl2aXR5ID0gMjtcclxuICAgIEBJbnB1dCgpIHNjcm9sbEJleW9uZExhc3RMaW5lID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBzY3JvbGxCZXlvbmRMYXN0Q29sdW1uID0gMDtcclxuXHJcbiAgICBASW5wdXQoKSBsaW5lTnVtYmVyczogTW9uYWNvRWRpdG9yLmVkaXRvci5MaW5lTnVtYmVyc1R5cGUgPSBcIm9uXCI7XHJcblxyXG4gICAgQElucHV0KCkgcmVzdFNldHRpbmdzOiBNb25hY29FZGl0b3IuZWRpdG9yLklTdGFuZGFsb25lRWRpdG9yQ29uc3RydWN0aW9uT3B0aW9ucyA9IHt9O1xyXG5cclxuICAgIGdldCBzZXR0aW5ncygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi50aGlzLnJlc3RTZXR0aW5ncyxcclxuICAgICAgICAgICAgdGhlbWU6IHRoaXMudGhlbWUsXHJcbiAgICAgICAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmd1YWdlLFxyXG4gICAgICAgICAgICB0YWJTaXplOiB0aGlzLnRhYlNpemUsXHJcbiAgICAgICAgICAgIHJlYWRPbmx5OiB0aGlzLnJlYWRPbmx5LFxyXG4gICAgICAgICAgICBmb250RmFtaWx5OiB0aGlzLmZvbnRGYW1pbHksXHJcbiAgICAgICAgICAgIGZvbnRTaXplOiB0aGlzLmZvbnRTaXplLFxyXG4gICAgICAgICAgICBhdXRvbWF0aWNMYXlvdXQ6IHRoaXMuYXV0b21hdGljTGF5b3V0LFxyXG4gICAgICAgICAgICBzY3JvbGxCZXlvbmRMYXN0TGluZTogdGhpcy5zY3JvbGxCZXlvbmRMYXN0TGluZSxcclxuICAgICAgICAgICAgY29sb3JEZWNvcmF0b3JzOiB0aGlzLmNvbG9yRGVjb3JhdG9ycyxcclxuICAgICAgICAgICAgZm9sZGluZzogdGhpcy5mb2xkaW5nLFxyXG4gICAgICAgICAgICBzY3JvbGxCZXlvbmRMYXN0Q29sdW1uOiB0aGlzLnNjcm9sbEJleW9uZExhc3RDb2x1bW4sXHJcbiAgICAgICAgICAgIG1pbmltYXA6IHRoaXMubWluaW1hcCxcclxuICAgICAgICAgICAgc2Nyb2xsYmFyOiB0aGlzLnNjcm9sbGJhcixcclxuICAgICAgICAgICAgc21vb3RoU2Nyb2xsaW5nOiB0aGlzLnNtb290aFNjcm9sbGluZyxcclxuICAgICAgICAgICAgbW91c2VXaGVlbFNjcm9sbFNlbnNpdGl2aXR5OiB0aGlzLm1vdXNlV2hlZWxTY3JvbGxTZW5zaXRpdml0eSxcclxuICAgICAgICAgICAgbGluZU51bWJlcnM6IHRoaXMubGluZU51bWJlcnNcclxuICAgICAgICB9IGFzIE1vbmFjb0VkaXRvci5lZGl0b3IuSVN0YW5kYWxvbmVFZGl0b3JDb25zdHJ1Y3Rpb25PcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3N1YjtcclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZikge1xyXG4gICAgICAgIEluc3RhbGxNb25hY29VTUQodGhpcy5pbnN0YWxsYXRpb25Mb2NhdGlvbik7XHJcblxyXG4gICAgICAgIHRoaXMuX3N1YiA9IHRoaXMudHlwZURlYm91bmNlLnN1YnNjcmliZSh0ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb2RlQ2hhbmdlLm5leHQodGhpcy5fY29kZSA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICAvLyBJZiB3ZSBjaGFuZ2VkIGFueXRoaW5nIE9USEVSIHRoYW4gY29kZSwgcmVsb2FkIHRoZSBlZGl0b3JcclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY2hhbmdlcykubGVuZ3RoID4gMSB8fCAhY2hhbmdlc1snY29kZSddKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3I/LmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRWRpdG9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3RoZW1lJ10pXHJcbiAgICAgICAgICAgIHdpbmRvd1snbW9uYWNvJ10/LmVkaXRvci5zZXRUaGVtZSh0aGlzLnRoZW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgYXdhaXQgSW5zdGFsbE1vbmFjb1VNRCgpO1xyXG5cclxuICAgICAgICB0aGlzLmNyZWF0ZUVkaXRvcigpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZWRpdG9yPy5kaXNwb3NlKCk7XHJcbiAgICAgICAgdGhpcy5fc3ViPy51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlRWRpdG9yKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1c3RvbUxhbmd1YWdlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tTGFuZ3VhZ2UuaW5pdCh3aW5kb3dbJ21vbmFjbyddKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBlZGl0b3IgPSB0aGlzLmVkaXRvciA9IHdpbmRvd1snbW9uYWNvJ10uZWRpdG9yLmNyZWF0ZShcclxuICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyPy5lbGVtZW50Py5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmdzIGFzIGFueVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IGF1dG9UeXBpbmdzID0gYXdhaXRcclxuICAgICAgICBNb25hY29BdXRvVHlwZUltcG9ydGVyLmNyZWF0ZShlZGl0b3IsIHtcclxuICAgICAgICAgICAgbW9uYWNvOiBNb25hY28sXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29uZmlndXJlTGFuZ3VhZ2VTdXBwb3J0KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvZGUpIHtcclxuICAgICAgICAgICAgZWRpdG9yLnNldFZhbHVlKHRoaXMuY29kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlZGl0b3IuZ2V0TW9kZWwoKS5vbkRpZENoYW5nZUNvbnRlbnQoKCkgPT4gdGhpcy5vbkNvZGVUeXBlLmVtaXQoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25maWd1cmVMYW5ndWFnZVN1cHBvcnQoKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGRvd25sb2FkKCkge1xyXG4gICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpO1xyXG5cclxuICAgICAgICBsZXQgYmxvYiA9IG5ldyBCbG9iKFtjb2RlXSwgeyB0eXBlOiAndGV4dC9sb2cnIH0pO1xyXG4gICAgICAgIGxldCBlbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgICAgbGV0IGJsb2JVUkwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG5cclxuICAgICAgICAvLyBTZXQgdGhlIGRhdGEgdmFsdWVzLlxyXG4gICAgICAgIGVsbS5ocmVmID0gYmxvYlVSTDtcclxuICAgICAgICBlbG0uZG93bmxvYWQgPSB0aGlzLmZpbGVuYW1lO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsbSk7XHJcbiAgICAgICAgZWxtLmNsaWNrKCk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWxtKTtcclxuICAgICAgICBlbG0ucmVtb3ZlKCk7XHJcblxyXG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVSTCk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXHJcbiAgICByZXNpemUgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgICAgdGhpcy5lZGl0b3I/LmxheW91dCgpO1xyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IEluc3RhbGxNb25hY29VTUQgPSBhc3luYyAocGF0aD86IHN0cmluZykgPT4ge1xyXG4gICAgaWYgKHdpbmRvd1snbW9uYWNvJ10pIHJldHVybiB3aW5kb3dbJ21vbmFjbyddO1xyXG5cclxuICAgIC8vIFByZXZlbnQgZHVwbGljYXRlIGluamVjdGlvblxyXG4gICAgY29uc3Qgc2NyaXB0RWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYm9keT5zY3JpcHRbbW9uYWNvXVtkZWZlcl1bc3JjXScpO1xyXG5cclxuICAgIC8vIE9ubHkgcGVyZm9ybSBpbnN0YWxsYXRpb24gaWYgYSBwYXRoIGlzIHNwZWNpZmllZC5cclxuICAgIGlmIChwYXRoICYmIHNjcmlwdEVscy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgIC8vIE1vbmFjbyBoYXMgYSBVTUQgbG9hZGVyIHRoYXQgcmVxdWlyZXMgdGhpc1xyXG4gICAgICAgIC8vIE1lcmdlIHdpdGggYW55IHByZS1leGlzdGluZyBnbG9iYWwgcmVxdWlyZSBvYmplY3RzLlxyXG4gICAgICAgIGlmICghd2luZG93WydyZXF1aXJlJ10pIHdpbmRvd1sncmVxdWlyZSddID0ge30gYXMgYW55O1xyXG4gICAgICAgIGlmICghd2luZG93WydyZXF1aXJlJ11bJ3BhdGhzJ10pIHdpbmRvd1sncmVxdWlyZSddWydwYXRocyddID0ge307XHJcblxyXG4gICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCcvJykpXHJcbiAgICAgICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKTtcclxuXHJcbiAgICAgICAgd2luZG93WydyZXF1aXJlJ11bJ3BhdGhzJ10udnMgPSBwYXRoO1xyXG5cclxuICAgICAgICBjb25zdCBtb25hY29GaWxlcyA9IFtcclxuICAgICAgICAgICAgJ2xvYWRlci5qcycsXHJcbiAgICAgICAgICAgICdlZGl0b3IvZWRpdG9yLm1haW4ubmxzLmpzJyxcclxuICAgICAgICAgICAgJ2VkaXRvci9lZGl0b3IubWFpbi5qcycsXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb25hY29GaWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xyXG4gICAgICAgICAgICBzY3JpcHQuc2V0QXR0cmlidXRlKFwibW9uYWNvXCIsIFwiXCIpO1xyXG4gICAgICAgICAgICBzY3JpcHQuc2V0QXR0cmlidXRlKFwiZGVmZXJcIiwgXCJcIik7XHJcbiAgICAgICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgcGF0aCArICcvJyArIG1vbmFjb0ZpbGVzW2ldKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoc2NyaXB0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0dXJuIGEgcHJvbWlzZSB0aGF0IHdpbGwgcmVzb2x2ZSB3aGVuIG1vbmFjbyBmaW5pc2hlcyBsb2FkaW5nXHJcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XHJcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcclxuICAgICAgICBsZXQgaSA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvdW50Kys7XHJcblxyXG4gICAgICAgICAgICBpZiAod2luZG93Wydtb25hY28nXSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKGkpO1xyXG4gICAgICAgICAgICAgICAgcmVzKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGNvdW50ID49IDEwMCkge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwoaSk7XHJcbiAgICAgICAgICAgICAgICByZXMoZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMTAwKTtcclxuICAgIH0pO1xyXG59XHJcbiJdfQ==
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { ConsoleLogger, LogIcon } from '../utils';
|
|
3
|
-
import { CommandPaletteComponent } from '../components/command-palette/command-palette.component';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@angular/material/dialog";
|
|
6
|
-
import * as i2 from "../components/lazy-loader/lazy-loader.service";
|
|
7
|
-
const { log, warn, err } = ConsoleLogger("CommandPalette", "#2196f3");
|
|
8
|
-
export class CommandPaletteService {
|
|
9
|
-
constructor(dialog, lazyLoader) {
|
|
10
|
-
this.dialog = dialog;
|
|
11
|
-
this.lazyLoader = lazyLoader;
|
|
12
|
-
this.commandBlocks = [];
|
|
13
|
-
window.addEventListener("keydown", (evt) => this.onKeyDown(evt));
|
|
14
|
-
this.interval = setInterval(() => {
|
|
15
|
-
// Go backwards since we're splicing items out of the array.
|
|
16
|
-
for (let i = this.commandBlocks.length; i >= 0; i--) {
|
|
17
|
-
let commandBlock = this.commandBlocks[i];
|
|
18
|
-
// If the current index is somehow null, rip it out of
|
|
19
|
-
// the array and wait for cleanup to trigger again
|
|
20
|
-
// for the rest of the array.
|
|
21
|
-
// TODO: Could this lead to leaks where things at the end
|
|
22
|
-
// never get cleaned?
|
|
23
|
-
if (commandBlock == null) {
|
|
24
|
-
this.commandBlocks.splice(i, 1);
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
// If the element has been disconnected from the DOM, we will
|
|
28
|
-
// treat it as having been permanently removed.
|
|
29
|
-
// TODO: Could this ever cause unintended consequences?
|
|
30
|
-
if (!commandBlock?.element.isConnected)
|
|
31
|
-
this.commandBlocks.splice(i, 1);
|
|
32
|
-
}
|
|
33
|
-
}, 5 * 60 * 1000);
|
|
34
|
-
}
|
|
35
|
-
ngOnDestroy() {
|
|
36
|
-
clearInterval(this.interval);
|
|
37
|
-
}
|
|
38
|
-
getCommandBlocks(element = document.body) {
|
|
39
|
-
const elementPath = [element];
|
|
40
|
-
let currentTarget = element;
|
|
41
|
-
do {
|
|
42
|
-
elementPath.unshift(currentTarget = currentTarget.parentElement);
|
|
43
|
-
} while (currentTarget.parentElement);
|
|
44
|
-
// Ordered matching command blocks, closest first
|
|
45
|
-
const matchingCommandBlocks = [];
|
|
46
|
-
for (const element of elementPath) {
|
|
47
|
-
const commandBlock = this.commandBlocks.find(cb => cb.element == element);
|
|
48
|
-
if (commandBlock) {
|
|
49
|
-
matchingCommandBlocks.unshift(commandBlock);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return matchingCommandBlocks;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Handle keydown events
|
|
56
|
-
*
|
|
57
|
-
* If an event has been removed from the DOM tree, we don't need
|
|
58
|
-
* to explicitly remove the bindings, as they will never fire
|
|
59
|
-
*
|
|
60
|
-
* We periodically check and remove unconnected command blocks
|
|
61
|
-
*/
|
|
62
|
-
onKeyDown(evt) {
|
|
63
|
-
const matchingCommandBlocks = this.getCommandBlocks(evt.target);
|
|
64
|
-
// String in format `ctrl+alt+F`, `ctrl+F` etc.
|
|
65
|
-
const key = [
|
|
66
|
-
evt.ctrlKey ? "ctrl" : undefined,
|
|
67
|
-
evt.altKey ? "alt" : undefined,
|
|
68
|
-
evt.shiftKey ? "shift" : undefined,
|
|
69
|
-
evt.metaKey ? "meta" : undefined,
|
|
70
|
-
evt.code.startsWith("Key") ? evt.key : evt.code
|
|
71
|
-
].filter(a => a).join('+').toLowerCase();
|
|
72
|
-
for (const commandBlock of matchingCommandBlocks) {
|
|
73
|
-
const action = commandBlock.actions.find(a => {
|
|
74
|
-
return Array.isArray(a.shortcutKey)
|
|
75
|
-
? a.shortcutKey.includes(key)
|
|
76
|
-
: a.shortcutKey == key;
|
|
77
|
-
});
|
|
78
|
-
if (action) {
|
|
79
|
-
evt.stopPropagation();
|
|
80
|
-
evt.preventDefault();
|
|
81
|
-
this.invokeAction(action);
|
|
82
|
-
// Execute the action and move on.
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
// Keep checking for matching actions
|
|
86
|
-
}
|
|
87
|
-
// If execution reaches this point, there were no matching actions on the
|
|
88
|
-
// path of elements that were registered.
|
|
89
|
-
}
|
|
90
|
-
addCommand(element, action) {
|
|
91
|
-
const commandBlock = this.commandBlocks.find(b => b.element == element) ?? (() => {
|
|
92
|
-
const cb = { element, actions: [] };
|
|
93
|
-
this.commandBlocks.push(cb);
|
|
94
|
-
return cb;
|
|
95
|
-
})();
|
|
96
|
-
// This is likely a duplicate entry
|
|
97
|
-
if (commandBlock.actions.find(a => a.shortcutKey && a.shortcutKey == action.shortcutKey)) {
|
|
98
|
-
warn(`Inserting duplicate action on element`, { element, action });
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
// log(LogIcon.circle_blue, `Inserted action`, action)
|
|
102
|
-
}
|
|
103
|
-
// Make the shortcut keys lowercase so case sensitivity doesn't scalp someone
|
|
104
|
-
if (action.shortcutKey) {
|
|
105
|
-
if (Array.isArray(action.shortcutKey))
|
|
106
|
-
action.shortcutKey = action.shortcutKey.map(k => k.toLowerCase());
|
|
107
|
-
else
|
|
108
|
-
action.shortcutKey = action.shortcutKey.toLowerCase();
|
|
109
|
-
}
|
|
110
|
-
commandBlock.actions.push(action);
|
|
111
|
-
}
|
|
112
|
-
removeCommand(element, action) {
|
|
113
|
-
const commandBlock = this.commandBlocks.find(b => b.element == element) ?? { element, actions: [] };
|
|
114
|
-
const actionIndex = commandBlock?.actions.findIndex(a => typeof action == "string" ? a.shortcutKey == action : a == action);
|
|
115
|
-
if (!commandBlock) {
|
|
116
|
-
err(LogIcon.warning, `Cannot remove command: element does not have any commands registered`, { element, action });
|
|
117
|
-
}
|
|
118
|
-
else if (actionIndex == -1) {
|
|
119
|
-
warn(LogIcon.warning, `Cannot remove command: not present in list`, { element, action });
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
commandBlock.actions.splice(actionIndex, 1);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
*
|
|
127
|
-
*/
|
|
128
|
-
initialize(options) {
|
|
129
|
-
this.attachElementCommands([
|
|
130
|
-
{
|
|
131
|
-
shortcutKey: options.keybind,
|
|
132
|
-
action: () => this.openPalette(),
|
|
133
|
-
description: "Open the command palette",
|
|
134
|
-
keywords: ["command", "prompt", "console", "actions"],
|
|
135
|
-
label: "Command Palette",
|
|
136
|
-
visibleInList: false
|
|
137
|
-
}
|
|
138
|
-
]);
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Open the command palette
|
|
142
|
-
*/
|
|
143
|
-
openPalette() {
|
|
144
|
-
return this.dialog.open(CommandPaletteComponent, {
|
|
145
|
-
position: {
|
|
146
|
-
top: "8px"
|
|
147
|
-
},
|
|
148
|
-
data: {
|
|
149
|
-
contextElement: document.activeElement
|
|
150
|
-
},
|
|
151
|
-
panelClass: ['ngx-command-palette'],
|
|
152
|
-
backdropClass: ['ngx-command-palette'],
|
|
153
|
-
restoreFocus: true,
|
|
154
|
-
role: 'dialog'
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Public helper to invoke an action.
|
|
159
|
-
*/
|
|
160
|
-
invokeAction(action, args) {
|
|
161
|
-
const fn = action.action;
|
|
162
|
-
if (typeof fn == 'function') {
|
|
163
|
-
try {
|
|
164
|
-
const res = fn(args);
|
|
165
|
-
// Handle promises so that the GUI can show spinners for them
|
|
166
|
-
if (res instanceof Promise) {
|
|
167
|
-
// TODO
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
// TODO
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
catch (ex) {
|
|
174
|
-
err(LogIcon.bomb, `Executing action threw an error`, { action }, ex);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
warn(LogIcon.warning, `Cannot execute action, type is not "function"`, { action });
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
attachElementCommands(element = document.body, actions = []) {
|
|
182
|
-
if (Array.isArray(element)) {
|
|
183
|
-
actions = element;
|
|
184
|
-
element = document.body;
|
|
185
|
-
}
|
|
186
|
-
actions.forEach(a => this.addCommand(element, a));
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Detach specified commands from an Element subtree
|
|
190
|
-
*/
|
|
191
|
-
detachElementCommands(element = document.body, actions = []) {
|
|
192
|
-
actions.forEach(a => this.removeCommand(element, a));
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Return the list of registered commands under a given element
|
|
196
|
-
*/
|
|
197
|
-
getRegisteredCommands(element = document.body) {
|
|
198
|
-
return this.getCommandBlocks(element).map(c => c.actions).flat();
|
|
199
|
-
}
|
|
200
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CommandPaletteService, deps: [{ token: i1.MatDialog }, { token: i2.LazyLoaderService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
201
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CommandPaletteService, providedIn: 'root' }); }
|
|
202
|
-
}
|
|
203
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CommandPaletteService, decorators: [{
|
|
204
|
-
type: Injectable,
|
|
205
|
-
args: [{
|
|
206
|
-
providedIn: 'root'
|
|
207
|
-
}]
|
|
208
|
-
}], ctorParameters: () => [{ type: i1.MatDialog }, { type: i2.LazyLoaderService }] });
|
|
209
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC1wYWxldHRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL3NlcnZpY2VzL2NvbW1hbmQtcGFsZXR0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQWlDLE1BQU0sZUFBZSxDQUFDO0FBRTFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRWxELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHlEQUF5RCxDQUFDOzs7O0FBRWxHLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsQ0FBQztBQWtKdEUsTUFBTSxPQUFPLHFCQUFxQjtJQUs5QixZQUNxQixNQUFpQixFQUNqQixVQUE2QjtRQUQ3QixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBTDFDLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQU92QyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFakUsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQzdCLDREQUE0RDtZQUM1RCxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDbEQsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFekMsc0RBQXNEO2dCQUN0RCxrREFBa0Q7Z0JBQ2xELDZCQUE2QjtnQkFDN0IseURBQXlEO2dCQUN6RCxxQkFBcUI7Z0JBQ3JCLElBQUksWUFBWSxJQUFJLElBQUksRUFBRSxDQUFDO29CQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ2hDLE9BQU87Z0JBQ1gsQ0FBQztnQkFFRCw2REFBNkQ7Z0JBQzdELCtDQUErQztnQkFDL0MsdURBQXVEO2dCQUN2RCxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxXQUFXO29CQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEMsQ0FBQztRQUNMLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFTyxXQUFXO1FBQ2YsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsVUFBdUIsUUFBUSxDQUFDLElBQUk7UUFDekQsTUFBTSxXQUFXLEdBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0MsSUFBSSxhQUFhLEdBQWdCLE9BQU8sQ0FBQztRQUN6QyxHQUFHLENBQUM7WUFDQSxXQUFXLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDckUsQ0FBQyxRQUFRLGFBQWEsQ0FBQyxhQUFhLEVBQUU7UUFFdEMsaURBQWlEO1FBQ2pELE1BQU0scUJBQXFCLEdBQW1CLEVBQUUsQ0FBQztRQUNqRCxLQUFLLE1BQU0sT0FBTyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQztZQUMxRSxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNmLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNoRCxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8scUJBQXFCLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxTQUFTLENBQUMsR0FBa0I7UUFDaEMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQXFCLENBQUMsQ0FBQztRQUUvRSwrQ0FBK0M7UUFDL0MsTUFBTSxHQUFHLEdBQUc7WUFDUixHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDaEMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzlCLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNsQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDaEMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJO1NBQ2xELENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXpDLEtBQUssTUFBTSxZQUFZLElBQUkscUJBQXFCLEVBQUUsQ0FBQztZQUMvQyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDekMsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7b0JBQy9CLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFVLENBQUM7b0JBQ3BDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLEdBQVUsQ0FBQTtZQUNyQyxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1QsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN0QixHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBRXJCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRTFCLGtDQUFrQztnQkFDbEMsT0FBTztZQUNYLENBQUM7WUFDRCxxQ0FBcUM7UUFDekMsQ0FBQztRQUVELHlFQUF5RTtRQUN6RSx5Q0FBeUM7SUFDN0MsQ0FBQztJQUVPLFVBQVUsQ0FBQyxPQUFvQixFQUFFLE1BQXFCO1FBQzFELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUM3RSxNQUFNLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUIsT0FBTyxFQUFFLENBQUM7UUFDZCxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRUwsbUNBQW1DO1FBQ25DLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDdkYsSUFBSSxDQUFDLHVDQUF1QyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdkUsQ0FBQzthQUNJLENBQUM7WUFDRixzREFBc0Q7UUFDMUQsQ0FBQztRQUVELDZFQUE2RTtRQUM3RSxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztnQkFDakMsTUFBTSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBUSxDQUFDOztnQkFFekUsTUFBTSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBUyxDQUFDO1FBQ3JFLENBQUM7UUFFRCxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU8sYUFBYSxDQUFDLE9BQW9CLEVBQUUsTUFBOEI7UUFDdEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNwRyxNQUFNLFdBQVcsR0FBRyxZQUFZLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sTUFBTSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQztRQUU1SCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDaEIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsc0VBQXNFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUNySCxDQUFDO2FBQ0ksSUFBSSxXQUFXLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSw0Q0FBNEMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQzVGLENBQUM7YUFDSSxDQUFDO1lBQ0YsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hELENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsT0FBOEI7UUFDckMsSUFBSSxDQUFDLHFCQUFxQixDQUFDO1lBQ3ZCO2dCQUNJLFdBQVcsRUFBRSxPQUFPLENBQUMsT0FBTztnQkFDNUIsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ2hDLFdBQVcsRUFBRSwwQkFBMEI7Z0JBQ3ZDLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQztnQkFDckQsS0FBSyxFQUFFLGlCQUFpQjtnQkFDeEIsYUFBYSxFQUFFLEtBQUs7YUFDdkI7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUM3QyxRQUFRLEVBQUU7Z0JBQ04sR0FBRyxFQUFFLEtBQUs7YUFDYjtZQUNELElBQUksRUFBRTtnQkFDRixjQUFjLEVBQUUsUUFBUSxDQUFDLGFBQWE7YUFDekM7WUFDRCxVQUFVLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztZQUNuQyxhQUFhLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztZQUN0QyxZQUFZLEVBQUUsSUFBSTtZQUNsQixJQUFJLEVBQUUsUUFBUTtTQUNqQixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLENBQUMsTUFBcUIsRUFBRSxJQUFLO1FBQ3JDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDekIsSUFBSSxPQUFPLEVBQUUsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUUxQixJQUFJLENBQUM7Z0JBQ0QsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUVyQiw2REFBNkQ7Z0JBQzdELElBQUksR0FBRyxZQUFZLE9BQU8sRUFBRSxDQUFDO29CQUN6QixPQUFPO2dCQUNYLENBQUM7cUJBQ0ksQ0FBQztvQkFDRixPQUFPO2dCQUNYLENBQUM7WUFDTCxDQUFDO1lBQ0QsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDUixHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxpQ0FBaUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3pFLENBQUM7UUFDTCxDQUFDO2FBQ0ksQ0FBQztZQUNGLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLCtDQUErQyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN2RixDQUFDO0lBQ0wsQ0FBQztJQU9ELHFCQUFxQixDQUFDLFVBQXlDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBMkIsRUFBRTtRQUN2RyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ2xCLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQzVCLENBQUM7UUFFRCxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxxQkFBcUIsQ0FBQyxVQUF1QixRQUFRLENBQUMsSUFBSSxFQUFFLFVBQTJCLEVBQUU7UUFDckYsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0gscUJBQXFCLENBQUMsVUFBdUIsUUFBUSxDQUFDLElBQUk7UUFDdEQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JFLENBQUM7OEdBck9RLHFCQUFxQjtrSEFBckIscUJBQXFCLGNBRmxCLE1BQU07OzJGQUVULHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBIb3N0TGlzdGVuZXIsIFR5cGUsIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IENvbnNvbGVMb2dnZXIsIExvZ0ljb24gfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBMYXp5TG9hZGVyU2VydmljZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvbGF6eS1sb2FkZXIvbGF6eS1sb2FkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBDb21tYW5kUGFsZXR0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvY29tbWFuZC1wYWxldHRlL2NvbW1hbmQtcGFsZXR0ZS5jb21wb25lbnQnO1xuXG5jb25zdCB7IGxvZywgd2FybiwgZXJyIH0gPSBDb25zb2xlTG9nZ2VyKFwiQ29tbWFuZFBhbGV0dGVcIiwgXCIjMjE5NmYzXCIpO1xuXG50eXBlIEtleUNvZGUgPSBcIkJhY2tzcGFjZVwiIHwgXCJUYWJcIiB8IFwiRW50ZXJcIiB8IFwiU2hpZnRMZWZ0XCIgfCBcIlNoaWZ0UmlnaHRcIlxuICAgIHwgXCJDb250cm9sTGVmdFwiIHwgXCJDb250cm9sUmlnaHRcIiB8IFwiQWx0TGVmdFwiIHwgXCJBbHRSaWdodFwiIHwgXCJQYXVzZVwiIHwgXCJDYXBzTG9ja1wiXG4gICAgfCBcIkVzY2FwZVwiIHwgXCJTcGFjZVwiIHwgXCJQYWdlVXBcIiB8IFwiUGFnZURvd25cIiB8IFwiRW5kXCIgfCBcIkhvbWVcIiB8IFwiQXJyb3dMZWZ0XCJcbiAgICB8IFwiQXJyb3dVcFwiIHwgXCJBcnJvd1JpZ2h0XCIgfCBcIkFycm93RG93blwiIHwgXCJQcmludFNjcmVlblwiIHwgXCJJbnNlcnRcIiB8IFwiRGVsZXRlXCJcbiAgICB8IFwiTWV0YUxlZnRcIiB8IFwiTWV0YVJpZ2h0XCIgfCBcIkNvbnRleHRNZW51XCIgfCBcIk51bXBhZDBcIiB8IFwiTnVtcGFkMVwiIHwgXCJOdW1wYWQyXCJcbiAgICB8IFwiTnVtcGFkM1wiIHwgXCJOdW1wYWQ0XCIgfCBcIk51bXBhZDVcIiB8IFwiTnVtcGFkNlwiIHwgXCJOdW1wYWQ3XCIgfCBcIk51bXBhZDhcIlxuICAgIHwgXCJOdW1wYWQ5XCIgfCBcIk51bXBhZE11bHRpcGx5XCIgfCBcIk51bXBhZEFkZFwiIHwgXCJOdW1wYWRTdWJ0cmFjdFwiXG4gICAgfCBcIk51bXBhZERlY2ltYWxcIiB8IFwiTnVtcGFkRGl2aWRlXCJcbiAgICB8IFwiRjFcIiB8IFwiRjJcIiB8IFwiRjNcIiB8IFwiRjRcIiB8IFwiRjVcIiB8IFwiRjZcIiB8IFwiRjdcIiB8IFwiRjhcIiB8IFwiRjlcIiB8IFwiRjEwXCIgfCBcIkYxMVwiIHwgXCJGMTJcIlxuICAgIHwgXCJOdW1Mb2NrXCIgfCBcIlNjcm9sbExvY2tcIiB8IFwiU2VtaWNvbG9uXCIgfCBcIkVxdWFsXCIgfCBcIkNvbW1hXCIgfCBcIk1pbnVzXCJcbiAgICB8IFwiUGVyaW9kXCIgfCBcIlNsYXNoXCIgfCBcIkJhY2txdW90ZVwiIHwgXCJCcmFja2V0TGVmdFwiIHwgXCJCYWNrc2xhc2hcIlxuICAgIHwgXCJCcmFja2V0UmlnaHRcIiB8IFwiUXVvdGVcIiB8IFwiYmFja3NwYWNlXCIgfCBcInRhYlwiIHwgXCJlbnRlclwiIHwgXCJzaGlmdGxlZnRcIlxuICAgIHwgXCJzaGlmdHJpZ2h0XCIgfCBcImNvbnRyb2xsZWZ0XCIgfCBcImNvbnRyb2xyaWdodFwiIHwgXCJhbHRsZWZ0XCIgfCBcImFsdHJpZ2h0XCJcbiAgICB8IFwicGF1c2VcIiB8IFwiY2Fwc2xvY2tcIiB8IFwiZXNjYXBlXCIgfCBcInNwYWNlXCIgfCBcInBhZ2V1cFwiIHwgXCJwYWdlZG93blwiIHwgXCJlbmRcIlxuICAgIHwgXCJob21lXCIgfCBcImFycm93bGVmdFwiIHwgXCJhcnJvd3VwXCIgfCBcImFycm93cmlnaHRcIiB8IFwiYXJyb3dkb3duXCIgfCBcInByaW50c2NyZWVuXCJcbiAgICB8IFwiaW5zZXJ0XCIgfCBcImRlbGV0ZVwiIHwgXCJtZXRhbGVmdFwiIHwgXCJtZXRhcmlnaHRcIiB8IFwiY29udGV4dG1lbnVcIlxuICAgIHwgXCJudW1wYWQwXCIgfCBcIm51bXBhZDFcIiB8IFwibnVtcGFkMlwiIHwgXCJudW1wYWQzXCIgfCBcIm51bXBhZDRcIiB8IFwibnVtcGFkNVwiXG4gICAgfCBcIm51bXBhZDZcIiB8IFwibnVtcGFkN1wiIHwgXCJudW1wYWQ4XCIgfCBcIm51bXBhZDlcIiB8IFwibnVtcGFkbXVsdGlwbHlcIiB8IFwibnVtcGFkYWRkXCJcbiAgICB8IFwibnVtcGFkc3VidHJhY3RcIiB8IFwibnVtcGFkZGVjaW1hbFwiIHwgXCJudW1wYWRkaXZpZGVcIlxuICAgIHwgXCJmMVwiIHwgXCJmMlwiIHwgXCJmM1wiIHwgXCJmNFwiIHwgXCJmNVwiIHwgXCJmNlwiIHwgXCJmN1wiIHwgXCJmOFwiIHwgXCJmOVwiIHwgXCJmMTBcIiB8IFwiZjExXCIgfCBcImYxMlwiXG4gICAgfCBcIm51bWxvY2tcIiB8IFwic2Nyb2xsbG9ja1wiIHwgXCJzZW1pY29sb25cIiB8IFwiZXF1YWxcIiB8IFwiY29tbWFcIiB8IFwibWludXNcIiB8IFwicGVyaW9kXCJcbiAgICB8IFwic2xhc2hcIiB8IFwiYmFja3F1b3RlXCIgfCBcImJyYWNrZXRsZWZ0XCIgfCBcImJhY2tzbGFzaFwiIHwgXCJicmFja2V0cmlnaHRcIiB8IFwicXVvdGVcIlxuICAgIHwgXCJBXCIgfCBcIkJcIiB8IFwiQ1wiIHwgXCJEXCIgfCBcIkVcIiB8IFwiRlwiIHwgXCJHXCIgfCBcIkhcIiB8IFwiSVwiIHwgXCJKXCIgfCBcIktcIiB8IFwiTFwiIHwgXCJNXCJcbiAgICB8IFwiTlwiIHwgXCJPXCIgfCBcIlBcIiB8IFwiUVwiIHwgXCJSXCIgfCBcIlNcIiB8IFwiVFwiIHwgXCJVXCIgfCBcIlZcIiB8IFwiV1wiIHwgXCJYXCIgfCBcIllcIiB8IFwiWlwiXG4gICAgfCBcImFcIiB8IFwiYlwiIHwgXCJjXCIgfCBcImRcIiB8IFwiZVwiIHwgXCJmXCIgfCBcImdcIiB8IFwiaFwiIHwgXCJpXCIgfCBcImpcIiB8IFwia1wiIHwgXCJsXCIgfCBcIm1cIlxuICAgIHwgXCJuXCIgfCBcIm9cIiB8IFwicFwiIHwgXCJxXCIgfCBcInJcIiB8IFwic1wiIHwgXCJ0XCIgfCBcInVcIiB8IFwidlwiIHwgXCJ3XCIgfCBcInhcIiB8IFwieVwiIHwgXCJ6XCI7XG5cbi8vIGN0cmwrYWx0K21ldGErc2hpZnRcbnR5cGUgS2V5UHJlZml4ID1cbiAgICBgY3RybGAgfFxuICAgIGBjdHJsK2FsdGAgfFxuICAgIGBjdHJsK2FsdCtzaGlmdGAgfFxuICAgIGBjdHJsK2FsdCtzaGlmdCttZXRhYCB8XG4gICAgYGN0cmwrYWx0K21ldGFgIHxcbiAgICBgY3RybCtzaGlmdGAgfFxuICAgIGBjdHJsK3NoaWZ0K21ldGFgIHxcbiAgICBgY3RybCttZXRhYCB8XG4gICAgYGFsdGAgfFxuICAgIGBhbHQrc2hpZnRgIHxcbiAgICBgYWx0K3NoaWZ0K21ldGFgIHxcbiAgICBgYWx0K21ldGFgIHxcbiAgICBgc2hpZnRgIHxcbiAgICBgc2hpZnQrbWV0YWAgfFxuICAgIGBtZXRhYFxuXG5leHBvcnQgdHlwZSBLZXliaW5kRXZlbnQgPSAoZTogS2V5Ym9hcmRFdmVudCkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEtleWJpbmRDb2RlID0gYCR7S2V5UHJlZml4fSske0tleUNvZGV9YCB8IEtleUNvZGU7XG5cblxuXG5leHBvcnQgdHlwZSBDb21tYW5kQWN0aW9uPFQgPSBhbnk+ID0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBub24tbW9kaWZpZXIga2V5KHMpIHRoYXQgbXVzdCBiZSBwcmVzc2VkIGZvciB0aGUgZXZlbnQgdG8gZmlyZS5cbiAgICAgKi9cbiAgICBzaG9ydGN1dEtleT86IEtleWJpbmRDb2RlIHwgS2V5YmluZENvZGVbXSxcblxuICAgIC8qKlxuICAgICAqIEFjdGlvbiB0aGF0IGlzIGludm9rZWQgd2hlbiB0aGUga2V5Ym9hcmQgc2hvcnRjdXQgaXMgcHJlc3NlZCBvciB0aGUgaXRlbVxuICAgICAqIGlzIGFjdGl2YXRlZCBpbiB0aGUgR1VJIG1lbnVcbiAgICAgKiBJZiB0aGUgR1VJIG1lbnUgaXMgb3BlbiwgaXQgd2lsbCBzaG93IGEgc3Bpbm5lciBpZiB0aGUgYWN0aW9uIHJldHVybnMgYSBgUHJvbWlzZWBcbiAgICAgKi9cbiAgICBhY3Rpb24/OiAoZXZ0OiBLZXlib2FyZEV2ZW50LCBkYXRhPzogVCkgPT4gUHJvbWlzZTxhbnk+IHwgYW55LFxuXG4gICAgLyoqXG4gICAgICogQXJiaXRyYXJ5IGRhdGEgb2JqZWN0IHRvIGJlIHBhc3NlZCBpbnRvIHRoZSBhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRhPzogVCxcblxuICAgIC8qKlxuICAgICAqIExhYmVsIGluIHRoZSBjb21tYW5kIHBhbGV0dGUgcG9wdXBcbiAgICAgKi9cbiAgICBsYWJlbD86IHN0cmluZyxcblxuICAgIC8qKlxuICAgICAqIEhpbnQgdGhhdCBmb2xsb3dzIHRoZSBsYWJlbCwgc3VidGx5XG4gICAgICovXG4gICAgaGludD86IHN0cmluZyxcblxuICAgIC8qKlxuICAgICAqIEljb24gZm9yIHRoZSBlbnRyeVxuICAgICAqIENhbiBiZSBhIG1hdC1pY29uXG4gICAgICogV2lsbCBiZSBhIG1hdC1pY29uIGlmIHRoZSBzdHJpbmcgaXMgc2ltcGxlXG4gICAgICogSWYgdGhlIHN0cmluZyBjb250YWlucyBhIHNsYXNoIG9yIGNvbG9uLCBpdCB3aWxsIGJlIGxvYWRlZCBhc1xuICAgICAqIGFuIGltYWdlIHNvdXJjZVxuICAgICAqL1xuICAgIGljb24/OiBzdHJpbmcsXG5cbiAgICAvKipcbiAgICAgKiBLZXl3b3JkcyB0aGF0IGNhbiBoZWxwIHBpY2sgdGhpcyBjb21tYW5kXG4gICAgICovXG4gICAga2V5d29yZHM/OiBzdHJpbmcgfCBzdHJpbmdbXSxcblxuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIGZvciB0aGUgcG9wdXBcbiAgICAgKiBXSVBcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcblxuICAgIC8qKlxuICAgICAqIFRoZSByb290IGFuY2VzdG9yIGVsZW1lbnQgb2YgdGhlIGFjdGlvblxuICAgICAqIChUaGlzIGFsbG93cyBzY29waW5nIGNvbW1hbmRzIHRvIHNwZWNpZmljIEhUTUwgZWxlbWVudHMpXG4gICAgICogVGhpcyByZXF1aXJlcyB0aGF0IHRoZSBldmVudCB0YXJnZXQgbXVzdCBiZSBhIGRlc2NlbmRhbnRcbiAgICAgKlxuICAgICAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBtYXRjaGluZyBkZXNjZW5kYW50cywgb25seVxuICAgICAqIHRoZSBmdXJ0aGVzdCBkZXNjZW5kYW50IHdpbGwgYmUgZmlyZWRcbiAgICAgKlxuICAgICAqIEZvciBjb21tYW5kIHNjb3BpbmcsIHdlIHJlYWQgdGhlIGRhdGEtbGFiZWwgYXR0cmlidXRlXG4gICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzZXQgbGFiZWwgYW5kIGVsZW1lbnQgYXMgYW4gb2JqZWN0IGhlcmUuXG4gICAgICovXG4gICAgcm9vdEVsZW1lbnQ/OiBIVE1MRWxlbWVudCB8IHN0cmluZyB8IHtcbiAgICAgICAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCBzdHJpbmcsXG4gICAgICAgIGxhYmVsOiBzdHJpbmdcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIGxhYmVsIGZvciB0aGUgcm9vdC4gVXNlZCBmb3IgdGhlIFVJIGNvbnRyb2wgYW5kIGRlYnVnZ2luZy5cbiAgICAgKi9cbiAgICByb290TmFtZT86IHN0cmluZyxcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2wgd2hldGhlciB0aGlzIGNvbW1hbmQgYWN0aW9uIGlzIHZpc2libGUgaW4gdGhlIHBvcHVwIGNvbW1hbmRcbiAgICAgKiBwYWxldHRlIEdVSS5cbiAgICAgKi9cbiAgICB2aXNpYmxlSW5MaXN0PzogYm9vbGVhbixcblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSBzZWxlY3RpbmcgYW4gaXRlbSB0byBzaG93IGEgbGlzdCBvZiBzdWItaXRlbXNcbiAgICAgKi9cbiAgICBzdWJNZW51PzogQ29tbWFuZEFjdGlvbjxUPltdIHwgKCgpID0+IFByb21pc2U8Q29tbWFuZEFjdGlvbjxUPltdPikgfCAoKCkgPT4gQ29tbWFuZEFjdGlvbjxUPltdKVxuXG59O1xuXG50eXBlIENvbW1hbmRCbG9jayA9IHtcbiAgICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBhY3Rpb25zOiBDb21tYW5kQWN0aW9uW107XG59O1xuXG5leHBvcnQgdHlwZSBDb21tYW5kUGFsZXR0ZU9wdGlvbnMgPSB7XG4gICAga2V5YmluZDogS2V5YmluZENvZGVcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBDb21tYW5kUGFsZXR0ZVNlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSBjb21tYW5kQmxvY2tzOiBDb21tYW5kQmxvY2tbXSA9IFtdO1xuICAgIHByaXZhdGUgaW50ZXJ2YWw7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBsYXp5TG9hZGVyOiBMYXp5TG9hZGVyU2VydmljZVxuICAgICkge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgKGV2dCkgPT4gdGhpcy5vbktleURvd24oZXZ0KSk7XG5cbiAgICAgICAgdGhpcy5pbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEdvIGJhY2t3YXJkcyBzaW5jZSB3ZSdyZSBzcGxpY2luZyBpdGVtcyBvdXQgb2YgdGhlIGFycmF5LlxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuY29tbWFuZEJsb2Nrcy5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbW1hbmRCbG9jayA9IHRoaXMuY29tbWFuZEJsb2Nrc1tpXTtcblxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGluZGV4IGlzIHNvbWVob3cgbnVsbCwgcmlwIGl0IG91dCBvZlxuICAgICAgICAgICAgICAgIC8vIHRoZSBhcnJheSBhbmQgd2FpdCBmb3IgY2xlYW51cCB0byB0cmlnZ2VyIGFnYWluXG4gICAgICAgICAgICAgICAgLy8gZm9yIHRoZSByZXN0IG9mIHRoZSBhcnJheS5cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBDb3VsZCB0aGlzIGxlYWQgdG8gbGVha3Mgd2hlcmUgdGhpbmdzIGF0IHRoZSBlbmRcbiAgICAgICAgICAgICAgICAvLyBuZXZlciBnZXQgY2xlYW5lZD9cbiAgICAgICAgICAgICAgICBpZiAoY29tbWFuZEJsb2NrID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kQmxvY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGhhcyBiZWVuIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBET00sIHdlIHdpbGxcbiAgICAgICAgICAgICAgICAvLyB0cmVhdCBpdCBhcyBoYXZpbmcgYmVlbiBwZXJtYW5lbnRseSByZW1vdmVkLlxuICAgICAgICAgICAgICAgIC8vIFRPRE86IENvdWxkIHRoaXMgZXZlciBjYXVzZSB1bmludGVuZGVkIGNvbnNlcXVlbmNlcz9cbiAgICAgICAgICAgICAgICBpZiAoIWNvbW1hbmRCbG9jaz8uZWxlbWVudC5pc0Nvbm5lY3RlZClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kQmxvY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgNSAqIDYwICogMTAwMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvbW1hbmRCbG9ja3MoZWxlbWVudDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRQYXRoOiBIVE1MRWxlbWVudFtdID0gW2VsZW1lbnRdO1xuICAgICAgICBsZXQgY3VycmVudFRhcmdldDogSFRNTEVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBlbGVtZW50UGF0aC51bnNoaWZ0KGN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0LnBhcmVudEVsZW1lbnQpO1xuICAgICAgICB9IHdoaWxlIChjdXJyZW50VGFyZ2V0LnBhcmVudEVsZW1lbnQpO1xuXG4gICAgICAgIC8vIE9yZGVyZWQgbWF0Y2hpbmcgY29tbWFuZCBibG9ja3MsIGNsb3Nlc3QgZmlyc3RcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdDb21tYW5kQmxvY2tzOiBDb21tYW5kQmxvY2tbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudFBhdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRCbG9jayA9IHRoaXMuY29tbWFuZEJsb2Nrcy5maW5kKGNiID0+IGNiLmVsZW1lbnQgPT0gZWxlbWVudCk7XG4gICAgICAgICAgICBpZiAoY29tbWFuZEJsb2NrKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hpbmdDb21tYW5kQmxvY2tzLnVuc2hpZnQoY29tbWFuZEJsb2NrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXRjaGluZ0NvbW1hbmRCbG9ja3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGtleWRvd24gZXZlbnRzXG4gICAgICpcbiAgICAgKiBJZiBhbiBldmVudCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIERPTSB0cmVlLCB3ZSBkb24ndCBuZWVkXG4gICAgICogdG8gZXhwbGljaXRseSByZW1vdmUgdGhlIGJpbmRpbmdzLCBhcyB0aGV5IHdpbGwgbmV2ZXIgZmlyZVxuICAgICAqXG4gICAgICogV2UgcGVyaW9kaWNhbGx5IGNoZWNrIGFuZCByZW1vdmUgdW5jb25uZWN0ZWQgY29tbWFuZCBibG9ja3NcbiAgICAgKi9cbiAgICBwcml2YXRlIG9uS2V5RG93bihldnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdDb21tYW5kQmxvY2tzID0gdGhpcy5nZXRDb21tYW5kQmxvY2tzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuXG4gICAgICAgIC8vIFN0cmluZyBpbiBmb3JtYXQgYGN0cmwrYWx0K0ZgLCBgY3RybCtGYCBldGMuXG4gICAgICAgIGNvbnN0IGtleSA9IFtcbiAgICAgICAgICAgIGV2dC5jdHJsS2V5ID8gXCJjdHJsXCIgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBldnQuYWx0S2V5ID8gXCJhbHRcIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGV2dC5zaGlmdEtleSA/IFwic2hpZnRcIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGV2dC5tZXRhS2V5ID8gXCJtZXRhXCIgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBldnQuY29kZS5zdGFydHNXaXRoKFwiS2V5XCIpID8gZXZ0LmtleSA6IGV2dC5jb2RlXG4gICAgICAgIF0uZmlsdGVyKGEgPT4gYSkuam9pbignKycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBjb21tYW5kQmxvY2sgb2YgbWF0Y2hpbmdDb21tYW5kQmxvY2tzKSB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb24gPSBjb21tYW5kQmxvY2suYWN0aW9ucy5maW5kKGEgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGEuc2hvcnRjdXRLZXkpXG4gICAgICAgICAgICAgICAgICAgID8gYS5zaG9ydGN1dEtleS5pbmNsdWRlcyhrZXkgYXMgYW55KVxuICAgICAgICAgICAgICAgICAgICA6IGEuc2hvcnRjdXRLZXkgPT0ga2V5IGFzIGFueVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmludm9rZUFjdGlvbihhY3Rpb24pO1xuXG4gICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgYWN0aW9uIGFuZCBtb3ZlIG9uLlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEtlZXAgY2hlY2tpbmcgZm9yIG1hdGNoaW5nIGFjdGlvbnNcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIGV4ZWN1dGlvbiByZWFjaGVzIHRoaXMgcG9pbnQsIHRoZXJlIHdlcmUgbm8gbWF0Y2hpbmcgYWN0aW9ucyBvbiB0aGVcbiAgICAgICAgLy8gcGF0aCBvZiBlbGVtZW50cyB0aGF0IHdlcmUgcmVnaXN0ZXJlZC5cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZENvbW1hbmQoZWxlbWVudDogSFRNTEVsZW1lbnQsIGFjdGlvbjogQ29tbWFuZEFjdGlvbikge1xuICAgICAgICBjb25zdCBjb21tYW5kQmxvY2sgPSB0aGlzLmNvbW1hbmRCbG9ja3MuZmluZChiID0+IGIuZWxlbWVudCA9PSBlbGVtZW50KSA/PyAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2IgPSB7IGVsZW1lbnQsIGFjdGlvbnM6IFtdIH07XG4gICAgICAgICAgICB0aGlzLmNvbW1hbmRCbG9ja3MucHVzaChjYik7XG4gICAgICAgICAgICByZXR1cm4gY2I7XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgLy8gVGhpcyBpcyBsaWtlbHkgYSBkdXBsaWNhdGUgZW50cnlcbiAgICAgICAgaWYgKGNvbW1hbmRCbG9jay5hY3Rpb25zLmZpbmQoYSA9PiBhLnNob3J0Y3V0S2V5ICYmIGEuc2hvcnRjdXRLZXkgPT0gYWN0aW9uLnNob3J0Y3V0S2V5KSkge1xuICAgICAgICAgICAgd2FybihgSW5zZXJ0aW5nIGR1cGxpY2F0ZSBhY3Rpb24gb24gZWxlbWVudGAsIHsgZWxlbWVudCwgYWN0aW9uIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gbG9nKExvZ0ljb24uY2lyY2xlX2JsdWUsIGBJbnNlcnRlZCBhY3Rpb25gLCBhY3Rpb24pXG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYWtlIHRoZSBzaG9ydGN1dCBrZXlzIGxvd2VyY2FzZSBzbyBjYXNlIHNlbnNpdGl2aXR5IGRvZXNuJ3Qgc2NhbHAgc29tZW9uZVxuICAgICAgICBpZiAoYWN0aW9uLnNob3J0Y3V0S2V5KSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhY3Rpb24uc2hvcnRjdXRLZXkpKVxuICAgICAgICAgICAgICAgIGFjdGlvbi5zaG9ydGN1dEtleSA9IGFjdGlvbi5zaG9ydGN1dEtleS5tYXAoayA9PiBrLnRvTG93ZXJDYXNlKCkpIGFzIGFueTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBhY3Rpb24uc2hvcnRjdXRLZXkgPSBhY3Rpb24uc2hvcnRjdXRLZXkudG9Mb3dlckNhc2UoKSBhcyBhbnk7XG4gICAgICAgIH1cblxuICAgICAgICBjb21tYW5kQmxvY2suYWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVDb21tYW5kKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBhY3Rpb246IENvbW1hbmRBY3Rpb24gfCBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgY29tbWFuZEJsb2NrID0gdGhpcy5jb21tYW5kQmxvY2tzLmZpbmQoYiA9PiBiLmVsZW1lbnQgPT0gZWxlbWVudCkgPz8geyBlbGVtZW50LCBhY3Rpb25zOiBbXSB9O1xuICAgICAgICBjb25zdCBhY3Rpb25JbmRleCA9IGNvbW1hbmRCbG9jaz8uYWN0aW9ucy5maW5kSW5kZXgoYSA9PiB0eXBlb2YgYWN0aW9uID09IFwic3RyaW5nXCIgPyBhLnNob3J0Y3V0S2V5ID09IGFjdGlvbiA6IGEgPT0gYWN0aW9uKTtcblxuICAgICAgICBpZiAoIWNvbW1hbmRCbG9jaykge1xuICAgICAgICAgICAgZXJyKExvZ0ljb24ud2FybmluZywgYENhbm5vdCByZW1vdmUgY29tbWFuZDogZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFueSBjb21tYW5kcyByZWdpc3RlcmVkYCwgeyBlbGVtZW50LCBhY3Rpb24gfSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhY3Rpb25JbmRleCA9PSAtMSkge1xuICAgICAgICAgICAgd2FybihMb2dJY29uLndhcm5pbmcsIGBDYW5ub3QgcmVtb3ZlIGNvbW1hbmQ6IG5vdCBwcmVzZW50IGluIGxpc3RgLCB7IGVsZW1lbnQsIGFjdGlvbiB9KVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29tbWFuZEJsb2NrLmFjdGlvbnMuc3BsaWNlKGFjdGlvbkluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICovXG4gICAgaW5pdGlhbGl6ZShvcHRpb25zOiBDb21tYW5kUGFsZXR0ZU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5hdHRhY2hFbGVtZW50Q29tbWFuZHMoW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNob3J0Y3V0S2V5OiBvcHRpb25zLmtleWJpbmQsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLm9wZW5QYWxldHRlKCksXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiT3BlbiB0aGUgY29tbWFuZCBwYWxldHRlXCIsXG4gICAgICAgICAgICAgICAga2V5d29yZHM6IFtcImNvbW1hbmRcIiwgXCJwcm9tcHRcIiwgXCJjb25zb2xlXCIsIFwiYWN0aW9uc1wiXSxcbiAgICAgICAgICAgICAgICBsYWJlbDogXCJDb21tYW5kIFBhbGV0dGVcIixcbiAgICAgICAgICAgICAgICB2aXNpYmxlSW5MaXN0OiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICBdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVuIHRoZSBjb21tYW5kIHBhbGV0dGVcbiAgICAgKi9cbiAgICBvcGVuUGFsZXR0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlhbG9nLm9wZW4oQ29tbWFuZFBhbGV0dGVDb21wb25lbnQsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgdG9wOiBcIjhweFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGNvbnRleHRFbGVtZW50OiBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFuZWxDbGFzczogWyduZ3gtY29tbWFuZC1wYWxldHRlJ10sXG4gICAgICAgICAgICBiYWNrZHJvcENsYXNzOiBbJ25neC1jb21tYW5kLXBhbGV0dGUnXSxcbiAgICAgICAgICAgIHJlc3RvcmVGb2N1czogdHJ1ZSxcbiAgICAgICAgICAgIHJvbGU6ICdkaWFsb2cnXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1YmxpYyBoZWxwZXIgdG8gaW52b2tlIGFuIGFjdGlvbi5cbiAgICAgKi9cbiAgICBpbnZva2VBY3Rpb24oYWN0aW9uOiBDb21tYW5kQWN0aW9uLCBhcmdzPykge1xuICAgICAgICBjb25zdCBmbiA9IGFjdGlvbi5hY3Rpb247XG4gICAgICAgIGlmICh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJykge1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGZuKGFyZ3MpO1xuXG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIHByb21pc2VzIHNvIHRoYXQgdGhlIEdVSSBjYW4gc2hvdyBzcGlubmVycyBmb3IgdGhlbVxuICAgICAgICAgICAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgICAgICBlcnIoTG9nSWNvbi5ib21iLCBgRXhlY3V0aW5nIGFjdGlvbiB0aHJldyBhbiBlcnJvcmAsIHsgYWN0aW9uIH0sIGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdhcm4oTG9nSWNvbi53YXJuaW5nLCBgQ2Fubm90IGV4ZWN1dGUgYWN0aW9uLCB0eXBlIGlzIG5vdCBcImZ1bmN0aW9uXCJgLCB7IGFjdGlvbiB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaCBjb21tYW5kcyB0byBhbiBFbGVtZW50IGFuZCBpdCdzIHN1YnRyZWVcbiAgICAgKi9cbiAgICBhdHRhY2hFbGVtZW50Q29tbWFuZHMoYWN0aW9uczogQ29tbWFuZEFjdGlvbltdKVxuICAgIGF0dGFjaEVsZW1lbnRDb21tYW5kcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgYWN0aW9uczogQ29tbWFuZEFjdGlvbltdKVxuICAgIGF0dGFjaEVsZW1lbnRDb21tYW5kcyhlbGVtZW50OiBDb21tYW5kQWN0aW9uW10gfCBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmJvZHksIGFjdGlvbnM6IENvbW1hbmRBY3Rpb25bXSA9IFtdKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgICAgICAgICBhY3Rpb25zID0gZWxlbWVudDtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICB9XG5cbiAgICAgICAgYWN0aW9ucy5mb3JFYWNoKGEgPT4gdGhpcy5hZGRDb21tYW5kKGVsZW1lbnQgYXMgYW55LCBhKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0YWNoIHNwZWNpZmllZCBjb21tYW5kcyBmcm9tIGFuIEVsZW1lbnQgc3VidHJlZVxuICAgICAqL1xuICAgIGRldGFjaEVsZW1lbnRDb21tYW5kcyhlbGVtZW50OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmJvZHksIGFjdGlvbnM6IENvbW1hbmRBY3Rpb25bXSA9IFtdKSB7XG4gICAgICAgIGFjdGlvbnMuZm9yRWFjaChhID0+IHRoaXMucmVtb3ZlQ29tbWFuZChlbGVtZW50LCBhKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgY29tbWFuZHMgdW5kZXIgYSBnaXZlbiBlbGVtZW50XG4gICAgICovXG4gICAgZ2V0UmVnaXN0ZXJlZENvbW1hbmRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRDb21tYW5kQmxvY2tzKGVsZW1lbnQpLm1hcChjID0+IGMuYWN0aW9ucykuZmxhdCgpO1xuICAgIH1cbn1cbiJdfQ==
|