velocious 1.0.419 → 1.0.421
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 +1 -0
- package/build/src/application.d.ts +3 -26
- package/build/src/application.d.ts.map +1 -1
- package/build/src/application.js +17 -12
- package/build/src/configuration-types.d.ts +35 -0
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +10 -1
- package/build/src/configuration.d.ts +2 -1
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +3 -2
- package/build/src/database/pool/async-tracked-multi-connection.d.ts +5 -2
- package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
- package/build/src/database/pool/async-tracked-multi-connection.js +25 -9
- package/build/src/environment-handlers/node/cli/commands/server.d.ts +10 -0
- package/build/src/environment-handlers/node/cli/commands/server.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/server.js +42 -10
- package/build/src/http-server/index.d.ts +20 -7
- package/build/src/http-server/index.d.ts.map +1 -1
- package/build/src/http-server/index.js +64 -14
- package/package.json +1 -1
|
@@ -65,25 +65,57 @@ export function waitForApplicationWithSignalShutdown({ application, processObjec
|
|
|
65
65
|
application.wait().then(() => finish()).catch((error) => finish(error));
|
|
66
66
|
});
|
|
67
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* @template T
|
|
70
|
+
* @param {...(T | undefined)} values - Candidate values in priority order.
|
|
71
|
+
* @returns {T | undefined} - First configured value.
|
|
72
|
+
*/
|
|
73
|
+
function firstConfiguredValue(...values) {
|
|
74
|
+
return values.find((value) => value !== undefined);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* @param {string | number | boolean | undefined} workersArg - Worker count argument.
|
|
78
|
+
* @returns {number | undefined} - Normalized worker count.
|
|
79
|
+
*/
|
|
80
|
+
function httpServerWorkersFromArg(workersArg) {
|
|
81
|
+
if (workersArg === undefined)
|
|
82
|
+
return undefined;
|
|
83
|
+
if (typeof workersArg === "boolean")
|
|
84
|
+
throw new Error("--workers must be a positive integer");
|
|
85
|
+
const workers = Number(workersArg);
|
|
86
|
+
if (!Number.isInteger(workers) || workers < 1)
|
|
87
|
+
throw new Error("--workers must be a positive integer");
|
|
88
|
+
return workers;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* @param {Record<string, string | number | boolean | undefined>} parsedProcessArgs - Parsed CLI args.
|
|
92
|
+
* @param {import("../../../../configuration-types.js").HttpServerConfiguration} [defaults] - Default HTTP server config.
|
|
93
|
+
* @returns {{host: string, port: number, workers?: number}} - HTTP server config.
|
|
94
|
+
*/
|
|
95
|
+
export function httpServerConfigFromParsedArgs(parsedProcessArgs = {}, defaults = {}) {
|
|
96
|
+
const host = String(firstConfiguredValue(parsedProcessArgs.h, parsedProcessArgs.host, defaults.host, "127.0.0.1"));
|
|
97
|
+
const port = Number(firstConfiguredValue(parsedProcessArgs.p, parsedProcessArgs.port, defaults.port, 3006));
|
|
98
|
+
const workers = httpServerWorkersFromArg(firstConfiguredValue(parsedProcessArgs.workers, defaults.workers));
|
|
99
|
+
if (workers === undefined)
|
|
100
|
+
return { host, port };
|
|
101
|
+
return { host, port, workers };
|
|
102
|
+
}
|
|
68
103
|
export default class VelociousCliCommandsServer extends BaseCommand {
|
|
69
104
|
/** @returns {Promise<void>} - Starts the HTTP server and waits until it stops. */
|
|
70
105
|
async execute() {
|
|
71
106
|
const parsedProcessArgs = this.args?.parsedProcessArgs || {};
|
|
72
|
-
const
|
|
73
|
-
const
|
|
107
|
+
const configuration = this.getConfiguration();
|
|
108
|
+
const httpServer = httpServerConfigFromParsedArgs(parsedProcessArgs, configuration.httpServer);
|
|
74
109
|
const application = new Application({
|
|
75
|
-
configuration
|
|
76
|
-
httpServer
|
|
77
|
-
host,
|
|
78
|
-
port
|
|
79
|
-
},
|
|
110
|
+
configuration,
|
|
111
|
+
httpServer,
|
|
80
112
|
type: "server"
|
|
81
113
|
});
|
|
82
|
-
const environment =
|
|
114
|
+
const environment = configuration.getEnvironment();
|
|
83
115
|
await application.initialize();
|
|
84
116
|
await application.startHttpServer();
|
|
85
|
-
console.log(`Started Velocious HTTP server on ${host}:${port} in ${environment} environment`);
|
|
117
|
+
console.log(`Started Velocious HTTP server on ${httpServer.host}:${httpServer.port} in ${environment} environment`);
|
|
86
118
|
await waitForApplicationWithSignalShutdown({ application });
|
|
87
119
|
}
|
|
88
120
|
}
|
|
89
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Vudmlyb25tZW50LWhhbmRsZXJzL25vZGUvY2xpL2NvbW1hbmRzL3NlcnZlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFdBQVcsTUFBTSw0QkFBNEIsQ0FBQTtBQUNwRCxPQUFPLFdBQVcsTUFBTSxpQ0FBaUMsQ0FBQTtBQUV6RDs7OztHQUlHO0FBRUg7Ozs7R0FJRztBQUVIOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsb0NBQW9DLENBQUMsRUFBQyxXQUFXLEVBQUUsYUFBYSxHQUFHLE9BQU8sRUFBQztJQUN6RixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3JDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQTtRQUNwQixJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUE7UUFFcEIsMERBQTBEO1FBQzFELE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRTtZQUNuQixhQUFhLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUNoRCxhQUFhLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUNuRCxDQUFDLENBQUE7UUFFRDs7OztXQUlHO1FBQ0gsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2QixJQUFJLFFBQVE7Z0JBQUUsT0FBTTtZQUVwQixRQUFRLEdBQUcsSUFBSSxDQUFBO1lBQ2YsT0FBTyxFQUFFLENBQUE7WUFFVCxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNmLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDcEIsQ0FBQztRQUNILENBQUMsQ0FBQTtRQUVELDZEQUE2RDtRQUM3RCxNQUFNLGVBQWUsR0FBRyxLQUFLLElBQUksRUFBRTtZQUNqQyxJQUFJLFFBQVEsSUFBSSxRQUFRO2dCQUFFLE9BQU07WUFFaEMsUUFBUSxHQUFHLElBQUksQ0FBQTtZQUVmLElBQUksQ0FBQztnQkFDSCxNQUFNLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUMxQixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDZixDQUFDO1FBQ0gsQ0FBQyxDQUFBO1FBRUQscURBQXFEO1FBQ3JELE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRTtZQUNwQixLQUFLLGVBQWUsRUFBRSxDQUFBO1FBQ3hCLENBQUMsQ0FBQTtRQUVELGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3RDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBRXZDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQ3pFLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxPQUFPLE9BQU8sMEJBQTJCLFNBQVEsV0FBVztJQUNqRSxrRkFBa0Y7SUFDbEYsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLElBQUksRUFBRSxDQUFBO1FBQzVELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksaUJBQWlCLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQyxDQUFBO1FBQ2pGLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksaUJBQWlCLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFBO1FBQzFFLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDO1lBQ2xDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDdEMsVUFBVSxFQUFFO2dCQUNWLElBQUk7Z0JBQ0osSUFBSTthQUNMO1lBQ0QsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDLENBQUE7UUFDRixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUU1RCxNQUFNLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUM5QixNQUFNLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQTtRQUNuQyxPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxJQUFJLElBQUksSUFBSSxPQUFPLFdBQVcsY0FBYyxDQUFDLENBQUE7UUFDN0YsTUFBTSxvQ0FBb0MsQ0FBQyxFQUFDLFdBQVcsRUFBQyxDQUFDLENBQUE7SUFDM0QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEFwcGxpY2F0aW9uIGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi5qc1wiXG5pbXBvcnQgQmFzZUNvbW1hbmQgZnJvbSBcIi4uLy4uLy4uLy4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNpZ25hbFByb2Nlc3NcbiAqIEBwcm9wZXJ0eSB7KGV2ZW50OiBcIlNJR0lOVFwiIHwgXCJTSUdURVJNXCIsIGxpc3RlbmVyOiAoKSA9PiB2b2lkKSA9PiBTaWduYWxQcm9jZXNzfSBvbmNlIC0gUmVnaXN0ZXIgb25lIHNpZ25hbCBsaXN0ZW5lci5cbiAqIEBwcm9wZXJ0eSB7KGV2ZW50OiBcIlNJR0lOVFwiIHwgXCJTSUdURVJNXCIsIGxpc3RlbmVyOiAoKSA9PiB2b2lkKSA9PiBTaWduYWxQcm9jZXNzfSByZW1vdmVMaXN0ZW5lciAtIFJlbW92ZSBvbmUgc2lnbmFsIGxpc3RlbmVyLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2lnbmFsU2h1dGRvd25BcHBsaWNhdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBzdG9wIC0gU3RvcCB0aGUgYXBwbGljYXRpb24gZ3JhY2VmdWxseS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gd2FpdCAtIFdhaXQgdW50aWwgdGhlIGFwcGxpY2F0aW9uIGNsb3Nlcy5cbiAqL1xuXG4vKipcbiAqIFdhaXRzIGZvciB0aGUgSFRUUCBhcHBsaWNhdGlvbiB0byBjbG9zZSwgc3RvcHBpbmcgaXQgZ3JhY2VmdWxseSB3aGVuIHRoZVxuICogcHJvY2VzcyByZWNlaXZlcyBTSUdJTlQgb3IgU0lHVEVSTS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gV2FpdCBvcHRpb25zLlxuICogQHBhcmFtIHtTaWduYWxTaHV0ZG93bkFwcGxpY2F0aW9ufSBhcmdzLmFwcGxpY2F0aW9uIC0gUnVubmluZyBhcHBsaWNhdGlvbi5cbiAqIEBwYXJhbSB7U2lnbmFsUHJvY2Vzc30gW2FyZ3MucHJvY2Vzc09iamVjdF0gLSBQcm9jZXNzLWxpa2Ugc2lnbmFsIGVtaXR0ZXIuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBhcHBsaWNhdGlvbiBoYXMgc3RvcHBlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhaXRGb3JBcHBsaWNhdGlvbldpdGhTaWduYWxTaHV0ZG93bih7YXBwbGljYXRpb24sIHByb2Nlc3NPYmplY3QgPSBwcm9jZXNzfSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBmaW5pc2hlZCA9IGZhbHNlXG4gICAgbGV0IHN0b3BwaW5nID0gZmFsc2VcblxuICAgIC8qKiBAcmV0dXJucyB7dm9pZH0gLSBSZW1vdmUgaW5zdGFsbGVkIHNpZ25hbCBoYW5kbGVycy4gKi9cbiAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgcHJvY2Vzc09iamVjdC5yZW1vdmVMaXN0ZW5lcihcIlNJR0lOVFwiLCBvblNpZ25hbClcbiAgICAgIHByb2Nlc3NPYmplY3QucmVtb3ZlTGlzdGVuZXIoXCJTSUdURVJNXCIsIG9uU2lnbmFsKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBsZXRlcyB0aGUgd2FpdCBwcm9taXNlIG9uY2UuXG4gICAgICogQHBhcmFtIHt1bmtub3dufSBbZXJyb3JdIC0gT3B0aW9uYWwgcmVqZWN0aW9uIHJlYXNvbi5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBjb25zdCBmaW5pc2ggPSAoZXJyb3IpID0+IHtcbiAgICAgIGlmIChmaW5pc2hlZCkgcmV0dXJuXG5cbiAgICAgIGZpbmlzaGVkID0gdHJ1ZVxuICAgICAgY2xlYW51cCgpXG5cbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gU3RvcHMgdGhlIGFwcGxpY2F0aW9uIG9uY2UuICovXG4gICAgY29uc3Qgc3RvcEFwcGxpY2F0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHN0b3BwaW5nIHx8IGZpbmlzaGVkKSByZXR1cm5cblxuICAgICAgc3RvcHBpbmcgPSB0cnVlXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFwcGxpY2F0aW9uLnN0b3AoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZmluaXNoKGVycm9yKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAcmV0dXJucyB7dm9pZH0gLSBIYW5kbGVzIG9uZSBzaHV0ZG93biBzaWduYWwuICovXG4gICAgY29uc3Qgb25TaWduYWwgPSAoKSA9PiB7XG4gICAgICB2b2lkIHN0b3BBcHBsaWNhdGlvbigpXG4gICAgfVxuXG4gICAgcHJvY2Vzc09iamVjdC5vbmNlKFwiU0lHSU5UXCIsIG9uU2lnbmFsKVxuICAgIHByb2Nlc3NPYmplY3Qub25jZShcIlNJR1RFUk1cIiwgb25TaWduYWwpXG5cbiAgICBhcHBsaWNhdGlvbi53YWl0KCkudGhlbigoKSA9PiBmaW5pc2goKSkuY2F0Y2goKGVycm9yKSA9PiBmaW5pc2goZXJyb3IpKVxuICB9KVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNDbGlDb21tYW5kc1NlcnZlciBleHRlbmRzIEJhc2VDb21tYW5ke1xuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gU3RhcnRzIHRoZSBIVFRQIHNlcnZlciBhbmQgd2FpdHMgdW50aWwgaXQgc3RvcHMuICovXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgY29uc3QgcGFyc2VkUHJvY2Vzc0FyZ3MgPSB0aGlzLmFyZ3M/LnBhcnNlZFByb2Nlc3NBcmdzIHx8IHt9XG4gICAgY29uc3QgaG9zdCA9IFN0cmluZyhwYXJzZWRQcm9jZXNzQXJncy5oIHx8IHBhcnNlZFByb2Nlc3NBcmdzLmhvc3QgfHwgXCIxMjcuMC4wLjFcIilcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHBhcnNlZFByb2Nlc3NBcmdzLnAgfHwgcGFyc2VkUHJvY2Vzc0FyZ3MucG9ydCB8fCAzMDA2KVxuICAgIGNvbnN0IGFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uKHtcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLFxuICAgICAgaHR0cFNlcnZlcjoge1xuICAgICAgICBob3N0LFxuICAgICAgICBwb3J0XG4gICAgICB9LFxuICAgICAgdHlwZTogXCJzZXJ2ZXJcIlxuICAgIH0pXG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRFbnZpcm9ubWVudCgpXG5cbiAgICBhd2FpdCBhcHBsaWNhdGlvbi5pbml0aWFsaXplKClcbiAgICBhd2FpdCBhcHBsaWNhdGlvbi5zdGFydEh0dHBTZXJ2ZXIoKVxuICAgIGNvbnNvbGUubG9nKGBTdGFydGVkIFZlbG9jaW91cyBIVFRQIHNlcnZlciBvbiAke2hvc3R9OiR7cG9ydH0gaW4gJHtlbnZpcm9ubWVudH0gZW52aXJvbm1lbnRgKVxuICAgIGF3YWl0IHdhaXRGb3JBcHBsaWNhdGlvbldpdGhTaWduYWxTaHV0ZG93bih7YXBwbGljYXRpb259KVxuICB9XG59XG4iXX0=
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Vudmlyb25tZW50LWhhbmRsZXJzL25vZGUvY2xpL2NvbW1hbmRzL3NlcnZlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFdBQVcsTUFBTSw0QkFBNEIsQ0FBQTtBQUNwRCxPQUFPLFdBQVcsTUFBTSxpQ0FBaUMsQ0FBQTtBQUV6RDs7OztHQUlHO0FBRUg7Ozs7R0FJRztBQUVIOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsb0NBQW9DLENBQUMsRUFBQyxXQUFXLEVBQUUsYUFBYSxHQUFHLE9BQU8sRUFBQztJQUN6RixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3JDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQTtRQUNwQixJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUE7UUFFcEIsMERBQTBEO1FBQzFELE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRTtZQUNuQixhQUFhLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUNoRCxhQUFhLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUNuRCxDQUFDLENBQUE7UUFFRDs7OztXQUlHO1FBQ0gsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2QixJQUFJLFFBQVE7Z0JBQUUsT0FBTTtZQUVwQixRQUFRLEdBQUcsSUFBSSxDQUFBO1lBQ2YsT0FBTyxFQUFFLENBQUE7WUFFVCxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNmLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDcEIsQ0FBQztRQUNILENBQUMsQ0FBQTtRQUVELDZEQUE2RDtRQUM3RCxNQUFNLGVBQWUsR0FBRyxL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QUE7UUFDN0MsTUFBTSxVQUFVLEdBQUcsOEJBQThCLENBQUMsaUJBQWlCLEVBQUUsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzlGLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDO1lBQ2xDLGFBQWE7WUFDYixVQUFVO1lBQ1YsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDLENBQUE7UUFDRixNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUE7UUFFbEQsTUFBTSxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDOUIsTUFBTSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUE7UUFDbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsVUFBVSxDQUFDLElBQUksSUFBSSxVQUFVLENBQUMsSUFBSSxPQUFPLFdBQVcsY0FBYyxDQUFDLENBQUE7UUFDbkgsTUFBTSxvQ0FBb0MsQ0FBQyxFQUFDLFdBQVcsRUFBQyxDQUFDLENBQUE7SUFDM0QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEFwcGxpY2F0aW9uIGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi5qc1wiXG5pbXBvcnQgQmFzZUNvbW1hbmQgZnJvbSBcIi4uLy4uLy4uLy4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNpZ25hbFByb2Nlc3NcbiAqIEBwcm9wZXJ0eSB7KGV2ZW50OiBcIlNJR0lOVFwiIHwgXCJTSUdURVJNXCIsIGxpc3RlbmVyOiAoKSA9PiB2b2lkKSA9PiBTaWduYWxQcm9jZXNzfSBvbmNlIC0gUmVnaXN0ZXIgb25lIHNpZ25hbCBsaXN0ZW5lci5cbiAqIEBwcm9wZXJ0eSB7KGV2ZW50OiBcIlNJR0lOVFwiIHwgXCJTSUdURVJNXCIsIGxpc3RlbmVyOiAoKSA9PiB2b2lkKSA9PiBTaWduYWxQcm9jZXNzfSByZW1vdmVMaXN0ZW5lciAtIFJlbW92ZSBvbmUgc2lnbmFsIGxpc3RlbmVyLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2lnbmFsU2h1dGRvd25BcHBsaWNhdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBzdG9wIC0gU3RvcCB0aGUgYXBwbGljYXRpb24gZ3JhY2VmdWxseS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gd2FpdCAtIFdhaXQgdW50aWwgdGhlIGFwcGxpY2F0aW9uIGNsb3Nlcy5cbiAqL1xuXG4vKipcbiAqIFdhaXRzIGZvciB0aGUgSFRUUCBhcHBsaWNhdGlvbiB0byBjbG9zZSwgc3RvcHBpbmcgaXQgZ3JhY2VmdWxseSB3aGVuIHRoZVxuICogcHJvY2VzcyByZWNlaXZlcyBTSUdJTlQgb3IgU0lHVEVSTS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gV2FpdCBvcHRpb25zLlxuICogQHBhcmFtIHtTaWduYWxTaHV0ZG93bkFwcGxpY2F0aW9ufSBhcmdzLmFwcGxpY2F0aW9uIC0gUnVubmluZyBhcHBsaWNhdGlvbi5cbiAqIEBwYXJhbSB7U2lnbmFsUHJvY2Vzc30gW2FyZ3MucHJvY2Vzc09iamVjdF0gLSBQcm9jZXNzLWxpa2Ugc2lnbmFsIGVtaXR0ZXIuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBhcHBsaWNhdGlvbiBoYXMgc3RvcHBlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhaXRGb3JBcHBsaWNhdGlvbldpdGhTaWduYWxTaHV0ZG93bih7YXBwbGljYXRpb24sIHByb2Nlc3NPYmplY3QgPSBwcm9jZXNzfSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBmaW5pc2hlZCA9IGZhbHNlXG4gICAgbGV0IHN0b3BwaW5nID0gZmFsc2VcblxuICAgIC8qKiBAcmV0dXJucyB7dm9pZH0gLSBSZW1vdmUgaW5zdGFsbGVkIHNpZ25hbCBoYW5kbGVycy4gKi9cbiAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgcHJvY2Vzc09iamVjdC5yZW1vdmVMaXN0ZW5lcihcIlNJR0lOVFwiLCBvblNpZ25hbClcbiAgICAgIHByb2Nlc3NPYmplY3QucmVtb3ZlTGlzdGVuZXIoXCJTSUdURVJNXCIsIG9uU2lnbmFsKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBsZXRlcyB0aGUgd2FpdCBwcm9taXNlIG9uY2UuXG4gICAgICogQHBhcmFtIHt1bmtub3dufSBbZXJyb3JdIC0gT3B0aW9uYWwgcmVqZWN0aW9uIHJlYXNvbi5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBjb25zdCBmaW5pc2ggPSAoZXJyb3IpID0+IHtcbiAgICAgIGlmIChmaW5pc2hlZCkgcmV0dXJuXG5cbiAgICAgIGZpbmlzaGVkID0gdHJ1ZVxuICAgICAgY2xlYW51cCgpXG5cbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gU3RvcHMgdGhlIGFwcGxpY2F0aW9uIG9uY2UuICovXG4gICAgY29uc3Qgc3RvcEFwcGxpY2F0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHN0b3BwaW5nIHx8IGZpbmlzaGVkKSByZXR1cm5cblxuICAgICAgc3RvcHBpbmcgPSB0cnVlXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFwcGxpY2F0aW9uLnN0b3AoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZmluaXNoKGVycm9yKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAcmV0dXJucyB7dm9pZH0gLSBIYW5kbGVzIG9uZSBzaHV0ZG93biBzaWduYWwuICovXG4gICAgY29uc3Qgb25TaWduYWwgPSAoKSA9PiB7XG4gICAgICB2b2lkIHN0b3BBcHBsaWNhdGlvbigpXG4gICAgfVxuXG4gICAgcHJvY2Vzc09iamVjdC5vbmNlKFwiU0lHSU5UXCIsIG9uU2lnbmFsKVxuICAgIHByb2Nlc3NPYmplY3Qub25jZShcIlNJR1RFUk1cIiwgb25TaWduYWwpXG5cbiAgICBhcHBsaWNhdGlvbi53YWl0KCkudGhlbigoKSA9PiBmaW5pc2goKSkuY2F0Y2goKGVycm9yKSA9PiBmaW5pc2goZXJyb3IpKVxuICB9KVxufVxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0gey4uLihUIHwgdW5kZWZpbmVkKX0gdmFsdWVzIC0gQ2FuZGlkYXRlIHZhbHVlcyBpbiBwcmlvcml0eSBvcmRlci5cbiAqIEByZXR1cm5zIHtUIHwgdW5kZWZpbmVkfSAtIEZpcnN0IGNvbmZpZ3VyZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGZpcnN0Q29uZmlndXJlZFZhbHVlKC4uLnZhbHVlcykge1xuICByZXR1cm4gdmFsdWVzLmZpbmQoKHZhbHVlKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVuZGVmaW5lZH0gd29ya2Vyc0FyZyAtIFdvcmtlciBjb3VudCBhcmd1bWVudC5cbiAqIEByZXR1cm5zIHtudW1iZXIgfCB1bmRlZmluZWR9IC0gTm9ybWFsaXplZCB3b3JrZXIgY291bnQuXG4gKi9cbmZ1bmN0aW9uIGh0dHBTZXJ2ZXJXb3JrZXJzRnJvbUFyZyh3b3JrZXJzQXJnKSB7XG4gIGlmICh3b3JrZXJzQXJnID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWRcbiAgaWYgKHR5cGVvZiB3b3JrZXJzQXJnID09PSBcImJvb2xlYW5cIikgdGhyb3cgbmV3IEVycm9yKFwiLS13b3JrZXJzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyXCIpXG5cbiAgY29uc3Qgd29ya2VycyA9IE51bWJlcih3b3JrZXJzQXJnKVxuXG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcih3b3JrZXJzKSB8fCB3b3JrZXJzIDwgMSkgdGhyb3cgbmV3IEVycm9yKFwiLS13b3JrZXJzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyXCIpXG5cbiAgcmV0dXJuIHdvcmtlcnNcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmRlZmluZWQ+fSBwYXJzZWRQcm9jZXNzQXJncyAtIFBhcnNlZCBDTEkgYXJncy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5IdHRwU2VydmVyQ29uZmlndXJhdGlvbn0gW2RlZmF1bHRzXSAtIERlZmF1bHQgSFRUUCBzZXJ2ZXIgY29uZmlnLlxuICogQHJldHVybnMge3tob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlciwgd29ya2Vycz86IG51bWJlcn19IC0gSFRUUCBzZXJ2ZXIgY29uZmlnLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaHR0cFNlcnZlckNvbmZpZ0Zyb21QYXJzZWRBcmdzKHBhcnNlZFByb2Nlc3NBcmdzID0ge30sIGRlZmF1bHRzID0ge30pIHtcbiAgY29uc3QgaG9zdCA9IFN0cmluZyhmaXJzdENvbmZpZ3VyZWRWYWx1ZShwYXJzZWRQcm9jZXNzQXJncy5oLCBwYXJzZWRQcm9jZXNzQXJncy5ob3N0LCBkZWZhdWx0cy5ob3N0LCBcIjEyNy4wLjAuMVwiKSlcbiAgY29uc3QgcG9ydCA9IE51bWJlcihmaXJzdENvbmZpZ3VyZWRWYWx1ZShwYXJzZWRQcm9jZXNzQXJncy5wLCBwYXJzZWRQcm9jZXNzQXJncy5wb3J0LCBkZWZhdWx0cy5wb3J0LCAzMDA2KSlcbiAgY29uc3Qgd29ya2VycyA9IGh0dHBTZXJ2ZXJXb3JrZXJzRnJvbUFyZyhmaXJzdENvbmZpZ3VyZWRWYWx1ZShwYXJzZWRQcm9jZXNzQXJncy53b3JrZXJzLCBkZWZhdWx0cy53b3JrZXJzKSlcblxuICBpZiAod29ya2VycyA9PT0gdW5kZWZpbmVkKSByZXR1cm4ge2hvc3QsIHBvcnR9XG4gIHJldHVybiB7aG9zdCwgcG9ydCwgd29ya2Vyc31cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzQ2xpQ29tbWFuZHNTZXJ2ZXIgZXh0ZW5kcyBCYXNlQ29tbWFuZHtcbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFN0YXJ0cyB0aGUgSFRUUCBzZXJ2ZXIgYW5kIHdhaXRzIHVudGlsIGl0IHN0b3BzLiAqL1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGNvbnN0IHBhcnNlZFByb2Nlc3NBcmdzID0gdGhpcy5hcmdzPy5wYXJzZWRQcm9jZXNzQXJncyB8fCB7fVxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IGh0dHBTZXJ2ZXIgPSBodHRwU2VydmVyQ29uZmlnRnJvbVBhcnNlZEFyZ3MocGFyc2VkUHJvY2Vzc0FyZ3MsIGNvbmZpZ3VyYXRpb24uaHR0cFNlcnZlcilcbiAgICBjb25zdCBhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbih7XG4gICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgaHR0cFNlcnZlcixcbiAgICAgIHR5cGU6IFwic2VydmVyXCJcbiAgICB9KVxuICAgIGNvbnN0IGVudmlyb25tZW50ID0gY29uZmlndXJhdGlvbi5nZXRFbnZpcm9ubWVudCgpXG5cbiAgICBhd2FpdCBhcHBsaWNhdGlvbi5pbml0aWFsaXplKClcbiAgICBhd2FpdCBhcHBsaWNhdGlvbi5zdGFydEh0dHBTZXJ2ZXIoKVxuICAgIGNvbnNvbGUubG9nKGBTdGFydGVkIFZlbG9jaW91cyBIVFRQIHNlcnZlciBvbiAke2h0dHBTZXJ2ZXIuaG9zdH06JHtodHRwU2VydmVyLnBvcnR9IGluICR7ZW52aXJvbm1lbnR9IGVudmlyb25tZW50YClcbiAgICBhd2FpdCB3YWl0Rm9yQXBwbGljYXRpb25XaXRoU2lnbmFsU2h1dGRvd24oe2FwcGxpY2F0aW9ufSlcbiAgfVxufVxuIl19
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/** @typedef {{start: () => Promise<void>, stop: () => Promise<void>}} DevelopmentReloaderLike */
|
|
2
|
-
/** @typedef {function({configuration: import("../configuration.js").default, workerCount: number}) : (WorkerHandler | InProcessHandler)} WorkerHandlerFactory */
|
|
3
1
|
export default class VelociousHttpServer {
|
|
4
2
|
/**
|
|
5
3
|
* @param {object} args - Options object.
|
|
@@ -8,15 +6,17 @@ export default class VelociousHttpServer {
|
|
|
8
6
|
* @param {boolean} [args.inProcess] - Run HTTP handlers in the main thread instead of worker threads.
|
|
9
7
|
* @param {number} [args.port] - Port.
|
|
10
8
|
* @param {number} [args.maxWorkers] - Max workers.
|
|
9
|
+
* @param {number} [args.workers] - Worker handlers to start.
|
|
11
10
|
* @param {function({configuration: import("../configuration.js").default, onReload: function({changedPath: string}) : Promise<void>}) : {start: () => Promise<void>, stop: () => Promise<void>}} [args.developmentReloaderFactory] - Development reloader factory.
|
|
12
11
|
* @param {WorkerHandlerFactory} [args.workerHandlerFactory] - Worker handler factory.
|
|
13
12
|
*/
|
|
14
|
-
constructor({ configuration, developmentReloaderFactory, host, inProcess, maxWorkers, port, workerHandlerFactory }: {
|
|
13
|
+
constructor({ configuration, developmentReloaderFactory, host, inProcess, maxWorkers, port, workerHandlerFactory, workers }: {
|
|
15
14
|
configuration: import("../configuration.js").default;
|
|
16
15
|
host?: string | undefined;
|
|
17
16
|
inProcess?: boolean | undefined;
|
|
18
17
|
port?: number | undefined;
|
|
19
18
|
maxWorkers?: number | undefined;
|
|
19
|
+
workers?: number | undefined;
|
|
20
20
|
developmentReloaderFactory?: ((arg0: {
|
|
21
21
|
configuration: import("../configuration.js").default;
|
|
22
22
|
onReload: (arg0: {
|
|
@@ -44,6 +44,9 @@ export default class VelociousHttpServer {
|
|
|
44
44
|
workerCount: number;
|
|
45
45
|
/** @type {Array<WorkerHandler | InProcessHandler>} */
|
|
46
46
|
workerHandlers: Array<WorkerHandler | InProcessHandler>;
|
|
47
|
+
nextWorkerHandlerIndex: number;
|
|
48
|
+
/** @type {Map<string, WorkerHandler | InProcessHandler>} */
|
|
49
|
+
stickyWorkerHandlers: Map<string, WorkerHandler | InProcessHandler>;
|
|
47
50
|
configuration: import("../configuration.js").default;
|
|
48
51
|
developmentReloaderFactory: ((arg0: {
|
|
49
52
|
configuration: import("../configuration.js").default;
|
|
@@ -58,7 +61,7 @@ export default class VelociousHttpServer {
|
|
|
58
61
|
logger: Logger;
|
|
59
62
|
host: string;
|
|
60
63
|
port: number;
|
|
61
|
-
|
|
64
|
+
workers: number;
|
|
62
65
|
/** @returns {Promise<void>} - Resolves when complete. */
|
|
63
66
|
start(): Promise<void>;
|
|
64
67
|
/** @returns {{developmentReloader: DevelopmentReloader | DevelopmentReloaderLike | undefined, netServer: import("net").Server | undefined, workerHandlers: Array<WorkerHandler | InProcessHandler>}} - Startup state. */
|
|
@@ -75,7 +78,7 @@ export default class VelociousHttpServer {
|
|
|
75
78
|
/** @returns {Promise<void>} - Resolves when complete. */
|
|
76
79
|
_netServerListen(): Promise<void>;
|
|
77
80
|
/** @returns {Promise<void>} - Resolves when complete. */
|
|
78
|
-
|
|
81
|
+
_ensureWorkers(): Promise<void>;
|
|
79
82
|
/** @returns {boolean} - Whether active. */
|
|
80
83
|
isActive(): boolean;
|
|
81
84
|
/** @returns {Promise<void>} - Resolves when complete. */
|
|
@@ -107,10 +110,20 @@ export default class VelociousHttpServer {
|
|
|
107
110
|
onClientClose: (client: ServerClient) => void;
|
|
108
111
|
/** @returns {Promise<void>} - Resolves when complete. */
|
|
109
112
|
spawnWorker(): Promise<void>;
|
|
113
|
+
/** @returns {Promise<Array<WorkerHandler | InProcessHandler>>} - Started worker handlers. */
|
|
114
|
+
_buildWorkerHandlers(): Promise<Array<WorkerHandler | InProcessHandler>>;
|
|
110
115
|
/** @returns {Promise<WorkerHandler | InProcessHandler>} - Started worker handler. */
|
|
111
116
|
_buildWorkerHandler(): Promise<WorkerHandler | InProcessHandler>;
|
|
112
|
-
/**
|
|
113
|
-
|
|
117
|
+
/**
|
|
118
|
+
* @param {object} [args] - Options object.
|
|
119
|
+
* @param {string} [args.stickyKey] - Stable key that must keep routing to the same worker.
|
|
120
|
+
* @returns {WorkerHandler | InProcessHandler} - The worker handler to use.
|
|
121
|
+
*/
|
|
122
|
+
workerHandlerToUse({ stickyKey }?: {
|
|
123
|
+
stickyKey?: string | undefined;
|
|
124
|
+
}): WorkerHandler | InProcessHandler;
|
|
125
|
+
/** @returns {WorkerHandler | InProcessHandler} - The next round-robin worker handler. */
|
|
126
|
+
_nextRoundRobinWorkerHandler(): WorkerHandler | InProcessHandler;
|
|
114
127
|
/** @returns {boolean} - Whether development worker hot reload should run. */
|
|
115
128
|
shouldUseDevelopmentHotReload(): boolean;
|
|
116
129
|
/** @returns {Promise<void>} - Resolves when watcher setup finishes. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/http-server/index.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/http-server/index.js"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,19 @@ import ServerClient from "./server-client.js";
|
|
|
9
9
|
import WorkerHandler from "./worker-handler/index.js";
|
|
10
10
|
/** @typedef {{start: () => Promise<void>, stop: () => Promise<void>}} DevelopmentReloaderLike */
|
|
11
11
|
/** @typedef {function({configuration: import("../configuration.js").default, workerCount: number}) : (WorkerHandler | InProcessHandler)} WorkerHandlerFactory */
|
|
12
|
+
/**
|
|
13
|
+
* @param {object} args - Options object.
|
|
14
|
+
* @param {number} [args.maxWorkers] - Backward-compatible worker count alias.
|
|
15
|
+
* @param {number} [args.workers] - Configured worker count.
|
|
16
|
+
* @returns {number} - Normalized worker count.
|
|
17
|
+
*/
|
|
18
|
+
function normalizeWorkerCount({ maxWorkers, workers }) {
|
|
19
|
+
const workerCount = workers ?? maxWorkers ?? 1;
|
|
20
|
+
if (!Number.isInteger(workerCount) || workerCount < 1) {
|
|
21
|
+
throw new Error("HTTP server workers must be a positive integer");
|
|
22
|
+
}
|
|
23
|
+
return workerCount;
|
|
24
|
+
}
|
|
12
25
|
export default class VelociousHttpServer {
|
|
13
26
|
clientCount = 0;
|
|
14
27
|
_starting = false;
|
|
@@ -26,6 +39,9 @@ export default class VelociousHttpServer {
|
|
|
26
39
|
workerCount = 0;
|
|
27
40
|
/** @type {Array<WorkerHandler | InProcessHandler>} */
|
|
28
41
|
workerHandlers = [];
|
|
42
|
+
nextWorkerHandlerIndex = 0;
|
|
43
|
+
/** @type {Map<string, WorkerHandler | InProcessHandler>} */
|
|
44
|
+
stickyWorkerHandlers = new Map();
|
|
29
45
|
/**
|
|
30
46
|
* @param {object} args - Options object.
|
|
31
47
|
* @param {import("../configuration.js").default} args.configuration - Configuration instance.
|
|
@@ -33,10 +49,11 @@ export default class VelociousHttpServer {
|
|
|
33
49
|
* @param {boolean} [args.inProcess] - Run HTTP handlers in the main thread instead of worker threads.
|
|
34
50
|
* @param {number} [args.port] - Port.
|
|
35
51
|
* @param {number} [args.maxWorkers] - Max workers.
|
|
52
|
+
* @param {number} [args.workers] - Worker handlers to start.
|
|
36
53
|
* @param {function({configuration: import("../configuration.js").default, onReload: function({changedPath: string}) : Promise<void>}) : {start: () => Promise<void>, stop: () => Promise<void>}} [args.developmentReloaderFactory] - Development reloader factory.
|
|
37
54
|
* @param {WorkerHandlerFactory} [args.workerHandlerFactory] - Worker handler factory.
|
|
38
55
|
*/
|
|
39
|
-
constructor({ configuration, developmentReloaderFactory, host, inProcess, maxWorkers, port, workerHandlerFactory }) {
|
|
56
|
+
constructor({ configuration, developmentReloaderFactory, host, inProcess, maxWorkers, port, workerHandlerFactory, workers }) {
|
|
40
57
|
this.configuration = configuration;
|
|
41
58
|
this.developmentReloaderFactory = developmentReloaderFactory;
|
|
42
59
|
this.workerHandlerFactory = workerHandlerFactory;
|
|
@@ -44,7 +61,7 @@ export default class VelociousHttpServer {
|
|
|
44
61
|
this.logger = new Logger(this);
|
|
45
62
|
this.host = host ?? "0.0.0.0";
|
|
46
63
|
this.port = port ?? 3006;
|
|
47
|
-
this.
|
|
64
|
+
this.workers = normalizeWorkerCount({ maxWorkers, workers });
|
|
48
65
|
}
|
|
49
66
|
/** @returns {Promise<void>} - Resolves when complete. */
|
|
50
67
|
async start() {
|
|
@@ -55,7 +72,7 @@ export default class VelociousHttpServer {
|
|
|
55
72
|
this._starting = true;
|
|
56
73
|
const startupState = this._captureStartupState();
|
|
57
74
|
try {
|
|
58
|
-
await this.
|
|
75
|
+
await this._ensureWorkers();
|
|
59
76
|
await this._startDevelopmentReloader();
|
|
60
77
|
/** @type {import("net").Server} */
|
|
61
78
|
const netServer = new Net.Server();
|
|
@@ -99,6 +116,7 @@ export default class VelociousHttpServer {
|
|
|
99
116
|
this.developmentReloader = startupState.developmentReloader;
|
|
100
117
|
this.netServer = startupState.netServer;
|
|
101
118
|
this.workerHandlers = startupState.workerHandlers;
|
|
119
|
+
this.stickyWorkerHandlers.clear();
|
|
102
120
|
}
|
|
103
121
|
/** @returns {Promise<void>} - Resolves when complete. */
|
|
104
122
|
_netServerListen() {
|
|
@@ -124,8 +142,8 @@ export default class VelociousHttpServer {
|
|
|
124
142
|
});
|
|
125
143
|
}
|
|
126
144
|
/** @returns {Promise<void>} - Resolves when complete. */
|
|
127
|
-
async
|
|
128
|
-
|
|
145
|
+
async _ensureWorkers() {
|
|
146
|
+
while (this.workerHandlers.length < this.workers) {
|
|
129
147
|
await this.spawnWorker();
|
|
130
148
|
}
|
|
131
149
|
}
|
|
@@ -184,6 +202,7 @@ export default class VelociousHttpServer {
|
|
|
184
202
|
const stopTasks = this.workerHandlers.map((handler) => handler.stop());
|
|
185
203
|
await Promise.all(stopTasks);
|
|
186
204
|
this.workerHandlers = [];
|
|
205
|
+
this.stickyWorkerHandlers.clear();
|
|
187
206
|
}
|
|
188
207
|
/** @returns {void} - No return value. */
|
|
189
208
|
onClose = () => {
|
|
@@ -212,7 +231,9 @@ export default class VelociousHttpServer {
|
|
|
212
231
|
}]);
|
|
213
232
|
this.clientCount++;
|
|
214
233
|
try {
|
|
215
|
-
|
|
234
|
+
// Paused WebSocket sessions are worker-local, so reconnects from
|
|
235
|
+
// the same client address must return to the same worker.
|
|
236
|
+
const workerHandler = this.workerHandlerToUse({ stickyKey: socket.remoteAddress });
|
|
216
237
|
const client = new ServerClient({
|
|
217
238
|
clientCount,
|
|
218
239
|
configuration: this.configuration,
|
|
@@ -246,6 +267,15 @@ export default class VelociousHttpServer {
|
|
|
246
267
|
const workerHandler = await this._buildWorkerHandler();
|
|
247
268
|
this.workerHandlers.push(workerHandler);
|
|
248
269
|
}
|
|
270
|
+
/** @returns {Promise<Array<WorkerHandler | InProcessHandler>>} - Started worker handlers. */
|
|
271
|
+
async _buildWorkerHandlers() {
|
|
272
|
+
/** @type {Array<WorkerHandler | InProcessHandler>} */
|
|
273
|
+
const workerHandlers = [];
|
|
274
|
+
for (let index = 0; index < this.workers; index += 1) {
|
|
275
|
+
workerHandlers.push(await this._buildWorkerHandler());
|
|
276
|
+
}
|
|
277
|
+
return workerHandlers;
|
|
278
|
+
}
|
|
249
279
|
/** @returns {Promise<WorkerHandler | InProcessHandler>} - Started worker handler. */
|
|
250
280
|
async _buildWorkerHandler() {
|
|
251
281
|
const workerCount = this.workerCount;
|
|
@@ -260,14 +290,32 @@ export default class VelociousHttpServer {
|
|
|
260
290
|
await workerHandler.start();
|
|
261
291
|
return workerHandler;
|
|
262
292
|
}
|
|
263
|
-
/**
|
|
264
|
-
|
|
293
|
+
/**
|
|
294
|
+
* @param {object} [args] - Options object.
|
|
295
|
+
* @param {string} [args.stickyKey] - Stable key that must keep routing to the same worker.
|
|
296
|
+
* @returns {WorkerHandler | InProcessHandler} - The worker handler to use.
|
|
297
|
+
*/
|
|
298
|
+
workerHandlerToUse({ stickyKey } = {}) {
|
|
299
|
+
if (stickyKey) {
|
|
300
|
+
const stickyWorkerHandler = this.stickyWorkerHandlers.get(stickyKey);
|
|
301
|
+
if (stickyWorkerHandler && this.workerHandlers.includes(stickyWorkerHandler)) {
|
|
302
|
+
return stickyWorkerHandler;
|
|
303
|
+
}
|
|
304
|
+
const workerHandler = this._nextRoundRobinWorkerHandler();
|
|
305
|
+
this.stickyWorkerHandlers.set(stickyKey, workerHandler);
|
|
306
|
+
return workerHandler;
|
|
307
|
+
}
|
|
308
|
+
return this._nextRoundRobinWorkerHandler();
|
|
309
|
+
}
|
|
310
|
+
/** @returns {WorkerHandler | InProcessHandler} - The next round-robin worker handler. */
|
|
311
|
+
_nextRoundRobinWorkerHandler() {
|
|
265
312
|
this.logger.debug(`Worker handlers length: ${this.workerHandlers.length}`);
|
|
266
|
-
const
|
|
267
|
-
const workerHandler = this.workerHandlers[
|
|
313
|
+
const workerHandlerIndex = this.nextWorkerHandlerIndex % this.workerHandlers.length;
|
|
314
|
+
const workerHandler = this.workerHandlers[workerHandlerIndex];
|
|
268
315
|
if (!workerHandler) {
|
|
269
|
-
throw new Error(`No workerHandler by that number: ${
|
|
316
|
+
throw new Error(`No workerHandler by that number: ${workerHandlerIndex}`);
|
|
270
317
|
}
|
|
318
|
+
this.nextWorkerHandlerIndex += 1;
|
|
271
319
|
return workerHandler;
|
|
272
320
|
}
|
|
273
321
|
/** @returns {boolean} - Whether development worker hot reload should run. */
|
|
@@ -304,8 +352,10 @@ export default class VelociousHttpServer {
|
|
|
304
352
|
do {
|
|
305
353
|
this._reloadWorkersForDevelopmentQueued = false;
|
|
306
354
|
const oldWorkerHandlers = [...this.workerHandlers];
|
|
307
|
-
const
|
|
308
|
-
this.workerHandlers =
|
|
355
|
+
const newWorkerHandlers = await this._buildWorkerHandlers();
|
|
356
|
+
this.workerHandlers = newWorkerHandlers;
|
|
357
|
+
this.nextWorkerHandlerIndex = 0;
|
|
358
|
+
this.stickyWorkerHandlers.clear();
|
|
309
359
|
await Promise.all(oldWorkerHandlers.map((workerHandler) => workerHandler.stop()));
|
|
310
360
|
} while (this._reloadWorkersForDevelopmentQueued && !this._stopping);
|
|
311
361
|
}
|
|
@@ -314,4 +364,4 @@ export default class VelociousHttpServer {
|
|
|
314
364
|
}
|
|
315
365
|
}
|
|
316
366
|
}
|
|
317
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxtQkFBbUIsTUFBTSwyQkFBMkIsQ0FBQTtBQUMzRCxPQUFPLFlBQVksTUFBTSwyQkFBMkIsQ0FBQTtBQUNwRCxPQUFPLGdCQUFnQixNQUFNLGdDQUFnQyxDQUFBO0FBQzdELE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQTtBQUNqQyxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUE7QUFDckIsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUE7QUFDN0MsT0FBTyxhQUFhLE1BQU0sMkJBQTJCLENBQUE7QUFFckQsaUdBQWlHO0FBQ2pHLGlLQUFpSztBQUVqSyxNQUFNLENBQUMsT0FBTyxPQUFPLG1CQUFtQjtJQUN0QyxXQUFXLEdBQUcsQ0FBQyxDQUFBO0lBQ2YsU0FBUyxHQUFHLEtBQUssQ0FBQTtJQUVqQix3RUFBd0U7SUFDeEUsbUJBQW1CLENBQUE7SUFFbkIsK0NBQStDO0lBQy9DLFNBQVMsQ0FBQTtJQUVULCtDQUErQztJQUMvQyxvQkFBb0IsQ0FBQTtJQUVwQiw0Q0FBNEM7SUFDNUMsT0FBTyxHQUFHLEVBQUUsQ0FBQTtJQUVaLHdDQUF3QztJQUN4QyxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUUxQixNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtJQUMzQixXQUFXLEdBQUcsQ0FBQyxDQUFBO0lBRWYsc0RBQXNEO0lBQ3RELGNBQWMsR0FBRyxFQUFFLENBQUE7SUFFbkI7Ozs7Ozs7OztPQVNHO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSwwQkFBMEIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUM7UUFDOUcs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QUFLLENBQUMsMkJBQTJCO1FBQy9CLElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFNO1FBRTFCLElBQUksSUFBSSxDQUFDLCtCQUErQixFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLElBQUksQ0FBQTtZQUM5QyxPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksQ0FBQywrQkFBK0IsR0FBRyxJQUFJLENBQUE7UUFFM0MsSUFBSSxDQUFDO1lBQ0gsR0FBRyxDQUFDO2dCQUNGLElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxLQUFLLENBQUE7Z0JBRS9DLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtnQkFDbEQsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO2dCQUV6RCxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtnQkFFeEMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQTtZQUNuRixDQUFDLFFBQVEsSUFBSSxDQUFDLGtDQUFrQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBQztRQUN0RSxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsK0JBQStCLEdBQUcsS0FBSyxDQUFBO1FBQzlDLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtkaWdnfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCBEZXZlbG9wbWVudFJlbG9hZGVyIGZyb20gXCIuL2RldmVsb3BtZW50LXJlbG9hZGVyLmpzXCJcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcIi4uL3V0aWxzL2V2ZW50LWVtaXR0ZXIuanNcIlxuaW1wb3J0IEluUHJvY2Vzc0hhbmRsZXIgZnJvbSBcIi4vd29ya2VyLWhhbmRsZXIvaW4tcHJvY2Vzcy5qc1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuaW1wb3J0IE5ldCBmcm9tIFwibmV0XCJcbmltcG9ydCBTZXJ2ZXJDbGllbnQgZnJvbSBcIi4vc2VydmVyLWNsaWVudC5qc1wiXG5pbXBvcnQgV29ya2VySGFuZGxlciBmcm9tIFwiLi93b3JrZXItaGFuZGxlci9pbmRleC5qc1wiXG5cbi8qKiBAdHlwZWRlZiB7e3N0YXJ0OiAoKSA9PiBQcm9taXNlPHZvaWQ+LCBzdG9wOiAoKSA9PiBQcm9taXNlPHZvaWQ+fX0gRGV2ZWxvcG1lbnRSZWxvYWRlckxpa2UgKi9cbi8qKiBAdHlwZWRlZiB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgd29ya2VyQ291bnQ6IG51bWJlcn0pIDogKFdvcmtlckhhbmRsZXIgfCBJblByb2Nlc3NIYW5kbGVyKX0gV29ya2VySGFuZGxlckZhY3RvcnkgKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlciB7XG4gIGNsaWVudENvdW50ID0gMFxuICBfc3RhcnRpbmcgPSBmYWxzZVxuXG4gIC8qKiBAdHlwZSB7RGV2ZWxvcG1lbnRSZWxvYWRlciB8IERldmVsb3BtZW50UmVsb2FkZXJMaWtlIHwgdW5kZWZpbmVkfSAqL1xuICBkZXZlbG9wbWVudFJlbG9hZGVyXG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCJuZXRcIikuU2VydmVyIHwgdW5kZWZpbmVkfSAqL1xuICBuZXRTZXJ2ZXJcblxuICAvKiogQHR5cGUge1dvcmtlckhhbmRsZXJGYWN0b3J5IHwgdW5kZWZpbmVkfSAqL1xuICB3b3JrZXJIYW5kbGVyRmFjdG9yeVxuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgU2VydmVyQ2xpZW50Pn0gICovXG4gIGNsaWVudHMgPSB7fVxuXG4gIC8qKiBAdHlwZSB7U2V0PGltcG9ydChcIm5ldFwiKS5Tb2NrZXQ+fSAqL1xuICBfYWN0aXZlU29ja2V0cyA9IG5ldyBTZXQoKVxuXG4gIGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICB3b3JrZXJDb3VudCA9IDBcblxuICAvKiogQHR5cGUge0FycmF5PFdvcmtlckhhbmRsZXIgfCBJblByb2Nlc3NIYW5kbGVyPn0gKi9cbiAgd29ya2VySGFuZGxlcnMgPSBbXVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmhvc3RdIC0gSG9zdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5pblByb2Nlc3NdIC0gUnVuIEhUVFAgaGFuZGxlcnMgaW4gdGhlIG1haW4gdGhyZWFkIGluc3RlYWQgb2Ygd29ya2VyIHRocmVhZHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5wb3J0XSAtIFBvcnQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5tYXhXb3JrZXJzXSAtIE1heCB3b3JrZXJzLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIG9uUmVsb2FkOiBmdW5jdGlvbih7Y2hhbmdlZFBhdGg6IHN0cmluZ30pIDogUHJvbWlzZTx2b2lkPn0pIDoge3N0YXJ0OiAoKSA9PiBQcm9taXNlPHZvaWQ+LCBzdG9wOiAoKSA9PiBQcm9taXNlPHZvaWQ+fX0gW2FyZ3MuZGV2ZWxvcG1lbnRSZWxvYWRlckZhY3RvcnldIC0gRGV2ZWxvcG1lbnQgcmVsb2FkZXIgZmFjdG9yeS5cbiAgICogQHBhcmFtIHtXb3JrZXJIYW5kbGVyRmFjdG9yeX0gW2FyZ3Mud29ya2VySGFuZGxlckZhY3RvcnldIC0gV29ya2VyIGhhbmRsZXIgZmFjdG9yeS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBkZXZlbG9wbWVudFJlbG9hZGVyRmFjdG9yeSwgaG9zdCwgaW5Qcm9jZXNzLCBtYXhXb3JrZXJzLCBwb3J0LCB3b3JrZXJIYW5kbGVyRmFjdG9yeX0pIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5kZXZlbG9wbWVudFJlbG9hZGVyRmFjdG9yeSA9IGRldmVsb3BtZW50UmVsb2FkZXJGYWN0b3J5XG4gICAgdGhpcy53b3JrZXJIYW5kbGVyRmFjdG9yeSA9IHdvcmtlckhhbmRsZXJGYWN0b3J5XG4gICAgdGhpcy5pblByb2Nlc3MgPSBpblByb2Nlc3MgfHwgZmFsc2VcbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICB0aGlzLmhvc3QgPSBob3N0ID8/IFwiMC4wLjAuMFwiXG4gICAgdGhpcy5wb3J0ID0gcG9ydCA/PyAzMDA2XG4gICAgdGhpcy5tYXhXb3JrZXJzID0gbWF4V29ya2VycyA/PyAxNlxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuICAqL1xuICBhc3luYyBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5fc3RhcnRpbmcpIHRocm93IG5ldyBFcnJvcihcIlZlbG9jaW91cyBIVFRQIHNlcnZlciBpcyBhbHJlYWR5IHN0YXJ0aW5nXCIpXG4gICAgaWYgKHRoaXMuaXNBY3RpdmUoKSkgdGhyb3cgbmV3IEVycm9yKFwiVmVsb2Npb3VzIEhUVFAgc2VydmVyIGlzIGFscmVhZHkgcnVubmluZ1wiKVxuXG4gICAgdGhpcy5fc3RhcnRpbmcgPSB0cnVlXG4gICAgY29uc3Qgc3RhcnR1cFN0YXRlID0gdGhpcy5fY2FwdHVyZVN0YXJ0dXBTdGF0ZSgpXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fZW5zdXJlQXRMZWFzdE9uZVdvcmtlcigpXG4gICAgICBhd2FpdCB0aGlzLl9zdGFydERldmVsb3BtZW50UmVsb2FkZXIoKVxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJuZXRcIikuU2VydmVyfSAqL1xuICAgICAgY29uc3QgbmV0U2VydmVyID0gbmV3IE5ldC5TZXJ2ZXIoKVxuICAgICAgdGhpcy5uZXRTZXJ2ZXIgPSBuZXRTZXJ2ZXJcbiAgICAgIG5ldFNlcnZlci5vbihcImNsb3NlXCIsIHRoaXMub25DbG9zZSlcbiAgICAgIG5ldFNlcnZlci5vbihcImNvbm5lY3Rpb25cIiwgdGhpcy5vbkNvbm5lY3Rpb24pXG4gICAgICBuZXRTZXJ2ZXIub24oXCJlcnJvclwiLCB0aGlzLm9uU2VydmVyRXJyb3IpXG4gICAgICBhd2FpdCB0aGlzLl9uZXRTZXJ2ZXJMaXN0ZW4oKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLl9zdG9wU3RhcnR1cFJlc291cmNlcyhzdGFydHVwU3RhdGUpXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9zdGFydGluZyA9IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt7ZGV2ZWxvcG1lbnRSZWxvYWRlcjogRGV2ZWxvcG1lbnRSZWxvYWRlciB8IERldmVsb3BtZW50UmVsb2FkZXJMaWtlIHwgdW5kZWZpbmVkLCBuZXRTZXJ2ZXI6IGltcG9ydChcIm5ldFwiKS5TZXJ2ZXIgfCB1bmRlZmluZWQsIHdvcmtlckhhbmRsZXJzOiBBcnJheTxXb3JrZXJIYW5kbGVyIHwgSW5Qcm9jZXNzSGFuZGxlcj59fSAtIFN0YXJ0dXAgc3RhdGUuICovXG4gIF9jYXB0dXJlU3RhcnR1cFN0YXRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkZXZlbG9wbWVudFJlbG9hZGVyOiB0aGlzLmRldmVsb3BtZW50UmVsb2FkZXIsXG4gICAgICBuZXRTZXJ2ZXI6IHRoaXMubmV0U2VydmVyLFxuICAgICAgd29ya2VySGFuZGxlcnM6IFsuLi50aGlzLndvcmtlckhhbmRsZXJzXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8VmVsb2Npb3VzSHR0cFNlcnZlcltcIl9jYXB0dXJlU3RhcnR1cFN0YXRlXCJdPn0gc3RhcnR1cFN0YXRlIC0gU3RhdGUgY2FwdHVyZWQgYmVmb3JlIHN0YXJ0dXAuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY2xlYW51cCBpcyBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9zdG9wU3RhcnR1cFJlc291cmNlcyhzdGFydHVwU3RhdGUpIHtcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIm5ldFwiKS5TZXJ2ZXIgfCB1bmRlZmluZWR9ICovXG4gICAgY29uc3Qgc3RhcnR1cE5ldFNlcnZlciA9IHRoaXMubmV0U2VydmVyXG5cbiAgICBpZiAodGhpcy5kZXZlbG9wbWVudFJlbG9hZGVyICYmIHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlciAhPT0gc3RhcnR1cFN0YXRlLmRldmVsb3BtZW50UmVsb2FkZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlci5zdG9wKClcbiAgICB9XG5cbiAgICBpZiAoc3RhcnR1cE5ldFNlcnZlciAmJiBzdGFydHVwTmV0U2VydmVyICE9PSBzdGFydHVwU3RhdGUubmV0U2VydmVyKSB7XG4gICAgICBhd2FpdCB0aGlzLnN0b3BTZXJ2ZXIoc3RhcnR1cE5ldFNlcnZlcilcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydHVwV29ya2VySGFuZGxlcnMgPSB0aGlzLndvcmtlckhhbmRsZXJzLmZpbHRlcigod29ya2VySGFuZGxlcikgPT4gIXN0YXJ0dXBTdGF0ZS53b3JrZXJIYW5kbGVycy5pbmNsdWRlcyh3b3JrZXJIYW5kbGVyKSlcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHN0YXJ0dXBXb3JrZXJIYW5kbGVycy5tYXAoKGhhbmRsZXIpID0+IGhhbmRsZXIuc3RvcCgpKSlcblxuICAgIHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlciA9IHN0YXJ0dXBTdGF0ZS5kZXZlbG9wbWVudFJlbG9hZGVyXG4gICAgdGhpcy5uZXRTZXJ2ZXIgPSBzdGFydHVwU3RhdGUubmV0U2VydmVyXG4gICAgdGhpcy53b3JrZXJIYW5kbGVycyA9IHN0YXJ0dXBTdGF0ZS53b3JrZXJIYW5kbGVyc1xuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuICAqL1xuICBfbmV0U2VydmVyTGlzdGVuKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMubmV0U2VydmVyKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBuZXRTZXJ2ZXJcIilcblxuICAgICAgLyoqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gTGlzdGVuIGVycm9yLiAqL1xuICAgICAgY29uc3Qgb25MaXN0ZW5FcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLm5ldFNlcnZlcj8ub2ZmKFwiZXJyb3JcIiwgb25MaXN0ZW5FcnJvcilcbiAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLm5ldFNlcnZlci5vbmNlKFwiZXJyb3JcIiwgb25MaXN0ZW5FcnJvcilcbiAgICAgICAgdGhpcy5uZXRTZXJ2ZXIubGlzdGVuKHRoaXMucG9ydCwgdGhpcy5ob3N0LCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5uZXRTZXJ2ZXI/Lm9mZihcImVycm9yXCIsIG9uTGlzdGVuRXJyb3IpXG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFZlbG9jaW91cyBsaXN0ZW5pbmcgb24gJHt0aGlzLmhvc3R9OiR7dGhpcy5wb3J0fWApXG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLiAgKi9cbiAgYXN5bmMgX2Vuc3VyZUF0TGVhc3RPbmVXb3JrZXIoKSB7XG4gICAgaWYgKHRoaXMud29ya2VySGFuZGxlcnMubGVuZ3RoID09IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXIoKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGFjdGl2ZS4gICovXG4gIGlzQWN0aXZlKCkge1xuICAgIGlmICh0aGlzLm5ldFNlcnZlcikge1xuICAgICAgcmV0dXJuIHRoaXMubmV0U2VydmVyLmxpc3RlbmluZ1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuICAqL1xuICBhc3luYyBzdG9wQ2xpZW50cygpIHtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGNsaWVudENvdW50IGluIHRoaXMuY2xpZW50cykge1xuICAgICAgY29uc3QgY2xpZW50ID0gdGhpcy5jbGllbnRzW2NsaWVudENvdW50XVxuXG4gICAgICBwcm9taXNlcy5wdXNoKGNsaWVudC5lbmQoKSlcbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIm5ldFwiKS5TZXJ2ZXIgfCB1bmRlZmluZWR9IFtuZXRTZXJ2ZXJdIC0gU2VydmVyIHRvIHN0b3AuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBzdG9wU2VydmVyKG5ldFNlcnZlciA9IHRoaXMubmV0U2VydmVyKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghbmV0U2VydmVyIHx8ICFuZXRTZXJ2ZXIubGlzdGVuaW5nKSB7XG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKG5ldFNlcnZlciA9PT0gdGhpcy5uZXRTZXJ2ZXIpIHtcbiAgICAgICAgLy8gRm9yY2UtY2xvc2UgbGluZ2VyaW5nIHNvY2tldHMgKGUuZy4gV2ViU29ja2V0IHVwZ3JhZGVcbiAgICAgICAgLy8gY29ubmVjdGlvbnMgbWlkLWNsb3NlLWhhbmRzaGFrZSkgc28gdGhlIHBvcnQgaXMgcmVsZWFzZWRcbiAgICAgICAgLy8gaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciBncmFjZWZ1bCBkcmFpbi5cbiAgICAgICAgZm9yIChjb25zdCBzb2NrZXQgb2YgdGhpcy5fYWN0aXZlU29ja2V0cykge1xuICAgICAgICAgIHNvY2tldC5kZXN0cm95KClcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2FjdGl2ZVNvY2tldHMuY2xlYXIoKVxuICAgICAgfVxuXG4gICAgICBuZXRTZXJ2ZXIuY2xvc2UoKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuICAqL1xuICBhc3luYyBzdG9wKCkge1xuICAgIHRoaXMuX3N0b3BwaW5nID0gdHJ1ZVxuICAgIGF3YWl0IHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlcj8uc3RvcCgpXG4gICAgdGhpcy5kZXZlbG9wbWVudFJlbG9hZGVyID0gdW5kZWZpbmVkXG4gICAgYXdhaXQgdGhpcy5zdG9wQ2xpZW50cygpXG4gICAgYXdhaXQgdGhpcy5zdG9wU2VydmVyKClcblxuICAgIGNvbnN0IHN0b3BUYXNrcyA9IHRoaXMud29ya2VySGFuZGxlcnMubWFwKChoYW5kbGVyKSA9PiBoYW5kbGVyLnN0b3AoKSlcbiAgICBhd2FpdCBQcm9taXNlLmFsbChzdG9wVGFza3MpXG4gICAgdGhpcy53b3JrZXJIYW5kbGVycyA9IFtdXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLiAgKi9cbiAgb25DbG9zZSA9ICgpID0+IHtcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIFNlcnZlciBzb2NrZXQgZXJyb3IuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG9uU2VydmVyRXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICB0aGlzLmxvZ2dlci5lcnJvcihgVmVsb2Npb3VzIEhUVFAgc2VydmVyIHNvY2tldCBlcnJvciBvbiAke3RoaXMuaG9zdH06JHt0aGlzLnBvcnR9YCwgZXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCJuZXRcIikuU29ja2V0fSBzb2NrZXQgLSBTb2NrZXQgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG9uQ29ubmVjdGlvbiA9IChzb2NrZXQpID0+IHtcbiAgICBjb25zdCBjbGllbnRDb3VudCA9IHRoaXMuY2xpZW50Q291bnRcblxuICAgIHRoaXMuX2FjdGl2ZVNvY2tldHMuYWRkKHNvY2tldClcbiAgICBzb2NrZXQub25jZShcImNsb3NlXCIsICgpID0+IHRoaXMuX2FjdGl2ZVNvY2tldHMuZGVsZXRlKHNvY2tldCkpXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJOZXcgY2xpZW50XCIsIHtcbiAgICAgIGNsaWVudENvdW50LFxuICAgICAgcmVtb3RlQWRkcmVzczogc29ja2V0LnJlbW90ZUFkZHJlc3MsXG4gICAgICByZW1vdGVGYW1pbHk6IHNvY2tldC5yZW1vdGVGYW1pbHksXG4gICAgICByZW1vdGVQb3J0OiBzb2NrZXQucmVtb3RlUG9ydFxuICAgIH1dKVxuICAgIHRoaXMuY2xpZW50Q291bnQrK1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdvcmtlckhhbmRsZXIgPSB0aGlzLndvcmtlckhhbmRsZXJUb1VzZSgpXG4gICAgICBjb25zdCBjbGllbnQgPSBuZXcgU2VydmVyQ2xpZW50KHtcbiAgICAgICAgY2xpZW50Q291bnQsXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgc29ja2V0XG4gICAgICB9KVxuXG4gICAgICBjbGllbnQuZXZlbnRzLm9uKFwiY2xvc2VcIiwgdGhpcy5vbkNsaWVudENsb3NlKVxuXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgR2F2ZSBjbGllbnQgJHtjbGllbnRDb3VudH0gdG8gd29ya2VyICR7d29ya2VySGFuZGxlci53b3JrZXJDb3VudH1gKVxuICAgICAgd29ya2VySGFuZGxlci5hZGRTb2NrZXRDb25uZWN0aW9uKGNsaWVudClcbiAgICAgIHRoaXMuY2xpZW50c1tjbGllbnRDb3VudF0gPSBjbGllbnRcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBpbml0aWFsaXplIGNsaWVudCAke2NsaWVudENvdW50fSBvbiBuZXcgY29ubmVjdGlvbmAsIGVycm9yKVxuICAgICAgc29ja2V0LmRlc3Ryb3koKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1NlcnZlckNsaWVudH0gY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBvbkNsaWVudENsb3NlID0gKGNsaWVudCkgPT4ge1xuICAgIGNvbnN0IGNsaWVudENvdW50ID0gZGlnZyhjbGllbnQsIFwiY2xpZW50Q291bnRcIilcbiAgICBjb25zdCBvbGRDbGllbnRzTGVuZ3RoID0gT2JqZWN0LmtleXModGhpcy5jbGllbnRzKS5sZW5ndGhcblxuICAgIGRlbGV0ZSB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdXG5cbiAgICBjb25zdCBuZXdDbGllbnRzTGVuZ3RoID0gT2JqZWN0LmtleXModGhpcy5jbGllbnRzKS5sZW5ndGhcblxuICAgIGlmIChuZXdDbGllbnRzTGVuZ3RoICE9IChvbGRDbGllbnRzTGVuZ3RoIC0gMSkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFeHBlY3RlZCBjbGllbnQgdG8gaGF2ZSBiZWVuIHJlbW92ZWQgYnV0IGxlbmd0aCBkaWRuJ3QgY2hhbmdlIGZyb20gJHtvbGRDbGllbnRzTGVuZ3RofSB0byAke29sZENsaWVudHNMZW5ndGggLSAxfWApXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuICAqL1xuICBhc3luYyBzcGF3bldvcmtlcigpIHtcbiAgICBjb25zdCB3b3JrZXJIYW5kbGVyID0gYXdhaXQgdGhpcy5fYnVpbGRXb3JrZXJIYW5kbGVyKClcblxuICAgIHRoaXMud29ya2VySGFuZGxlcnMucHVzaCh3b3JrZXJIYW5kbGVyKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPFdvcmtlckhhbmRsZXIgfCBJblByb2Nlc3NIYW5kbGVyPn0gLSBTdGFydGVkIHdvcmtlciBoYW5kbGVyLiAqL1xuICBhc3luYyBfYnVpbGRXb3JrZXJIYW5kbGVyKCkge1xuICAgIGNvbnN0IHdvcmtlckNvdW50ID0gdGhpcy53b3JrZXJDb3VudFxuXG4gICAgdGhpcy53b3JrZXJDb3VudCsrXG5cbiAgICBjb25zdCBIYW5kbGVyID0gdGhpcy5pblByb2Nlc3MgPyBJblByb2Nlc3NIYW5kbGVyIDogV29ya2VySGFuZGxlclxuICAgIGNvbnN0IHdvcmtlckhhbmRsZXIgPSB0aGlzLndvcmtlckhhbmRsZXJGYWN0b3J5XG4gICAgICA/IHRoaXMud29ya2VySGFuZGxlckZhY3Rvcnkoe2NvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbiwgd29ya2VyQ291bnR9KVxuICAgICAgOiBuZXcgSGFuZGxlcih7XG4gICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgd29ya2VyQ291bnRcbiAgICAgIH0pXG5cbiAgICBhd2FpdCB3b3JrZXJIYW5kbGVyLnN0YXJ0KClcblxuICAgIHJldHVybiB3b3JrZXJIYW5kbGVyXG4gIH1cblxuICAvKiogQHJldHVybnMge1dvcmtlckhhbmRsZXIgfCBJblByb2Nlc3NIYW5kbGVyfSAtIFRoZSB3b3JrZXIgaGFuZGxlciB0byB1c2UuICovXG4gIHdvcmtlckhhbmRsZXJUb1VzZSgpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgV29ya2VyIGhhbmRsZXJzIGxlbmd0aDogJHt0aGlzLndvcmtlckhhbmRsZXJzLmxlbmd0aH1gKVxuXG4gICAgY29uc3QgcmFuZG9tV29ya2VyTnVtYmVyID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdGhpcy53b3JrZXJIYW5kbGVycy5sZW5ndGgpXG4gICAgY29uc3Qgd29ya2VySGFuZGxlciA9IHRoaXMud29ya2VySGFuZGxlcnNbcmFuZG9tV29ya2VyTnVtYmVyXVxuXG4gICAgaWYgKCF3b3JrZXJIYW5kbGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHdvcmtlckhhbmRsZXIgYnkgdGhhdCBudW1iZXI6ICR7cmFuZG9tV29ya2VyTnVtYmVyfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHdvcmtlckhhbmRsZXJcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGRldmVsb3BtZW50IHdvcmtlciBob3QgcmVsb2FkIHNob3VsZCBydW4uICovXG4gIHNob3VsZFVzZURldmVsb3BtZW50SG90UmVsb2FkKCkge1xuICAgIHJldHVybiAhdGhpcy5pblByb2Nlc3MgJiYgdGhpcy5jb25maWd1cmF0aW9uLmdldEVudmlyb25tZW50KCkgPT09IFwiZGV2ZWxvcG1lbnRcIlxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gd2F0Y2hlciBzZXR1cCBmaW5pc2hlcy4gKi9cbiAgYXN5bmMgX3N0YXJ0RGV2ZWxvcG1lbnRSZWxvYWRlcigpIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkVXNlRGV2ZWxvcG1lbnRIb3RSZWxvYWQoKSkgcmV0dXJuXG4gICAgaWYgKHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlcikgcmV0dXJuXG5cbiAgICBjb25zdCBjcmVhdGVEZXZlbG9wbWVudFJlbG9hZGVyID0gdGhpcy5kZXZlbG9wbWVudFJlbG9hZGVyRmFjdG9yeVxuICAgICAgfHwgKChhcmdzKSA9PiBuZXcgRGV2ZWxvcG1lbnRSZWxvYWRlcihhcmdzKSlcblxuICAgIHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlciA9IGNyZWF0ZURldmVsb3BtZW50UmVsb2FkZXIoe1xuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgb25SZWxvYWQ6IGFzeW5jICh7Y2hhbmdlZFBhdGh9KSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9nZ2VyLmluZm8oYERldmVsb3BtZW50IGhvdCByZWxvYWQgZGV0ZWN0ZWQgY2hhbmdlIGluICR7Y2hhbmdlZFBhdGh9YClcbiAgICAgICAgYXdhaXQgdGhpcy5yZWxvYWRXb3JrZXJzRm9yRGV2ZWxvcG1lbnQoKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBhd2FpdCB0aGlzLmRldmVsb3BtZW50UmVsb2FkZXIuc3RhcnQoKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gd29ya2VycyBoYXZlIGJlZW4gcmVmcmVzaGVkLiAqL1xuICBhc3luYyByZWxvYWRXb3JrZXJzRm9yRGV2ZWxvcG1lbnQoKSB7XG4gICAgaWYgKHRoaXMuX3N0b3BwaW5nKSByZXR1cm5cblxuICAgIGlmICh0aGlzLl9yZWxvYWRpbmdXb3JrZXJzRm9yRGV2ZWxvcG1lbnQpIHtcbiAgICAgIHRoaXMuX3JlbG9hZFdvcmtlcnNGb3JEZXZlbG9wbWVudFF1ZXVlZCA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX3JlbG9hZGluZ1dvcmtlcnNGb3JEZXZlbG9wbWVudCA9IHRydWVcblxuICAgIHRyeSB7XG4gICAgICBkbyB7XG4gICAgICAgIHRoaXMuX3JlbG9hZFdvcmtlcnNGb3JEZXZlbG9wbWVudFF1ZXVlZCA9IGZhbHNlXG5cbiAgICAgICAgY29uc3Qgb2xkV29ya2VySGFuZGxlcnMgPSBbLi4udGhpcy53b3JrZXJIYW5kbGVyc11cbiAgICAgICAgY29uc3QgbmV3V29ya2VySGFuZGxlciA9IGF3YWl0IHRoaXMuX2J1aWxkV29ya2VySGFuZGxlcigpXG5cbiAgICAgICAgdGhpcy53b3JrZXJIYW5kbGVycyA9IFtuZXdXb3JrZXJIYW5kbGVyXVxuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKG9sZFdvcmtlckhhbmRsZXJzLm1hcCgod29ya2VySGFuZGxlcikgPT4gd29ya2VySGFuZGxlci5zdG9wKCkpKVxuICAgICAgfSB3aGlsZSAodGhpcy5fcmVsb2FkV29ya2Vyc0ZvckRldmVsb3BtZW50UXVldWVkICYmICF0aGlzLl9zdG9wcGluZylcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fcmVsb2FkaW5nV29ya2Vyc0ZvckRldmVsb3BtZW50ID0gZmFsc2VcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
367
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxtQkFBbUIsTUFBTSwyQkFBMkIsQ0FBQTtBQUMzRCxPQUFPLFlBQVksTUFBTSwyQkFBMkIsQ0FBQTtBQUNwRCxPQUFPLGdCQUFnQixNQUFNLGdDQUFnQyxDQUFBO0FBQzdELE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQTtBQUNqQyxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUE7QUFDckIsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUE7QUFDN0MsT0FBTyxhQUFhLE1BQU0sMkJBQTJCLENBQUE7QUFFckQsaUdBQWlHO0FBQ2pHLGlLQUFpSztBQUVqSzs7Ozs7R0FLRztBQUNILFNBQVMsb0JBQW9CLENBQUMsRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFDO0lBQ2pELE1BQU0sV0FBVyxHQUFHLE9BQU8sSUFBSSxVQUFVLElBQUksQ0FBQyxDQUFBO0lBRTlDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0RCxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUE7SUFDbkUsQ0FBQztJQUVELE9BQU8sV0FBVyxDQUFBO0FBQ3BCLENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLG1CQUFtQjtJQUN0QyxXQUFXLEdBQUcsQ0FBQyxDQUFBO0lBQ2YsU0FBUyxHQUFHLEtBQUssQ0FBQTtJQUVqQix3RUFBd0U7SUFDeEUsbUJBQW1CLENBQUE7SUFFbkIsK0NBQStDO0lBQy9DLFNBQVMsQ0FBQTtJQUVULCtDQUErQztJQUMvQyxvQkFBb0IsQ0FBQTtJQUVwQiw0Q0FBNEM7SUFDNUMsT0FBTyxHQUFH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RyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQTtZQUNuRixDQUFDLFFBQVEsSUFBSSxDQUFDLGtDQUFrQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBQztRQUN0RSxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsK0JBQStCLEdBQUcsS0FBSyxDQUFBO1FBQzlDLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtkaWdnfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCBEZXZlbG9wbWVudFJlbG9hZGVyIGZyb20gXCIuL2RldmVsb3BtZW50LXJlbG9hZGVyLmpzXCJcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcIi4uL3V0aWxzL2V2ZW50LWVtaXR0ZXIuanNcIlxuaW1wb3J0IEluUHJvY2Vzc0hhbmRsZXIgZnJvbSBcIi4vd29ya2VyLWhhbmRsZXIvaW4tcHJvY2Vzcy5qc1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuaW1wb3J0IE5ldCBmcm9tIFwibmV0XCJcbmltcG9ydCBTZXJ2ZXJDbGllbnQgZnJvbSBcIi4vc2VydmVyLWNsaWVudC5qc1wiXG5pbXBvcnQgV29ya2VySGFuZGxlciBmcm9tIFwiLi93b3JrZXItaGFuZGxlci9pbmRleC5qc1wiXG5cbi8qKiBAdHlwZWRlZiB7e3N0YXJ0OiAoKSA9PiBQcm9taXNlPHZvaWQ+LCBzdG9wOiAoKSA9PiBQcm9taXNlPHZvaWQ+fX0gRGV2ZWxvcG1lbnRSZWxvYWRlckxpa2UgKi9cbi8qKiBAdHlwZWRlZiB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgd29ya2VyQ291bnQ6IG51bWJlcn0pIDogKFdvcmtlckhhbmRsZXIgfCBJblByb2Nlc3NIYW5kbGVyKX0gV29ya2VySGFuZGxlckZhY3RvcnkgKi9cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLm1heFdvcmtlcnNdIC0gQmFja3dhcmQtY29tcGF0aWJsZSB3b3JrZXIgY291bnQgYWxpYXMuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3Mud29ya2Vyc10gLSBDb25maWd1cmVkIHdvcmtlciBjb3VudC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gTm9ybWFsaXplZCB3b3JrZXIgY291bnQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVdvcmtlckNvdW50KHttYXhXb3JrZXJzLCB3b3JrZXJzfSkge1xuICBjb25zdCB3b3JrZXJDb3VudCA9IHdvcmtlcnMgPz8gbWF4V29ya2VycyA/PyAxXG5cbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHdvcmtlckNvdW50KSB8fCB3b3JrZXJDb3VudCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJIVFRQIHNlcnZlciB3b3JrZXJzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyXCIpXG4gIH1cblxuICByZXR1cm4gd29ya2VyQ291bnRcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlciB7XG4gIGNsaWVudENvdW50ID0gMFxuICBfc3RhcnRpbmcgPSBmYWxzZVxuXG4gIC8qKiBAdHlwZSB7RGV2ZWxvcG1lbnRSZWxvYWRlciB8IERldmVsb3BtZW50UmVsb2FkZXJMaWtlIHwgdW5kZWZpbmVkfSAqL1xuICBkZXZlbG9wbWVudFJlbG9hZGVyXG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCJuZXRcIikuU2VydmVyIHwgdW5kZWZpbmVkfSAqL1xuICBuZXRTZXJ2ZXJcblxuICAvKiogQHR5cGUge1dvcmtlckhhbmRsZXJGYWN0b3J5IHwgdW5kZWZpbmVkfSAqL1xuICB3b3JrZXJIYW5kbGVyRmFjdG9yeVxuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgU2VydmVyQ2xpZW50Pn0gICovXG4gIGNsaWVudHMgPSB7fVxuXG4gIC8qKiBAdHlwZSB7U2V0PGltcG9ydChcIm5ldFwiKS5Tb2NrZXQ+fSAqL1xuICBfYWN0aXZlU29ja2V0cyA9IG5ldyBTZXQoKVxuXG4gIGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICB3b3JrZXJDb3VudCA9IDBcblxuICAvKiogQHR5cGUge0FycmF5PFdvcmtlckhhbmRsZXIgfCBJblByb2Nlc3NIYW5kbGVyPn0gKi9cbiAgd29ya2VySGFuZGxlcnMgPSBbXVxuICBuZXh0V29ya2VySGFuZGxlckluZGV4ID0gMFxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFdvcmtlckhhbmRsZXIgfCBJblByb2Nlc3NIYW5kbGVyPn0gKi9cbiAgc3RpY2t5V29ya2VySGFuZGxlcnMgPSBuZXcgTWFwKClcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5ob3N0XSAtIEhvc3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuaW5Qcm9jZXNzXSAtIFJ1biBIVFRQIGhhbmRsZXJzIGluIHRoZSBtYWluIHRocmVhZCBpbnN0ZWFkIG9mIHdvcmtlciB0aHJlYWRzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MucG9ydF0gLSBQb3J0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MubWF4V29ya2Vyc10gLSBNYXggd29ya2Vycy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLndvcmtlcnNdIC0gV29ya2VyIGhhbmRsZXJzIHRvIHN0YXJ0LlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIG9uUmVsb2FkOiBmdW5jdGlvbih7Y2hhbmdlZFBhdGg6IHN0cmluZ30pIDogUHJvbWlzZTx2b2lkPn0pIDoge3N0YXJ0OiAoKSA9PiBQcm9taXNlPHZvaWQ+LCBzdG9wOiAoKSA9PiBQcm9taXNlPHZvaWQ+fX0gW2FyZ3MuZGV2ZWxvcG1lbnRSZWxvYWRlckZhY3RvcnldIC0gRGV2ZWxvcG1lbnQgcmVsb2FkZXIgZmFjdG9yeS5cbiAgICogQHBhcmFtIHtXb3JrZXJIYW5kbGVyRmFjdG9yeX0gW2FyZ3Mud29ya2VySGFuZGxlckZhY3RvcnldIC0gV29ya2VyIGhhbmRsZXIgZmFjdG9yeS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBkZXZlbG9wbWVudFJlbG9hZGVyRmFjdG9yeSwgaG9zdCwgaW5Qcm9jZXNzLCBtYXhXb3JrZXJzLCBwb3J0LCB3b3JrZXJIYW5kbGVyRmFjdG9yeSwgd29ya2Vyc30pIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5kZXZlbG9wbWVudFJlbG9hZGVyRmFjdG9yeSA9IGRldmVsb3BtZW50UmVsb2FkZXJGYWN0b3J5XG4gICAgdGhpcy53b3JrZXJIYW5kbGVyRmFjdG9yeSA9IHdvcmtlckhhbmRsZXJGYWN0b3J5XG4gICAgdGhpcy5pblByb2Nlc3MgPSBpblByb2Nlc3MgfHwgZmFsc2VcbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICB0aGlzLmhvc3QgPSBob3N0ID8/IFwiMC4wLjAuMFwiXG4gICAgdGhpcy5wb3J0ID0gcG9ydCA/PyAzMDA2XG4gICAgdGhpcy53b3JrZXJzID0gbm9ybWFsaXplV29ya2VyQ291bnQoe21heFdvcmtlcnMsIHdvcmtlcnN9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuICAqL1xuICBhc3luYyBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5fc3RhcnRpbmcpIHRocm93IG5ldyBFcnJvcihcIlZlbG9jaW91cyBIVFRQIHNlcnZlciBpcyBhbHJlYWR5IHN0YXJ0aW5nXCIpXG4gICAgaWYgKHRoaXMuaXNBY3RpdmUoKSkgdGhyb3cgbmV3IEVycm9yKFwiVmVsb2Npb3VzIEhUVFAgc2VydmVyIGlzIGFscmVhZHkgcnVubmluZ1wiKVxuXG4gICAgdGhpcy5fc3RhcnRpbmcgPSB0cnVlXG4gICAgY29uc3Qgc3RhcnR1cFN0YXRlID0gdGhpcy5fY2FwdHVyZVN0YXJ0dXBTdGF0ZSgpXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fZW5zdXJlV29ya2VycygpXG4gICAgICBhd2FpdCB0aGlzLl9zdGFydERldmVsb3BtZW50UmVsb2FkZXIoKVxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJuZXRcIikuU2VydmVyfSAqL1xuICAgICAgY29uc3QgbmV0U2VydmVyID0gbmV3IE5ldC5TZXJ2ZXIoKVxuICAgICAgdGhpcy5uZXRTZXJ2ZXIgPSBuZXRTZXJ2ZXJcbiAgICAgIG5ldFNlcnZlci5vbihcImNsb3NlXCIsIHRoaXMub25DbG9zZSlcbiAgICAgIG5ldFNlcnZlci5vbihcImNvbm5lY3Rpb25cIiwgdGhpcy5vbkNvbm5lY3Rpb24pXG4gICAgICBuZXRTZXJ2ZXIub24oXCJlcnJvclwiLCB0aGlzLm9uU2VydmVyRXJyb3IpXG4gICAgICBhd2FpdCB0aGlzLl9uZXRTZXJ2ZXJMaXN0ZW4oKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLl9zdG9wU3RhcnR1cFJlc291cmNlcyhzdGFydHVwU3RhdGUpXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9zdGFydGluZyA9IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt7ZGV2ZWxvcG1lbnRSZWxvYWRlcjogRGV2ZWxvcG1lbnRSZWxvYWRlciB8IERldmVsb3BtZW50UmVsb2FkZXJMaWtlIHwgdW5kZWZpbmVkLCBuZXRTZXJ2ZXI6IGltcG9ydChcIm5ldFwiKS5TZXJ2ZXIgfCB1bmRlZmluZWQsIHdvcmtlckhhbmRsZXJzOiBBcnJheTxXb3JrZXJIYW5kbGVyIHwgSW5Qcm9jZXNzSGFuZGxlcj59fSAtIFN0YXJ0dXAgc3RhdGUuICovXG4gIF9jYXB0dXJlU3RhcnR1cFN0YXRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkZXZlbG9wbWVudFJlbG9hZGVyOiB0aGlzLmRldmVsb3BtZW50UmVsb2FkZXIsXG4gICAgICBuZXRTZXJ2ZXI6IHRoaXMubmV0U2VydmVyLFxuICAgICAgd29ya2VySGFuZGxlcnM6IFsuLi50aGlzLndvcmtlckhhbmRsZXJzXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8VmVsb2Npb3VzSHR0cFNlcnZlcltcIl9jYXB0dXJlU3RhcnR1cFN0YXRlXCJdPn0gc3RhcnR1cFN0YXRlIC0gU3RhdGUgY2FwdHVyZWQgYmVmb3JlIHN0YXJ0dXAuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY2xlYW51cCBpcyBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9zdG9wU3RhcnR1cFJlc291cmNlcyhzdGFydHVwU3RhdGUpIHtcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIm5ldFwiKS5TZXJ2ZXIgfCB1bmRlZmluZWR9ICovXG4gICAgY29uc3Qgc3RhcnR1cE5ldFNlcnZlciA9IHRoaXMubmV0U2VydmVyXG5cbiAgICBpZiAodGhpcy5kZXZlbG9wbWVudFJlbG9hZGVyICYmIHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlciAhPT0gc3RhcnR1cFN0YXRlLmRldmVsb3BtZW50UmVsb2FkZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlci5zdG9wKClcbiAgICB9XG5cbiAgICBpZiAoc3RhcnR1cE5ldFNlcnZlciAmJiBzdGFydHVwTmV0U2VydmVyICE9PSBzdGFydHVwU3RhdGUubmV0U2VydmVyKSB7XG4gICAgICBhd2FpdCB0aGlzLnN0b3BTZXJ2ZXIoc3RhcnR1cE5ldFNlcnZlcilcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydHVwV29ya2VySGFuZGxlcnMgPSB0aGlzLndvcmtlckhhbmRsZXJzLmZpbHRlcigod29ya2VySGFuZGxlcikgPT4gIXN0YXJ0dXBTdGF0ZS53b3JrZXJIYW5kbGVycy5pbmNsdWRlcyh3b3JrZXJIYW5kbGVyKSlcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHN0YXJ0dXBXb3JrZXJIYW5kbGVycy5tYXAoKGhhbmRsZXIpID0+IGhhbmRsZXIuc3RvcCgpKSlcblxuICAgIHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlciA9IHN0YXJ0dXBTdGF0ZS5kZXZlbG9wbWVudFJlbG9hZGVyXG4gICAgdGhpcy5uZXRTZXJ2ZXIgPSBzdGFydHVwU3RhdGUubmV0U2VydmVyXG4gICAgdGhpcy53b3JrZXJIYW5kbGVycyA9IHN0YXJ0dXBTdGF0ZS53b3JrZXJIYW5kbGVyc1xuICAgIHRoaXMuc3RpY2t5V29ya2VySGFuZGxlcnMuY2xlYXIoKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuICAqL1xuICBfbmV0U2VydmVyTGlzdGVuKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMubmV0U2VydmVyKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBuZXRTZXJ2ZXJcIilcblxuICAgICAgLyoqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gTGlzdGVuIGVycm9yLiAqL1xuICAgICAgY29uc3Qgb25MaXN0ZW5FcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLm5ldFNlcnZlcj8ub2ZmKFwiZXJyb3JcIiwgb25MaXN0ZW5FcnJvcilcbiAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLm5ldFNlcnZlci5vbmNlKFwiZXJyb3JcIiwgb25MaXN0ZW5FcnJvcilcbiAgICAgICAgdGhpcy5uZXRTZXJ2ZXIubGlzdGVuKHRoaXMucG9ydCwgdGhpcy5ob3N0LCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5uZXRTZXJ2ZXI/Lm9mZihcImVycm9yXCIsIG9uTGlzdGVuRXJyb3IpXG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFZlbG9jaW91cyBsaXN0ZW5pbmcgb24gJHt0aGlzLmhvc3R9OiR7dGhpcy5wb3J0fWApXG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLiAgKi9cbiAgYXN5bmMgX2Vuc3VyZVdvcmtlcnMoKSB7XG4gICAgd2hpbGUgKHRoaXMud29ya2VySGFuZGxlcnMubGVuZ3RoIDwgdGhpcy53b3JrZXJzKSB7XG4gICAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VyKClcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBhY3RpdmUuICAqL1xuICBpc0FjdGl2ZSgpIHtcbiAgICBpZiAodGhpcy5uZXRTZXJ2ZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLm5ldFNlcnZlci5saXN0ZW5pbmdcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLiAgKi9cbiAgYXN5bmMgc3RvcENsaWVudHMoKSB7XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBjbGllbnRDb3VudCBpbiB0aGlzLmNsaWVudHMpIHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50c1tjbGllbnRDb3VudF1cblxuICAgICAgcHJvbWlzZXMucHVzaChjbGllbnQuZW5kKCkpXG4gICAgfVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCJuZXRcIikuU2VydmVyIHwgdW5kZWZpbmVkfSBbbmV0U2VydmVyXSAtIFNlcnZlciB0byBzdG9wLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgc3RvcFNlcnZlcihuZXRTZXJ2ZXIgPSB0aGlzLm5ldFNlcnZlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIW5ldFNlcnZlciB8fCAhbmV0U2VydmVyLmxpc3RlbmluZykge1xuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChuZXRTZXJ2ZXIgPT09IHRoaXMubmV0U2VydmVyKSB7XG4gICAgICAgIC8vIEZvcmNlLWNsb3NlIGxpbmdlcmluZyBzb2NrZXRzIChlLmcuIFdlYlNvY2tldCB1cGdyYWRlXG4gICAgICAgIC8vIGNvbm5lY3Rpb25zIG1pZC1jbG9zZS1oYW5kc2hha2UpIHNvIHRoZSBwb3J0IGlzIHJlbGVhc2VkXG4gICAgICAgIC8vIGltbWVkaWF0ZWx5IGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgZ3JhY2VmdWwgZHJhaW4uXG4gICAgICAgIGZvciAoY29uc3Qgc29ja2V0IG9mIHRoaXMuX2FjdGl2ZVNvY2tldHMpIHtcbiAgICAgICAgICBzb2NrZXQuZGVzdHJveSgpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9hY3RpdmVTb2NrZXRzLmNsZWFyKClcbiAgICAgIH1cblxuICAgICAgbmV0U2VydmVyLmNsb3NlKChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLiAgKi9cbiAgYXN5bmMgc3RvcCgpIHtcbiAgICB0aGlzLl9zdG9wcGluZyA9IHRydWVcbiAgICBhd2FpdCB0aGlzLmRldmVsb3BtZW50UmVsb2FkZXI/LnN0b3AoKVxuICAgIHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlciA9IHVuZGVmaW5lZFxuICAgIGF3YWl0IHRoaXMuc3RvcENsaWVudHMoKVxuICAgIGF3YWl0IHRoaXMuc3RvcFNlcnZlcigpXG5cbiAgICBjb25zdCBzdG9wVGFza3MgPSB0aGlzLndvcmtlckhhbmRsZXJzLm1hcCgoaGFuZGxlcikgPT4gaGFuZGxlci5zdG9wKCkpXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoc3RvcFRhc2tzKVxuICAgIHRoaXMud29ya2VySGFuZGxlcnMgPSBbXVxuICAgIHRoaXMuc3RpY2t5V29ya2VySGFuZGxlcnMuY2xlYXIoKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS4gICovXG4gIG9uQ2xvc2UgPSAoKSA9PiB7XG4gICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBTZXJ2ZXIgc29ja2V0IGVycm9yLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBvblNlcnZlckVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgdGhpcy5sb2dnZXIuZXJyb3IoYFZlbG9jaW91cyBIVFRQIHNlcnZlciBzb2NrZXQgZXJyb3Igb24gJHt0aGlzLmhvc3R9OiR7dGhpcy5wb3J0fWAsIGVycm9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwibmV0XCIpLlNvY2tldH0gc29ja2V0IC0gU29ja2V0IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBvbkNvbm5lY3Rpb24gPSAoc29ja2V0KSA9PiB7XG4gICAgY29uc3QgY2xpZW50Q291bnQgPSB0aGlzLmNsaWVudENvdW50XG5cbiAgICB0aGlzLl9hY3RpdmVTb2NrZXRzLmFkZChzb2NrZXQpXG4gICAgc29ja2V0Lm9uY2UoXCJjbG9zZVwiLCAoKSA9PiB0aGlzLl9hY3RpdmVTb2NrZXRzLmRlbGV0ZShzb2NrZXQpKVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW1wiTmV3IGNsaWVudFwiLCB7XG4gICAgICBjbGllbnRDb3VudCxcbiAgICAgIHJlbW90ZUFkZHJlc3M6IHNvY2tldC5yZW1vdGVBZGRyZXNzLFxuICAgICAgcmVtb3RlRmFtaWx5OiBzb2NrZXQucmVtb3RlRmFtaWx5LFxuICAgICAgcmVtb3RlUG9ydDogc29ja2V0LnJlbW90ZVBvcnRcbiAgICB9XSlcbiAgICB0aGlzLmNsaWVudENvdW50KytcblxuICAgIHRyeSB7XG4gICAgICAvLyBQYXVzZWQgV2ViU29ja2V0IHNlc3Npb25zIGFyZSB3b3JrZXItbG9jYWwsIHNvIHJlY29ubmVjdHMgZnJvbVxuICAgICAgLy8gdGhlIHNhbWUgY2xpZW50IGFkZHJlc3MgbXVzdCByZXR1cm4gdG8gdGhlIHNhbWUgd29ya2VyLlxuICAgICAgY29uc3Qgd29ya2VySGFuZGxlciA9IHRoaXMud29ya2VySGFuZGxlclRvVXNlKHtzdGlja3lLZXk6IHNvY2tldC5yZW1vdGVBZGRyZXNzfSlcbiAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBTZXJ2ZXJDbGllbnQoe1xuICAgICAgICBjbGllbnRDb3VudCxcbiAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgICBzb2NrZXRcbiAgICAgIH0pXG5cbiAgICAgIGNsaWVudC5ldmVudHMub24oXCJjbG9zZVwiLCB0aGlzLm9uQ2xpZW50Q2xvc2UpXG5cbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBHYXZlIGNsaWVudCAke2NsaWVudENvdW50fSB0byB3b3JrZXIgJHt3b3JrZXJIYW5kbGVyLndvcmtlckNvdW50fWApXG4gICAgICB3b3JrZXJIYW5kbGVyLmFkZFNvY2tldENvbm5lY3Rpb24oY2xpZW50KVxuICAgICAgdGhpcy5jbGllbnRzW2NsaWVudENvdW50XSA9IGNsaWVudFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGluaXRpYWxpemUgY2xpZW50ICR7Y2xpZW50Q291bnR9IG9uIG5ldyBjb25uZWN0aW9uYCwgZXJyb3IpXG4gICAgICBzb2NrZXQuZGVzdHJveSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U2VydmVyQ2xpZW50fSBjbGllbnQgLSBDbGllbnQgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG9uQ2xpZW50Q2xvc2UgPSAoY2xpZW50KSA9PiB7XG4gICAgY29uc3QgY2xpZW50Q291bnQgPSBkaWdnKGNsaWVudCwgXCJjbGllbnRDb3VudFwiKVxuICAgIGNvbnN0IG9sZENsaWVudHNMZW5ndGggPSBPYmplY3Qua2V5cyh0aGlzLmNsaWVudHMpLmxlbmd0aFxuXG4gICAgZGVsZXRlIHRoaXMuY2xpZW50c1tjbGllbnRDb3VudF1cblxuICAgIGNvbnN0IG5ld0NsaWVudHNMZW5ndGggPSBPYmplY3Qua2V5cyh0aGlzLmNsaWVudHMpLmxlbmd0aFxuXG4gICAgaWYgKG5ld0NsaWVudHNMZW5ndGggIT0gKG9sZENsaWVudHNMZW5ndGggLSAxKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEV4cGVjdGVkIGNsaWVudCB0byBoYXZlIGJlZW4gcmVtb3ZlZCBidXQgbGVuZ3RoIGRpZG4ndCBjaGFuZ2UgZnJvbSAke29sZENsaWVudHNMZW5ndGh9IHRvICR7b2xkQ2xpZW50c0xlbmd0aCAtIDF9YClcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS4gICovXG4gIGFzeW5jIHNwYXduV29ya2VyKCkge1xuICAgIGNvbnN0IHdvcmtlckhhbmRsZXIgPSBhd2FpdCB0aGlzLl9idWlsZFdvcmtlckhhbmRsZXIoKVxuXG4gICAgdGhpcy53b3JrZXJIYW5kbGVycy5wdXNoKHdvcmtlckhhbmRsZXIpXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8QXJyYXk8V29ya2VySGFuZGxlciB8IEluUHJvY2Vzc0hhbmRsZXI+Pn0gLSBTdGFydGVkIHdvcmtlciBoYW5kbGVycy4gKi9cbiAgYXN5bmMgX2J1aWxkV29ya2VySGFuZGxlcnMoKSB7XG4gICAgLyoqIEB0eXBlIHtBcnJheTxXb3JrZXJIYW5kbGVyIHwgSW5Qcm9jZXNzSGFuZGxlcj59ICovXG4gICAgY29uc3Qgd29ya2VySGFuZGxlcnMgPSBbXVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMud29ya2VyczsgaW5kZXggKz0gMSkge1xuICAgICAgd29ya2VySGFuZGxlcnMucHVzaChhd2FpdCB0aGlzLl9idWlsZFdvcmtlckhhbmRsZXIoKSlcbiAgICB9XG5cbiAgICByZXR1cm4gd29ya2VySGFuZGxlcnNcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxXb3JrZXJIYW5kbGVyIHwgSW5Qcm9jZXNzSGFuZGxlcj59IC0gU3RhcnRlZCB3b3JrZXIgaGFuZGxlci4gKi9cbiAgYXN5bmMgX2J1aWxkV29ya2VySGFuZGxlcigpIHtcbiAgICBjb25zdCB3b3JrZXJDb3VudCA9IHRoaXMud29ya2VyQ291bnRcblxuICAgIHRoaXMud29ya2VyQ291bnQrK1xuXG4gICAgY29uc3QgSGFuZGxlciA9IHRoaXMuaW5Qcm9jZXNzID8gSW5Qcm9jZXNzSGFuZGxlciA6IFdvcmtlckhhbmRsZXJcbiAgICBjb25zdCB3b3JrZXJIYW5kbGVyID0gdGhpcy53b3JrZXJIYW5kbGVyRmFjdG9yeVxuICAgICAgPyB0aGlzLndvcmtlckhhbmRsZXJGYWN0b3J5KHtjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sIHdvcmtlckNvdW50fSlcbiAgICAgIDogbmV3IEhhbmRsZXIoe1xuICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgIHdvcmtlckNvdW50XG4gICAgICB9KVxuXG4gICAgYXdhaXQgd29ya2VySGFuZGxlci5zdGFydCgpXG5cbiAgICByZXR1cm4gd29ya2VySGFuZGxlclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnN0aWNreUtleV0gLSBTdGFibGUga2V5IHRoYXQgbXVzdCBrZWVwIHJvdXRpbmcgdG8gdGhlIHNhbWUgd29ya2VyLlxuICAgKiBAcmV0dXJucyB7V29ya2VySGFuZGxlciB8IEluUHJvY2Vzc0hhbmRsZXJ9IC0gVGhlIHdvcmtlciBoYW5kbGVyIHRvIHVzZS5cbiAgICovXG4gIHdvcmtlckhhbmRsZXJUb1VzZSh7c3RpY2t5S2V5fSA9IHt9KSB7XG4gICAgaWYgKHN0aWNreUtleSkge1xuICAgICAgY29uc3Qgc3RpY2t5V29ya2VySGFuZGxlciA9IHRoaXMuc3RpY2t5V29ya2VySGFuZGxlcnMuZ2V0KHN0aWNreUtleSlcblxuICAgICAgaWYgKHN0aWNreVdvcmtlckhhbmRsZXIgJiYgdGhpcy53b3JrZXJIYW5kbGVycy5pbmNsdWRlcyhzdGlja3lXb3JrZXJIYW5kbGVyKSkge1xuICAgICAgICByZXR1cm4gc3RpY2t5V29ya2VySGFuZGxlclxuICAgICAgfVxuXG4gICAgICBjb25zdCB3b3JrZXJIYW5kbGVyID0gdGhpcy5fbmV4dFJvdW5kUm9iaW5Xb3JrZXJIYW5kbGVyKClcblxuICAgICAgdGhpcy5zdGlja3lXb3JrZXJIYW5kbGVycy5zZXQoc3RpY2t5S2V5LCB3b3JrZXJIYW5kbGVyKVxuXG4gICAgICByZXR1cm4gd29ya2VySGFuZGxlclxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9uZXh0Um91bmRSb2JpbldvcmtlckhhbmRsZXIoKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtXb3JrZXJIYW5kbGVyIHwgSW5Qcm9jZXNzSGFuZGxlcn0gLSBUaGUgbmV4dCByb3VuZC1yb2JpbiB3b3JrZXIgaGFuZGxlci4gKi9cbiAgX25leHRSb3VuZFJvYmluV29ya2VySGFuZGxlcigpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgV29ya2VyIGhhbmRsZXJzIGxlbmd0aDogJHt0aGlzLndvcmtlckhhbmRsZXJzLmxlbmd0aH1gKVxuXG4gICAgY29uc3Qgd29ya2VySGFuZGxlckluZGV4ID0gdGhpcy5uZXh0V29ya2VySGFuZGxlckluZGV4ICUgdGhpcy53b3JrZXJIYW5kbGVycy5sZW5ndGhcbiAgICBjb25zdCB3b3JrZXJIYW5kbGVyID0gdGhpcy53b3JrZXJIYW5kbGVyc1t3b3JrZXJIYW5kbGVySW5kZXhdXG5cbiAgICBpZiAoIXdvcmtlckhhbmRsZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gd29ya2VySGFuZGxlciBieSB0aGF0IG51bWJlcjogJHt3b3JrZXJIYW5kbGVySW5kZXh9YClcbiAgICB9XG5cbiAgICB0aGlzLm5leHRXb3JrZXJIYW5kbGVySW5kZXggKz0gMVxuXG4gICAgcmV0dXJuIHdvcmtlckhhbmRsZXJcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGRldmVsb3BtZW50IHdvcmtlciBob3QgcmVsb2FkIHNob3VsZCBydW4uICovXG4gIHNob3VsZFVzZURldmVsb3BtZW50SG90UmVsb2FkKCkge1xuICAgIHJldHVybiAhdGhpcy5pblByb2Nlc3MgJiYgdGhpcy5jb25maWd1cmF0aW9uLmdldEVudmlyb25tZW50KCkgPT09IFwiZGV2ZWxvcG1lbnRcIlxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gd2F0Y2hlciBzZXR1cCBmaW5pc2hlcy4gKi9cbiAgYXN5bmMgX3N0YXJ0RGV2ZWxvcG1lbnRSZWxvYWRlcigpIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkVXNlRGV2ZWxvcG1lbnRIb3RSZWxvYWQoKSkgcmV0dXJuXG4gICAgaWYgKHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlcikgcmV0dXJuXG5cbiAgICBjb25zdCBjcmVhdGVEZXZlbG9wbWVudFJlbG9hZGVyID0gdGhpcy5kZXZlbG9wbWVudFJlbG9hZGVyRmFjdG9yeVxuICAgICAgfHwgKChhcmdzKSA9PiBuZXcgRGV2ZWxvcG1lbnRSZWxvYWRlcihhcmdzKSlcblxuICAgIHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlciA9IGNyZWF0ZURldmVsb3BtZW50UmVsb2FkZXIoe1xuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgb25SZWxvYWQ6IGFzeW5jICh7Y2hhbmdlZFBhdGh9KSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9nZ2VyLmluZm8oYERldmVsb3BtZW50IGhvdCByZWxvYWQgZGV0ZWN0ZWQgY2hhbmdlIGluICR7Y2hhbmdlZFBhdGh9YClcbiAgICAgICAgYXdhaXQgdGhpcy5yZWxvYWRXb3JrZXJzRm9yRGV2ZWxvcG1lbnQoKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBhd2FpdCB0aGlzLmRldmVsb3BtZW50UmVsb2FkZXIuc3RhcnQoKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gd29ya2VycyBoYXZlIGJlZW4gcmVmcmVzaGVkLiAqL1xuICBhc3luYyByZWxvYWRXb3JrZXJzRm9yRGV2ZWxvcG1lbnQoKSB7XG4gICAgaWYgKHRoaXMuX3N0b3BwaW5nKSByZXR1cm5cblxuICAgIGlmICh0aGlzLl9yZWxvYWRpbmdXb3JrZXJzRm9yRGV2ZWxvcG1lbnQpIHtcbiAgICAgIHRoaXMuX3JlbG9hZFdvcmtlcnNGb3JEZXZlbG9wbWVudFF1ZXVlZCA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX3JlbG9hZGluZ1dvcmtlcnNGb3JEZXZlbG9wbWVudCA9IHRydWVcblxuICAgIHRyeSB7XG4gICAgICBkbyB7XG4gICAgICAgIHRoaXMuX3JlbG9hZFdvcmtlcnNGb3JEZXZlbG9wbWVudFF1ZXVlZCA9IGZhbHNlXG5cbiAgICAgICAgY29uc3Qgb2xkV29ya2VySGFuZGxlcnMgPSBbLi4udGhpcy53b3JrZXJIYW5kbGVyc11cbiAgICAgICAgY29uc3QgbmV3V29ya2VySGFuZGxlcnMgPSBhd2FpdCB0aGlzLl9idWlsZFdvcmtlckhhbmRsZXJzKClcblxuICAgICAgICB0aGlzLndvcmtlckhhbmRsZXJzID0gbmV3V29ya2VySGFuZGxlcnNcbiAgICAgICAgdGhpcy5uZXh0V29ya2VySGFuZGxlckluZGV4ID0gMFxuICAgICAgICB0aGlzLnN0aWNreVdvcmtlckhhbmRsZXJzLmNsZWFyKClcblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChvbGRXb3JrZXJIYW5kbGVycy5tYXAoKHdvcmtlckhhbmRsZXIpID0+IHdvcmtlckhhbmRsZXIuc3RvcCgpKSlcbiAgICAgIH0gd2hpbGUgKHRoaXMuX3JlbG9hZFdvcmtlcnNGb3JEZXZlbG9wbWVudFF1ZXVlZCAmJiAhdGhpcy5fc3RvcHBpbmcpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3JlbG9hZGluZ1dvcmtlcnNGb3JEZXZlbG9wbWVudCA9IGZhbHNlXG4gICAgfVxuICB9XG59XG4iXX0=
|