velocious 1.0.683 → 1.0.684
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/http-server/client/index.js +15 -0
- package/build/http-server/client/request.js +44 -0
- package/build/http-server/client/websocket-request.js +45 -0
- package/build/http-server/worker-handler/in-process.js +7 -1
- package/build/http-server/worker-handler/worker-thread.js +5 -0
- package/build/src/http-server/client/index.d.ts +9 -0
- package/build/src/http-server/client/index.d.ts.map +1 -1
- package/build/src/http-server/client/index.js +16 -1
- package/build/src/http-server/client/request.d.ts +27 -0
- package/build/src/http-server/client/request.d.ts.map +1 -1
- package/build/src/http-server/client/request.js +42 -1
- package/build/src/http-server/client/websocket-request.d.ts +28 -0
- package/build/src/http-server/client/websocket-request.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-request.js +43 -1
- package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/in-process.js +8 -2
- package/build/src/http-server/worker-handler/worker-thread.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/worker-thread.js +6 -1
- package/package.json +1 -1
- package/src/http-server/client/index.js +15 -0
- package/src/http-server/client/request.js +44 -0
- package/src/http-server/client/websocket-request.js +45 -0
- package/src/http-server/worker-handler/in-process.js +7 -1
- package/src/http-server/worker-handler/worker-thread.js +5 -0
package/README.md
CHANGED
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
* Rails-style application process initializer teardown with immutable process identity, reverse idempotent shutdown, and explicit HTTP/background-job ownership (see [docs/application-process-lifecycle.md](docs/application-process-lifecycle.md))
|
|
37
37
|
* Configurable HTTP server worker handlers plus backpressured, descriptor-only file responses with completion callbacks (see [docs/http-server.md](docs/http-server.md))
|
|
38
38
|
* Explicit database-free in-process HTTP applications with optional request and buffered-response byte limits (see [docs/http-server.md](docs/http-server.md#database-free-applications))
|
|
39
|
+
* Client-disconnect hooks for buffered (`request.onClientDisconnect` / `request.clientDisconnected`) alongside the streaming `response.onStreamClose` so long-running handlers can settle in-flight work when the socket goes away (see [docs/http-server.md](docs/http-server.md#client-disconnect-for-buffered-requests))
|
|
39
40
|
* Default-on buffered HTTP response compression with Brotli/gzip content negotiation, global and per-response opt-outs, and HEAD-correct representation headers (see [docs/http-server.md](docs/http-server.md#response-compression))
|
|
40
41
|
* Background jobs with Node SQL/TCP workers plus a Browser/Expo local SQLite store and in-process dispatcher, including failure events, authorized database-scoped dashboard counts, and an opt-in release-scoped main/worker generation protocol with acknowledged activation, asynchronous retirement, and retired-main recovery. Production compliance additionally requires downstream supervisor retention/activation ordering and release pins (see [docs/background-jobs.md](docs/background-jobs.md), [docs/local-background-jobs.md](docs/local-background-jobs.md), and [docs/background-jobs-dashboard.md](docs/background-jobs-dashboard.md))
|
|
41
42
|
* Durable one-off background-job scheduling with exact epoch timestamps plus stable replacement, cancellation, normalized readback, and duplicate-free wake across Node SQL/TCP and Browser/Expo local SQLite adapters (see [docs/scheduled-background-job-enqueue.md](docs/scheduled-background-job-enqueue.md))
|
|
@@ -803,6 +803,21 @@ export default class VeoliciousHttpServerClient {
|
|
|
803
803
|
}
|
|
804
804
|
}
|
|
805
805
|
|
|
806
|
+
/**
|
|
807
|
+
* Marks every in-flight request as client-disconnected and runs its
|
|
808
|
+
* disconnect callbacks. The worker handler calls this when the underlying
|
|
809
|
+
* socket tears down, so a handler whose response is still buffered (e.g.
|
|
810
|
+
* waiting in an admission queue) can observe the client leaving without
|
|
811
|
+
* waiting for the response to be sent.
|
|
812
|
+
* @returns {void}
|
|
813
|
+
*/
|
|
814
|
+
notifyClientDisconnect() {
|
|
815
|
+
for (const requestRunner of this.requestRunners) {
|
|
816
|
+
if (requestRunner.getState() !== "running") continue
|
|
817
|
+
requestRunner.getRequest().markClientDisconnected()
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
|
|
806
821
|
/**
|
|
807
822
|
* Runs the close callbacks of a finished or aborted stream exactly once.
|
|
808
823
|
* @param {import("./response.js").default} response - Finished stream.
|
|
@@ -19,6 +19,17 @@ export default class VelociousHttpServerClientRequest {
|
|
|
19
19
|
this.client = client
|
|
20
20
|
this.configuration = configuration
|
|
21
21
|
this.requestParser = new RequestParser({configuration})
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Whether the owning client connection was torn down while this request
|
|
25
|
+
* was still running. Set once by the client on socket teardown and read
|
|
26
|
+
* by handlers that need to settle in-flight work (e.g. admission queue
|
|
27
|
+
* positions) without waiting for the response to be sent.
|
|
28
|
+
* @type {boolean} */
|
|
29
|
+
this.clientDisconnected = false
|
|
30
|
+
|
|
31
|
+
/** @type {Set<() => void>} */
|
|
32
|
+
this.clientDisconnectCallbacks = new Set()
|
|
22
33
|
}
|
|
23
34
|
|
|
24
35
|
baseURL() { return `${this.protocol()}://${this.hostWithPort()}` }
|
|
@@ -114,6 +125,39 @@ export default class VelociousHttpServerClientRequest {
|
|
|
114
125
|
rawBody() { return this.getRequestBuffer().getRawBody() }
|
|
115
126
|
socketRemoteAddress() { return this.client?.remoteAddress }
|
|
116
127
|
|
|
128
|
+
/**
|
|
129
|
+
* Marks this request as client-disconnected and runs every registered
|
|
130
|
+
* disconnect callback exactly once. The owning client invokes it when the
|
|
131
|
+
* socket tears down; handlers that register afterwards learn of the
|
|
132
|
+
* disconnect through the `clientDisconnected` field instead.
|
|
133
|
+
* @returns {void}
|
|
134
|
+
*/
|
|
135
|
+
markClientDisconnected() {
|
|
136
|
+
if (this.clientDisconnected) return
|
|
137
|
+
this.clientDisconnected = true
|
|
138
|
+
for (const callback of this.clientDisconnectCallbacks) {
|
|
139
|
+
callback()
|
|
140
|
+
}
|
|
141
|
+
this.clientDisconnectCallbacks.clear()
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Registers a callback that fires once when the client connection tears
|
|
146
|
+
* down while this request is still running. Buffered requests cannot rely
|
|
147
|
+
* on the streaming response's `onStreamClose` for that: no stream has
|
|
148
|
+
* been opened yet, so a queued request's queue position is otherwise
|
|
149
|
+
* stranded until its admission deadline.
|
|
150
|
+
* @param {() => void} callback - Disconnect callback.
|
|
151
|
+
* @returns {void}
|
|
152
|
+
*/
|
|
153
|
+
onClientDisconnect(callback) {
|
|
154
|
+
if (this.clientDisconnected) {
|
|
155
|
+
callback()
|
|
156
|
+
return
|
|
157
|
+
}
|
|
158
|
+
this.clientDisconnectCallbacks.add(callback)
|
|
159
|
+
}
|
|
160
|
+
|
|
117
161
|
getRequestBuffer() { return this.getRequestParser().getRequestBuffer() }
|
|
118
162
|
getRequestParser() { return this.requestParser }
|
|
119
163
|
}
|
|
@@ -50,6 +50,51 @@ export default class VelociousHttpServerClientWebsocketRequest {
|
|
|
50
50
|
const queryParams = this._parseQueryParams()
|
|
51
51
|
|
|
52
52
|
this.paramsObject = {...queryParams, ...this.paramsObject}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Whether the owning client connection was torn down while this request
|
|
56
|
+
* was still running. Websocket requests are session-owned and never
|
|
57
|
+
* enter the client's in-flight request list, so this stays false for
|
|
58
|
+
* them; the field exists so the request union shares one surface.
|
|
59
|
+
* @type {boolean} */
|
|
60
|
+
this.clientDisconnected = false
|
|
61
|
+
|
|
62
|
+
/** @type {Set<() => void>} */
|
|
63
|
+
this.clientDisconnectCallbacks = new Set()
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Marks this request as client-disconnected and runs every registered
|
|
68
|
+
* disconnect callback exactly once. The owning client invokes it when the
|
|
69
|
+
* socket tears down; handlers that register afterwards learn of the
|
|
70
|
+
* disconnect through the `clientDisconnected` field instead. Websocket
|
|
71
|
+
* requests are session-owned and never enter the client's in-flight
|
|
72
|
+
* request list, so this is inert for them; the shared surface keeps the
|
|
73
|
+
* request union uniform.
|
|
74
|
+
* @returns {void}
|
|
75
|
+
*/
|
|
76
|
+
markClientDisconnected() {
|
|
77
|
+
if (this.clientDisconnected) return
|
|
78
|
+
this.clientDisconnected = true
|
|
79
|
+
for (const callback of this.clientDisconnectCallbacks) {
|
|
80
|
+
callback()
|
|
81
|
+
}
|
|
82
|
+
this.clientDisconnectCallbacks.clear()
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Registers a callback that fires once when the client connection tears
|
|
87
|
+
* down while this request is still running. See the HTTP request's
|
|
88
|
+
* {@linkcode markClientDisconnected} for the shared-surface note.
|
|
89
|
+
* @param {() => void} callback - Disconnect callback.
|
|
90
|
+
* @returns {void}
|
|
91
|
+
*/
|
|
92
|
+
onClientDisconnect(callback) {
|
|
93
|
+
if (this.clientDisconnected) {
|
|
94
|
+
callback()
|
|
95
|
+
return
|
|
96
|
+
}
|
|
97
|
+
this.clientDisconnectCallbacks.add(callback)
|
|
53
98
|
}
|
|
54
99
|
|
|
55
100
|
baseURL() {
|
|
@@ -116,7 +116,13 @@ export default class VelociousHttpServerInProcessHandler {
|
|
|
116
116
|
httpClient.abortPendingFileResponses(),
|
|
117
117
|
httpClient.abortStreamResponses()
|
|
118
118
|
])
|
|
119
|
-
.then(() => {
|
|
119
|
+
.then(() => {
|
|
120
|
+
// Buffered responses have no stream to abort, so their in-flight
|
|
121
|
+
// handlers never hear about the socket teardown through the
|
|
122
|
+
// streaming path: notify the running requests directly so they can
|
|
123
|
+
// settle resources (e.g. admission queue positions) in-process.
|
|
124
|
+
httpClient.notifyClientDisconnect()
|
|
125
|
+
})
|
|
120
126
|
.catch((error) => {
|
|
121
127
|
this.logger.warn("Failed to abort responses after client close", error)
|
|
122
128
|
})
|
|
@@ -220,6 +220,11 @@ export default class VelociousHttpServerWorkerHandlerWorkerThread {
|
|
|
220
220
|
if (client) {
|
|
221
221
|
settlements.push(client.abortPendingFileResponses())
|
|
222
222
|
settlements.push(client.abortStreamResponses())
|
|
223
|
+
// Buffered responses have no stream to abort, so their in-flight
|
|
224
|
+
// handlers never hear about the socket teardown through the streaming
|
|
225
|
+
// path: notify the running requests directly so they can settle
|
|
226
|
+
// resources (e.g. admission queue positions) in-process.
|
|
227
|
+
client.notifyClientDisconnect()
|
|
223
228
|
}
|
|
224
229
|
|
|
225
230
|
for (const [transferId, transfer] of this.fileTransfers) {
|
|
@@ -191,6 +191,15 @@ export default class VeoliciousHttpServerClient {
|
|
|
191
191
|
* @returns {Promise<void>} - Resolves after every stream settled.
|
|
192
192
|
*/
|
|
193
193
|
abortStreamResponses(): Promise<void>;
|
|
194
|
+
/**
|
|
195
|
+
* Marks every in-flight request as client-disconnected and runs its
|
|
196
|
+
* disconnect callbacks. The worker handler calls this when the underlying
|
|
197
|
+
* socket tears down, so a handler whose response is still buffered (e.g.
|
|
198
|
+
* waiting in an admission queue) can observe the client leaving without
|
|
199
|
+
* waiting for the response to be sent.
|
|
200
|
+
* @returns {void}
|
|
201
|
+
*/
|
|
202
|
+
notifyClientDisconnect(): void;
|
|
194
203
|
/**
|
|
195
204
|
* Runs the close callbacks of a finished or aborted stream exactly once.
|
|
196
205
|
* @param {import("./response.js").default} response - Finished stream.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/index.js"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/index.js"],"names":[],"mappings":"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"}
|
|
@@ -719,6 +719,21 @@ export default class VeoliciousHttpServerClient {
|
|
|
719
719
|
await this._runStreamCloseCallbacks(response);
|
|
720
720
|
}
|
|
721
721
|
}
|
|
722
|
+
/**
|
|
723
|
+
* Marks every in-flight request as client-disconnected and runs its
|
|
724
|
+
* disconnect callbacks. The worker handler calls this when the underlying
|
|
725
|
+
* socket tears down, so a handler whose response is still buffered (e.g.
|
|
726
|
+
* waiting in an admission queue) can observe the client leaving without
|
|
727
|
+
* waiting for the response to be sent.
|
|
728
|
+
* @returns {void}
|
|
729
|
+
*/
|
|
730
|
+
notifyClientDisconnect() {
|
|
731
|
+
for (const requestRunner of this.requestRunners) {
|
|
732
|
+
if (requestRunner.getState() !== "running")
|
|
733
|
+
continue;
|
|
734
|
+
requestRunner.getRequest().markClientDisconnected();
|
|
735
|
+
}
|
|
736
|
+
}
|
|
722
737
|
/**
|
|
723
738
|
* Runs the close callbacks of a finished or aborted stream exactly once.
|
|
724
739
|
* @param {import("./response.js").default} response - Finished stream.
|
|
@@ -772,4 +787,4 @@ export default class VeoliciousHttpServerClient {
|
|
|
772
787
|
function isNoBodyStatusCode(statusCode) {
|
|
773
788
|
return (statusCode >= 100 && statusCode < 200) || statusCode === 204 || statusCode === 304;
|
|
774
789
|
}
|
|
775
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUE7QUFDM0IsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDakMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUM5QixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sU0FBUyxDQUFBO0FBQ25DLE9BQU8sWUFBWSxNQUFNLDhCQUE4QixDQUFBO0FBQ3ZELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUN4RCxPQUFPLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQTtBQUNwQyxPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUE7QUFDbEMsT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxFQUFDLHVCQUF1QixFQUFFLHdCQUF3QixFQUFFLHdCQUF3QixFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFDckgsT0FBTyxnQkFBZ0IsTUFBTSx3QkFBd0IsQ0FBQTtBQUVyRDs7OztHQUlHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxLQUFLO0lBQzlCLE9BQU87UUFDTCxVQUFVLEVBQUUsS0FBSyxDQUFDLElBQUk7UUFDdEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1FBQ3RCLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7S0FDekMsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3QyxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtJQUMzQixLQUFLLEdBQUcsU0FBUyxDQUFBO0lBRWpCOzt5QkFFcUI7SUFDckIsd0JBQXdCLEdBQUcsS0FBSyxDQUFBO0lBRWhDOzt5QkFFcUI7SUFDckIseUJBQXlCLEdBQUcsS0FB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Q3ZDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gscUJBQXFCLENBQUMsT0FBTztRQUMzQixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUE7UUFDekMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFBO1FBQzVFLE1BQU0sZ0JBQWdCLEdBQUcsZ0JBQWdCO1lBQ3ZDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQzFFLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFFTixJQUFJLFdBQVcsSUFBSSxXQUFXO1lBQUUsT0FBTyxLQUFLLENBQUE7UUFDNUMsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFbkQsSUFBSSxXQUFXLElBQUksS0FBSyxJQUFJLGdCQUFnQixJQUFJLFlBQVk7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUV6RSxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7Q0FDRjtBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsa0JBQWtCLENBQUMsVUFBVTtJQUNwQyxPQUFPLENBQUMsVUFBVSxJQUFJLEdBQUcsSUFBSSxVQUFVLEdBQUcsR0FBRyxDQUFDLElBQUksVUFBVSxLQUFLLEdBQUcsSUFBSSxVQUFVLEtBQUssR0FBRyxDQUFBO0FBQzVGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGNyeXB0byBmcm9tIFwiY3J5cHRvXCJcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0IHtlbnN1cmVFcnJvcn0gZnJvbSBcInR5cGFuaWNcIlxuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tIFwiLi4vLi4vdXRpbHMvZXZlbnQtZW1pdHRlci5qc1wiXG5pbXBvcnQge0h0dHBSZXF1ZXN0Qm9keVRvb0xhcmdlRXJyb3J9IGZyb20gXCIuL2Vycm9ycy5qc1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi9sb2dnZXIuanNcIlxuaW1wb3J0IFJlcXVlc3QgZnJvbSBcIi4vcmVxdWVzdC5qc1wiXG5pbXBvcnQgUmVxdWVzdFJ1bm5lciBmcm9tIFwiLi9yZXF1ZXN0LXJ1bm5lci5qc1wiXG5pbXBvcnQge2FkZEFjY2VwdEVuY29kaW5nVG9WYXJ5LCBhcHBseVJlc3BvbnNlQ29tcHJlc3Npb24sIG5lZ290aWF0ZUNvbnRlbnRFbmNvZGluZ30gZnJvbSBcIi4vcmVzcG9uc2UtY29tcHJlc3Npb24uanNcIlxuaW1wb3J0IFdlYnNvY2tldFNlc3Npb24gZnJvbSBcIi4vd2Vic29ja2V0LXNlc3Npb24uanNcIlxuXG4vKipcbiAqIFJ1bnMgYmFkIHJlcXVlc3QgZGV0YWlscy5cbiAqIEBwYXJhbSB7RXJyb3IgJiB7dmVsb2Npb3VzQ29udGV4dD86IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn19IGVycm9yIC0gRXJyb3IgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIFNhZmUgYmFkLXJlcXVlc3QgZGV0YWlscyBmb3IgbG9ncy5cbiAqL1xuZnVuY3Rpb24gYmFkUmVxdWVzdERldGFpbHMoZXJyb3IpIHtcbiAgcmV0dXJuIHtcbiAgICBlcnJvckNsYXNzOiBlcnJvci5uYW1lLFxuICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgdmVsb2Npb3VzQ29udGV4dDogZXJyb3IudmVsb2Npb3VzQ29udGV4dFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlb2xpY2lvdXNIdHRwU2VydmVyQ2xpZW50IHtcbiAgZXZlbnRzID0gbmV3IEV2ZW50RW1pdHRlcigpXG4gIHN0YXRlID0gXCJpbml0aWFsXCJcblxuICAvKipcbiAgICogV2hldGhlciBhIGRvbmUtcmVxdWVzdHMgZHJhaW4gaXMgY3VycmVudGx5IHNlbmRpbmcgcmVzcG9uc2VzIGZvciB0aGlzIGNsaWVudC5cbiAgICogQHR5cGUge2Jvb2xlYW59ICovXG4gIF9kb25lUmVxdWVzdHNEcmFpbkFjdGl2ZSA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYW5vdGhlciBkcmFpbiB3YXMgcmVxdWVzdGVkIHdoaWxlIG9uZSB3YXMgYWxyZWFkeSBhY3RpdmUuXG4gICAqIEB0eXBlIHtib29sZWFufSAqL1xuICBfZG9uZVJlcXVlc3RzRHJhaW5QZW5kaW5nID0gZmFsc2VcblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuY2xpZW50Q291bnQgLSBDbGllbnQgY291bnQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucmVtb3RlQWRkcmVzc10gLSBSZW1vdGUgYWRkcmVzcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjbGllbnRDb3VudCwgY29uZmlndXJhdGlvbiwgcmVtb3RlQWRkcmVzc30pIHtcbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24pIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbmZpZ3VyYXRpb24gZ2l2ZW5cIilcblxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKVxuICAgIHRoaXMuY2xpZW50Q291bnQgPSBjbGllbnRDb3VudFxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLnJlbW90ZUFkZHJlc3MgPSByZW1vdGVBZGRyZXNzXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge1JlcXVlc3RSdW5uZXJbXX0gKi9cbiAgICB0aGlzLnJlcXVlc3RSdW5uZXJzID0gW11cblxuICAgIC8qKiBAdHlwZSB7U2V0PChyZXN1bHQ6IFwiY29tcGxldGVkXCIgfCBcImFib3J0ZWRcIikgPT4gUHJvbWlzZTx2b2lkPj59ICovXG4gICAgdGhpcy5wZW5kaW5nRmlsZVJlc3BvbnNlcyA9IG5ldyBTZXQoKVxuXG4gICAgLyoqXG4gICAgICogU3RyZWFtcyB0aGF0IGhhdmUgc3RhcnRlZCBidXQgaGF2ZSBub3QgZmluaXNoZWQgb3IgYmVlbiBhYm9ydGVkIHlldC5cbiAgICAgKiBAdHlwZSB7TWFwPGltcG9ydChcIi4vcmVzcG9uc2UuanNcIikuZGVmYXVsdCwge2NsaWVudENvdW50OiBudW1iZXIsIHJlcXVlc3Q6IGltcG9ydChcIi4vcmVxdWVzdC5qc1wiKS5kZWZhdWx0fT59ICovXG4gICAgdGhpcy5fYWN0aXZlU3RyZWFtUmVzcG9uc2VzID0gbmV3IE1hcCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZW5kIGJhZCB1cGdyYWRlIHJlc3BvbnNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIE1lc3NhZ2UgdGV4dC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3NlbmRCYWRVcGdyYWRlUmVzcG9uc2UobWVzc2FnZSkge1xuICAgIGNvbnN0IGh0dHBWZXJzaW9uID0gdGhpcy5jdXJyZW50UmVxdWVzdD8uaHR0cFZlcnNpb24oKSB8fCBcIjEuMVwiXG4gICAgY29uc3QgYm9keSA9IGAke21lc3NhZ2V9XFxuYFxuICAgIGNvbnN0IGhlYWRlcnMgPSBbXG4gICAgICBgSFRUUC8ke2h0dHBWZXJzaW9ufSA0MDAgQmFkIFJlcXVlc3RgLFxuICAgICAgXCJDb25uZWN0aW9uOiBDbG9zZVwiLFxuICAgICAgXCJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcIixcbiAgICAgIGBDb250ZW50LUxlbmd0aDogJHtCdWZmZXIuYnl0ZUxlbmd0aChib2R5LCBcInV0ZjhcIil9YCxcbiAgICAgIFwiXCIsXG4gICAgICBib2R5XG4gICAgXS5qb2luKFwiXFxyXFxuXCIpXG5cbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwib3V0cHV0XCIsIGhlYWRlcnMpXG4gICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZW5kIGJhZCByZXF1ZXN0IHJlc3BvbnNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFJlc3BvbnNlIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9zZW5kQmFkUmVxdWVzdFJlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBodHRwVmVyc2lvbiA9IHRoaXMuY3VycmVudFJlcXVlc3Q/Lmh0dHBWZXJzaW9uKCkgfHwgXCIxLjFcIlxuICAgIGNvbnN0IGJvZHkgPSBgJHttZXNzYWdlfVxcbmBcbiAgICBjb25zdCBoZWFkZXJzID0gW1xuICAgICAgYEhUVFAvJHtodHRwVmVyc2lvbn0gNDAwIEJhZCBSZXF1ZXN0YCxcbiAgICAgIFwiQ29ubmVjdGlvbjogQ2xvc2VcIixcbiAgICAgIFwiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XCIsXG4gICAgICBgQ29udGVudC1MZW5ndGg6ICR7QnVmZmVyLmJ5dGVMZW5ndGgoYm9keSwgXCJ1dGY4XCIpfWAsXG4gICAgICBcIlwiLFxuICAgICAgYm9keVxuICAgIF0uam9pbihcIlxcclxcblwiKVxuXG4gICAgdGhpcy5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBoZWFkZXJzKVxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJjbG9zZVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgZGV0ZXJtaW5pc3RpYyByZXF1ZXN0LWJvZHkgbGltaXQgcmVzcG9uc2UgYW5kIGNsb3NlcyB0aGUgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3NlbmRQYXlsb2FkVG9vTGFyZ2VSZXNwb25zZSgpIHtcbiAgICBjb25zdCBodHRwVmVyc2lvbiA9IHRoaXMuY3VycmVudFJlcXVlc3Q/Lmh0dHBWZXJzaW9uKCkgfHwgXCIxLjFcIlxuICAgIGNvbnN0IGJvZHkgPSBcIlBheWxvYWQgVG9vIExhcmdlXFxuXCJcbiAgICBjb25zdCBoZWFkZXJzID0gW1xuICAgICAgYEhUVFAvJHtodHRwVmVyc2lvbn0gNDEzIFBheWxvYWQgVG9vIExhcmdlYCxcbiAgICAgIFwiQ29ubmVjdGlvbjogQ2xvc2VcIixcbiAgICAgIFwiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XCIsXG4gICAgICBgQ29udGVudC1MZW5ndGg6ICR7QnVmZmVyLmJ5dGVMZW5ndGgoYm9keSwgXCJ1dGY4XCIpfWAsXG4gICAgICBcIlwiLFxuICAgICAgYm9keVxuICAgIF0uam9pbihcIlxcclxcblwiKVxuXG4gICAgdGhpcy5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBoZWFkZXJzKVxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJjbG9zZVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGFuZGxlIGJhZCByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEVycm9yIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBoYW5kbGVCYWRSZXF1ZXN0KGVycm9yKSB7XG4gICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbXCJGYWlsZWQgdG8gcGFyc2UgSFRUUCByZXF1ZXN0XCIsIGJhZFJlcXVlc3REZXRhaWxzKC8qKiBAdHlwZSB7RXJyb3IgJiB7dmVsb2Npb3VzQ29udGV4dD86IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn19ICovIChlcnJvcikpXSlcblxuICAgIGlmICh0aGlzLmN1cnJlbnRSZXF1ZXN0ICYmIFwiZ2V0UmVxdWVzdFBhcnNlclwiIGluIHRoaXMuY3VycmVudFJlcXVlc3QpIHtcbiAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3JlcXVlc3QuanNcIikuZGVmYXVsdH0gKi8gKHRoaXMuY3VycmVudFJlcXVlc3QpXG5cbiAgICAgIGh0dHBSZXF1ZXN0LmdldFJlcXVlc3RQYXJzZXIoKS5kZXN0cm95KClcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0ID0gdW5kZWZpbmVkXG4gICAgdGhpcy5zdGF0ZSA9IFwiaW5pdGlhbFwiXG5cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwUmVxdWVzdEJvZHlUb29MYXJnZUVycm9yKSB7XG4gICAgICB0aGlzLl9zZW5kUGF5bG9hZFRvb0xhcmdlUmVzcG9uc2UoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZW5kQmFkUmVxdWVzdFJlc3BvbnNlKFwiQmFkIFJlcXVlc3RcIilcbiAgICB9XG4gIH1cblxuICBleGVjdXRlQ3VycmVudFJlcXVlc3QgPSAoKSA9PiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXCJleGVjdXRlQ3VycmVudFJlcXVlc3RcIilcblxuICAgIGNvbnN0IGN1cnJlbnRSZXF1ZXN0ID0gdGhpcy5jdXJyZW50UmVxdWVzdFxuXG4gICAgaWYgKCFjdXJyZW50UmVxdWVzdCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gY3VycmVudCByZXF1ZXN0XCIpXG4gICAgY29uc3QgcmVkYWN0b3IgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0TG9nUmVkYWN0b3IoKVxuICAgIGNvbnN0IHNlbnNpdGl2ZVZhbHVlcyA9IHJlZGFjdG9yLnJlcXVlc3RTZW5zaXRpdmVWYWx1ZXMoY3VycmVudFJlcXVlc3QpXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJleGVjdXRlQ3VycmVudFJlcXVlc3QgcmVxdWVzdFwiLCB7XG4gICAgICBjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCxcbiAgICAgIGh0dHBNZXRob2Q6IGN1cnJlbnRSZXF1ZXN0Lmh0dHBNZXRob2QoKSxcbiAgICAgIGh0dHBWZXJzaW9uOiBjdXJyZW50UmVxdWVzdC5odHRwVmVyc2lvbigpLFxuICAgICAgcGF0aDogcmVkYWN0b3IucmVkYWN0UGF0aChjdXJyZW50UmVxdWVzdC5wYXRoKCksIHNlbnNpdGl2ZVZhbHVlcyksXG4gICAgICBxdWV1ZUxlbmd0aDogdGhpcy5yZXF1ZXN0UnVubmVycy5sZW5ndGhcbiAgICB9XSlcblxuICAgIGlmICh0aGlzLl9pc1dlYnNvY2tldFVwZ3JhZGUoY3VycmVudFJlcXVlc3QpKSB7XG4gICAgICB0aGlzLl91cGdyYWRlVG9XZWJzb2NrZXQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gV2UgYXJlIGRvbmUgcGFyc2luZyB0aGUgZ2l2ZW4gcmVxdWVzdCBhbmQgY2FuIHRoZW9yZXRpY2FsbHkgc3RhcnQgcGFyc2luZyBhIG5ldyBvbmUsIGJlZm9yZSB0aGUgY3VycmVudCByZXF1ZXN0IGlzIGRvbmUgLSBzbyByZXNldCB0aGUgc3RhdGUuXG4gICAgdGhpcy5zdGF0ZSA9IFwiaW5pdGlhbFwiXG5cbiAgICBjb25zdCByZXF1ZXN0UnVubmVyID0gbmV3IFJlcXVlc3RSdW5uZXIoe1xuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgcmVxdWVzdDogY3VycmVudFJlcXVlc3RcbiAgICB9KVxuXG4gICAgdGhpcy5yZXF1ZXN0UnVubmVycy5wdXNoKHJlcXVlc3RSdW5uZXIpXG5cbiAgICAvLyBBIHN0cmVhbWluZyByZXNwb25zZSBlbWl0cyBpdHMgaGVhZGVycyBhbmQgY2h1bmtzIHRvIHRoZSBjbGllbnQgd2hpbGVcbiAgICAvLyB0aGUgcmVxdWVzdCBpcyBzdGlsbCBydW5uaW5nLCBzbyB0aGUgcmVzcG9uc2UgbmVlZHMgdGhlIG93bmluZyBjbGllbnRcbiAgICAvLyBhcyBpdHMgdHJhbnNwb3J0IHNpbmsgYmVmb3JlIHRoZSBoYW5kbGVyIHJ1bnMuIFN1Yi1yZXF1ZXN0cyAoZS5nLlxuICAgIC8vIHdlYnNvY2tldCByZXF1ZXN0IHBheWxvYWRzKSBoYXZlIG5vIHNvY2tldCBhbmQga2VlcCB0cmFuc3BvcnQgbnVsbDtcbiAgICAvLyB0aGVpciByZXNwb25zZXMgZmFpbCBsb3VkbHkgaWYgdGhleSBhdHRlbXB0IHRvIHN0cmVhbS5cbiAgICBjb25zdCBzb2NrZXRSZXF1ZXN0ID0gY3VycmVudFJlcXVlc3RcbiAgICByZXF1ZXN0UnVubmVyLnJlc3BvbnNlLnRyYW5zcG9ydCA9IHRoaXNcbiAgICByZXF1ZXN0UnVubmVyLnJlc3BvbnNlLnRyYW5zcG9ydFJlcXVlc3QgPSBzb2NrZXRSZXF1ZXN0XG5cbiAgICByZXF1ZXN0UnVubmVyLmV2ZW50cy5vbihcImRvbmVcIiwgdGhpcy5yZXF1ZXN0RG9uZSlcbiAgICByZXF1ZXN0UnVubmVyLnJ1bigpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBvbiB3cml0ZS5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG9uV3JpdGUoZGF0YSkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIm9uV3JpdGUgc3RhcnRcIiwge1xuICAgICAgY2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnQsXG4gICAgICBsZW5ndGg6IGRhdGEubGVuZ3RoLFxuICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgfV0pXG5cbiAgICBpZiAodGhpcy53ZWJzb2NrZXRTZXNzaW9uKSB7XG4gICAgICB0aGlzLndlYnNvY2tldFNlc3Npb24ub25EYXRhKGRhdGEpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLyoqXG4gICAgICAgKiBSZW1haW5pbmcuXG4gICAgICAgKiBAdHlwZSB7QnVmZmVyIHwgdW5kZWZpbmVkfSAqL1xuICAgICAgbGV0IHJlbWFpbmluZyA9IGRhdGFcblxuICAgICAgd2hpbGUgKHJlbWFpbmluZykge1xuICAgICAgICBpZiAocmVtYWluaW5nLmxlbmd0aCA8PSAwKSBicmVha1xuXG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09IFwiaW5pdGlhbFwiKSB7XG4gICAgICAgICAgY29uc3QgcmVtYWluaW5nTGVuZ3RoID0gcmVtYWluaW5nLmxlbmd0aFxuXG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW1wib25Xcml0ZSBjcmVhdGluZyByZXF1ZXN0IHBhcnNlclwiLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnQsIHJlbWFpbmluZ0xlbmd0aH1dKVxuICAgICAgICAgIHRoaXMuY3VycmVudFJlcXVlc3QgPSBuZXcgUmVxdWVzdCh7Y2xpZW50OiB0aGlzLCBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb259KVxuICAgICAgICAgIHRoaXMuY3VycmVudFJlcXVlc3QucmVxdWVzdFBhcnNlci5ldmVudHMub24oXCJkb25lXCIsIHRoaXMuZXhlY3V0ZUN1cnJlbnRSZXF1ZXN0KVxuICAgICAgICAgIHRoaXMuc3RhdGUgPSBcInJlcXVlc3RTdGFydGVkXCJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlICE9IFwicmVxdWVzdFN0YXJ0ZWRcIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGF0ZSBmb3IgY2xpZW50OiAke3RoaXMuc3RhdGV9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50UmVxdWVzdCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gY3VycmVudCByZXF1ZXN0XCIpXG5cbiAgICAgICAgcmVtYWluaW5nID0gdGhpcy5jdXJyZW50UmVxdWVzdC5mZWVkKHJlbWFpbmluZylcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW1wib25Xcml0ZSBmZWQgcGFyc2VyXCIsIHtcbiAgICAgICAgICBjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCxcbiAgICAgICAgICBoYXNSZW1haW5pbmc6IEJvb2xlYW4ocmVtYWluaW5nPy5sZW5ndGgpLFxuICAgICAgICAgIHJlbWFpbmluZ0xlbmd0aDogcmVtYWluaW5nPy5sZW5ndGggfHwgMCxcbiAgICAgICAgICBwYXJzZXJDb21wbGV0ZWQ6IHRoaXMuY3VycmVudFJlcXVlc3Q/LmdldFJlcXVlc3RQYXJzZXIoKS5oYXNDb21wbGV0ZWRcbiAgICAgICAgfV0pXG5cbiAgICAgICAgaWYgKHJlbWFpbmluZyAmJiByZW1haW5pbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3RQYXJzZXIgPSB0aGlzLmN1cnJlbnRSZXF1ZXN0LmdldFJlcXVlc3RQYXJzZXIoKVxuXG4gICAgICAgICAgaWYgKCFyZXF1ZXN0UGFyc2VyLmhhc0NvbXBsZXRlZCkge1xuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nTGVuZ3RoID0gcmVtYWluaW5nLmxlbmd0aFxuXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJvbldyaXRlIHdhaXRpbmcgZm9yIG1vcmUgZGF0YVwiLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnQsIHJlbWFpbmluZ0xlbmd0aH1dKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnN0YXRlID0gXCJpbml0aWFsXCJcbiAgICAgICAgICBjb25zdCByZW1haW5pbmdMZW5ndGggPSByZW1haW5pbmcubGVuZ3RoXG5cbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJvbldyaXRlIHBhcnNlciBjb21wbGV0ZWQgd2l0aCByZW1haW5pbmcgYnl0ZXNcIiwge2NsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50LCByZW1haW5pbmdMZW5ndGh9XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW1wib25Xcml0ZSBlbmRcIiwge2NsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50LCBzdGF0ZTogdGhpcy5zdGF0ZSwgcXVldWVMZW5ndGg6IHRoaXMucmVxdWVzdFJ1bm5lcnMubGVuZ3RofV0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuaGFuZGxlQmFkUmVxdWVzdChlbnN1cmVFcnJvcihlcnJvcikpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaXMgd2Vic29ja2V0IHVwZ3JhZGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9IHJlcXVlc3QgLSBSZXF1ZXN0IG9iamVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB3ZWJzb2NrZXQgdXBncmFkZS5cbiAgICovXG4gIF9pc1dlYnNvY2tldFVwZ3JhZGUocmVxdWVzdCkge1xuICAgIGNvbnN0IHVwZ3JhZGVIZWFkZXIgPSByZXF1ZXN0LmhlYWRlcihcInVwZ3JhZGVcIik/LnRvTG93ZXJDYXNlKClcbiAgICBjb25zdCBjb25uZWN0aW9uSGVhZGVyID0gcmVxdWVzdC5oZWFkZXIoXCJjb25uZWN0aW9uXCIpPy50b0xvd2VyQ2FzZSgpXG5cbiAgICByZXR1cm4gQm9vbGVhbih1cGdyYWRlSGVhZGVyID09IFwid2Vic29ja2V0XCIgJiYgY29ubmVjdGlvbkhlYWRlcj8uaW5jbHVkZXMoXCJ1cGdyYWRlXCIpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdXBncmFkZSB0byB3ZWJzb2NrZXQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF91cGdyYWRlVG9XZWJzb2NrZXQoKSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRSZXF1ZXN0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjdXJyZW50IHJlcXVlc3RcIilcblxuICAgIGNvbnN0IHNlY1dlYnNvY2tldEtleSA9IHRoaXMuY3VycmVudFJlcXVlc3QuaGVhZGVyKFwic2VjLXdlYnNvY2tldC1rZXlcIilcblxuICAgIGlmICghc2VjV2Vic29ja2V0S2V5KSB7XG4gICAgICB0aGlzLl9zZW5kQmFkVXBncmFkZVJlc3BvbnNlKFwiTWlzc2luZyBTZWMtV2ViU29ja2V0LUtleSBoZWFkZXJcIilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHdlYnNvY2tldEFjY2VwdEtleSA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMVwiKVxuICAgICAgLnVwZGF0ZShgJHtzZWNXZWJzb2NrZXRLZXl9MjU4RUFGQTUtRTkxNC00N0RBLTk1Q0EtQzVBQjBEQzg1QjExYCwgXCJiaW5hcnlcIilcbiAgICAgIC5kaWdlc3QoXCJiYXNlNjRcIilcbiAgICBjb25zdCBodHRwVmVyc2lvbiA9IHRoaXMuY3VycmVudFJlcXVlc3QuaHR0cFZlcnNpb24oKSB8fCBcIjEuMVwiXG4gICAgY29uc3QgcmVzcG9uc2VMaW5lcyA9IFtcbiAgICAgIGBIVFRQLyR7aHR0cFZlcnNpb259IDEwMSBTd2l0Y2hpbmcgUHJvdG9jb2xzYCxcbiAgICAgIFwiVXBncmFkZTogd2Vic29ja2V0XCIsXG4gICAgICBcIkNvbm5lY3Rpb246IFVwZ3JhZGVcIixcbiAgICAgIGBTZWMtV2ViU29ja2V0LUFjY2VwdDogJHt3ZWJzb2NrZXRBY2NlcHRLZXl9YCxcbiAgICAgIFwiXCIsXG4gICAgICBcIlwiXG4gICAgXVxuICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzcG9uc2VMaW5lcy5qb2luKFwiXFxyXFxuXCIpXG5cbiAgICBjb25zdCBtZXNzYWdlSGFuZGxlclJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldE1lc3NhZ2VIYW5kbGVyUmVzb2x2ZXI/LigpXG4gICAgbGV0IG1lc3NhZ2VIYW5kbGVyXG4gICAgbGV0IG1lc3NhZ2VIYW5kbGVyUHJvbWlzZVxuXG4gICAgaWYgKG1lc3NhZ2VIYW5kbGVyUmVzb2x2ZXIpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkSGFuZGxlciA9IG1lc3NhZ2VIYW5kbGVyUmVzb2x2ZXIoe1xuICAgICAgICBjbGllbnQ6IHRoaXMsXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgcmVxdWVzdDogdGhpcy5jdXJyZW50UmVxdWVzdFxuICAgICAgfSlcblxuICAgICAgY29uc3QgcmVzb2x2ZWRUaGVuYWJsZSA9IC8qKiBAdHlwZSB7e3RoZW4/OiAoLi4uYXJnczogQXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+KSA9PiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn19ICovIChyZXNvbHZlZEhhbmRsZXIpXG5cbiAgICAgIGlmIChyZXNvbHZlZFRoZW5hYmxlPy50aGVuKSB7XG4gICAgICAgIG1lc3NhZ2VIYW5kbGVyUHJvbWlzZSA9IC8qKiBAdHlwZSB7UHJvbWlzZTxpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLldlYnNvY2tldE1lc3NhZ2VIYW5kbGVyIHwgdm9pZD59ICovIChyZXNvbHZlZEhhbmRsZXIpXG4gICAgICB9IGVsc2UgaWYgKHJlc29sdmVkSGFuZGxlcikge1xuICAgICAgICBtZXNzYWdlSGFuZGxlciA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5XZWJzb2NrZXRNZXNzYWdlSGFuZGxlcn0gKi8gKHJlc29sdmVkSGFuZGxlcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLndlYnNvY2tldFNlc3Npb24gPSBuZXcgV2Vic29ja2V0U2Vzc2lvbih7XG4gICAgICBjbGllbnQ6IHRoaXMsXG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICB1cGdyYWRlUmVxdWVzdDogdGhpcy5jdXJyZW50UmVxdWVzdCxcbiAgICAgIG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcbiAgICAgIG1lc3NhZ2VIYW5kbGVyUHJvbWlzZTogbWVzc2FnZUhhbmRsZXJQcm9taXNlXG4gICAgfSlcbiAgICB0aGlzLndlYnNvY2tldFNlc3Npb24uZXZlbnRzLm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgLy8gUGF1c2VkIHNlc3Npb25zIHN1cnZpdmUgdGhlIHNvY2tldCBjbG9zZTsgZG9uJ3QgZGVzdHJveSgpLlxuICAgICAgLy8gVGhlIGdyYWNlLWV4cGlyeSBwYXRoIChfZmluYWxpemVHcmFjZUV4cGlyeSkgd2lsbCBkZXN0cm95XG4gICAgICAvLyB0aGVtIHBlcm1hbmVudGx5IGlmIHJlc3VtZSBkb2Vzbid0IGhhcHBlbiBpbiB0aW1lLlxuICAgICAgaWYgKCF0aGlzLndlYnNvY2tldFNlc3Npb24/LmlzUGF1c2VkKCkpIHtcbiAgICAgICAgdGhpcy53ZWJzb2NrZXRTZXNzaW9uPy5kZXN0cm95KClcbiAgICAgIH1cbiAgICAgIHRoaXMud2Vic29ja2V0U2Vzc2lvbiA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gICAgfSlcbiAgICB0aGlzLndlYnNvY2tldFNlc3Npb24uZXZlbnRzLm9uKFwib3duZXJzaGlwQ2xhaW1lZFwiLCAoe3Nlc3Npb25JZH0pID0+IHtcbiAgICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJ3ZWJzb2NrZXRTZXNzaW9uT3duZWRcIiwge3Nlc3Npb25JZH0pXG4gICAgfSlcbiAgICB0aGlzLndlYnNvY2tldFNlc3Npb24uZXZlbnRzLm9uKFwib3duZXJzaGlwUmVsZWFzZWRcIiwgKHtzZXNzaW9uSWR9KSA9PiB7XG4gICAgICB0aGlzLmV2ZW50cy5lbWl0KFwid2Vic29ja2V0U2Vzc2lvblJlbGVhc2VkXCIsIHtzZXNzaW9uSWR9KVxuICAgIH0pXG4gICAgdGhpcy5zdGF0ZSA9IFwid2Vic29ja2V0XCJcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwib3V0cHV0XCIsIHJlc3BvbnNlKVxuICAgIHZvaWQgdGhpcy53ZWJzb2NrZXRTZXNzaW9uLmluaXRpYWxpemVDaGFubmVsKClcbiAgICB0aGlzLndlYnNvY2tldFNlc3Npb24uc2VuZFNlc3Npb25Fc3RhYmxpc2hlZCgpXG4gIH1cblxuICByZXF1ZXN0RG9uZSA9ICgpID0+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJyZXF1ZXN0RG9uZVwiLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnQsIHF1ZXVlTGVuZ3RoOiB0aGlzLnJlcXVlc3RSdW5uZXJzLmxlbmd0aH1dKVxuXG4gICAgcmV0dXJuIHRoaXMuX2RyYWluRG9uZVJlcXVlc3RzKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFwiRmFpbGVkIHdoaWxlIHNlbmRpbmcgZG9uZSByZXF1ZXN0c1wiLCBlcnJvcilcbiAgICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJjbG9zZVwiKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRHJhaW5zIGRvbmUgcmVxdWVzdHMgb25lIGF0IGEgdGltZS4gQSBydW5uZXIgaXMgc2hpZnRlZCBvdXQgb2YgdGhlIHF1ZXVlIGJlZm9yZVxuICAgKiBpdHMgcmVzcG9uc2UgZmluaXNoZXMgc2VuZGluZyAoYXN5bmMgY29tcHJlc3Npb24sIGZpbGUgdHJhbnNmZXIpLCBzbyBhblxuICAgKiBvdmVybGFwcGluZyBkcmFpbiB3b3VsZCBvdGhlcndpc2UgcGljayB1cCB0aGUgbmV4dCBydW5uZXIgYW5kIHJlb3JkZXIgcGlwZWxpbmVkXG4gICAqIHNvY2tldCB3cml0ZXMuIENhbGxzIHRoYXQgYXJyaXZlIHdoaWxlIGEgZHJhaW4gaXMgYWN0aXZlIGFyZSBmb2xkZWQgaW50byBpdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBldmVyeSBkb25lIHJlc3BvbnNlIGhhcyBiZWVuIHNlbnQuXG4gICAqL1xuICBhc3luYyBfZHJhaW5Eb25lUmVxdWVzdHMoKSB7XG4gICAgaWYgKHRoaXMuX2RvbmVSZXF1ZXN0c0RyYWluQWN0aXZlKSB7XG4gICAgICB0aGlzLl9kb25lUmVxdWVzdHNEcmFpblBlbmRpbmcgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9kb25lUmVxdWVzdHNEcmFpbkFjdGl2ZSA9IHRydWVcblxuICAgIHRyeSB7XG4gICAgICBkbyB7XG4gICAgICAgIHRoaXMuX2RvbmVSZXF1ZXN0c0RyYWluUGVuZGluZyA9IGZhbHNlXG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZERvbmVSZXF1ZXN0cygpXG4gICAgICB9IHdoaWxlICh0aGlzLl9kb25lUmVxdWVzdHNEcmFpblBlbmRpbmcpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2RvbmVSZXF1ZXN0c0RyYWluQWN0aXZlID0gZmFsc2VcbiAgICB9XG4gIH1cblxuICBhc3luYyBzZW5kRG9uZVJlcXVlc3RzKCkge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCByZXF1ZXN0UnVubmVyID0gdGhpcy5yZXF1ZXN0UnVubmVyc1swXVxuICAgICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RSdW5uZXI/LmdldFJlcXVlc3QoKVxuXG4gICAgICBpZiAocmVxdWVzdFJ1bm5lcj8uZ2V0U3RhdGUoKSA9PSBcImRvbmVcIikge1xuICAgICAgICBjb25zdCBodHRwVmVyc2lvbiA9IHJlcXVlc3QuaHR0cFZlcnNpb24oKVxuICAgICAgICBjb25zdCBjb25uZWN0aW9uSGVhZGVyID0gcmVxdWVzdC5oZWFkZXIoXCJjb25uZWN0aW9uXCIpPy50b0xvd2VyQ2FzZSgpPy50cmltKClcbiAgICAgICAgY29uc3Qgc2hvdWxkQ2xvc2VDb25uZWN0aW9uID0gdGhpcy5zaG91bGRDbG9zZUNvbm5lY3Rpb24ocmVxdWVzdClcblxuICAgICAgICB0aGlzLnJlcXVlc3RSdW5uZXJzLnNoaWZ0KClcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW1wic2VuZERvbmVSZXF1ZXN0cyBzaGlmdGVkIHF1ZXVlXCIsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCwgcXVldWVMZW5ndGg6IHRoaXMucmVxdWVzdFJ1bm5lcnMubGVuZ3RofV0pXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zZW5kUmVzcG9uc2UocmVxdWVzdFJ1bm5lcilcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYFZlbG9jaW91cyBjbGllbnQgJHt0aGlzLmNsaWVudENvdW50fSBmYWlsZWQgd2hpbGUgc2VuZGluZyByZXNwb25zZWAsIGVycm9yXSlcbiAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRSZXF1ZXN0ID09PSByZXF1ZXN0ICYmIHRoaXMuc3RhdGUgPT09IFwiaW5pdGlhbFwiKSB0aGlzLmN1cnJlbnRSZXF1ZXN0ID0gdW5kZWZpbmVkXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcInNlbmREb25lUmVxdWVzdHNcIiwge2NsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50LCBjb25uZWN0aW9uSGVhZGVyLCBodHRwVmVyc2lvbn1dKVxuXG4gICAgICAgIGlmIChzaG91bGRDbG9zZUNvbm5lY3Rpb24pIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbYENsb3NpbmcgdGhlIGNvbm5lY3Rpb24gYmVjYXVzZSAke2h0dHBWZXJzaW9ufSBhbmQgY29ubmVjdGlvbiBoZWFkZXIgJHtjb25uZWN0aW9uSGVhZGVyfWAsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudH1dKVxuICAgICAgICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJjbG9zZVwiKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGZpbmlzaGVkIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQuIE93bnMgdGhlIGZyYW1ld29yay1vd25lZFxuICAgKiBgVmFyeTogQWNjZXB0LUVuY29kaW5nYCBkaW1lbnNpb24gKGVtaXR0ZWQgZm9yIGV2ZXJ5IHNlbGVjdGVkXG4gICAqIHJlcHJlc2VudGF0aW9uIOKAlCB0cmFuc2Zvcm1lZCwgaWRlbnRpdHksIDQwNiwgYW5kIGZpbGUg4oCUIGFuZCBmb3JcbiAgICogaGVhZGVyLXByZXNlbnQgYW5kIGhlYWRlci1hYnNlbnQgcmVxdWVzdHMgYWxpa2UsIHNvIGl0IGlzIHN0YWJsZSBhY3Jvc3NcbiAgICogcmVxdWVzdHMgb24gdGhlIHNhbWUgY29ubmVjdGlvbjsgbmV2ZXIgYWRkZWQgd2hlbiBjb21wcmVzc2lvbiBpcyBkaXNhYmxlZCxcbiAgICogdGhlIHJlc3BvbnNlIGlzIHRydWx5IGJvZHlsZXNzLCBvciB0aGUgYXBwbGljYXRpb24gc3VwcGxpZWQgYSBmaXhlZFxuICAgKiBgQ29udGVudC1FbmNvZGluZ2ApIGFuZCB0aGUgZmlsZSA0MDYgcnVsZSAoYSBzZW5kRmlsZSByZXNwb25zZSB3aG9zZVxuICAgKiBjbGllbnQgZm9yYmlkcyBpZGVudGl0eSBpcyBhbnN3ZXJlZCB3aXRoIHRoZSBlbXB0eSA0MDYsIHRoZSBmaWxlIGlzIG5ldmVyXG4gICAqIG9wZW5lZCBvciBzdHJlYW1lZCwgYW5kIGBvbkZpbmlzaGVkYCBzZXR0bGVzIG9uY2UgYXMgXCJjb21wbGV0ZWRcIikuXG4gICAqIEBwYXJhbSB7UmVxdWVzdFJ1bm5lcn0gcmVxdWVzdFJ1bm5lciAtIFJlcXVlc3QgcnVubmVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgc2VuZFJlc3BvbnNlKHJlcXVlc3RSdW5uZXIpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGRpZ2cocmVxdWVzdFJ1bm5lciwgXCJyZXNwb25zZVwiKVxuXG4gICAgLy8gQSBzdHJlYW1pbmcgcmVzcG9uc2UgYWxyZWFkeSBlbWl0dGVkIGl0cyBzdGF0dXMgbGluZSwgaGVhZGVycywgZXZlcnlcbiAgICAvLyBjaHVuaywgYW5kIHRoZSBjaHVua2VkIHRlcm1pbmF0b3IgdG8gdGhlIGNsaWVudCB3aGlsZSB0aGUgcmVxdWVzdCB3YXNcbiAgICAvLyBydW5uaW5nLiBOb3RoaW5nIGxlZnQgdG8gc2VuZCBoZXJlIOKAlCBqdXN0IGxvZyB0aGUgY29tcGxldGVkIHJlcXVlc3QuXG4gICAgaWYgKHJlc3BvbnNlLmlzU3RyZWFtaW5nKCkpIHtcbiAgICAgIGF3YWl0IHJlcXVlc3RSdW5uZXIubG9nQ29tcGxldGVkUmVxdWVzdCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gcmVxdWVzdFJ1bm5lci5nZXRSZXF1ZXN0KClcbiAgICBjb25zdCBmaWxlUGF0aCA9IHJlc3BvbnNlLmdldEZpbGVQYXRoKClcbiAgICBjb25zdCBmaWxlT25GaW5pc2hlZCA9IHJlc3BvbnNlLmdldEZpbGVPbkZpbmlzaGVkKClcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKVxuICAgIGNvbnN0IGNvbm5lY3Rpb25IZWFkZXIgPSByZXF1ZXN0LmhlYWRlcihcImNvbm5lY3Rpb25cIik/LnRvTG93ZXJDYXNlKCk/LnRyaW0oKVxuICAgIGNvbnN0IGh0dHBWZXJzaW9uID0gcmVxdWVzdC5odHRwVmVyc2lvbigpXG4gICAgY29uc3Qgc2hvdWxkQ2xvc2VDb25uZWN0aW9uID0gdGhpcy5zaG91bGRDbG9zZUNvbm5lY3Rpb24ocmVxdWVzdClcbiAgICBjb25zdCBoYXNGaWxlUGF0aCA9IHR5cGVvZiBmaWxlUGF0aCA9PT0gXCJzdHJpbmdcIiAmJiBmaWxlUGF0aC5sZW5ndGggPiAwXG4gICAgY29uc3QgYm9keSA9IGhhc0ZpbGVQYXRoID8gbnVsbCA6IHJlc3BvbnNlLmdldEJvZHkoKVxuICAgIGNvbnN0IGJvZHlJc1N0cmluZyA9IHR5cGVvZiBib2R5ID09PSBcInN0cmluZ1wiXG4gICAgY29uc3QgYm9keUlzQmluYXJ5ID0gYm9keSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlcblxuICAgIGlmICghaGFzRmlsZVBhdGggJiYgIWJvZHlJc1N0cmluZyAmJiAhYm9keUlzQmluYXJ5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJlc3BvbnNlIGJvZHkgdG8gYmUgYSBzdHJpbmcgb3IgVWludDhBcnJheSwgZ290ICR7dHlwZW9mIGJvZHl9YClcbiAgICB9XG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcInNlbmRSZXNwb25zZVwiLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnQsIGNvbm5lY3Rpb25IZWFkZXIsIGh0dHBWZXJzaW9ufSlcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJzZW5kUmVzcG9uc2UgcGF5bG9hZFwiLCB7XG4gICAgICBjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCxcbiAgICAgIGhhc0ZpbGVQYXRoLFxuICAgICAgZmlsZVBhdGgsXG4gICAgICBib2R5SXNCaW5hcnksXG4gICAgICBib2R5SXNTdHJpbmdcbiAgICB9XSlcblxuICAgIGlmIChzaG91bGRDbG9zZUNvbm5lY3Rpb24pIHtcbiAgICAgIHJlc3BvbnNlLnNldEhlYWRlcihcIkNvbm5lY3Rpb25cIiwgXCJDbG9zZVwiKVxuICAgIH0gZWxzZSBpZiAoaHR0cFZlcnNpb24gPT0gXCIxLjBcIiAmJiBjb25uZWN0aW9uSGVhZGVyID09IFwia2VlcC1hbGl2ZVwiKSB7XG4gICAgICByZXNwb25zZS5zZXRIZWFkZXIoXCJDb25uZWN0aW9uXCIsIFwiS2VlcC1BbGl2ZVwiKVxuICAgIH1cblxuICAgIC8vIFBlciBSRkMgNzIzMCDCpzMuMy4zLCByZXNwb25zZXMgd2l0aCBzdGF0dXMgY29kZXMgMXh4LCAyMDQsIGFuZCAzMDRcbiAgICAvLyBNVVNUIE5PVCBjYXJyeSBhIG1lc3NhZ2UgYm9keSBhbmQgTVVTVCBOT1QgaW5jbHVkZSBDb250ZW50LUxlbmd0aFxuICAgIC8vICh3aXRoIGEgbmFycm93IDMwNCBleGNlcHRpb24gd2UgZG9uJ3QgbGVhbiBvbikuIFNlbmRpbmcgb25lIHdvdWxkXG4gICAgLy8gZGVzeW5jaHJvbml6ZSBrZWVwLWFsaXZlIGNsaWVudHMgd2FpdGluZyBmb3IgYnl0ZXMgdGhhdCBuZXZlclxuICAgIC8vIGFycml2ZSDigJQgZHJvcCB0aGUgYm9keSBlbnRpcmVseSBmb3IgdGhvc2UgY29kZXMuXG4gICAgY29uc3QgaXNCb2R5bGVzc1N0YXR1cyA9IGlzTm9Cb2R5U3RhdHVzQ29kZShyZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkpXG5cbiAgICAvLyBIRUFEIHJlc3BvbnNlcyBzZWxlY3QgYW5kIGNvbXB1dGUgdGhlIGV4YWN0IHNhbWUgcmVwcmVzZW50YXRpb24gaGVhZGVycyBhcyB0aGVcbiAgICAvLyBlcXVpdmFsZW50IEdFVCAoaW5jbHVkaW5nIENvbnRlbnQtTGVuZ3RoIGFuZCBhbnkgbmVnb3RpYXRlZCBDb250ZW50LUVuY29kaW5nKSxcbiAgICAvLyBidXQgbm8gYnVmZmVyZWQgb3IgZmlsZSBib2R5IGlzIGVtaXR0ZWQgYmVsb3cuXG4gICAgY29uc3QgaXNIZWFkUmVxdWVzdCA9IHJlcXVlc3QuaHR0cE1ldGhvZCgpID09IFwiSEVBRFwiXG5cbiAgICAvKiogQHR5cGUge3N0cmluZyB8IFVpbnQ4QXJyYXkgfCBudWxsfSAqL1xuICAgIGxldCBib2R5VG9FbWl0ID0gYm9keVxuXG4gICAgLy8gVGhlIHJlc3BvbnNlIHJlcHJlc2VudGF0aW9uIGNhbiBkZXBlbmQgb24gdGhlIGNsaWVudCdzIEFjY2VwdC1FbmNvZGluZzpcbiAgICAvLyB0aGUgc2FtZSByZXF1ZXN0IGlzIGFuc3dlcmVkIHdpdGggYW4gaWRlbnRpdHkgYm9keSAob3IgYSBmaWxlKSB3aGVuXG4gICAgLy8gaWRlbnRpdHkgaXMgYWNjZXB0YWJsZSBhbmQgd2l0aCBhbiBlbXB0eSA0MDYgd2hlbiBpdCBpcyBmb3JiaWRkZW4uXG4gICAgY29uc3QgY29tcHJlc3Npb24gPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0SHR0cFNlcnZlckNvbXByZXNzaW9uKClcbiAgICBjb25zdCBuZWdvdGlhdGVkID0gY29tcHJlc3Npb24uZW5hYmxlZCA/IG5lZ290aWF0ZUNvbnRlbnRFbmNvZGluZyhyZXF1ZXN0LmhlYWRlcihcImFjY2VwdC1lbmNvZGluZ1wiKSkgOiB1bmRlZmluZWRcbiAgICAvLyBBbiBhcHBsaWNhdGlvbi1zdXBwbGllZCBDb250ZW50LUVuY29kaW5nIGlzIGFuIGFwcGxpY2F0aW9uLW93bmVkXG4gICAgLy8gcmVwcmVzZW50YXRpb24gY29udHJhY3QsIGNhcHR1cmVkIGJlZm9yZSB0aGUgZnJhbWV3b3JrIG1heSBhZGQgaXRzIG93bi5cbiAgICAvLyBBIGZpbGUgY2Fycnlpbmcgb25lIGlzIGEgZml4ZWQsIGFwcGxpY2F0aW9uLW93bmVkIHJlcHJlc2VudGF0aW9uOiB0aGVcbiAgICAvLyBmcmFtZXdvcmsgbmVpdGhlciBuZWdvdGlhdGVzIGl0IG5vciByZS1hZHZlcnRpc2VzIGl0LCBzbyBpdCBpcyBuZXZlciBhXG4gICAgLy8gY2FuZGlkYXRlIGZvciB0aGUgaWRlbnRpdHktb25seSA0MDYuXG4gICAgY29uc3QgaGFzQXBwbGljYXRpb25Db250ZW50RW5jb2RpbmcgPSByZXNwb25zZS5nZXRIZWFkZXIoXCJDb250ZW50LUVuY29kaW5nXCIpLmxlbmd0aCA+IDBcbiAgICAvLyBBIGZpbGUgcmVzcG9uc2Ugb25seSBldmVyIHNlcnZlcyB0aGUgaWRlbnRpdHkgcmVwcmVzZW50YXRpb246IHdoZW5ldmVyXG4gICAgLy8gdGhlIGNsaWVudCBmb3JiaWRzIGlkZW50aXR5IChpbmNsdWRpbmcgdGhlIG5vdC1hY2NlcHRhYmxlIGNhc2Ugd2hlcmUgbm9cbiAgICAvLyBjb2RpbmcgYXBwbGllcykgYW5kIHRoZSBmaWxlIGRvZXMgbm90IGNhcnJ5IGFuIGFwcGxpY2F0aW9uLXN1cHBsaWVkXG4gICAgLy8gQ29udGVudC1FbmNvZGluZywgdGhlIGZpbGUgaXMgcmVqZWN0ZWQgd2l0aCB0aGUgZW1wdHkgNDA2LiBBIHRydWx5XG4gICAgLy8gYm9keWxlc3Mgc3RhdHVzIHNlbGVjdHMgbm8gcmVwcmVzZW50YXRpb24sIHNvIGl0IGlzIG5ldmVyIHJlamVjdGVkIGhlcmUuXG4gICAgY29uc3QgaXNGaWxlTm90QWNjZXB0YWJsZSA9IGhhc0ZpbGVQYXRoICYmICEhbmVnb3RpYXRlZCAmJiAoXCJub3RBY2NlcHRhYmxlXCIgaW4gbmVnb3RpYXRlZCB8fCBuZWdvdGlhdGVkLmlkZW50aXR5QWNjZXB0YWJsZSA9PT0gZmFsc2UpICYmIGhhc0FwcGxpY2F0aW9uQ29udGVudEVuY29kaW5nID09PSBmYWxzZSAmJiAhaXNCb2R5bGVzc1N0YXR1c1xuXG4gICAgaWYgKCFpc0JvZHlsZXNzU3RhdHVzKSB7XG4gICAgICBsZXQgY29udGVudExlbmd0aFxuXG4gICAgICBpZiAoaGFzRmlsZVBhdGgpIHtcbiAgICAgICAgaWYgKGlzRmlsZU5vdEFjY2VwdGFibGUpIHtcbiAgICAgICAgICAvLyBUaGUgY2xpZW50IGZvcmJpZHMgaWRlbnRpdHkgYW5kIGZpbGVzIGFyZSBvbmx5IGV2ZXIgc2VudCBpZGVudGl0eTpcbiAgICAgICAgICAvLyBhbnN3ZXIgd2l0aCB0aGUgc2FtZSBlbXB0eSA0MDYgZXZlcnkgb3RoZXIgcmVwcmVzZW50YXRpb24gcGF0aFxuICAgICAgICAgIC8vIHVzZXMuIFRoZSBmaWxlIGlzIG5ldmVyIG9wZW5lZCBvciBzdHJlYW1lZDsgb25GaW5pc2hlZCBpcyBzZXR0bGVkXG4gICAgICAgICAgLy8gYmVsb3csIGFmdGVyIHRoZSBjb21taXR0ZWQgNDA2IGhlYWRlcnMgYXJlIGVtaXR0ZWQuXG4gICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKDQwNilcbiAgICAgICAgICByZXNwb25zZS5zZXRCb2R5KFwiXCIpXG4gICAgICAgICAgYm9keVRvRW1pdCA9IFwiXCJcbiAgICAgICAgICBjb250ZW50TGVuZ3RoID0gMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aClcbiAgICAgICAgICBjb250ZW50TGVuZ3RoID0gc3RhdHMuc2l6ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTdHJpbmcgYm9kaWVzIGFyZSBVVEYtOCBmcmFtZWQsIHNvIHRoZSBidWZmZXJlZCBieXRlcyBhcmUgdGhlIFVURi04IGVuY29kaW5nO1xuICAgICAgICAvLyBVaW50OEFycmF5IGJvZGllcyBhcmUgYWxyZWFkeSB0aGUgZXhhY3Qgd2lyZSBieXRlcy5cbiAgICAgICAgY29uc3QgYm9keUJ1ZmZlciA9IGJvZHlJc1N0cmluZyA/IEJ1ZmZlci5mcm9tKGJvZHksIFwidXRmOFwiKSA6IEJ1ZmZlci5mcm9tKGJvZHkpXG4gICAgICAgIGNvbnN0IGNvbXByZXNzaW9uUmVzdWx0ID0gYXdhaXQgYXBwbHlSZXNwb25zZUNvbXByZXNzaW9uKHtcbiAgICAgICAgICBib2R5QnVmZmVyLFxuICAgICAgICAgIGNvbXByZXNzaW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0SHR0cFNlcnZlckNvbXByZXNzaW9uKCksXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICByZXNwb25zZVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChjb21wcmVzc2lvblJlc3VsdC5vdXRjb21lID09IFwibm90LWFjY2VwdGFibGVcIikge1xuICAgICAgICAgIC8vIFRoZSBjbGllbnQgZm9yYmlkcyBpZGVudGl0eSBhbmQgbm8gc3VwcG9ydGVkIGNvZGluZyBpcyBhY2NlcHRhYmxlOiBhbnN3ZXJcbiAgICAgICAgICAvLyB3aXRoIGFuIGVtcHR5IDQwNiBpbnN0ZWFkIG9mIGFuIHVuYWNjZXB0YWJsZSByZXByZXNlbnRhdGlvbi5cbiAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoNDA2KVxuICAgICAgICAgIHJlc3BvbnNlLnNldEJvZHkoXCJcIilcbiAgICAgICAgICBib2R5VG9FbWl0ID0gXCJcIlxuICAgICAgICAgIGNvbnRlbnRMZW5ndGggPSAwXG4gICAgICAgIH0gZWxzZSBpZiAoY29tcHJlc3Npb25SZXN1bHQub3V0Y29tZSA9PSBcImNvbXByZXNzZWRcIikge1xuICAgICAgICAgIGJvZHlUb0VtaXQgPSBjb21wcmVzc2lvblJlc3VsdC5ib2R5XG4gICAgICAgICAgY29udGVudExlbmd0aCA9IGNvbXByZXNzaW9uUmVzdWx0LmJvZHkubGVuZ3RoXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGVudExlbmd0aCA9IGJvZHlCdWZmZXIubGVuZ3RoXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIGFueSBhcHBsaWNhdGlvbiBwcmUtc2V0IENvbnRlbnQtTGVuZ3RoIChhbnkgY2FzaW5nKSBzbyBleGFjdGx5IG9uZVxuICAgICAgLy8gcmVjb21wdXRlZCB2YWx1ZSBnb2VzIG9uIHRoZSB3aXJlLlxuICAgICAgcmVzcG9uc2UucmVtb3ZlSGVhZGVyKFwiQ29udGVudC1MZW5ndGhcIilcbiAgICAgIHJlc3BvbnNlLnNldEhlYWRlcihcIkNvbnRlbnQtTGVuZ3RoXCIsIGNvbnRlbnRMZW5ndGgpXG4gICAgfVxuXG4gICAgLy8gRnJhbWV3b3JrLW93bmVkIFZhcnkgZGltZW5zaW9uOiB3aGVuZXZlciBjb21wcmVzc2lvbiBpcyBlbmFibGVkIGFuZCBhXG4gICAgLy8gcmVwcmVzZW50YXRpb24gd2FzIHNlbGVjdGVkLCB0aGUgcmVzcG9uc2UgZGVwZW5kcyBvbiBBY2NlcHQtRW5jb2RpbmcsXG4gICAgLy8gc28gY2FjaGVzIG11c3Qga2V5IG9uIGl0LiBBcHBsaWVkIGlkZW50aWNhbGx5IGZvciBldmVyeSBvdXRjb21lXG4gICAgLy8gKHRyYW5zZm9ybWVkLCBpZGVudGl0eSwgNDA2LCBmaWxlKSBhbmQgZm9yIGhlYWRlci1wcmVzZW50IGFuZFxuICAgIC8vIGhlYWRlci1hYnNlbnQgcmVxdWVzdHMgYWxpa2UsIHNvIHRoZSBoZWFkZXIgaXMgc3RhYmxlIGFjcm9zcyByZXF1ZXN0cyBvblxuICAgIC8vIHRoZSBzYW1lIGNvbm5lY3Rpb24uIEEgdHJ1bHkgYm9keWxlc3MgcmVzcG9uc2Ugc2VsZWN0cyBubyByZXByZXNlbnRhdGlvblxuICAgIC8vIGFuZCBjYXJyaWVzIG5vIGRpbWVuc2lvbjsgYW4gYXBwbGljYXRpb24tc3VwcGxpZWQgQ29udGVudC1FbmNvZGluZyBrZWVwc1xuICAgIC8vIHRoZSByZXByZXNlbnRhdGlvbiBjb250cmFjdCBhcHBsaWNhdGlvbi1vd25lZCBhbmQgaXMgbmV2ZXIgcmUtYWR2ZXJ0aXNlZC5cbiAgICBpZiAobmVnb3RpYXRlZCAmJiAhaXNCb2R5bGVzc1N0YXR1cyAmJiBoYXNBcHBsaWNhdGlvbkNvbnRlbnRFbmNvZGluZyA9PT0gZmFsc2UpIHtcbiAgICAgIGFkZEFjY2VwdEVuY29kaW5nVG9WYXJ5KHJlc3BvbnNlKVxuICAgIH1cblxuICAgIHJlc3BvbnNlLnNldEhlYWRlcihcIkRhdGVcIiwgZGF0ZS50b1VUQ1N0cmluZygpKVxuICAgIHJlc3BvbnNlLnNldEhlYWRlcihcIlNlcnZlclwiLCBcIlZlbG9jaW91c1wiKVxuXG4gICAgbGV0IGhlYWRlcnMgPSBcIlwiXG5cbiAgICBoZWFkZXJzICs9IGBIVFRQLyR7cmVxdWVzdC5odHRwVmVyc2lvbigpfSAke3Jlc3BvbnNlLmdldFN0YXR1c0NvZGUoKX0gJHtyZXNwb25zZS5nZXRTdGF0dXNNZXNzYWdlKCl9XFxyXFxuYFxuXG4gICAgZm9yIChjb25zdCBoZWFkZXJLZXkgaW4gcmVzcG9uc2UuaGVhZGVycykge1xuICAgICAgZm9yIChjb25zdCBoZWFkZXJWYWx1ZSBvZiByZXNwb25zZS5oZWFkZXJzW2hlYWRlcktleV0pIHtcbiAgICAgICAgaGVhZGVycyArPSBgJHtoZWFkZXJLZXl9OiAke2hlYWRlclZhbHVlfVxcclxcbmBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBoZWFkZXJzICs9IFwiXFxyXFxuXCJcblxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgaGVhZGVycylcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJzZW5kUmVzcG9uc2UgaGVhZGVycyBlbWl0dGVkXCIsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCwgaGVhZGVyc0xlbmd0aDogaGVhZGVycy5sZW5ndGh9XSlcblxuICAgIC8vIEEgbmVnb3RpYXRlZCBmaWxlIDQwNiBpcyBjb21taXR0ZWQgYWJvdmUgKHN0YXR1cyA0MDYsIGVtcHR5IGJvZHkpIGFuZCBpdHNcbiAgICAvLyBoZWFkZXJzIHdlcmUganVzdCBlbWl0dGVkOiBzZXR0bGUgb25GaW5pc2hlZCBub3csIHNvIHRoZSBjYWxsYmFjayBydW5zXG4gICAgLy8gYWZ0ZXIgdGhlIHJlc3BvbnNlIGlzIGNvbW1pdHRlZCDigJQgYSBzbG93IG9yIGFwcC1zdG9wcGluZyBjYWxsYmFjayBjYW5ub3RcbiAgICAvLyBkZWxheSBvciBibG9jayBkZWxpdmVyeSBvZiB0aGUgYWxyZWFkeS1lbWl0dGVkIDQwNi4gVGhlIGZpbGUgaXMgbmV2ZXJcbiAgICAvLyBvcGVuZWQsIHN0cmVhbWVkLCBvciByZXBvcnRlZCAobm8gZmlsZSBldmVudCksIGFuZCB0aGUgY2FsbGJhY2sgc2V0dGxlc1xuICAgIC8vIGV4YWN0bHkgb25jZSBhcyBcImNvbXBsZXRlZFwiLlxuICAgIGlmIChpc0ZpbGVOb3RBY2NlcHRhYmxlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJzZW5kUmVzcG9uc2UgZmlsZSBib2R5IHN1cHByZXNzZWQgZm9yIDQwNlwiLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnQsIGZpbGVQYXRofV0pXG4gICAgICBhd2FpdCB0aGlzLnJ1bkZpbGVPbkZpbmlzaGVkKHtmaWxlUGF0aCwgb25GaW5pc2hlZDogZmlsZU9uRmluaXNoZWQsIHJlc3VsdDogXCJjb21wbGV0ZWRcIn0pXG4gICAgfSBlbHNlIGlmIChpc0JvZHlsZXNzU3RhdHVzKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJzZW5kUmVzcG9uc2UgYm9keSBzdXBwcmVzc2VkIGZvciBuby1ib2R5IHN0YXR1c1wiLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnQsIHN0YXR1c0NvZGU6IHJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKX1dKVxuICAgICAgLy8gQSBib2R5bGVzcyBzdGF0dXMgKDF4eC8yMDQvMzA0KSBzZWxlY3RzIG5vIHJlcHJlc2VudGF0aW9uLCBzbyBubyBmaWxlXG4gICAgICAvLyBib2R5IG9yIGZyYW1ld29yayBWYXJ5IGlzIGVtaXR0ZWQuIFRoZSBmaWxlLW93bmVyc2hpcCBwYXRoIHN0aWxsIHNldHRsZXNcbiAgICAgIC8vIG9uRmluaXNoZWQgZXhhY3RseSBvbmNlIGFzIFwiY29tcGxldGVkXCIgKG5vdGhpbmcgd2FzIGFib3J0ZWQpIOKAlCBldmVuIHdoZW5cbiAgICAgIC8vIHRoZSBjbGllbnQgZm9yYmlkcyBpZGVudGl0eSDigJQgcHJlc2VydmluZyB0aGUgcHJlLWNoYW5nZSBzZXR0bGVtZW50LlxuICAgICAgaWYgKGhhc0ZpbGVQYXRoKSBhd2FpdCB0aGlzLnNlbmRGaWxlT3V0cHV0KGZpbGVQYXRoLCBmYWxzZSwgZmlsZU9uRmluaXNoZWQpXG4gICAgfSBlbHNlIGlmIChpc0hlYWRSZXF1ZXN0KSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJzZW5kUmVzcG9uc2UgYm9keSBzdXBwcmVzc2VkIGZvciBIRUFEIHJlcXVlc3RcIiwge2NsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50fV0pXG4gICAgICBpZiAoaGFzRmlsZVBhdGgpIGF3YWl0IHRoaXMuc2VuZEZpbGVPdXRwdXQoZmlsZVBhdGgsIGZhbHNlLCBmaWxlT25GaW5pc2hlZClcbiAgICB9IGVsc2UgaWYgKGhhc0ZpbGVQYXRoKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRGaWxlT3V0cHV0KGZpbGVQYXRoLCB0cnVlLCBmaWxlT25GaW5pc2hlZClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBib2R5VG9FbWl0KVxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW1wic2VuZFJlc3BvbnNlIGJvZHkgZW1pdHRlZFwiLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnQsIGJvZHlMZW5ndGg6IGJvZHlUb0VtaXQgPyBib2R5VG9FbWl0Lmxlbmd0aCA6IDB9XSlcbiAgICB9XG5cbiAgICBhd2FpdCByZXF1ZXN0UnVubmVyLmxvZ0NvbXBsZXRlZFJlcXVlc3QoKVxuXG4gICAgaWYgKFwiZ2V0UmVxdWVzdFBhcnNlclwiIGluIHJlcXVlc3QpIHtcbiAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3JlcXVlc3QuanNcIikuZGVmYXVsdH0gKi8gKHJlcXVlc3QpXG4gICAgICBodHRwUmVxdWVzdC5nZXRSZXF1ZXN0UGFyc2VyKCkuZGVzdHJveSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2VuZCBmaWxlIG91dHB1dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNlbmRCb2R5IC0gV2hldGhlciB0aGUgZmlsZSBib2R5IHNob3VsZCBiZSBzZW50LlxuICAgKiBAcGFyYW0geygocmVzdWx0OiBcImNvbXBsZXRlZFwiIHwgXCJhYm9ydGVkXCIpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+KSB8IG51bGx9IG9uRmluaXNoZWQgLSBDb21wbGV0aW9uIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgc2VuZEZpbGVPdXRwdXQoZmlsZVBhdGgsIHNlbmRCb2R5LCBvbkZpbmlzaGVkKSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW1wic2VuZEZpbGVPdXRwdXQgc3RhcnRcIiwge2NsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50LCBmaWxlUGF0aH1dKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIC8qKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IG51bGx9ICovXG4gICAgICBsZXQgc2V0dGxlbWVudCA9IG51bGxcbiAgICAgIGNvbnN0IHNldHRsZSA9ICgvKiogQHR5cGUge1wiY29tcGxldGVkXCIgfCBcImFib3J0ZWRcIn0gKi8gdHJhbnNmZXJSZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZW1lbnQpIHJldHVybiBzZXR0bGVtZW50XG5cbiAgICAgICAgdGhpcy5wZW5kaW5nRmlsZVJlc3BvbnNlcy5kZWxldGUoc2V0dGxlKVxuICAgICAgICBzZXR0bGVtZW50ID0gdGhpcy5ydW5GaWxlT25GaW5pc2hlZCh7ZmlsZVBhdGgsIG9uRmluaXNoZWQsIHJlc3VsdDogdHJhbnNmZXJSZXN1bHR9KVxuICAgICAgICAgIC5maW5hbGx5KCgpID0+IHJlc29sdmUodHJhbnNmZXJSZXN1bHQpKVxuXG4gICAgICAgIHJldHVybiBzZXR0bGVtZW50XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGVuZGluZ0ZpbGVSZXNwb25zZXMuYWRkKHNldHRsZSlcbiAgICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJmaWxlXCIsIHtmaWxlUGF0aCwgc2VuZEJvZHksIHNldHRsZX0pXG4gICAgfSlcblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcInNlbmRGaWxlT3V0cHV0IGRvbmVcIiwge2NsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50LCBmaWxlUGF0aCwgcmVzdWx0fV0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIGZpbGUgY29tcGxldGlvbiBjYWxsYmFjayB3aXRob3V0IGFsbG93aW5nIGNsZWFudXAgZmFpbHVyZXMgdG8gcmVwbGFjZSB0aGUgY29tbWl0dGVkIHJlc3BvbnNlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIENvbXBsZXRpb24gZGV0YWlscy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZmlsZVBhdGggLSBGaWxlIHBhdGguXG4gICAqIEBwYXJhbSB7KChyZXN1bHQ6IFwiY29tcGxldGVkXCIgfCBcImFib3J0ZWRcIikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHwgbnVsbH0gYXJncy5vbkZpbmlzaGVkIC0gQ29tcGxldGlvbiBjYWxsYmFjay5cbiAgICogQHBhcmFtIHtcImNvbXBsZXRlZFwiIHwgXCJhYm9ydGVkXCJ9IGFyZ3MucmVzdWx0IC0gVHJhbnNmZXIgcmVzdWx0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBjYWxsYmFjayBjbGVhbnVwIGFuZCBlcnJvciByZXBvcnRpbmcgZmluaXNoLlxuICAgKi9cbiAgYXN5bmMgcnVuRmlsZU9uRmluaXNoZWQoe2ZpbGVQYXRoLCBvbkZpbmlzaGVkLCByZXN1bHR9KSB7XG4gICAgaWYgKCFvbkZpbmlzaGVkKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBvbkZpbmlzaGVkKHJlc3VsdClcbiAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgY29uc3QgZXJyb3IgPSBlbnN1cmVFcnJvcihjYXVnaHRFcnJvcilcblxuICAgICAgYXdhaXQgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiRmlsZSByZXNwb25zZSBvbkZpbmlzaGVkIGNhbGxiYWNrIGZhaWxlZFwiLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnQsIGZpbGVQYXRoLCByZXN1bHR9LCBlcnJvcl0pXG5cbiAgICAgIGNvbnN0IGVycm9yUGF5bG9hZCA9IHtcbiAgICAgICAgY29udGV4dDoge2NsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50LCBmaWxlUGF0aCwgcmVzdWx0LCBzdGFnZTogXCJzZW5kLWZpbGUtb24tZmluaXNoZWRcIn0sXG4gICAgICAgIGVycm9yXG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5nZXRFcnJvckV2ZW50cygpLmVtaXQoXCJmcmFtZXdvcmstZXJyb3JcIiwgZXJyb3JQYXlsb2FkKVxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmdldEVycm9yRXZlbnRzKCkuZW1pdChcImFsbC1lcnJvclwiLCB7Li4uZXJyb3JQYXlsb2FkLCBlcnJvclR5cGU6IFwiZnJhbWV3b3JrLWVycm9yXCJ9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBYm9ydHMgYWxsIGZpbGUgcmVzcG9uc2VzIGF3YWl0aW5nIHRyYW5zcG9ydCBhY2tub3dsZWRnZW1lbnQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHBlbmRpbmcgY2FsbGJhY2tzIHNldHRsZS5cbiAgICovXG4gIGFzeW5jIGFib3J0UGVuZGluZ0ZpbGVSZXNwb25zZXMoKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoWy4uLnRoaXMucGVuZGluZ0ZpbGVSZXNwb25zZXNdLm1hcCgoc2V0dGxlKSA9PiBzZXR0bGUoXCJhYm9ydGVkXCIpKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW5rIHRoZSBvd25pbmcgd29ya2VyIGhhbmRsZXIgd2lyZXMgaW4gZm9yIHN0cmVhbSBvdXRwdXQuIFRoZVxuICAgKiBpbi1wcm9jZXNzIGhhbmRsZXIgcmVzb2x2ZXMgaXQgYWZ0ZXIgdGhlIGZyYW1lZCBvdXRwdXQgaGFzIGJlZW4gZW5xdWV1ZWRcbiAgICogZm9yIGRlbGl2ZXJ5IHRvIHRoZSBzb2NrZXQsIHNvIHN0cmVhbSBjaHVua3Mgc2hhcmUgdGhlIGJvdW5kZWQsIG9yZGVyZWRcbiAgICogZGVsaXZlcnkgcGF0aCAoYnl0ZS9mcmFtZSBsaW1pdHMgYW5kIHNvY2tldCBiYWNrcHJlc3N1cmUpIGluc3RlYWQgb2ZcbiAgICogYmVpbmcgYnVmZmVyZWQgdW5ib3VuZGVkbHkgZm9yIGEgc3RhbGxlZCBjbGllbnQuIFRoZSB3b3JrZXItdGhyZWFkXG4gICAqIGhhbmRsZXIga2VlcHMgbnVsbDogaXRzIG91dHB1dCBjcm9zc2VzIHRvIHRoZSBwYXJlbnQgb3ZlciBJUEMgYW5kIG5vXG4gICAqIHBlci1jaHVuayBhY2tub3dsZWRnZW1lbnQgaXMgYXZhaWxhYmxlLlxuICAgKiBAdHlwZSB7KChvdXRwdXQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPikgfCBudWxsfSAqL1xuICBzdHJlYW1PdXRwdXRTaW5rID0gbnVsbFxuXG4gIC8qKlxuICAgKiBOYXJyb3dzIHRoZSByZXNwb25zZSB0byB0aGUgZG9jdW1lbnRlZCBzdHJlYW1pbmcgdHJhbnNwb3J0IHNoYXBlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcmVzcG9uc2UuanNcIikuZGVmYXVsdH0gcmVzcG9uc2UgLSBSZXNwb25zZSB0byBzdHJlYW0uXG4gICAqIEByZXR1cm5zIHt7c3RyZWFtaW5nOiBib29sZWFuLCBzdHJlYW1FbmRlZDogYm9vbGVhbiwgc3RyZWFtQWJvcnRlZDogYm9vbGVhbiwgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+LCBnZXRTdGF0dXNDb2RlOiAoKSA9PiBudW1iZXIsIGdldFN0YXR1c01lc3NhZ2U6ICgpID0+IHN0cmluZywgc3RyZWFtQ2xvc2VDYWxsYmFja3M6IFNldDwoKSA9PiB2b2lkPn19IC0gU3RyZWFtaW5nIHZpZXcgb2YgdGhlIHJlc3BvbnNlLlxuICAgKi9cbiAgX3N0cmVhbWluZ1Jlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIGEgbGl2ZSBjaHVua2VkIHN0cmVhbSBmb3IgYSBzb2NrZXQtYm91bmQgcmVzcG9uc2U6IGVtaXRzIHRoZVxuICAgKiBzdGF0dXMgbGluZSBhbmQgaGVhZGVycyAod2l0aCBgVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRgKSB0byB0aGVcbiAgICogY2xpZW50IGltbWVkaWF0ZWx5IHNvIHN1YnNlcXVlbnQgYHdyaXRlKClgIGNodW5rcyByZWFjaCB0aGUgY2xpZW50IGFzXG4gICAqIHRoZXkgYXJlIHByb2R1Y2VkLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcmVzcG9uc2UuanNcIikuZGVmYXVsdH0gcmVzcG9uc2UgLSBSZXNwb25zZSB0byBzdHJlYW0uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9IHJlcXVlc3QgLSBTb2NrZXQtYm91bmQgcmVxdWVzdC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgYmVnaW5TdHJlYW1SZXNwb25zZShyZXNwb25zZSwgcmVxdWVzdCkge1xuICAgIHRoaXMuX2FjdGl2ZVN0cmVhbVJlc3BvbnNlcy5zZXQocmVzcG9uc2UsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCwgcmVxdWVzdH0pXG5cbiAgICBjb25zdCBodHRwVmVyc2lvbiA9IHJlcXVlc3QuaHR0cFZlcnNpb24oKVxuXG4gICAgLy8gSFRUUC8xLjAgaGFzIG5vIGNodW5rZWQgdHJhbnNmZXIgZW5jb2Rpbmc6IHRlcm1pbmF0ZSB0aGUgc3RyZWFtIHdpdGggYVxuICAgIC8vIGNvbm5lY3Rpb24gY2xvc2UgaW5zdGVhZCBvZiBhIHplcm8tbGVuZ3RoIGNodW5rLlxuICAgIGlmIChodHRwVmVyc2lvbiA9PSBcIjEuMFwiICYmICF0aGlzLnNob3VsZENsb3NlQ29ubmVjdGlvbihyZXF1ZXN0KSkge1xuICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiQ29ubmVjdGlvblwiLCBcIkNsb3NlXCIpXG4gICAgfVxuXG4gICAgLy8gVGhlIGNodW5rZWQgZnJhbWluZyBvd25zIHRoZSBib2R5IGxlbmd0aDsgYSBDb250ZW50LUxlbmd0aCBoZWFkZXIgc2V0XG4gICAgLy8gYnkgdGhlIGFwcGxpY2F0aW9uIGJlZm9yZSBzdHJlYW0oKSB3b3VsZCBkZXN5bmNocm9uaXplIHRoZSBmcmFtaW5nLlxuICAgIHJlc3BvbnNlLnJlbW92ZUhlYWRlcihcIkNvbnRlbnQtTGVuZ3RoXCIpXG4gICAgaWYgKHJlc3BvbnNlLmdldEhlYWRlcihcIlRyYW5zZmVyLUVuY29kaW5nXCIpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiVHJhbnNmZXItRW5jb2RpbmdcIiwgXCJjaHVua2VkXCIpXG4gICAgfVxuXG4gICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiRGF0ZVwiLCBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCkpXG4gICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiU2VydmVyXCIsIFwiVmVsb2Npb3VzXCIpXG5cbiAgICBjb25zdCByZXNwb25zZVZpZXcgPSB0aGlzLl9zdHJlYW1pbmdSZXNwb25zZShyZXNwb25zZSlcbiAgICBsZXQgaGVhZGVycyA9IFwiXCJcbiAgICBoZWFkZXJzICs9IGBIVFRQLyR7aHR0cFZlcnNpb259ICR7cmVzcG9uc2VWaWV3LmdldFN0YXR1c0NvZGUoKX0gJHtyZXNwb25zZVZpZXcuZ2V0U3RhdHVzTWVzc2FnZSgpfVxcclxcbmBcblxuICAgIGZvciAoY29uc3QgaGVhZGVyS2V5IGluIHJlc3BvbnNlVmlldy5oZWFkZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGhlYWRlclZhbHVlIG9mIHJlc3BvbnNlVmlldy5oZWFkZXJzW2hlYWRlcktleV0pIHtcbiAgICAgICAgaGVhZGVycyArPSBgJHtoZWFkZXJLZXl9OiAke2hlYWRlclZhbHVlfVxcclxcbmBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBoZWFkZXJzICs9IFwiXFxyXFxuXCJcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwib3V0cHV0XCIsIGhlYWRlcnMpXG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgb25lIGNodW5rZWQtZW5jb2RlZCBib2R5IGNodW5rIGZvciBhbiBhY3RpdmUgc3RyZWFtLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFVpbnQ4QXJyYXl9IGNodW5rIC0gQ2h1bmsgdG8gZW1pdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gU2V0dGxlcyBhZnRlciB0aGUgY2h1bmsgaGFzIGJlZW4gZGVsaXZlcmVkIHRvXG4gICAqIHRoZSBjbGllbnQuXG4gICAqL1xuICBhc3luYyB3cml0ZVN0cmVhbUNodW5rKGNodW5rKSB7XG4gICAgY29uc3QgYnl0ZXMgPSB0eXBlb2YgY2h1bmsgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShjaHVuaywgXCJ1dGY4XCIpIDogQnVmZmVyLmZyb20oY2h1bmspXG4gICAgY29uc3QgZnJhbWUgPSBgJHtieXRlcy5sZW5ndGgudG9TdHJpbmcoMTYpfVxcclxcbiR7Ynl0ZXN9XFxyXFxuYFxuICAgIGlmICh0aGlzLnN0cmVhbU91dHB1dFNpbmsgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgZnJhbWUpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zdHJlYW1PdXRwdXRTaW5rKGZyYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIHRoZSB6ZXJvLWxlbmd0aCBjaHVua2VkIHRlcm1pbmF0b3IgZm9yIGEgc3RyZWFtIHRoYXQgZmluaXNoZWQgb24gYVxuICAgKiBsaXZlIGNvbm5lY3Rpb24sIHRoZW4gcnVucyBpdHMgY2xvc2UgY2FsbGJhY2tzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcmVzcG9uc2UuanNcIikuZGVmYXVsdH0gcmVzcG9uc2UgLSBSZXNwb25zZSB0byBmaW5pc2guXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFNldHRsZXMgYWZ0ZXIgdGhlIHRlcm1pbmF0b3Igd2FzIGRlbGl2ZXJlZCBhbmRcbiAgICogdGhlIGNsb3NlIGNhbGxiYWNrcyByYW4uXG4gICAqL1xuICBhc3luYyBlbmRTdHJlYW1SZXNwb25zZShyZXNwb25zZSkge1xuICAgIGlmIChyZXNwb25zZS5zdHJlYW1FbmRlZCkgcmV0dXJuXG4gICAgcmVzcG9uc2Uuc3RyZWFtRW5kZWQgPSB0cnVlXG4gICAgdGhpcy5fYWN0aXZlU3RyZWFtUmVzcG9uc2VzLmRlbGV0ZShyZXNwb25zZSlcbiAgICBpZiAodGhpcy5zdHJlYW1PdXRwdXRTaW5rID09PSBudWxsKSB7XG4gICAgICB0aGlzLmV2ZW50cy5lbWl0KFwib3V0cHV0XCIsIFwiMFxcclxcblxcclxcblwiKVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnN0cmVhbU91dHB1dFNpbmsoXCIwXFxyXFxuXFxyXFxuXCIpXG4gICAgfVxuICAgIGF3YWl0IHRoaXMuX3J1blN0cmVhbUNsb3NlQ2FsbGJhY2tzKHJlc3BvbnNlKVxuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0cyBldmVyeSBzdHJlYW0gd2hvc2UgY2xpZW50IGNvbm5lY3Rpb24gd2VudCBhd2F5OiBtYXJrcyB0aGUgc3RyZWFtXG4gICAqIGFib3J0ZWQgYW5kIHJ1bnMgdGhlIGNsb3NlIGNhbGxiYWNrcyBzbyBpbi1mbGlnaHQgd29yayBjYW4gc2V0dGxlIGl0c1xuICAgKiByZXNvdXJjZXMuIE5vIHRlcm1pbmF0b3IgaXMgZW1pdHRlZCDigJQgdGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBnb25lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBldmVyeSBzdHJlYW0gc2V0dGxlZC5cbiAgICovXG4gIGFzeW5jIGFib3J0U3RyZWFtUmVzcG9uc2VzKCkge1xuICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgWy4uLnRoaXMuX2FjdGl2ZVN0cmVhbVJlc3BvbnNlcy5rZXlzKCldKSB7XG4gICAgICBpZiAocmVzcG9uc2Uuc3RyZWFtQWJvcnRlZCkgY29udGludWVcbiAgICAgIHJlc3BvbnNlLnN0cmVhbUFib3J0ZWQgPSB0cnVlXG4gICAgICB0aGlzLl9hY3RpdmVTdHJlYW1SZXNwb25zZXMuZGVsZXRlKHJlc3BvbnNlKVxuICAgICAgYXdhaXQgdGhpcy5fcnVuU3RyZWFtQ2xvc2VDYWxsYmFja3MocmVzcG9uc2UpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIGNsb3NlIGNhbGxiYWNrcyBvZiBhIGZpbmlzaGVkIG9yIGFib3J0ZWQgc3RyZWFtIGV4YWN0bHkgb25jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3Jlc3BvbnNlLmpzXCIpLmRlZmF1bHR9IHJlc3BvbnNlIC0gRmluaXNoZWQgc3RyZWFtLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBldmVyeSBjYWxsYmFjayByYW4uXG4gICAqL1xuICBhc3luYyBfcnVuU3RyZWFtQ2xvc2VDYWxsYmFja3MocmVzcG9uc2UpIHtcbiAgICBpZiAocmVzcG9uc2Uuc3RyZWFtQ2xvc2VDYWxsYmFja3Muc2l6ZSA9PT0gMCkgcmV0dXJuXG5cbiAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHJlc3BvbnNlLnN0cmVhbUNsb3NlQ2FsbGJhY2tzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvclBheWxvYWQgPSB7XG4gICAgICAgICAgY29udGV4dDoge2NsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50LCBzdGFnZTogXCJzdHJlYW0tY2xvc2UtY2FsbGJhY2tcIn0sXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RXJyb3JFdmVudHMoKS5lbWl0KFwiZnJhbWV3b3JrLWVycm9yXCIsIGVycm9yUGF5bG9hZClcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmdldEVycm9yRXZlbnRzKCkuZW1pdChcImFsbC1lcnJvclwiLCB7Li4uZXJyb3JQYXlsb2FkLCBlcnJvclR5cGU6IFwiZnJhbWV3b3JrLWVycm9yXCJ9KVxuICAgICAgfVxuICAgIH1cbiAgICByZXNwb25zZS5zdHJlYW1DbG9zZUNhbGxiYWNrcy5jbGVhcigpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzaG91bGQgY2xvc2UgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3JlcXVlc3QuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdH0gcmVxdWVzdCAtIFJlcXVlc3Qgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBjb25uZWN0aW9uIHNob3VsZCBiZSBjbG9zZWQuXG4gICAqL1xuICBzaG91bGRDbG9zZUNvbm5lY3Rpb24ocmVxdWVzdCkge1xuICAgIGNvbnN0IGh0dHBWZXJzaW9uID0gcmVxdWVzdC5odHRwVmVyc2lvbigpXG4gICAgY29uc3QgY29ubmVjdGlvbkhlYWRlciA9IHJlcXVlc3QuaGVhZGVyKFwiY29ubmVjdGlvblwiKT8udG9Mb3dlckNhc2UoKT8udHJpbSgpXG4gICAgY29uc3QgY29ubmVjdGlvblRva2VucyA9IGNvbm5lY3Rpb25IZWFkZXJcbiAgICAgID8gY29ubmVjdGlvbkhlYWRlci5zcGxpdChcIixcIikubWFwKCh0b2tlbikgPT4gdG9rZW4udHJpbSgpKS5maWx0ZXIoQm9vbGVhbilcbiAgICAgIDogW11cblxuICAgIGlmIChodHRwVmVyc2lvbiA9PSBcIndlYnNvY2tldFwiKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoY29ubmVjdGlvblRva2Vucy5pbmNsdWRlcyhcImNsb3NlXCIpKSByZXR1cm4gdHJ1ZVxuXG4gICAgaWYgKGh0dHBWZXJzaW9uID09IFwiMS4wXCIgJiYgY29ubmVjdGlvbkhlYWRlciAhPSBcImtlZXAtYWxpdmVcIikgcmV0dXJuIHRydWVcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGZvciB0aGUgc3RhdHVzIGNvZGVzIHRoYXQgUkZDIDcyMzAgwqczLjMuMyBkZWNsYXJlc1xuICogY2Fubm90IGNhcnJ5IGEgbWVzc2FnZSBib2R5OiBldmVyeSAxeHggaW5mb3JtYXRpb25hbCwgMjA0IE5vXG4gKiBDb250ZW50LCBhbmQgMzA0IE5vdCBNb2RpZmllZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNDb2RlIC0gSFRUUCBzdGF0dXMgY29kZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIHN0YXR1cyBjb2RlIGZvcmJpZHMgYSByZXNwb25zZSBib2R5LlxuICovXG5mdW5jdGlvbiBpc05vQm9keVN0YXR1c0NvZGUoc3RhdHVzQ29kZSkge1xuICByZXR1cm4gKHN0YXR1c0NvZGUgPj0gMTAwICYmIHN0YXR1c0NvZGUgPCAyMDApIHx8IHN0YXR1c0NvZGUgPT09IDIwNCB8fCBzdGF0dXNDb2RlID09PSAzMDRcbn1cbiJdfQ==
|
|
790
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUE7QUFDM0IsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDakMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUM5QixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sU0FBUyxDQUFBO0FBQ25DLE9BQU8sWUFBWSxNQUFNLDhCQUE4QixDQUFBO0FBQ3ZELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUN4RCxPQUFPLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQTtBQUNwQyxPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUE7QUFDbEMsT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxFQUFDLHVCQUF1QixFQUFFLHdCQUF3QixFQUFFLHdCQUF3QixFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFDckgsT0FBTyxnQkFBZ0IsTUFBTSx3QkFBd0IsQ0FBQTtBQUVyRDs7OztHQUlHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxLQUFLO0lBQzlCLE9BQU87UUFDTCxVQUFVLEVBQUUsS0FBSyxDQUFDLElBQUk7UUFDdEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1FBQ3RCLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7S0FDekMsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3QyxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtJQUMzQixLQUFLLEdBQUcsU0FBUyxDQUFBO0lBRWpCOzt5QkFFcUI7SUFDckIsd0JBQXdCLEdBQUcsS0FBSyxDQUFBO0lBRWhDOzt5QkFFcUI7SUFDckIseUJBQXlCLEdBQUcsS0FB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RyxJQUFJLFVBQVUsS0FBSyxHQUFHLENBQUE7QUFDNUYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQge2Vuc3VyZUVycm9yfSBmcm9tIFwidHlwYW5pY1wiXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCIuLi8uLi91dGlscy9ldmVudC1lbWl0dGVyLmpzXCJcbmltcG9ydCB7SHR0cFJlcXVlc3RCb2R5VG9vTGFyZ2VFcnJvcn0gZnJvbSBcIi4vZXJyb3JzLmpzXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgUmVxdWVzdCBmcm9tIFwiLi9yZXF1ZXN0LmpzXCJcbmltcG9ydCBSZXF1ZXN0UnVubmVyIGZyb20gXCIuL3JlcXVlc3QtcnVubmVyLmpzXCJcbmltcG9ydCB7YWRkQWNjZXB0RW5jb2RpbmdUb1ZhcnksIGFwcGx5UmVzcG9uc2VDb21wcmVzc2lvbiwgbmVnb3RpYXRlQ29udGVudEVuY29kaW5nfSBmcm9tIFwiLi9yZXNwb25zZS1jb21wcmVzc2lvbi5qc1wiXG5pbXBvcnQgV2Vic29ja2V0U2Vzc2lvbiBmcm9tIFwiLi93ZWJzb2NrZXQtc2Vzc2lvbi5qc1wiXG5cbi8qKlxuICogUnVucyBiYWQgcmVxdWVzdCBkZXRhaWxzLlxuICogQHBhcmFtIHtFcnJvciAmIHt2ZWxvY2lvdXNDb250ZXh0PzogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fX0gZXJyb3IgLSBFcnJvciBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gU2FmZSBiYWQtcmVxdWVzdCBkZXRhaWxzIGZvciBsb2dzLlxuICovXG5mdW5jdGlvbiBiYWRSZXF1ZXN0RGV0YWlscyhlcnJvcikge1xuICByZXR1cm4ge1xuICAgIGVycm9yQ2xhc3M6IGVycm9yLm5hbWUsXG4gICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICB2ZWxvY2lvdXNDb250ZXh0OiBlcnJvci52ZWxvY2lvdXNDb250ZXh0XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVvbGljaW91c0h0dHBTZXJ2ZXJDbGllbnQge1xuICBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgc3RhdGUgPSBcImluaXRpYWxcIlxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgZG9uZS1yZXF1ZXN0cyBkcmFpbiBpcyBjdXJyZW50bHkgc2VuZGluZyByZXNwb25zZXMgZm9yIHRoaXMgY2xpZW50LlxuICAgKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgX2RvbmVSZXF1ZXN0c0RyYWluQWN0aXZlID0gZmFsc2VcblxuICAvKipcbiAgICogV2hldGhlciBhbm90aGVyIGRyYWluIHdhcyByZXF1ZXN0ZWQgd2hpbGUgb25lIHdhcyBhbHJlYWR5IGFjdGl2ZS5cbiAgICogQHR5cGUge2Jvb2xlYW59ICovXG4gIF9kb25lUmVxdWVzdHNEcmFpblBlbmRpbmcgPSBmYWxzZVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5jbGllbnRDb3VudCAtIENsaWVudCBjb3VudC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5yZW1vdGVBZGRyZXNzXSAtIFJlbW90ZSBhZGRyZXNzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NsaWVudENvdW50LCBjb25maWd1cmF0aW9uLCByZW1vdGVBZGRyZXNzfSkge1xuICAgIGlmICghY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29uZmlndXJhdGlvbiBnaXZlblwiKVxuXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMpXG4gICAgdGhpcy5jbGllbnRDb3VudCA9IGNsaWVudENvdW50XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMucmVtb3RlQWRkcmVzcyA9IHJlbW90ZUFkZHJlc3NcblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7UmVxdWVzdFJ1bm5lcltdfSAqL1xuICAgIHRoaXMucmVxdWVzdFJ1bm5lcnMgPSBbXVxuXG4gICAgLyoqIEB0eXBlIHtTZXQ8KHJlc3VsdDogXCJjb21wbGV0ZWRcIiB8IFwiYWJvcnRlZFwiKSA9PiBQcm9taXNlPHZvaWQ+Pn0gKi9cbiAgICB0aGlzLnBlbmRpbmdGaWxlUmVzcG9uc2VzID0gbmV3IFNldCgpXG5cbiAgICAvKipcbiAgICAgKiBTdHJlYW1zIHRoYXQgaGF2ZSBzdGFydGVkIGJ1dCBoYXZlIG5vdCBmaW5pc2hlZCBvciBiZWVuIGFib3J0ZWQgeWV0LlxuICAgICAqIEB0eXBlIHtNYXA8aW1wb3J0KFwiLi9yZXNwb25zZS5qc1wiKS5kZWZhdWx0LCB7Y2xpZW50Q291bnQ6IG51bWJlciwgcmVxdWVzdDogaW1wb3J0KFwiLi9yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9Pn0gKi9cbiAgICB0aGlzLl9hY3RpdmVTdHJlYW1SZXNwb25zZXMgPSBuZXcgTWFwKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNlbmQgYmFkIHVwZ3JhZGUgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gTWVzc2FnZSB0ZXh0LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBfc2VuZEJhZFVwZ3JhZGVSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgY29uc3QgaHR0cFZlcnNpb24gPSB0aGlzLmN1cnJlbnRSZXF1ZXN0Py5odHRwVmVyc2lvbigpIHx8IFwiMS4xXCJcbiAgICBjb25zdCBib2R5ID0gYCR7bWVzc2FnZX1cXG5gXG4gICAgY29uc3QgaGVhZGVycyA9IFtcbiAgICAgIGBIVFRQLyR7aHR0cFZlcnNpb259IDQwMCBCYWQgUmVxdWVzdGAsXG4gICAgICBcIkNvbm5lY3Rpb246IENsb3NlXCIsXG4gICAgICBcIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFwiLFxuICAgICAgYENvbnRlbnQtTGVuZ3RoOiAke0J1ZmZlci5ieXRlTGVuZ3RoKGJvZHksIFwidXRmOFwiKX1gLFxuICAgICAgXCJcIixcbiAgICAgIGJvZHlcbiAgICBdLmpvaW4oXCJcXHJcXG5cIilcblxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgaGVhZGVycylcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNlbmQgYmFkIHJlcXVlc3QgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gUmVzcG9uc2UgbWVzc2FnZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3NlbmRCYWRSZXF1ZXN0UmVzcG9uc2UobWVzc2FnZSkge1xuICAgIGNvbnN0IGh0dHBWZXJzaW9uID0gdGhpcy5jdXJyZW50UmVxdWVzdD8uaHR0cFZlcnNpb24oKSB8fCBcIjEuMVwiXG4gICAgY29uc3QgYm9keSA9IGAke21lc3NhZ2V9XFxuYFxuICAgIGNvbnN0IGhlYWRlcnMgPSBbXG4gICAgICBgSFRUUC8ke2h0dHBWZXJzaW9ufSA0MDAgQmFkIFJlcXVlc3RgLFxuICAgICAgXCJDb25uZWN0aW9uOiBDbG9zZVwiLFxuICAgICAgXCJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcIixcbiAgICAgIGBDb250ZW50LUxlbmd0aDogJHtCdWZmZXIuYnl0ZUxlbmd0aChib2R5LCBcInV0ZjhcIil9YCxcbiAgICAgIFwiXCIsXG4gICAgICBib2R5XG4gICAgXS5qb2luKFwiXFxyXFxuXCIpXG5cbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwib3V0cHV0XCIsIGhlYWRlcnMpXG4gICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBkZXRlcm1pbmlzdGljIHJlcXVlc3QtYm9keSBsaW1pdCByZXNwb25zZSBhbmQgY2xvc2VzIHRoZSBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBfc2VuZFBheWxvYWRUb29MYXJnZVJlc3BvbnNlKCkge1xuICAgIGNvbnN0IGh0dHBWZXJzaW9uID0gdGhpcy5jdXJyZW50UmVxdWVzdD8uaHR0cFZlcnNpb24oKSB8fCBcIjEuMVwiXG4gICAgY29uc3QgYm9keSA9IFwiUGF5bG9hZCBUb28gTGFyZ2VcXG5cIlxuICAgIGNvbnN0IGhlYWRlcnMgPSBbXG4gICAgICBgSFRUUC8ke2h0dHBWZXJzaW9ufSA0MTMgUGF5bG9hZCBUb28gTGFyZ2VgLFxuICAgICAgXCJDb25uZWN0aW9uOiBDbG9zZVwiLFxuICAgICAgXCJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcIixcbiAgICAgIGBDb250ZW50LUxlbmd0aDogJHtCdWZmZXIuYnl0ZUxlbmd0aChib2R5LCBcInV0ZjhcIil9YCxcbiAgICAgIFwiXCIsXG4gICAgICBib2R5XG4gICAgXS5qb2luKFwiXFxyXFxuXCIpXG5cbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwib3V0cHV0XCIsIGhlYWRlcnMpXG4gICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYW5kbGUgYmFkIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gRXJyb3IgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGhhbmRsZUJhZFJlcXVlc3QoZXJyb3IpIHtcbiAgICB0aGlzLmxvZ2dlci53YXJuKCgpID0+IFtcIkZhaWxlZCB0byBwYXJzZSBIVFRQIHJlcXVlc3RcIiwgYmFkUmVxdWVzdERldGFpbHMoLyoqIEB0eXBlIHtFcnJvciAmIHt2ZWxvY2lvdXNDb250ZXh0PzogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fX0gKi8gKGVycm9yKSldKVxuXG4gICAgaWYgKHRoaXMuY3VycmVudFJlcXVlc3QgJiYgXCJnZXRSZXF1ZXN0UGFyc2VyXCIgaW4gdGhpcy5jdXJyZW50UmVxdWVzdCkge1xuICAgICAgY29uc3QgaHR0cFJlcXVlc3QgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSAqLyAodGhpcy5jdXJyZW50UmVxdWVzdClcblxuICAgICAgaHR0cFJlcXVlc3QuZ2V0UmVxdWVzdFBhcnNlcigpLmRlc3Ryb3koKVxuICAgIH1cblxuICAgIHRoaXMuY3VycmVudFJlcXVlc3QgPSB1bmRlZmluZWRcbiAgICB0aGlzLnN0YXRlID0gXCJpbml0aWFsXCJcblxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEh0dHBSZXF1ZXN0Qm9keVRvb0xhcmdlRXJyb3IpIHtcbiAgICAgIHRoaXMuX3NlbmRQYXlsb2FkVG9vTGFyZ2VSZXNwb25zZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NlbmRCYWRSZXF1ZXN0UmVzcG9uc2UoXCJCYWQgUmVxdWVzdFwiKVxuICAgIH1cbiAgfVxuXG4gIGV4ZWN1dGVDdXJyZW50UmVxdWVzdCA9ICgpID0+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcImV4ZWN1dGVDdXJyZW50UmVxdWVzdFwiKVxuXG4gICAgY29uc3QgY3VycmVudFJlcXVlc3QgPSB0aGlzLmN1cnJlbnRSZXF1ZXN0XG5cbiAgICBpZiAoIWN1cnJlbnRSZXF1ZXN0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjdXJyZW50IHJlcXVlc3RcIilcbiAgICBjb25zdCByZWRhY3RvciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRMb2dSZWRhY3RvcigpXG4gICAgY29uc3Qgc2Vuc2l0aXZlVmFsdWVzID0gcmVkYWN0b3IucmVxdWVzdFNlbnNpdGl2ZVZhbHVlcyhjdXJyZW50UmVxdWVzdClcblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcImV4ZWN1dGVDdXJyZW50UmVxdWVzdCByZXF1ZXN0XCIsIHtcbiAgICAgIGNsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50LFxuICAgICAgaHR0cE1ldGhvZDogY3VycmVudFJlcXVlc3QuaHR0cE1ldGhvZCgpLFxuICAgICAgaHR0cFZlcnNpb246IGN1cnJlbnRSZXF1ZXN0Lmh0dHBWZXJzaW9uKCksXG4gICAgICBwYXRoOiByZWRhY3Rvci5yZWRhY3RQYXRoKGN1cnJlbnRSZXF1ZXN0LnBhdGgoKSwgc2Vuc2l0aXZlVmFsdWVzKSxcbiAgICAgIHF1ZXVlTGVuZ3RoOiB0aGlzLnJlcXVlc3RSdW5uZXJzLmxlbmd0aFxuICAgIH1dKVxuXG4gICAgaWYgKHRoaXMuX2lzV2Vic29ja2V0VXBncmFkZShjdXJyZW50UmVxdWVzdCkpIHtcbiAgICAgIHRoaXMuX3VwZ3JhZGVUb1dlYnNvY2tldCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBXZSBhcmUgZG9uZSBwYXJzaW5nIHRoZSBnaXZlbiByZXF1ZXN0IGFuZCBjYW4gdGhlb3JldGljYWxseSBzdGFydCBwYXJzaW5nIGEgbmV3IG9uZSwgYmVmb3JlIHRoZSBjdXJyZW50IHJlcXVlc3QgaXMgZG9uZSAtIHNvIHJlc2V0IHRoZSBzdGF0ZS5cbiAgICB0aGlzLnN0YXRlID0gXCJpbml0aWFsXCJcblxuICAgIGNvbnN0IHJlcXVlc3RSdW5uZXIgPSBuZXcgUmVxdWVzdFJ1bm5lcih7XG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICByZXF1ZXN0OiBjdXJyZW50UmVxdWVzdFxuICAgIH0pXG5cbiAgICB0aGlzLnJlcXVlc3RSdW5uZXJzLnB1c2gocmVxdWVzdFJ1bm5lcilcblxuICAgIC8vIEEgc3RyZWFtaW5nIHJlc3BvbnNlIGVtaXRzIGl0cyBoZWFkZXJzIGFuZCBjaHVua3MgdG8gdGhlIGNsaWVudCB3aGlsZVxuICAgIC8vIHRoZSByZXF1ZXN0IGlzIHN0aWxsIHJ1bm5pbmcsIHNvIHRoZSByZXNwb25zZSBuZWVkcyB0aGUgb3duaW5nIGNsaWVudFxuICAgIC8vIGFzIGl0cyB0cmFuc3BvcnQgc2luayBiZWZvcmUgdGhlIGhhbmRsZXIgcnVucy4gU3ViLXJlcXVlc3RzIChlLmcuXG4gICAgLy8gd2Vic29ja2V0IHJlcXVlc3QgcGF5bG9hZHMpIGhhdmUgbm8gc29ja2V0IGFuZCBrZWVwIHRyYW5zcG9ydCBudWxsO1xuICAgIC8vIHRoZWlyIHJlc3BvbnNlcyBmYWlsIGxvdWRseSBpZiB0aGV5IGF0dGVtcHQgdG8gc3RyZWFtLlxuICAgIGNvbnN0IHNvY2tldFJlcXVlc3QgPSBjdXJyZW50UmVxdWVzdFxuICAgIHJlcXVlc3RSdW5uZXIucmVzcG9uc2UudHJhbnNwb3J0ID0gdGhpc1xuICAgIHJlcXVlc3RSdW5uZXIucmVzcG9uc2UudHJhbnNwb3J0UmVxdWVzdCA9IHNvY2tldFJlcXVlc3RcblxuICAgIHJlcXVlc3RSdW5uZXIuZXZlbnRzLm9uKFwiZG9uZVwiLCB0aGlzLnJlcXVlc3REb25lKVxuICAgIHJlcXVlc3RSdW5uZXIucnVuKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG9uIHdyaXRlLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgb25Xcml0ZShkYXRhKSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW1wib25Xcml0ZSBzdGFydFwiLCB7XG4gICAgICBjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCxcbiAgICAgIGxlbmd0aDogZGF0YS5sZW5ndGgsXG4gICAgICBzdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICB9XSlcblxuICAgIGlmICh0aGlzLndlYnNvY2tldFNlc3Npb24pIHtcbiAgICAgIHRoaXMud2Vic29ja2V0U2Vzc2lvbi5vbkRhdGEoZGF0YSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvKipcbiAgICAgICAqIFJlbWFpbmluZy5cbiAgICAgICAqIEB0eXBlIHtCdWZmZXIgfCB1bmRlZmluZWR9ICovXG4gICAgICBsZXQgcmVtYWluaW5nID0gZGF0YVxuXG4gICAgICB3aGlsZSAocmVtYWluaW5nKSB7XG4gICAgICAgIGlmIChyZW1haW5pbmcubGVuZ3RoIDw9IDApIGJyZWFrXG5cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT0gXCJpbml0aWFsXCIpIHtcbiAgICAgICAgICBjb25zdCByZW1haW5pbmdMZW5ndGggPSByZW1haW5pbmcubGVuZ3RoXG5cbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJvbldyaXRlIGNyZWF0aW5nIHJlcXVlc3QgcGFyc2VyXCIsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCwgcmVtYWluaW5nTGVuZ3RofV0pXG4gICAgICAgICAgdGhpcy5jdXJyZW50UmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHtjbGllbnQ6IHRoaXMsIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbn0pXG4gICAgICAgICAgdGhpcy5jdXJyZW50UmVxdWVzdC5yZXF1ZXN0UGFyc2VyLmV2ZW50cy5vbihcImRvbmVcIiwgdGhpcy5leGVjdXRlQ3VycmVudFJlcXVlc3QpXG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IFwicmVxdWVzdFN0YXJ0ZWRcIlxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgIT0gXCJyZXF1ZXN0U3RhcnRlZFwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXRlIGZvciBjbGllbnQ6ICR7dGhpcy5zdGF0ZX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRSZXF1ZXN0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjdXJyZW50IHJlcXVlc3RcIilcblxuICAgICAgICByZW1haW5pbmcgPSB0aGlzLmN1cnJlbnRSZXF1ZXN0LmZlZWQocmVtYWluaW5nKVxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJvbldyaXRlIGZlZCBwYXJzZXJcIiwge1xuICAgICAgICAgIGNsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50LFxuICAgICAgICAgIGhhc1JlbWFpbmluZzogQm9vbGVhbihyZW1haW5pbmc/Lmxlbmd0aCksXG4gICAgICAgICAgcmVtYWluaW5nTGVuZ3RoOiByZW1haW5pbmc/Lmxlbmd0aCB8fCAwLFxuICAgICAgICAgIHBhcnNlckNvbXBsZXRlZDogdGhpcy5jdXJyZW50UmVxdWVzdD8uZ2V0UmVxdWVzdFBhcnNlcigpLmhhc0NvbXBsZXRlZFxuICAgICAgICB9XSlcblxuICAgICAgICBpZiAocmVtYWluaW5nICYmIHJlbWFpbmluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdFBhcnNlciA9IHRoaXMuY3VycmVudFJlcXVlc3QuZ2V0UmVxdWVzdFBhcnNlcigpXG5cbiAgICAgICAgICBpZiAoIXJlcXVlc3RQYXJzZXIuaGFzQ29tcGxldGVkKSB7XG4gICAgICAgICAgICBjb25zdCByZW1haW5pbmdMZW5ndGggPSByZW1haW5pbmcubGVuZ3RoXG5cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIm9uV3JpdGUgd2FpdGluZyBmb3IgbW9yZSBkYXRhXCIsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCwgcmVtYWluaW5nTGVuZ3RofV0pXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuc3RhdGUgPSBcImluaXRpYWxcIlxuICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ0xlbmd0aCA9IHJlbWFpbmluZy5sZW5ndGhcblxuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIm9uV3JpdGUgcGFyc2VyIGNvbXBsZXRlZCB3aXRoIHJlbWFpbmluZyBieXRlc1wiLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnQsIHJlbWFpbmluZ0xlbmd0aH1dKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJvbldyaXRlIGVuZFwiLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnQsIHN0YXRlOiB0aGlzLnN0YXRlLCBxdWV1ZUxlbmd0aDogdGhpcy5yZXF1ZXN0UnVubmVycy5sZW5ndGh9XSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5oYW5kbGVCYWRSZXF1ZXN0KGVuc3VyZUVycm9yKGVycm9yKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBpcyB3ZWJzb2NrZXQgdXBncmFkZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3JlcXVlc3QuanNcIikuZGVmYXVsdH0gcmVxdWVzdCAtIFJlcXVlc3Qgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHdlYnNvY2tldCB1cGdyYWRlLlxuICAgKi9cbiAgX2lzV2Vic29ja2V0VXBncmFkZShyZXF1ZXN0KSB7XG4gICAgY29uc3QgdXBncmFkZUhlYWRlciA9IHJlcXVlc3QuaGVhZGVyKFwidXBncmFkZVwiKT8udG9Mb3dlckNhc2UoKVxuICAgIGNvbnN0IGNvbm5lY3Rpb25IZWFkZXIgPSByZXF1ZXN0LmhlYWRlcihcImNvbm5lY3Rpb25cIik/LnRvTG93ZXJDYXNlKClcblxuICAgIHJldHVybiBCb29sZWFuKHVwZ3JhZGVIZWFkZXIgPT0gXCJ3ZWJzb2NrZXRcIiAmJiBjb25uZWN0aW9uSGVhZGVyPy5pbmNsdWRlcyhcInVwZ3JhZGVcIikpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB1cGdyYWRlIHRvIHdlYnNvY2tldC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3VwZ3JhZGVUb1dlYnNvY2tldCgpIHtcbiAgICBpZiAoIXRoaXMuY3VycmVudFJlcXVlc3QpIHRocm93IG5ldyBFcnJvcihcIk5vIGN1cnJlbnQgcmVxdWVzdFwiKVxuXG4gICAgY29uc3Qgc2VjV2Vic29ja2V0S2V5ID0gdGhpcy5jdXJyZW50UmVxdWVzdC5oZWFkZXIoXCJzZWMtd2Vic29ja2V0LWtleVwiKVxuXG4gICAgaWYgKCFzZWNXZWJzb2NrZXRLZXkpIHtcbiAgICAgIHRoaXMuX3NlbmRCYWRVcGdyYWRlUmVzcG9uc2UoXCJNaXNzaW5nIFNlYy1XZWJTb2NrZXQtS2V5IGhlYWRlclwiKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgd2Vic29ja2V0QWNjZXB0S2V5ID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGExXCIpXG4gICAgICAudXBkYXRlKGAke3NlY1dlYnNvY2tldEtleX0yNThFQUZBNS1FOTE0LTQ3REEtOTVDQS1DNUFCMERDODVCMTFgLCBcImJpbmFyeVwiKVxuICAgICAgLmRpZ2VzdChcImJhc2U2NFwiKVxuICAgIGNvbnN0IGh0dHBWZXJzaW9uID0gdGhpcy5jdXJyZW50UmVxdWVzdC5odHRwVmVyc2lvbigpIHx8IFwiMS4xXCJcbiAgICBjb25zdCByZXNwb25zZUxpbmVzID0gW1xuICAgICAgYEhUVFAvJHtodHRwVmVyc2lvbn0gMTAxIFN3aXRjaGluZyBQcm90b2NvbHNgLFxuICAgICAgXCJVcGdyYWRlOiB3ZWJzb2NrZXRcIixcbiAgICAgIFwiQ29ubmVjdGlvbjogVXBncmFkZVwiLFxuICAgICAgYFNlYy1XZWJTb2NrZXQtQWNjZXB0OiAke3dlYnNvY2tldEFjY2VwdEtleX1gLFxuICAgICAgXCJcIixcbiAgICAgIFwiXCJcbiAgICBdXG4gICAgY29uc3QgcmVzcG9uc2UgPSByZXNwb25zZUxpbmVzLmpvaW4oXCJcXHJcXG5cIilcblxuICAgIGNvbnN0IG1lc3NhZ2VIYW5kbGVyUmVzb2x2ZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0TWVzc2FnZUhhbmRsZXJSZXNvbHZlcj8uKClcbiAgICBsZXQgbWVzc2FnZUhhbmRsZXJcbiAgICBsZXQgbWVzc2FnZUhhbmRsZXJQcm9taXNlXG5cbiAgICBpZiAobWVzc2FnZUhhbmRsZXJSZXNvbHZlcikge1xuICAgICAgY29uc3QgcmVzb2x2ZWRIYW5kbGVyID0gbWVzc2FnZUhhbmRsZXJSZXNvbHZlcih7XG4gICAgICAgIGNsaWVudDogdGhpcyxcbiAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgICByZXF1ZXN0OiB0aGlzLmN1cnJlbnRSZXF1ZXN0XG4gICAgICB9KVxuXG4gICAgICBjb25zdCByZXNvbHZlZFRoZW5hYmxlID0gLyoqIEB0eXBlIHt7dGhlbj86ICguLi5hcmdzOiBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4pID0+IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fX0gKi8gKHJlc29sdmVkSGFuZGxlcilcblxuICAgICAgaWYgKHJlc29sdmVkVGhlbmFibGU/LnRoZW4pIHtcbiAgICAgICAgbWVzc2FnZUhhbmRsZXJQcm9taXNlID0gLyoqIEB0eXBlIHtQcm9taXNlPGltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuV2Vic29ja2V0TWVzc2FnZUhhbmRsZXIgfCB2b2lkPn0gKi8gKHJlc29sdmVkSGFuZGxlcilcbiAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZWRIYW5kbGVyKSB7XG4gICAgICAgIG1lc3NhZ2VIYW5kbGVyID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLldlYnNvY2tldE1lc3NhZ2VIYW5kbGVyfSAqLyAocmVzb2x2ZWRIYW5kbGVyKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMud2Vic29ja2V0U2Vzc2lvbiA9IG5ldyBXZWJzb2NrZXRTZXNzaW9uKHtcbiAgICAgIGNsaWVudDogdGhpcyxcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgIHVwZ3JhZGVSZXF1ZXN0OiB0aGlzLmN1cnJlbnRSZXF1ZXN0LFxuICAgICAgbWVzc2FnZUhhbmRsZXI6IG1lc3NhZ2VIYW5kbGVyLFxuICAgICAgbWVzc2FnZUhhbmRsZXJQcm9taXNlOiBtZXNzYWdlSGFuZGxlclByb21pc2VcbiAgICB9KVxuICAgIHRoaXMud2Vic29ja2V0U2Vzc2lvbi5ldmVudHMub24oXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICAvLyBQYXVzZWQgc2Vzc2lvbnMgc3Vydml2ZSB0aGUgc29ja2V0IGNsb3NlOyBkb24ndCBkZXN0cm95KCkuXG4gICAgICAvLyBUaGUgZ3JhY2UtZXhwaXJ5IHBhdGggKF9maW5hbGl6ZUdyYWNlRXhwaXJ5KSB3aWxsIGRlc3Ryb3lcbiAgICAgIC8vIHRoZW0gcGVybWFuZW50bHkgaWYgcmVzdW1lIGRvZXNuJ3QgaGFwcGVuIGluIHRpbWUuXG4gICAgICBpZiAoIXRoaXMud2Vic29ja2V0U2Vzc2lvbj8uaXNQYXVzZWQoKSkge1xuICAgICAgICB0aGlzLndlYnNvY2tldFNlc3Npb24/LmRlc3Ryb3koKVxuICAgICAgfVxuICAgICAgdGhpcy53ZWJzb2NrZXRTZXNzaW9uID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgICB9KVxuICAgIHRoaXMud2Vic29ja2V0U2Vzc2lvbi5ldmVudHMub24oXCJvd25lcnNoaXBDbGFpbWVkXCIsICh7c2Vzc2lvbklkfSkgPT4ge1xuICAgICAgdGhpcy5ldmVudHMuZW1pdChcIndlYnNvY2tldFNlc3Npb25Pd25lZFwiLCB7c2Vzc2lvbklkfSlcbiAgICB9KVxuICAgIHRoaXMud2Vic29ja2V0U2Vzc2lvbi5ldmVudHMub24oXCJvd25lcnNoaXBSZWxlYXNlZFwiLCAoe3Nlc3Npb25JZH0pID0+IHtcbiAgICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJ3ZWJzb2NrZXRTZXNzaW9uUmVsZWFzZWRcIiwge3Nlc3Npb25JZH0pXG4gICAgfSlcbiAgICB0aGlzLnN0YXRlID0gXCJ3ZWJzb2NrZXRcIlxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgcmVzcG9uc2UpXG4gICAgdm9pZCB0aGlzLndlYnNvY2tldFNlc3Npb24uaW5pdGlhbGl6ZUNoYW5uZWwoKVxuICAgIHRoaXMud2Vic29ja2V0U2Vzc2lvbi5zZW5kU2Vzc2lvbkVzdGFibGlzaGVkKClcbiAgfVxuXG4gIHJlcXVlc3REb25lID0gKCkgPT4ge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcInJlcXVlc3REb25lXCIsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCwgcXVldWVMZW5ndGg6IHRoaXMucmVxdWVzdFJ1bm5lcnMubGVuZ3RofV0pXG5cbiAgICByZXR1cm4gdGhpcy5fZHJhaW5Eb25lUmVxdWVzdHMoKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJGYWlsZWQgd2hpbGUgc2VuZGluZyBkb25lIHJlcXVlc3RzXCIsIGVycm9yKVxuICAgICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmFpbnMgZG9uZSByZXF1ZXN0cyBvbmUgYXQgYSB0aW1lLiBBIHJ1bm5lciBpcyBzaGlmdGVkIG91dCBvZiB0aGUgcXVldWUgYmVmb3JlXG4gICAqIGl0cyByZXNwb25zZSBmaW5pc2hlcyBzZW5kaW5nIChhc3luYyBjb21wcmVzc2lvbiwgZmlsZSB0cmFuc2ZlciksIHNvIGFuXG4gICAqIG92ZXJsYXBwaW5nIGRyYWluIHdvdWxkIG90aGVyd2lzZSBwaWNrIHVwIHRoZSBuZXh0IHJ1bm5lciBhbmQgcmVvcmRlciBwaXBlbGluZWRcbiAgICogc29ja2V0IHdyaXRlcy4gQ2FsbHMgdGhhdCBhcnJpdmUgd2hpbGUgYSBkcmFpbiBpcyBhY3RpdmUgYXJlIGZvbGRlZCBpbnRvIGl0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGV2ZXJ5IGRvbmUgcmVzcG9uc2UgaGFzIGJlZW4gc2VudC5cbiAgICovXG4gIGFzeW5jIF9kcmFpbkRvbmVSZXF1ZXN0cygpIHtcbiAgICBpZiAodGhpcy5fZG9uZVJlcXVlc3RzRHJhaW5BY3RpdmUpIHtcbiAgICAgIHRoaXMuX2RvbmVSZXF1ZXN0c0RyYWluUGVuZGluZyA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2RvbmVSZXF1ZXN0c0RyYWluQWN0aXZlID0gdHJ1ZVxuXG4gICAgdHJ5IHtcbiAgICAgIGRvIHtcbiAgICAgICAgdGhpcy5fZG9uZVJlcXVlc3RzRHJhaW5QZW5kaW5nID0gZmFsc2VcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kRG9uZVJlcXVlc3RzKClcbiAgICAgIH0gd2hpbGUgKHRoaXMuX2RvbmVSZXF1ZXN0c0RyYWluUGVuZGluZylcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fZG9uZVJlcXVlc3RzRHJhaW5BY3RpdmUgPSBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNlbmREb25lUmVxdWVzdHMoKSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHJlcXVlc3RSdW5uZXIgPSB0aGlzLnJlcXVlc3RSdW5uZXJzWzBdXG4gICAgICBjb25zdCByZXF1ZXN0ID0gcmVxdWVzdFJ1bm5lcj8uZ2V0UmVxdWVzdCgpXG5cbiAgICAgIGlmIChyZXF1ZXN0UnVubmVyPy5nZXRTdGF0ZSgpID09IFwiZG9uZVwiKSB7XG4gICAgICAgIGNvbnN0IGh0dHBWZXJzaW9uID0gcmVxdWVzdC5odHRwVmVyc2lvbigpXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25IZWFkZXIgPSByZXF1ZXN0LmhlYWRlcihcImNvbm5lY3Rpb25cIik/LnRvTG93ZXJDYXNlKCk/LnRyaW0oKVxuICAgICAgICBjb25zdCBzaG91bGRDbG9zZUNvbm5lY3Rpb24gPSB0aGlzLnNob3VsZENsb3NlQ29ubmVjdGlvbihyZXF1ZXN0KVxuXG4gICAgICAgIHRoaXMucmVxdWVzdFJ1bm5lcnMuc2hpZnQoKVxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJzZW5kRG9uZVJlcXVlc3RzIHNoaWZ0ZWQgcXVldWVcIiwge2NsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50LCBxdWV1ZUxlbmd0aDogdGhpcy5yZXF1ZXN0UnVubmVycy5sZW5ndGh9XSlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRSZXNwb25zZShyZXF1ZXN0UnVubmVyKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgVmVsb2Npb3VzIGNsaWVudCAke3RoaXMuY2xpZW50Q291bnR9IGZhaWxlZCB3aGlsZSBzZW5kaW5nIHJlc3BvbnNlYCwgZXJyb3JdKVxuICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFJlcXVlc3QgPT09IHJlcXVlc3QgJiYgdGhpcy5zdGF0ZSA9PT0gXCJpbml0aWFsXCIpIHRoaXMuY3VycmVudFJlcXVlc3QgPSB1bmRlZmluZWRcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW1wic2VuZERvbmVSZXF1ZXN0c1wiLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnQsIGNvbm5lY3Rpb25IZWFkZXIsIGh0dHBWZXJzaW9ufV0pXG5cbiAgICAgICAgaWYgKHNob3VsZENsb3NlQ29ubmVjdGlvbikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtgQ2xvc2luZyB0aGUgY29ubmVjdGlvbiBiZWNhdXNlICR7aHR0cFZlcnNpb259IGFuZCBjb25uZWN0aW9uIGhlYWRlciAke2Nvbm5lY3Rpb25IZWFkZXJ9YCwge2NsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50fV0pXG4gICAgICAgICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgZmluaXNoZWQgcmVzcG9uc2UgdG8gdGhlIGNsaWVudC4gT3ducyB0aGUgZnJhbWV3b3JrLW93bmVkXG4gICAqIGBWYXJ5OiBBY2NlcHQtRW5jb2RpbmdgIGRpbWVuc2lvbiAoZW1pdHRlZCBmb3IgZXZlcnkgc2VsZWN0ZWRcbiAgICogcmVwcmVzZW50YXRpb24g4oCUIHRyYW5zZm9ybWVkLCBpZGVudGl0eSwgNDA2LCBhbmQgZmlsZSDigJQgYW5kIGZvclxuICAgKiBoZWFkZXItcHJlc2VudCBhbmQgaGVhZGVyLWFic2VudCByZXF1ZXN0cyBhbGlrZSwgc28gaXQgaXMgc3RhYmxlIGFjcm9zc1xuICAgKiByZXF1ZXN0cyBvbiB0aGUgc2FtZSBjb25uZWN0aW9uOyBuZXZlciBhZGRlZCB3aGVuIGNvbXByZXNzaW9uIGlzIGRpc2FibGVkLFxuICAgKiB0aGUgcmVzcG9uc2UgaXMgdHJ1bHkgYm9keWxlc3MsIG9yIHRoZSBhcHBsaWNhdGlvbiBzdXBwbGllZCBhIGZpeGVkXG4gICAqIGBDb250ZW50LUVuY29kaW5nYCkgYW5kIHRoZSBmaWxlIDQwNiBydWxlIChhIHNlbmRGaWxlIHJlc3BvbnNlIHdob3NlXG4gICAqIGNsaWVudCBmb3JiaWRzIGlkZW50aXR5IGlzIGFuc3dlcmVkIHdpdGggdGhlIGVtcHR5IDQwNiwgdGhlIGZpbGUgaXMgbmV2ZXJcbiAgICogb3BlbmVkIG9yIHN0cmVhbWVkLCBhbmQgYG9uRmluaXNoZWRgIHNldHRsZXMgb25jZSBhcyBcImNvbXBsZXRlZFwiKS5cbiAgICogQHBhcmFtIHtSZXF1ZXN0UnVubmVyfSByZXF1ZXN0UnVubmVyIC0gUmVxdWVzdCBydW5uZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBzZW5kUmVzcG9uc2UocmVxdWVzdFJ1bm5lcikge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gZGlnZyhyZXF1ZXN0UnVubmVyLCBcInJlc3BvbnNlXCIpXG5cbiAgICAvLyBBIHN0cmVhbWluZyByZXNwb25zZSBhbHJlYWR5IGVtaXR0ZWQgaXRzIHN0YXR1cyBsaW5lLCBoZWFkZXJzLCBldmVyeVxuICAgIC8vIGNodW5rLCBhbmQgdGhlIGNodW5rZWQgdGVybWluYXRvciB0byB0aGUgY2xpZW50IHdoaWxlIHRoZSByZXF1ZXN0IHdhc1xuICAgIC8vIHJ1bm5pbmcuIE5vdGhpbmcgbGVmdCB0byBzZW5kIGhlcmUg4oCUIGp1c3QgbG9nIHRoZSBjb21wbGV0ZWQgcmVxdWVzdC5cbiAgICBpZiAocmVzcG9uc2UuaXNTdHJlYW1pbmcoKSkge1xuICAgICAgYXdhaXQgcmVxdWVzdFJ1bm5lci5sb2dDb21wbGV0ZWRSZXF1ZXN0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3QgPSByZXF1ZXN0UnVubmVyLmdldFJlcXVlc3QoKVxuICAgIGNvbnN0IGZpbGVQYXRoID0gcmVzcG9uc2UuZ2V0RmlsZVBhdGgoKVxuICAgIGNvbnN0IGZpbGVPbkZpbmlzaGVkID0gcmVzcG9uc2UuZ2V0RmlsZU9uRmluaXNoZWQoKVxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpXG4gICAgY29uc3QgY29ubmVjdGlvbkhlYWRlciA9IHJlcXVlc3QuaGVhZGVyKFwiY29ubmVjdGlvblwiKT8udG9Mb3dlckNhc2UoKT8udHJpbSgpXG4gICAgY29uc3QgaHR0cFZlcnNpb24gPSByZXF1ZXN0Lmh0dHBWZXJzaW9uKClcbiAgICBjb25zdCBzaG91bGRDbG9zZUNvbm5lY3Rpb24gPSB0aGlzLnNob3VsZENsb3NlQ29ubmVjdGlvbihyZXF1ZXN0KVxuICAgIGNvbnN0IGhhc0ZpbGVQYXRoID0gdHlwZW9mIGZpbGVQYXRoID09PSBcInN0cmluZ1wiICYmIGZpbGVQYXRoLmxlbmd0aCA+IDBcbiAgICBjb25zdCBib2R5ID0gaGFzRmlsZVBhdGggPyBudWxsIDogcmVzcG9uc2UuZ2V0Qm9keSgpXG4gICAgY29uc3QgYm9keUlzU3RyaW5nID0gdHlwZW9mIGJvZHkgPT09IFwic3RyaW5nXCJcbiAgICBjb25zdCBib2R5SXNCaW5hcnkgPSBib2R5IGluc3RhbmNlb2YgVWludDhBcnJheVxuXG4gICAgaWYgKCFoYXNGaWxlUGF0aCAmJiAhYm9keUlzU3RyaW5nICYmICFib2R5SXNCaW5hcnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcmVzcG9uc2UgYm9keSB0byBiZSBhIHN0cmluZyBvciBVaW50OEFycmF5LCBnb3QgJHt0eXBlb2YgYm9keX1gKVxuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwic2VuZFJlc3BvbnNlXCIsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCwgY29ubmVjdGlvbkhlYWRlciwgaHR0cFZlcnNpb259KVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcInNlbmRSZXNwb25zZSBwYXlsb2FkXCIsIHtcbiAgICAgIGNsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50LFxuICAgICAgaGFzRmlsZVBhdGgsXG4gICAgICBmaWxlUGF0aCxcbiAgICAgIGJvZHlJc0JpbmFyeSxcbiAgICAgIGJvZHlJc1N0cmluZ1xuICAgIH1dKVxuXG4gICAgaWYgKHNob3VsZENsb3NlQ29ubmVjdGlvbikge1xuICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiQ29ubmVjdGlvblwiLCBcIkNsb3NlXCIpXG4gICAgfSBlbHNlIGlmIChodHRwVmVyc2lvbiA9PSBcIjEuMFwiICYmIGNvbm5lY3Rpb25IZWFkZXIgPT0gXCJrZWVwLWFsaXZlXCIpIHtcbiAgICAgIHJlc3BvbnNlLnNldEhlYWRlcihcIkNvbm5lY3Rpb25cIiwgXCJLZWVwLUFsaXZlXCIpXG4gICAgfVxuXG4gICAgLy8gUGVyIFJGQyA3MjMwIMKnMy4zLjMsIHJlc3BvbnNlcyB3aXRoIHN0YXR1cyBjb2RlcyAxeHgsIDIwNCwgYW5kIDMwNFxuICAgIC8vIE1VU1QgTk9UIGNhcnJ5IGEgbWVzc2FnZSBib2R5IGFuZCBNVVNUIE5PVCBpbmNsdWRlIENvbnRlbnQtTGVuZ3RoXG4gICAgLy8gKHdpdGggYSBuYXJyb3cgMzA0IGV4Y2VwdGlvbiB3ZSBkb24ndCBsZWFuIG9uKS4gU2VuZGluZyBvbmUgd291bGRcbiAgICAvLyBkZXN5bmNocm9uaXplIGtlZXAtYWxpdmUgY2xpZW50cyB3YWl0aW5nIGZvciBieXRlcyB0aGF0IG5ldmVyXG4gICAgLy8gYXJyaXZlIOKAlCBkcm9wIHRoZSBib2R5IGVudGlyZWx5IGZvciB0aG9zZSBjb2Rlcy5cbiAgICBjb25zdCBpc0JvZHlsZXNzU3RhdHVzID0gaXNOb0JvZHlTdGF0dXNDb2RlKHJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKSlcblxuICAgIC8vIEhFQUQgcmVzcG9uc2VzIHNlbGVjdCBhbmQgY29tcHV0ZSB0aGUgZXhhY3Qgc2FtZSByZXByZXNlbnRhdGlvbiBoZWFkZXJzIGFzIHRoZVxuICAgIC8vIGVxdWl2YWxlbnQgR0VUIChpbmNsdWRpbmcgQ29udGVudC1MZW5ndGggYW5kIGFueSBuZWdvdGlhdGVkIENvbnRlbnQtRW5jb2RpbmcpLFxuICAgIC8vIGJ1dCBubyBidWZmZXJlZCBvciBmaWxlIGJvZHkgaXMgZW1pdHRlZCBiZWxvdy5cbiAgICBjb25zdCBpc0hlYWRSZXF1ZXN0ID0gcmVxdWVzdC5odHRwTWV0aG9kKCkgPT0gXCJIRUFEXCJcblxuICAgIC8qKiBAdHlwZSB7c3RyaW5nIHwgVWludDhBcnJheSB8IG51bGx9ICovXG4gICAgbGV0IGJvZHlUb0VtaXQgPSBib2R5XG5cbiAgICAvLyBUaGUgcmVzcG9uc2UgcmVwcmVzZW50YXRpb24gY2FuIGRlcGVuZCBvbiB0aGUgY2xpZW50J3MgQWNjZXB0LUVuY29kaW5nOlxuICAgIC8vIHRoZSBzYW1lIHJlcXVlc3QgaXMgYW5zd2VyZWQgd2l0aCBhbiBpZGVudGl0eSBib2R5IChvciBhIGZpbGUpIHdoZW5cbiAgICAvLyBpZGVudGl0eSBpcyBhY2NlcHRhYmxlIGFuZCB3aXRoIGFuIGVtcHR5IDQwNiB3aGVuIGl0IGlzIGZvcmJpZGRlbi5cbiAgICBjb25zdCBjb21wcmVzc2lvbiA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRIdHRwU2VydmVyQ29tcHJlc3Npb24oKVxuICAgIGNvbnN0IG5lZ290aWF0ZWQgPSBjb21wcmVzc2lvbi5lbmFibGVkID8gbmVnb3RpYXRlQ29udGVudEVuY29kaW5nKHJlcXVlc3QuaGVhZGVyKFwiYWNjZXB0LWVuY29kaW5nXCIpKSA6IHVuZGVmaW5lZFxuICAgIC8vIEFuIGFwcGxpY2F0aW9uLXN1cHBsaWVkIENvbnRlbnQtRW5jb2RpbmcgaXMgYW4gYXBwbGljYXRpb24tb3duZWRcbiAgICAvLyByZXByZXNlbnRhdGlvbiBjb250cmFjdCwgY2FwdHVyZWQgYmVmb3JlIHRoZSBmcmFtZXdvcmsgbWF5IGFkZCBpdHMgb3duLlxuICAgIC8vIEEgZmlsZSBjYXJyeWluZyBvbmUgaXMgYSBmaXhlZCwgYXBwbGljYXRpb24tb3duZWQgcmVwcmVzZW50YXRpb246IHRoZVxuICAgIC8vIGZyYW1ld29yayBuZWl0aGVyIG5lZ290aWF0ZXMgaXQgbm9yIHJlLWFkdmVydGlzZXMgaXQsIHNvIGl0IGlzIG5ldmVyIGFcbiAgICAvLyBjYW5kaWRhdGUgZm9yIHRoZSBpZGVudGl0eS1vbmx5IDQwNi5cbiAgICBjb25zdCBoYXNBcHBsaWNhdGlvbkNvbnRlbnRFbmNvZGluZyA9IHJlc3BvbnNlLmdldEhlYWRlcihcIkNvbnRlbnQtRW5jb2RpbmdcIikubGVuZ3RoID4gMFxuICAgIC8vIEEgZmlsZSByZXNwb25zZSBvbmx5IGV2ZXIgc2VydmVzIHRoZSBpZGVudGl0eSByZXByZXNlbnRhdGlvbjogd2hlbmV2ZXJcbiAgICAvLyB0aGUgY2xpZW50IGZvcmJpZHMgaWRlbnRpdHkgKGluY2x1ZGluZyB0aGUgbm90LWFjY2VwdGFibGUgY2FzZSB3aGVyZSBub1xuICAgIC8vIGNvZGluZyBhcHBsaWVzKSBhbmQgdGhlIGZpbGUgZG9lcyBub3QgY2FycnkgYW4gYXBwbGljYXRpb24tc3VwcGxpZWRcbiAgICAvLyBDb250ZW50LUVuY29kaW5nLCB0aGUgZmlsZSBpcyByZWplY3RlZCB3aXRoIHRoZSBlbXB0eSA0MDYuIEEgdHJ1bHlcbiAgICAvLyBib2R5bGVzcyBzdGF0dXMgc2VsZWN0cyBubyByZXByZXNlbnRhdGlvbiwgc28gaXQgaXMgbmV2ZXIgcmVqZWN0ZWQgaGVyZS5cbiAgICBjb25zdCBpc0ZpbGVOb3RBY2NlcHRhYmxlID0gaGFzRmlsZVBhdGggJiYgISFuZWdvdGlhdGVkICYmIChcIm5vdEFjY2VwdGFibGVcIiBpbiBuZWdvdGlhdGVkIHx8IG5lZ290aWF0ZWQuaWRlbnRpdHlBY2NlcHRhYmxlID09PSBmYWxzZSkgJiYgaGFzQXBwbGljYXRpb25Db250ZW50RW5jb2RpbmcgPT09IGZhbHNlICYmICFpc0JvZHlsZXNzU3RhdHVzXG5cbiAgICBpZiAoIWlzQm9keWxlc3NTdGF0dXMpIHtcbiAgICAgIGxldCBjb250ZW50TGVuZ3RoXG5cbiAgICAgIGlmIChoYXNGaWxlUGF0aCkge1xuICAgICAgICBpZiAoaXNGaWxlTm90QWNjZXB0YWJsZSkge1xuICAgICAgICAgIC8vIFRoZSBjbGllbnQgZm9yYmlkcyBpZGVudGl0eSBhbmQgZmlsZXMgYXJlIG9ubHkgZXZlciBzZW50IGlkZW50aXR5OlxuICAgICAgICAgIC8vIGFuc3dlciB3aXRoIHRoZSBzYW1lIGVtcHR5IDQwNiBldmVyeSBvdGhlciByZXByZXNlbnRhdGlvbiBwYXRoXG4gICAgICAgICAgLy8gdXNlcy4gVGhlIGZpbGUgaXMgbmV2ZXIgb3BlbmVkIG9yIHN0cmVhbWVkOyBvbkZpbmlzaGVkIGlzIHNldHRsZWRcbiAgICAgICAgICAvLyBiZWxvdywgYWZ0ZXIgdGhlIGNvbW1pdHRlZCA0MDYgaGVhZGVycyBhcmUgZW1pdHRlZC5cbiAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoNDA2KVxuICAgICAgICAgIHJlc3BvbnNlLnNldEJvZHkoXCJcIilcbiAgICAgICAgICBib2R5VG9FbWl0ID0gXCJcIlxuICAgICAgICAgIGNvbnRlbnRMZW5ndGggPSAwXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxuICAgICAgICAgIGNvbnRlbnRMZW5ndGggPSBzdGF0cy5zaXplXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFN0cmluZyBib2RpZXMgYXJlIFVURi04IGZyYW1lZCwgc28gdGhlIGJ1ZmZlcmVkIGJ5dGVzIGFyZSB0aGUgVVRGLTggZW5jb2Rpbmc7XG4gICAgICAgIC8vIFVpbnQ4QXJyYXkgYm9kaWVzIGFyZSBhbHJlYWR5IHRoZSBleGFjdCB3aXJlIGJ5dGVzLlxuICAgICAgICBjb25zdCBib2R5QnVmZmVyID0gYm9keUlzU3RyaW5nID8gQnVmZmVyLmZyb20oYm9keSwgXCJ1dGY4XCIpIDogQnVmZmVyLmZyb20oYm9keSlcbiAgICAgICAgY29uc3QgY29tcHJlc3Npb25SZXN1bHQgPSBhd2FpdCBhcHBseVJlc3BvbnNlQ29tcHJlc3Npb24oe1xuICAgICAgICAgIGJvZHlCdWZmZXIsXG4gICAgICAgICAgY29tcHJlc3Npb246IHRoaXMuY29uZmlndXJhdGlvbi5nZXRIdHRwU2VydmVyQ29tcHJlc3Npb24oKSxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHJlc3BvbnNlXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGNvbXByZXNzaW9uUmVzdWx0Lm91dGNvbWUgPT0gXCJub3QtYWNjZXB0YWJsZVwiKSB7XG4gICAgICAgICAgLy8gVGhlIGNsaWVudCBmb3JiaWRzIGlkZW50aXR5IGFuZCBubyBzdXBwb3J0ZWQgY29kaW5nIGlzIGFjY2VwdGFibGU6IGFuc3dlclxuICAgICAgICAgIC8vIHdpdGggYW4gZW1wdHkgNDA2IGluc3RlYWQgb2YgYW4gdW5hY2NlcHRhYmxlIHJlcHJlc2VudGF0aW9uLlxuICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyg0MDYpXG4gICAgICAgICAgcmVzcG9uc2Uuc2V0Qm9keShcIlwiKVxuICAgICAgICAgIGJvZHlUb0VtaXQgPSBcIlwiXG4gICAgICAgICAgY29udGVudExlbmd0aCA9IDBcbiAgICAgICAgfSBlbHNlIGlmIChjb21wcmVzc2lvblJlc3VsdC5vdXRjb21lID09IFwiY29tcHJlc3NlZFwiKSB7XG4gICAgICAgICAgYm9keVRvRW1pdCA9IGNvbXByZXNzaW9uUmVzdWx0LmJvZHlcbiAgICAgICAgICBjb250ZW50TGVuZ3RoID0gY29tcHJlc3Npb25SZXN1bHQuYm9keS5sZW5ndGhcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250ZW50TGVuZ3RoID0gYm9keUJ1ZmZlci5sZW5ndGhcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgYW55IGFwcGxpY2F0aW9uIHByZS1zZXQgQ29udGVudC1MZW5ndGggKGFueSBjYXNpbmcpIHNvIGV4YWN0bHkgb25lXG4gICAgICAvLyByZWNvbXB1dGVkIHZhbHVlIGdvZXMgb24gdGhlIHdpcmUuXG4gICAgICByZXNwb25zZS5yZW1vdmVIZWFkZXIoXCJDb250ZW50LUxlbmd0aFwiKVxuICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiQ29udGVudC1MZW5ndGhcIiwgY29udGVudExlbmd0aClcbiAgICB9XG5cbiAgICAvLyBGcmFtZXdvcmstb3duZWQgVmFyeSBkaW1lbnNpb246IHdoZW5ldmVyIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQgYW5kIGFcbiAgICAvLyByZXByZXNlbnRhdGlvbiB3YXMgc2VsZWN0ZWQsIHRoZSByZXNwb25zZSBkZXBlbmRzIG9uIEFjY2VwdC1FbmNvZGluZyxcbiAgICAvLyBzbyBjYWNoZXMgbXVzdCBrZXkgb24gaXQuIEFwcGxpZWQgaWRlbnRpY2FsbHkgZm9yIGV2ZXJ5IG91dGNvbWVcbiAgICAvLyAodHJhbnNmb3JtZWQsIGlkZW50aXR5LCA0MDYsIGZpbGUpIGFuZCBmb3IgaGVhZGVyLXByZXNlbnQgYW5kXG4gICAgLy8gaGVhZGVyLWFic2VudCByZXF1ZXN0cyBhbGlrZSwgc28gdGhlIGhlYWRlciBpcyBzdGFibGUgYWNyb3NzIHJlcXVlc3RzIG9uXG4gICAgLy8gdGhlIHNhbWUgY29ubmVjdGlvbi4gQSB0cnVseSBib2R5bGVzcyByZXNwb25zZSBzZWxlY3RzIG5vIHJlcHJlc2VudGF0aW9uXG4gICAgLy8gYW5kIGNhcnJpZXMgbm8gZGltZW5zaW9uOyBhbiBhcHBsaWNhdGlvbi1zdXBwbGllZCBDb250ZW50LUVuY29kaW5nIGtlZXBzXG4gICAgLy8gdGhlIHJlcHJlc2VudGF0aW9uIGNvbnRyYWN0IGFwcGxpY2F0aW9uLW93bmVkIGFuZCBpcyBuZXZlciByZS1hZHZlcnRpc2VkLlxuICAgIGlmIChuZWdvdGlhdGVkICYmICFpc0JvZHlsZXNzU3RhdHVzICYmIGhhc0FwcGxpY2F0aW9uQ29udGVudEVuY29kaW5nID09PSBmYWxzZSkge1xuICAgICAgYWRkQWNjZXB0RW5jb2RpbmdUb1ZhcnkocmVzcG9uc2UpXG4gICAgfVxuXG4gICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiRGF0ZVwiLCBkYXRlLnRvVVRDU3RyaW5nKCkpXG4gICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiU2VydmVyXCIsIFwiVmVsb2Npb3VzXCIpXG5cbiAgICBsZXQgaGVhZGVycyA9IFwiXCJcblxuICAgIGhlYWRlcnMgKz0gYEhUVFAvJHtyZXF1ZXN0Lmh0dHBWZXJzaW9uKCl9ICR7cmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpfSAke3Jlc3BvbnNlLmdldFN0YXR1c01lc3NhZ2UoKX1cXHJcXG5gXG5cbiAgICBmb3IgKGNvbnN0IGhlYWRlcktleSBpbiByZXNwb25zZS5oZWFkZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGhlYWRlclZhbHVlIG9mIHJlc3BvbnNlLmhlYWRlcnNbaGVhZGVyS2V5XSkge1xuICAgICAgICBoZWFkZXJzICs9IGAke2hlYWRlcktleX06ICR7aGVhZGVyVmFsdWV9XFxyXFxuYFxuICAgICAgfVxuICAgIH1cblxuICAgIGhlYWRlcnMgKz0gXCJcXHJcXG5cIlxuXG4gICAgdGhpcy5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBoZWFkZXJzKVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcInNlbmRSZXNwb25zZSBoZWFkZXJzIGVtaXR0ZWRcIiwge2NsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50LCBoZWFkZXJzTGVuZ3RoOiBoZWFkZXJzLmxlbmd0aH1dKVxuXG4gICAgLy8gQSBuZWdvdGlhdGVkIGZpbGUgNDA2IGlzIGNvbW1pdHRlZCBhYm92ZSAoc3RhdHVzIDQwNiwgZW1wdHkgYm9keSkgYW5kIGl0c1xuICAgIC8vIGhlYWRlcnMgd2VyZSBqdXN0IGVtaXR0ZWQ6IHNldHRsZSBvbkZpbmlzaGVkIG5vdywgc28gdGhlIGNhbGxiYWNrIHJ1bnNcbiAgICAvLyBhZnRlciB0aGUgcmVzcG9uc2UgaXMgY29tbWl0dGVkIOKAlCBhIHNsb3cgb3IgYXBwLXN0b3BwaW5nIGNhbGxiYWNrIGNhbm5vdFxuICAgIC8vIGRlbGF5IG9yIGJsb2NrIGRlbGl2ZXJ5IG9mIHRoZSBhbHJlYWR5LWVtaXR0ZWQgNDA2LiBUaGUgZmlsZSBpcyBuZXZlclxuICAgIC8vIG9wZW5lZCwgc3RyZWFtZWQsIG9yIHJlcG9ydGVkIChubyBmaWxlIGV2ZW50KSwgYW5kIHRoZSBjYWxsYmFjayBzZXR0bGVzXG4gICAgLy8gZXhhY3RseSBvbmNlIGFzIFwiY29tcGxldGVkXCIuXG4gICAgaWYgKGlzRmlsZU5vdEFjY2VwdGFibGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcInNlbmRSZXNwb25zZSBmaWxlIGJvZHkgc3VwcHJlc3NlZCBmb3IgNDA2XCIsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCwgZmlsZVBhdGh9XSlcbiAgICAgIGF3YWl0IHRoaXMucnVuRmlsZU9uRmluaXNoZWQoe2ZpbGVQYXRoLCBvbkZpbmlzaGVkOiBmaWxlT25GaW5pc2hlZCwgcmVzdWx0OiBcImNvbXBsZXRlZFwifSlcbiAgICB9IGVsc2UgaWYgKGlzQm9keWxlc3NTdGF0dXMpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcInNlbmRSZXNwb25zZSBib2R5IHN1cHByZXNzZWQgZm9yIG5vLWJvZHkgc3RhdHVzXCIsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCwgc3RhdHVzQ29kZTogcmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpfV0pXG4gICAgICAvLyBBIGJvZHlsZXNzIHN0YXR1cyAoMXh4LzIwNC8zMDQpIHNlbGVjdHMgbm8gcmVwcmVzZW50YXRpb24sIHNvIG5vIGZpbGVcbiAgICAgIC8vIGJvZHkgb3IgZnJhbWV3b3JrIFZhcnkgaXMgZW1pdHRlZC4gVGhlIGZpbGUtb3duZXJzaGlwIHBhdGggc3RpbGwgc2V0dGxlc1xuICAgICAgLy8gb25GaW5pc2hlZCBleGFjdGx5IG9uY2UgYXMgXCJjb21wbGV0ZWRcIiAobm90aGluZyB3YXMgYWJvcnRlZCkg4oCUIGV2ZW4gd2hlblxuICAgICAgLy8gdGhlIGNsaWVudCBmb3JiaWRzIGlkZW50aXR5IOKAlCBwcmVzZXJ2aW5nIHRoZSBwcmUtY2hhbmdlIHNldHRsZW1lbnQuXG4gICAgICBpZiAoaGFzRmlsZVBhdGgpIGF3YWl0IHRoaXMuc2VuZEZpbGVPdXRwdXQoZmlsZVBhdGgsIGZhbHNlLCBmaWxlT25GaW5pc2hlZClcbiAgICB9IGVsc2UgaWYgKGlzSGVhZFJlcXVlc3QpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcInNlbmRSZXNwb25zZSBib2R5IHN1cHByZXNzZWQgZm9yIEhFQUQgcmVxdWVzdFwiLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnR9XSlcbiAgICAgIGlmIChoYXNGaWxlUGF0aCkgYXdhaXQgdGhpcy5zZW5kRmlsZU91dHB1dChmaWxlUGF0aCwgZmFsc2UsIGZpbGVPbkZpbmlzaGVkKVxuICAgIH0gZWxzZSBpZiAoaGFzRmlsZVBhdGgpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZEZpbGVPdXRwdXQoZmlsZVBhdGgsIHRydWUsIGZpbGVPbkZpbmlzaGVkKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmV2ZW50cy5lbWl0KFwib3V0cHV0XCIsIGJvZHlUb0VtaXQpXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJzZW5kUmVzcG9uc2UgYm9keSBlbWl0dGVkXCIsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCwgYm9keUxlbmd0aDogYm9keVRvRW1pdCA/IGJvZHlUb0VtaXQubGVuZ3RoIDogMH1dKVxuICAgIH1cblxuICAgIGF3YWl0IHJlcXVlc3RSdW5uZXIubG9nQ29tcGxldGVkUmVxdWVzdCgpXG5cbiAgICBpZiAoXCJnZXRSZXF1ZXN0UGFyc2VyXCIgaW4gcmVxdWVzdCkge1xuICAgICAgY29uc3QgaHR0cFJlcXVlc3QgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSAqLyAocmVxdWVzdClcbiAgICAgIGh0dHBSZXF1ZXN0LmdldFJlcXVlc3RQYXJzZXIoKS5kZXN0cm95KClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZW5kIGZpbGUgb3V0cHV0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGggLSBGaWxlIHBhdGguXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VuZEJvZHkgLSBXaGV0aGVyIHRoZSBmaWxlIGJvZHkgc2hvdWxkIGJlIHNlbnQuXG4gICAqIEBwYXJhbSB7KChyZXN1bHQ6IFwiY29tcGxldGVkXCIgfCBcImFib3J0ZWRcIikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHwgbnVsbH0gb25GaW5pc2hlZCAtIENvbXBsZXRpb24gY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBzZW5kRmlsZU91dHB1dChmaWxlUGF0aCwgc2VuZEJvZHksIG9uRmluaXNoZWQpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJzZW5kRmlsZU91dHB1dCBzdGFydFwiLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnQsIGZpbGVQYXRofV0pXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgLyoqIEB0eXBlIHtQcm9taXNlPHZvaWQ+IHwgbnVsbH0gKi9cbiAgICAgIGxldCBzZXR0bGVtZW50ID0gbnVsbFxuICAgICAgY29uc3Qgc2V0dGxlID0gKC8qKiBAdHlwZSB7XCJjb21wbGV0ZWRcIiB8IFwiYWJvcnRlZFwifSAqLyB0cmFuc2ZlclJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlbWVudCkgcmV0dXJuIHNldHRsZW1lbnRcblxuICAgICAgICB0aGlzLnBlbmRpbmdGaWxlUmVzcG9uc2VzLmRlbGV0ZShzZXR0bGUpXG4gICAgICAgIHNldHRsZW1lbnQgPSB0aGlzLnJ1bkZpbGVPbkZpbmlzaGVkKHtmaWxlUGF0aCwgb25GaW5pc2hlZCwgcmVzdWx0OiB0cmFuc2ZlclJlc3VsdH0pXG4gICAgICAgICAgLmZpbmFsbHkoKCkgPT4gcmVzb2x2ZSh0cmFuc2ZlclJlc3VsdCkpXG5cbiAgICAgICAgcmV0dXJuIHNldHRsZW1lbnRcbiAgICAgIH1cblxuICAgICAgdGhpcy5wZW5kaW5nRmlsZVJlc3BvbnNlcy5hZGQoc2V0dGxlKVxuICAgICAgdGhpcy5ldmVudHMuZW1pdChcImZpbGVcIiwge2ZpbGVQYXRoLCBzZW5kQm9keSwgc2V0dGxlfSlcbiAgICB9KVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW1wic2VuZEZpbGVPdXRwdXQgZG9uZVwiLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnQsIGZpbGVQYXRoLCByZXN1bHR9XSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgZmlsZSBjb21wbGV0aW9uIGNhbGxiYWNrIHdpdGhvdXQgYWxsb3dpbmcgY2xlYW51cCBmYWlsdXJlcyB0byByZXBsYWNlIHRoZSBjb21taXR0ZWQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQ29tcGxldGlvbiBkZXRhaWxzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5maWxlUGF0aCAtIEZpbGUgcGF0aC5cbiAgICogQHBhcmFtIHsoKHJlc3VsdDogXCJjb21wbGV0ZWRcIiB8IFwiYWJvcnRlZFwiKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgfCBudWxsfSBhcmdzLm9uRmluaXNoZWQgLSBDb21wbGV0aW9uIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0ge1wiY29tcGxldGVkXCIgfCBcImFib3J0ZWRcIn0gYXJncy5yZXN1bHQgLSBUcmFuc2ZlciByZXN1bHQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIGNhbGxiYWNrIGNsZWFudXAgYW5kIGVycm9yIHJlcG9ydGluZyBmaW5pc2guXG4gICAqL1xuICBhc3luYyBydW5GaWxlT25GaW5pc2hlZCh7ZmlsZVBhdGgsIG9uRmluaXNoZWQsIHJlc3VsdH0pIHtcbiAgICBpZiAoIW9uRmluaXNoZWQpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG9uRmluaXNoZWQocmVzdWx0KVxuICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvciA9IGVuc3VyZUVycm9yKGNhdWdodEVycm9yKVxuXG4gICAgICBhd2FpdCB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGaWxlIHJlc3BvbnNlIG9uRmluaXNoZWQgY2FsbGJhY2sgZmFpbGVkXCIsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCwgZmlsZVBhdGgsIHJlc3VsdH0sIGVycm9yXSlcblxuICAgICAgY29uc3QgZXJyb3JQYXlsb2FkID0ge1xuICAgICAgICBjb250ZXh0OiB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnQsIGZpbGVQYXRoLCByZXN1bHQsIHN0YWdlOiBcInNlbmQtZmlsZS1vbi1maW5pc2hlZFwifSxcbiAgICAgICAgZXJyb3JcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmdldEVycm9yRXZlbnRzKCkuZW1pdChcImZyYW1ld29yay1lcnJvclwiLCBlcnJvclBheWxvYWQpXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RXJyb3JFdmVudHMoKS5lbWl0KFwiYWxsLWVycm9yXCIsIHsuLi5lcnJvclBheWxvYWQsIGVycm9yVHlwZTogXCJmcmFtZXdvcmstZXJyb3JcIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0cyBhbGwgZmlsZSByZXNwb25zZXMgYXdhaXRpbmcgdHJhbnNwb3J0IGFja25vd2xlZGdlbWVudC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgcGVuZGluZyBjYWxsYmFja3Mgc2V0dGxlLlxuICAgKi9cbiAgYXN5bmMgYWJvcnRQZW5kaW5nRmlsZVJlc3BvbnNlcygpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbLi4udGhpcy5wZW5kaW5nRmlsZVJlc3BvbnNlc10ubWFwKChzZXR0bGUpID0+IHNldHRsZShcImFib3J0ZWRcIikpKVxuICB9XG5cbiAgLyoqXG4gICAqIFNpbmsgdGhlIG93bmluZyB3b3JrZXIgaGFuZGxlciB3aXJlcyBpbiBmb3Igc3RyZWFtIG91dHB1dC4gVGhlXG4gICAqIGluLXByb2Nlc3MgaGFuZGxlciByZXNvbHZlcyBpdCBhZnRlciB0aGUgZnJhbWVkIG91dHB1dCBoYXMgYmVlbiBlbnF1ZXVlZFxuICAgKiBmb3IgZGVsaXZlcnkgdG8gdGhlIHNvY2tldCwgc28gc3RyZWFtIGNodW5rcyBzaGFyZSB0aGUgYm91bmRlZCwgb3JkZXJlZFxuICAgKiBkZWxpdmVyeSBwYXRoIChieXRlL2ZyYW1lIGxpbWl0cyBhbmQgc29ja2V0IGJhY2twcmVzc3VyZSkgaW5zdGVhZCBvZlxuICAgKiBiZWluZyBidWZmZXJlZCB1bmJvdW5kZWRseSBmb3IgYSBzdGFsbGVkIGNsaWVudC4gVGhlIHdvcmtlci10aHJlYWRcbiAgICogaGFuZGxlciBrZWVwcyBudWxsOiBpdHMgb3V0cHV0IGNyb3NzZXMgdG8gdGhlIHBhcmVudCBvdmVyIElQQyBhbmQgbm9cbiAgICogcGVyLWNodW5rIGFja25vd2xlZGdlbWVudCBpcyBhdmFpbGFibGUuXG4gICAqIEB0eXBlIHsoKG91dHB1dDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+KSB8IG51bGx9ICovXG4gIHN0cmVhbU91dHB1dFNpbmsgPSBudWxsXG5cbiAgLyoqXG4gICAqIE5hcnJvd3MgdGhlIHJlc3BvbnNlIHRvIHRoZSBkb2N1bWVudGVkIHN0cmVhbWluZyB0cmFuc3BvcnQgc2hhcGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9yZXNwb25zZS5qc1wiKS5kZWZhdWx0fSByZXNwb25zZSAtIFJlc3BvbnNlIHRvIHN0cmVhbS5cbiAgICogQHJldHVybnMge3tzdHJlYW1pbmc6IGJvb2xlYW4sIHN0cmVhbUVuZGVkOiBib29sZWFuLCBzdHJlYW1BYm9ydGVkOiBib29sZWFuLCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4sIGdldFN0YXR1c0NvZGU6ICgpID0+IG51bWJlciwgZ2V0U3RhdHVzTWVzc2FnZTogKCkgPT4gc3RyaW5nLCBzdHJlYW1DbG9zZUNhbGxiYWNrczogU2V0PCgpID0+IHZvaWQ+fX0gLSBTdHJlYW1pbmcgdmlldyBvZiB0aGUgcmVzcG9uc2UuXG4gICAqL1xuICBfc3RyZWFtaW5nUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICByZXR1cm4gcmVzcG9uc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgYSBsaXZlIGNodW5rZWQgc3RyZWFtIGZvciBhIHNvY2tldC1ib3VuZCByZXNwb25zZTogZW1pdHMgdGhlXG4gICAqIHN0YXR1cyBsaW5lIGFuZCBoZWFkZXJzICh3aXRoIGBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZGApIHRvIHRoZVxuICAgKiBjbGllbnQgaW1tZWRpYXRlbHkgc28gc3Vic2VxdWVudCBgd3JpdGUoKWAgY2h1bmtzIHJlYWNoIHRoZSBjbGllbnQgYXNcbiAgICogdGhleSBhcmUgcHJvZHVjZWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9yZXNwb25zZS5qc1wiKS5kZWZhdWx0fSByZXNwb25zZSAtIFJlc3BvbnNlIHRvIHN0cmVhbS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3JlcXVlc3QuanNcIikuZGVmYXVsdH0gcmVxdWVzdCAtIFNvY2tldC1ib3VuZCByZXF1ZXN0LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBiZWdpblN0cmVhbVJlc3BvbnNlKHJlc3BvbnNlLCByZXF1ZXN0KSB7XG4gICAgdGhpcy5fYWN0aXZlU3RyZWFtUmVzcG9uc2VzLnNldChyZXNwb25zZSwge2NsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50LCByZXF1ZXN0fSlcblxuICAgIGNvbnN0IGh0dHBWZXJzaW9uID0gcmVxdWVzdC5odHRwVmVyc2lvbigpXG5cbiAgICAvLyBIVFRQLzEuMCBoYXMgbm8gY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZzogdGVybWluYXRlIHRoZSBzdHJlYW0gd2l0aCBhXG4gICAgLy8gY29ubmVjdGlvbiBjbG9zZSBpbnN0ZWFkIG9mIGEgemVyby1sZW5ndGggY2h1bmsuXG4gICAgaWYgKGh0dHBWZXJzaW9uID09IFwiMS4wXCIgJiYgIXRoaXMuc2hvdWxkQ2xvc2VDb25uZWN0aW9uKHJlcXVlc3QpKSB7XG4gICAgICByZXNwb25zZS5zZXRIZWFkZXIoXCJDb25uZWN0aW9uXCIsIFwiQ2xvc2VcIilcbiAgICB9XG5cbiAgICAvLyBUaGUgY2h1bmtlZCBmcmFtaW5nIG93bnMgdGhlIGJvZHkgbGVuZ3RoOyBhIENvbnRlbnQtTGVuZ3RoIGhlYWRlciBzZXRcbiAgICAvLyBieSB0aGUgYXBwbGljYXRpb24gYmVmb3JlIHN0cmVhbSgpIHdvdWxkIGRlc3luY2hyb25pemUgdGhlIGZyYW1pbmcuXG4gICAgcmVzcG9uc2UucmVtb3ZlSGVhZGVyKFwiQ29udGVudC1MZW5ndGhcIilcbiAgICBpZiAocmVzcG9uc2UuZ2V0SGVhZGVyKFwiVHJhbnNmZXItRW5jb2RpbmdcIikubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXNwb25zZS5zZXRIZWFkZXIoXCJUcmFuc2Zlci1FbmNvZGluZ1wiLCBcImNodW5rZWRcIilcbiAgICB9XG5cbiAgICByZXNwb25zZS5zZXRIZWFkZXIoXCJEYXRlXCIsIG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSlcbiAgICByZXNwb25zZS5zZXRIZWFkZXIoXCJTZXJ2ZXJcIiwgXCJWZWxvY2lvdXNcIilcblxuICAgIGNvbnN0IHJlc3BvbnNlVmlldyA9IHRoaXMuX3N0cmVhbWluZ1Jlc3BvbnNlKHJlc3BvbnNlKVxuICAgIGxldCBoZWFkZXJzID0gXCJcIlxuICAgIGhlYWRlcnMgKz0gYEhUVFAvJHtodHRwVmVyc2lvbn0gJHtyZXNwb25zZVZpZXcuZ2V0U3RhdHVzQ29kZSgpfSAke3Jlc3BvbnNlVmlldy5nZXRTdGF0dXNNZXNzYWdlKCl9XFxyXFxuYFxuXG4gICAgZm9yIChjb25zdCBoZWFkZXJLZXkgaW4gcmVzcG9uc2VWaWV3LmhlYWRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyVmFsdWUgb2YgcmVzcG9uc2VWaWV3LmhlYWRlcnNbaGVhZGVyS2V5XSkge1xuICAgICAgICBoZWFkZXJzICs9IGAke2hlYWRlcktleX06ICR7aGVhZGVyVmFsdWV9XFxyXFxuYFxuICAgICAgfVxuICAgIH1cblxuICAgIGhlYWRlcnMgKz0gXCJcXHJcXG5cIlxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgaGVhZGVycylcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBvbmUgY2h1bmtlZC1lbmNvZGVkIGJvZHkgY2h1bmsgZm9yIGFuIGFjdGl2ZSBzdHJlYW0uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVWludDhBcnJheX0gY2h1bmsgLSBDaHVuayB0byBlbWl0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBTZXR0bGVzIGFmdGVyIHRoZSBjaHVuayBoYXMgYmVlbiBkZWxpdmVyZWQgdG9cbiAgICogdGhlIGNsaWVudC5cbiAgICovXG4gIGFzeW5jIHdyaXRlU3RyZWFtQ2h1bmsoY2h1bmspIHtcbiAgICBjb25zdCBieXRlcyA9IHR5cGVvZiBjaHVuayA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGNodW5rLCBcInV0ZjhcIikgOiBCdWZmZXIuZnJvbShjaHVuaylcbiAgICBjb25zdCBmcmFtZSA9IGAke2J5dGVzLmxlbmd0aC50b1N0cmluZygxNil9XFxyXFxuJHtieXRlc31cXHJcXG5gXG4gICAgaWYgKHRoaXMuc3RyZWFtT3V0cHV0U2luayA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBmcmFtZSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBhd2FpdCB0aGlzLnN0cmVhbU91dHB1dFNpbmsoZnJhbWUpXG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgdGhlIHplcm8tbGVuZ3RoIGNodW5rZWQgdGVybWluYXRvciBmb3IgYSBzdHJlYW0gdGhhdCBmaW5pc2hlZCBvbiBhXG4gICAqIGxpdmUgY29ubmVjdGlvbiwgdGhlbiBydW5zIGl0cyBjbG9zZSBjYWxsYmFja3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9yZXNwb25zZS5qc1wiKS5kZWZhdWx0fSByZXNwb25zZSAtIFJlc3BvbnNlIHRvIGZpbmlzaC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gU2V0dGxlcyBhZnRlciB0aGUgdGVybWluYXRvciB3YXMgZGVsaXZlcmVkIGFuZFxuICAgKiB0aGUgY2xvc2UgY2FsbGJhY2tzIHJhbi5cbiAgICovXG4gIGFzeW5jIGVuZFN0cmVhbVJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgaWYgKHJlc3BvbnNlLnN0cmVhbUVuZGVkKSByZXR1cm5cbiAgICByZXNwb25zZS5zdHJlYW1FbmRlZCA9IHRydWVcbiAgICB0aGlzLl9hY3RpdmVTdHJlYW1SZXNwb25zZXMuZGVsZXRlKHJlc3BvbnNlKVxuICAgIGlmICh0aGlzLnN0cmVhbU91dHB1dFNpbmsgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgXCIwXFxyXFxuXFxyXFxuXCIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuc3RyZWFtT3V0cHV0U2luayhcIjBcXHJcXG5cXHJcXG5cIilcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5fcnVuU3RyZWFtQ2xvc2VDYWxsYmFja3MocmVzcG9uc2UpXG4gIH1cblxuICAvKipcbiAgICogQWJvcnRzIGV2ZXJ5IHN0cmVhbSB3aG9zZSBjbGllbnQgY29ubmVjdGlvbiB3ZW50IGF3YXk6IG1hcmtzIHRoZSBzdHJlYW1cbiAgICogYWJvcnRlZCBhbmQgcnVucyB0aGUgY2xvc2UgY2FsbGJhY2tzIHNvIGluLWZsaWdodCB3b3JrIGNhbiBzZXR0bGUgaXRzXG4gICAqIHJlc291cmNlcy4gTm8gdGVybWluYXRvciBpcyBlbWl0dGVkIOKAlCB0aGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGdvbmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIGV2ZXJ5IHN0cmVhbSBzZXR0bGVkLlxuICAgKi9cbiAgYXN5bmMgYWJvcnRTdHJlYW1SZXNwb25zZXMoKSB7XG4gICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBbLi4udGhpcy5fYWN0aXZlU3RyZWFtUmVzcG9uc2VzLmtleXMoKV0pIHtcbiAgICAgIGlmIChyZXNwb25zZS5zdHJlYW1BYm9ydGVkKSBjb250aW51ZVxuICAgICAgcmVzcG9uc2Uuc3RyZWFtQWJvcnRlZCA9IHRydWVcbiAgICAgIHRoaXMuX2FjdGl2ZVN0cmVhbVJlc3BvbnNlcy5kZWxldGUocmVzcG9uc2UpXG4gICAgICBhd2FpdCB0aGlzLl9ydW5TdHJlYW1DbG9zZUNhbGxiYWNrcyhyZXNwb25zZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFya3MgZXZlcnkgaW4tZmxpZ2h0IHJlcXVlc3QgYXMgY2xpZW50LWRpc2Nvbm5lY3RlZCBhbmQgcnVucyBpdHNcbiAgICogZGlzY29ubmVjdCBjYWxsYmFja3MuIFRoZSB3b3JrZXIgaGFuZGxlciBjYWxscyB0aGlzIHdoZW4gdGhlIHVuZGVybHlpbmdcbiAgICogc29ja2V0IHRlYXJzIGRvd24sIHNvIGEgaGFuZGxlciB3aG9zZSByZXNwb25zZSBpcyBzdGlsbCBidWZmZXJlZCAoZS5nLlxuICAgKiB3YWl0aW5nIGluIGFuIGFkbWlzc2lvbiBxdWV1ZSkgY2FuIG9ic2VydmUgdGhlIGNsaWVudCBsZWF2aW5nIHdpdGhvdXRcbiAgICogd2FpdGluZyBmb3IgdGhlIHJlc3BvbnNlIHRvIGJlIHNlbnQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgbm90aWZ5Q2xpZW50RGlzY29ubmVjdCgpIHtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RSdW5uZXIgb2YgdGhpcy5yZXF1ZXN0UnVubmVycykge1xuICAgICAgaWYgKHJlcXVlc3RSdW5uZXIuZ2V0U3RhdGUoKSAhPT0gXCJydW5uaW5nXCIpIGNvbnRpbnVlXG4gICAgICByZXF1ZXN0UnVubmVyLmdldFJlcXVlc3QoKS5tYXJrQ2xpZW50RGlzY29ubmVjdGVkKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0aGUgY2xvc2UgY2FsbGJhY2tzIG9mIGEgZmluaXNoZWQgb3IgYWJvcnRlZCBzdHJlYW0gZXhhY3RseSBvbmNlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcmVzcG9uc2UuanNcIikuZGVmYXVsdH0gcmVzcG9uc2UgLSBGaW5pc2hlZCBzdHJlYW0uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIGV2ZXJ5IGNhbGxiYWNrIHJhbi5cbiAgICovXG4gIGFzeW5jIF9ydW5TdHJlYW1DbG9zZUNhbGxiYWNrcyhyZXNwb25zZSkge1xuICAgIGlmIChyZXNwb25zZS5zdHJlYW1DbG9zZUNhbGxiYWNrcy5zaXplID09PSAwKSByZXR1cm5cblxuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgcmVzcG9uc2Uuc3RyZWFtQ2xvc2VDYWxsYmFja3MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNhbGxiYWNrKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yUGF5bG9hZCA9IHtcbiAgICAgICAgICBjb250ZXh0OiB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnQsIHN0YWdlOiBcInN0cmVhbS1jbG9zZS1jYWxsYmFja1wifSxcbiAgICAgICAgICBlcnJvclxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5nZXRFcnJvckV2ZW50cygpLmVtaXQoXCJmcmFtZXdvcmstZXJyb3JcIiwgZXJyb3JQYXlsb2FkKVxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RXJyb3JFdmVudHMoKS5lbWl0KFwiYWxsLWVycm9yXCIsIHsuLi5lcnJvclBheWxvYWQsIGVycm9yVHlwZTogXCJmcmFtZXdvcmstZXJyb3JcIn0pXG4gICAgICB9XG4gICAgfVxuICAgIHJlc3BvbnNlLnN0cmVhbUNsb3NlQ2FsbGJhY2tzLmNsZWFyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNob3VsZCBjbG9zZSBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSByZXF1ZXN0IC0gUmVxdWVzdCBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGNsb3NlZC5cbiAgICovXG4gIHNob3VsZENsb3NlQ29ubmVjdGlvbihyZXF1ZXN0KSB7XG4gICAgY29uc3QgaHR0cFZlcnNpb24gPSByZXF1ZXN0Lmh0dHBWZXJzaW9uKClcbiAgICBjb25zdCBjb25uZWN0aW9uSGVhZGVyID0gcmVxdWVzdC5oZWFkZXIoXCJjb25uZWN0aW9uXCIpPy50b0xvd2VyQ2FzZSgpPy50cmltKClcbiAgICBjb25zdCBjb25uZWN0aW9uVG9rZW5zID0gY29ubmVjdGlvbkhlYWRlclxuICAgICAgPyBjb25uZWN0aW9uSGVhZGVyLnNwbGl0KFwiLFwiKS5tYXAoKHRva2VuKSA9PiB0b2tlbi50cmltKCkpLmZpbHRlcihCb29sZWFuKVxuICAgICAgOiBbXVxuXG4gICAgaWYgKGh0dHBWZXJzaW9uID09IFwid2Vic29ja2V0XCIpIHJldHVybiBmYWxzZVxuICAgIGlmIChjb25uZWN0aW9uVG9rZW5zLmluY2x1ZGVzKFwiY2xvc2VcIikpIHJldHVybiB0cnVlXG5cbiAgICBpZiAoaHR0cFZlcnNpb24gPT0gXCIxLjBcIiAmJiBjb25uZWN0aW9uSGVhZGVyICE9IFwia2VlcC1hbGl2ZVwiKSByZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgZm9yIHRoZSBzdGF0dXMgY29kZXMgdGhhdCBSRkMgNzIzMCDCpzMuMy4zIGRlY2xhcmVzXG4gKiBjYW5ub3QgY2FycnkgYSBtZXNzYWdlIGJvZHk6IGV2ZXJ5IDF4eCBpbmZvcm1hdGlvbmFsLCAyMDQgTm9cbiAqIENvbnRlbnQsIGFuZCAzMDQgTm90IE1vZGlmaWVkLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c0NvZGUgLSBIVFRQIHN0YXR1cyBjb2RlLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgc3RhdHVzIGNvZGUgZm9yYmlkcyBhIHJlc3BvbnNlIGJvZHkuXG4gKi9cbmZ1bmN0aW9uIGlzTm9Cb2R5U3RhdHVzQ29kZShzdGF0dXNDb2RlKSB7XG4gIHJldHVybiAoc3RhdHVzQ29kZSA+PSAxMDAgJiYgc3RhdHVzQ29kZSA8IDIwMCkgfHwgc3RhdHVzQ29kZSA9PT0gMjA0IHx8IHN0YXR1c0NvZGUgPT09IDMwNFxufVxuIl19
|