velocious 1.0.379 → 1.0.380
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.
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/** @typedef {{start: () => Promise<void>, stop: () => Promise<void>}} DevelopmentReloaderLike */
|
|
2
|
+
/** @typedef {function({configuration: import("../configuration.js").default, workerCount: number}) : (WorkerHandler | InProcessHandler)} WorkerHandlerFactory */
|
|
1
3
|
export default class VelociousHttpServer {
|
|
2
4
|
/**
|
|
3
5
|
* @param {object} args - Options object.
|
|
@@ -7,8 +9,9 @@ export default class VelociousHttpServer {
|
|
|
7
9
|
* @param {number} [args.port] - Port.
|
|
8
10
|
* @param {number} [args.maxWorkers] - Max workers.
|
|
9
11
|
* @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
|
+
* @param {WorkerHandlerFactory} [args.workerHandlerFactory] - Worker handler factory.
|
|
10
13
|
*/
|
|
11
|
-
constructor({ configuration, developmentReloaderFactory, host, inProcess, maxWorkers, port }: {
|
|
14
|
+
constructor({ configuration, developmentReloaderFactory, host, inProcess, maxWorkers, port, workerHandlerFactory }: {
|
|
12
15
|
configuration: import("../configuration.js").default;
|
|
13
16
|
host?: string | undefined;
|
|
14
17
|
inProcess?: boolean | undefined;
|
|
@@ -23,8 +26,16 @@ export default class VelociousHttpServer {
|
|
|
23
26
|
start: () => Promise<void>;
|
|
24
27
|
stop: () => Promise<void>;
|
|
25
28
|
}) | undefined;
|
|
29
|
+
workerHandlerFactory?: WorkerHandlerFactory | undefined;
|
|
26
30
|
});
|
|
27
31
|
clientCount: number;
|
|
32
|
+
_starting: boolean;
|
|
33
|
+
/** @type {DevelopmentReloader | DevelopmentReloaderLike | undefined} */
|
|
34
|
+
developmentReloader: DevelopmentReloader | DevelopmentReloaderLike | undefined;
|
|
35
|
+
/** @type {import("net").Server | undefined} */
|
|
36
|
+
netServer: import("net").Server | undefined;
|
|
37
|
+
/** @type {WorkerHandlerFactory | undefined} */
|
|
38
|
+
workerHandlerFactory: WorkerHandlerFactory | undefined;
|
|
28
39
|
/** @type {Record<string, ServerClient>} */
|
|
29
40
|
clients: Record<string, ServerClient>;
|
|
30
41
|
/** @type {Set<import("net").Socket>} */
|
|
@@ -50,7 +61,17 @@ export default class VelociousHttpServer {
|
|
|
50
61
|
maxWorkers: number;
|
|
51
62
|
/** @returns {Promise<void>} - Resolves when complete. */
|
|
52
63
|
start(): Promise<void>;
|
|
53
|
-
netServer:
|
|
64
|
+
/** @returns {{developmentReloader: DevelopmentReloader | DevelopmentReloaderLike | undefined, netServer: import("net").Server | undefined, workerHandlers: Array<WorkerHandler | InProcessHandler>}} - Startup state. */
|
|
65
|
+
_captureStartupState(): {
|
|
66
|
+
developmentReloader: DevelopmentReloader | DevelopmentReloaderLike | undefined;
|
|
67
|
+
netServer: import("net").Server | undefined;
|
|
68
|
+
workerHandlers: Array<WorkerHandler | InProcessHandler>;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* @param {ReturnType<VelociousHttpServer["_captureStartupState"]>} startupState - State captured before startup.
|
|
72
|
+
* @returns {Promise<void>} - Resolves when cleanup is complete.
|
|
73
|
+
*/
|
|
74
|
+
_stopStartupResources(startupState: ReturnType<VelociousHttpServer["_captureStartupState"]>): Promise<void>;
|
|
54
75
|
/** @returns {Promise<void>} - Resolves when complete. */
|
|
55
76
|
_netServerListen(): Promise<void>;
|
|
56
77
|
/** @returns {Promise<void>} - Resolves when complete. */
|
|
@@ -59,15 +80,14 @@ export default class VelociousHttpServer {
|
|
|
59
80
|
isActive(): boolean;
|
|
60
81
|
/** @returns {Promise<void>} - Resolves when complete. */
|
|
61
82
|
stopClients(): Promise<void>;
|
|
62
|
-
/**
|
|
63
|
-
|
|
83
|
+
/**
|
|
84
|
+
* @param {import("net").Server | undefined} [netServer] - Server to stop.
|
|
85
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
86
|
+
*/
|
|
87
|
+
stopServer(netServer?: import("net").Server | undefined): Promise<void>;
|
|
64
88
|
/** @returns {Promise<void>} - Resolves when complete. */
|
|
65
89
|
stop(): Promise<void>;
|
|
66
90
|
_stopping: boolean | undefined;
|
|
67
|
-
developmentReloader: {
|
|
68
|
-
start: () => Promise<void>;
|
|
69
|
-
stop: () => Promise<void>;
|
|
70
|
-
} | undefined;
|
|
71
91
|
/** @returns {void} - No return value. */
|
|
72
92
|
onClose: () => void;
|
|
73
93
|
/**
|
|
@@ -100,9 +120,17 @@ export default class VelociousHttpServer {
|
|
|
100
120
|
_reloadWorkersForDevelopmentQueued: boolean | undefined;
|
|
101
121
|
_reloadingWorkersForDevelopment: boolean | undefined;
|
|
102
122
|
}
|
|
123
|
+
export type DevelopmentReloaderLike = {
|
|
124
|
+
start: () => Promise<void>;
|
|
125
|
+
stop: () => Promise<void>;
|
|
126
|
+
};
|
|
127
|
+
export type WorkerHandlerFactory = (arg0: {
|
|
128
|
+
configuration: import("../configuration.js").default;
|
|
129
|
+
workerCount: number;
|
|
130
|
+
}) => (WorkerHandler | InProcessHandler);
|
|
131
|
+
import DevelopmentReloader from "./development-reloader.js";
|
|
103
132
|
import ServerClient from "./server-client.js";
|
|
104
133
|
import WorkerHandler from "./worker-handler/index.js";
|
|
105
134
|
import InProcessHandler from "./worker-handler/in-process.js";
|
|
106
135
|
import Logger from "../logger.js";
|
|
107
|
-
import Net from "net";
|
|
108
136
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/http-server/index.js"],"names":[],"mappings":"AAWA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/http-server/index.js"],"names":[],"mappings":"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"}
|
|
@@ -7,8 +7,17 @@ import Logger from "../logger.js";
|
|
|
7
7
|
import Net from "net";
|
|
8
8
|
import ServerClient from "./server-client.js";
|
|
9
9
|
import WorkerHandler from "./worker-handler/index.js";
|
|
10
|
+
/** @typedef {{start: () => Promise<void>, stop: () => Promise<void>}} DevelopmentReloaderLike */
|
|
11
|
+
/** @typedef {function({configuration: import("../configuration.js").default, workerCount: number}) : (WorkerHandler | InProcessHandler)} WorkerHandlerFactory */
|
|
10
12
|
export default class VelociousHttpServer {
|
|
11
13
|
clientCount = 0;
|
|
14
|
+
_starting = false;
|
|
15
|
+
/** @type {DevelopmentReloader | DevelopmentReloaderLike | undefined} */
|
|
16
|
+
developmentReloader;
|
|
17
|
+
/** @type {import("net").Server | undefined} */
|
|
18
|
+
netServer;
|
|
19
|
+
/** @type {WorkerHandlerFactory | undefined} */
|
|
20
|
+
workerHandlerFactory;
|
|
12
21
|
/** @type {Record<string, ServerClient>} */
|
|
13
22
|
clients = {};
|
|
14
23
|
/** @type {Set<import("net").Socket>} */
|
|
@@ -25,33 +34,86 @@ export default class VelociousHttpServer {
|
|
|
25
34
|
* @param {number} [args.port] - Port.
|
|
26
35
|
* @param {number} [args.maxWorkers] - Max workers.
|
|
27
36
|
* @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
|
+
* @param {WorkerHandlerFactory} [args.workerHandlerFactory] - Worker handler factory.
|
|
28
38
|
*/
|
|
29
|
-
constructor({ configuration, developmentReloaderFactory, host, inProcess, maxWorkers, port }) {
|
|
39
|
+
constructor({ configuration, developmentReloaderFactory, host, inProcess, maxWorkers, port, workerHandlerFactory }) {
|
|
30
40
|
this.configuration = configuration;
|
|
31
41
|
this.developmentReloaderFactory = developmentReloaderFactory;
|
|
42
|
+
this.workerHandlerFactory = workerHandlerFactory;
|
|
32
43
|
this.inProcess = inProcess || false;
|
|
33
44
|
this.logger = new Logger(this);
|
|
34
|
-
this.host = host
|
|
35
|
-
this.port = port
|
|
36
|
-
this.maxWorkers = maxWorkers
|
|
45
|
+
this.host = host ?? "0.0.0.0";
|
|
46
|
+
this.port = port ?? 3006;
|
|
47
|
+
this.maxWorkers = maxWorkers ?? 16;
|
|
37
48
|
}
|
|
38
49
|
/** @returns {Promise<void>} - Resolves when complete. */
|
|
39
50
|
async start() {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
this.
|
|
43
|
-
|
|
44
|
-
this.
|
|
45
|
-
this.
|
|
46
|
-
|
|
51
|
+
if (this._starting)
|
|
52
|
+
throw new Error("Velocious HTTP server is already starting");
|
|
53
|
+
if (this.isActive())
|
|
54
|
+
throw new Error("Velocious HTTP server is already running");
|
|
55
|
+
this._starting = true;
|
|
56
|
+
const startupState = this._captureStartupState();
|
|
57
|
+
try {
|
|
58
|
+
await this._ensureAtLeastOneWorker();
|
|
59
|
+
await this._startDevelopmentReloader();
|
|
60
|
+
/** @type {import("net").Server} */
|
|
61
|
+
const netServer = new Net.Server();
|
|
62
|
+
this.netServer = netServer;
|
|
63
|
+
netServer.on("close", this.onClose);
|
|
64
|
+
netServer.on("connection", this.onConnection);
|
|
65
|
+
netServer.on("error", this.onServerError);
|
|
66
|
+
await this._netServerListen();
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
await this._stopStartupResources(startupState);
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
this._starting = false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** @returns {{developmentReloader: DevelopmentReloader | DevelopmentReloaderLike | undefined, netServer: import("net").Server | undefined, workerHandlers: Array<WorkerHandler | InProcessHandler>}} - Startup state. */
|
|
77
|
+
_captureStartupState() {
|
|
78
|
+
return {
|
|
79
|
+
developmentReloader: this.developmentReloader,
|
|
80
|
+
netServer: this.netServer,
|
|
81
|
+
workerHandlers: [...this.workerHandlers]
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* @param {ReturnType<VelociousHttpServer["_captureStartupState"]>} startupState - State captured before startup.
|
|
86
|
+
* @returns {Promise<void>} - Resolves when cleanup is complete.
|
|
87
|
+
*/
|
|
88
|
+
async _stopStartupResources(startupState) {
|
|
89
|
+
/** @type {import("net").Server | undefined} */
|
|
90
|
+
const startupNetServer = this.netServer;
|
|
91
|
+
if (this.developmentReloader && this.developmentReloader !== startupState.developmentReloader) {
|
|
92
|
+
await this.developmentReloader.stop();
|
|
93
|
+
}
|
|
94
|
+
if (startupNetServer && startupNetServer !== startupState.netServer) {
|
|
95
|
+
await this.stopServer(startupNetServer);
|
|
96
|
+
}
|
|
97
|
+
const startupWorkerHandlers = this.workerHandlers.filter((workerHandler) => !startupState.workerHandlers.includes(workerHandler));
|
|
98
|
+
await Promise.all(startupWorkerHandlers.map((handler) => handler.stop()));
|
|
99
|
+
this.developmentReloader = startupState.developmentReloader;
|
|
100
|
+
this.netServer = startupState.netServer;
|
|
101
|
+
this.workerHandlers = startupState.workerHandlers;
|
|
47
102
|
}
|
|
48
103
|
/** @returns {Promise<void>} - Resolves when complete. */
|
|
49
104
|
_netServerListen() {
|
|
50
105
|
return new Promise((resolve, reject) => {
|
|
51
106
|
if (!this.netServer)
|
|
52
107
|
throw new Error("No netServer");
|
|
108
|
+
/** @param {Error} error - Listen error. */
|
|
109
|
+
const onListenError = (error) => {
|
|
110
|
+
this.netServer?.off("error", onListenError);
|
|
111
|
+
reject(error);
|
|
112
|
+
};
|
|
53
113
|
try {
|
|
114
|
+
this.netServer.once("error", onListenError);
|
|
54
115
|
this.netServer.listen(this.port, this.host, () => {
|
|
116
|
+
this.netServer?.off("error", onListenError);
|
|
55
117
|
this.logger.debug(`Velocious listening on ${this.host}:${this.port}`);
|
|
56
118
|
resolve(undefined);
|
|
57
119
|
});
|
|
@@ -83,21 +145,26 @@ export default class VelociousHttpServer {
|
|
|
83
145
|
}
|
|
84
146
|
await Promise.all(promises);
|
|
85
147
|
}
|
|
86
|
-
/**
|
|
87
|
-
|
|
148
|
+
/**
|
|
149
|
+
* @param {import("net").Server | undefined} [netServer] - Server to stop.
|
|
150
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
151
|
+
*/
|
|
152
|
+
stopServer(netServer = this.netServer) {
|
|
88
153
|
return new Promise((resolve, reject) => {
|
|
89
|
-
if (!
|
|
154
|
+
if (!netServer || !netServer.listening) {
|
|
90
155
|
resolve(undefined);
|
|
91
156
|
return;
|
|
92
157
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
socket.
|
|
158
|
+
if (netServer === this.netServer) {
|
|
159
|
+
// Force-close lingering sockets (e.g. WebSocket upgrade
|
|
160
|
+
// connections mid-close-handshake) so the port is released
|
|
161
|
+
// immediately instead of waiting for graceful drain.
|
|
162
|
+
for (const socket of this._activeSockets) {
|
|
163
|
+
socket.destroy();
|
|
164
|
+
}
|
|
165
|
+
this._activeSockets.clear();
|
|
98
166
|
}
|
|
99
|
-
|
|
100
|
-
this.netServer.close((error) => {
|
|
167
|
+
netServer.close((error) => {
|
|
101
168
|
if (error) {
|
|
102
169
|
reject(error);
|
|
103
170
|
}
|
|
@@ -184,10 +251,12 @@ export default class VelociousHttpServer {
|
|
|
184
251
|
const workerCount = this.workerCount;
|
|
185
252
|
this.workerCount++;
|
|
186
253
|
const Handler = this.inProcess ? InProcessHandler : WorkerHandler;
|
|
187
|
-
const workerHandler =
|
|
188
|
-
configuration: this.configuration,
|
|
189
|
-
|
|
190
|
-
|
|
254
|
+
const workerHandler = this.workerHandlerFactory
|
|
255
|
+
? this.workerHandlerFactory({ configuration: this.configuration, workerCount })
|
|
256
|
+
: new Handler({
|
|
257
|
+
configuration: this.configuration,
|
|
258
|
+
workerCount
|
|
259
|
+
});
|
|
191
260
|
await workerHandler.start();
|
|
192
261
|
return workerHandler;
|
|
193
262
|
}
|
|
@@ -245,4 +314,4 @@ export default class VelociousHttpServer {
|
|
|
245
314
|
}
|
|
246
315
|
}
|
|
247
316
|
}
|
|
248
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxtQkFBbUIsTUFBTSwyQkFBMkIsQ0FBQTtBQUMzRCxPQUFPLFlBQVksTUFBTSwyQkFBMkIsQ0FBQTtBQUNwRCxPQUFPLGdCQUFnQixNQUFNLGdDQUFnQyxDQUFBO0FBQzdELE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQTtBQUNqQyxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUE7QUFDckIsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUE7QUFDN0MsT0FBTyxhQUFhLE1BQU0sMkJBQTJCLENBQUE7QUFFckQsTUFBTSxDQUFDLE9BQU8sT0FBTyxtQkFBbUI7SUFDdEMsV0FBVyxHQUFHLENBQUMsQ0FBQTtJQUVmLDRDQUE0QztJQUM1QyxPQUFPLEdBQUcsRUFBRSxDQUFBO0lBRVosd0NBQXdDO0lBQ3hDLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRTFCLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFBO0lBQzNCLFdBQVcsR0FBRyxDQUFDLENBQUE7SUFFZixzREFBc0Q7SUFDdEQsY0FBYyxHQUFHLEVBQUUsQ0FBQTtJQUVuQjs7Ozs7Ozs7T0FRRztJQUNILFlBQVksRUFBQyxhQUFhLEVBQUUsMEJBQTBCLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFDO1FBQ3hGLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBQ2xDLElBQUksQ0FBQywwQkFBMEIsR0FBRywwQkFBMEIsQ0FBQTtRQUM1RCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsSUFBSSxLQUFLLENBQUE7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FB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QUM7Z0JBQ0YsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLEtBQUssQ0FBQTtnQkFFL0MsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO2dCQUNsRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUE7Z0JBRXpELElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO2dCQUV4QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQ25GLENBQUMsUUFBUSxJQUFJLENBQUMsa0NBQWtDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFDO1FBQ3RFLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQywrQkFBK0IsR0FBRyxLQUFLLENBQUE7UUFDOUMsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0IERldmVsb3BtZW50UmVsb2FkZXIgZnJvbSBcIi4vZGV2ZWxvcG1lbnQtcmVsb2FkZXIuanNcIlxuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tIFwiLi4vdXRpbHMvZXZlbnQtZW1pdHRlci5qc1wiXG5pbXBvcnQgSW5Qcm9jZXNzSGFuZGxlciBmcm9tIFwiLi93b3JrZXItaGFuZGxlci9pbi1wcm9jZXNzLmpzXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgTmV0IGZyb20gXCJuZXRcIlxuaW1wb3J0IFNlcnZlckNsaWVudCBmcm9tIFwiLi9zZXJ2ZXItY2xpZW50LmpzXCJcbmltcG9ydCBXb3JrZXJIYW5kbGVyIGZyb20gXCIuL3dvcmtlci1oYW5kbGVyL2luZGV4LmpzXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlciB7XG4gIGNsaWVudENvdW50ID0gMFxuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgU2VydmVyQ2xpZW50Pn0gICovXG4gIGNsaWVudHMgPSB7fVxuXG4gIC8qKiBAdHlwZSB7U2V0PGltcG9ydChcIm5ldFwiKS5Tb2NrZXQ+fSAqL1xuICBfYWN0aXZlU29ja2V0cyA9IG5ldyBTZXQoKVxuXG4gIGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICB3b3JrZXJDb3VudCA9IDBcblxuICAvKiogQHR5cGUge0FycmF5PFdvcmtlckhhbmRsZXIgfCBJblByb2Nlc3NIYW5kbGVyPn0gKi9cbiAgd29ya2VySGFuZGxlcnMgPSBbXVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmhvc3RdIC0gSG9zdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5pblByb2Nlc3NdIC0gUnVuIEhUVFAgaGFuZGxlcnMgaW4gdGhlIG1haW4gdGhyZWFkIGluc3RlYWQgb2Ygd29ya2VyIHRocmVhZHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5wb3J0XSAtIFBvcnQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5tYXhXb3JrZXJzXSAtIE1heCB3b3JrZXJzLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIG9uUmVsb2FkOiBmdW5jdGlvbih7Y2hhbmdlZFBhdGg6IHN0cmluZ30pIDogUHJvbWlzZTx2b2lkPn0pIDoge3N0YXJ0OiAoKSA9PiBQcm9taXNlPHZvaWQ+LCBzdG9wOiAoKSA9PiBQcm9taXNlPHZvaWQ+fX0gW2FyZ3MuZGV2ZWxvcG1lbnRSZWxvYWRlckZhY3RvcnldIC0gRGV2ZWxvcG1lbnQgcmVsb2FkZXIgZmFjdG9yeS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBkZXZlbG9wbWVudFJlbG9hZGVyRmFjdG9yeSwgaG9zdCwgaW5Qcm9jZXNzLCBtYXhXb3JrZXJzLCBwb3J0fSkge1xuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLmRldmVsb3BtZW50UmVsb2FkZXJGYWN0b3J5ID0gZGV2ZWxvcG1lbnRSZWxvYWRlckZhY3RvcnlcbiAgICB0aGlzLmluUHJvY2VzcyA9IGluUHJvY2VzcyB8fCBmYWxzZVxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKVxuICAgIHRoaXMuaG9zdCA9IGhvc3QgfHwgXCIwLjAuMC4wXCJcbiAgICB0aGlzLnBvcnQgPSBwb3J0IHx8IDMwMDZcbiAgICB0aGlzLm1heFdvcmtlcnMgPSBtYXhXb3JrZXJzIHx8IDE2XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS4gICovXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIGF3YWl0IHRoaXMuX2Vuc3VyZUF0TGVhc3RPbmVXb3JrZXIoKVxuICAgIGF3YWl0IHRoaXMuX3N0YXJ0RGV2ZWxvcG1lbnRSZWxvYWRlcigpXG4gICAgdGhpcy5uZXRTZXJ2ZXIgPSBuZXcgTmV0LlNlcnZlcigpXG4gICAgdGhpcy5uZXRTZXJ2ZXIub24oXCJjbG9zZVwiLCB0aGlzLm9uQ2xvc2UpXG4gICAgdGhpcy5uZXRTZXJ2ZXIub24oXCJjb25uZWN0aW9uXCIsIHRoaXMub25Db25uZWN0aW9uKVxuICAgIHRoaXMubmV0U2VydmVyLm9uKFwiZXJyb3JcIiwgdGhpcy5vblNlcnZlckVycm9yKVxuICAgIGF3YWl0IHRoaXMuX25ldFNlcnZlckxpc3RlbigpXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS4gICovXG4gIF9uZXRTZXJ2ZXJMaXN0ZW4oKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghdGhpcy5uZXRTZXJ2ZXIpIHRocm93IG5ldyBFcnJvcihcIk5vIG5ldFNlcnZlclwiKVxuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLm5ldFNlcnZlci5saXN0ZW4odGhpcy5wb3J0LCB0aGlzLmhvc3QsICgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgVmVsb2Npb3VzIGxpc3RlbmluZyBvbiAke3RoaXMuaG9zdH06JHt0aGlzLnBvcnR9YClcbiAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuICAqL1xuICBhc3luYyBfZW5zdXJlQXRMZWFzdE9uZVdvcmtlcigpIHtcbiAgICBpZiAodGhpcy53b3JrZXJIYW5kbGVycy5sZW5ndGggPT0gMCkge1xuICAgICAgYXdhaXQgdGhpcy5zcGF3bldvcmtlcigpXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgYWN0aXZlLiAgKi9cbiAgaXNBY3RpdmUoKSB7XG4gICAgaWYgKHRoaXMubmV0U2VydmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5uZXRTZXJ2ZXIubGlzdGVuaW5nXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS4gICovXG4gIGFzeW5jIHN0b3BDbGllbnRzKCkge1xuICAgIGNvbnN0IHByb21pc2VzID0gW11cblxuICAgIGZvciAoY29uc3QgY2xpZW50Q291bnQgaW4gdGhpcy5jbGllbnRzKSB7XG4gICAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdXG5cbiAgICAgIHByb21pc2VzLnB1c2goY2xpZW50LmVuZCgpKVxuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuICAqL1xuICBzdG9wU2VydmVyKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMubmV0U2VydmVyIHx8ICF0aGlzLm5ldFNlcnZlci5saXN0ZW5pbmcpIHtcbiAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBGb3JjZS1jbG9zZSBsaW5nZXJpbmcgc29ja2V0cyAoZS5nLiBXZWJTb2NrZXQgdXBncmFkZVxuICAgICAgLy8gY29ubmVjdGlvbnMgbWlkLWNsb3NlLWhhbmRzaGFrZSkgc28gdGhlIHBvcnQgaXMgcmVsZWFzZWRcbiAgICAgIC8vIGltbWVkaWF0ZWx5IGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgZ3JhY2VmdWwgZHJhaW4uXG4gICAgICBmb3IgKGNvbnN0IHNvY2tldCBvZiB0aGlzLl9hY3RpdmVTb2NrZXRzKSB7XG4gICAgICAgIHNvY2tldC5kZXN0cm95KClcbiAgICAgIH1cblxuICAgICAgdGhpcy5fYWN0aXZlU29ja2V0cy5jbGVhcigpXG5cbiAgICAgIHRoaXMubmV0U2VydmVyLmNsb3NlKChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLiAgKi9cbiAgYXN5bmMgc3RvcCgpIHtcbiAgICB0aGlzLl9zdG9wcGluZyA9IHRydWVcbiAgICBhd2FpdCB0aGlzLmRldmVsb3BtZW50UmVsb2FkZXI/LnN0b3AoKVxuICAgIHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlciA9IHVuZGVmaW5lZFxuICAgIGF3YWl0IHRoaXMuc3RvcENsaWVudHMoKVxuICAgIGF3YWl0IHRoaXMuc3RvcFNlcnZlcigpXG5cbiAgICBjb25zdCBzdG9wVGFza3MgPSB0aGlzLndvcmtlckhhbmRsZXJzLm1hcCgoaGFuZGxlcikgPT4gaGFuZGxlci5zdG9wKCkpXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoc3RvcFRhc2tzKVxuICAgIHRoaXMud29ya2VySGFuZGxlcnMgPSBbXVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS4gICovXG4gIG9uQ2xvc2UgPSAoKSA9PiB7XG4gICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBTZXJ2ZXIgc29ja2V0IGVycm9yLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBvblNlcnZlckVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgdGhpcy5sb2dnZXIuZXJyb3IoYFZlbG9jaW91cyBIVFRQIHNlcnZlciBzb2NrZXQgZXJyb3Igb24gJHt0aGlzLmhvc3R9OiR7dGhpcy5wb3J0fWAsIGVycm9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwibmV0XCIpLlNvY2tldH0gc29ja2V0IC0gU29ja2V0IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBvbkNvbm5lY3Rpb24gPSAoc29ja2V0KSA9PiB7XG4gICAgY29uc3QgY2xpZW50Q291bnQgPSB0aGlzLmNsaWVudENvdW50XG5cbiAgICB0aGlzLl9hY3RpdmVTb2NrZXRzLmFkZChzb2NrZXQpXG4gICAgc29ja2V0Lm9uY2UoXCJjbG9zZVwiLCAoKSA9PiB0aGlzLl9hY3RpdmVTb2NrZXRzLmRlbGV0ZShzb2NrZXQpKVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW1wiTmV3IGNsaWVudFwiLCB7XG4gICAgICBjbGllbnRDb3VudCxcbiAgICAgIHJlbW90ZUFkZHJlc3M6IHNvY2tldC5yZW1vdGVBZGRyZXNzLFxuICAgICAgcmVtb3RlRmFtaWx5OiBzb2NrZXQucmVtb3RlRmFtaWx5LFxuICAgICAgcmVtb3RlUG9ydDogc29ja2V0LnJlbW90ZVBvcnRcbiAgICB9XSlcbiAgICB0aGlzLmNsaWVudENvdW50KytcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB3b3JrZXJIYW5kbGVyID0gdGhpcy53b3JrZXJIYW5kbGVyVG9Vc2UoKVxuICAgICAgY29uc3QgY2xpZW50ID0gbmV3IFNlcnZlckNsaWVudCh7XG4gICAgICAgIGNsaWVudENvdW50LFxuICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgIHNvY2tldFxuICAgICAgfSlcblxuICAgICAgY2xpZW50LmV2ZW50cy5vbihcImNsb3NlXCIsIHRoaXMub25DbGllbnRDbG9zZSlcblxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYEdhdmUgY2xpZW50ICR7Y2xpZW50Q291bnR9IHRvIHdvcmtlciAke3dvcmtlckhhbmRsZXIud29ya2VyQ291bnR9YClcbiAgICAgIHdvcmtlckhhbmRsZXIuYWRkU29ja2V0Q29ubmVjdGlvbihjbGllbnQpXG4gICAgICB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdID0gY2xpZW50XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjbGllbnQgJHtjbGllbnRDb3VudH0gb24gbmV3IGNvbm5lY3Rpb25gLCBlcnJvcilcbiAgICAgIHNvY2tldC5kZXN0cm95KClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtTZXJ2ZXJDbGllbnR9IGNsaWVudCAtIENsaWVudCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgb25DbGllbnRDbG9zZSA9IChjbGllbnQpID0+IHtcbiAgICBjb25zdCBjbGllbnRDb3VudCA9IGRpZ2coY2xpZW50LCBcImNsaWVudENvdW50XCIpXG4gICAgY29uc3Qgb2xkQ2xpZW50c0xlbmd0aCA9IE9iamVjdC5rZXlzKHRoaXMuY2xpZW50cykubGVuZ3RoXG5cbiAgICBkZWxldGUgdGhpcy5jbGllbnRzW2NsaWVudENvdW50XVxuXG4gICAgY29uc3QgbmV3Q2xpZW50c0xlbmd0aCA9IE9iamVjdC5rZXlzKHRoaXMuY2xpZW50cykubGVuZ3RoXG5cbiAgICBpZiAobmV3Q2xpZW50c0xlbmd0aCAhPSAob2xkQ2xpZW50c0xlbmd0aCAtIDEpKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXhwZWN0ZWQgY2xpZW50IHRvIGhhdmUgYmVlbiByZW1vdmVkIGJ1dCBsZW5ndGggZGlkbid0IGNoYW5nZSBmcm9tICR7b2xkQ2xpZW50c0xlbmd0aH0gdG8gJHtvbGRDbGllbnRzTGVuZ3RoIC0gMX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLiAgKi9cbiAgYXN5bmMgc3Bhd25Xb3JrZXIoKSB7XG4gICAgY29uc3Qgd29ya2VySGFuZGxlciA9IGF3YWl0IHRoaXMuX2J1aWxkV29ya2VySGFuZGxlcigpXG5cbiAgICB0aGlzLndvcmtlckhhbmRsZXJzLnB1c2god29ya2VySGFuZGxlcilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxXb3JrZXJIYW5kbGVyIHwgSW5Qcm9jZXNzSGFuZGxlcj59IC0gU3RhcnRlZCB3b3JrZXIgaGFuZGxlci4gKi9cbiAgYXN5bmMgX2J1aWxkV29ya2VySGFuZGxlcigpIHtcbiAgICBjb25zdCB3b3JrZXJDb3VudCA9IHRoaXMud29ya2VyQ291bnRcblxuICAgIHRoaXMud29ya2VyQ291bnQrK1xuXG4gICAgY29uc3QgSGFuZGxlciA9IHRoaXMuaW5Qcm9jZXNzID8gSW5Qcm9jZXNzSGFuZGxlciA6IFdvcmtlckhhbmRsZXJcbiAgICBjb25zdCB3b3JrZXJIYW5kbGVyID0gbmV3IEhhbmRsZXIoe1xuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgd29ya2VyQ291bnRcbiAgICB9KVxuXG4gICAgYXdhaXQgd29ya2VySGFuZGxlci5zdGFydCgpXG5cbiAgICByZXR1cm4gd29ya2VySGFuZGxlclxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtXb3JrZXJIYW5kbGVyIHwgSW5Qcm9jZXNzSGFuZGxlcn0gLSBUaGUgd29ya2VyIGhhbmRsZXIgdG8gdXNlLiAqL1xuICB3b3JrZXJIYW5kbGVyVG9Vc2UoKSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFdvcmtlciBoYW5kbGVycyBsZW5ndGg6ICR7dGhpcy53b3JrZXJIYW5kbGVycy5sZW5ndGh9YClcblxuICAgIGNvbnN0IHJhbmRvbVdvcmtlck51bWJlciA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMud29ya2VySGFuZGxlcnMubGVuZ3RoKVxuICAgIGNvbnN0IHdvcmtlckhhbmRsZXIgPSB0aGlzLndvcmtlckhhbmRsZXJzW3JhbmRvbVdvcmtlck51bWJlcl1cblxuICAgIGlmICghd29ya2VySGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB3b3JrZXJIYW5kbGVyIGJ5IHRoYXQgbnVtYmVyOiAke3JhbmRvbVdvcmtlck51bWJlcn1gKVxuICAgIH1cblxuICAgIHJldHVybiB3b3JrZXJIYW5kbGVyXG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBkZXZlbG9wbWVudCB3b3JrZXIgaG90IHJlbG9hZCBzaG91bGQgcnVuLiAqL1xuICBzaG91bGRVc2VEZXZlbG9wbWVudEhvdFJlbG9hZCgpIHtcbiAgICByZXR1cm4gIXRoaXMuaW5Qcm9jZXNzICYmIHRoaXMuY29uZmlndXJhdGlvbi5nZXRFbnZpcm9ubWVudCgpID09PSBcImRldmVsb3BtZW50XCJcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHdhdGNoZXIgc2V0dXAgZmluaXNoZXMuICovXG4gIGFzeW5jIF9zdGFydERldmVsb3BtZW50UmVsb2FkZXIoKSB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFVzZURldmVsb3BtZW50SG90UmVsb2FkKCkpIHJldHVyblxuICAgIGlmICh0aGlzLmRldmVsb3BtZW50UmVsb2FkZXIpIHJldHVyblxuXG4gICAgY29uc3QgY3JlYXRlRGV2ZWxvcG1lbnRSZWxvYWRlciA9IHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlckZhY3RvcnlcbiAgICAgIHx8ICgoYXJncykgPT4gbmV3IERldmVsb3BtZW50UmVsb2FkZXIoYXJncykpXG5cbiAgICB0aGlzLmRldmVsb3BtZW50UmVsb2FkZXIgPSBjcmVhdGVEZXZlbG9wbWVudFJlbG9hZGVyKHtcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgIG9uUmVsb2FkOiBhc3luYyAoe2NoYW5nZWRQYXRofSkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmxvZ2dlci5pbmZvKGBEZXZlbG9wbWVudCBob3QgcmVsb2FkIGRldGVjdGVkIGNoYW5nZSBpbiAke2NoYW5nZWRQYXRofWApXG4gICAgICAgIGF3YWl0IHRoaXMucmVsb2FkV29ya2Vyc0ZvckRldmVsb3BtZW50KClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgYXdhaXQgdGhpcy5kZXZlbG9wbWVudFJlbG9hZGVyLnN0YXJ0KClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHdvcmtlcnMgaGF2ZSBiZWVuIHJlZnJlc2hlZC4gKi9cbiAgYXN5bmMgcmVsb2FkV29ya2Vyc0ZvckRldmVsb3BtZW50KCkge1xuICAgIGlmICh0aGlzLl9zdG9wcGluZykgcmV0dXJuXG5cbiAgICBpZiAodGhpcy5fcmVsb2FkaW5nV29ya2Vyc0ZvckRldmVsb3BtZW50KSB7XG4gICAgICB0aGlzLl9yZWxvYWRXb3JrZXJzRm9yRGV2ZWxvcG1lbnRRdWV1ZWQgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9yZWxvYWRpbmdXb3JrZXJzRm9yRGV2ZWxvcG1lbnQgPSB0cnVlXG5cbiAgICB0cnkge1xuICAgICAgZG8ge1xuICAgICAgICB0aGlzLl9yZWxvYWRXb3JrZXJzRm9yRGV2ZWxvcG1lbnRRdWV1ZWQgPSBmYWxzZVxuXG4gICAgICAgIGNvbnN0IG9sZFdvcmtlckhhbmRsZXJzID0gWy4uLnRoaXMud29ya2VySGFuZGxlcnNdXG4gICAgICAgIGNvbnN0IG5ld1dvcmtlckhhbmRsZXIgPSBhd2FpdCB0aGlzLl9idWlsZFdvcmtlckhhbmRsZXIoKVxuXG4gICAgICAgIHRoaXMud29ya2VySGFuZGxlcnMgPSBbbmV3V29ya2VySGFuZGxlcl1cblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChvbGRXb3JrZXJIYW5kbGVycy5tYXAoKHdvcmtlckhhbmRsZXIpID0+IHdvcmtlckhhbmRsZXIuc3RvcCgpKSlcbiAgICAgIH0gd2hpbGUgKHRoaXMuX3JlbG9hZFdvcmtlcnNGb3JEZXZlbG9wbWVudFF1ZXVlZCAmJiAhdGhpcy5fc3RvcHBpbmcpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3JlbG9hZGluZ1dvcmtlcnNGb3JEZXZlbG9wbWVudCA9IGZhbHNlXG4gICAgfVxuICB9XG59XG4iXX0=
|
|
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==
|