@angular/compiler-cli 11.1.0 → 11.1.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/linker/src/file_linker/partial_linkers/partial_linker_selector.d.ts +1 -1
- package/linker/src/file_linker/partial_linkers/partial_linker_selector.js +15 -16
- package/ngcc/src/packages/build_marker.d.ts +1 -1
- package/ngcc/src/packages/build_marker.js +1 -1
- package/ngcc/src/rendering/source_maps.js +18 -19
- package/package.json +2 -2
- package/src/ngtsc/annotations/src/component.d.ts +48 -3
- package/src/ngtsc/annotations/src/component.js +197 -116
- package/src/ngtsc/core/api/src/public_options.d.ts +2 -2
- package/src/ngtsc/core/api/src/public_options.js +1 -1
- package/src/ngtsc/core/index.d.ts +1 -1
- package/src/ngtsc/core/index.js +5 -5
- package/src/ngtsc/core/src/compiler.d.ts +79 -7
- package/src/ngtsc/core/src/compiler.js +191 -49
- package/src/ngtsc/diagnostics/src/error_code.d.ts +6 -1
- package/src/ngtsc/diagnostics/src/error_code.js +9 -1
- package/src/ngtsc/incremental/src/strategy.d.ts +7 -0
- package/src/ngtsc/incremental/src/strategy.js +7 -1
- package/src/ngtsc/program.js +47 -19
- package/src/ngtsc/resource/src/loader.d.ts +4 -0
- package/src/ngtsc/resource/src/loader.js +7 -1
- package/src/ngtsc/sourcemaps/index.d.ts +3 -2
- package/src/ngtsc/sourcemaps/index.js +12 -3
- package/src/ngtsc/sourcemaps/src/content_origin.d.ts +34 -0
- package/src/ngtsc/sourcemaps/src/content_origin.js +48 -0
- package/src/ngtsc/sourcemaps/src/raw_source_map.d.ts +19 -1
- package/src/ngtsc/sourcemaps/src/raw_source_map.js +1 -8
- package/src/ngtsc/sourcemaps/src/source_file.d.ts +5 -9
- package/src/ngtsc/sourcemaps/src/source_file.js +3 -6
- package/src/ngtsc/sourcemaps/src/source_file_loader.d.ts +34 -14
- package/src/ngtsc/sourcemaps/src/source_file_loader.js +72 -19
- package/src/ngtsc/transform/src/api.d.ts +5 -0
- package/src/ngtsc/transform/src/api.js +1 -1
- package/src/ngtsc/transform/src/compilation.d.ts +1 -0
- package/src/ngtsc/transform/src/compilation.js +40 -17
- package/src/ngtsc/tsc_plugin.js +20 -3
- package/src/ngtsc/typecheck/api/checker.d.ts +5 -0
- package/src/ngtsc/typecheck/api/checker.js +1 -1
- package/src/ngtsc/typecheck/src/checker.d.ts +1 -0
- package/src/ngtsc/typecheck/src/checker.js +17 -1
- package/src/version.js +1 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google LLC All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.io/license
|
|
7
|
+
*/
|
|
8
|
+
/// <amd-module name="@angular/compiler-cli/src/ngtsc/sourcemaps/src/content_origin" />
|
|
9
|
+
/**
|
|
10
|
+
* From where the content for a source file or source-map came.
|
|
11
|
+
*
|
|
12
|
+
* - Source files can be linked to source-maps by:
|
|
13
|
+
* - providing the content inline via a base64 encoded data comment,
|
|
14
|
+
* - providing a URL to the file path in a comment,
|
|
15
|
+
* - the loader inferring the source-map path from the source file path.
|
|
16
|
+
* - Source-maps can link to source files by:
|
|
17
|
+
* - providing the content inline in the `sourcesContent` property
|
|
18
|
+
* - providing the path to the file in the `sources` property
|
|
19
|
+
*/
|
|
20
|
+
export declare enum ContentOrigin {
|
|
21
|
+
/**
|
|
22
|
+
* The contents were provided programmatically when calling `loadSourceFile()`.
|
|
23
|
+
*/
|
|
24
|
+
Provided = 0,
|
|
25
|
+
/**
|
|
26
|
+
* The contents were extracted directly form the contents of the referring file.
|
|
27
|
+
*/
|
|
28
|
+
Inline = 1,
|
|
29
|
+
/**
|
|
30
|
+
* The contents were loaded from the file-system, after being explicitly referenced or inferred
|
|
31
|
+
* from the referring file.
|
|
32
|
+
*/
|
|
33
|
+
FileSystem = 2
|
|
34
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google LLC All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.io/license
|
|
7
|
+
*/
|
|
8
|
+
(function (factory) {
|
|
9
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
10
|
+
var v = factory(require, exports);
|
|
11
|
+
if (v !== undefined) module.exports = v;
|
|
12
|
+
}
|
|
13
|
+
else if (typeof define === "function" && define.amd) {
|
|
14
|
+
define("@angular/compiler-cli/src/ngtsc/sourcemaps/src/content_origin", ["require", "exports"], factory);
|
|
15
|
+
}
|
|
16
|
+
})(function (require, exports) {
|
|
17
|
+
"use strict";
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.ContentOrigin = void 0;
|
|
20
|
+
/**
|
|
21
|
+
* From where the content for a source file or source-map came.
|
|
22
|
+
*
|
|
23
|
+
* - Source files can be linked to source-maps by:
|
|
24
|
+
* - providing the content inline via a base64 encoded data comment,
|
|
25
|
+
* - providing a URL to the file path in a comment,
|
|
26
|
+
* - the loader inferring the source-map path from the source file path.
|
|
27
|
+
* - Source-maps can link to source files by:
|
|
28
|
+
* - providing the content inline in the `sourcesContent` property
|
|
29
|
+
* - providing the path to the file in the `sources` property
|
|
30
|
+
*/
|
|
31
|
+
var ContentOrigin;
|
|
32
|
+
(function (ContentOrigin) {
|
|
33
|
+
/**
|
|
34
|
+
* The contents were provided programmatically when calling `loadSourceFile()`.
|
|
35
|
+
*/
|
|
36
|
+
ContentOrigin[ContentOrigin["Provided"] = 0] = "Provided";
|
|
37
|
+
/**
|
|
38
|
+
* The contents were extracted directly form the contents of the referring file.
|
|
39
|
+
*/
|
|
40
|
+
ContentOrigin[ContentOrigin["Inline"] = 1] = "Inline";
|
|
41
|
+
/**
|
|
42
|
+
* The contents were loaded from the file-system, after being explicitly referenced or inferred
|
|
43
|
+
* from the referring file.
|
|
44
|
+
*/
|
|
45
|
+
ContentOrigin[ContentOrigin["FileSystem"] = 2] = "FileSystem";
|
|
46
|
+
})(ContentOrigin = exports.ContentOrigin || (exports.ContentOrigin = {}));
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudF9vcmlnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci1jbGkvc3JjL25ndHNjL3NvdXJjZW1hcHMvc3JjL2NvbnRlbnRfb3JpZ2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRzs7Ozs7Ozs7Ozs7OztJQUVIOzs7Ozs7Ozs7O09BVUc7SUFDSCxJQUFZLGFBY1g7SUFkRCxXQUFZLGFBQWE7UUFDdkI7O1dBRUc7UUFDSCx5REFBUSxDQUFBO1FBQ1I7O1dBRUc7UUFDSCxxREFBTSxDQUFBO1FBQ047OztXQUdHO1FBQ0gsNkRBQVUsQ0FBQTtJQUNaLENBQUMsRUFkVyxhQUFhLEdBQWIscUJBQWEsS0FBYixxQkFBYSxRQWN4QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEZyb20gd2hlcmUgdGhlIGNvbnRlbnQgZm9yIGEgc291cmNlIGZpbGUgb3Igc291cmNlLW1hcCBjYW1lLlxuICpcbiAqIC0gU291cmNlIGZpbGVzIGNhbiBiZSBsaW5rZWQgdG8gc291cmNlLW1hcHMgYnk6XG4gKiAgIC0gcHJvdmlkaW5nIHRoZSBjb250ZW50IGlubGluZSB2aWEgYSBiYXNlNjQgZW5jb2RlZCBkYXRhIGNvbW1lbnQsXG4gKiAgIC0gcHJvdmlkaW5nIGEgVVJMIHRvIHRoZSBmaWxlIHBhdGggaW4gYSBjb21tZW50LFxuICogICAtIHRoZSBsb2FkZXIgaW5mZXJyaW5nIHRoZSBzb3VyY2UtbWFwIHBhdGggZnJvbSB0aGUgc291cmNlIGZpbGUgcGF0aC5cbiAqIC0gU291cmNlLW1hcHMgY2FuIGxpbmsgdG8gc291cmNlIGZpbGVzIGJ5OlxuICogICAtIHByb3ZpZGluZyB0aGUgY29udGVudCBpbmxpbmUgaW4gdGhlIGBzb3VyY2VzQ29udGVudGAgcHJvcGVydHlcbiAqICAgLSBwcm92aWRpbmcgdGhlIHBhdGggdG8gdGhlIGZpbGUgaW4gdGhlIGBzb3VyY2VzYCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZW51bSBDb250ZW50T3JpZ2luIHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50cyB3ZXJlIHByb3ZpZGVkIHByb2dyYW1tYXRpY2FsbHkgd2hlbiBjYWxsaW5nIGBsb2FkU291cmNlRmlsZSgpYC5cbiAgICovXG4gIFByb3ZpZGVkLFxuICAvKipcbiAgICogVGhlIGNvbnRlbnRzIHdlcmUgZXh0cmFjdGVkIGRpcmVjdGx5IGZvcm0gdGhlIGNvbnRlbnRzIG9mIHRoZSByZWZlcnJpbmcgZmlsZS5cbiAgICovXG4gIElubGluZSxcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50cyB3ZXJlIGxvYWRlZCBmcm9tIHRoZSBmaWxlLXN5c3RlbSwgYWZ0ZXIgYmVpbmcgZXhwbGljaXRseSByZWZlcmVuY2VkIG9yIGluZmVycmVkXG4gICAqIGZyb20gdGhlIHJlZmVycmluZyBmaWxlLlxuICAgKi9cbiAgRmlsZVN5c3RlbSxcbn1cbiJdfQ==
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/// <amd-module name="@angular/compiler-cli/src/ngtsc/sourcemaps/src/raw_source_map" />
|
|
1
2
|
/**
|
|
2
3
|
* @license
|
|
3
4
|
* Copyright Google LLC All Rights Reserved.
|
|
@@ -5,7 +6,8 @@
|
|
|
5
6
|
* Use of this source code is governed by an MIT-style license that can be
|
|
6
7
|
* found in the LICENSE file at https://angular.io/license
|
|
7
8
|
*/
|
|
8
|
-
|
|
9
|
+
import { AbsoluteFsPath } from '../../file_system';
|
|
10
|
+
import { ContentOrigin } from './content_origin';
|
|
9
11
|
/**
|
|
10
12
|
* This interface is the basic structure of the JSON in a raw source map that one might load from
|
|
11
13
|
* disk.
|
|
@@ -19,3 +21,19 @@ export interface RawSourceMap {
|
|
|
19
21
|
sourcesContent?: (string | null)[];
|
|
20
22
|
mappings: string;
|
|
21
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* The path and content of a source-map.
|
|
26
|
+
*/
|
|
27
|
+
export interface MapAndPath {
|
|
28
|
+
/** The path to the source map if it was external or `null` if it was inline. */
|
|
29
|
+
mapPath: AbsoluteFsPath | null;
|
|
30
|
+
/** The raw source map itself. */
|
|
31
|
+
map: RawSourceMap;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Information about a loaded source-map.
|
|
35
|
+
*/
|
|
36
|
+
export interface SourceMapInfo extends MapAndPath {
|
|
37
|
+
/** From where the content for this source-map came. */
|
|
38
|
+
origin: ContentOrigin;
|
|
39
|
+
}
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
1
|
(function (factory) {
|
|
9
2
|
if (typeof module === "object" && typeof module.exports === "object") {
|
|
10
3
|
var v = factory(require, exports);
|
|
@@ -17,4 +10,4 @@
|
|
|
17
10
|
"use strict";
|
|
18
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
12
|
});
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF3X3NvdXJjZV9tYXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci1jbGkvc3JjL25ndHNjL3NvdXJjZW1hcHMvc3JjL3Jhd19zb3VyY2VfbWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmltcG9ydCB7QWJzb2x1dGVGc1BhdGh9IGZyb20gJy4uLy4uL2ZpbGVfc3lzdGVtJztcbmltcG9ydCB7Q29udGVudE9yaWdpbn0gZnJvbSAnLi9jb250ZW50X29yaWdpbic7XG5cbi8qKlxuICogVGhpcyBpbnRlcmZhY2UgaXMgdGhlIGJhc2ljIHN0cnVjdHVyZSBvZiB0aGUgSlNPTiBpbiBhIHJhdyBzb3VyY2UgbWFwIHRoYXQgb25lIG1pZ2h0IGxvYWQgZnJvbVxuICogZGlzay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYXdTb3VyY2VNYXAge1xuICB2ZXJzaW9uOiBudW1iZXJ8c3RyaW5nO1xuICBmaWxlPzogc3RyaW5nO1xuICBzb3VyY2VSb290Pzogc3RyaW5nO1xuICBzb3VyY2VzOiBzdHJpbmdbXTtcbiAgbmFtZXM6IHN0cmluZ1tdO1xuICBzb3VyY2VzQ29udGVudD86IChzdHJpbmd8bnVsbClbXTtcbiAgbWFwcGluZ3M6IHN0cmluZztcbn1cblxuXG4vKipcbiAqIFRoZSBwYXRoIGFuZCBjb250ZW50IG9mIGEgc291cmNlLW1hcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXBBbmRQYXRoIHtcbiAgLyoqIFRoZSBwYXRoIHRvIHRoZSBzb3VyY2UgbWFwIGlmIGl0IHdhcyBleHRlcm5hbCBvciBgbnVsbGAgaWYgaXQgd2FzIGlubGluZS4gKi9cbiAgbWFwUGF0aDogQWJzb2x1dGVGc1BhdGh8bnVsbDtcbiAgLyoqIFRoZSByYXcgc291cmNlIG1hcCBpdHNlbGYuICovXG4gIG1hcDogUmF3U291cmNlTWFwO1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IGEgbG9hZGVkIHNvdXJjZS1tYXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlTWFwSW5mbyBleHRlbmRzIE1hcEFuZFBhdGgge1xuICAvKiogRnJvbSB3aGVyZSB0aGUgY29udGVudCBmb3IgdGhpcyBzb3VyY2UtbWFwIGNhbWUuICovXG4gIG9yaWdpbjogQ29udGVudE9yaWdpbjtcbn1cbiJdfQ==
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <amd-module name="@angular/compiler-cli/src/ngtsc/sourcemaps/src/source_file" />
|
|
2
2
|
import { AbsoluteFsPath, PathManipulation } from '../../file_system';
|
|
3
|
-
import { RawSourceMap } from './raw_source_map';
|
|
3
|
+
import { RawSourceMap, SourceMapInfo } from './raw_source_map';
|
|
4
4
|
import { SegmentMarker } from './segment_marker';
|
|
5
5
|
export declare function removeSourceMapComments(contents: string): string;
|
|
6
6
|
export declare class SourceFile {
|
|
@@ -8,10 +8,8 @@ export declare class SourceFile {
|
|
|
8
8
|
readonly sourcePath: AbsoluteFsPath;
|
|
9
9
|
/** The contents of this source file. */
|
|
10
10
|
readonly contents: string;
|
|
11
|
-
/** The raw source map (if any)
|
|
12
|
-
readonly rawMap:
|
|
13
|
-
/** Whether this source file's source map was inline or external. */
|
|
14
|
-
readonly inline: boolean;
|
|
11
|
+
/** The raw source map (if any) referenced by this source file. */
|
|
12
|
+
readonly rawMap: SourceMapInfo | null;
|
|
15
13
|
/** Any source files referenced by the raw source map associated with this source file. */
|
|
16
14
|
readonly sources: (SourceFile | null)[];
|
|
17
15
|
private fs;
|
|
@@ -29,10 +27,8 @@ export declare class SourceFile {
|
|
|
29
27
|
sourcePath: AbsoluteFsPath,
|
|
30
28
|
/** The contents of this source file. */
|
|
31
29
|
contents: string,
|
|
32
|
-
/** The raw source map (if any)
|
|
33
|
-
rawMap:
|
|
34
|
-
/** Whether this source file's source map was inline or external. */
|
|
35
|
-
inline: boolean,
|
|
30
|
+
/** The raw source map (if any) referenced by this source file. */
|
|
31
|
+
rawMap: SourceMapInfo | null,
|
|
36
32
|
/** Any source files referenced by the raw source map associated with this source file. */
|
|
37
33
|
sources: (SourceFile | null)[], fs: PathManipulation);
|
|
38
34
|
/**
|
|
@@ -31,16 +31,13 @@
|
|
|
31
31
|
sourcePath,
|
|
32
32
|
/** The contents of this source file. */
|
|
33
33
|
contents,
|
|
34
|
-
/** The raw source map (if any)
|
|
34
|
+
/** The raw source map (if any) referenced by this source file. */
|
|
35
35
|
rawMap,
|
|
36
|
-
/** Whether this source file's source map was inline or external. */
|
|
37
|
-
inline,
|
|
38
36
|
/** Any source files referenced by the raw source map associated with this source file. */
|
|
39
37
|
sources, fs) {
|
|
40
38
|
this.sourcePath = sourcePath;
|
|
41
39
|
this.contents = contents;
|
|
42
40
|
this.rawMap = rawMap;
|
|
43
|
-
this.inline = inline;
|
|
44
41
|
this.sources = sources;
|
|
45
42
|
this.fs = fs;
|
|
46
43
|
this.contents = removeSourceMapComments(contents);
|
|
@@ -139,7 +136,7 @@
|
|
|
139
136
|
* source files with no transitive source maps.
|
|
140
137
|
*/
|
|
141
138
|
SourceFile.prototype.flattenMappings = function () {
|
|
142
|
-
var mappings = parseMappings(this.rawMap, this.sources, this.startOfLinePositions);
|
|
139
|
+
var mappings = parseMappings(this.rawMap && this.rawMap.map, this.sources, this.startOfLinePositions);
|
|
143
140
|
ensureOriginalSegmentLinks(mappings);
|
|
144
141
|
var flattenedMappings = [];
|
|
145
142
|
for (var mappingIndex = 0; mappingIndex < mappings.length; mappingIndex++) {
|
|
@@ -519,4 +516,4 @@
|
|
|
519
516
|
return Cache;
|
|
520
517
|
}());
|
|
521
518
|
});
|
|
522
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlX2ZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci1jbGkvc3JjL25ndHNjL3NvdXJjZW1hcHMvc3JjL3NvdXJjZV9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7SUFBQTs7Ozs7O09BTUc7SUFDSCx5REFBeUU7SUFDekUsbURBQW9GO0lBS3BGLGdHQUErRTtJQUUvRSxTQUFnQix1QkFBdUIsQ0FBQyxRQUFnQjtRQUN0RCxPQUFPLDBDQUFxQixDQUFDLG1DQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFGRCwwREFFQztJQUVEO1FBV0U7UUFDSSxvQ0FBb0M7UUFDM0IsVUFBMEI7UUFDbkMsd0NBQXdDO1FBQy9CLFFBQWdCO1FBQ3pCLG9FQUFvRTtRQUMzRCxNQUF5QjtRQUNsQyxvRUFBb0U7UUFDM0QsTUFBZTtRQUN4QiwwRkFBMEY7UUFDakYsT0FBNEIsRUFDN0IsRUFBb0I7WUFUbkIsZUFBVSxHQUFWLFVBQVUsQ0FBZ0I7WUFFMUIsYUFBUSxHQUFSLFFBQVEsQ0FBUTtZQUVoQixXQUFNLEdBQU4sTUFBTSxDQUFtQjtZQUV6QixXQUFNLEdBQU4sTUFBTSxDQUFTO1lBRWYsWUFBTyxHQUFQLE9BQU8sQ0FBcUI7WUFDN0IsT0FBRSxHQUFGLEVBQUUsQ0FBa0I7WUFFOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsMkJBQTJCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbEQsQ0FBQztRQUVEOztXQUVHO1FBQ0gsNkNBQXdCLEdBQXhC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LENBQUMsQ0FBQztZQUMzQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDSCxpQkFBQztJQUFELENBQUMsQUEzQkQsSUEyQkM7SUFFRDtRQUVFLGVBQW9CLFNBQW1DO1lBQW5DLGNBQVMsR0FBVCxTQUFTLENBQTBCO1lBRC9DLFFBQUcsR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQztRQUNtQixDQUFDO1FBQzNELG1CQUFHLEdBQUgsVUFBSSxLQUFZO1lBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQzVDO1lBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUUsQ0FBQztRQUM5QixDQUFDO1FBQ0gsWUFBQztJQUFELENBQUMsQUFURCxJQVNDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5pbXBvcnQge3JlbW92ZUNvbW1lbnRzLCByZW1vdmVNYXBGaWxlQ29tbWVudHN9IGZyb20gJ2NvbnZlcnQtc291cmNlLW1hcCc7XG5pbXBvcnQge2RlY29kZSwgZW5jb2RlLCBTb3VyY2VNYXBNYXBwaW5ncywgU291cmNlTWFwU2VnbWVudH0gZnJvbSAnc291cmNlbWFwLWNvZGVjJztcblxuaW1wb3J0IHtBYnNvbHV0ZUZzUGF0aCwgUGF0aE1hbmlwdWxhdGlvbn0gZnJvbSAnLi4vLi4vZmlsZV9zeXN0ZW0nO1xuXG5pbXBvcnQge1Jhd1NvdXJjZU1hcH0gZnJvbSAnLi9yYXdfc291cmNlX21hcCc7XG5pbXBvcnQge2NvbXBhcmVTZWdtZW50cywgb2Zmc2V0U2VnbWVudCwgU2VnbWVudE1hcmtlcn0gZnJvbSAnLi9zZWdtZW50X21hcmtlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVTb3VyY2VNYXBDb21tZW50cyhjb250ZW50czogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlbW92ZU1hcEZpbGVDb21tZW50cyhyZW1vdmVDb21tZW50cyhjb250ZW50cykpLnJlcGxhY2UoL1xcblxcbiQvLCAnXFxuJyk7XG59XG5cbmV4cG9ydCBjbGFzcyBTb3VyY2VGaWxlIHtcbiAgLyoqXG4gICAqIFRoZSBwYXJzZWQgbWFwcGluZ3MgdGhhdCBoYXZlIGJlZW4gZmxhdHRlbmVkIHNvIHRoYXQgYW55IGludGVybWVkaWF0ZSBzb3VyY2UgbWFwcGluZ3MgaGF2ZSBiZWVuXG4gICAqIGZsYXR0ZW5lZC5cbiAgICpcbiAgICogVGhlIHJlc3VsdCBpcyB0aGF0IGFueSBzb3VyY2UgZmlsZSBtZW50aW9uZWQgaW4gdGhlIGZsYXR0ZW5lZCBtYXBwaW5ncyBoYXZlIG5vIHNvdXJjZSBtYXAgKGFyZVxuICAgKiBwdXJlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcykuXG4gICAqL1xuICByZWFkb25seSBmbGF0dGVuZWRNYXBwaW5nczogTWFwcGluZ1tdO1xuICByZWFkb25seSBzdGFydE9mTGluZVBvc2l0aW9uczogbnVtYmVyW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICAvKiogVGhlIHBhdGggdG8gdGhpcyBzb3VyY2UgZmlsZS4gKi9cbiAgICAgIHJlYWRvbmx5IHNvdXJjZVBhdGg6IEFic29sdXRlRnNQYXRoLFxuICAgICAgLyoqIFRoZSBjb250ZW50cyBvZiB0aGlzIHNvdXJjZSBmaWxlLiAqL1xuICAgICAgcmVhZG9ubHkgY29udGVudHM6IHN0cmluZyxcbiAgICAgIC8qKiBUaGUgcmF3IHNvdXJjZSBtYXAgKGlmIGFueSkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc291cmNlIGZpbGUuICovXG4gICAgICByZWFkb25seSByYXdNYXA6IFJhd1NvdXJjZU1hcHxudWxsLFxuICAgICAgLyoqIFdoZXRoZXIgdGhpcyBzb3VyY2UgZmlsZSdzIHNvdXJjZSBtYXAgd2FzIGlubGluZSBvciBleHRlcm5hbC4gKi9cbiAgICAgIHJlYWRvbmx5IGlubGluZTogYm9vbGVhbixcbiAgICAgIC8qKiBBbnkgc291cmNlIGZpbGVzIHJlZmVyZW5jZWQgYnkgdGhlIHJhdyBzb3VyY2UgbWFwIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvdXJjZSBmaWxlLiAqL1xuICAgICAgcmVhZG9ubHkgc291cmNlczogKFNvdXJjZUZpbGV8bnVsbClbXSxcbiAgICAgIHByaXZhdGUgZnM6IFBhdGhNYW5pcHVsYXRpb24sXG4gICkge1xuICAgIHRoaXMuY29udGVudHMgPSByZW1vdmVTb3VyY2VNYXBDb21tZW50cyhjb250ZW50cyk7XG4gICAgdGhpcy5zdGFydE9mTGluZVBvc2l0aW9ucyA9IGNvbXB1dGVTdGFydE9mTGluZVBvc2l0aW9ucyh0aGlzLmNvbnRlbnRzKTtcbiAgICB0aGlzLmZsYXR0ZW5lZE1hcHBpbmdzID0gdGhpcy5mbGF0dGVuTWFwcGluZ3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIHJhdyBzb3VyY2UgbWFwIGdlbmVyYXRlZCBmcm9tIHRoZSBmbGF0dGVuZWQgbWFwcGluZ3MuXG4gICAqL1xuICByZW5kZXJGbGF0dGVuZWRTb3VyY2VNYXAoKTogUmF3U291cmNlTWFwIHtcbiAgICBjb25zdCBzb3VyY2VzID0gbmV3IEluZGV4ZWRNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgY29uc3QgbmFtZXMgPSBuZXcgSW5kZXhlZFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgbWFwcGluZ3M6IFNvdXJjZU1hcE1hcHBpbmdzID0gW107XG4gICAgY29uc3Qgc291cmNlUGF0aERpciA9IHRoaXMuZnMuZGlybmFtZSh0aGlzLnNvdXJjZVBhdGgpO1xuICAgIC8vIENvbXB1dGluZyB0aGUgcmVsYXRpdmUgcGF0aCBjYW4gYmUgZXhwZW5zaXZlLCBhbmQgd2UgYXJlIGxpa2VseSB0byBoYXZlIHRoZSBzYW1lIHBhdGggZm9yXG4gICAgLy8gbWFueSAoaWYgbm90IGFsbCEpIG1hcHBpbmdzLlxuICAgIGNvbnN0IHJlbGF0aXZlU291cmNlUGF0aENhY2hlID1cbiAgICAgICAgbmV3IENhY2hlPHN0cmluZywgc3RyaW5nPihpbnB1dCA9PiB0aGlzLmZzLnJlbGF0aXZlKHNvdXJjZVBhdGhEaXIsIGlucHV0KSk7XG5cbiAgICBmb3IgKGNvbnN0IG1hcHBpbmcgb2YgdGhpcy5mbGF0dGVuZWRNYXBwaW5ncykge1xuICAgICAgY29uc3Qgc291cmNlSW5kZXggPSBzb3VyY2VzLnNldChcbiAgICAgICAgICByZWxhdGl2ZVNvdXJjZVBhdGhDYWNoZS5nZXQobWFwcGluZy5vcmlnaW5hbFNvdXJjZS5zb3VyY2VQYXRoKSxcbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsU291cmNlLmNvbnRlbnRzKTtcbiAgICAgIGNvbnN0IG1hcHBpbmdBcnJheTogU291cmNlTWFwU2VnbWVudCA9IFtcbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRTZWdtZW50LmNvbHVtbixcbiAgICAgICAgc291cmNlSW5kZXgsXG4gICAgICAgIG1hcHBpbmcub3JpZ2luYWxTZWdtZW50LmxpbmUsXG4gICAgICAgIG1hcHBpbmcub3JpZ2luYWxTZWdtZW50LmNvbHVtbixcbiAgICAgIF07XG4gICAgICBpZiAobWFwcGluZy5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbmFtZUluZGV4ID0gbmFtZXMuYWRkKG1hcHBpbmcubmFtZSk7XG4gICAgICAgIG1hcHBpbmdBcnJheS5wdXNoKG5hbWVJbmRleCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVuc3VyZSBhIG1hcHBpbmcgbGluZSBhcnJheSBmb3IgdGhpcyBtYXBwaW5nLlxuICAgICAgY29uc3QgbGluZSA9IG1hcHBpbmcuZ2VuZXJhdGVkU2VnbWVudC5saW5lO1xuICAgICAgd2hpbGUgKGxpbmUgPj0gbWFwcGluZ3MubGVuZ3RoKSB7XG4gICAgICAgIG1hcHBpbmdzLnB1c2goW10pO1xuICAgICAgfVxuICAgICAgLy8gQWRkIHRoaXMgbWFwcGluZyB0byB0aGUgbGluZVxuICAgICAgbWFwcGluZ3NbbGluZV0ucHVzaChtYXBwaW5nQXJyYXkpO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZU1hcDogUmF3U291cmNlTWFwID0ge1xuICAgICAgdmVyc2lvbjogMyxcbiAgICAgIGZpbGU6IHRoaXMuZnMucmVsYXRpdmUoc291cmNlUGF0aERpciwgdGhpcy5zb3VyY2VQYXRoKSxcbiAgICAgIHNvdXJjZXM6IHNvdXJjZXMua2V5cyxcbiAgICAgIG5hbWVzOiBuYW1lcy52YWx1ZXMsXG4gICAgICBtYXBwaW5nczogZW5jb2RlKG1hcHBpbmdzKSxcbiAgICAgIHNvdXJjZXNDb250ZW50OiBzb3VyY2VzLnZhbHVlcyxcbiAgICB9O1xuICAgIHJldHVybiBzb3VyY2VNYXA7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgb3JpZ2luYWwgbWFwcGVkIGxvY2F0aW9uIGZvciB0aGUgZ2l2ZW4gYGxpbmVgIGFuZCBgY29sdW1uYCBpbiB0aGUgZ2VuZXJhdGVkIGZpbGUuXG4gICAqXG4gICAqIEZpcnN0IHdlIHNlYXJjaCBmb3IgYSBtYXBwaW5nIHdob3NlIGdlbmVyYXRlZCBzZWdtZW50IGlzIGF0IG9yIGRpcmVjdGx5IGJlZm9yZSB0aGUgZ2l2ZW5cbiAgICogbG9jYXRpb24uIFRoZW4gd2UgY29tcHV0ZSB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIGdpdmVuIGxvY2F0aW9uIGFuZCB0aGUgbWF0Y2hpbmcgZ2VuZXJhdGVkXG4gICAqIHNlZ21lbnQuIEZpbmFsbHkgd2UgYXBwbHkgdGhpcyBvZmZzZXQgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBzZWdtZW50IHRvIGdldCB0aGUgZGVzaXJlZFxuICAgKiBvcmlnaW5hbCBsb2NhdGlvbi5cbiAgICovXG4gIGdldE9yaWdpbmFsTG9jYXRpb24obGluZTogbnVtYmVyLCBjb2x1bW46IG51bWJlcik6XG4gICAgICB7ZmlsZTogQWJzb2x1dGVGc1BhdGgsIGxpbmU6IG51bWJlciwgY29sdW1uOiBudW1iZXJ9fG51bGwge1xuICAgIGlmICh0aGlzLmZsYXR0ZW5lZE1hcHBpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IHBvc2l0aW9uOiBudW1iZXI7XG4gICAgaWYgKGxpbmUgPCB0aGlzLnN0YXJ0T2ZMaW5lUG9zaXRpb25zLmxlbmd0aCkge1xuICAgICAgcG9zaXRpb24gPSB0aGlzLnN0YXJ0T2ZMaW5lUG9zaXRpb25zW2xpbmVdICsgY29sdW1uO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgbGluZSBpcyBvZmYgdGhlIGVuZCBvZiB0aGUgZmlsZSwgc28ganVzdCBhc3N1bWUgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuXG4gICAgICBwb3NpdGlvbiA9IHRoaXMuY29udGVudHMubGVuZ3RoO1xuICAgIH1cblxuICAgIGNvbnN0IGxvY2F0aW9uU2VnbWVudDogU2VnbWVudE1hcmtlciA9IHtsaW5lLCBjb2x1bW4sIHBvc2l0aW9uLCBuZXh0OiB1bmRlZmluZWR9O1xuXG4gICAgbGV0IG1hcHBpbmdJbmRleCA9XG4gICAgICAgIGZpbmRMYXN0TWFwcGluZ0luZGV4QmVmb3JlKHRoaXMuZmxhdHRlbmVkTWFwcGluZ3MsIGxvY2F0aW9uU2VnbWVudCwgZmFsc2UsIDApO1xuICAgIGlmIChtYXBwaW5nSW5kZXggPCAwKSB7XG4gICAgICBtYXBwaW5nSW5kZXggPSAwO1xuICAgIH1cbiAgICBjb25zdCB7b3JpZ2luYWxTZWdtZW50LCBvcmlnaW5hbFNvdXJjZSwgZ2VuZXJhdGVkU2VnbWVudH0gPVxuICAgICAgICB0aGlzLmZsYXR0ZW5lZE1hcHBpbmdzW21hcHBpbmdJbmRleF07XG4gICAgY29uc3Qgb2Zmc2V0ID0gbG9jYXRpb25TZWdtZW50LnBvc2l0aW9uIC0gZ2VuZXJhdGVkU2VnbWVudC5wb3NpdGlvbjtcbiAgICBjb25zdCBvZmZzZXRPcmlnaW5hbFNlZ21lbnQgPVxuICAgICAgICBvZmZzZXRTZWdtZW50KG9yaWdpbmFsU291cmNlLnN0YXJ0T2ZMaW5lUG9zaXRpb25zLCBvcmlnaW5hbFNlZ21lbnQsIG9mZnNldCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZmlsZTogb3JpZ2luYWxTb3VyY2Uuc291cmNlUGF0aCxcbiAgICAgIGxpbmU6IG9mZnNldE9yaWdpbmFsU2VnbWVudC5saW5lLFxuICAgICAgY29sdW1uOiBvZmZzZXRPcmlnaW5hbFNlZ21lbnQuY29sdW1uLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRmxhdHRlbiB0aGUgcGFyc2VkIG1hcHBpbmdzIGZvciB0aGlzIHNvdXJjZSBmaWxlLCBzbyB0aGF0IGFsbCB0aGUgbWFwcGluZ3MgYXJlIHRvIHB1cmUgb3JpZ2luYWxcbiAgICogc291cmNlIGZpbGVzIHdpdGggbm8gdHJhbnNpdGl2ZSBzb3VyY2UgbWFwcy5cbiAgICovXG4gIHByaXZhdGUgZmxhdHRlbk1hcHBpbmdzKCk6IE1hcHBpbmdbXSB7XG4gICAgY29uc3QgbWFwcGluZ3MgPSBwYXJzZU1hcHBpbmdzKHRoaXMucmF3TWFwLCB0aGlzLnNvdXJjZXMsIHRoaXMuc3RhcnRPZkxpbmVQb3NpdGlvbnMpO1xuICAgIGVuc3VyZU9yaWdpbmFsU2VnbWVudExpbmtzKG1hcHBpbmdzKTtcbiAgICBjb25zdCBmbGF0dGVuZWRNYXBwaW5nczogTWFwcGluZ1tdID0gW107XG4gICAgZm9yIChsZXQgbWFwcGluZ0luZGV4ID0gMDsgbWFwcGluZ0luZGV4IDwgbWFwcGluZ3MubGVuZ3RoOyBtYXBwaW5nSW5kZXgrKykge1xuICAgICAgY29uc3QgYVRvQm1hcHBpbmcgPSBtYXBwaW5nc1ttYXBwaW5nSW5kZXhdO1xuICAgICAgY29uc3QgYlNvdXJjZSA9IGFUb0JtYXBwaW5nLm9yaWdpbmFsU291cmNlO1xuICAgICAgaWYgKGJTb3VyY2UuZmxhdHRlbmVkTWFwcGluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIFRoZSBiIHNvdXJjZSBmaWxlIGhhcyBubyBtYXBwaW5ncyBvZiBpdHMgb3duIChpLmUuIGl0IGlzIGEgcHVyZSBvcmlnaW5hbCBmaWxlKVxuICAgICAgICAvLyBzbyBqdXN0IHVzZSB0aGUgbWFwcGluZyBhcy1pcy5cbiAgICAgICAgZmxhdHRlbmVkTWFwcGluZ3MucHVzaChhVG9CbWFwcGluZyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgYGluY29taW5nU3RhcnRgIGFuZCBgaW5jb21pbmdFbmRgIGFyZSB0aGUgYFNlZ21lbnRNYXJrZXJgcyBpbiBgQmAgdGhhdCByZXByZXNlbnQgdGhlXG4gICAgICAvLyBzZWN0aW9uIG9mIGBCYCBzb3VyY2UgZmlsZSB0aGF0IGlzIGJlaW5nIG1hcHBlZCB0byBieSB0aGUgY3VycmVudCBgYVRvQm1hcHBpbmdgLlxuICAgICAgLy9cbiAgICAgIC8vIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgbWFwcGluZ3MgZnJvbSBBIHRvIEI6XG4gICAgICAvL1xuICAgICAgLy8gc3JjIEEgICBzcmMgQiAgICAgbWFwcGluZ1xuICAgICAgLy9cbiAgICAgIC8vICAgYSAtLS0tLSBhICAgICAgIFswLCAwXVxuICAgICAgLy8gICBiICAgICAgIGJcbiAgICAgIC8vICAgZiAtICAvLSBjICAgICAgIFs0LCAyXVxuICAgICAgLy8gICBnICBcXCAvICBkXG4gICAgICAvLyAgIGMgLS9cXCAgIGVcbiAgICAgIC8vICAgZCAgICBcXC0gZiAgICAgICBbMiwgNV1cbiAgICAgIC8vICAgZVxuICAgICAgLy9cbiAgICAgIC8vIEZvciBtYXBwaW5nIFswLDBdIHRoZSBpbmNvbWluZyBzdGFydCBhbmQgZW5kIGFyZSAwIGFuZCAyIChpLmUuIHRoZSByYW5nZSBhLCBiLCBjKVxuICAgICAgLy8gRm9yIG1hcHBpbmcgWzQsMl0gdGhlIGluY29taW5nIHN0YXJ0IGFuZCBlbmQgYXJlIDIgYW5kIDUgKGkuZS4gdGhlIHJhbmdlIGMsIGQsIGUsIGYpXG4gICAgICAvL1xuICAgICAgY29uc3QgaW5jb21pbmdTdGFydCA9IGFUb0JtYXBwaW5nLm9yaWdpbmFsU2VnbWVudDtcbiAgICAgIGNvbnN0IGluY29taW5nRW5kID0gaW5jb21pbmdTdGFydC5uZXh0O1xuXG4gICAgICAvLyBUaGUgYG91dGdvaW5nU3RhcnRJbmRleGAgYW5kIGBvdXRnb2luZ0VuZEluZGV4YCBhcmUgdGhlIGluZGljZXMgb2YgdGhlIHJhbmdlIG9mIG1hcHBpbmdzXG4gICAgICAvLyB0aGF0IGxlYXZlIGBiYCB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluIG1lcmdpbmcgd2l0aCB0aGUgYVRvQm1hcHBpbmcuXG4gICAgICAvLyBXZSBhY3R1YWxseSBjYXJlIGFib3V0IGFsbCB0aGUgbWFya2VycyBmcm9tIHRoZSBsYXN0IGJUb0NtYXBwaW5nIGRpcmVjdGx5IGJlZm9yZSB0aGVcbiAgICAgIC8vIGBpbmNvbWluZ1N0YXJ0YCB0byB0aGUgbGFzdCBiVG9DbWFwaW5nIGRpcmVjdGx5IGJlZm9yZSB0aGUgYGluY29taW5nRW5kYCwgaW5jbHVzaXZlLlxuICAgICAgLy9cbiAgICAgIC8vIEZvciBleGFtcGxlLCBpZiB3ZSBjb25zaWRlciB0aGUgcmFuZ2UgMiB0byA1IGZyb20gYWJvdmUgKGkuZS4gYywgZCwgZSwgZikgd2l0aCB0aGVcbiAgICAgIC8vIGZvbGxvd2luZyBtYXBwaW5ncyBmcm9tIEIgdG8gQzpcbiAgICAgIC8vXG4gICAgICAvLyAgIHNyYyBCICAgc3JjIEMgICAgIG1hcHBpbmdcbiAgICAgIC8vICAgICBhXG4gICAgICAvLyAgICAgYiAtLS0tLSBiICAgICAgIFsxLCAwXVxuICAgICAgLy8gICAtIGMgICAgICAgY1xuICAgICAgLy8gIHwgIGQgICAgICAgZFxuICAgICAgLy8gIHwgIGUgLS0tLS0gMSAgICAgICBbNCwgM11cbiAgICAgIC8vICAgLSBmICBcXCAgICAyXG4gICAgICAvLyAgICAgICAgIFxcICAgM1xuICAgICAgLy8gICAgICAgICAgXFwtIGUgICAgICAgWzQsIDZdXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHJhbmdlIHdpdGggYGluY29taW5nU3RhcnRgIGF0IDIgYW5kIGBpbmNvbWluZ0VuZGAgYXQgNSBoYXMgb3V0Z29pbmcgc3RhcnQgbWFwcGluZyBvZlxuICAgICAgLy8gWzEsMF0gYW5kIG91dGdvaW5nIGVuZCBtYXBwaW5nIG9mIFs0LCA2XSwgd2hpY2ggYWxzbyBpbmNsdWRlcyBbNCwgM10uXG4gICAgICAvL1xuICAgICAgbGV0IG91dGdvaW5nU3RhcnRJbmRleCA9XG4gICAgICAgICAgZmluZExhc3RNYXBwaW5nSW5kZXhCZWZvcmUoYlNvdXJjZS5mbGF0dGVuZWRNYXBwaW5ncywgaW5jb21pbmdTdGFydCwgZmFsc2UsIDApO1xuICAgICAgaWYgKG91dGdvaW5nU3RhcnRJbmRleCA8IDApIHtcbiAgICAgICAgb3V0Z29pbmdTdGFydEluZGV4ID0gMDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG91dGdvaW5nRW5kSW5kZXggPSBpbmNvbWluZ0VuZCAhPT0gdW5kZWZpbmVkID9cbiAgICAgICAgICBmaW5kTGFzdE1hcHBpbmdJbmRleEJlZm9yZShcbiAgICAgICAgICAgICAgYlNvdXJjZS5mbGF0dGVuZWRNYXBwaW5ncywgaW5jb21pbmdFbmQsIHRydWUsIG91dGdvaW5nU3RhcnRJbmRleCkgOlxuICAgICAgICAgIGJTb3VyY2UuZmxhdHRlbmVkTWFwcGluZ3MubGVuZ3RoIC0gMTtcblxuICAgICAgZm9yIChsZXQgYlRvQ21hcHBpbmdJbmRleCA9IG91dGdvaW5nU3RhcnRJbmRleDsgYlRvQ21hcHBpbmdJbmRleCA8PSBvdXRnb2luZ0VuZEluZGV4O1xuICAgICAgICAgICBiVG9DbWFwcGluZ0luZGV4KyspIHtcbiAgICAgICAgY29uc3QgYlRvQ21hcHBpbmc6IE1hcHBpbmcgPSBiU291cmNlLmZsYXR0ZW5lZE1hcHBpbmdzW2JUb0NtYXBwaW5nSW5kZXhdO1xuICAgICAgICBmbGF0dGVuZWRNYXBwaW5ncy5wdXNoKG1lcmdlTWFwcGluZ3ModGhpcywgYVRvQm1hcHBpbmcsIGJUb0NtYXBwaW5nKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmbGF0dGVuZWRNYXBwaW5ncztcbiAgfVxufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gbWFwcGluZ3MgVGhlIGNvbGxlY3Rpb24gb2YgbWFwcGluZ3Mgd2hvc2Ugc2VnbWVudC1tYXJrZXJzIHdlIGFyZSBzZWFyY2hpbmcuXG4gKiBAcGFyYW0gbWFya2VyIFRoZSBzZWdtZW50LW1hcmtlciB0byBtYXRjaCBhZ2FpbnN0IHRob3NlIG9mIHRoZSBnaXZlbiBgbWFwcGluZ3NgLlxuICogQHBhcmFtIGV4Y2x1c2l2ZSBJZiBleGNsdXNpdmUgdGhlbiB3ZSBtdXN0IGZpbmQgYSBtYXBwaW5nIHdpdGggYSBzZWdtZW50LW1hcmtlciB0aGF0IGlzXG4gKiBleGNsdXNpdmVseSBlYXJsaWVyIHRoYW4gdGhlIGdpdmVuIGBtYXJrZXJgLlxuICogSWYgbm90IGV4Y2x1c2l2ZSB0aGVuIHdlIGNhbiByZXR1cm4gdGhlIGhpZ2hlc3QgbWFwcGluZ3Mgd2l0aCBhbiBlcXVpdmFsZW50IHNlZ21lbnQtbWFya2VyIHRvIHRoZVxuICogZ2l2ZW4gYG1hcmtlcmAuXG4gKiBAcGFyYW0gbG93ZXJJbmRleCBJZiBwcm92aWRlZCwgdGhpcyBpcyB1c2VkIGFzIGEgaGludCB0aGF0IHRoZSBtYXJrZXIgd2UgYXJlIHNlYXJjaGluZyBmb3IgaGFzIGFuXG4gKiBpbmRleCB0aGF0IGlzIG5vIGxvd2VyIHRoYW4gdGhpcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0TWFwcGluZ0luZGV4QmVmb3JlKFxuICAgIG1hcHBpbmdzOiBNYXBwaW5nW10sIG1hcmtlcjogU2VnbWVudE1hcmtlciwgZXhjbHVzaXZlOiBib29sZWFuLCBsb3dlckluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgdXBwZXJJbmRleCA9IG1hcHBpbmdzLmxlbmd0aCAtIDE7XG4gIGNvbnN0IHRlc3QgPSBleGNsdXNpdmUgPyAtMSA6IDA7XG5cbiAgaWYgKGNvbXBhcmVTZWdtZW50cyhtYXBwaW5nc1tsb3dlckluZGV4XS5nZW5lcmF0ZWRTZWdtZW50LCBtYXJrZXIpID4gdGVzdCkge1xuICAgIC8vIEV4aXQgZWFybHkgc2luY2UgdGhlIG1hcmtlciBpcyBvdXRzaWRlIHRoZSBhbGxvd2VkIHJhbmdlIG9mIG1hcHBpbmdzLlxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIGxldCBtYXRjaGluZ0luZGV4ID0gLTE7XG4gIHdoaWxlIChsb3dlckluZGV4IDw9IHVwcGVySW5kZXgpIHtcbiAgICBjb25zdCBpbmRleCA9ICh1cHBlckluZGV4ICsgbG93ZXJJbmRleCkgPj4gMTtcbiAgICBpZiAoY29tcGFyZVNlZ21lbnRzKG1hcHBpbmdzW2luZGV4XS5nZW5lcmF0ZWRTZWdtZW50LCBtYXJrZXIpIDw9IHRlc3QpIHtcbiAgICAgIG1hdGNoaW5nSW5kZXggPSBpbmRleDtcbiAgICAgIGxvd2VySW5kZXggPSBpbmRleCArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwcGVySW5kZXggPSBpbmRleCAtIDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXRjaGluZ0luZGV4O1xufVxuXG4vKipcbiAqIEEgTWFwcGluZyBjb25zaXN0cyBvZiB0d28gc2VnbWVudCBtYXJrZXJzOiBvbmUgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UgYW5kIG9uZSBpbiB0aGUgb3JpZ2luYWxcbiAqIHNvdXJjZSwgd2hpY2ggaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGVhY2ggc2VnbWVudC4gVGhlIGVuZCBvZiBhIHNlZ21lbnQgaXMgaW5kaWNhdGVkIGJ5IHRoZSBmaXJzdFxuICogc2VnbWVudCBtYXJrZXIgb2YgYW5vdGhlciBtYXBwaW5nIHdob3NlIHN0YXJ0IGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhpcyBvbmUuXG4gKlxuICogSXQgbWF5IGFsc28gaW5jbHVkZSBhIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWdtZW50IGJlaW5nIG1hcHBlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXBwaW5nIHtcbiAgcmVhZG9ubHkgZ2VuZXJhdGVkU2VnbWVudDogU2VnbWVudE1hcmtlcjtcbiAgcmVhZG9ubHkgb3JpZ2luYWxTb3VyY2U6IFNvdXJjZUZpbGU7XG4gIHJlYWRvbmx5IG9yaWdpbmFsU2VnbWVudDogU2VnbWVudE1hcmtlcjtcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbn1cblxuXG5cbi8qKlxuICogTWVyZ2UgdHdvIG1hcHBpbmdzIHRoYXQgZ28gZnJvbSBBIHRvIEIgYW5kIEIgdG8gQywgdG8gcmVzdWx0IGluIGEgbWFwcGluZyB0aGF0IGdvZXMgZnJvbSBBIHRvIEMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZU1hcHBpbmdzKGdlbmVyYXRlZFNvdXJjZTogU291cmNlRmlsZSwgYWI6IE1hcHBpbmcsIGJjOiBNYXBwaW5nKTogTWFwcGluZyB7XG4gIGNvbnN0IG5hbWUgPSBiYy5uYW1lIHx8IGFiLm5hbWU7XG5cbiAgLy8gV2UgbmVlZCB0byBtb2RpZnkgdGhlIHNlZ21lbnQtbWFya2VycyBvZiB0aGUgbmV3IG1hcHBpbmcgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIHNoaWZ0cyB0aGF0XG4gIC8vIG9jY3VyIGR1ZSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIHR3byBtYXBwaW5ncy5cbiAgLy8gRm9yIGV4YW1wbGU6XG5cbiAgLy8gKiBTaW1wbGUgbWFwIHdoZXJlIHRoZSBCLT5DIHN0YXJ0cyBhdCB0aGUgc2FtZSBwbGFjZSB0aGUgQS0+QiBlbmRzOlxuICAvL1xuICAvLyBgYGBcbiAgLy8gQTogMSAyIGIgYyBkXG4gIC8vICAgICAgICB8ICAgICAgICBBLT5CIFsyLDBdXG4gIC8vICAgICAgICB8ICAgICAgICAgICAgICB8XG4gIC8vIEI6ICAgICBiIGMgZCAgICBBLT5DIFsyLDFdXG4gIC8vICAgICAgICB8ICAgICAgICAgICAgICAgIHxcbiAgLy8gICAgICAgIHwgICAgICAgIEItPkMgWzAsMV1cbiAgLy8gQzogICBhIGIgYyBkIGVcbiAgLy8gYGBgXG5cbiAgLy8gKiBNb3JlIGNvbXBsaWNhdGVkIGNhc2Ugd2hlcmUgZGlmZnMgb2Ygc2VnbWVudC1tYXJrZXJzIGlzIG5lZWRlZDpcbiAgLy9cbiAgLy8gYGBgXG4gIC8vIEE6IGIgMSAyIGMgZFxuICAvLyAgICAgXFxcbiAgLy8gICAgICB8ICAgICAgICAgICAgQS0+QiAgWzAsMSpdICAgIFswLDEqXVxuICAvLyAgICAgIHwgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwrM1xuICAvLyBCOiBhIGIgMSAyIGMgZCAgICBBLT5DICBbMCwxXSAgICAgWzMsMl1cbiAgLy8gICAgfCAgICAgIC8gICAgICAgICAgICAgICAgfCsxICAgICAgIHxcbiAgLy8gICAgfCAgICAgLyAgICAgICAgQi0+QyBbMCosMF0gICAgWzQqLDJdXG4gIC8vICAgIHwgICAgL1xuICAvLyBDOiBhIGIgYyBkIGVcbiAgLy8gYGBgXG4gIC8vXG4gIC8vIGBbMCwxXWAgbWFwcGluZyBmcm9tIEEtPkM6XG4gIC8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIFwib3JpZ2luYWwgc2VnbWVudC1tYXJrZXJcIiBvZiBBLT5CICgxKikgYW5kIHRoZSBcImdlbmVyYXRlZFxuICAvLyBzZWdtZW50LW1hcmtlciBvZiBCLT5DICgwKik6IGAxIC0gMCA9ICsxYC5cbiAgLy8gU2luY2UgaXQgaXMgcG9zaXRpdmUgd2UgbXVzdCBpbmNyZW1lbnQgdGhlIFwib3JpZ2luYWwgc2VnbWVudC1tYXJrZXJcIiB3aXRoIGAxYCB0byBnaXZlIFswLDFdLlxuICAvL1xuICAvLyBgWzMsMl1gIG1hcHBpbmcgZnJvbSBBLT5DOlxuICAvLyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBcIm9yaWdpbmFsIHNlZ21lbnQtbWFya2VyXCIgb2YgQS0+QiAoMSopIGFuZCB0aGUgXCJnZW5lcmF0ZWRcbiAgLy8gc2VnbWVudC1tYXJrZXJcIiBvZiBCLT5DICg0Kik6IGAxIC0gNCA9IC0zYC5cbiAgLy8gU2luY2UgaXQgaXMgbmVnYXRpdmUgd2UgbXVzdCBpbmNyZW1lbnQgdGhlIFwiZ2VuZXJhdGVkIHNlZ21lbnQtbWFya2VyXCIgd2l0aCBgM2AgdG8gZ2l2ZSBbMywyXS5cblxuICBjb25zdCBkaWZmID0gY29tcGFyZVNlZ21lbnRzKGJjLmdlbmVyYXRlZFNlZ21lbnQsIGFiLm9yaWdpbmFsU2VnbWVudCk7XG4gIGlmIChkaWZmID4gMCkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgZ2VuZXJhdGVkU2VnbWVudDpcbiAgICAgICAgICBvZmZzZXRTZWdtZW50KGdlbmVyYXRlZFNvdXJjZS5zdGFydE9mTGluZVBvc2l0aW9ucywgYWIuZ2VuZXJhdGVkU2VnbWVudCwgZGlmZiksXG4gICAgICBvcmlnaW5hbFNvdXJjZTogYmMub3JpZ2luYWxTb3VyY2UsXG4gICAgICBvcmlnaW5hbFNlZ21lbnQ6IGJjLm9yaWdpbmFsU2VnbWVudCxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgZ2VuZXJhdGVkU2VnbWVudDogYWIuZ2VuZXJhdGVkU2VnbWVudCxcbiAgICAgIG9yaWdpbmFsU291cmNlOiBiYy5vcmlnaW5hbFNvdXJjZSxcbiAgICAgIG9yaWdpbmFsU2VnbWVudDpcbiAgICAgICAgICBvZmZzZXRTZWdtZW50KGJjLm9yaWdpbmFsU291cmNlLnN0YXJ0T2ZMaW5lUG9zaXRpb25zLCBiYy5vcmlnaW5hbFNlZ21lbnQsIC1kaWZmKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIGByYXdNYXBwaW5nc2AgaW50byBhbiBhcnJheSBvZiBwYXJzZWQgbWFwcGluZ3MsIHdoaWNoIHJlZmVyZW5jZSBzb3VyY2UtZmlsZXMgcHJvdmlkZWRcbiAqIGluIHRoZSBgc291cmNlc2AgcGFyYW1ldGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNYXBwaW5ncyhcbiAgICByYXdNYXA6IFJhd1NvdXJjZU1hcHxudWxsLCBzb3VyY2VzOiAoU291cmNlRmlsZXxudWxsKVtdLFxuICAgIGdlbmVyYXRlZFNvdXJjZVN0YXJ0T2ZMaW5lUG9zaXRpb25zOiBudW1iZXJbXSk6IE1hcHBpbmdbXSB7XG4gIGlmIChyYXdNYXAgPT09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCByYXdNYXBwaW5ncyA9IGRlY29kZShyYXdNYXAubWFwcGluZ3MpO1xuICBpZiAocmF3TWFwcGluZ3MgPT09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBtYXBwaW5nczogTWFwcGluZ1tdID0gW107XG4gIGZvciAobGV0IGdlbmVyYXRlZExpbmUgPSAwOyBnZW5lcmF0ZWRMaW5lIDwgcmF3TWFwcGluZ3MubGVuZ3RoOyBnZW5lcmF0ZWRMaW5lKyspIHtcbiAgICBjb25zdCBnZW5lcmF0ZWRMaW5lTWFwcGluZ3MgPSByYXdNYXBwaW5nc1tnZW5lcmF0ZWRMaW5lXTtcbiAgICBmb3IgKGNvbnN0IHJhd01hcHBpbmcgb2YgZ2VuZXJhdGVkTGluZU1hcHBpbmdzKSB7XG4gICAgICBpZiAocmF3TWFwcGluZy5sZW5ndGggPj0gNCkge1xuICAgICAgICBjb25zdCBvcmlnaW5hbFNvdXJjZSA9IHNvdXJjZXNbcmF3TWFwcGluZ1sxXSFdO1xuICAgICAgICBpZiAob3JpZ2luYWxTb3VyY2UgPT09IG51bGwgfHwgb3JpZ2luYWxTb3VyY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIHRoZSBvcmlnaW5hbCBzb3VyY2UgaXMgbWlzc2luZyBzbyBpZ25vcmUgdGhpcyBtYXBwaW5nXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkQ29sdW1uID0gcmF3TWFwcGluZ1swXTtcbiAgICAgICAgY29uc3QgbmFtZSA9IHJhd01hcHBpbmcubGVuZ3RoID09PSA1ID8gcmF3TWFwLm5hbWVzW3Jhd01hcHBpbmdbNF1dIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBsaW5lID0gcmF3TWFwcGluZ1syXSE7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHJhd01hcHBpbmdbM10hO1xuICAgICAgICBjb25zdCBnZW5lcmF0ZWRTZWdtZW50OiBTZWdtZW50TWFya2VyID0ge1xuICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZExpbmUsXG4gICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWRDb2x1bW4sXG4gICAgICAgICAgcG9zaXRpb246IGdlbmVyYXRlZFNvdXJjZVN0YXJ0T2ZMaW5lUG9zaXRpb25zW2dlbmVyYXRlZExpbmVdICsgZ2VuZXJhdGVkQ29sdW1uLFxuICAgICAgICAgIG5leHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxTZWdtZW50OiBTZWdtZW50TWFya2VyID0ge1xuICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIHBvc2l0aW9uOiBvcmlnaW5hbFNvdXJjZS5zdGFydE9mTGluZVBvc2l0aW9uc1tsaW5lXSArIGNvbHVtbixcbiAgICAgICAgICBuZXh0OiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICAgIG1hcHBpbmdzLnB1c2goe25hbWUsIGdlbmVyYXRlZFNlZ21lbnQsIG9yaWdpbmFsU2VnbWVudCwgb3JpZ2luYWxTb3VyY2V9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hcHBpbmdzO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdGhlIHNlZ21lbnQgbWFya2VycyBmcm9tIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMgaW4gZWFjaCBtYXBwaW5nIG9mIGFuIGFycmF5IG9mXG4gKiBgbWFwcGluZ3NgLlxuICpcbiAqIEBwYXJhbSBtYXBwaW5ncyBUaGUgbWFwcGluZ3Mgd2hvc2Ugb3JpZ2luYWwgc2VnbWVudHMgd2Ugd2FudCB0byBleHRyYWN0XG4gKiBAcmV0dXJucyBSZXR1cm4gYSBtYXAgZnJvbSBvcmlnaW5hbCBzb3VyY2UtZmlsZXMgKHJlZmVyZW5jZWQgaW4gdGhlIGBtYXBwaW5nc2ApIHRvIGFycmF5cyBvZlxuICogc2VnbWVudC1tYXJrZXJzIHNvcnRlZCBieSB0aGVpciBvcmRlciBpbiB0aGVpciBzb3VyY2UgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RPcmlnaW5hbFNlZ21lbnRzKG1hcHBpbmdzOiBNYXBwaW5nW10pOiBNYXA8U291cmNlRmlsZSwgU2VnbWVudE1hcmtlcltdPiB7XG4gIGNvbnN0IG9yaWdpbmFsU2VnbWVudHMgPSBuZXcgTWFwPFNvdXJjZUZpbGUsIFNlZ21lbnRNYXJrZXJbXT4oKTtcbiAgZm9yIChjb25zdCBtYXBwaW5nIG9mIG1hcHBpbmdzKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxTb3VyY2UgPSBtYXBwaW5nLm9yaWdpbmFsU291cmNlO1xuICAgIGlmICghb3JpZ2luYWxTZWdtZW50cy5oYXMob3JpZ2luYWxTb3VyY2UpKSB7XG4gICAgICBvcmlnaW5hbFNlZ21lbnRzLnNldChvcmlnaW5hbFNvdXJjZSwgW10pO1xuICAgIH1cbiAgICBjb25zdCBzZWdtZW50cyA9IG9yaWdpbmFsU2VnbWVudHMuZ2V0KG9yaWdpbmFsU291cmNlKSE7XG4gICAgc2VnbWVudHMucHVzaChtYXBwaW5nLm9yaWdpbmFsU2VnbWVudCk7XG4gIH1cbiAgb3JpZ2luYWxTZWdtZW50cy5mb3JFYWNoKHNlZ21lbnRNYXJrZXJzID0+IHNlZ21lbnRNYXJrZXJzLnNvcnQoY29tcGFyZVNlZ21lbnRzKSk7XG4gIHJldHVybiBvcmlnaW5hbFNlZ21lbnRzO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgb3JpZ2luYWwgc2VnbWVudHMgb2YgZWFjaCBvZiB0aGUgZ2l2ZW4gYG1hcHBpbmdzYCB0byBpbmNsdWRlIGEgbGluayB0byB0aGUgbmV4dFxuICogc2VnbWVudCBpbiB0aGUgc291cmNlIGZpbGUuXG4gKlxuICogQHBhcmFtIG1hcHBpbmdzIHRoZSBtYXBwaW5ncyB3aG9zZSBzZWdtZW50cyBzaG91bGQgYmUgdXBkYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlT3JpZ2luYWxTZWdtZW50TGlua3MobWFwcGluZ3M6IE1hcHBpbmdbXSk6IHZvaWQge1xuICBjb25zdCBzZWdtZW50c0J5U291cmNlID0gZXh0cmFjdE9yaWdpbmFsU2VnbWVudHMobWFwcGluZ3MpO1xuICBzZWdtZW50c0J5U291cmNlLmZvckVhY2gobWFya2VycyA9PiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgbWFya2Vyc1tpXS5uZXh0ID0gbWFya2Vyc1tpICsgMV07XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTdGFydE9mTGluZVBvc2l0aW9ucyhzdHI6IHN0cmluZykge1xuICAvLyBUaGUgYDFgIGlzIHRvIGluZGljYXRlIGEgbmV3bGluZSBjaGFyYWN0ZXIgYmV0d2VlbiB0aGUgbGluZXMuXG4gIC8vIE5vdGUgdGhhdCBpbiB0aGUgYWN0dWFsIGNvbnRlbnRzIHRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyIHRoYXQgaW5kaWNhdGVzIGFcbiAgLy8gbmV3bGluZVxuICAvLyAtIGUuZy4gXFxyXFxuIC0gYnV0IHRoYXQgaXMgbm90IGltcG9ydGFudCBoZXJlIHNpbmNlIHNlZ21lbnQtbWFya2VycyBhcmUgaW4gbGluZS9jb2x1bW4gcGFpcnMgYW5kXG4gIC8vIHNvIGRpZmZlcmVuY2VzIGluIGxlbmd0aCBkdWUgdG8gZXh0cmEgYFxccmAgY2hhcmFjdGVycyBkbyBub3QgYWZmZWN0IHRoZSBhbGdvcml0aG1zLlxuICBjb25zdCBORVdMSU5FX01BUktFUl9PRkZTRVQgPSAxO1xuICBjb25zdCBsaW5lTGVuZ3RocyA9IGNvbXB1dGVMaW5lTGVuZ3RocyhzdHIpO1xuICBjb25zdCBzdGFydFBvc2l0aW9ucyA9IFswXTsgIC8vIEZpcnN0IGxpbmUgc3RhcnRzIGF0IHBvc2l0aW9uIDBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lTGVuZ3Rocy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBzdGFydFBvc2l0aW9ucy5wdXNoKHN0YXJ0UG9zaXRpb25zW2ldICsgbGluZUxlbmd0aHNbaV0gKyBORVdMSU5FX01BUktFUl9PRkZTRVQpO1xuICB9XG4gIHJldHVybiBzdGFydFBvc2l0aW9ucztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUxpbmVMZW5ndGhzKHN0cjogc3RyaW5nKTogbnVtYmVyW10ge1xuICByZXR1cm4gKHN0ci5zcGxpdCgvXFxuLykpLm1hcChzID0+IHMubGVuZ3RoKTtcbn1cblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgbWFwcGluZ3MgYmV0d2VlbiBga2V5c2AgYW5kIGB2YWx1ZXNgIHN0b3JlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGtleXMgYXJlXG4gKiBmaXJzdCBzZWVuLlxuICpcbiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgYSBzdGFuZGFyZCBgTWFwYCBpcyB0aGF0IHdoZW4geW91IGFkZCBhIGtleS12YWx1ZSBwYWlyIHRoZSBpbmRleFxuICogb2YgdGhlIGBrZXlgIGlzIHJldHVybmVkLlxuICovXG5jbGFzcyBJbmRleGVkTWFwPEssIFY+IHtcbiAgcHJpdmF0ZSBtYXAgPSBuZXcgTWFwPEssIG51bWJlcj4oKTtcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2Yga2V5cyBhZGRlZCB0byB0aGlzIG1hcC5cbiAgICpcbiAgICogVGhpcyBhcnJheSBpcyBndWFyYW50ZWVkIHRvIGJlIGluIHRoZSBvcmRlciBvZiB0aGUgZmlyc3QgdGltZSB0aGUga2V5IHdhcyBhZGRlZCB0byB0aGUgbWFwLlxuICAgKi9cbiAgcmVhZG9ubHkga2V5czogS1tdID0gW107XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHZhbHVlcyBhZGRlZCB0byB0aGlzIG1hcC5cbiAgICpcbiAgICogVGhpcyBhcnJheSBpcyBndWFyYW50ZWVkIHRvIGJlIGluIHRoZSBvcmRlciBvZiB0aGUgZmlyc3QgdGltZSB0aGUgYXNzb2NpYXRlZCBrZXkgd2FzIGFkZGVkIHRvXG4gICAqIHRoZSBtYXAuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM6IFZbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBBc3NvY2lhdGUgdGhlIGB2YWx1ZWAgd2l0aCB0aGUgYGtleWAgYW5kIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGtleSBpbiB0aGUgY29sbGVjdGlvbi5cbiAgICpcbiAgICogSWYgdGhlIGBrZXlgIGFscmVhZHkgZXhpc3RzIHRoZW4gdGhlIGB2YWx1ZWAgaXMgbm90IHNldCBhbmQgdGhlIGluZGV4IG9mIHRoYXQgYGtleWAgaXNcbiAgICogcmV0dXJuZWQ7IG90aGVyd2lzZSB0aGUgYGtleWAgYW5kIGB2YWx1ZWAgYXJlIHN0b3JlZCBhbmQgdGhlIGluZGV4IG9mIHRoZSBuZXcgYGtleWAgaXNcbiAgICogcmV0dXJuZWQuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBhc3NvY2lhdGVkIHdpdGggdGhlIGB2YWx1ZWAuXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYXNzb2NpYXRlZCB3aXRoIHRoZSBga2V5YC5cbiAgICogQHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBga2V5YCBpbiB0aGUgYGtleXNgIGFycmF5LlxuICAgKi9cbiAgc2V0KGtleTogSywgdmFsdWU6IFYpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLm1hcC5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChrZXkpITtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnZhbHVlcy5wdXNoKHZhbHVlKSAtIDE7XG4gICAgdGhpcy5rZXlzLnB1c2goa2V5KTtcbiAgICB0aGlzLm1hcC5zZXQoa2V5LCBpbmRleCk7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGB2YWx1ZXNgIHN0b3JlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIGFkZGVkLlxuICpcbiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgYSBzdGFuZGFyZCBgU2V0YCBpcyB0aGF0IHdoZW4geW91IGFkZCBhIHZhbHVlIHRoZSBpbmRleCBvZiB0aGF0XG4gKiBpdGVtIGlzIHJldHVybmVkLlxuICovXG5jbGFzcyBJbmRleGVkU2V0PFY+IHtcbiAgcHJpdmF0ZSBtYXAgPSBuZXcgTWFwPFYsIG51bWJlcj4oKTtcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgdmFsdWVzIGFkZGVkIHRvIHRoaXMgc2V0LlxuICAgKiBUaGlzIGFycmF5IGlzIGd1YXJhbnRlZWQgdG8gYmUgaW4gdGhlIG9yZGVyIG9mIHRoZSBmaXJzdCB0aW1lIHRoZSB2YWx1ZSB3YXMgYWRkZWQgdG8gdGhlIHNldC5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlczogVltdID0gW107XG5cbiAgLyoqXG4gICAqIEFkZCB0aGUgYHZhbHVlYCB0byB0aGUgYHZhbHVlc2AgYXJyYXksIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdDsgcmV0dXJuaW5nIHRoZSBpbmRleCBvZiB0aGVcbiAgICogYHZhbHVlYCBpbiB0aGUgYHZhbHVlc2AgYXJyYXkuXG4gICAqXG4gICAqIElmIHRoZSBgdmFsdWVgIGFscmVhZHkgZXhpc3RzIHRoZW4gdGhlIGluZGV4IG9mIHRoYXQgYHZhbHVlYCBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIHRoZSBuZXdcbiAgICogYHZhbHVlYCBpcyBzdG9yZWQgYW5kIHRoZSBuZXcgaW5kZXggcmV0dXJuZWQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYWRkIHRvIHRoZSBzZXQuXG4gICAqIEByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgYHZhbHVlYCBpbiB0aGUgYHZhbHVlc2AgYXJyYXkuXG4gICAqL1xuICBhZGQodmFsdWU6IFYpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLm1hcC5oYXModmFsdWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KHZhbHVlKSE7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy52YWx1ZXMucHVzaCh2YWx1ZSkgLSAxO1xuICAgIHRoaXMubWFwLnNldCh2YWx1ZSwgaW5kZXgpO1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxufVxuXG5jbGFzcyBDYWNoZTxJbnB1dCwgQ2FjaGVkPiB7XG4gIHByaXZhdGUgbWFwID0gbmV3IE1hcDxJbnB1dCwgQ2FjaGVkPigpO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbXB1dGVGbjogKGlucHV0OiBJbnB1dCkgPT4gQ2FjaGVkKSB7fVxuICBnZXQoaW5wdXQ6IElucHV0KTogQ2FjaGVkIHtcbiAgICBpZiAoIXRoaXMubWFwLmhhcyhpbnB1dCkpIHtcbiAgICAgIHRoaXMubWFwLnNldChpbnB1dCwgdGhpcy5jb21wdXRlRm4oaW5wdXQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldChpbnB1dCkhO1xuICB9XG59XG4iXX0=
|
|
519
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlX2ZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci1jbGkvc3JjL25ndHNjL3NvdXJjZW1hcHMvc3JjL3NvdXJjZV9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7SUFBQTs7Ozs7O09BTUc7SUFDSCx5REFBeUU7SUFDekUsbURBQW9GO0lBS3BGLGdHQUErRTtJQUUvRSxTQUFnQix1QkFBdUIsQ0FBQyxRQUFnQjtRQUN0RCxPQUFPLDBDQUFxQixDQUFDLG1DQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFGRCwwREFFQztJQUVEO1FBV0U7UUFDSSxvQ0FBb0M7UUFDM0IsVUFBMEI7UUFDbkMsd0NBQXdDO1FBQy9CLFFBQWdCO1FBQ3pCLGtFQUFrRTtRQUN6RCxNQUEwQjtRQUNuQywwRkFBMEY7UUFDakYsT0FBNEIsRUFDN0IsRUFBb0I7WUFQbkIsZUFBVSxHQUFWLFVBQVUsQ0FBZ0I7WUFFMUIsYUFBUSxHQUFSLFFBQVEsQ0FBUTtZQUVoQixXQUFNLEdBQU4sTUFBTSxDQUFvQjtZQUUxQixZQUFPLEdBQVAsT0FBTyxDQUFxQjtZQUM3QixPQUFFLEdBQUYsRUFBRSxDQUFrQjtZQUU5QixJQUFJLENBQUMsUUFBUSxHQUFHLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxvQkFBb0IsR0FBRywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNsRCxDQUFDO1FBRUQ7O1dBRUc7UUFDSCw2Q0FBd0IsR0FBeEI7O1lBQUEsaUJBMkNDO1lBMUNDLElBQU0sT0FBTyxHQUFHLElBQUksVUFBVSxFQUFr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QU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNILGlCQUFDO0lBQUQsQ0FBQyxBQTNCRCxJQTJCQztJQUVEO1FBRUUsZUFBb0IsU0FBbUM7WUFBbkMsY0FBUyxHQUFULFNBQVMsQ0FBMEI7WUFEL0MsUUFBRyxHQUFHLElBQUksR0FBRyxFQUFpQixDQUFDO1FBQ21CLENBQUM7UUFDM0QsbUJBQUcsR0FBSCxVQUFJLEtBQVk7WUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDNUM7WUFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBRSxDQUFDO1FBQzlCLENBQUM7UUFDSCxZQUFDO0lBQUQsQ0FBQyxBQVRELElBU0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmltcG9ydCB7cmVtb3ZlQ29tbWVudHMsIHJlbW92ZU1hcEZpbGVDb21tZW50c30gZnJvbSAnY29udmVydC1zb3VyY2UtbWFwJztcbmltcG9ydCB7ZGVjb2RlLCBlbmNvZGUsIFNvdXJjZU1hcE1hcHBpbmdzLCBTb3VyY2VNYXBTZWdtZW50fSBmcm9tICdzb3VyY2VtYXAtY29kZWMnO1xuXG5pbXBvcnQge0Fic29sdXRlRnNQYXRoLCBQYXRoTWFuaXB1bGF0aW9ufSBmcm9tICcuLi8uLi9maWxlX3N5c3RlbSc7XG5cbmltcG9ydCB7UmF3U291cmNlTWFwLCBTb3VyY2VNYXBJbmZvfSBmcm9tICcuL3Jhd19zb3VyY2VfbWFwJztcbmltcG9ydCB7Y29tcGFyZVNlZ21lbnRzLCBvZmZzZXRTZWdtZW50LCBTZWdtZW50TWFya2VyfSBmcm9tICcuL3NlZ21lbnRfbWFya2VyJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVNvdXJjZU1hcENvbW1lbnRzKGNvbnRlbnRzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVtb3ZlTWFwRmlsZUNvbW1lbnRzKHJlbW92ZUNvbW1lbnRzKGNvbnRlbnRzKSkucmVwbGFjZSgvXFxuXFxuJC8sICdcXG4nKTtcbn1cblxuZXhwb3J0IGNsYXNzIFNvdXJjZUZpbGUge1xuICAvKipcbiAgICogVGhlIHBhcnNlZCBtYXBwaW5ncyB0aGF0IGhhdmUgYmVlbiBmbGF0dGVuZWQgc28gdGhhdCBhbnkgaW50ZXJtZWRpYXRlIHNvdXJjZSBtYXBwaW5ncyBoYXZlIGJlZW5cbiAgICogZmxhdHRlbmVkLlxuICAgKlxuICAgKiBUaGUgcmVzdWx0IGlzIHRoYXQgYW55IHNvdXJjZSBmaWxlIG1lbnRpb25lZCBpbiB0aGUgZmxhdHRlbmVkIG1hcHBpbmdzIGhhdmUgbm8gc291cmNlIG1hcCAoYXJlXG4gICAqIHB1cmUgb3JpZ2luYWwgc291cmNlIGZpbGVzKS5cbiAgICovXG4gIHJlYWRvbmx5IGZsYXR0ZW5lZE1hcHBpbmdzOiBNYXBwaW5nW107XG4gIHJlYWRvbmx5IHN0YXJ0T2ZMaW5lUG9zaXRpb25zOiBudW1iZXJbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIC8qKiBUaGUgcGF0aCB0byB0aGlzIHNvdXJjZSBmaWxlLiAqL1xuICAgICAgcmVhZG9ubHkgc291cmNlUGF0aDogQWJzb2x1dGVGc1BhdGgsXG4gICAgICAvKiogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc291cmNlIGZpbGUuICovXG4gICAgICByZWFkb25seSBjb250ZW50czogc3RyaW5nLFxuICAgICAgLyoqIFRoZSByYXcgc291cmNlIG1hcCAoaWYgYW55KSByZWZlcmVuY2VkIGJ5IHRoaXMgc291cmNlIGZpbGUuICovXG4gICAgICByZWFkb25seSByYXdNYXA6IFNvdXJjZU1hcEluZm98bnVsbCxcbiAgICAgIC8qKiBBbnkgc291cmNlIGZpbGVzIHJlZmVyZW5jZWQgYnkgdGhlIHJhdyBzb3VyY2UgbWFwIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvdXJjZSBmaWxlLiAqL1xuICAgICAgcmVhZG9ubHkgc291cmNlczogKFNvdXJjZUZpbGV8bnVsbClbXSxcbiAgICAgIHByaXZhdGUgZnM6IFBhdGhNYW5pcHVsYXRpb24sXG4gICkge1xuICAgIHRoaXMuY29udGVudHMgPSByZW1vdmVTb3VyY2VNYXBDb21tZW50cyhjb250ZW50cyk7XG4gICAgdGhpcy5zdGFydE9mTGluZVBvc2l0aW9ucyA9IGNvbXB1dGVTdGFydE9mTGluZVBvc2l0aW9ucyh0aGlzLmNvbnRlbnRzKTtcbiAgICB0aGlzLmZsYXR0ZW5lZE1hcHBpbmdzID0gdGhpcy5mbGF0dGVuTWFwcGluZ3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIHJhdyBzb3VyY2UgbWFwIGdlbmVyYXRlZCBmcm9tIHRoZSBmbGF0dGVuZWQgbWFwcGluZ3MuXG4gICAqL1xuICByZW5kZXJGbGF0dGVuZWRTb3VyY2VNYXAoKTogUmF3U291cmNlTWFwIHtcbiAgICBjb25zdCBzb3VyY2VzID0gbmV3IEluZGV4ZWRNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgY29uc3QgbmFtZXMgPSBuZXcgSW5kZXhlZFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgbWFwcGluZ3M6IFNvdXJjZU1hcE1hcHBpbmdzID0gW107XG4gICAgY29uc3Qgc291cmNlUGF0aERpciA9IHRoaXMuZnMuZGlybmFtZSh0aGlzLnNvdXJjZVBhdGgpO1xuICAgIC8vIENvbXB1dGluZyB0aGUgcmVsYXRpdmUgcGF0aCBjYW4gYmUgZXhwZW5zaXZlLCBhbmQgd2UgYXJlIGxpa2VseSB0byBoYXZlIHRoZSBzYW1lIHBhdGggZm9yXG4gICAgLy8gbWFueSAoaWYgbm90IGFsbCEpIG1hcHBpbmdzLlxuICAgIGNvbnN0IHJlbGF0aXZlU291cmNlUGF0aENhY2hlID1cbiAgICAgICAgbmV3IENhY2hlPHN0cmluZywgc3RyaW5nPihpbnB1dCA9PiB0aGlzLmZzLnJlbGF0aXZlKHNvdXJjZVBhdGhEaXIsIGlucHV0KSk7XG5cbiAgICBmb3IgKGNvbnN0IG1hcHBpbmcgb2YgdGhpcy5mbGF0dGVuZWRNYXBwaW5ncykge1xuICAgICAgY29uc3Qgc291cmNlSW5kZXggPSBzb3VyY2VzLnNldChcbiAgICAgICAgICByZWxhdGl2ZVNvdXJjZVBhdGhDYWNoZS5nZXQobWFwcGluZy5vcmlnaW5hbFNvdXJjZS5zb3VyY2VQYXRoKSxcbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsU291cmNlLmNvbnRlbnRzKTtcbiAgICAgIGNvbnN0IG1hcHBpbmdBcnJheTogU291cmNlTWFwU2VnbWVudCA9IFtcbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRTZWdtZW50LmNvbHVtbixcbiAgICAgICAgc291cmNlSW5kZXgsXG4gICAgICAgIG1hcHBpbmcub3JpZ2luYWxTZWdtZW50LmxpbmUsXG4gICAgICAgIG1hcHBpbmcub3JpZ2luYWxTZWdtZW50LmNvbHVtbixcbiAgICAgIF07XG4gICAgICBpZiAobWFwcGluZy5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbmFtZUluZGV4ID0gbmFtZXMuYWRkKG1hcHBpbmcubmFtZSk7XG4gICAgICAgIG1hcHBpbmdBcnJheS5wdXNoKG5hbWVJbmRleCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVuc3VyZSBhIG1hcHBpbmcgbGluZSBhcnJheSBmb3IgdGhpcyBtYXBwaW5nLlxuICAgICAgY29uc3QgbGluZSA9IG1hcHBpbmcuZ2VuZXJhdGVkU2VnbWVudC5saW5lO1xuICAgICAgd2hpbGUgKGxpbmUgPj0gbWFwcGluZ3MubGVuZ3RoKSB7XG4gICAgICAgIG1hcHBpbmdzLnB1c2goW10pO1xuICAgICAgfVxuICAgICAgLy8gQWRkIHRoaXMgbWFwcGluZyB0byB0aGUgbGluZVxuICAgICAgbWFwcGluZ3NbbGluZV0ucHVzaChtYXBwaW5nQXJyYXkpO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZU1hcDogUmF3U291cmNlTWFwID0ge1xuICAgICAgdmVyc2lvbjogMyxcbiAgICAgIGZpbGU6IHRoaXMuZnMucmVsYXRpdmUoc291cmNlUGF0aERpciwgdGhpcy5zb3VyY2VQYXRoKSxcbiAgICAgIHNvdXJjZXM6IHNvdXJjZXMua2V5cyxcbiAgICAgIG5hbWVzOiBuYW1lcy52YWx1ZXMsXG4gICAgICBtYXBwaW5nczogZW5jb2RlKG1hcHBpbmdzKSxcbiAgICAgIHNvdXJjZXNDb250ZW50OiBzb3VyY2VzLnZhbHVlcyxcbiAgICB9O1xuICAgIHJldHVybiBzb3VyY2VNYXA7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgb3JpZ2luYWwgbWFwcGVkIGxvY2F0aW9uIGZvciB0aGUgZ2l2ZW4gYGxpbmVgIGFuZCBgY29sdW1uYCBpbiB0aGUgZ2VuZXJhdGVkIGZpbGUuXG4gICAqXG4gICAqIEZpcnN0IHdlIHNlYXJjaCBmb3IgYSBtYXBwaW5nIHdob3NlIGdlbmVyYXRlZCBzZWdtZW50IGlzIGF0IG9yIGRpcmVjdGx5IGJlZm9yZSB0aGUgZ2l2ZW5cbiAgICogbG9jYXRpb24uIFRoZW4gd2UgY29tcHV0ZSB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIGdpdmVuIGxvY2F0aW9uIGFuZCB0aGUgbWF0Y2hpbmcgZ2VuZXJhdGVkXG4gICAqIHNlZ21lbnQuIEZpbmFsbHkgd2UgYXBwbHkgdGhpcyBvZmZzZXQgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBzZWdtZW50IHRvIGdldCB0aGUgZGVzaXJlZFxuICAgKiBvcmlnaW5hbCBsb2NhdGlvbi5cbiAgICovXG4gIGdldE9yaWdpbmFsTG9jYXRpb24obGluZTogbnVtYmVyLCBjb2x1bW46IG51bWJlcik6XG4gICAgICB7ZmlsZTogQWJzb2x1dGVGc1BhdGgsIGxpbmU6IG51bWJlciwgY29sdW1uOiBudW1iZXJ9fG51bGwge1xuICAgIGlmICh0aGlzLmZsYXR0ZW5lZE1hcHBpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IHBvc2l0aW9uOiBudW1iZXI7XG4gICAgaWYgKGxpbmUgPCB0aGlzLnN0YXJ0T2ZMaW5lUG9zaXRpb25zLmxlbmd0aCkge1xuICAgICAgcG9zaXRpb24gPSB0aGlzLnN0YXJ0T2ZMaW5lUG9zaXRpb25zW2xpbmVdICsgY29sdW1uO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgbGluZSBpcyBvZmYgdGhlIGVuZCBvZiB0aGUgZmlsZSwgc28ganVzdCBhc3N1bWUgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuXG4gICAgICBwb3NpdGlvbiA9IHRoaXMuY29udGVudHMubGVuZ3RoO1xuICAgIH1cblxuICAgIGNvbnN0IGxvY2F0aW9uU2VnbWVudDogU2VnbWVudE1hcmtlciA9IHtsaW5lLCBjb2x1bW4sIHBvc2l0aW9uLCBuZXh0OiB1bmRlZmluZWR9O1xuXG4gICAgbGV0IG1hcHBpbmdJbmRleCA9XG4gICAgICAgIGZpbmRMYXN0TWFwcGluZ0luZGV4QmVmb3JlKHRoaXMuZmxhdHRlbmVkTWFwcGluZ3MsIGxvY2F0aW9uU2VnbWVudCwgZmFsc2UsIDApO1xuICAgIGlmIChtYXBwaW5nSW5kZXggPCAwKSB7XG4gICAgICBtYXBwaW5nSW5kZXggPSAwO1xuICAgIH1cbiAgICBjb25zdCB7b3JpZ2luYWxTZWdtZW50LCBvcmlnaW5hbFNvdXJjZSwgZ2VuZXJhdGVkU2VnbWVudH0gPVxuICAgICAgICB0aGlzLmZsYXR0ZW5lZE1hcHBpbmdzW21hcHBpbmdJbmRleF07XG4gICAgY29uc3Qgb2Zmc2V0ID0gbG9jYXRpb25TZWdtZW50LnBvc2l0aW9uIC0gZ2VuZXJhdGVkU2VnbWVudC5wb3NpdGlvbjtcbiAgICBjb25zdCBvZmZzZXRPcmlnaW5hbFNlZ21lbnQgPVxuICAgICAgICBvZmZzZXRTZWdtZW50KG9yaWdpbmFsU291cmNlLnN0YXJ0T2ZMaW5lUG9zaXRpb25zLCBvcmlnaW5hbFNlZ21lbnQsIG9mZnNldCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZmlsZTogb3JpZ2luYWxTb3VyY2Uuc291cmNlUGF0aCxcbiAgICAgIGxpbmU6IG9mZnNldE9yaWdpbmFsU2VnbWVudC5saW5lLFxuICAgICAgY29sdW1uOiBvZmZzZXRPcmlnaW5hbFNlZ21lbnQuY29sdW1uLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRmxhdHRlbiB0aGUgcGFyc2VkIG1hcHBpbmdzIGZvciB0aGlzIHNvdXJjZSBmaWxlLCBzbyB0aGF0IGFsbCB0aGUgbWFwcGluZ3MgYXJlIHRvIHB1cmUgb3JpZ2luYWxcbiAgICogc291cmNlIGZpbGVzIHdpdGggbm8gdHJhbnNpdGl2ZSBzb3VyY2UgbWFwcy5cbiAgICovXG4gIHByaXZhdGUgZmxhdHRlbk1hcHBpbmdzKCk6IE1hcHBpbmdbXSB7XG4gICAgY29uc3QgbWFwcGluZ3MgPVxuICAgICAgICBwYXJzZU1hcHBpbmdzKHRoaXMucmF3TWFwICYmIHRoaXMucmF3TWFwLm1hcCwgdGhpcy5zb3VyY2VzLCB0aGlzLnN0YXJ0T2ZMaW5lUG9zaXRpb25zKTtcbiAgICBlbnN1cmVPcmlnaW5hbFNlZ21lbnRMaW5rcyhtYXBwaW5ncyk7XG4gICAgY29uc3QgZmxhdHRlbmVkTWFwcGluZ3M6IE1hcHBpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IG1hcHBpbmdJbmRleCA9IDA7IG1hcHBpbmdJbmRleCA8IG1hcHBpbmdzLmxlbmd0aDsgbWFwcGluZ0luZGV4KyspIHtcbiAgICAgIGNvbnN0IGFUb0JtYXBwaW5nID0gbWFwcGluZ3NbbWFwcGluZ0luZGV4XTtcbiAgICAgIGNvbnN0IGJTb3VyY2UgPSBhVG9CbWFwcGluZy5vcmlnaW5hbFNvdXJjZTtcbiAgICAgIGlmIChiU291cmNlLmZsYXR0ZW5lZE1hcHBpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBUaGUgYiBzb3VyY2UgZmlsZSBoYXMgbm8gbWFwcGluZ3Mgb2YgaXRzIG93biAoaS5lLiBpdCBpcyBhIHB1cmUgb3JpZ2luYWwgZmlsZSlcbiAgICAgICAgLy8gc28ganVzdCB1c2UgdGhlIG1hcHBpbmcgYXMtaXMuXG4gICAgICAgIGZsYXR0ZW5lZE1hcHBpbmdzLnB1c2goYVRvQm1hcHBpbmcpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGBpbmNvbWluZ1N0YXJ0YCBhbmQgYGluY29taW5nRW5kYCBhcmUgdGhlIGBTZWdtZW50TWFya2VyYHMgaW4gYEJgIHRoYXQgcmVwcmVzZW50IHRoZVxuICAgICAgLy8gc2VjdGlvbiBvZiBgQmAgc291cmNlIGZpbGUgdGhhdCBpcyBiZWluZyBtYXBwZWQgdG8gYnkgdGhlIGN1cnJlbnQgYGFUb0JtYXBwaW5nYC5cbiAgICAgIC8vXG4gICAgICAvLyBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIG1hcHBpbmdzIGZyb20gQSB0byBCOlxuICAgICAgLy9cbiAgICAgIC8vIHNyYyBBICAgc3JjIEIgICAgIG1hcHBpbmdcbiAgICAgIC8vXG4gICAgICAvLyAgIGEgLS0tLS0gYSAgICAgICBbMCwgMF1cbiAgICAgIC8vICAgYiAgICAgICBiXG4gICAgICAvLyAgIGYgLSAgLy0gYyAgICAgICBbNCwgMl1cbiAgICAgIC8vICAgZyAgXFwgLyAgZFxuICAgICAgLy8gICBjIC0vXFwgICBlXG4gICAgICAvLyAgIGQgICAgXFwtIGYgICAgICAgWzIsIDVdXG4gICAgICAvLyAgIGVcbiAgICAgIC8vXG4gICAgICAvLyBGb3IgbWFwcGluZyBbMCwwXSB0aGUgaW5jb21pbmcgc3RhcnQgYW5kIGVuZCBhcmUgMCBhbmQgMiAoaS5lLiB0aGUgcmFuZ2UgYSwgYiwgYylcbiAgICAgIC8vIEZvciBtYXBwaW5nIFs0LDJdIHRoZSBpbmNvbWluZyBzdGFydCBhbmQgZW5kIGFyZSAyIGFuZCA1IChpLmUuIHRoZSByYW5nZSBjLCBkLCBlLCBmKVxuICAgICAgLy9cbiAgICAgIGNvbnN0IGluY29taW5nU3RhcnQgPSBhVG9CbWFwcGluZy5vcmlnaW5hbFNlZ21lbnQ7XG4gICAgICBjb25zdCBpbmNvbWluZ0VuZCA9IGluY29taW5nU3RhcnQubmV4dDtcblxuICAgICAgLy8gVGhlIGBvdXRnb2luZ1N0YXJ0SW5kZXhgIGFuZCBgb3V0Z29pbmdFbmRJbmRleGAgYXJlIHRoZSBpbmRpY2VzIG9mIHRoZSByYW5nZSBvZiBtYXBwaW5nc1xuICAgICAgLy8gdGhhdCBsZWF2ZSBgYmAgdGhhdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBtZXJnaW5nIHdpdGggdGhlIGFUb0JtYXBwaW5nLlxuICAgICAgLy8gV2UgYWN0dWFsbHkgY2FyZSBhYm91dCBhbGwgdGhlIG1hcmtlcnMgZnJvbSB0aGUgbGFzdCBiVG9DbWFwcGluZyBkaXJlY3RseSBiZWZvcmUgdGhlXG4gICAgICAvLyBgaW5jb21pbmdTdGFydGAgdG8gdGhlIGxhc3QgYlRvQ21hcGluZyBkaXJlY3RseSBiZWZvcmUgdGhlIGBpbmNvbWluZ0VuZGAsIGluY2x1c2l2ZS5cbiAgICAgIC8vXG4gICAgICAvLyBGb3IgZXhhbXBsZSwgaWYgd2UgY29uc2lkZXIgdGhlIHJhbmdlIDIgdG8gNSBmcm9tIGFib3ZlIChpLmUuIGMsIGQsIGUsIGYpIHdpdGggdGhlXG4gICAgICAvLyBmb2xsb3dpbmcgbWFwcGluZ3MgZnJvbSBCIHRvIEM6XG4gICAgICAvL1xuICAgICAgLy8gICBzcmMgQiAgIHNyYyBDICAgICBtYXBwaW5nXG4gICAgICAvLyAgICAgYVxuICAgICAgLy8gICAgIGIgLS0tLS0gYiAgICAgICBbMSwgMF1cbiAgICAgIC8vICAgLSBjICAgICAgIGNcbiAgICAgIC8vICB8ICBkICAgICAgIGRcbiAgICAgIC8vICB8ICBlIC0tLS0tIDEgICAgICAgWzQsIDNdXG4gICAgICAvLyAgIC0gZiAgXFwgICAgMlxuICAgICAgLy8gICAgICAgICBcXCAgIDNcbiAgICAgIC8vICAgICAgICAgIFxcLSBlICAgICAgIFs0LCA2XVxuICAgICAgLy9cbiAgICAgIC8vIFRoZSByYW5nZSB3aXRoIGBpbmNvbWluZ1N0YXJ0YCBhdCAyIGFuZCBgaW5jb21pbmdFbmRgIGF0IDUgaGFzIG91dGdvaW5nIHN0YXJ0IG1hcHBpbmcgb2ZcbiAgICAgIC8vIFsxLDBdIGFuZCBvdXRnb2luZyBlbmQgbWFwcGluZyBvZiBbNCwgNl0sIHdoaWNoIGFsc28gaW5jbHVkZXMgWzQsIDNdLlxuICAgICAgLy9cbiAgICAgIGxldCBvdXRnb2luZ1N0YXJ0SW5kZXggPVxuICAgICAgICAgIGZpbmRMYXN0TWFwcGluZ0luZGV4QmVmb3JlKGJTb3VyY2UuZmxhdHRlbmVkTWFwcGluZ3MsIGluY29taW5nU3RhcnQsIGZhbHNlLCAwKTtcbiAgICAgIGlmIChvdXRnb2luZ1N0YXJ0SW5kZXggPCAwKSB7XG4gICAgICAgIG91dGdvaW5nU3RhcnRJbmRleCA9IDA7XG4gICAgICB9XG4gICAgICBjb25zdCBvdXRnb2luZ0VuZEluZGV4ID0gaW5jb21pbmdFbmQgIT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgZmluZExhc3RNYXBwaW5nSW5kZXhCZWZvcmUoXG4gICAgICAgICAgICAgIGJTb3VyY2UuZmxhdHRlbmVkTWFwcGluZ3MsIGluY29taW5nRW5kLCB0cnVlLCBvdXRnb2luZ1N0YXJ0SW5kZXgpIDpcbiAgICAgICAgICBiU291cmNlLmZsYXR0ZW5lZE1hcHBpbmdzLmxlbmd0aCAtIDE7XG5cbiAgICAgIGZvciAobGV0IGJUb0NtYXBwaW5nSW5kZXggPSBvdXRnb2luZ1N0YXJ0SW5kZXg7IGJUb0NtYXBwaW5nSW5kZXggPD0gb3V0Z29pbmdFbmRJbmRleDtcbiAgICAgICAgICAgYlRvQ21hcHBpbmdJbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGJUb0NtYXBwaW5nOiBNYXBwaW5nID0gYlNvdXJjZS5mbGF0dGVuZWRNYXBwaW5nc1tiVG9DbWFwcGluZ0luZGV4XTtcbiAgICAgICAgZmxhdHRlbmVkTWFwcGluZ3MucHVzaChtZXJnZU1hcHBpbmdzKHRoaXMsIGFUb0JtYXBwaW5nLCBiVG9DbWFwcGluZykpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmxhdHRlbmVkTWFwcGluZ3M7XG4gIH1cbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIG1hcHBpbmdzIFRoZSBjb2xsZWN0aW9uIG9mIG1hcHBpbmdzIHdob3NlIHNlZ21lbnQtbWFya2VycyB3ZSBhcmUgc2VhcmNoaW5nLlxuICogQHBhcmFtIG1hcmtlciBUaGUgc2VnbWVudC1tYXJrZXIgdG8gbWF0Y2ggYWdhaW5zdCB0aG9zZSBvZiB0aGUgZ2l2ZW4gYG1hcHBpbmdzYC5cbiAqIEBwYXJhbSBleGNsdXNpdmUgSWYgZXhjbHVzaXZlIHRoZW4gd2UgbXVzdCBmaW5kIGEgbWFwcGluZyB3aXRoIGEgc2VnbWVudC1tYXJrZXIgdGhhdCBpc1xuICogZXhjbHVzaXZlbHkgZWFybGllciB0aGFuIHRoZSBnaXZlbiBgbWFya2VyYC5cbiAqIElmIG5vdCBleGNsdXNpdmUgdGhlbiB3ZSBjYW4gcmV0dXJuIHRoZSBoaWdoZXN0IG1hcHBpbmdzIHdpdGggYW4gZXF1aXZhbGVudCBzZWdtZW50LW1hcmtlciB0byB0aGVcbiAqIGdpdmVuIGBtYXJrZXJgLlxuICogQHBhcmFtIGxvd2VySW5kZXggSWYgcHJvdmlkZWQsIHRoaXMgaXMgdXNlZCBhcyBhIGhpbnQgdGhhdCB0aGUgbWFya2VyIHdlIGFyZSBzZWFyY2hpbmcgZm9yIGhhcyBhblxuICogaW5kZXggdGhhdCBpcyBubyBsb3dlciB0aGFuIHRoaXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdE1hcHBpbmdJbmRleEJlZm9yZShcbiAgICBtYXBwaW5nczogTWFwcGluZ1tdLCBtYXJrZXI6IFNlZ21lbnRNYXJrZXIsIGV4Y2x1c2l2ZTogYm9vbGVhbiwgbG93ZXJJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IHVwcGVySW5kZXggPSBtYXBwaW5ncy5sZW5ndGggLSAxO1xuICBjb25zdCB0ZXN0ID0gZXhjbHVzaXZlID8gLTEgOiAwO1xuXG4gIGlmIChjb21wYXJlU2VnbWVudHMobWFwcGluZ3NbbG93ZXJJbmRleF0uZ2VuZXJhdGVkU2VnbWVudCwgbWFya2VyKSA+IHRlc3QpIHtcbiAgICAvLyBFeGl0IGVhcmx5IHNpbmNlIHRoZSBtYXJrZXIgaXMgb3V0c2lkZSB0aGUgYWxsb3dlZCByYW5nZSBvZiBtYXBwaW5ncy5cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBsZXQgbWF0Y2hpbmdJbmRleCA9IC0xO1xuICB3aGlsZSAobG93ZXJJbmRleCA8PSB1cHBlckluZGV4KSB7XG4gICAgY29uc3QgaW5kZXggPSAodXBwZXJJbmRleCArIGxvd2VySW5kZXgpID4+IDE7XG4gICAgaWYgKGNvbXBhcmVTZWdtZW50cyhtYXBwaW5nc1tpbmRleF0uZ2VuZXJhdGVkU2VnbWVudCwgbWFya2VyKSA8PSB0ZXN0KSB7XG4gICAgICBtYXRjaGluZ0luZGV4ID0gaW5kZXg7XG4gICAgICBsb3dlckluZGV4ID0gaW5kZXggKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cHBlckluZGV4ID0gaW5kZXggLSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWF0Y2hpbmdJbmRleDtcbn1cblxuLyoqXG4gKiBBIE1hcHBpbmcgY29uc2lzdHMgb2YgdHdvIHNlZ21lbnQgbWFya2Vyczogb25lIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlIGFuZCBvbmUgaW4gdGhlIG9yaWdpbmFsXG4gKiBzb3VyY2UsIHdoaWNoIGluZGljYXRlIHRoZSBzdGFydCBvZiBlYWNoIHNlZ21lbnQuIFRoZSBlbmQgb2YgYSBzZWdtZW50IGlzIGluZGljYXRlZCBieSB0aGUgZmlyc3RcbiAqIHNlZ21lbnQgbWFya2VyIG9mIGFub3RoZXIgbWFwcGluZyB3aG9zZSBzdGFydCBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoaXMgb25lLlxuICpcbiAqIEl0IG1heSBhbHNvIGluY2x1ZGUgYSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VnbWVudCBiZWluZyBtYXBwZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFwcGluZyB7XG4gIHJlYWRvbmx5IGdlbmVyYXRlZFNlZ21lbnQ6IFNlZ21lbnRNYXJrZXI7XG4gIHJlYWRvbmx5IG9yaWdpbmFsU291cmNlOiBTb3VyY2VGaWxlO1xuICByZWFkb25seSBvcmlnaW5hbFNlZ21lbnQ6IFNlZ21lbnRNYXJrZXI7XG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG59XG5cblxuXG4vKipcbiAqIE1lcmdlIHR3byBtYXBwaW5ncyB0aGF0IGdvIGZyb20gQSB0byBCIGFuZCBCIHRvIEMsIHRvIHJlc3VsdCBpbiBhIG1hcHBpbmcgdGhhdCBnb2VzIGZyb20gQSB0byBDLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VNYXBwaW5ncyhnZW5lcmF0ZWRTb3VyY2U6IFNvdXJjZUZpbGUsIGFiOiBNYXBwaW5nLCBiYzogTWFwcGluZyk6IE1hcHBpbmcge1xuICBjb25zdCBuYW1lID0gYmMubmFtZSB8fCBhYi5uYW1lO1xuXG4gIC8vIFdlIG5lZWQgdG8gbW9kaWZ5IHRoZSBzZWdtZW50LW1hcmtlcnMgb2YgdGhlIG5ldyBtYXBwaW5nIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBzaGlmdHMgdGhhdFxuICAvLyBvY2N1ciBkdWUgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gbWFwcGluZ3MuXG4gIC8vIEZvciBleGFtcGxlOlxuXG4gIC8vICogU2ltcGxlIG1hcCB3aGVyZSB0aGUgQi0+QyBzdGFydHMgYXQgdGhlIHNhbWUgcGxhY2UgdGhlIEEtPkIgZW5kczpcbiAgLy9cbiAgLy8gYGBgXG4gIC8vIEE6IDEgMiBiIGMgZFxuICAvLyAgICAgICAgfCAgICAgICAgQS0+QiBbMiwwXVxuICAvLyAgICAgICAgfCAgICAgICAgICAgICAgfFxuICAvLyBCOiAgICAgYiBjIGQgICAgQS0+QyBbMiwxXVxuICAvLyAgICAgICAgfCAgICAgICAgICAgICAgICB8XG4gIC8vICAgICAgICB8ICAgICAgICBCLT5DIFswLDFdXG4gIC8vIEM6ICAgYSBiIGMgZCBlXG4gIC8vIGBgYFxuXG4gIC8vICogTW9yZSBjb21wbGljYXRlZCBjYXNlIHdoZXJlIGRpZmZzIG9mIHNlZ21lbnQtbWFya2VycyBpcyBuZWVkZWQ6XG4gIC8vXG4gIC8vIGBgYFxuICAvLyBBOiBiIDEgMiBjIGRcbiAgLy8gICAgIFxcXG4gIC8vICAgICAgfCAgICAgICAgICAgIEEtPkIgIFswLDEqXSAgICBbMCwxKl1cbiAgLy8gICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8KzNcbiAgLy8gQjogYSBiIDEgMiBjIGQgICAgQS0+QyAgWzAsMV0gICAgIFszLDJdXG4gIC8vICAgIHwgICAgICAvICAgICAgICAgICAgICAgIHwrMSAgICAgICB8XG4gIC8vICAgIHwgICAgIC8gICAgICAgIEItPkMgWzAqLDBdICAgIFs0KiwyXVxuICAvLyAgICB8ICAgIC9cbiAgLy8gQzogYSBiIGMgZCBlXG4gIC8vIGBgYFxuICAvL1xuICAvLyBgWzAsMV1gIG1hcHBpbmcgZnJvbSBBLT5DOlxuICAvLyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBcIm9yaWdpbmFsIHNlZ21lbnQtbWFya2VyXCIgb2YgQS0+QiAoMSopIGFuZCB0aGUgXCJnZW5lcmF0ZWRcbiAgLy8gc2VnbWVudC1tYXJrZXIgb2YgQi0+QyAoMCopOiBgMSAtIDAgPSArMWAuXG4gIC8vIFNpbmNlIGl0IGlzIHBvc2l0aXZlIHdlIG11c3QgaW5jcmVtZW50IHRoZSBcIm9yaWdpbmFsIHNlZ21lbnQtbWFya2VyXCIgd2l0aCBgMWAgdG8gZ2l2ZSBbMCwxXS5cbiAgLy9cbiAgLy8gYFszLDJdYCBtYXBwaW5nIGZyb20gQS0+QzpcbiAgLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgXCJvcmlnaW5hbCBzZWdtZW50LW1hcmtlclwiIG9mIEEtPkIgKDEqKSBhbmQgdGhlIFwiZ2VuZXJhdGVkXG4gIC8vIHNlZ21lbnQtbWFya2VyXCIgb2YgQi0+QyAoNCopOiBgMSAtIDQgPSAtM2AuXG4gIC8vIFNpbmNlIGl0IGlzIG5lZ2F0aXZlIHdlIG11c3QgaW5jcmVtZW50IHRoZSBcImdlbmVyYXRlZCBzZWdtZW50LW1hcmtlclwiIHdpdGggYDNgIHRvIGdpdmUgWzMsMl0uXG5cbiAgY29uc3QgZGlmZiA9IGNvbXBhcmVTZWdtZW50cyhiYy5nZW5lcmF0ZWRTZWdtZW50LCBhYi5vcmlnaW5hbFNlZ21lbnQpO1xuICBpZiAoZGlmZiA+IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIGdlbmVyYXRlZFNlZ21lbnQ6XG4gICAgICAgICAgb2Zmc2V0U2VnbWVudChnZW5lcmF0ZWRTb3VyY2Uuc3RhcnRPZkxpbmVQb3NpdGlvbnMsIGFiLmdlbmVyYXRlZFNlZ21lbnQsIGRpZmYpLFxuICAgICAgb3JpZ2luYWxTb3VyY2U6IGJjLm9yaWdpbmFsU291cmNlLFxuICAgICAgb3JpZ2luYWxTZWdtZW50OiBiYy5vcmlnaW5hbFNlZ21lbnQsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIGdlbmVyYXRlZFNlZ21lbnQ6IGFiLmdlbmVyYXRlZFNlZ21lbnQsXG4gICAgICBvcmlnaW5hbFNvdXJjZTogYmMub3JpZ2luYWxTb3VyY2UsXG4gICAgICBvcmlnaW5hbFNlZ21lbnQ6XG4gICAgICAgICAgb2Zmc2V0U2VnbWVudChiYy5vcmlnaW5hbFNvdXJjZS5zdGFydE9mTGluZVBvc2l0aW9ucywgYmMub3JpZ2luYWxTZWdtZW50LCAtZGlmZiksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBgcmF3TWFwcGluZ3NgIGludG8gYW4gYXJyYXkgb2YgcGFyc2VkIG1hcHBpbmdzLCB3aGljaCByZWZlcmVuY2Ugc291cmNlLWZpbGVzIHByb3ZpZGVkXG4gKiBpbiB0aGUgYHNvdXJjZXNgIHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTWFwcGluZ3MoXG4gICAgcmF3TWFwOiBSYXdTb3VyY2VNYXB8bnVsbCwgc291cmNlczogKFNvdXJjZUZpbGV8bnVsbClbXSxcbiAgICBnZW5lcmF0ZWRTb3VyY2VTdGFydE9mTGluZVBvc2l0aW9uczogbnVtYmVyW10pOiBNYXBwaW5nW10ge1xuICBpZiAocmF3TWFwID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgcmF3TWFwcGluZ3MgPSBkZWNvZGUocmF3TWFwLm1hcHBpbmdzKTtcbiAgaWYgKHJhd01hcHBpbmdzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgbWFwcGluZ3M6IE1hcHBpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBnZW5lcmF0ZWRMaW5lID0gMDsgZ2VuZXJhdGVkTGluZSA8IHJhd01hcHBpbmdzLmxlbmd0aDsgZ2VuZXJhdGVkTGluZSsrKSB7XG4gICAgY29uc3QgZ2VuZXJhdGVkTGluZU1hcHBpbmdzID0gcmF3TWFwcGluZ3NbZ2VuZXJhdGVkTGluZV07XG4gICAgZm9yIChjb25zdCByYXdNYXBwaW5nIG9mIGdlbmVyYXRlZExpbmVNYXBwaW5ncykge1xuICAgICAgaWYgKHJhd01hcHBpbmcubGVuZ3RoID49IDQpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxTb3VyY2UgPSBzb3VyY2VzW3Jhd01hcHBpbmdbMV0hXTtcbiAgICAgICAgaWYgKG9yaWdpbmFsU291cmNlID09PSBudWxsIHx8IG9yaWdpbmFsU291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyB0aGUgb3JpZ2luYWwgc291cmNlIGlzIG1pc3Npbmcgc28gaWdub3JlIHRoaXMgbWFwcGluZ1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdlbmVyYXRlZENvbHVtbiA9IHJhd01hcHBpbmdbMF07XG4gICAgICAgIGNvbnN0IG5hbWUgPSByYXdNYXBwaW5nLmxlbmd0aCA9PT0gNSA/IHJhd01hcC5uYW1lc1tyYXdNYXBwaW5nWzRdXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgbGluZSA9IHJhd01hcHBpbmdbMl0hO1xuICAgICAgICBjb25zdCBjb2x1bW4gPSByYXdNYXBwaW5nWzNdITtcbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkU2VnbWVudDogU2VnbWVudE1hcmtlciA9IHtcbiAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWRMaW5lLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkQ29sdW1uLFxuICAgICAgICAgIHBvc2l0aW9uOiBnZW5lcmF0ZWRTb3VyY2VTdGFydE9mTGluZVBvc2l0aW9uc1tnZW5lcmF0ZWRMaW5lXSArIGdlbmVyYXRlZENvbHVtbixcbiAgICAgICAgICBuZXh0OiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsU2VnbWVudDogU2VnbWVudE1hcmtlciA9IHtcbiAgICAgICAgICBsaW5lLFxuICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICBwb3NpdGlvbjogb3JpZ2luYWxTb3VyY2Uuc3RhcnRPZkxpbmVQb3NpdGlvbnNbbGluZV0gKyBjb2x1bW4sXG4gICAgICAgICAgbmV4dDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgICAgICBtYXBwaW5ncy5wdXNoKHtuYW1lLCBnZW5lcmF0ZWRTZWdtZW50LCBvcmlnaW5hbFNlZ21lbnQsIG9yaWdpbmFsU291cmNlfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXBwaW5ncztcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRoZSBzZWdtZW50IG1hcmtlcnMgZnJvbSB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzIGluIGVhY2ggbWFwcGluZyBvZiBhbiBhcnJheSBvZlxuICogYG1hcHBpbmdzYC5cbiAqXG4gKiBAcGFyYW0gbWFwcGluZ3MgVGhlIG1hcHBpbmdzIHdob3NlIG9yaWdpbmFsIHNlZ21lbnRzIHdlIHdhbnQgdG8gZXh0cmFjdFxuICogQHJldHVybnMgUmV0dXJuIGEgbWFwIGZyb20gb3JpZ2luYWwgc291cmNlLWZpbGVzIChyZWZlcmVuY2VkIGluIHRoZSBgbWFwcGluZ3NgKSB0byBhcnJheXMgb2ZcbiAqIHNlZ21lbnQtbWFya2VycyBzb3J0ZWQgYnkgdGhlaXIgb3JkZXIgaW4gdGhlaXIgc291cmNlIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0T3JpZ2luYWxTZWdtZW50cyhtYXBwaW5nczogTWFwcGluZ1tdKTogTWFwPFNvdXJjZUZpbGUsIFNlZ21lbnRNYXJrZXJbXT4ge1xuICBjb25zdCBvcmlnaW5hbFNlZ21lbnRzID0gbmV3IE1hcDxTb3VyY2VGaWxlLCBTZWdtZW50TWFya2VyW10+KCk7XG4gIGZvciAoY29uc3QgbWFwcGluZyBvZiBtYXBwaW5ncykge1xuICAgIGNvbnN0IG9yaWdpbmFsU291cmNlID0gbWFwcGluZy5vcmlnaW5hbFNvdXJjZTtcbiAgICBpZiAoIW9yaWdpbmFsU2VnbWVudHMuaGFzKG9yaWdpbmFsU291cmNlKSkge1xuICAgICAgb3JpZ2luYWxTZWdtZW50cy5zZXQob3JpZ2luYWxTb3VyY2UsIFtdKTtcbiAgICB9XG4gICAgY29uc3Qgc2VnbWVudHMgPSBvcmlnaW5hbFNlZ21lbnRzLmdldChvcmlnaW5hbFNvdXJjZSkhO1xuICAgIHNlZ21lbnRzLnB1c2gobWFwcGluZy5vcmlnaW5hbFNlZ21lbnQpO1xuICB9XG4gIG9yaWdpbmFsU2VnbWVudHMuZm9yRWFjaChzZWdtZW50TWFya2VycyA9PiBzZWdtZW50TWFya2Vycy5zb3J0KGNvbXBhcmVTZWdtZW50cykpO1xuICByZXR1cm4gb3JpZ2luYWxTZWdtZW50cztcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIG9yaWdpbmFsIHNlZ21lbnRzIG9mIGVhY2ggb2YgdGhlIGdpdmVuIGBtYXBwaW5nc2AgdG8gaW5jbHVkZSBhIGxpbmsgdG8gdGhlIG5leHRcbiAqIHNlZ21lbnQgaW4gdGhlIHNvdXJjZSBmaWxlLlxuICpcbiAqIEBwYXJhbSBtYXBwaW5ncyB0aGUgbWFwcGluZ3Mgd2hvc2Ugc2VnbWVudHMgc2hvdWxkIGJlIHVwZGF0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZU9yaWdpbmFsU2VnbWVudExpbmtzKG1hcHBpbmdzOiBNYXBwaW5nW10pOiB2b2lkIHtcbiAgY29uc3Qgc2VnbWVudHNCeVNvdXJjZSA9IGV4dHJhY3RPcmlnaW5hbFNlZ21lbnRzKG1hcHBpbmdzKTtcbiAgc2VnbWVudHNCeVNvdXJjZS5mb3JFYWNoKG1hcmtlcnMgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIG1hcmtlcnNbaV0ubmV4dCA9IG1hcmtlcnNbaSArIDFdO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3RhcnRPZkxpbmVQb3NpdGlvbnMoc3RyOiBzdHJpbmcpIHtcbiAgLy8gVGhlIGAxYCBpcyB0byBpbmRpY2F0ZSBhIG5ld2xpbmUgY2hhcmFjdGVyIGJldHdlZW4gdGhlIGxpbmVzLlxuICAvLyBOb3RlIHRoYXQgaW4gdGhlIGFjdHVhbCBjb250ZW50cyB0aGVyZSBjb3VsZCBiZSBtb3JlIHRoYW4gb25lIGNoYXJhY3RlciB0aGF0IGluZGljYXRlcyBhXG4gIC8vIG5ld2xpbmVcbiAgLy8gLSBlLmcuIFxcclxcbiAtIGJ1dCB0aGF0IGlzIG5vdCBpbXBvcnRhbnQgaGVyZSBzaW5jZSBzZWdtZW50LW1hcmtlcnMgYXJlIGluIGxpbmUvY29sdW1uIHBhaXJzIGFuZFxuICAvLyBzbyBkaWZmZXJlbmNlcyBpbiBsZW5ndGggZHVlIHRvIGV4dHJhIGBcXHJgIGNoYXJhY3RlcnMgZG8gbm90IGFmZmVjdCB0aGUgYWxnb3JpdGhtcy5cbiAgY29uc3QgTkVXTElORV9NQVJLRVJfT0ZGU0VUID0gMTtcbiAgY29uc3QgbGluZUxlbmd0aHMgPSBjb21wdXRlTGluZUxlbmd0aHMoc3RyKTtcbiAgY29uc3Qgc3RhcnRQb3NpdGlvbnMgPSBbMF07ICAvLyBGaXJzdCBsaW5lIHN0YXJ0cyBhdCBwb3NpdGlvbiAwXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZUxlbmd0aHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgc3RhcnRQb3NpdGlvbnMucHVzaChzdGFydFBvc2l0aW9uc1tpXSArIGxpbmVMZW5ndGhzW2ldICsgTkVXTElORV9NQVJLRVJfT0ZGU0VUKTtcbiAgfVxuICByZXR1cm4gc3RhcnRQb3NpdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVMaW5lTGVuZ3RocyhzdHI6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgcmV0dXJuIChzdHIuc3BsaXQoL1xcbi8pKS5tYXAocyA9PiBzLmxlbmd0aCk7XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIG1hcHBpbmdzIGJldHdlZW4gYGtleXNgIGFuZCBgdmFsdWVzYCBzdG9yZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBrZXlzIGFyZVxuICogZmlyc3Qgc2Vlbi5cbiAqXG4gKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIGEgc3RhbmRhcmQgYE1hcGAgaXMgdGhhdCB3aGVuIHlvdSBhZGQgYSBrZXktdmFsdWUgcGFpciB0aGUgaW5kZXhcbiAqIG9mIHRoZSBga2V5YCBpcyByZXR1cm5lZC5cbiAqL1xuY2xhc3MgSW5kZXhlZE1hcDxLLCBWPiB7XG4gIHByaXZhdGUgbWFwID0gbmV3IE1hcDxLLCBudW1iZXI+KCk7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIGtleXMgYWRkZWQgdG8gdGhpcyBtYXAuXG4gICAqXG4gICAqIFRoaXMgYXJyYXkgaXMgZ3VhcmFudGVlZCB0byBiZSBpbiB0aGUgb3JkZXIgb2YgdGhlIGZpcnN0IHRpbWUgdGhlIGtleSB3YXMgYWRkZWQgdG8gdGhlIG1hcC5cbiAgICovXG4gIHJlYWRvbmx5IGtleXM6IEtbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiB2YWx1ZXMgYWRkZWQgdG8gdGhpcyBtYXAuXG4gICAqXG4gICAqIFRoaXMgYXJyYXkgaXMgZ3VhcmFudGVlZCB0byBiZSBpbiB0aGUgb3JkZXIgb2YgdGhlIGZpcnN0IHRpbWUgdGhlIGFzc29jaWF0ZWQga2V5IHdhcyBhZGRlZCB0b1xuICAgKiB0aGUgbWFwLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzOiBWW10gPSBbXTtcblxuICAvKipcbiAgICogQXNzb2NpYXRlIHRoZSBgdmFsdWVgIHdpdGggdGhlIGBrZXlgIGFuZCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBrZXkgaW4gdGhlIGNvbGxlY3Rpb24uXG4gICAqXG4gICAqIElmIHRoZSBga2V5YCBhbHJlYWR5IGV4aXN0cyB0aGVuIHRoZSBgdmFsdWVgIGlzIG5vdCBzZXQgYW5kIHRoZSBpbmRleCBvZiB0aGF0IGBrZXlgIGlzXG4gICAqIHJldHVybmVkOyBvdGhlcndpc2UgdGhlIGBrZXlgIGFuZCBgdmFsdWVgIGFyZSBzdG9yZWQgYW5kIHRoZSBpbmRleCBvZiB0aGUgbmV3IGBrZXlgIGlzXG4gICAqIHJldHVybmVkLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gYXNzb2NpYXRlZCB3aXRoIHRoZSBgdmFsdWVgLlxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGFzc29jaWF0ZWQgd2l0aCB0aGUgYGtleWAuXG4gICAqIEByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgYGtleWAgaW4gdGhlIGBrZXlzYCBhcnJheS5cbiAgICovXG4gIHNldChrZXk6IEssIHZhbHVlOiBWKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5tYXAuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hcC5nZXQoa2V5KSE7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy52YWx1ZXMucHVzaCh2YWx1ZSkgLSAxO1xuICAgIHRoaXMua2V5cy5wdXNoKGtleSk7XG4gICAgdGhpcy5tYXAuc2V0KGtleSwgaW5kZXgpO1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBgdmFsdWVzYCBzdG9yZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBhZGRlZC5cbiAqXG4gKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIGEgc3RhbmRhcmQgYFNldGAgaXMgdGhhdCB3aGVuIHlvdSBhZGQgYSB2YWx1ZSB0aGUgaW5kZXggb2YgdGhhdFxuICogaXRlbSBpcyByZXR1cm5lZC5cbiAqL1xuY2xhc3MgSW5kZXhlZFNldDxWPiB7XG4gIHByaXZhdGUgbWFwID0gbmV3IE1hcDxWLCBudW1iZXI+KCk7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHZhbHVlcyBhZGRlZCB0byB0aGlzIHNldC5cbiAgICogVGhpcyBhcnJheSBpcyBndWFyYW50ZWVkIHRvIGJlIGluIHRoZSBvcmRlciBvZiB0aGUgZmlyc3QgdGltZSB0aGUgdmFsdWUgd2FzIGFkZGVkIHRvIHRoZSBzZXQuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM6IFZbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBBZGQgdGhlIGB2YWx1ZWAgdG8gdGhlIGB2YWx1ZXNgIGFycmF5LCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3Q7IHJldHVybmluZyB0aGUgaW5kZXggb2YgdGhlXG4gICAqIGB2YWx1ZWAgaW4gdGhlIGB2YWx1ZXNgIGFycmF5LlxuICAgKlxuICAgKiBJZiB0aGUgYHZhbHVlYCBhbHJlYWR5IGV4aXN0cyB0aGVuIHRoZSBpbmRleCBvZiB0aGF0IGB2YWx1ZWAgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSB0aGUgbmV3XG4gICAqIGB2YWx1ZWAgaXMgc3RvcmVkIGFuZCB0aGUgbmV3IGluZGV4IHJldHVybmVkLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGFkZCB0byB0aGUgc2V0LlxuICAgKiBAcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGB2YWx1ZWAgaW4gdGhlIGB2YWx1ZXNgIGFycmF5LlxuICAgKi9cbiAgYWRkKHZhbHVlOiBWKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5tYXAuaGFzKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWFwLmdldCh2YWx1ZSkhO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudmFsdWVzLnB1c2godmFsdWUpIC0gMTtcbiAgICB0aGlzLm1hcC5zZXQodmFsdWUsIGluZGV4KTtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cbn1cblxuY2xhc3MgQ2FjaGU8SW5wdXQsIENhY2hlZD4ge1xuICBwcml2YXRlIG1hcCA9IG5ldyBNYXA8SW5wdXQsIENhY2hlZD4oKTtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb21wdXRlRm46IChpbnB1dDogSW5wdXQpID0+IENhY2hlZCkge31cbiAgZ2V0KGlucHV0OiBJbnB1dCk6IENhY2hlZCB7XG4gICAgaWYgKCF0aGlzLm1hcC5oYXMoaW5wdXQpKSB7XG4gICAgICB0aGlzLm1hcC5zZXQoaW5wdXQsIHRoaXMuY29tcHV0ZUZuKGlucHV0KSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hcC5nZXQoaW5wdXQpITtcbiAgfVxufVxuIl19
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <amd-module name="@angular/compiler-cli/src/ngtsc/sourcemaps/src/source_file_loader" />
|
|
2
2
|
import { AbsoluteFsPath, ReadonlyFileSystem } from '../../file_system';
|
|
3
3
|
import { Logger } from '../../logging';
|
|
4
|
-
import {
|
|
4
|
+
import { MapAndPath } from './raw_source_map';
|
|
5
5
|
import { SourceFile } from './source_file';
|
|
6
6
|
/**
|
|
7
7
|
* This class can be used to load a source file, its associated source map and any upstream sources.
|
|
@@ -22,7 +22,8 @@ export declare class SourceFileLoader {
|
|
|
22
22
|
/** A map of URL schemes to base paths. The scheme name should be lowercase. */
|
|
23
23
|
schemeMap: Record<string, AbsoluteFsPath>);
|
|
24
24
|
/**
|
|
25
|
-
* Load a source file
|
|
25
|
+
* Load a source file from the provided content and source map, and recursively load any
|
|
26
|
+
* referenced source files.
|
|
26
27
|
*
|
|
27
28
|
* @param sourcePath The path to the source file to load.
|
|
28
29
|
* @param contents The contents of the source file to load.
|
|
@@ -30,26 +31,52 @@ export declare class SourceFileLoader {
|
|
|
30
31
|
* @returns a SourceFile object created from the `contents` and provided source-map info.
|
|
31
32
|
*/
|
|
32
33
|
loadSourceFile(sourcePath: AbsoluteFsPath, contents: string, mapAndPath: MapAndPath): SourceFile;
|
|
34
|
+
/**
|
|
35
|
+
* Load a source file from the provided content, compute its source map, and recursively load any
|
|
36
|
+
* referenced source files.
|
|
37
|
+
*
|
|
38
|
+
* @param sourcePath The path to the source file to load.
|
|
39
|
+
* @param contents The contents of the source file to load.
|
|
40
|
+
* @returns a SourceFile object created from the `contents` and computed source-map info.
|
|
41
|
+
*/
|
|
42
|
+
loadSourceFile(sourcePath: AbsoluteFsPath, contents: string): SourceFile;
|
|
43
|
+
/**
|
|
44
|
+
* Load a source file from the file-system, compute its source map, and recursively load any
|
|
45
|
+
* referenced source files.
|
|
46
|
+
*
|
|
47
|
+
* @param sourcePath The path to the source file to load.
|
|
48
|
+
* @returns a SourceFile object if its contents could be loaded from disk, or null otherwise.
|
|
49
|
+
*/
|
|
50
|
+
loadSourceFile(sourcePath: AbsoluteFsPath): SourceFile | null;
|
|
33
51
|
/**
|
|
34
52
|
* The overload used internally to load source files referenced in a source-map.
|
|
35
53
|
*
|
|
36
54
|
* In this case there is no guarantee that it will return a non-null SourceMap.
|
|
37
55
|
*
|
|
38
56
|
* @param sourcePath The path to the source file to load.
|
|
39
|
-
* @param contents The contents of the source file to load, if provided inline.
|
|
40
|
-
*
|
|
41
|
-
* @param
|
|
57
|
+
* @param contents The contents of the source file to load, if provided inline. If `null`,
|
|
58
|
+
* the contents will be read from the file at the `sourcePath`.
|
|
59
|
+
* @param sourceOrigin Describes where the source content came from.
|
|
60
|
+
* @param sourceMapInfo The raw contents and path of the source-map file. If `null` the
|
|
61
|
+
* source-map will be computed from the contents of the source file, either inline or loaded
|
|
62
|
+
* from the file-system.
|
|
42
63
|
*
|
|
43
|
-
* @returns a SourceFile if the content for one was provided or able to be loaded from disk,
|
|
64
|
+
* @returns a SourceFile if the content for one was provided or was able to be loaded from disk,
|
|
44
65
|
* `null` otherwise.
|
|
45
66
|
*/
|
|
46
|
-
|
|
67
|
+
private loadSourceFileInternal;
|
|
47
68
|
/**
|
|
48
69
|
* Find the source map associated with the source file whose `sourcePath` and `contents` are
|
|
49
70
|
* provided.
|
|
50
71
|
*
|
|
51
72
|
* Source maps can be inline, as part of a base64 encoded comment, or external as a separate file
|
|
52
73
|
* whose path is indicated in a comment or implied from the name of the source file itself.
|
|
74
|
+
*
|
|
75
|
+
* @param sourcePath the path to the source file.
|
|
76
|
+
* @param sourceContents the contents of the source file.
|
|
77
|
+
* @param sourceOrigin where the content of the source file came from.
|
|
78
|
+
* @returns the parsed contents and path of the source-map, if loading was successful, null
|
|
79
|
+
* otherwise.
|
|
53
80
|
*/
|
|
54
81
|
private loadSourceMap;
|
|
55
82
|
/**
|
|
@@ -86,10 +113,3 @@ export declare class SourceFileLoader {
|
|
|
86
113
|
*/
|
|
87
114
|
private replaceSchemeWithPath;
|
|
88
115
|
}
|
|
89
|
-
/** A small helper structure that is returned from `loadSourceMap()`. */
|
|
90
|
-
export interface MapAndPath {
|
|
91
|
-
/** The path to the source map if it was external or `null` if it was inline. */
|
|
92
|
-
mapPath: AbsoluteFsPath | null;
|
|
93
|
-
/** The raw source map itself. */
|
|
94
|
-
map: RawSourceMap;
|
|
95
|
-
}
|