@angular-devkit/build-angular 16.2.0 → 17.0.0-next.0
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 +14 -10
- package/builders.json +10 -0
- package/package.json +30 -28
- package/src/builders/application/execute-build.js +2 -2
- package/src/builders/browser-esbuild/builder-status-warnings.js +2 -1
- package/src/builders/dev-server/vite-server.d.ts +1 -1
- package/src/builders/dev-server/vite-server.js +89 -52
- package/src/builders/extract-i18n/application-extraction.d.ts +17 -0
- package/src/builders/extract-i18n/application-extraction.js +137 -0
- package/src/builders/extract-i18n/builder.d.ts +17 -0
- package/src/builders/extract-i18n/builder.js +152 -0
- package/src/builders/extract-i18n/index.d.ts +4 -14
- package/src/builders/extract-i18n/index.js +4 -247
- package/src/builders/extract-i18n/options.d.ts +29 -0
- package/src/builders/extract-i18n/options.js +82 -0
- package/src/builders/extract-i18n/webpack-extraction.d.ts +21 -0
- package/src/builders/extract-i18n/webpack-extraction.js +100 -0
- package/src/builders/prerender/index.d.ts +20 -0
- package/src/builders/prerender/index.js +180 -0
- package/src/builders/prerender/render-worker.d.ts +30 -0
- package/src/builders/prerender/render-worker.js +126 -0
- package/src/builders/prerender/schema.d.ts +22 -0
- package/src/builders/prerender/schema.js +5 -0
- package/src/builders/prerender/schema.json +39 -0
- package/src/builders/prerender/utils.d.ts +22 -0
- package/src/builders/prerender/utils.js +79 -0
- package/src/builders/ssr-dev-server/index.d.ts +23 -0
- package/src/builders/ssr-dev-server/index.js +309 -0
- package/src/builders/ssr-dev-server/schema.d.ts +64 -0
- package/src/builders/ssr-dev-server/schema.js +5 -0
- package/src/builders/ssr-dev-server/schema.json +75 -0
- package/src/builders/ssr-dev-server/utils.d.ts +15 -0
- package/src/builders/ssr-dev-server/utils.js +75 -0
- package/src/tools/babel/webpack-loader.js +2 -2
- package/src/tools/esbuild/angular/compilation/angular-compilation.d.ts +7 -2
- package/src/tools/esbuild/angular/compilation/angular-compilation.js +21 -1
- package/src/tools/esbuild/angular/compiler-plugin.js +8 -13
- package/src/tools/esbuild/application-code-bundle.js +4 -6
- package/src/tools/esbuild/utils.js +5 -1
- package/src/tools/sass/rebasing-importer.js +15 -8
- package/src/utils/index-file/inline-critical-css.js +13 -26
- package/src/utils/index-file/inline-fonts.js +1 -2
- package/src/utils/package-chunk-sort.js +1 -1
- package/src/utils/server-rendering/esm-in-memory-file-loader.d.ts +4 -2
- package/src/utils/server-rendering/esm-in-memory-file-loader.js +28 -5
- package/src/utils/server-rendering/prerender.d.ts +1 -1
- package/src/utils/server-rendering/prerender.js +6 -3
- package/src/tools/esbuild/external-packages-plugin.d.ts +0 -17
- package/src/tools/esbuild/external-packages-plugin.js +0 -49
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright Google LLC All Rights Reserved.
|
|
5
|
+
*
|
|
6
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
7
|
+
* found in the LICENSE file at https://angular.io/license
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
26
|
+
if (mod && mod.__esModule) return mod;
|
|
27
|
+
var result = {};
|
|
28
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
29
|
+
__setModuleDefault(result, mod);
|
|
30
|
+
return result;
|
|
31
|
+
};
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.getIndexOutputFile = exports.getRoutes = void 0;
|
|
34
|
+
const fs = __importStar(require("fs"));
|
|
35
|
+
const guess_parser_1 = require("guess-parser");
|
|
36
|
+
const path = __importStar(require("path"));
|
|
37
|
+
const error_1 = require("../../utils/error");
|
|
38
|
+
/**
|
|
39
|
+
* Returns the union of routes, the contents of routesFile if given,
|
|
40
|
+
* and the static routes extracted if guessRoutes is set to true.
|
|
41
|
+
*/
|
|
42
|
+
async function getRoutes(options, tsConfigPath, context) {
|
|
43
|
+
let routes = options.routes || [];
|
|
44
|
+
const { logger, workspaceRoot } = context;
|
|
45
|
+
if (options.routesFile) {
|
|
46
|
+
const routesFilePath = path.join(workspaceRoot, options.routesFile);
|
|
47
|
+
routes = routes.concat(fs
|
|
48
|
+
.readFileSync(routesFilePath, 'utf8')
|
|
49
|
+
.split(/\r?\n/)
|
|
50
|
+
.filter((v) => !!v));
|
|
51
|
+
}
|
|
52
|
+
if (options.guessRoutes && tsConfigPath) {
|
|
53
|
+
try {
|
|
54
|
+
routes = routes.concat((0, guess_parser_1.parseAngularRoutes)(path.join(workspaceRoot, tsConfigPath))
|
|
55
|
+
.map((routeObj) => routeObj.path)
|
|
56
|
+
.filter((route) => !route.includes('*') && !route.includes(':')));
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
(0, error_1.assertIsError)(e);
|
|
60
|
+
logger.error('Unable to extract routes from application.', { ...e });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
routes = routes.map((r) => (r === '' ? '/' : r));
|
|
64
|
+
return [...new Set(routes)];
|
|
65
|
+
}
|
|
66
|
+
exports.getRoutes = getRoutes;
|
|
67
|
+
/**
|
|
68
|
+
* Returns the name of the index file outputted by the browser builder.
|
|
69
|
+
*/
|
|
70
|
+
function getIndexOutputFile(options) {
|
|
71
|
+
if (typeof options.index === 'string') {
|
|
72
|
+
return path.basename(options.index);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
return options.index.output || 'index.html';
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.getIndexOutputFile = getIndexOutputFile;
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyX2RldmtpdC9idWlsZF9hbmd1bGFyL3NyYy9idWlsZGVycy9wcmVyZW5kZXIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFLSCx1Q0FBeUI7QUFDekIsK0NBQWtEO0FBQ2xELDJDQUE2QjtBQUM3Qiw2Q0FBa0Q7QUFLbEQ7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLFNBQVMsQ0FDN0IsT0FBZ0MsRUFDaEMsWUFBZ0MsRUFDaEMsT0FBdUI7SUFFdkIsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDbEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDMUMsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO1FBQ3RCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwRSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDcEIsRUFBRTthQUNDLFlBQVksQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDO2FBQ3BDLEtBQUssQ0FBQyxPQUFPLENBQUM7YUFDZCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDdEIsQ0FBQztLQUNIO0lBRUQsSUFBSSxPQUFPLENBQUMsV0FBVyxJQUFJLFlBQVksRUFBRTtRQUN2QyxJQUFJO1lBQ0YsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQ3BCLElBQUEsaUNBQWtCLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7aUJBQ3ZELEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztpQkFDaEMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQ25FLENBQUM7U0FDSDtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsSUFBQSxxQkFBYSxFQUFDLENBQUMsQ0FBQyxDQUFDO1lBRWpCLE1BQU0sQ0FBQyxLQUFLLENBQUMsNENBQTRDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdEU7S0FDRjtJQUVELE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVqRCxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFsQ0QsOEJBa0NDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxPQUE4QjtJQUMvRCxJQUFJLE9BQU8sT0FBTyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDckMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNyQztTQUFNO1FBQ0wsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxZQUFZLENBQUM7S0FDN0M7QUFDSCxDQUFDO0FBTkQsZ0RBTUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHsgQnVpbGRlckNvbnRleHQgfSBmcm9tICdAYW5ndWxhci1kZXZraXQvYXJjaGl0ZWN0JztcbmltcG9ydCB7IEJyb3dzZXJCdWlsZGVyT3B0aW9ucyB9IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9idWlsZC1hbmd1bGFyJztcbmltcG9ydCB7IGpzb24gfSBmcm9tICdAYW5ndWxhci1kZXZraXQvY29yZSc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBwYXJzZUFuZ3VsYXJSb3V0ZXMgfSBmcm9tICdndWVzcy1wYXJzZXInO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGFzc2VydElzRXJyb3IgfSBmcm9tICcuLi8uLi91dGlscy9lcnJvcic7XG5pbXBvcnQgeyBTY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5cbnR5cGUgUHJlcmVuZGVyQnVpbGRlck9wdGlvbnMgPSBTY2hlbWEgJiBqc29uLkpzb25PYmplY3Q7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdW5pb24gb2Ygcm91dGVzLCB0aGUgY29udGVudHMgb2Ygcm91dGVzRmlsZSBpZiBnaXZlbixcbiAqIGFuZCB0aGUgc3RhdGljIHJvdXRlcyBleHRyYWN0ZWQgaWYgZ3Vlc3NSb3V0ZXMgaXMgc2V0IHRvIHRydWUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSb3V0ZXMoXG4gIG9wdGlvbnM6IFByZXJlbmRlckJ1aWxkZXJPcHRpb25zLFxuICB0c0NvbmZpZ1BhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY29udGV4dDogQnVpbGRlckNvbnRleHQsXG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGxldCByb3V0ZXMgPSBvcHRpb25zLnJvdXRlcyB8fCBbXTtcbiAgY29uc3QgeyBsb2dnZXIsIHdvcmtzcGFjZVJvb3QgfSA9IGNvbnRleHQ7XG4gIGlmIChvcHRpb25zLnJvdXRlc0ZpbGUpIHtcbiAgICBjb25zdCByb3V0ZXNGaWxlUGF0aCA9IHBhdGguam9pbih3b3Jrc3BhY2VSb290LCBvcHRpb25zLnJvdXRlc0ZpbGUpO1xuICAgIHJvdXRlcyA9IHJvdXRlcy5jb25jYXQoXG4gICAgICBmc1xuICAgICAgICAucmVhZEZpbGVTeW5jKHJvdXRlc0ZpbGVQYXRoLCAndXRmOCcpXG4gICAgICAgIC5zcGxpdCgvXFxyP1xcbi8pXG4gICAgICAgIC5maWx0ZXIoKHYpID0+ICEhdiksXG4gICAgKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmd1ZXNzUm91dGVzICYmIHRzQ29uZmlnUGF0aCkge1xuICAgIHRyeSB7XG4gICAgICByb3V0ZXMgPSByb3V0ZXMuY29uY2F0KFxuICAgICAgICBwYXJzZUFuZ3VsYXJSb3V0ZXMocGF0aC5qb2luKHdvcmtzcGFjZVJvb3QsIHRzQ29uZmlnUGF0aCkpXG4gICAgICAgICAgLm1hcCgocm91dGVPYmopID0+IHJvdXRlT2JqLnBhdGgpXG4gICAgICAgICAgLmZpbHRlcigocm91dGUpID0+ICFyb3V0ZS5pbmNsdWRlcygnKicpICYmICFyb3V0ZS5pbmNsdWRlcygnOicpKSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXNzZXJ0SXNFcnJvcihlKTtcblxuICAgICAgbG9nZ2VyLmVycm9yKCdVbmFibGUgdG8gZXh0cmFjdCByb3V0ZXMgZnJvbSBhcHBsaWNhdGlvbi4nLCB7IC4uLmUgfSk7XG4gICAgfVxuICB9XG5cbiAgcm91dGVzID0gcm91dGVzLm1hcCgocikgPT4gKHIgPT09ICcnID8gJy8nIDogcikpO1xuXG4gIHJldHVybiBbLi4ubmV3IFNldChyb3V0ZXMpXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBpbmRleCBmaWxlIG91dHB1dHRlZCBieSB0aGUgYnJvd3NlciBidWlsZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5kZXhPdXRwdXRGaWxlKG9wdGlvbnM6IEJyb3dzZXJCdWlsZGVyT3B0aW9ucyk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5pbmRleCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShvcHRpb25zLmluZGV4KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb3B0aW9ucy5pbmRleC5vdXRwdXQgfHwgJ2luZGV4Lmh0bWwnO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
import { BuilderContext, BuilderOutput } from '@angular-devkit/architect';
|
|
9
|
+
import { json, logging } from '@angular-devkit/core';
|
|
10
|
+
import { Observable } from 'rxjs';
|
|
11
|
+
import { Schema } from './schema';
|
|
12
|
+
type SSRDevServerBuilderOptions = Schema & json.JsonObject;
|
|
13
|
+
export type SSRDevServerBuilderOutput = BuilderOutput & {
|
|
14
|
+
baseUrl?: string;
|
|
15
|
+
port?: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function execute(options: SSRDevServerBuilderOptions, context: BuilderContext): Observable<SSRDevServerBuilderOutput>;
|
|
18
|
+
export declare function log({ stderr, stdout }: {
|
|
19
|
+
stderr: string | undefined;
|
|
20
|
+
stdout: string | undefined;
|
|
21
|
+
}, logger: logging.LoggerApi): void;
|
|
22
|
+
declare const _default: import("../../../../architect/src/internal").Builder<Schema & json.JsonObject>;
|
|
23
|
+
export default _default;
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright Google LLC All Rights Reserved.
|
|
5
|
+
*
|
|
6
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
7
|
+
* found in the LICENSE file at https://angular.io/license
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
26
|
+
if (mod && mod.__esModule) return mod;
|
|
27
|
+
var result = {};
|
|
28
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
29
|
+
__setModuleDefault(result, mod);
|
|
30
|
+
return result;
|
|
31
|
+
};
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.log = exports.execute = void 0;
|
|
34
|
+
const architect_1 = require("@angular-devkit/architect");
|
|
35
|
+
const core_1 = require("@angular-devkit/core");
|
|
36
|
+
const path_1 = require("path");
|
|
37
|
+
const rxjs_1 = require("rxjs");
|
|
38
|
+
const operators_1 = require("rxjs/operators");
|
|
39
|
+
const url = __importStar(require("url"));
|
|
40
|
+
const error_1 = require("../../utils/error");
|
|
41
|
+
const utils_1 = require("./utils");
|
|
42
|
+
/** Log messages to ignore and not rely to the logger */
|
|
43
|
+
const IGNORED_STDOUT_MESSAGES = [
|
|
44
|
+
'server listening on',
|
|
45
|
+
'Angular is running in development mode. Call enableProdMode() to enable production mode.',
|
|
46
|
+
];
|
|
47
|
+
function execute(options, context) {
|
|
48
|
+
const browserTarget = (0, architect_1.targetFromTargetString)(options.browserTarget);
|
|
49
|
+
const serverTarget = (0, architect_1.targetFromTargetString)(options.serverTarget);
|
|
50
|
+
const getBaseUrl = (bs) => `${bs.getOption('scheme')}://${bs.getOption('host')}:${bs.getOption('port')}`;
|
|
51
|
+
const browserTargetRun = context.scheduleTarget(browserTarget, {
|
|
52
|
+
watch: options.watch,
|
|
53
|
+
progress: options.progress,
|
|
54
|
+
verbose: options.verbose,
|
|
55
|
+
// Disable bundle budgets are these are not meant to be used with a dev-server as this will add extra JavaScript for live-reloading.
|
|
56
|
+
budgets: [],
|
|
57
|
+
});
|
|
58
|
+
const serverTargetRun = context.scheduleTarget(serverTarget, {
|
|
59
|
+
watch: options.watch,
|
|
60
|
+
progress: options.progress,
|
|
61
|
+
verbose: options.verbose,
|
|
62
|
+
});
|
|
63
|
+
const bsInstance = require('browser-sync').create();
|
|
64
|
+
context.logger.error(core_1.tags.stripIndents `
|
|
65
|
+
****************************************************************************************
|
|
66
|
+
This is a simple server for use in testing or debugging Angular applications locally.
|
|
67
|
+
It hasn't been reviewed for security issues.
|
|
68
|
+
|
|
69
|
+
DON'T USE IT FOR PRODUCTION!
|
|
70
|
+
****************************************************************************************
|
|
71
|
+
`);
|
|
72
|
+
return (0, rxjs_1.zip)(browserTargetRun, serverTargetRun, (0, utils_1.getAvailablePort)()).pipe((0, operators_1.switchMap)(([br, sr, nodeServerPort]) => {
|
|
73
|
+
return (0, rxjs_1.combineLatest)([br.output, sr.output]).pipe(
|
|
74
|
+
// This is needed so that if both server and browser emit close to each other
|
|
75
|
+
// we only emit once. This typically happens on the first build.
|
|
76
|
+
(0, operators_1.debounceTime)(120), (0, operators_1.switchMap)(([b, s]) => {
|
|
77
|
+
if (!s.success || !b.success) {
|
|
78
|
+
return (0, rxjs_1.of)([b, s]);
|
|
79
|
+
}
|
|
80
|
+
return startNodeServer(s, nodeServerPort, context.logger, !!options.inspect).pipe((0, operators_1.mapTo)([b, s]), (0, operators_1.catchError)((err) => {
|
|
81
|
+
context.logger.error(`A server error has occurred.\n${mapErrorToMessage(err)}`);
|
|
82
|
+
return rxjs_1.EMPTY;
|
|
83
|
+
}));
|
|
84
|
+
}), (0, operators_1.map)(([b, s]) => [
|
|
85
|
+
{
|
|
86
|
+
success: b.success && s.success,
|
|
87
|
+
error: b.error || s.error,
|
|
88
|
+
},
|
|
89
|
+
nodeServerPort,
|
|
90
|
+
]), (0, operators_1.tap)(([builderOutput]) => {
|
|
91
|
+
if (builderOutput.success) {
|
|
92
|
+
context.logger.info('\nCompiled successfully.');
|
|
93
|
+
}
|
|
94
|
+
}), (0, operators_1.debounce)(([builderOutput]) => builderOutput.success && !options.inspect
|
|
95
|
+
? (0, utils_1.waitUntilServerIsListening)(nodeServerPort)
|
|
96
|
+
: rxjs_1.EMPTY), (0, operators_1.finalize)(() => {
|
|
97
|
+
void br.stop();
|
|
98
|
+
void sr.stop();
|
|
99
|
+
}));
|
|
100
|
+
}), (0, operators_1.concatMap)(([builderOutput, nodeServerPort]) => {
|
|
101
|
+
if (!builderOutput.success) {
|
|
102
|
+
return (0, rxjs_1.of)(builderOutput);
|
|
103
|
+
}
|
|
104
|
+
if (bsInstance.active) {
|
|
105
|
+
bsInstance.reload();
|
|
106
|
+
return (0, rxjs_1.of)(builderOutput);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
return (0, rxjs_1.from)(initBrowserSync(bsInstance, nodeServerPort, options, context)).pipe((0, operators_1.tap)((bs) => {
|
|
110
|
+
const baseUrl = getBaseUrl(bs);
|
|
111
|
+
context.logger.info(core_1.tags.oneLine `
|
|
112
|
+
**
|
|
113
|
+
Angular Universal Live Development Server is listening on ${baseUrl},
|
|
114
|
+
open your browser on ${baseUrl}
|
|
115
|
+
**
|
|
116
|
+
`);
|
|
117
|
+
}), (0, operators_1.mapTo)(builderOutput));
|
|
118
|
+
}
|
|
119
|
+
}), (0, operators_1.map)((builderOutput) => ({
|
|
120
|
+
success: builderOutput.success,
|
|
121
|
+
error: builderOutput.error,
|
|
122
|
+
baseUrl: getBaseUrl(bsInstance),
|
|
123
|
+
port: bsInstance.getOption('port'),
|
|
124
|
+
})), (0, operators_1.finalize)(() => {
|
|
125
|
+
if (bsInstance) {
|
|
126
|
+
bsInstance.exit();
|
|
127
|
+
bsInstance.cleanup();
|
|
128
|
+
}
|
|
129
|
+
}), (0, operators_1.catchError)((error) => (0, rxjs_1.of)({
|
|
130
|
+
success: false,
|
|
131
|
+
error: mapErrorToMessage(error),
|
|
132
|
+
})));
|
|
133
|
+
}
|
|
134
|
+
exports.execute = execute;
|
|
135
|
+
// Logs output to the terminal.
|
|
136
|
+
// Removes any trailing new lines from the output.
|
|
137
|
+
function log({ stderr, stdout }, logger) {
|
|
138
|
+
if (stderr) {
|
|
139
|
+
// Strip the webpack scheme (webpack://) from error log.
|
|
140
|
+
logger.error(stderr.replace(/\n?$/, '').replace(/webpack:\/\//g, '.'));
|
|
141
|
+
}
|
|
142
|
+
if (stdout && !IGNORED_STDOUT_MESSAGES.some((x) => stdout.includes(x))) {
|
|
143
|
+
logger.info(stdout.replace(/\n?$/, ''));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
exports.log = log;
|
|
147
|
+
function startNodeServer(serverOutput, port, logger, inspectMode = false) {
|
|
148
|
+
const outputPath = serverOutput.outputPath;
|
|
149
|
+
const path = (0, path_1.join)(outputPath, 'main.js');
|
|
150
|
+
const env = { ...process.env, PORT: '' + port };
|
|
151
|
+
const args = ['--enable-source-maps', `"${path}"`];
|
|
152
|
+
if (inspectMode) {
|
|
153
|
+
args.unshift('--inspect-brk');
|
|
154
|
+
}
|
|
155
|
+
return (0, rxjs_1.of)(null).pipe((0, operators_1.delay)(0), // Avoid EADDRINUSE error since it will cause the kill event to be finish.
|
|
156
|
+
(0, operators_1.switchMap)(() => (0, utils_1.spawnAsObservable)('node', args, { env, shell: true })), (0, operators_1.tap)((res) => log({ stderr: res.stderr, stdout: res.stdout }, logger)), (0, operators_1.ignoreElements)(),
|
|
157
|
+
// Emit a signal after the process has been started
|
|
158
|
+
(0, operators_1.startWith)(undefined));
|
|
159
|
+
}
|
|
160
|
+
async function initBrowserSync(browserSyncInstance, nodeServerPort, options, context) {
|
|
161
|
+
if (browserSyncInstance.active) {
|
|
162
|
+
return browserSyncInstance;
|
|
163
|
+
}
|
|
164
|
+
const { port: browserSyncPort, open, host, publicHost, proxyConfig } = options;
|
|
165
|
+
const bsPort = browserSyncPort || (await (0, utils_1.getAvailablePort)());
|
|
166
|
+
const bsOptions = {
|
|
167
|
+
proxy: {
|
|
168
|
+
target: `localhost:${nodeServerPort}`,
|
|
169
|
+
proxyOptions: {
|
|
170
|
+
xfwd: true,
|
|
171
|
+
},
|
|
172
|
+
proxyRes: [
|
|
173
|
+
(proxyRes) => {
|
|
174
|
+
if ('headers' in proxyRes) {
|
|
175
|
+
proxyRes.headers['cache-control'] = undefined;
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
],
|
|
179
|
+
// proxyOptions is not in the typings
|
|
180
|
+
},
|
|
181
|
+
host,
|
|
182
|
+
port: bsPort,
|
|
183
|
+
ui: false,
|
|
184
|
+
server: false,
|
|
185
|
+
notify: false,
|
|
186
|
+
ghostMode: false,
|
|
187
|
+
logLevel: options.verbose ? 'debug' : 'silent',
|
|
188
|
+
open,
|
|
189
|
+
https: getSslConfig(context.workspaceRoot, options),
|
|
190
|
+
};
|
|
191
|
+
const publicHostNormalized = publicHost && publicHost.endsWith('/')
|
|
192
|
+
? publicHost.substring(0, publicHost.length - 1)
|
|
193
|
+
: publicHost;
|
|
194
|
+
if (publicHostNormalized) {
|
|
195
|
+
const { protocol, hostname, port, pathname } = url.parse(publicHostNormalized);
|
|
196
|
+
const defaultSocketIoPath = '/browser-sync/socket.io';
|
|
197
|
+
const defaultNamespace = '/browser-sync';
|
|
198
|
+
const hasPathname = !!(pathname && pathname !== '/');
|
|
199
|
+
const namespace = hasPathname ? pathname + defaultNamespace : defaultNamespace;
|
|
200
|
+
const path = hasPathname ? pathname + defaultSocketIoPath : defaultSocketIoPath;
|
|
201
|
+
bsOptions.socket = {
|
|
202
|
+
namespace,
|
|
203
|
+
path,
|
|
204
|
+
domain: url.format({
|
|
205
|
+
protocol,
|
|
206
|
+
hostname,
|
|
207
|
+
port,
|
|
208
|
+
}),
|
|
209
|
+
};
|
|
210
|
+
// When having a pathname we also need to create a reverse proxy because socket.io
|
|
211
|
+
// will be listening on: 'http://localhost:4200/ssr/browser-sync/socket.io'
|
|
212
|
+
// However users will typically have a reverse proxy that will redirect all matching requests
|
|
213
|
+
// ex: http://testinghost.com/ssr -> http://localhost:4200 which will result in a 404.
|
|
214
|
+
if (hasPathname) {
|
|
215
|
+
const { createProxyMiddleware } = await Promise.resolve().then(() => __importStar(require('http-proxy-middleware')));
|
|
216
|
+
// Remove leading slash
|
|
217
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
218
|
+
(bsOptions.scriptPath = (p) => p.substring(1)),
|
|
219
|
+
(bsOptions.middleware = [
|
|
220
|
+
createProxyMiddleware(defaultSocketIoPath, {
|
|
221
|
+
target: url.format({
|
|
222
|
+
protocol: 'http',
|
|
223
|
+
hostname: host,
|
|
224
|
+
port: bsPort,
|
|
225
|
+
pathname: path,
|
|
226
|
+
}),
|
|
227
|
+
ws: true,
|
|
228
|
+
logLevel: 'silent',
|
|
229
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
230
|
+
}),
|
|
231
|
+
]);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (proxyConfig) {
|
|
235
|
+
if (!bsOptions.middleware) {
|
|
236
|
+
bsOptions.middleware = [];
|
|
237
|
+
}
|
|
238
|
+
else if (!Array.isArray(bsOptions.middleware)) {
|
|
239
|
+
bsOptions.middleware = [bsOptions.middleware];
|
|
240
|
+
}
|
|
241
|
+
bsOptions.middleware = [
|
|
242
|
+
...bsOptions.middleware,
|
|
243
|
+
...(await getProxyConfig(context.workspaceRoot, proxyConfig)),
|
|
244
|
+
];
|
|
245
|
+
}
|
|
246
|
+
return new Promise((resolve, reject) => {
|
|
247
|
+
browserSyncInstance.init(bsOptions, (error, bs) => {
|
|
248
|
+
if (error) {
|
|
249
|
+
reject(error);
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
resolve(bs);
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
function mapErrorToMessage(error) {
|
|
258
|
+
if (error instanceof Error) {
|
|
259
|
+
return error.message;
|
|
260
|
+
}
|
|
261
|
+
if (typeof error === 'string') {
|
|
262
|
+
return error;
|
|
263
|
+
}
|
|
264
|
+
return '';
|
|
265
|
+
}
|
|
266
|
+
function getSslConfig(root, options) {
|
|
267
|
+
const { ssl, sslCert, sslKey } = options;
|
|
268
|
+
if (ssl && sslCert && sslKey) {
|
|
269
|
+
return {
|
|
270
|
+
key: (0, path_1.resolve)(root, sslKey),
|
|
271
|
+
cert: (0, path_1.resolve)(root, sslCert),
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
return ssl;
|
|
275
|
+
}
|
|
276
|
+
async function getProxyConfig(root, proxyConfig) {
|
|
277
|
+
const proxyPath = (0, path_1.resolve)(root, proxyConfig);
|
|
278
|
+
let proxySettings;
|
|
279
|
+
try {
|
|
280
|
+
proxySettings = require(proxyPath);
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
(0, error_1.assertIsError)(error);
|
|
284
|
+
if (error.code === 'MODULE_NOT_FOUND') {
|
|
285
|
+
throw new Error(`Proxy config file ${proxyPath} does not exist.`);
|
|
286
|
+
}
|
|
287
|
+
throw error;
|
|
288
|
+
}
|
|
289
|
+
const proxies = Array.isArray(proxySettings) ? proxySettings : [proxySettings];
|
|
290
|
+
const createdProxies = [];
|
|
291
|
+
const { createProxyMiddleware } = await Promise.resolve().then(() => __importStar(require('http-proxy-middleware')));
|
|
292
|
+
for (const proxy of proxies) {
|
|
293
|
+
for (const [key, context] of Object.entries(proxy)) {
|
|
294
|
+
if (typeof key === 'string') {
|
|
295
|
+
createdProxies.push(createProxyMiddleware(key.replace(/^\*$/, '**').replace(/\/\*$/, ''),
|
|
296
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
297
|
+
context));
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
createdProxies.push(
|
|
301
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
302
|
+
createProxyMiddleware(key, context));
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return createdProxies;
|
|
307
|
+
}
|
|
308
|
+
exports.default = (0, architect_1.createBuilder)(execute);
|
|
309
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyX2RldmtpdC9idWlsZF9hbmd1bGFyL3NyYy9idWlsZGVycy9zc3ItZGV2LXNlcnZlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILHlEQUttQztBQUNuQywrQ0FBMkQ7QUFRM0QsK0JBQW9EO0FBQ3BELCtCQUF1RTtBQUN2RSw4Q0Fhd0I7QUFDeEIseUNBQTJCO0FBQzNCLDZDQUFrRDtBQUdsRCxtQ0FBMEY7QUFFMUYsd0RBQXdEO0FBQ3hELE1BQU0sdUJBQXVCLEdBQUc7SUFDOUIscUJBQXFCO0lBQ3JCLDBGQUEwRjtDQUMzRixDQUFDO0FBUUYsU0FBZ0IsT0FBTyxDQUNyQixPQUFtQyxFQUNuQyxPQUF1QjtJQUV2QixNQUFNLGFBQWEsR0FBRyxJQUFBLGtDQUFzQixFQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNwRSxNQUFNLFlBQVksR0FBRyxJQUFBLGtDQUFzQixFQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsRSxNQUFNLFVBQVUsR0FBRyxDQUFDLEVBQXVCLEVBQUUsRUFBRSxDQUM3QyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUFDaEYsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRTtRQUM3RCxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7UUFDcEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1FBQzFCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztRQUN4QixvSUFBb0k7UUFDcEksT0FBTyxFQUFFLEVBQUU7S0FDTyxDQUFDLENBQUM7SUFFdEIsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUU7UUFDM0QsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtRQUMxQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87S0FDTixDQUFDLENBQUM7SUFFdEIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBRXBELE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQUksQ0FBQyxZQUFZLENBQUE7Ozs7Ozs7RUFPdEMsQ0FBQyxDQUFDO0lBRUYsT0FBTyxJQUFBLFVBQUcsRUFBQyxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsSUFBQSx3QkFBZ0IsR0FBRSxDQUFDLENBQUMsSUFBSSxDQUNwRSxJQUFBLHFCQUFTLEVBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRTtRQUNyQyxPQUFPLElBQUEsb0JBQWEsRUFBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUMvQyw2RUFBNkU7UUFDN0UsZ0VBQWdFO1FBQ2hFLElBQUEsd0JBQVksRUFBQyxHQUFHLENBQUMsRUFDakIsSUFBQSxxQkFBUyxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNuQixJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUU7Z0JBQzVCLE9BQU8sSUFBQSxTQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuQjtZQUVELE9BQU8sZUFBZSxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDL0UsSUFBQSxpQkFBSyxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQ2IsSUFBQSxzQkFBVSxFQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBRWhGLE9BQU8sWUFBSyxDQUFDO1lBQ2YsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUMsQ0FBQyxFQUNGLElBQUEsZUFBRyxFQUNELENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNUO1lBQ0U7Z0JBQ0UsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU87Z0JBQy9CLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLO2FBQzFCO1lBQ0QsY0FBYztTQUN3QixDQUMzQyxFQUNELElBQUEsZUFBRyxFQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFO1lBQ3RCLElBQUksYUFBYSxDQUFDLE9BQU8sRUFBRTtnQkFDekIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQzthQUNqRDtRQUNILENBQUMsQ0FBQyxFQUNGLElBQUEsb0JBQVEsRUFBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxDQUMzQixhQUFhLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU87WUFDdkMsQ0FBQyxDQUFDLElBQUEsa0NBQTBCLEVBQUMsY0FBYyxDQUFDO1lBQzVDLENBQUMsQ0FBQyxZQUFLLENBQ1YsRUFDRCxJQUFBLG9CQUFRLEVBQUMsR0FBRyxFQUFFO1lBQ1osS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQyxDQUFDLEVBQ0YsSUFBQSxxQkFBUyxFQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRTtRQUM1QyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRTtZQUMxQixPQUFPLElBQUEsU0FBRSxFQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQzFCO1FBRUQsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFO1lBQ3JCLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUVwQixPQUFPLElBQUEsU0FBRSxFQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQzFCO2FBQU07WUFDTCxPQUFPLElBQUEsV0FBSSxFQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDN0UsSUFBQSxlQUFHLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtnQkFDVCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQy9CLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQUksQ0FBQyxPQUFPLENBQUE7OzRFQUVnQyxPQUFPO3VDQUM1QyxPQUFPOztlQUUvQixDQUFDLENBQUM7WUFDUCxDQUFDLENBQUMsRUFDRixJQUFBLGlCQUFLLEVBQUMsYUFBYSxDQUFDLENBQ3JCLENBQUM7U0FDSDtJQUNILENBQUMsQ0FBQyxFQUNGLElBQUEsZUFBRyxFQUNELENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FDaEIsQ0FBQztRQUNDLE9BQU8sRUFBRSxhQUFhLENBQUMsT0FBTztRQUM5QixLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUs7UUFDMUIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFDL0IsSUFBSSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0tBQ25DLENBQThCLENBQ2xDLEVBQ0QsSUFBQSxvQkFBUSxFQUFDLEdBQUcsRUFBRTtRQUNaLElBQUksVUFBVSxFQUFFO1lBQ2QsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xCLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUN0QjtJQUNILENBQUMsQ0FBQyxFQUNGLElBQUEsc0JBQVUsRUFBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ25CLElBQUEsU0FBRSxFQUFDO1FBQ0QsT0FBTyxFQUFFLEtBQUs7UUFDZCxLQUFLLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxDQUFDO0tBQ2hDLENBQUMsQ0FDSCxDQUNGLENBQUM7QUFDSixDQUFDO0FBN0hELDBCQTZIQztBQUVELCtCQUErQjtBQUMvQixrREFBa0Q7QUFDbEQsU0FBZ0IsR0FBRyxDQUNqQixFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQThELEVBQzlFLE1BQXlCO0lBRXpCLElBQUksTUFBTSxFQUFFO1FBQ1Ysd0RBQXdEO1FBQ3hELE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ3hFO0lBRUQsSUFBSSxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN0RSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDekM7QUFDSCxDQUFDO0FBWkQsa0JBWUM7QUFFRCxTQUFTLGVBQWUsQ0FDdEIsWUFBMkIsRUFDM0IsSUFBWSxFQUNaLE1BQXlCLEVBQ3pCLFdBQVcsR0FBRyxLQUFLO0lBRW5CLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxVQUFvQixDQUFDO0lBQ3JELE1BQU0sSUFBSSxHQUFHLElBQUEsV0FBSSxFQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN6QyxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO0lBRWhELE1BQU0sSUFBSSxHQUFHLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ25ELElBQUksV0FBVyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztLQUMvQjtJQUVELE9BQU8sSUFBQSxTQUFFLEVBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUNsQixJQUFBLGlCQUFLLEVBQUMsQ0FBQyxDQUFDLEVBQUUsMEVBQTBFO0lBQ3BGLElBQUEscUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLHlCQUFpQixFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFDdEUsSUFBQSxlQUFHLEVBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFDckUsSUFBQSwwQkFBYyxHQUFFO0lBQ2hCLG1EQUFtRDtJQUNuRCxJQUFBLHFCQUFTLEVBQUMsU0FBUyxDQUFDLENBQ3JCLENBQUM7QUFDSixDQUFDO0FBRUQsS0FBSyxVQUFVLGVBQWUsQ0FDNUIsbUJBQXdDLEVBQ3hDLGNBQXNCLEVBQ3RCLE9BQW1DLEVBQ25DLE9BQXVCO0lBRXZCLElBQUksbUJBQW1CLENBQUMsTUFBTSxFQUFFO1FBQzlCLE9BQU8sbUJBQW1CLENBQUM7S0FDNUI7SUFFRCxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDL0UsTUFBTSxNQUFNLEdBQUcsZUFBZSxJQUFJLENBQUMsTUFBTSxJQUFBLHdCQUFnQixHQUFFLENBQUMsQ0FBQztJQUM3RCxNQUFNLFNBQVMsR0FBdUI7UUFDcEMsS0FBSyxFQUFFO1lBQ0wsTUFBTSxFQUFFLGFBQWEsY0FBYyxFQUFFO1lBQ3JDLFlBQVksRUFBRTtnQkFDWixJQUFJLEVBQUUsSUFBSTthQUNYO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLENBQUMsUUFBUSxFQUFFLEVBQUU7b0JBQ1gsSUFBSSxTQUFTLElBQUksUUFBUSxFQUFFO3dCQUN6QixRQUFRLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLFNBQVMsQ0FBQztxQkFDL0M7Z0JBQ0gsQ0FBQzthQUNGO1lBQ0QscUNBQXFDO1NBQ2dCO1FBQ3ZELElBQUk7UUFDSixJQUFJLEVBQUUsTUFBTTtRQUNaLEVBQUUsRUFBRSxLQUFLO1FBQ1QsTUFBTSxFQUFFLEtBQUs7UUFDYixNQUFNLEVBQUUsS0FBSztRQUNiLFNBQVMsRUFBRSxLQUFLO1FBQ2hCLFFBQVEsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVE7UUFDOUMsSUFBSTtRQUNKLEtBQUssRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUM7S0FDcEQsQ0FBQztJQUVGLE1BQU0sb0JBQW9CLEdBQ3hCLFVBQVUsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztRQUNwQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLFVBQVUsQ0FBQztJQUVqQixJQUFJLG9CQUFvQixFQUFFO1FBQ3hCLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDL0UsTUFBTSxtQkFBbUIsR0FBRyx5QkFBeUIsQ0FBQztRQUN0RCxNQUFNLGdCQUFnQixHQUFHLGVBQWUsQ0FBQztRQUN6QyxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksUUFBUSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztRQUMvRSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUM7UUFFaEYsU0FBUyxDQUFDLE1BQU0sR0FBRztZQUNqQixTQUFTO1lBQ1QsSUFBSTtZQUNKLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDO2dCQUNqQixRQUFRO2dCQUNSLFFBQVE7Z0JBQ1IsSUFBSTthQUNMLENBQUM7U0FDSCxDQUFDO1FBRUYsa0ZBQWtGO1FBQ2xGLDJFQUEyRTtRQUMzRSw2RkFBNkY7UUFDN0Ysc0ZBQXNGO1FBQ3RGLElBQUksV0FBVyxFQUFFO1lBQ2YsTUFBTSxFQUFFLHFCQUFxQixFQUFFLEdBQUcsd0RBQWEsdUJBQXVCLEdBQUMsQ0FBQztZQUV4RSx1QkFBdUI7WUFDdkIsb0VBQW9FO1lBQ3BFLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHO29CQUN0QixxQkFBcUIsQ0FBQyxtQkFBbUIsRUFBRTt3QkFDekMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUM7NEJBQ2pCLFFBQVEsRUFBRSxNQUFNOzRCQUNoQixRQUFRLEVBQUUsSUFBSTs0QkFDZCxJQUFJLEVBQUUsTUFBTTs0QkFDWixRQUFRLEVBQUUsSUFBSTt5QkFDZixDQUFDO3dCQUNGLEVBQUUsRUFBRSxJQUFJO3dCQUNSLFFBQVEsRUFBRSxRQUFRO3dCQUNsQiw4REFBOEQ7cUJBQy9ELENBQVE7aUJBQ1YsQ0FBQyxDQUFDO1NBQ047S0FDRjtJQUVELElBQUksV0FBVyxFQUFFO1FBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUU7WUFDekIsU0FBUyxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7U0FDM0I7YUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDL0MsU0FBUyxDQUFDLFVBQVUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUMvQztRQUVELFNBQVMsQ0FBQyxVQUFVLEdBQUc7WUFDckIsR0FBRyxTQUFTLENBQUMsVUFBVTtZQUN2QixHQUFHLENBQUMsTUFBTSxjQUFjLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztTQUM5RCxDQUFDO0tBQ0g7SUFFRCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3JDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDaEQsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2Y7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ2I7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsS0FBYztJQUN2QyxJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUU7UUFDMUIsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDO0tBQ3RCO0lBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDN0IsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUVELFNBQVMsWUFBWSxDQUNuQixJQUFZLEVBQ1osT0FBbUM7SUFFbkMsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ3pDLElBQUksR0FBRyxJQUFJLE9BQU8sSUFBSSxNQUFNLEVBQUU7UUFDNUIsT0FBTztZQUNMLEdBQUcsRUFBRSxJQUFBLGNBQVcsRUFBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO1lBQzlCLElBQUksRUFBRSxJQUFBLGNBQVcsRUFBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO1NBQ2pDLENBQUM7S0FDSDtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELEtBQUssVUFBVSxjQUFjLENBQUMsSUFBWSxFQUFFLFdBQW1CO0lBQzdELE1BQU0sU0FBUyxHQUFHLElBQUEsY0FBVyxFQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNqRCxJQUFJLGFBQXNCLENBQUM7SUFDM0IsSUFBSTtRQUNGLGFBQWEsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDcEM7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLElBQUEscUJBQWEsRUFBQyxLQUFLLENBQUMsQ0FBQztRQUVyQixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssa0JBQWtCLEVBQUU7WUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ25FO1FBRUQsTUFBTSxLQUFLLENBQUM7S0FDYjtJQUVELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMvRSxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7SUFDMUIsTUFBTSxFQUFFLHFCQUFxQixFQUFFLEdBQUcsd0RBQWEsdUJBQXVCLEdBQUMsQ0FBQztJQUN4RSxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRTtRQUMzQixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsRCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTtnQkFDM0IsY0FBYyxDQUFDLElBQUksQ0FDakIscUJBQXFCLENBQ25CLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUM5Qyw4REFBOEQ7Z0JBQzlELE9BQWMsQ0FDTSxDQUN2QixDQUFDO2FBQ0g7aUJBQU07Z0JBQ0wsY0FBYyxDQUFDLElBQUk7Z0JBQ2pCLDhEQUE4RDtnQkFDOUQscUJBQXFCLENBQUMsR0FBRyxFQUFFLE9BQWMsQ0FBc0IsQ0FDaEUsQ0FBQzthQUNIO1NBQ0Y7S0FDRjtJQUVELE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxrQkFBZSxJQUFBLHlCQUFhLEVBQTRDLE9BQU8sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7XG4gIEJ1aWxkZXJDb250ZXh0LFxuICBCdWlsZGVyT3V0cHV0LFxuICBjcmVhdGVCdWlsZGVyLFxuICB0YXJnZXRGcm9tVGFyZ2V0U3RyaW5nLFxufSBmcm9tICdAYW5ndWxhci1kZXZraXQvYXJjaGl0ZWN0JztcbmltcG9ydCB7IGpzb24sIGxvZ2dpbmcsIHRhZ3MgfSBmcm9tICdAYW5ndWxhci1kZXZraXQvY29yZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEJyb3dzZXJTeW5jSW5zdGFuY2UsXG4gIE9wdGlvbnMgYXMgQnJvd3NlclN5bmNPcHRpb25zLFxuICBIdHRwc09wdGlvbnMsXG4gIE1pZGRsZXdhcmVIYW5kbGVyLFxuICBQcm94eU9wdGlvbnMsXG59IGZyb20gJ2Jyb3dzZXItc3luYyc7XG5pbXBvcnQgeyBqb2luLCByZXNvbHZlIGFzIHBhdGhSZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBFTVBUWSwgT2JzZXJ2YWJsZSwgY29tYmluZUxhdGVzdCwgZnJvbSwgb2YsIHppcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgY2F0Y2hFcnJvcixcbiAgY29uY2F0TWFwLFxuICBkZWJvdW5jZSxcbiAgZGVib3VuY2VUaW1lLFxuICBkZWxheSxcbiAgZmluYWxpemUsXG4gIGlnbm9yZUVsZW1lbnRzLFxuICBtYXAsXG4gIG1hcFRvLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFwLFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgKiBhcyB1cmwgZnJvbSAndXJsJztcbmltcG9ydCB7IGFzc2VydElzRXJyb3IgfSBmcm9tICcuLi8uLi91dGlscy9lcnJvcic7XG5pbXBvcnQgeyBTY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5cbmltcG9ydCB7IGdldEF2YWlsYWJsZVBvcnQsIHNwYXduQXNPYnNlcnZhYmxlLCB3YWl0VW50aWxTZXJ2ZXJJc0xpc3RlbmluZyB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKiogTG9nIG1lc3NhZ2VzIHRvIGlnbm9yZSBhbmQgbm90IHJlbHkgdG8gdGhlIGxvZ2dlciAqL1xuY29uc3QgSUdOT1JFRF9TVERPVVRfTUVTU0FHRVMgPSBbXG4gICdzZXJ2ZXIgbGlzdGVuaW5nIG9uJyxcbiAgJ0FuZ3VsYXIgaXMgcnVubmluZyBpbiBkZXZlbG9wbWVudCBtb2RlLiBDYWxsIGVuYWJsZVByb2RNb2RlKCkgdG8gZW5hYmxlIHByb2R1Y3Rpb24gbW9kZS4nLFxuXTtcblxudHlwZSBTU1JEZXZTZXJ2ZXJCdWlsZGVyT3B0aW9ucyA9IFNjaGVtYSAmIGpzb24uSnNvbk9iamVjdDtcbmV4cG9ydCB0eXBlIFNTUkRldlNlcnZlckJ1aWxkZXJPdXRwdXQgPSBCdWlsZGVyT3V0cHV0ICYge1xuICBiYXNlVXJsPzogc3RyaW5nO1xuICBwb3J0Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGUoXG4gIG9wdGlvbnM6IFNTUkRldlNlcnZlckJ1aWxkZXJPcHRpb25zLFxuICBjb250ZXh0OiBCdWlsZGVyQ29udGV4dCxcbik6IE9ic2VydmFibGU8U1NSRGV2U2VydmVyQnVpbGRlck91dHB1dD4ge1xuICBjb25zdCBicm93c2VyVGFyZ2V0ID0gdGFyZ2V0RnJvbVRhcmdldFN0cmluZyhvcHRpb25zLmJyb3dzZXJUYXJnZXQpO1xuICBjb25zdCBzZXJ2ZXJUYXJnZXQgPSB0YXJnZXRGcm9tVGFyZ2V0U3RyaW5nKG9wdGlvbnMuc2VydmVyVGFyZ2V0KTtcbiAgY29uc3QgZ2V0QmFzZVVybCA9IChiczogQnJvd3NlclN5bmNJbnN0YW5jZSkgPT5cbiAgICBgJHticy5nZXRPcHRpb24oJ3NjaGVtZScpfTovLyR7YnMuZ2V0T3B0aW9uKCdob3N0Jyl9OiR7YnMuZ2V0T3B0aW9uKCdwb3J0Jyl9YDtcbiAgY29uc3QgYnJvd3NlclRhcmdldFJ1biA9IGNvbnRleHQuc2NoZWR1bGVUYXJnZXQoYnJvd3NlclRhcmdldCwge1xuICAgIHdhdGNoOiBvcHRpb25zLndhdGNoLFxuICAgIHByb2dyZXNzOiBvcHRpb25zLnByb2dyZXNzLFxuICAgIHZlcmJvc2U6IG9wdGlvbnMudmVyYm9zZSxcbiAgICAvLyBEaXNhYmxlIGJ1bmRsZSBidWRnZXRzIGFyZSB0aGVzZSBhcmUgbm90IG1lYW50IHRvIGJlIHVzZWQgd2l0aCBhIGRldi1zZXJ2ZXIgYXMgdGhpcyB3aWxsIGFkZCBleHRyYSBKYXZhU2NyaXB0IGZvciBsaXZlLXJlbG9hZGluZy5cbiAgICBidWRnZXRzOiBbXSxcbiAgfSBhcyBqc29uLkpzb25PYmplY3QpO1xuXG4gIGNvbnN0IHNlcnZlclRhcmdldFJ1biA9IGNvbnRleHQuc2NoZWR1bGVUYXJnZXQoc2VydmVyVGFyZ2V0LCB7XG4gICAgd2F0Y2g6IG9wdGlvbnMud2F0Y2gsXG4gICAgcHJvZ3Jlc3M6IG9wdGlvbnMucHJvZ3Jlc3MsXG4gICAgdmVyYm9zZTogb3B0aW9ucy52ZXJib3NlLFxuICB9IGFzIGpzb24uSnNvbk9iamVjdCk7XG5cbiAgY29uc3QgYnNJbnN0YW5jZSA9IHJlcXVpcmUoJ2Jyb3dzZXItc3luYycpLmNyZWF0ZSgpO1xuXG4gIGNvbnRleHQubG9nZ2VyLmVycm9yKHRhZ3Muc3RyaXBJbmRlbnRzYFxuICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIFRoaXMgaXMgYSBzaW1wbGUgc2VydmVyIGZvciB1c2UgaW4gdGVzdGluZyBvciBkZWJ1Z2dpbmcgQW5ndWxhciBhcHBsaWNhdGlvbnMgbG9jYWxseS5cbiAgSXQgaGFzbid0IGJlZW4gcmV2aWV3ZWQgZm9yIHNlY3VyaXR5IGlzc3Vlcy5cblxuICBET04nVCBVU0UgSVQgRk9SIFBST0RVQ1RJT04hXG4gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiBgKTtcblxuICByZXR1cm4gemlwKGJyb3dzZXJUYXJnZXRSdW4sIHNlcnZlclRhcmdldFJ1biwgZ2V0QXZhaWxhYmxlUG9ydCgpKS5waXBlKFxuICAgIHN3aXRjaE1hcCgoW2JyLCBzciwgbm9kZVNlcnZlclBvcnRdKSA9PiB7XG4gICAgICByZXR1cm4gY29tYmluZUxhdGVzdChbYnIub3V0cHV0LCBzci5vdXRwdXRdKS5waXBlKFxuICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBzbyB0aGF0IGlmIGJvdGggc2VydmVyIGFuZCBicm93c2VyIGVtaXQgY2xvc2UgdG8gZWFjaCBvdGhlclxuICAgICAgICAvLyB3ZSBvbmx5IGVtaXQgb25jZS4gVGhpcyB0eXBpY2FsbHkgaGFwcGVucyBvbiB0aGUgZmlyc3QgYnVpbGQuXG4gICAgICAgIGRlYm91bmNlVGltZSgxMjApLFxuICAgICAgICBzd2l0Y2hNYXAoKFtiLCBzXSkgPT4ge1xuICAgICAgICAgIGlmICghcy5zdWNjZXNzIHx8ICFiLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHJldHVybiBvZihbYiwgc10pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzdGFydE5vZGVTZXJ2ZXIocywgbm9kZVNlcnZlclBvcnQsIGNvbnRleHQubG9nZ2VyLCAhIW9wdGlvbnMuaW5zcGVjdCkucGlwZShcbiAgICAgICAgICAgIG1hcFRvKFtiLCBzXSksXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgY29udGV4dC5sb2dnZXIuZXJyb3IoYEEgc2VydmVyIGVycm9yIGhhcyBvY2N1cnJlZC5cXG4ke21hcEVycm9yVG9NZXNzYWdlKGVycil9YCk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSksXG4gICAgICAgIG1hcChcbiAgICAgICAgICAoW2IsIHNdKSA9PlxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogYi5zdWNjZXNzICYmIHMuc3VjY2VzcyxcbiAgICAgICAgICAgICAgICBlcnJvcjogYi5lcnJvciB8fCBzLmVycm9yLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBub2RlU2VydmVyUG9ydCxcbiAgICAgICAgICAgIF0gYXMgW1NTUkRldlNlcnZlckJ1aWxkZXJPdXRwdXQsIG51bWJlcl0sXG4gICAgICAgICksXG4gICAgICAgIHRhcCgoW2J1aWxkZXJPdXRwdXRdKSA9PiB7XG4gICAgICAgICAgaWYgKGJ1aWxkZXJPdXRwdXQuc3VjY2Vzcykge1xuICAgICAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbygnXFxuQ29tcGlsZWQgc3VjY2Vzc2Z1bGx5LicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlYm91bmNlKChbYnVpbGRlck91dHB1dF0pID0+XG4gICAgICAgICAgYnVpbGRlck91dHB1dC5zdWNjZXNzICYmICFvcHRpb25zLmluc3BlY3RcbiAgICAgICAgICAgID8gd2FpdFVudGlsU2VydmVySXNMaXN0ZW5pbmcobm9kZVNlcnZlclBvcnQpXG4gICAgICAgICAgICA6IEVNUFRZLFxuICAgICAgICApLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdm9pZCBici5zdG9wKCk7XG4gICAgICAgICAgdm9pZCBzci5zdG9wKCk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KSxcbiAgICBjb25jYXRNYXAoKFtidWlsZGVyT3V0cHV0LCBub2RlU2VydmVyUG9ydF0pID0+IHtcbiAgICAgIGlmICghYnVpbGRlck91dHB1dC5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiBvZihidWlsZGVyT3V0cHV0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJzSW5zdGFuY2UuYWN0aXZlKSB7XG4gICAgICAgIGJzSW5zdGFuY2UucmVsb2FkKCk7XG5cbiAgICAgICAgcmV0dXJuIG9mKGJ1aWxkZXJPdXRwdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZyb20oaW5pdEJyb3dzZXJTeW5jKGJzSW5zdGFuY2UsIG5vZGVTZXJ2ZXJQb3J0LCBvcHRpb25zLCBjb250ZXh0KSkucGlwZShcbiAgICAgICAgICB0YXAoKGJzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiYXNlVXJsID0gZ2V0QmFzZVVybChicyk7XG4gICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKHRhZ3Mub25lTGluZWBcbiAgICAgICAgICAgICAgICAqKlxuICAgICAgICAgICAgICAgIEFuZ3VsYXIgVW5pdmVyc2FsIExpdmUgRGV2ZWxvcG1lbnQgU2VydmVyIGlzIGxpc3RlbmluZyBvbiAke2Jhc2VVcmx9LFxuICAgICAgICAgICAgICAgIG9wZW4geW91ciBicm93c2VyIG9uICR7YmFzZVVybH1cbiAgICAgICAgICAgICAgICAqKlxuICAgICAgICAgICAgICBgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBtYXBUbyhidWlsZGVyT3V0cHV0KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBtYXAoXG4gICAgICAoYnVpbGRlck91dHB1dCkgPT5cbiAgICAgICAgKHtcbiAgICAgICAgICBzdWNjZXNzOiBidWlsZGVyT3V0cHV0LnN1Y2Nlc3MsXG4gICAgICAgICAgZXJyb3I6IGJ1aWxkZXJPdXRwdXQuZXJyb3IsXG4gICAgICAgICAgYmFzZVVybDogZ2V0QmFzZVVybChic0luc3RhbmNlKSxcbiAgICAgICAgICBwb3J0OiBic0luc3RhbmNlLmdldE9wdGlvbigncG9ydCcpLFxuICAgICAgICB9KSBhcyBTU1JEZXZTZXJ2ZXJCdWlsZGVyT3V0cHV0LFxuICAgICksXG4gICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgaWYgKGJzSW5zdGFuY2UpIHtcbiAgICAgICAgYnNJbnN0YW5jZS5leGl0KCk7XG4gICAgICAgIGJzSW5zdGFuY2UuY2xlYW51cCgpO1xuICAgICAgfVxuICAgIH0pLFxuICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PlxuICAgICAgb2Yoe1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IG1hcEVycm9yVG9NZXNzYWdlKGVycm9yKSxcbiAgICAgIH0pLFxuICAgICksXG4gICk7XG59XG5cbi8vIExvZ3Mgb3V0cHV0IHRvIHRoZSB0ZXJtaW5hbC5cbi8vIFJlbW92ZXMgYW55IHRyYWlsaW5nIG5ldyBsaW5lcyBmcm9tIHRoZSBvdXRwdXQuXG5leHBvcnQgZnVuY3Rpb24gbG9nKFxuICB7IHN0ZGVyciwgc3Rkb3V0IH06IHsgc3RkZXJyOiBzdHJpbmcgfCB1bmRlZmluZWQ7IHN0ZG91dDogc3RyaW5nIHwgdW5kZWZpbmVkIH0sXG4gIGxvZ2dlcjogbG9nZ2luZy5Mb2dnZXJBcGksXG4pIHtcbiAgaWYgKHN0ZGVycikge1xuICAgIC8vIFN0cmlwIHRoZSB3ZWJwYWNrIHNjaGVtZSAod2VicGFjazovLykgZnJvbSBlcnJvciBsb2cuXG4gICAgbG9nZ2VyLmVycm9yKHN0ZGVyci5yZXBsYWNlKC9cXG4/JC8sICcnKS5yZXBsYWNlKC93ZWJwYWNrOlxcL1xcLy9nLCAnLicpKTtcbiAgfVxuXG4gIGlmIChzdGRvdXQgJiYgIUlHTk9SRURfU1RET1VUX01FU1NBR0VTLnNvbWUoKHgpID0+IHN0ZG91dC5pbmNsdWRlcyh4KSkpIHtcbiAgICBsb2dnZXIuaW5mbyhzdGRvdXQucmVwbGFjZSgvXFxuPyQvLCAnJykpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0Tm9kZVNlcnZlcihcbiAgc2VydmVyT3V0cHV0OiBCdWlsZGVyT3V0cHV0LFxuICBwb3J0OiBudW1iZXIsXG4gIGxvZ2dlcjogbG9nZ2luZy5Mb2dnZXJBcGksXG4gIGluc3BlY3RNb2RlID0gZmFsc2UsXG4pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgY29uc3Qgb3V0cHV0UGF0aCA9IHNlcnZlck91dHB1dC5vdXRwdXRQYXRoIGFzIHN0cmluZztcbiAgY29uc3QgcGF0aCA9IGpvaW4ob3V0cHV0UGF0aCwgJ21haW4uanMnKTtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiwgUE9SVDogJycgKyBwb3J0IH07XG5cbiAgY29uc3QgYXJncyA9IFsnLS1lbmFibGUtc291cmNlLW1hcHMnLCBgXCIke3BhdGh9XCJgXTtcbiAgaWYgKGluc3BlY3RNb2RlKSB7XG4gICAgYXJncy51bnNoaWZ0KCctLWluc3BlY3QtYnJrJyk7XG4gIH1cblxuICByZXR1cm4gb2YobnVsbCkucGlwZShcbiAgICBkZWxheSgwKSwgLy8gQXZvaWQgRUFERFJJTlVTRSBlcnJvciBzaW5jZSBpdCB3aWxsIGNhdXNlIHRoZSBraWxsIGV2ZW50IHRvIGJlIGZpbmlzaC5cbiAgICBzd2l0Y2hNYXAoKCkgPT4gc3Bhd25Bc09ic2VydmFibGUoJ25vZGUnLCBhcmdzLCB7IGVudiwgc2hlbGw6IHRydWUgfSkpLFxuICAgIHRhcCgocmVzKSA9PiBsb2coeyBzdGRlcnI6IHJlcy5zdGRlcnIsIHN0ZG91dDogcmVzLnN0ZG91dCB9LCBsb2dnZXIpKSxcbiAgICBpZ25vcmVFbGVtZW50cygpLFxuICAgIC8vIEVtaXQgYSBzaWduYWwgYWZ0ZXIgdGhlIHByb2Nlc3MgaGFzIGJlZW4gc3RhcnRlZFxuICAgIHN0YXJ0V2l0aCh1bmRlZmluZWQpLFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbml0QnJvd3NlclN5bmMoXG4gIGJyb3dzZXJTeW5jSW5zdGFuY2U6IEJyb3dzZXJTeW5jSW5zdGFuY2UsXG4gIG5vZGVTZXJ2ZXJQb3J0OiBudW1iZXIsXG4gIG9wdGlvbnM6IFNTUkRldlNlcnZlckJ1aWxkZXJPcHRpb25zLFxuICBjb250ZXh0OiBCdWlsZGVyQ29udGV4dCxcbik6IFByb21pc2U8QnJvd3NlclN5bmNJbnN0YW5jZT4ge1xuICBpZiAoYnJvd3NlclN5bmNJbnN0YW5jZS5hY3RpdmUpIHtcbiAgICByZXR1cm4gYnJvd3NlclN5bmNJbnN0YW5jZTtcbiAgfVxuXG4gIGNvbnN0IHsgcG9ydDogYnJvd3NlclN5bmNQb3J0LCBvcGVuLCBob3N0LCBwdWJsaWNIb3N0LCBwcm94eUNvbmZpZyB9ID0gb3B0aW9ucztcbiAgY29uc3QgYnNQb3J0ID0gYnJvd3NlclN5bmNQb3J0IHx8IChhd2FpdCBnZXRBdmFpbGFibGVQb3J0KCkpO1xuICBjb25zdCBic09wdGlvbnM6IEJyb3dzZXJTeW5jT3B0aW9ucyA9IHtcbiAgICBwcm94eToge1xuICAgICAgdGFyZ2V0OiBgbG9jYWxob3N0OiR7bm9kZVNlcnZlclBvcnR9YCxcbiAgICAgIHByb3h5T3B0aW9uczoge1xuICAgICAgICB4ZndkOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHByb3h5UmVzOiBbXG4gICAgICAgIChwcm94eVJlcykgPT4ge1xuICAgICAgICAgIGlmICgnaGVhZGVycycgaW4gcHJveHlSZXMpIHtcbiAgICAgICAgICAgIHByb3h5UmVzLmhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgLy8gcHJveHlPcHRpb25zIGlzIG5vdCBpbiB0aGUgdHlwaW5nc1xuICAgIH0gYXMgUHJveHlPcHRpb25zICYgeyBwcm94eU9wdGlvbnM6IHsgeGZ3ZDogYm9vbGVhbiB9IH0sXG4gICAgaG9zdCxcbiAgICBwb3J0OiBic1BvcnQsXG4gICAgdWk6IGZhbHNlLFxuICAgIHNlcnZlcjogZmFsc2UsXG4gICAgbm90aWZ5OiBmYWxzZSxcbiAgICBnaG9zdE1vZGU6IGZhbHNlLFxuICAgIGxvZ0xldmVsOiBvcHRpb25zLnZlcmJvc2UgPyAnZGVidWcnIDogJ3NpbGVudCcsXG4gICAgb3BlbixcbiAgICBodHRwczogZ2V0U3NsQ29uZmlnKGNvbnRleHQud29ya3NwYWNlUm9vdCwgb3B0aW9ucyksXG4gIH07XG5cbiAgY29uc3QgcHVibGljSG9zdE5vcm1hbGl6ZWQgPVxuICAgIHB1YmxpY0hvc3QgJiYgcHVibGljSG9zdC5lbmRzV2l0aCgnLycpXG4gICAgICA/IHB1YmxpY0hvc3Quc3Vic3RyaW5nKDAsIHB1YmxpY0hvc3QubGVuZ3RoIC0gMSlcbiAgICAgIDogcHVibGljSG9zdDtcblxuICBpZiAocHVibGljSG9zdE5vcm1hbGl6ZWQpIHtcbiAgICBjb25zdCB7IHByb3RvY29sLCBob3N0bmFtZSwgcG9ydCwgcGF0aG5hbWUgfSA9IHVybC5wYXJzZShwdWJsaWNIb3N0Tm9ybWFsaXplZCk7XG4gICAgY29uc3QgZGVmYXVsdFNvY2tldElvUGF0aCA9ICcvYnJvd3Nlci1zeW5jL3NvY2tldC5pbyc7XG4gICAgY29uc3QgZGVmYXVsdE5hbWVzcGFjZSA9ICcvYnJvd3Nlci1zeW5jJztcbiAgICBjb25zdCBoYXNQYXRobmFtZSA9ICEhKHBhdGhuYW1lICYmIHBhdGhuYW1lICE9PSAnLycpO1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IGhhc1BhdGhuYW1lID8gcGF0aG5hbWUgKyBkZWZhdWx0TmFtZXNwYWNlIDogZGVmYXVsdE5hbWVzcGFjZTtcbiAgICBjb25zdCBwYXRoID0gaGFzUGF0aG5hbWUgPyBwYXRobmFtZSArIGRlZmF1bHRTb2NrZXRJb1BhdGggOiBkZWZhdWx0U29ja2V0SW9QYXRoO1xuXG4gICAgYnNPcHRpb25zLnNvY2tldCA9IHtcbiAgICAgIG5hbWVzcGFjZSxcbiAgICAgIHBhdGgsXG4gICAgICBkb21haW46IHVybC5mb3JtYXQoe1xuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgaG9zdG5hbWUsXG4gICAgICAgIHBvcnQsXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgLy8gV2hlbiBoYXZpbmcgYSBwYXRobmFtZSB3ZSBhbHNvIG5lZWQgdG8gY3JlYXRlIGEgcmV2ZXJzZSBwcm94eSBiZWNhdXNlIHNvY2tldC5pb1xuICAgIC8vIHdpbGwgYmUgbGlzdGVuaW5nIG9uOiAnaHR0cDovL2xvY2FsaG9zdDo0MjAwL3Nzci9icm93c2VyLXN5bmMvc29ja2V0LmlvJ1xuICAgIC8vIEhvd2V2ZXIgdXNlcnMgd2lsbCB0eXBpY2FsbHkgaGF2ZSBhIHJldmVyc2UgcHJveHkgdGhhdCB3aWxsIHJlZGlyZWN0IGFsbCBtYXRjaGluZyByZXF1ZXN0c1xuICAgIC8vIGV4OiBodHRwOi8vdGVzdGluZ2hvc3QuY29tL3NzciAtPiBodHRwOi8vbG9jYWxob3N0OjQyMDAgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSA0MDQuXG4gICAgaWYgKGhhc1BhdGhuYW1lKSB7XG4gICAgICBjb25zdCB7IGNyZWF0ZVByb3h5TWlkZGxld2FyZSB9ID0gYXdhaXQgaW1wb3J0KCdodHRwLXByb3h5LW1pZGRsZXdhcmUnKTtcblxuICAgICAgLy8gUmVtb3ZlIGxlYWRpbmcgc2xhc2hcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLWV4cHJlc3Npb25zXG4gICAgICAoYnNPcHRpb25zLnNjcmlwdFBhdGggPSAocCkgPT4gcC5zdWJzdHJpbmcoMSkpLFxuICAgICAgICAoYnNPcHRpb25zLm1pZGRsZXdhcmUgPSBbXG4gICAgICAgICAgY3JlYXRlUHJveHlNaWRkbGV3YXJlKGRlZmF1bHRTb2NrZXRJb1BhdGgsIHtcbiAgICAgICAgICAgIHRhcmdldDogdXJsLmZvcm1hdCh7XG4gICAgICAgICAgICAgIHByb3RvY29sOiAnaHR0cCcsXG4gICAgICAgICAgICAgIGhvc3RuYW1lOiBob3N0LFxuICAgICAgICAgICAgICBwb3J0OiBic1BvcnQsXG4gICAgICAgICAgICAgIHBhdGhuYW1lOiBwYXRoLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB3czogdHJ1ZSxcbiAgICAgICAgICAgIGxvZ0xldmVsOiAnc2lsZW50JyxcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgfSkgYXMgYW55LFxuICAgICAgICBdKTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJveHlDb25maWcpIHtcbiAgICBpZiAoIWJzT3B0aW9ucy5taWRkbGV3YXJlKSB7XG4gICAgICBic09wdGlvbnMubWlkZGxld2FyZSA9IFtdO1xuICAgIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoYnNPcHRpb25zLm1pZGRsZXdhcmUpKSB7XG4gICAgICBic09wdGlvbnMubWlkZGxld2FyZSA9IFtic09wdGlvbnMubWlkZGxld2FyZV07XG4gICAgfVxuXG4gICAgYnNPcHRpb25zLm1pZGRsZXdhcmUgPSBbXG4gICAgICAuLi5ic09wdGlvbnMubWlkZGxld2FyZSxcbiAgICAgIC4uLihhd2FpdCBnZXRQcm94eUNvbmZpZyhjb250ZXh0LndvcmtzcGFjZVJvb3QsIHByb3h5Q29uZmlnKSksXG4gICAgXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgYnJvd3NlclN5bmNJbnN0YW5jZS5pbml0KGJzT3B0aW9ucywgKGVycm9yLCBicykgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKGJzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1hcEVycm9yVG9NZXNzYWdlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBnZXRTc2xDb25maWcoXG4gIHJvb3Q6IHN0cmluZyxcbiAgb3B0aW9uczogU1NSRGV2U2VydmVyQnVpbGRlck9wdGlvbnMsXG4pOiBIdHRwc09wdGlvbnMgfCB1bmRlZmluZWQgfCBib29sZWFuIHtcbiAgY29uc3QgeyBzc2wsIHNzbENlcnQsIHNzbEtleSB9ID0gb3B0aW9ucztcbiAgaWYgKHNzbCAmJiBzc2xDZXJ0ICYmIHNzbEtleSkge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6IHBhdGhSZXNvbHZlKHJvb3QsIHNzbEtleSksXG4gICAgICBjZXJ0OiBwYXRoUmVzb2x2ZShyb290LCBzc2xDZXJ0KSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHNzbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UHJveHlDb25maWcocm9vdDogc3RyaW5nLCBwcm94eUNvbmZpZzogc3RyaW5nKTogUHJvbWlzZTxNaWRkbGV3YXJlSGFuZGxlcltdPiB7XG4gIGNvbnN0IHByb3h5UGF0aCA9IHBhdGhSZXNvbHZlKHJvb3QsIHByb3h5Q29uZmlnKTtcbiAgbGV0IHByb3h5U2V0dGluZ3M6IHVua25vd247XG4gIHRyeSB7XG4gICAgcHJveHlTZXR0aW5ncyA9IHJlcXVpcmUocHJveHlQYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhc3NlcnRJc0Vycm9yKGVycm9yKTtcblxuICAgIGlmIChlcnJvci5jb2RlID09PSAnTU9EVUxFX05PVF9GT1VORCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJveHkgY29uZmlnIGZpbGUgJHtwcm94eVBhdGh9IGRvZXMgbm90IGV4aXN0LmApO1xuICAgIH1cblxuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgY29uc3QgcHJveGllcyA9IEFycmF5LmlzQXJyYXkocHJveHlTZXR0aW5ncykgPyBwcm94eVNldHRpbmdzIDogW3Byb3h5U2V0dGluZ3NdO1xuICBjb25zdCBjcmVhdGVkUHJveGllcyA9IFtdO1xuICBjb25zdCB7IGNyZWF0ZVByb3h5TWlkZGxld2FyZSB9ID0gYXdhaXQgaW1wb3J0KCdodHRwLXByb3h5LW1pZGRsZXdhcmUnKTtcbiAgZm9yIChjb25zdCBwcm94eSBvZiBwcm94aWVzKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCBjb250ZXh0XSBvZiBPYmplY3QuZW50cmllcyhwcm94eSkpIHtcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBjcmVhdGVkUHJveGllcy5wdXNoKFxuICAgICAgICAgIGNyZWF0ZVByb3h5TWlkZGxld2FyZShcbiAgICAgICAgICAgIGtleS5yZXBsYWNlKC9eXFwqJC8sICcqKicpLnJlcGxhY2UoL1xcL1xcKiQvLCAnJyksXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgY29udGV4dCBhcyBhbnksXG4gICAgICAgICAgKSBhcyBNaWRkbGV3YXJlSGFuZGxlcixcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNyZWF0ZWRQcm94aWVzLnB1c2goXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICBjcmVhdGVQcm94eU1pZGRsZXdhcmUoa2V5LCBjb250ZXh0IGFzIGFueSkgYXMgTWlkZGxld2FyZUhhbmRsZXIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZWRQcm94aWVzO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVCdWlsZGVyPFNTUkRldlNlcnZlckJ1aWxkZXJPcHRpb25zLCBCdWlsZGVyT3V0cHV0PihleGVjdXRlKTtcbiJdfQ==
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSR Dev Server target options for Build Facade.
|
|
3
|
+
*/
|
|
4
|
+
export interface Schema {
|
|
5
|
+
/**
|
|
6
|
+
* Browser target to build.
|
|
7
|
+
*/
|
|
8
|
+
browserTarget: string;
|
|
9
|
+
/**
|
|
10
|
+
* Host to listen on.
|
|
11
|
+
*/
|
|
12
|
+
host?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Launch the development server in inspector mode and listen on address and port
|
|
15
|
+
* '127.0.0.1:9229'.
|
|
16
|
+
*/
|
|
17
|
+
inspect?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Opens the url in default browser.
|
|
20
|
+
*/
|
|
21
|
+
open?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Port to start the development server at. Default is 4200. Pass 0 to get a dynamically
|
|
24
|
+
* assigned port.
|
|
25
|
+
*/
|
|
26
|
+
port?: number;
|
|
27
|
+
/**
|
|
28
|
+
* Log progress to the console while building.
|
|
29
|
+
*/
|
|
30
|
+
progress?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Proxy configuration file.
|
|
33
|
+
*/
|
|
34
|
+
proxyConfig?: string;
|
|
35
|
+
/**
|
|
36
|
+
* The URL that the browser client should use to connect to the development server. Use for
|
|
37
|
+
* a complex dev server setup, such as one with reverse proxies.
|
|
38
|
+
*/
|
|
39
|
+
publicHost?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Server target to build.
|
|
42
|
+
*/
|
|
43
|
+
serverTarget: string;
|
|
44
|
+
/**
|
|
45
|
+
* Serve using HTTPS.
|
|
46
|
+
*/
|
|
47
|
+
ssl?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* SSL certificate to use for serving HTTPS.
|
|
50
|
+
*/
|
|
51
|
+
sslCert?: string;
|
|
52
|
+
/**
|
|
53
|
+
* SSL key to use for serving HTTPS.
|
|
54
|
+
*/
|
|
55
|
+
sslKey?: string;
|
|
56
|
+
/**
|
|
57
|
+
* Adds more details to output logging.
|
|
58
|
+
*/
|
|
59
|
+
verbose?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Rebuild on change.
|
|
62
|
+
*/
|
|
63
|
+
watch?: boolean;
|
|
64
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// THIS FILE IS AUTOMATICALLY GENERATED. TO UPDATE THIS FILE YOU NEED TO CHANGE THE
|
|
3
|
+
// CORRESPONDING JSON SCHEMA FILE, THEN RUN devkit-admin build (or bazel build ...).
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhcl9kZXZraXQvYnVpbGRfYW5ndWxhci9zcmMvYnVpbGRlcnMvc3NyLWRldi1zZXJ2ZXIvc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxtRkFBbUY7QUFDbkYsb0ZBQW9GIiwic291cmNlc0NvbnRlbnQiOlsiXG4vLyBUSElTIEZJTEUgSVMgQVVUT01BVElDQUxMWSBHRU5FUkFURUQuIFRPIFVQREFURSBUSElTIEZJTEUgWU9VIE5FRUQgVE8gQ0hBTkdFIFRIRVxuLy8gQ09SUkVTUE9ORElORyBKU09OIFNDSEVNQSBGSUxFLCBUSEVOIFJVTiBkZXZraXQtYWRtaW4gYnVpbGQgKG9yIGJhemVsIGJ1aWxkIC4uLikuXG5cbi8qKlxuICogU1NSIERldiBTZXJ2ZXIgdGFyZ2V0IG9wdGlvbnMgZm9yIEJ1aWxkIEZhY2FkZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2hlbWEge1xuICAgIC8qKlxuICAgICAqIEJyb3dzZXIgdGFyZ2V0IHRvIGJ1aWxkLlxuICAgICAqL1xuICAgIGJyb3dzZXJUYXJnZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBIb3N0IHRvIGxpc3RlbiBvbi5cbiAgICAgKi9cbiAgICBob3N0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExhdW5jaCB0aGUgZGV2ZWxvcG1lbnQgc2VydmVyIGluIGluc3BlY3RvciBtb2RlIGFuZCBsaXN0ZW4gb24gYWRkcmVzcyBhbmQgcG9ydFxuICAgICAqICcxMjcuMC4wLjE6OTIyOScuXG4gICAgICovXG4gICAgaW5zcGVjdD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIHVybCBpbiBkZWZhdWx0IGJyb3dzZXIuXG4gICAgICovXG4gICAgb3Blbj86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUG9ydCB0byBzdGFydCB0aGUgZGV2ZWxvcG1lbnQgc2VydmVyIGF0LiBEZWZhdWx0IGlzIDQyMDAuIFBhc3MgMCB0byBnZXQgYSBkeW5hbWljYWxseVxuICAgICAqIGFzc2lnbmVkIHBvcnQuXG4gICAgICovXG4gICAgcG9ydD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBMb2cgcHJvZ3Jlc3MgdG8gdGhlIGNvbnNvbGUgd2hpbGUgYnVpbGRpbmcuXG4gICAgICovXG4gICAgcHJvZ3Jlc3M/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFByb3h5IGNvbmZpZ3VyYXRpb24gZmlsZS5cbiAgICAgKi9cbiAgICBwcm94eUNvbmZpZz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRoYXQgdGhlIGJyb3dzZXIgY2xpZW50IHNob3VsZCB1c2UgdG8gY29ubmVjdCB0byB0aGUgZGV2ZWxvcG1lbnQgc2VydmVyLiBVc2UgZm9yXG4gICAgICogYSBjb21wbGV4IGRldiBzZXJ2ZXIgc2V0dXAsIHN1Y2ggYXMgb25lIHdpdGggcmV2ZXJzZSBwcm94aWVzLlxuICAgICAqL1xuICAgIHB1YmxpY0hvc3Q/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU2VydmVyIHRhcmdldCB0byBidWlsZC5cbiAgICAgKi9cbiAgICBzZXJ2ZXJUYXJnZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTZXJ2ZSB1c2luZyBIVFRQUy5cbiAgICAgKi9cbiAgICBzc2w/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNTTCBjZXJ0aWZpY2F0ZSB0byB1c2UgZm9yIHNlcnZpbmcgSFRUUFMuXG4gICAgICovXG4gICAgc3NsQ2VydD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTU0wga2V5IHRvIHVzZSBmb3Igc2VydmluZyBIVFRQUy5cbiAgICAgKi9cbiAgICBzc2xLZXk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQWRkcyBtb3JlIGRldGFpbHMgdG8gb3V0cHV0IGxvZ2dpbmcuXG4gICAgICovXG4gICAgdmVyYm9zZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUmVidWlsZCBvbiBjaGFuZ2UuXG4gICAgICovXG4gICAgd2F0Y2g/OiBib29sZWFuO1xufVxuIl19
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema",
|
|
3
|
+
"title": "SSR Dev Server Target",
|
|
4
|
+
"description": "SSR Dev Server target options for Build Facade.",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"browserTarget": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"description": "Browser target to build.",
|
|
10
|
+
"pattern": ".+:.+(:.+)?"
|
|
11
|
+
},
|
|
12
|
+
"serverTarget": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"description": "Server target to build.",
|
|
15
|
+
"pattern": ".+:.+(:.+)?"
|
|
16
|
+
},
|
|
17
|
+
"host": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"description": "Host to listen on.",
|
|
20
|
+
"default": "localhost"
|
|
21
|
+
},
|
|
22
|
+
"port": {
|
|
23
|
+
"type": "number",
|
|
24
|
+
"default": 4200,
|
|
25
|
+
"description": "Port to start the development server at. Default is 4200. Pass 0 to get a dynamically assigned port."
|
|
26
|
+
},
|
|
27
|
+
"watch": {
|
|
28
|
+
"type": "boolean",
|
|
29
|
+
"description": "Rebuild on change.",
|
|
30
|
+
"default": true
|
|
31
|
+
},
|
|
32
|
+
"publicHost": {
|
|
33
|
+
"type": "string",
|
|
34
|
+
"description": "The URL that the browser client should use to connect to the development server. Use for a complex dev server setup, such as one with reverse proxies."
|
|
35
|
+
},
|
|
36
|
+
"open": {
|
|
37
|
+
"type": "boolean",
|
|
38
|
+
"description": "Opens the url in default browser.",
|
|
39
|
+
"default": false,
|
|
40
|
+
"alias": "o"
|
|
41
|
+
},
|
|
42
|
+
"progress": {
|
|
43
|
+
"type": "boolean",
|
|
44
|
+
"description": "Log progress to the console while building."
|
|
45
|
+
},
|
|
46
|
+
"inspect": {
|
|
47
|
+
"type": "boolean",
|
|
48
|
+
"description": "Launch the development server in inspector mode and listen on address and port '127.0.0.1:9229'.",
|
|
49
|
+
"default": false
|
|
50
|
+
},
|
|
51
|
+
"ssl": {
|
|
52
|
+
"type": "boolean",
|
|
53
|
+
"description": "Serve using HTTPS.",
|
|
54
|
+
"default": false
|
|
55
|
+
},
|
|
56
|
+
"sslKey": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"description": "SSL key to use for serving HTTPS."
|
|
59
|
+
},
|
|
60
|
+
"sslCert": {
|
|
61
|
+
"type": "string",
|
|
62
|
+
"description": "SSL certificate to use for serving HTTPS."
|
|
63
|
+
},
|
|
64
|
+
"proxyConfig": {
|
|
65
|
+
"type": "string",
|
|
66
|
+
"description": "Proxy configuration file."
|
|
67
|
+
},
|
|
68
|
+
"verbose": {
|
|
69
|
+
"type": "boolean",
|
|
70
|
+
"description": "Adds more details to output logging."
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"additionalProperties": false,
|
|
74
|
+
"required": ["browserTarget", "serverTarget"]
|
|
75
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
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
|
+
import { SpawnOptions } from 'child_process';
|
|
9
|
+
import { Observable } from 'rxjs';
|
|
10
|
+
export declare function getAvailablePort(): Promise<number>;
|
|
11
|
+
export declare function spawnAsObservable(command: string, args?: string[], options?: SpawnOptions): Observable<{
|
|
12
|
+
stdout?: string;
|
|
13
|
+
stderr?: string;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function waitUntilServerIsListening(port: number, host?: string): Observable<undefined>;
|