sonamu 0.11.15 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +12 -7
- package/dist/bin/build-config.d.ts +3 -1
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +17 -6
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/stream/__tests__/ws-test-helpers.d.ts +108 -0
- package/dist/stream/__tests__/ws-test-helpers.d.ts.map +1 -0
- package/dist/stream/__tests__/ws-test-helpers.js +260 -0
- package/dist/stream/index.d.ts +1 -0
- package/dist/stream/index.d.ts.map +1 -1
- package/dist/stream/index.js +4 -2
- package/dist/stream/ws-audience-resolver.d.ts +8 -5
- package/dist/stream/ws-audience-resolver.d.ts.map +1 -1
- package/dist/stream/ws-audience-resolver.js +16 -13
- package/dist/stream/ws-cluster-bus.d.ts +9 -4
- package/dist/stream/ws-cluster-bus.d.ts.map +1 -1
- package/dist/stream/ws-cluster-bus.js +1 -1
- package/dist/stream/ws-core.d.ts +10 -0
- package/dist/stream/ws-core.d.ts.map +1 -1
- package/dist/stream/ws-delivery.d.ts +30 -4
- package/dist/stream/ws-delivery.d.ts.map +1 -1
- package/dist/stream/ws-delivery.js +199 -52
- package/dist/stream/ws-frame.d.ts +15 -0
- package/dist/stream/ws-frame.d.ts.map +1 -0
- package/dist/stream/ws-frame.js +29 -0
- package/dist/stream/ws-local-connection-store.d.ts +4 -4
- package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
- package/dist/stream/ws-local-connection-store.js +2 -2
- package/dist/stream/ws-presence-index.d.ts +36 -0
- package/dist/stream/ws-presence-index.d.ts.map +1 -0
- package/dist/stream/ws-presence-index.js +177 -0
- package/dist/stream/ws-presence-store.d.ts +39 -39
- package/dist/stream/ws-presence-store.d.ts.map +1 -1
- package/dist/stream/ws-presence-store.js +22 -152
- package/dist/stream/ws-registry.d.ts +45 -17
- package/dist/stream/ws-registry.d.ts.map +1 -1
- package/dist/stream/ws-registry.js +169 -60
- package/dist/stream/ws-session-id.d.ts +14 -0
- package/dist/stream/ws-session-id.d.ts.map +1 -0
- package/dist/stream/ws-session-id.js +37 -0
- package/dist/stream/ws.d.ts +20 -10
- package/dist/stream/ws.d.ts.map +1 -1
- package/dist/stream/ws.js +59 -36
- package/package.json +1 -1
- package/src/api/__tests__/sonamu.websocket-routes.test.ts +234 -0
- package/src/api/__tests__/sonamu.websocket.test.ts +241 -20
- package/src/api/sonamu.ts +20 -7
- package/src/bin/__tests__/build-web-command.test.ts +57 -0
- package/src/bin/__tests__/zod-compiler-build.test.ts +5 -3
- package/src/bin/build-config.ts +19 -7
- package/src/index.ts +1 -0
- package/src/stream/__tests__/ws-contracts.test.ts +483 -265
- package/src/stream/__tests__/ws-multinode.test.ts +326 -0
- package/src/stream/__tests__/ws-registry-async.test.ts +855 -0
- package/src/stream/__tests__/ws-test-helpers.ts +360 -0
- package/src/stream/__tests__/ws.test.ts +342 -145
- package/src/stream/index.ts +1 -0
- package/src/stream/ws-audience-resolver.ts +21 -19
- package/src/stream/ws-cluster-bus.ts +12 -4
- package/src/stream/ws-core.ts +14 -0
- package/src/stream/ws-delivery.ts +321 -97
- package/src/stream/ws-frame.ts +39 -0
- package/src/stream/ws-local-connection-store.ts +10 -9
- package/src/stream/ws-presence-index.ts +273 -0
- package/src/stream/ws-presence-store.ts +64 -284
- package/src/stream/ws-registry.ts +272 -85
- package/src/stream/ws-session-id.ts +39 -0
- package/src/stream/ws.ts +91 -50
package/dist/stream/ws.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { init_runtime_value, isStringValue } from "../utils/runtime-value.js";
|
|
3
3
|
import { init_runtime_type, runtimeTypeOf } from "../runtime-type.js";
|
|
4
|
+
import { encodeWebSocketFrame, init_ws_frame } from "./ws-frame.js";
|
|
5
|
+
import { createWebSocketNodeId, createWebSocketSessionId, init_ws_session_id } from "./ws-session-id.js";
|
|
4
6
|
import { generateSpanId, init_ws_telemetry_trace, parseTraceParent } from "./ws-telemetry-trace.js";
|
|
5
7
|
import { createWebSocketTelemetryController, init_ws_telemetry, isPromiseLike } from "./ws-telemetry.js";
|
|
6
8
|
import { WebSocketRegistry, init_ws_registry } from "./ws-registry.js";
|
|
7
9
|
import { z } from "zod";
|
|
8
10
|
import { randomUUID } from "node:crypto";
|
|
9
|
-
import { hostname } from "node:os";
|
|
10
11
|
//#region src/stream/ws.ts
|
|
11
12
|
function createWebSocketRuntime(options = {}) {
|
|
12
13
|
return new WebSocketRuntime(options);
|
|
@@ -40,7 +41,9 @@ var WS_CONNECTING, WS_OPEN, WS_CLOSED, WS_CLOSE_CODE_GOING_AWAY, WS_CLOSE_CODE_I
|
|
|
40
41
|
var init_ws = __esmMin((() => {
|
|
41
42
|
init_runtime_type();
|
|
42
43
|
init_runtime_value();
|
|
44
|
+
init_ws_frame();
|
|
43
45
|
init_ws_registry();
|
|
46
|
+
init_ws_session_id();
|
|
44
47
|
init_ws_telemetry();
|
|
45
48
|
init_ws_telemetry_trace();
|
|
46
49
|
WS_CONNECTING = 0;
|
|
@@ -68,7 +71,7 @@ var init_ws = __esmMin((() => {
|
|
|
68
71
|
registry;
|
|
69
72
|
telemetryController;
|
|
70
73
|
constructor(options = {}) {
|
|
71
|
-
const resolvedNodeId = options.nodeId ??
|
|
74
|
+
const resolvedNodeId = options.nodeId ?? options.presenceStore?.nodeId ?? options.clusterBus?.nodeId ?? createWebSocketNodeId();
|
|
72
75
|
this.telemetryController = createWebSocketTelemetryController(options.telemetry, {
|
|
73
76
|
runtimeId: randomUUID(),
|
|
74
77
|
nodeId: resolvedNodeId
|
|
@@ -77,31 +80,43 @@ var init_ws = __esmMin((() => {
|
|
|
77
80
|
nodeId: resolvedNodeId,
|
|
78
81
|
presenceStore: options.presenceStore,
|
|
79
82
|
clusterBus: options.clusterBus,
|
|
80
|
-
telemetryController: this.telemetryController
|
|
83
|
+
telemetryController: this.telemetryController,
|
|
84
|
+
drainTimeoutMs: options.drainTimeoutMs
|
|
81
85
|
};
|
|
82
86
|
this.registry = new WebSocketRegistry(registryOptions);
|
|
83
87
|
}
|
|
84
|
-
|
|
85
|
-
|
|
88
|
+
registerRoute(routeKey, route) {
|
|
89
|
+
this.registry.registerRoute(routeKey, route.outEvents);
|
|
90
|
+
}
|
|
91
|
+
replaceRoutes(routes) {
|
|
92
|
+
this.registry.replaceRoutes(routes);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 소켓 리스너를 동기로 붙이고 registry에 등록한다. store.register가 끝나면(실패해도) resolve한다.
|
|
96
|
+
*/
|
|
97
|
+
async registerConnection(socket, options) {
|
|
98
|
+
const connection = new WebSocketConnectionImpl(socket, {
|
|
86
99
|
...options,
|
|
87
100
|
registry: this.registry,
|
|
88
101
|
telemetryController: this.telemetryController
|
|
89
102
|
});
|
|
103
|
+
await this.registry.register(connection, options.active ?? true);
|
|
104
|
+
return connection;
|
|
90
105
|
}
|
|
91
106
|
activateConnection(connectionId) {
|
|
92
|
-
this.registry.activate(connectionId);
|
|
107
|
+
return this.registry.activate(connectionId);
|
|
93
108
|
}
|
|
94
109
|
broadcast(event, data, namespace) {
|
|
95
|
-
this.registry.broadcast(event, data, namespace);
|
|
110
|
+
return this.registry.broadcast(event, data, namespace);
|
|
96
111
|
}
|
|
97
112
|
publishToRoom(roomId, event, data, namespace) {
|
|
98
|
-
this.registry.publishToRoom(roomId, event, data, namespace);
|
|
113
|
+
return this.registry.publishToRoom(roomId, event, data, namespace);
|
|
99
114
|
}
|
|
100
115
|
publishToUser(userId, event, data, namespace) {
|
|
101
|
-
this.registry.publishToUser(userId, event, data, namespace);
|
|
116
|
+
return this.registry.publishToUser(userId, event, data, namespace);
|
|
102
117
|
}
|
|
103
118
|
publishToAudience(audience, event, data) {
|
|
104
|
-
this.registry.publishToAudience(audience, event, data);
|
|
119
|
+
return this.registry.publishToAudience(audience, event, data);
|
|
105
120
|
}
|
|
106
121
|
async shutdown(code = WS_CLOSE_CODE_GOING_AWAY, reason = "Server shutting down") {
|
|
107
122
|
await this.registry.shutdown(code, reason);
|
|
@@ -111,9 +126,11 @@ var init_ws = __esmMin((() => {
|
|
|
111
126
|
WebSocketConnectionImpl = class {
|
|
112
127
|
socket;
|
|
113
128
|
options;
|
|
114
|
-
id
|
|
129
|
+
id;
|
|
115
130
|
transport = "ws";
|
|
116
131
|
namespace;
|
|
132
|
+
routeKey;
|
|
133
|
+
outEvents;
|
|
117
134
|
closeCallbacks = [];
|
|
118
135
|
messageHandlers = /* @__PURE__ */ new Map();
|
|
119
136
|
pendingMessages = [];
|
|
@@ -122,7 +139,6 @@ var init_ws = __esmMin((() => {
|
|
|
122
139
|
resolveClosePromise;
|
|
123
140
|
heartbeatMs;
|
|
124
141
|
eventSchemasIn;
|
|
125
|
-
eventSchemasOut;
|
|
126
142
|
connectionTraceId;
|
|
127
143
|
connectionSpanId;
|
|
128
144
|
connectionParentSpanId;
|
|
@@ -141,6 +157,9 @@ var init_ws = __esmMin((() => {
|
|
|
141
157
|
constructor(socket, options) {
|
|
142
158
|
this.socket = socket;
|
|
143
159
|
this.options = options;
|
|
160
|
+
this.id = createWebSocketSessionId(options.registry.nodeId);
|
|
161
|
+
this.routeKey = options.routeKey;
|
|
162
|
+
this.outEvents = options.outEvents;
|
|
144
163
|
this.namespace = options.namespace ?? "default";
|
|
145
164
|
this.heartbeatMs = options.heartbeat ?? 3e4;
|
|
146
165
|
this.connectionTraceId = options.traceId;
|
|
@@ -148,13 +167,11 @@ var init_ws = __esmMin((() => {
|
|
|
148
167
|
this.connectionParentSpanId = options.parentSpanId;
|
|
149
168
|
this.connectionSampled = options.sampled;
|
|
150
169
|
this.eventSchemasIn = options.inEvents["shape"];
|
|
151
|
-
this.eventSchemasOut = options.outEvents["shape"];
|
|
152
170
|
let resolveClosePromise;
|
|
153
171
|
this.closePromise = new Promise((resolve) => {
|
|
154
172
|
resolveClosePromise = resolve;
|
|
155
173
|
});
|
|
156
174
|
this.resolveClosePromise = resolveClosePromise;
|
|
157
|
-
this.options.registry.register(this, options.active ?? true);
|
|
158
175
|
this.socket.on("message", this.handleMessage);
|
|
159
176
|
this.socket.on("close", this.handleClose);
|
|
160
177
|
this.socket.on("error", this.handleError);
|
|
@@ -184,18 +201,25 @@ var init_ws = __esmMin((() => {
|
|
|
184
201
|
return this.closePromise;
|
|
185
202
|
}
|
|
186
203
|
join(roomId) {
|
|
187
|
-
this.options.registry.join(this.id, roomId);
|
|
204
|
+
return this.options.registry.join(this.id, roomId);
|
|
188
205
|
}
|
|
189
206
|
leave(roomId) {
|
|
190
|
-
this.options.registry.leave(this.id, roomId);
|
|
207
|
+
return this.options.registry.leave(this.id, roomId);
|
|
191
208
|
}
|
|
192
209
|
setUserId(userId) {
|
|
193
210
|
this.currentUserId = String(userId);
|
|
194
|
-
this.options.registry.setUserId(this.id, userId);
|
|
211
|
+
return this.options.registry.setUserId(this.id, userId);
|
|
195
212
|
}
|
|
196
213
|
clearUserId() {
|
|
197
214
|
this.currentUserId = void 0;
|
|
198
|
-
this.options.registry.clearUserId(this.id);
|
|
215
|
+
return this.options.registry.clearUserId(this.id);
|
|
216
|
+
}
|
|
217
|
+
sendFrame(event, frame) {
|
|
218
|
+
if (this.closedInternal || this.socket.readyState !== WS_OPEN) {
|
|
219
|
+
this.emitPublishDropped(event);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
this.enqueueOutboundMessage(frame, event);
|
|
199
223
|
}
|
|
200
224
|
getTelemetrySnapshot() {
|
|
201
225
|
return {
|
|
@@ -402,8 +426,8 @@ var init_ws = __esmMin((() => {
|
|
|
402
426
|
});
|
|
403
427
|
}
|
|
404
428
|
publishValidated(event, data) {
|
|
405
|
-
const
|
|
406
|
-
if (
|
|
429
|
+
const encoding = encodeWebSocketFrame(this.outEvents, event, data);
|
|
430
|
+
if (encoding.status === "unknownEvent") {
|
|
407
431
|
this.options.telemetryController.emit({
|
|
408
432
|
name: "ws.publish.rejected",
|
|
409
433
|
level: "error",
|
|
@@ -415,8 +439,7 @@ var init_ws = __esmMin((() => {
|
|
|
415
439
|
});
|
|
416
440
|
throw new Error(`Unknown websocket event: ${event}`);
|
|
417
441
|
}
|
|
418
|
-
|
|
419
|
-
if (!parsed.success) {
|
|
442
|
+
if (encoding.status === "invalidPayload") {
|
|
420
443
|
this.options.telemetryController.emit({
|
|
421
444
|
name: "ws.publish.rejected",
|
|
422
445
|
level: "error",
|
|
@@ -429,21 +452,21 @@ var init_ws = __esmMin((() => {
|
|
|
429
452
|
throw new Error(`Invalid websocket event payload: ${event}`);
|
|
430
453
|
}
|
|
431
454
|
if (this.closedInternal || this.socket.readyState !== WS_OPEN) {
|
|
432
|
-
this.
|
|
433
|
-
name: "ws.publish.dropped",
|
|
434
|
-
level: "debug",
|
|
435
|
-
...this.telemetryFields(),
|
|
436
|
-
detail: {
|
|
437
|
-
event,
|
|
438
|
-
reason: "connectionClosed"
|
|
439
|
-
}
|
|
440
|
-
});
|
|
455
|
+
this.emitPublishDropped(event);
|
|
441
456
|
return;
|
|
442
457
|
}
|
|
443
|
-
this.enqueueOutboundMessage(
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
458
|
+
this.enqueueOutboundMessage(encoding.frame, event);
|
|
459
|
+
}
|
|
460
|
+
emitPublishDropped(event) {
|
|
461
|
+
this.options.telemetryController.emit({
|
|
462
|
+
name: "ws.publish.dropped",
|
|
463
|
+
level: "debug",
|
|
464
|
+
...this.telemetryFields(),
|
|
465
|
+
detail: {
|
|
466
|
+
event,
|
|
467
|
+
reason: "connectionClosed"
|
|
468
|
+
}
|
|
469
|
+
});
|
|
447
470
|
}
|
|
448
471
|
markClosed(code, _reason) {
|
|
449
472
|
if (this.closedInternal) return;
|
|
@@ -633,4 +656,4 @@ var init_ws = __esmMin((() => {
|
|
|
633
656
|
init_ws();
|
|
634
657
|
export { WebSocketRuntime, createWebSocketRuntime, init_ws };
|
|
635
658
|
|
|
636
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyB0eXBlIEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHsgaG9zdG5hbWUgfSBmcm9tIFwibm9kZTpvc1wiO1xuXG5pbXBvcnQgeyB0eXBlIFJhd0RhdGEsIHR5cGUgV2ViU29ja2V0IH0gZnJvbSBcIndzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBydW50aW1lVHlwZU9mIH0gZnJvbSBcIi4uL3J1bnRpbWUtdHlwZVwiO1xuaW1wb3J0IHsgaXNTdHJpbmdWYWx1ZSB9IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldEF1ZGllbmNlIH0gZnJvbSBcIi4vd3MtYXVkaWVuY2VcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0Q2x1c3RlckJ1cyB9IGZyb20gXCIuL3dzLWNsdXN0ZXItYnVzXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldFByZXNlbmNlU3RvcmUgfSBmcm9tIFwiLi93cy1wcmVzZW5jZS1zdG9yZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbixcbiAgV2ViU29ja2V0UmVnaXN0cnksXG4gIHR5cGUgV2ViU29ja2V0UmVnaXN0cnlPcHRpb25zLFxuICB0eXBlIFdlYlNvY2tldFJvb21JZCxcbiAgdHlwZSBXZWJTb2NrZXRVc2VySWQsXG59IGZyb20gXCIuL3dzLXJlZ2lzdHJ5XCI7XG5pbXBvcnQge1xuICB0eXBlIFRlbGVtZXRyeUNvbnRleHRQcm92aWRlcixcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uU25hcHNob3QsXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQsXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcixcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlPcHRpb25zLFxuICB0eXBlIFRlbGVtZXRyeUluc3BlY3RhYmxlQ29ubmVjdGlvbixcbiAgY3JlYXRlV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcixcbiAgaXNQcm9taXNlTGlrZSxcbn0gZnJvbSBcIi4vd3MtdGVsZW1ldHJ5XCI7XG5pbXBvcnQgeyBwYXJzZVRyYWNlUGFyZW50LCBnZW5lcmF0ZVNwYW5JZCB9IGZyb20gXCIuL3dzLXRlbGVtZXRyeS10cmFjZVwiO1xuXG4vLyB0cmFuc3BvcnQtbGV2ZWwg7IOB7IiY7JmAIHF1ZXVlIHRocmVzaG9sZOulvCDtlZwg7YyM7J287JeQIOuqqOyVhCBsaWZlY3ljbGUvYmFja3ByZXNzdXJlIOygleyxheydhCDspJHslZntmZTtlahcbmNvbnN0IFdTX0NPTk5FQ1RJTkcgPSAwO1xuY29uc3QgV1NfT1BFTiA9IDE7XG5jb25zdCBXU19DTE9TRUQgPSAzO1xuLy8gUkZDIDY0NTUgY2xvc2UgY29kZXMgdXNlZCBieSBTb25hbXUncyBXZWJTb2NrZXQgcnVudGltZS5cbmNvbnN0IFdTX0NMT1NFX0NPREVfR09JTkdfQVdBWSA9IDEwMDE7XG5jb25zdCBXU19DTE9TRV9DT0RFX0lOVkFMSURfRlJBTUVfUEFZTE9BRF9EQVRBID0gMTAwNztcbmNvbnN0IFdTX0NMT1NFX0NPREVfUE9MSUNZX1ZJT0xBVElPTiA9IDEwMDg7XG5jb25zdCBXU19DTE9TRV9DT0RFX0lOVEVSTkFMX0VSUk9SID0gMTAxMTtcbmNvbnN0IFdTX0NMT1NFX0NPREVfVFJZX0FHQUlOX0xBVEVSID0gMTAxMztcbmNvbnN0IE1BWF9QRU5ESU5HX01FU1NBR0VTID0gMTAwO1xuY29uc3QgTUFYX1BFTkRJTkdfT1VUQk9VTkRfTUVTU0FHRVMgPSAxXzAwMDtcbmNvbnN0IE1BWF9TT0NLRVRfQlVGRkVSRURfQU1PVU5UID0gMV8wNDhfNTc2O1xuY29uc3QgT1VUQk9VTkRfQkFUQ0hfU0laRSA9IDUwO1xuY29uc3QgT1VUQk9VTkRfUkVUUllfREVMQVlfTVMgPSA1O1xuXG4vLyBlbnZlbG9wZeydhCBge2V2ZW50LCBkYXRhfWAg7ZiV7YOc66GcIOqzoOygle2VtCBzZXJ2ZXIgaGFuZGxlcuyZgCBnZW5lcmF0ZWQgY2xpZW506rCAIOqwmeydgCBmcmFtaW5nIGNvbnRyYWN066W8IOyTsOqyjCDtlahcbi8vIG1ldGHripQgb3B0aW9uYWzsnbTrr4DroZwg6riw7KG0IGB7ZXZlbnQsIGRhdGF9YCDrqZTsi5zsp4Drj4Qg6re464yA66GcIO2MjOyLseuQqCAoYmFja3dhcmQtY29tcGF0aWJsZSlcbmNvbnN0IFdlYlNvY2tldEVudmVsb3BlU2NoZW1hID0gei5vYmplY3Qoe1xuICBldmVudDogei5zdHJpbmcoKSxcbiAgZGF0YTogei5qc29uKCksXG4gIG1ldGE6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIHRyYWNlcGFyZW50OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICB0cmFjZXN0YXRlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG50eXBlIE1lc3NhZ2VIYW5kbGVyPFQ+ID0gKFxuICBkYXRhOiBULFxuICB0ZWxlbWV0cnlDb250ZXh0PzogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQsXG4pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xudHlwZSBDbG9zZUhhbmRsZXIgPSAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0RXZlbnRNYXA8RXZlbnRQYXlsb2FkID0gbmV2ZXI+ID0gUmVjb3JkPHN0cmluZywgRXZlbnRQYXlsb2FkPjtcbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRyYW5zcG9ydCA9IFBpY2s8XG4gIFdlYlNvY2tldCxcbiAgXCJidWZmZXJlZEFtb3VudFwiIHwgXCJjbG9zZVwiIHwgXCJwaW5nXCIgfCBcInJlYWR5U3RhdGVcIiB8IFwic2VuZFwiIHwgXCJ0ZXJtaW5hdGVcIlxuPiAmIHtcbiAgb2ZmOiAoLi4uYXJnczogUGFyYW1ldGVyczxFdmVudEVtaXR0ZXJbXCJvZmZcIl0+KSA9PiB2b2lkO1xuICBvbjogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8RXZlbnRFbWl0dGVyW1wib25cIl0+KSA9PiB2b2lkO1xufTtcblxudHlwZSBXZWJTb2NrZXRFdmVudEZpZWxkcyA9IFJlY29yZDxzdHJpbmcsIHouWm9kVHlwZT47XG50eXBlIEluZmVyV2ViU29ja2V0RXZlbnRNYXA8VFNjaGVtYSBleHRlbmRzIFdlYlNvY2tldEV2ZW50RmllbGRzPiA9IHouaW5mZXI8ei5ab2RPYmplY3Q8VFNjaGVtYT4+O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRPdXRFdmVudHM8VE91dCBleHRlbmRzIG9iamVjdCA9IFdlYlNvY2tldEV2ZW50TWFwPiA9IFRPdXQ7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldEluRXZlbnRzPFRJbiBleHRlbmRzIG9iamVjdCA9IFdlYlNvY2tldEV2ZW50TWFwPiA9IFRJbjtcblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRDb25uZWN0aW9uPFxuICBUT3V0IGV4dGVuZHMgb2JqZWN0ID0gV2ViU29ja2V0RXZlbnRNYXAsXG4gIFRJbiBleHRlbmRzIG9iamVjdCA9IFdlYlNvY2tldEV2ZW50TWFwLFxuPiBleHRlbmRzIE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uIHtcbiAgdHJhbnNwb3J0OiBcIndzXCI7XG4gIG9uQ2xvc2UoY2FsbGJhY2s6IENsb3NlSGFuZGxlcik6IHZvaWQ7XG4gIG9uTWVzc2FnZTxLIGV4dGVuZHMga2V5b2YgV2ViU29ja2V0SW5FdmVudHM8VEluPj4oXG4gICAgZXZlbnQ6IEssXG4gICAgaGFuZGxlcjogTWVzc2FnZUhhbmRsZXI8V2ViU29ja2V0SW5FdmVudHM8VEluPltLXT4sXG4gICk6IHZvaWQ7XG4gIHB1Ymxpc2g8SyBleHRlbmRzIGtleW9mIFdlYlNvY2tldE91dEV2ZW50czxUT3V0Pj4oXG4gICAgZXZlbnQ6IEssXG4gICAgZGF0YTogV2ViU29ja2V0T3V0RXZlbnRzPFRPdXQ+W0tdLFxuICApOiB2b2lkO1xuICB3YWl0Rm9yQ2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcbiAgam9pbihyb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IHZvaWQ7XG4gIGxlYXZlKHJvb21JZDogV2ViU29ja2V0Um9vbUlkKTogdm9pZDtcbiAgc2V0VXNlcklkKHVzZXJJZDogV2ViU29ja2V0VXNlcklkKTogdm9pZDtcbiAgY2xlYXJVc2VySWQoKTogdm9pZDtcbn1cblxuZXhwb3J0IHR5cGUgQW55V2ViU29ja2V0Q29ubmVjdGlvbiA9IFdlYlNvY2tldENvbm5lY3Rpb248b2JqZWN0LCBvYmplY3Q+O1xuXG50eXBlIFBhcnNlZEVudmVsb3BlID0gei5pbmZlcjx0eXBlb2YgV2ViU29ja2V0RW52ZWxvcGVTY2hlbWE+O1xuXG50eXBlIFdlYlNvY2tldENvbm5lY3Rpb25PcHRpb25zPFxuICBUT3V0IGV4dGVuZHMgV2ViU29ja2V0RXZlbnRGaWVsZHMsXG4gIFRJbiBleHRlbmRzIFdlYlNvY2tldEV2ZW50RmllbGRzLFxuPiA9IHtcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICBoZWFydGJlYXQ/OiBudW1iZXI7XG4gIGFjdGl2ZT86IGJvb2xlYW47XG4gIG91dEV2ZW50czogei5ab2RPYmplY3Q8VE91dD47XG4gIGluRXZlbnRzOiB6LlpvZE9iamVjdDxUSW4+O1xuICByZWdpc3RyeTogV2ViU29ja2V0UmVnaXN0cnk7XG4gIHRlbGVtZXRyeUNvbnRyb2xsZXI6IFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXI7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFJ1bnRpbWVPcHRpb25zID0ge1xuICBub2RlSWQ/OiBzdHJpbmc7XG4gIHByZXNlbmNlU3RvcmU/OiBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlO1xuICBjbHVzdGVyQnVzPzogV2ViU29ja2V0Q2x1c3RlckJ1cztcbiAgdGVsZW1ldHJ5PzogYm9vbGVhbiB8IFdlYlNvY2tldFRlbGVtZXRyeU9wdGlvbnM7XG59O1xuXG4vLyByZWdpc3RyeeulvCDshozsnKDtlZjqs6AgY29ubmVjdGlvbiDsg53shLEvc2h1dGRvd27snYQg64u064u57ZWoLiBTb25hbXUg7JWg7ZSM66as7LyA7J207IWYIOyImOuqheyjvOq4sOyZgCDqsJnsnbQg7JuA7KeB7J2064+E66GdIOyEpOqzhO2VqFxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldFJ1bnRpbWUge1xuICByZWFkb25seSByZWdpc3RyeTogV2ViU29ja2V0UmVnaXN0cnk7XG4gIHJlYWRvbmx5IHRlbGVtZXRyeUNvbnRyb2xsZXI6IFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXI7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogV2ViU29ja2V0UnVudGltZU9wdGlvbnMgPSB7fSkge1xuICAgIC8vIOu2hOyCsCDtmZjqsr3sl5DshJwg64W465OcIOqwhCDstqnrj4zsnYQg66eJ6riwIOychO2VtCBob3N0bmFtZSArIHBpZOuhnCDrlJTtj7Ttirgg7Iud67OE7J6Q66W8IOunjOuToOuLpC5cbiAgICAvLyDqsJnsnYAg7Zi47Iqk7Yq47JeQIOyXrOufrCDtlITroZzshLjsiqTqsIAg65agIOyeiOyWtOuPhCBwaWTroZwg6rWs67aE65CY66mwLCDroZzqt7gv66mU7Yq466at7JeQ7ISc64+EIOyLneuzhOydtCDsiazsm4BcbiAgICBjb25zdCByZXNvbHZlZE5vZGVJZCA9IG9wdGlvbnMubm9kZUlkID8/IGAke2hvc3RuYW1lKCl9LSR7cHJvY2Vzcy5waWR9YDtcbiAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIgPSBjcmVhdGVXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyKG9wdGlvbnMudGVsZW1ldHJ5LCB7XG4gICAgICBydW50aW1lSWQ6IHJhbmRvbVVVSUQoKSxcbiAgICAgIG5vZGVJZDogcmVzb2x2ZWROb2RlSWQsXG4gICAgfSk7XG4gICAgY29uc3QgcmVnaXN0cnlPcHRpb25zOiBXZWJTb2NrZXRSZWdpc3RyeU9wdGlvbnMgPSB7XG4gICAgICBub2RlSWQ6IHJlc29sdmVkTm9kZUlkLFxuICAgICAgcHJlc2VuY2VTdG9yZTogb3B0aW9ucy5wcmVzZW5jZVN0b3JlLFxuICAgICAgY2x1c3RlckJ1czogb3B0aW9ucy5jbHVzdGVyQnVzLFxuICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcjogdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLFxuICAgIH07XG4gICAgdGhpcy5yZWdpc3RyeSA9IG5ldyBXZWJTb2NrZXRSZWdpc3RyeShyZWdpc3RyeU9wdGlvbnMpO1xuICB9XG5cbiAgcmVnaXN0ZXJDb25uZWN0aW9uPFxuICAgIFRPdXRTY2hlbWEgZXh0ZW5kcyBXZWJTb2NrZXRFdmVudEZpZWxkcyxcbiAgICBUSW5TY2hlbWEgZXh0ZW5kcyBXZWJTb2NrZXRFdmVudEZpZWxkcyxcbiAgPihcbiAgICBzb2NrZXQ6IFdlYlNvY2tldFRyYW5zcG9ydCxcbiAgICBvcHRpb25zOiBPbWl0PFxuICAgICAgV2ViU29ja2V0Q29ubmVjdGlvbk9wdGlvbnM8VE91dFNjaGVtYSwgVEluU2NoZW1hPixcbiAgICAgIFwicmVnaXN0cnlcIiB8IFwidGVsZW1ldHJ5Q29udHJvbGxlclwiXG4gICAgPixcbiAgKTogV2ViU29ja2V0Q29ubmVjdGlvbjxJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRPdXRTY2hlbWE+LCBJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRJblNjaGVtYT4+IHtcbiAgICByZXR1cm4gbmV3IFdlYlNvY2tldENvbm5lY3Rpb25JbXBsKHNvY2tldCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHJlZ2lzdHJ5OiB0aGlzLnJlZ2lzdHJ5LFxuICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcjogdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLFxuICAgIH0pO1xuICB9XG5cbiAgYWN0aXZhdGVDb25uZWN0aW9uKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RyeS5hY3RpdmF0ZShjb25uZWN0aW9uSWQpO1xuICB9XG5cbiAgYnJvYWRjYXN0PERhdGE+KGV2ZW50OiBzdHJpbmcsIGRhdGE6IERhdGEsIG5hbWVzcGFjZT86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0cnkuYnJvYWRjYXN0KGV2ZW50LCBkYXRhLCBuYW1lc3BhY2UpO1xuICB9XG5cbiAgcHVibGlzaFRvUm9vbTxEYXRhPihcbiAgICByb29tSWQ6IFdlYlNvY2tldFJvb21JZCxcbiAgICBldmVudDogc3RyaW5nLFxuICAgIGRhdGE6IERhdGEsXG4gICAgbmFtZXNwYWNlPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdHJ5LnB1Ymxpc2hUb1Jvb20ocm9vbUlkLCBldmVudCwgZGF0YSwgbmFtZXNwYWNlKTtcbiAgfVxuXG4gIHB1Ymxpc2hUb1VzZXI8RGF0YT4oXG4gICAgdXNlcklkOiBXZWJTb2NrZXRVc2VySWQsXG4gICAgZXZlbnQ6IHN0cmluZyxcbiAgICBkYXRhOiBEYXRhLFxuICAgIG5hbWVzcGFjZT86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RyeS5wdWJsaXNoVG9Vc2VyKHVzZXJJZCwgZXZlbnQsIGRhdGEsIG5hbWVzcGFjZSk7XG4gIH1cblxuICBwdWJsaXNoVG9BdWRpZW5jZTxEYXRhPihhdWRpZW5jZTogV2ViU29ja2V0QXVkaWVuY2UsIGV2ZW50OiBzdHJpbmcsIGRhdGE6IERhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdHJ5LnB1Ymxpc2hUb0F1ZGllbmNlKGF1ZGllbmNlLCBldmVudCwgZGF0YSk7XG4gIH1cblxuICAvLyDtlITroZzshLjsiqQg7KKF66OMIOyLnCDsgrTslYTsnojripQg7Jew6rKw7J20IOuCqOyngCDslYrrj4TroZ0gcmVnaXN0cnnrpbwg7Iic7ZqM7ZW0IOydvOq0hCDsooXro4ztlahcbiAgYXN5bmMgc2h1dGRvd24oXG4gICAgY29kZTogbnVtYmVyID0gV1NfQ0xPU0VfQ09ERV9HT0lOR19BV0FZLFxuICAgIHJlYXNvbiA9IFwiU2VydmVyIHNodXR0aW5nIGRvd25cIixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZWdpc3RyeS5zaHV0ZG93bihjb2RlLCByZWFzb24pO1xuICAgIGF3YWl0IHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5zaHV0ZG93bigpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJTb2NrZXRSdW50aW1lKG9wdGlvbnM6IFdlYlNvY2tldFJ1bnRpbWVPcHRpb25zID0ge30pOiBXZWJTb2NrZXRSdW50aW1lIHtcbiAgcmV0dXJuIG5ldyBXZWJTb2NrZXRSdW50aW1lKG9wdGlvbnMpO1xufVxuXG5jbGFzcyBXZWJTb2NrZXRDb25uZWN0aW9uSW1wbDxcbiAgVE91dFNjaGVtYSBleHRlbmRzIFdlYlNvY2tldEV2ZW50RmllbGRzLFxuICBUSW5TY2hlbWEgZXh0ZW5kcyBXZWJTb2NrZXRFdmVudEZpZWxkcyxcbj5cbiAgaW1wbGVtZW50c1xuICAgIFdlYlNvY2tldENvbm5lY3Rpb248SW5mZXJXZWJTb2NrZXRFdmVudE1hcDxUT3V0U2NoZW1hPiwgSW5mZXJXZWJTb2NrZXRFdmVudE1hcDxUSW5TY2hlbWE+PixcbiAgICBUZWxlbWV0cnlJbnNwZWN0YWJsZUNvbm5lY3Rpb24sXG4gICAgVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyXG57XG4gIHJlYWRvbmx5IGlkID0gcmFuZG9tVVVJRCgpO1xuICByZWFkb25seSB0cmFuc3BvcnQgPSBcIndzXCI7XG4gIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2xvc2VDYWxsYmFja3M6IENsb3NlSGFuZGxlcltdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZUhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIEFycmF5PE1lc3NhZ2VIYW5kbGVyPHVua25vd24+Pj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nTWVzc2FnZXM6IFBhcnNlZEVudmVsb3BlW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nT3V0Ym91bmRNZXNzYWdlczogQXJyYXk8eyBwYXlsb2FkOiBzdHJpbmc7IGV2ZW50OiBzdHJpbmcgfT4gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBjbG9zZVByb21pc2U6IFByb21pc2U8dm9pZD47XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZUNsb3NlUHJvbWlzZTogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBoZWFydGJlYXRNczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50U2NoZW1hc0luOiBSZWNvcmQ8c3RyaW5nLCB6LlpvZFR5cGVBbnk+O1xuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50U2NoZW1hc091dDogUmVjb3JkPHN0cmluZywgei5ab2RUeXBlQW55PjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpb25UcmFjZUlkPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpb25TcGFuSWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGlvblBhcmVudFNwYW5JZD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0aW9uU2FtcGxlZD86IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGlvblN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gIC8vIGNvbm5lY3Rpb24g7IiY66qFIOuPmeyViCDsnKDsp4DrkJjripQg7Iud67OE7J6QLiBzZXRVc2VySWQvY2xlYXJVc2VySWTroZwg7JeF642w7J207Yq465CY66mwIGVtaXQgaG90IHBhdGjsl5DshJwg66ek67KIIHJlZ2lzdHJ5IGxvb2t1cO2VmOyngCDslYrrj4TroZ0g7LqQ7Iuc7ZWoXG4gIHByaXZhdGUgY3VycmVudFVzZXJJZD86IHN0cmluZztcblxuICBnZXQgdXNlcklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFVzZXJJZDtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VkSW50ZXJuYWwgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjbG9zZVN0YXJ0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhd2FpdGluZ1BvbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBoZWFydGJlYXRUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWVzc2FnZVF1ZXVlOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHByaXZhdGUgb3V0Ym91bmRGbHVzaFNjaGVkdWxlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc29ja2V0OiBXZWJTb2NrZXRUcmFuc3BvcnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBXZWJTb2NrZXRDb25uZWN0aW9uT3B0aW9uczxUT3V0U2NoZW1hLCBUSW5TY2hlbWE+LFxuICApIHtcbiAgICB0aGlzLm5hbWVzcGFjZSA9IG9wdGlvbnMubmFtZXNwYWNlID8/IFwiZGVmYXVsdFwiO1xuICAgIHRoaXMuaGVhcnRiZWF0TXMgPSBvcHRpb25zLmhlYXJ0YmVhdCA/PyAzMDAwMDtcbiAgICB0aGlzLmNvbm5lY3Rpb25UcmFjZUlkID0gb3B0aW9ucy50cmFjZUlkO1xuICAgIHRoaXMuY29ubmVjdGlvblNwYW5JZCA9IG9wdGlvbnMuc3BhbklkO1xuICAgIHRoaXMuY29ubmVjdGlvblBhcmVudFNwYW5JZCA9IG9wdGlvbnMucGFyZW50U3BhbklkO1xuICAgIHRoaXMuY29ubmVjdGlvblNhbXBsZWQgPSBvcHRpb25zLnNhbXBsZWQ7XG4gICAgdGhpcy5ldmVudFNjaGVtYXNJbiA9IG9wdGlvbnMuaW5FdmVudHNbXCJzaGFwZVwiXTtcbiAgICB0aGlzLmV2ZW50U2NoZW1hc091dCA9IG9wdGlvbnMub3V0RXZlbnRzW1wic2hhcGVcIl07XG5cbiAgICBsZXQgcmVzb2x2ZUNsb3NlUHJvbWlzZSE6ICgpID0+IHZvaWQ7XG4gICAgdGhpcy5jbG9zZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgcmVzb2x2ZUNsb3NlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG4gICAgdGhpcy5yZXNvbHZlQ2xvc2VQcm9taXNlID0gcmVzb2x2ZUNsb3NlUHJvbWlzZTtcblxuICAgIHRoaXMub3B0aW9ucy5yZWdpc3RyeS5yZWdpc3Rlcih0aGlzLCBvcHRpb25zLmFjdGl2ZSA/PyB0cnVlKTtcbiAgICB0aGlzLnNvY2tldC5vbihcIm1lc3NhZ2VcIiwgdGhpcy5oYW5kbGVNZXNzYWdlKTtcbiAgICB0aGlzLnNvY2tldC5vbihcImNsb3NlXCIsIHRoaXMuaGFuZGxlQ2xvc2UpO1xuICAgIHRoaXMuc29ja2V0Lm9uKFwiZXJyb3JcIiwgdGhpcy5oYW5kbGVFcnJvcik7XG4gICAgdGhpcy5zb2NrZXQub24oXCJwb25nXCIsIHRoaXMuaGFuZGxlUG9uZyk7XG4gICAgdGhpcy5zdGFydEhlYXJ0YmVhdCgpO1xuICB9XG5cbiAgZ2V0IGNsb3NlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jbG9zZWRJbnRlcm5hbDtcbiAgfVxuXG4gIG9uQ2xvc2UoY2FsbGJhY2s6IENsb3NlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICBvbk1lc3NhZ2U8SyBleHRlbmRzIGtleW9mIEluZmVyV2ViU29ja2V0RXZlbnRNYXA8VEluU2NoZW1hPj4oXG4gICAgZXZlbnQ6IEssXG4gICAgaGFuZGxlcjogTWVzc2FnZUhhbmRsZXI8SW5mZXJXZWJTb2NrZXRFdmVudE1hcDxUSW5TY2hlbWE+W0tdPixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnRLZXkgPSBTdHJpbmcoZXZlbnQpO1xuICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnMuZ2V0KGV2ZW50S2V5KSA/PyBbXTtcbiAgICBoYW5kbGVycy5wdXNoKFxuICAgICAgLyogU0FGRVRZOiDrk7HroZ3rkJwgV2ViU29ja2V0IOydtOuypO2KuCDsiqTtgqTrp4jqsIAg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBoYW5kbGVyIGFzIE1lc3NhZ2VIYW5kbGVyPHVua25vd24+LFxuICAgICk7XG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlcnMuc2V0KGV2ZW50S2V5LCBoYW5kbGVycyk7XG4gICAgdGhpcy5mbHVzaFBlbmRpbmdNZXNzYWdlcyhldmVudEtleSk7XG4gIH1cblxuICBwdWJsaXNoPEsgZXh0ZW5kcyBrZXlvZiBJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRPdXRTY2hlbWE+PihcbiAgICBldmVudDogSyxcbiAgICBkYXRhOiBJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRPdXRTY2hlbWE+W0tdLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnB1Ymxpc2hWYWxpZGF0ZWQoU3RyaW5nKGV2ZW50KSwgZGF0YSk7XG4gIH1cblxuICBwdWJsaXNoVW50eXBlZDxEYXRhPihldmVudDogc3RyaW5nLCBkYXRhOiBEYXRhKTogdm9pZCB7XG4gICAgdGhpcy5wdWJsaXNoVmFsaWRhdGVkKGV2ZW50LCBkYXRhKTtcbiAgfVxuXG4gIHdhaXRGb3JDbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbG9zZVByb21pc2U7XG4gIH1cblxuICBqb2luKHJvb21JZDogV2ViU29ja2V0Um9vbUlkKTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25zLnJlZ2lzdHJ5LmpvaW4odGhpcy5pZCwgcm9vbUlkKTtcbiAgfVxuXG4gIGxlYXZlKHJvb21JZDogV2ViU29ja2V0Um9vbUlkKTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25zLnJlZ2lzdHJ5LmxlYXZlKHRoaXMuaWQsIHJvb21JZCk7XG4gIH1cblxuICBzZXRVc2VySWQodXNlcklkOiBXZWJTb2NrZXRVc2VySWQpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRVc2VySWQgPSBTdHJpbmcodXNlcklkKTtcbiAgICB0aGlzLm9wdGlvbnMucmVnaXN0cnkuc2V0VXNlcklkKHRoaXMuaWQsIHVzZXJJZCk7XG4gIH1cblxuICBjbGVhclVzZXJJZCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRVc2VySWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5vcHRpb25zLnJlZ2lzdHJ5LmNsZWFyVXNlcklkKHRoaXMuaWQpO1xuICB9XG5cbiAgZ2V0VGVsZW1ldHJ5U25hcHNob3QoKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvblNuYXBzaG90IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGVuZGluZ0luYm91bmRNZXNzYWdlczogdGhpcy5wZW5kaW5nTWVzc2FnZXMubGVuZ3RoLFxuICAgICAgcGVuZGluZ091dGJvdW5kTWVzc2FnZXM6IHRoaXMucGVuZGluZ091dGJvdW5kTWVzc2FnZXMubGVuZ3RoLFxuICAgICAgc29ja2V0QnVmZmVyZWRCeXRlczogdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gV1NfT1BFTiA/IHRoaXMuc29ja2V0LmJ1ZmZlcmVkQW1vdW50IDogMCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0VGVsZW1ldHJ5Q29udGV4dCgpOiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYWNlSWQ6IHRoaXMuY29ubmVjdGlvblRyYWNlSWQsXG4gICAgICBzcGFuSWQ6IHRoaXMuY29ubmVjdGlvblNwYW5JZCxcbiAgICAgIHBhcmVudFNwYW5JZDogdGhpcy5jb25uZWN0aW9uUGFyZW50U3BhbklkLFxuICAgICAgc2FtcGxlZDogdGhpcy5jb25uZWN0aW9uU2FtcGxlZCxcbiAgICB9O1xuICB9XG5cbiAgLy8g66qo65OgIHRlbGVtZXRyeSBlbWl0IHNpdGXqsIAg6rO17Jyg7ZWY64qUIGNvbm5lY3Rpb24tbGV2ZWwgZmllbGQg66y27J2MLlxuICAvLyDtlqXtm4QgY29ubmVjdGlvbi1zY29wZWQg7Iud67OE7J6QKGUuZy4gdGVuYW50SWQp6rCAIOy2lOqwgOuQoCDrlYwg7ZWcIOqzs+unjCDshpDrjIDrqbQg65CoXG4gIHByaXZhdGUgdGVsZW1ldHJ5RmllbGRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb25uZWN0aW9uSWQ6IHRoaXMuaWQsXG4gICAgICBuYW1lc3BhY2U6IHRoaXMubmFtZXNwYWNlLFxuICAgICAgdXNlcklkOiB0aGlzLmN1cnJlbnRVc2VySWQsXG4gICAgICB0cmFjZUlkOiB0aGlzLmNvbm5lY3Rpb25UcmFjZUlkLFxuICAgICAgc3BhbklkOiB0aGlzLmNvbm5lY3Rpb25TcGFuSWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IHRoaXMuY29ubmVjdGlvblBhcmVudFNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IHRoaXMuY29ubmVjdGlvblNhbXBsZWQsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEluYm91bmRSZWplY3RlZChyZWFzb246IHN0cmluZywgZXZlbnQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnRlbGVtZXRyeUZpZWxkcygpO1xuICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy5tZXNzYWdlLnJlamVjdGVkXCIsXG4gICAgICBsZXZlbDogXCJ3YXJuXCIsXG4gICAgICAuLi5maWVsZHMsXG4gICAgICBkZXRhaWw6IGV2ZW50ICE9PSB1bmRlZmluZWQgPyB7IHJlYXNvbiwgZXZlbnQgfSA6IHsgcmVhc29uIH0sXG4gICAgfSk7XG4gICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkTWV0cmljKHtcbiAgICAgIG5hbWU6IFwic29uYW11LndzLm1lc3NhZ2VzXCIsXG4gICAgICBraW5kOiBcImNvdW50ZXJcIixcbiAgICAgIHZhbHVlOiAxLFxuICAgICAgdW5pdDogXCIxXCIsXG4gICAgICB0YWdzOiB7IGRpcmVjdGlvbjogXCJpbmJvdW5kXCIsIG91dGNvbWU6IFwicmVqZWN0ZWRcIiB9LFxuICAgICAgLi4uZmllbGRzLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gdHJhbnNwb3J0IOyiheujjCDrj4TspJEg7JiI7Jm46rCAIOuCmOuPhCBtYXJrQ2xvc2Vk6rCAIOuwmOuTnOyLnCDsi6TtlonrkJjrj4TroZ0gdHJ5L2ZpbmFsbHnroZwg6rCQ7IyIXG4gIGNsb3NlKGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsIHx8IHRoaXMuY2xvc2VTdGFydGVkIHx8IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IFdTX0NMT1NFRCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2xvc2VTdGFydGVkID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5jbG9zZVRyYW5zcG9ydChjb2RlLCByZWFzb24pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLm1hcmtDbG9zZWQoY29kZSwgcmVhc29uKTtcbiAgICB9XG4gIH1cblxuICAvLyDsnbjrsJTsmrTrk5wg66mU7Iuc7KeA66W8IOyInOywqCDsspjrpqwg7YGQ7JeQIOyYrOumvC4gU29uYW11IGVudmVsb3BlIOqygOymnSDsiJjtlolcbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVNZXNzYWdlID0gKHJhdzogUmF3RGF0YSkgPT4ge1xuICAgIHRoaXMuZW5xdWV1ZU1lc3NhZ2VUYXNrKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSBub3JtYWxpemVNZXNzYWdlKHJhdyk7XG4gICAgICBjb25zdCBwYXJzZWRFbnZlbG9wZSA9IHNhZmVQYXJzZUVudmVsb3BlKHRleHQpO1xuICAgICAgaWYgKCFwYXJzZWRFbnZlbG9wZSkge1xuICAgICAgICB0aGlzLmVtaXRJbmJvdW5kUmVqZWN0ZWQoXCJpbnZhbGlkUGF5bG9hZFwiKTtcbiAgICAgICAgdGhpcy5jbG9zZShXU19DTE9TRV9DT0RFX0lOVkFMSURfRlJBTUVfUEFZTE9BRF9EQVRBLCBcIkludmFsaWQgbWVzc2FnZSBwYXlsb2FkXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLm1lc3NhZ2UucmVjZWl2ZWRcIixcbiAgICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgICAgZGV0YWlsOiB7IGV2ZW50OiBwYXJzZWRFbnZlbG9wZS5ldmVudCB9LFxuICAgICAgICBwYXlsb2FkOiBwYXJzZWRFbnZlbG9wZS5kYXRhLFxuICAgICAgfSk7XG4gICAgICB0aGlzLm9wdGlvbnMucmVnaXN0cnkudG91Y2godGhpcy5pZCk7XG4gICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoRW52ZWxvcGUocGFyc2VkRW52ZWxvcGUpO1xuICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlQ2xvc2UgPSAoY29kZT86IG51bWJlciwgcmVhc29uPzogQnVmZmVyIHwgc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcmVhc29uVGV4dCA9IGlzU3RyaW5nVmFsdWUocmVhc29uKSA/IHJlYXNvbiA6IHJlYXNvbj8udG9TdHJpbmcoKTtcbiAgICB0aGlzLm1hcmtDbG9zZWQoY29kZSwgcmVhc29uVGV4dCk7XG4gIH07XG5cbiAgLy8g7IaM7LyT7J20IHRyYW5zcG9ydCBlcnJvcuulvCBlbWl07ZWY66m0IOymieyLnCAxMDExIGNsb3Nl66GcIOyImOugtOyLnOy8nCDsg4Htg5wg64iE65297J2EIOunieydjFxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZUVycm9yID0gKCkgPT4ge1xuICAgIHRoaXMuY2xvc2UoV1NfQ0xPU0VfQ09ERV9JTlRFUk5BTF9FUlJPUiwgXCJXZWJTb2NrZXQgdHJhbnNwb3J0IGVycm9yXCIpO1xuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlUG9uZyA9ICgpID0+IHtcbiAgICB0aGlzLmF3YWl0aW5nUG9uZyA9IGZhbHNlO1xuICAgIHRoaXMub3B0aW9ucy5yZWdpc3RyeS50b3VjaCh0aGlzLmlkKTtcbiAgfTtcblxuICAvLyBlbnZlbG9wZeydmCBtZXRhLnRyYWNlcGFyZW5066Gc67aA7YSwIHRyYWNlIGNvbnRleHTrpbwg7LaU7Lac7ZWoXG4gIC8vIGludmFsaWQgdHJhY2VwYXJlbnTripQg7Jew6rKw7J2EIOqxsOu2gO2VmOyngCDslYrqs6AgZGVidWcg66CI67KoIOqyveqzoOunjCBlbWl07ZWoXG4gIHByaXZhdGUgcmVzb2x2ZU1lc3NhZ2VUcmFjZUNvbnRleHQoXG4gICAgZW52ZWxvcGU6IFBhcnNlZEVudmVsb3BlLFxuICApOiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCB7XG4gICAgY29uc3QgbWVzc2FnZVNwYW5JZCA9IGdlbmVyYXRlU3BhbklkKCk7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5nZXRUcmFjZU9wdGlvbnMoKS5wcm9wYWdhdGVNZXNzYWdlVHJhY2UgJiZcbiAgICAgIGVudmVsb3BlLm1ldGE/LnRyYWNlcGFyZW50XG4gICAgKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVRyYWNlUGFyZW50KGVudmVsb3BlLm1ldGEudHJhY2VwYXJlbnQpO1xuICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRyYWNlSWQ6IHBhcnNlZC50cmFjZUlkLFxuICAgICAgICAgIHNwYW5JZDogbWVzc2FnZVNwYW5JZCxcbiAgICAgICAgICBwYXJlbnRTcGFuSWQ6IHBhcnNlZC5wYXJlbnRJZCxcbiAgICAgICAgICBzYW1wbGVkOiBwYXJzZWQuc2FtcGxlZCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIGludmFsaWQgdHJhY2VwYXJlbnQ6IHdhcm4gYnV0IGRvIG5vdCByZWplY3RcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLnRyYWNlLmludmFsaWRcIixcbiAgICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgICAgZGV0YWlsOiB7IHNvdXJjZTogXCJtZXNzYWdlXCIsIHRyYWNlcGFyZW50OiBlbnZlbG9wZS5tZXRhLnRyYWNlcGFyZW50IH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHJhY2VJZDogdGhpcy5jb25uZWN0aW9uVHJhY2VJZCxcbiAgICAgIHNwYW5JZDogbWVzc2FnZVNwYW5JZCxcbiAgICAgIHBhcmVudFNwYW5JZDogdGhpcy5jb25uZWN0aW9uU3BhbklkID8/IHRoaXMuY29ubmVjdGlvblBhcmVudFNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IHRoaXMuY29ubmVjdGlvblNhbXBsZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8vIGV2ZW50IOyhtOyerCDsl6zrtoAg4oaSIHNjaGVtYSDqsoDspp0g4oaSIGhhbmRsZXIg7Iuk7ZaJIOyInOycvOuhnCDrtoTquLDtlahcbiAgLy8gaGFuZGxlcuqwgCDslYTsp4Eg65Ox66Gd65CY7KeAIOyViuydgCDstIjquLAg66mU7Iuc7KeA64qUIOuyhO2NvOyXkCDrs7TqtIDtlojri6TqsIAgb25NZXNzYWdlIOuTseuhnSDsi5wgZmx1c2jtlahcbiAgLy8gaGFuZGxlcuuKlCBgYXdhaXRg7Jy866GcIOyInOywqCDsi6TtlontlbQg7ZWcIGNvbm5lY3Rpb24g7JWI7J2YIOuplOyLnOyngCDsiJzshJzrpbwg67O07J6l7ZWoXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hFbnZlbG9wZShlbnZlbG9wZTogUGFyc2VkRW52ZWxvcGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzLmdldChlbnZlbG9wZS5ldmVudCk7XG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5ldmVudFNjaGVtYXNJbltlbnZlbG9wZS5ldmVudF07XG5cbiAgICBpZiAoIXNjaGVtYSkge1xuICAgICAgdGhpcy5lbWl0SW5ib3VuZFJlamVjdGVkKFwidW5rbm93bkV2ZW50XCIsIGVudmVsb3BlLmV2ZW50KTtcbiAgICAgIHRoaXMuY2xvc2UoV1NfQ0xPU0VfQ09ERV9QT0xJQ1lfVklPTEFUSU9OLCBcIlVua25vd24gZXZlbnRcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnNhZmVQYXJzZShlbnZlbG9wZS5kYXRhKTtcbiAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICB0aGlzLmVtaXRJbmJvdW5kUmVqZWN0ZWQoXCJpbnZhbGlkRGF0YVwiLCBlbnZlbG9wZS5ldmVudCk7XG4gICAgICB0aGlzLmNsb3NlKFdTX0NMT1NFX0NPREVfSU5WQUxJRF9GUkFNRV9QQVlMT0FEX0RBVEEsIFwiSW52YWxpZCBldmVudCBkYXRhXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghaGFuZGxlcnMgfHwgaGFuZGxlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nTWVzc2FnZXMubGVuZ3RoID49IE1BWF9QRU5ESU5HX01FU1NBR0VTKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICAgIG5hbWU6IFwid3MubWVzc2FnZS5idWZmZXIuZHJvcHBlZFwiLFxuICAgICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgICAuLi50aGlzLnRlbGVtZXRyeUZpZWxkcygpLFxuICAgICAgICAgIGRldGFpbDogeyBldmVudDogZW52ZWxvcGUuZXZlbnQgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucGVuZGluZ01lc3NhZ2VzLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgICB0aGlzLnBlbmRpbmdNZXNzYWdlcy5wdXNoKGVudmVsb3BlKTtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLm1lc3NhZ2UuYnVmZmVyZWRcIixcbiAgICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgICAgZGV0YWlsOiB7IGV2ZW50OiBlbnZlbG9wZS5ldmVudCB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2VDdHggPSB0aGlzLnJlc29sdmVNZXNzYWdlVHJhY2VDb250ZXh0KGVudmVsb3BlKTtcbiAgICAvLyBtZXNzYWdlLWxldmVsIHRyYWNl64qUIGNvbm5lY3Rpb24tbGV2ZWwgdHJhY2Xrpbwgb3ZlcnJpZGXtlaguIHVzZXJJZCAvIGNvbm5lY3Rpb25JZCAvIG5hbWVzcGFjZeuKlCDqt7jrjIDroZwg7Jyg7KeAXG4gICAgY29uc3QgbWVzc2FnZVRyYWNlRmllbGRzID0ge1xuICAgICAgY29ubmVjdGlvbklkOiB0aGlzLmlkLFxuICAgICAgbmFtZXNwYWNlOiB0aGlzLm5hbWVzcGFjZSxcbiAgICAgIHVzZXJJZDogdGhpcy5jdXJyZW50VXNlcklkLFxuICAgICAgdHJhY2VJZDogdHJhY2VDdHgudHJhY2VJZCxcbiAgICAgIHNwYW5JZDogdHJhY2VDdHguc3BhbklkLFxuICAgICAgcGFyZW50U3BhbklkOiB0cmFjZUN0eC5wYXJlbnRTcGFuSWQsXG4gICAgICBzYW1wbGVkOiB0cmFjZUN0eC5zYW1wbGVkLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICBhd2FpdCBoYW5kbGVyKHBhcnNlZC5kYXRhLCB0cmFjZUN0eCk7XG4gICAgICB9XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5tZXNzYWdlLmRpc3BhdGNoZWRcIixcbiAgICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgICAgLi4ubWVzc2FnZVRyYWNlRmllbGRzLFxuICAgICAgICBkZXRhaWw6IHsgZXZlbnQ6IGVudmVsb3BlLmV2ZW50IH0sXG4gICAgICB9KTtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLnJlY29yZE1ldHJpYyh7XG4gICAgICAgIG5hbWU6IFwic29uYW11LndzLm1lc3NhZ2VzXCIsXG4gICAgICAgIGtpbmQ6IFwiY291bnRlclwiLFxuICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgdW5pdDogXCIxXCIsXG4gICAgICAgIHRhZ3M6IHsgZGlyZWN0aW9uOiBcImluYm91bmRcIiwgZXZlbnQ6IGVudmVsb3BlLmV2ZW50LCBvdXRjb21lOiBcImFjY2VwdGVkXCIgfSxcbiAgICAgICAgLi4ubWVzc2FnZVRyYWNlRmllbGRzLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLm1lc3NhZ2UuZmFpbGVkXCIsXG4gICAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICAgIC4uLm1lc3NhZ2VUcmFjZUZpZWxkcyxcbiAgICAgICAgZGV0YWlsOiB7IGV2ZW50OiBlbnZlbG9wZS5ldmVudCB9LFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZsdXNoUGVuZGluZ01lc3NhZ2VzKGV2ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCByZW1haW5pbmc6IFBhcnNlZEVudmVsb3BlW10gPSBbXTtcbiAgICBjb25zdCB0b0ZsdXNoOiBQYXJzZWRFbnZlbG9wZVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgdGhpcy5wZW5kaW5nTWVzc2FnZXMpIHtcbiAgICAgIGlmIChtZXNzYWdlLmV2ZW50ICE9PSBldmVudCkge1xuICAgICAgICByZW1haW5pbmcucHVzaChtZXNzYWdlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRvRmx1c2gucHVzaChtZXNzYWdlKTtcbiAgICB9XG5cbiAgICB0aGlzLnBlbmRpbmdNZXNzYWdlcy5sZW5ndGggPSAwO1xuICAgIHRoaXMucGVuZGluZ01lc3NhZ2VzLnB1c2goLi4ucmVtYWluaW5nKTtcblxuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiB0b0ZsdXNoKSB7XG4gICAgICB0aGlzLmVucXVldWVNZXNzYWdlVGFzayhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2hFbnZlbG9wZShtZXNzYWdlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHVibGlzaFZhbGlkYXRlZDxEYXRhPihldmVudDogc3RyaW5nLCBkYXRhOiBEYXRhKTogdm9pZCB7XG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5ldmVudFNjaGVtYXNPdXRbZXZlbnRdO1xuICAgIGlmICghc2NoZW1hKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5wdWJsaXNoLnJlamVjdGVkXCIsXG4gICAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBldmVudCwgcmVhc29uOiBcInVua25vd25FdmVudFwiIH0sXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB3ZWJzb2NrZXQgZXZlbnQ6ICR7ZXZlbnR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnNhZmVQYXJzZShkYXRhKTtcbiAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5wdWJsaXNoLnJlamVjdGVkXCIsXG4gICAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBldmVudCwgcmVhc29uOiBcImludmFsaWRQYXlsb2FkXCIgfSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHdlYnNvY2tldCBldmVudCBwYXlsb2FkOiAke2V2ZW50fWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsIHx8IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IFdTX09QRU4pIHtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLnB1Ymxpc2guZHJvcHBlZFwiLFxuICAgICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgICAuLi50aGlzLnRlbGVtZXRyeUZpZWxkcygpLFxuICAgICAgICBkZXRhaWw6IHsgZXZlbnQsIHJlYXNvbjogXCJjb25uZWN0aW9uQ2xvc2VkXCIgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZW5xdWV1ZU91dGJvdW5kTWVzc2FnZShcbiAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIGRhdGE6IHBhcnNlZC5kYXRhLFxuICAgICAgfSksXG4gICAgICBldmVudCxcbiAgICApO1xuICB9XG5cbiAgLy8gbGlzdGVuZXIg7ZW07KCcIC8gaGVhcnRiZWF0IOykkeuLqCAvIHBlbmRpbmcgcXVldWUg67mE7JuAIC8gcmVnaXN0cnkgdW5yZWdpc3RlciAvIG9uQ2xvc2Ug7Iuk7ZaJIC8gd2FpdEZvckNsb3NlIHJlc29sdmUg7J2EIO2VnCDqs7Psl5Ag66qo7JWEIOybkOyekOyggeycvOuhnCDsspjrpqztlahcbiAgLy8gYXN5bmMgb25DbG9zZeqwgCByZWplY3TtlbTrj4QgdW5oYW5kbGVkIHJlamVjdGlvbuycvOuhnCDsg4jsp4Ag7JWK64+E66GdIGNhdGNo66GcIOqyqeumrO2VqFxuICBwcml2YXRlIG1hcmtDbG9zZWQoY29kZT86IG51bWJlciwgX3JlYXNvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZWRJbnRlcm5hbCA9IHRydWU7XG4gICAgdGhpcy5jbG9zZVN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnN0b3BIZWFydGJlYXQoKTtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnRlbGVtZXRyeUZpZWxkcygpO1xuICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLmNsb3NlZFwiLFxuICAgICAgbGV2ZWw6IFwiaW5mb1wiLFxuICAgICAgLi4uZmllbGRzLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5nZXRUcmFjZU9wdGlvbnMoKS5yZWNvcmRDb25uZWN0aW9uTGlmZXRpbWVTcGFuKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5yZWNvcmRTcGFuKHtcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ3cy5jb25uZWN0aW9uLmxpZmV0aW1lXCIsXG4gICAgICAgIGtpbmQ6IFwic2VydmVyXCIsXG4gICAgICAgIGR1cmF0aW9uTXM6IHBlcmZvcm1hbmNlLm5vdygpIC0gdGhpcy5jb25uZWN0aW9uU3RhcnRlZEF0LFxuICAgICAgICBzdGF0dXM6IGRlcml2ZUxpZmV0aW1lU3RhdHVzKGNvZGUpLFxuICAgICAgICAuLi5maWVsZHMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zb2NrZXQub2ZmKFwibWVzc2FnZVwiLCB0aGlzLmhhbmRsZU1lc3NhZ2UpO1xuICAgIHRoaXMuc29ja2V0Lm9mZihcImNsb3NlXCIsIHRoaXMuaGFuZGxlQ2xvc2UpO1xuICAgIHRoaXMuc29ja2V0Lm9mZihcImVycm9yXCIsIHRoaXMuaGFuZGxlRXJyb3IpO1xuICAgIHRoaXMuc29ja2V0Lm9mZihcInBvbmdcIiwgdGhpcy5oYW5kbGVQb25nKTtcbiAgICB0aGlzLmF3YWl0aW5nUG9uZyA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ01lc3NhZ2VzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5sZW5ndGggPSAwO1xuICAgIHRoaXMub3B0aW9ucy5yZWdpc3RyeS51bnJlZ2lzdGVyKHRoaXMuaWQpO1xuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jbG9zZUNhbGxiYWNrcy5zcGxpY2UoMCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbGxiYWNrKCk7XG4gICAgICAgIGlmIChpc1Byb21pc2VMaWtlKHJlc3VsdCkpIHtcbiAgICAgICAgICB2b2lkIHJlc3VsdC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAvLyBhc3luYyBjbG9zZSBjYWxsYmFja3MgbXVzdCBub3QgZXNjYXBlIGFzIHVuaGFuZGxlZCByZWplY3Rpb25zXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBjbG9zZSBjYWxsYmFja3MgbXVzdCBub3QgYmxvY2sgdHJhbnNwb3J0IGNsZWFudXBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZXNvbHZlQ2xvc2VQcm9taXNlKCk7XG4gIH1cblxuICAvLyBwb25n7J20IOyYpOyngCDslYrsnYAg7IOB7YOc7JeQ7IScIOuLpOydjCB0aWNr7J20IOyYpOuptCB0aW1lb3V0IGNsb3Nl66GcIOyymOumrO2VtCB6b21iaWUgY29ubmVjdGlvbuydhCDsoJXrpqztlahcbiAgcHJpdmF0ZSBzdGFydEhlYXJ0YmVhdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oZWFydGJlYXRNcyA8PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsIHx8IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IFdTX09QRU4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hd2FpdGluZ1BvbmcpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICAgICAgbmFtZTogXCJ3cy5oZWFydGJlYXQudGltZW91dFwiLFxuICAgICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgICAuLi50aGlzLnRlbGVtZXRyeUZpZWxkcygpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jbG9zZShXU19DTE9TRV9DT0RFX0dPSU5HX0FXQVksIFwiSGVhcnRiZWF0IHRpbWVvdXRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hd2FpdGluZ1BvbmcgPSB0cnVlO1xuICAgICAgdGhpcy5zb2NrZXQucGluZygpO1xuICAgIH0sIHRoaXMuaGVhcnRiZWF0TXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wSGVhcnRiZWF0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oZWFydGJlYXRUaW1lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydGJlYXRUaW1lcik7XG4gICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IG51bGw7XG4gIH1cblxuICAvLyBjbG9zZeqwgCDsi6TtjKjtlbTrj4QgdGVybWluYXRlIO2PtOuwseq5jOyngCDsi5zrj4TtlZjqs6AsIOuBneuCtCDsi6TtjKjtlZjrqbQgbWFya0Nsb3NlZOyXkCDsg4Htg5wg7KCV66as66W8IOychOyehO2VqFxuICBwcml2YXRlIGNsb3NlVHJhbnNwb3J0KGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gV1NfT1BFTiB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSBXU19DT05ORUNUSU5HKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKGNvZGUsIHRydW5jYXRlQ2xvc2VSZWFzb24ocmVhc29uKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXQudGVybWluYXRlKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyB0cmFuc3BvcnQgaXMgYWxyZWFkeSBicm9rZW47IHN0YXRlIGNsZWFudXAgaXMgaGFuZGxlZCBieSBtYXJrQ2xvc2VkKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyDsnbjrsJTsmrTrk5wgaGFuZGxlcuulvCBwcm9taXNlIGNoYWlu7Jy866GcIHNlcmlhbGl6ZSDtlZjqs6AsIGhhbmRsZXIg7JiI7Jm464qUIGNvbm5lY3Rpb24tbG9jYWwgMTAxMSBjbG9zZeuhnCDstpXshoztlahcbiAgcHJpdmF0ZSBlbnF1ZXVlTWVzc2FnZVRhc2sodGFzazogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gdGhpcy5tZXNzYWdlUXVldWVcbiAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkSW50ZXJuYWwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0YXNrKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZShXU19DTE9TRV9DT0RFX0lOVEVSTkFMX0VSUk9SLCBcIk1lc3NhZ2UgaGFuZGxpbmcgZmFpbGVkXCIpO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBxdWV1ZeqwgCDtlZzqs4Tsl5Ag64+E64us7ZWY66m0IDEwMTPsnLzroZwg64ur7JWEIOuKkOumsCDshozruYTsnpDqsIAg66mU66qo66as66W8IOuBneyXhuydtCDsnqHslYTrqLnsp4Ag66q77ZWY6rKMIO2VqFxuICAvLyB0ZWxlbWV0cnkgcHJldmlld+uKlCDsp4HroKztmZTrkJwgcGF5bG9hZOyXkOyEnCDrs7Xsm5DtlbQg7KCE7IahIOuNsOydtO2EsOyZgCDqsJnsnYAgSlNPTiDqs4Tslb3snYQg7Jyg7KeA7ZWoXG4gIHByaXZhdGUgZW5xdWV1ZU91dGJvdW5kTWVzc2FnZShwYXlsb2FkOiBzdHJpbmcsIGV2ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5sZW5ndGggPj0gTUFYX1BFTkRJTkdfT1VUQk9VTkRfTUVTU0FHRVMpIHtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLmJhY2twcmVzc3VyZS5vdmVyZmxvd1wiLFxuICAgICAgICBsZXZlbDogXCJlcnJvclwiLFxuICAgICAgICAuLi50aGlzLnRlbGVtZXRyeUZpZWxkcygpLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmNsb3NlKFdTX0NMT1NFX0NPREVfVFJZX0FHQUlOX0xBVEVSLCBcIldlYlNvY2tldCBiYWNrcHJlc3N1cmUgb3ZlcmZsb3dcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5wdXNoKHsgcGF5bG9hZCwgZXZlbnQgfSk7XG4gICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICBuYW1lOiBcIndzLnB1Ymxpc2gucXVldWVkXCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgIGRldGFpbDogeyBldmVudCB9LFxuICAgICAgcGF5bG9hZDogc2FmZVBhcnNlRW52ZWxvcGUocGF5bG9hZCk/LmRhdGEsXG4gICAgfSk7XG4gICAgdGhpcy5zY2hlZHVsZU91dGJvdW5kRmx1c2goKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVPdXRib3VuZEZsdXNoKGRlbGF5TXM6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vdXRib3VuZEZsdXNoU2NoZWR1bGVkIHx8IHRoaXMuY2xvc2VkSW50ZXJuYWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm91dGJvdW5kRmx1c2hTY2hlZHVsZWQgPSB0cnVlO1xuICAgIGNvbnN0IGZsdXNoID0gKCkgPT4ge1xuICAgICAgdGhpcy5vdXRib3VuZEZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmZsdXNoT3V0Ym91bmRNZXNzYWdlcygpO1xuICAgIH07XG5cbiAgICBpZiAoZGVsYXlNcyA+IDApIHtcbiAgICAgIHNldFRpbWVvdXQoZmx1c2gsIGRlbGF5TXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldEltbWVkaWF0ZShmbHVzaCk7XG4gIH1cblxuICAvLyBidWZmZXJlZEFtb3VudOqwgCDsnoTqs4TsuZjrpbwg64SY7Jy866m0IGZsdXNo66W8IOuvuOukhCBzb2NrZXQg64K067aAIO2BkOqwgCDthLDsp4Dsp4Ag7JWK64+E66GdIGJhY2twcmVzc3VyZeulvCDsobTspJHtlahcbiAgLy8g7ZWcIOuyiOyXkCDrsLDsuZgg64uo7JyE66Gc66eMIHNlbmTtlbQg64+Z6riwIOujqO2UhOqwgCDsnbTrsqTtirgg66Oo7ZSE66W8IOyepeyLnOqwhCDsoJDsnKDtlZjsp4Ag7JWK6rKMIO2VqFxuICBwcml2YXRlIGZsdXNoT3V0Ym91bmRNZXNzYWdlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZWRJbnRlcm5hbCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSBXU19PUEVOKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ja2V0LmJ1ZmZlcmVkQW1vdW50ID4gTUFYX1NPQ0tFVF9CVUZGRVJFRF9BTU9VTlQpIHtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLmJhY2twcmVzc3VyZS5kZWxheWVkXCIsXG4gICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zY2hlZHVsZU91dGJvdW5kRmx1c2goT1VUQk9VTkRfUkVUUllfREVMQVlfTVMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzZW50ID0gMDtcbiAgICB3aGlsZSAoXG4gICAgICBzZW50IDwgT1VUQk9VTkRfQkFUQ0hfU0laRSAmJlxuICAgICAgdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5sZW5ndGggPiAwICYmXG4gICAgICB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSBXU19PUEVOXG4gICAgKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5zaGlmdCgpO1xuICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBwYXlsb2FkLCBldmVudCB9ID0gbmV4dDtcblxuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnRlbGVtZXRyeUZpZWxkcygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChwYXlsb2FkKTtcbiAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0O1xuICAgICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgICBuYW1lOiBcIndzLnB1Ymxpc2guc2VudFwiLFxuICAgICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgICAgLi4uZmllbGRzLFxuICAgICAgICAgIGRldGFpbDogeyBldmVudCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkU3Bhbih7XG4gICAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ3cy5wdWJsaXNoLnNlbmRcIixcbiAgICAgICAgICBraW5kOiBcInByb2R1Y2VyXCIsXG4gICAgICAgICAgZHVyYXRpb25NcyxcbiAgICAgICAgICBzdGF0dXM6IFwidW5zZXRcIixcbiAgICAgICAgICAuLi5maWVsZHMsXG4gICAgICAgICAgYXR0cmlidXRlczogeyBldmVudCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkTWV0cmljKHtcbiAgICAgICAgICBuYW1lOiBcInNvbmFtdS53cy5wdWJsaXNoZXNcIixcbiAgICAgICAgICBraW5kOiBcImNvdW50ZXJcIixcbiAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICB1bml0OiBcIjFcIixcbiAgICAgICAgICB0YWdzOiB7IG91dGNvbWU6IFwic2VudFwiLCBldmVudCB9LFxuICAgICAgICAgIC4uLmZpZWxkcyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQ7XG4gICAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICAgIG5hbWU6IFwid3MucHVibGlzaC5mYWlsZWRcIixcbiAgICAgICAgICBsZXZlbDogXCJlcnJvclwiLFxuICAgICAgICAgIC4uLmZpZWxkcyxcbiAgICAgICAgICBkZXRhaWw6IHsgZXZlbnQgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLnJlY29yZFNwYW4oe1xuICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IFwid3MucHVibGlzaC5zZW5kXCIsXG4gICAgICAgICAga2luZDogXCJwcm9kdWNlclwiLFxuICAgICAgICAgIGR1cmF0aW9uTXMsXG4gICAgICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICAgICAgLi4uZmllbGRzLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgZXZlbnQgfSxcbiAgICAgICAgICBlcnJvclR5cGU6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5uYW1lIDogcnVudGltZVR5cGVPZihlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNsb3NlKFdTX0NMT1NFX0NPREVfSU5URVJOQUxfRVJST1IsIFwiT3V0Ym91bmQgcHVibGlzaCBmYWlsZWRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2VudCArPSAxO1xuICAgICAgaWYgKHRoaXMuc29ja2V0LmJ1ZmZlcmVkQW1vdW50ID4gTUFYX1NPQ0tFVF9CVUZGRVJFRF9BTU9VTlQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVuZGluZ091dGJvdW5kTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zY2hlZHVsZU91dGJvdW5kRmx1c2goXG4gICAgICAgIHRoaXMuc29ja2V0LmJ1ZmZlcmVkQW1vdW50ID4gTUFYX1NPQ0tFVF9CVUZGRVJFRF9BTU9VTlQgPyBPVVRCT1VORF9SRVRSWV9ERUxBWV9NUyA6IDAsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVNZXNzYWdlKHJhdzogUmF3RGF0YSk6IHN0cmluZyB7XG4gIGlmIChpc1N0cmluZ1ZhbHVlKHJhdykpIHtcbiAgICByZXR1cm4gcmF3O1xuICB9XG5cbiAgaWYgKHJhdyBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgIHJldHVybiByYXcudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgfVxuXG4gIGlmIChyYXcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShyYXcpLnRvU3RyaW5nKFwidXRmLThcIik7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShyYXcpKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQocmF3LmZpbHRlcigoY2h1bmspOiBjaHVuayBpcyBCdWZmZXIgPT4gY2h1bmsgaW5zdGFuY2VvZiBCdWZmZXIpKS50b1N0cmluZyhcbiAgICAgIFwidXRmLThcIixcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJhdyk7XG59XG5cbmZ1bmN0aW9uIHNhZmVQYXJzZUVudmVsb3BlKHJhdzogc3RyaW5nKTogUGFyc2VkRW52ZWxvcGUgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPVxuICAgICAgLyogU0FGRVRZOiDrk7HroZ3rkJwgV2ViU29ja2V0IOydtOuypO2KuCDsiqTtgqTrp4jqsIAg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBKU09OLnBhcnNlKFxuICAgICAgICByYXcsXG4gICAgICApIGFzIHVua25vd247XG4gICAgY29uc3QgdmFsaWRhdGVkID0gV2ViU29ja2V0RW52ZWxvcGVTY2hlbWEuc2FmZVBhcnNlKHBhcnNlZCk7XG4gICAgcmV0dXJuIHZhbGlkYXRlZC5zdWNjZXNzID8gdmFsaWRhdGVkLmRhdGEgOiBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBSRkMgNjQ1NeqwgCBjbG9zZSBmcmFtZSByZWFzb27snYQgMTIzIGJ5dGXroZwg7KCc7ZWc7ZWY66+A66GcIOy0iOqzvOu2hOydgCDsnpjrnbwg7KCE7IahIOyLpO2MqOulvCDrsKnsp4DtlahcbmZ1bmN0aW9uIHRydW5jYXRlQ2xvc2VSZWFzb24ocmVhc29uPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyZWFzb24pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIEJ1ZmZlci5ieXRlTGVuZ3RoKHJlYXNvbiwgXCJ1dGYtOFwiKSA8PSAxMjNcbiAgICA/IHJlYXNvblxuICAgIDogQnVmZmVyLmZyb20ocmVhc29uKS5zdWJhcnJheSgwLCAxMjMpLnRvU3RyaW5nKFwidXRmLThcIik7XG59XG5cbi8vIGNvbm5lY3Rpb24gbGlmZXRpbWUgc3BhbuydmCBzdGF0dXPrpbwgY2xvc2UgY29kZSDquLDspIDsnLzroZwg67aE6riw7ZWoICgxMDAwLzEwMDEg7KCV7IOBIOyiheujjCwg6re4IOyZuCBrbm93biBjb2RlIGVycm9yLCBjb2RlIOuvuOyDgeydgCB1bnNldClcbmZ1bmN0aW9uIGRlcml2ZUxpZmV0aW1lU3RhdHVzKGNvZGU6IG51bWJlciB8IHVuZGVmaW5lZCk6IFwib2tcIiB8IFwiZXJyb3JcIiB8IFwidW5zZXRcIiB7XG4gIGlmIChjb2RlID09PSB1bmRlZmluZWQpIHJldHVybiBcInVuc2V0XCI7XG4gIGlmIChjb2RlID09PSAxMDAwIHx8IGNvZGUgPT09IDEwMDEpIHJldHVybiBcIm9rXCI7XG4gIHJldHVybiBcImVycm9yXCI7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFrTkEsU0FBZ0IsdUJBQXVCLFVBQW1DLENBQUMsR0FBcUI7Q0FDOUYsT0FBTyxJQUFJLGlCQUFpQixPQUFPO0FBQ3JDO0FBbXBCQSxTQUFTLGlCQUFpQixLQUFzQjtDQUM5QyxJQUFJLGNBQWMsR0FBRyxHQUNuQixPQUFPO0NBR1QsSUFBSSxlQUFlLFFBQ2pCLE9BQU8sSUFBSSxTQUFTLE9BQU87Q0FHN0IsSUFBSSxlQUFlLGFBQ2pCLE9BQU8sT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTztDQUcxQyxJQUFJLE1BQU0sUUFBUSxHQUFHLEdBQ25CLE9BQU8sT0FBTyxPQUFPLElBQUksUUFBUSxVQUEyQixpQkFBaUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUNwRixPQUNGO0NBR0YsT0FBTyxLQUFLLFVBQVUsR0FBRztBQUMzQjtBQUVBLFNBQVMsa0JBQWtCLEtBQW9DO0NBQzdELElBQUk7RUFDRixNQUFNLFNBQ2dELEtBQUssTUFDdkQsR0FDRjtFQUNGLE1BQU0sWUFBWSx3QkFBd0IsVUFBVSxNQUFNO0VBQzFELE9BQU8sVUFBVSxVQUFVLFVBQVUsT0FBTztDQUM5QyxRQUFRO0VBQ04sT0FBTztDQUNUO0FBQ0Y7QUFHQSxTQUFTLG9CQUFvQixRQUFxQztDQUNoRSxJQUFJLENBQUMsUUFDSDtDQUdGLE9BQU8sT0FBTyxXQUFXLFFBQVEsT0FBTyxLQUFLLE1BQ3pDLFNBQ0EsT0FBTyxLQUFLLE1BQU0sQ0FBQyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU87QUFDM0Q7QUFHQSxTQUFTLHFCQUFxQixNQUFvRDtDQUNoRixJQUFJLFNBQVMsUUFBVyxPQUFPO0NBQy9CLElBQUksU0FBUyxPQUFRLFNBQVMsTUFBTSxPQUFPO0NBQzNDLE9BQU87QUFDVDs7O21CQW41QitDO29CQUNPO2tCQVVoQzttQkFVQzt5QkFDZ0Q7Q0FHakUsZ0JBQWdCO0NBQ2hCLFVBQVU7Q0FDVixZQUFZO0NBRVosMkJBQTJCO0NBQzNCLDJDQUEyQztDQUMzQyxpQ0FBaUM7Q0FDakMsK0JBQStCO0NBQy9CLGdDQUFnQztDQUNoQyx1QkFBdUI7Q0FDdkIsZ0NBQWdDO0NBQ2hDLDZCQUE2QjtDQUM3QixzQkFBc0I7Q0FDdEIsMEJBQTBCO0NBSTFCLDBCQUEwQixFQUFFLE9BQU87RUFDdkMsT0FBTyxFQUFFLE9BQU87RUFDaEIsTUFBTSxFQUFFLEtBQUs7RUFDYixNQUFNLEVBQ0gsT0FBTztHQUNOLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0dBQ2pDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0VBQ2xDLENBQUMsQ0FBQyxDQUNELFNBQVM7Q0FDZCxDQUFDO0NBMEVZLG1CQUFiLE1BQThCO0VBQzVCO0VBQ0E7RUFFQSxZQUFZLFVBQW1DLENBQUMsR0FBRztHQUdqRCxNQUFNLGlCQUFpQixRQUFRLFVBQVUsR0FBRyxTQUFTLEVBQUUsR0FBRyxRQUFRO0dBQ2xFLEtBQUssc0JBQXNCLG1DQUFtQyxRQUFRLFdBQVc7SUFDL0UsV0FBVyxXQUFXO0lBQ3RCLFFBQVE7R0FDVixDQUFDO0dBQ0QsTUFBTSxrQkFBNEM7SUFDaEQsUUFBUTtJQUNSLGVBQWUsUUFBUTtJQUN2QixZQUFZLFFBQVE7SUFDcEIscUJBQXFCLEtBQUs7R0FDNUI7R0FDQSxLQUFLLFdBQVcsSUFBSSxrQkFBa0IsZUFBZTtFQUN2RDtFQUVBLG1CQUlFLFFBQ0EsU0FJNEY7R0FDNUYsT0FBTyxJQUFJLHdCQUF3QixRQUFRO0lBQ3pDLEdBQUc7SUFDSCxVQUFVLEtBQUs7SUFDZixxQkFBcUIsS0FBSztHQUM1QixDQUFDO0VBQ0g7RUFFQSxtQkFBbUIsY0FBNEI7R0FDN0MsS0FBSyxTQUFTLFNBQVMsWUFBWTtFQUNyQztFQUVBLFVBQWdCLE9BQWUsTUFBWSxXQUEwQjtHQUNuRSxLQUFLLFNBQVMsVUFBVSxPQUFPLE1BQU0sU0FBUztFQUNoRDtFQUVBLGNBQ0UsUUFDQSxPQUNBLE1BQ0EsV0FDTTtHQUNOLEtBQUssU0FBUyxjQUFjLFFBQVEsT0FBTyxNQUFNLFNBQVM7RUFDNUQ7RUFFQSxjQUNFLFFBQ0EsT0FDQSxNQUNBLFdBQ007R0FDTixLQUFLLFNBQVMsY0FBYyxRQUFRLE9BQU8sTUFBTSxTQUFTO0VBQzVEO0VBRUEsa0JBQXdCLFVBQTZCLE9BQWUsTUFBa0I7R0FDcEYsS0FBSyxTQUFTLGtCQUFrQixVQUFVLE9BQU8sSUFBSTtFQUN2RDtFQUdBLE1BQU0sU0FDSixPQUFlLDBCQUNmLFNBQVMsd0JBQ007R0FDZixNQUFNLEtBQUssU0FBUyxTQUFTLE1BQU0sTUFBTTtHQUN6QyxNQUFNLEtBQUssb0JBQW9CLFNBQVM7RUFDMUM7Q0FDRjtDQU1NLDBCQUFOLE1BUUE7RUFvQ3FCO0VBQ0E7RUFwQ25CLEtBQWMsV0FBVztFQUN6QixZQUFxQjtFQUNyQjtFQUVBLGlCQUFrRCxDQUFDO0VBQ25ELGtDQUFtQyxJQUFJLElBQTRDO0VBQ25GLGtCQUFxRCxDQUFDO0VBQ3RELDBCQUFzRixDQUFDO0VBQ3ZGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBLHNCQUF1QyxZQUFZLElBQUk7RUFHdkQ7RUFFQSxJQUFJLFNBQTZCO0dBQy9CLE9BQU8sS0FBSztFQUNkO0VBRUEsaUJBQXlCO0VBQ3pCLGVBQXVCO0VBQ3ZCLGVBQXVCO0VBQ3ZCLGlCQUFnRTtFQUNoRSxlQUFzQyxRQUFRLFFBQVE7RUFDdEQseUJBQWlDO0VBRWpDLFlBQ0UsUUFDQSxTQUNBO0dBRmlCLEtBQUEsU0FBQTtHQUNBLEtBQUEsVUFBQTtHQUVqQixLQUFLLFlBQVksUUFBUSxhQUFhO0dBQ3RDLEtBQUssY0FBYyxRQUFRLGFBQWE7R0FDeEMsS0FBSyxvQkFBb0IsUUFBUTtHQUNqQyxLQUFLLG1CQUFtQixRQUFRO0dBQ2hDLEtBQUsseUJBQXlCLFFBQVE7R0FDdEMsS0FBSyxvQkFBb0IsUUFBUTtHQUNqQyxLQUFLLGlCQUFpQixRQUFRLFNBQVM7R0FDdkMsS0FBSyxrQkFBa0IsUUFBUSxVQUFVO0dBRXpDLElBQUk7R0FDSixLQUFLLGVBQWUsSUFBSSxTQUFlLFlBQVk7SUFDakQsc0JBQXNCO0dBQ3hCLENBQUM7R0FDRCxLQUFLLHNCQUFzQjtHQUUzQixLQUFLLFFBQVEsU0FBUyxTQUFTLE1BQU0sUUFBUSxVQUFVLElBQUk7R0FDM0QsS0FBSyxPQUFPLEdBQUcsV0FBVyxLQUFLLGFBQWE7R0FDNUMsS0FBSyxPQUFPLEdBQUcsU0FBUyxLQUFLLFdBQVc7R0FDeEMsS0FBSyxPQUFPLEdBQUcsU0FBUyxLQUFLLFdBQVc7R0FDeEMsS0FBSyxPQUFPLEdBQUcsUUFBUSxLQUFLLFVBQVU7R0FDdEMsS0FBSyxlQUFlO0VBQ3RCO0VBRUEsSUFBSSxTQUFrQjtHQUNwQixPQUFPLEtBQUs7RUFDZDtFQUVBLFFBQVEsVUFBOEI7R0FDcEMsS0FBSyxlQUFlLEtBQUssUUFBUTtFQUNuQztFQUVBLFVBQ0UsT0FDQSxTQUNNO0dBQ04sTUFBTSxXQUFXLE9BQU8sS0FBSztHQUM3QixNQUFNLFdBQVcsS0FBSyxnQkFBZ0IsSUFBSSxRQUFRLEtBQUssQ0FBQztHQUN4RCxTQUFTLEtBQzZDLE9BQ3REO0dBQ0EsS0FBSyxnQkFBZ0IsSUFBSSxVQUFVLFFBQVE7R0FDM0MsS0FBSyxxQkFBcUIsUUFBUTtFQUNwQztFQUVBLFFBQ0UsT0FDQSxNQUNNO0dBQ04sS0FBSyxpQkFBaUIsT0FBTyxLQUFLLEdBQUcsSUFBSTtFQUMzQztFQUVBLGVBQXFCLE9BQWUsTUFBa0I7R0FDcEQsS0FBSyxpQkFBaUIsT0FBTyxJQUFJO0VBQ25DO0VBRUEsZUFBOEI7R0FDNUIsT0FBTyxLQUFLO0VBQ2Q7RUFFQSxLQUFLLFFBQStCO0dBQ2xDLEtBQUssUUFBUSxTQUFTLEtBQUssS0FBSyxJQUFJLE1BQU07RUFDNUM7RUFFQSxNQUFNLFFBQStCO0dBQ25DLEtBQUssUUFBUSxTQUFTLE1BQU0sS0FBSyxJQUFJLE1BQU07RUFDN0M7RUFFQSxVQUFVLFFBQStCO0dBQ3ZDLEtBQUssZ0JBQWdCLE9BQU8sTUFBTTtHQUNsQyxLQUFLLFFBQVEsU0FBUyxVQUFVLEtBQUssSUFBSSxNQUFNO0VBQ2pEO0VBRUEsY0FBb0I7R0FDbEIsS0FBSyxnQkFBZ0I7R0FDckIsS0FBSyxRQUFRLFNBQVMsWUFBWSxLQUFLLEVBQUU7RUFDM0M7RUFFQSx1QkFBNkQ7R0FDM0QsT0FBTztJQUNMLHdCQUF3QixLQUFLLGdCQUFnQjtJQUM3Qyx5QkFBeUIsS0FBSyx3QkFBd0I7SUFDdEQscUJBQXFCLEtBQUssT0FBTyxlQUFlLFVBQVUsS0FBSyxPQUFPLGlCQUFpQjtHQUN6RjtFQUNGO0VBRUEsc0JBQTJEO0dBQ3pELE9BQU87SUFDTCxTQUFTLEtBQUs7SUFDZCxRQUFRLEtBQUs7SUFDYixjQUFjLEtBQUs7SUFDbkIsU0FBUyxLQUFLO0dBQ2hCO0VBQ0Y7RUFJQSxrQkFBMEI7R0FDeEIsT0FBTztJQUNMLGNBQWMsS0FBSztJQUNuQixXQUFXLEtBQUs7SUFDaEIsUUFBUSxLQUFLO0lBQ2IsU0FBUyxLQUFLO0lBQ2QsUUFBUSxLQUFLO0lBQ2IsY0FBYyxLQUFLO0lBQ25CLFNBQVMsS0FBSztHQUNoQjtFQUNGO0VBRUEsb0JBQTRCLFFBQWdCLE9BQXNCO0dBQ2hFLE1BQU0sU0FBUyxLQUFLLGdCQUFnQjtHQUNwQyxLQUFLLFFBQVEsb0JBQW9CLEtBQUs7SUFDcEMsTUFBTTtJQUNOLE9BQU87SUFDUCxHQUFHO0lBQ0gsUUFBUSxVQUFVLFNBQVk7S0FBRTtLQUFRO0lBQU0sSUFBSSxFQUFFLE9BQU87R0FDN0QsQ0FBQztHQUNELEtBQUssUUFBUSxvQkFBb0IsYUFBYTtJQUM1QyxNQUFNO0lBQ04sTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0lBQ04sTUFBTTtLQUFFLFdBQVc7S0FBVyxTQUFTO0lBQVc7SUFDbEQsR0FBRztHQUNMLENBQUM7RUFDSDtFQUdBLE1BQU0sTUFBZSxRQUF1QjtHQUMxQyxJQUFJLEtBQUssa0JBQWtCLEtBQUssZ0JBQWdCLEtBQUssT0FBTyxlQUFlLFdBQ3pFO0dBR0YsS0FBSyxlQUFlO0dBQ3BCLElBQUk7SUFDRixLQUFLLGVBQWUsTUFBTSxNQUFNO0dBQ2xDLFVBQVU7SUFDUixLQUFLLFdBQVcsTUFBTSxNQUFNO0dBQzlCO0VBQ0Y7RUFHQSxpQkFBa0MsUUFBaUI7R0FDakQsS0FBSyxtQkFBbUIsWUFBWTtJQUVsQyxNQUFNLGlCQUFpQixrQkFEVixpQkFBaUIsR0FDVyxDQUFJO0lBQzdDLElBQUksQ0FBQyxnQkFBZ0I7S0FDbkIsS0FBSyxvQkFBb0IsZ0JBQWdCO0tBQ3pDLEtBQUssTUFBTSwwQ0FBMEMseUJBQXlCO0tBQzlFO0lBQ0Y7SUFFQSxLQUFLLFFBQVEsb0JBQW9CLEtBQUs7S0FDcEMsTUFBTTtLQUNOLE9BQU87S0FDUCxHQUFHLEtBQUssZ0JBQWdCO0tBQ3hCLFFBQVEsRUFBRSxPQUFPLGVBQWUsTUFBTTtLQUN0QyxTQUFTLGVBQWU7SUFDMUIsQ0FBQztJQUNELEtBQUssUUFBUSxTQUFTLE1BQU0sS0FBSyxFQUFFO0lBQ25DLE1BQU0sS0FBSyxpQkFBaUIsY0FBYztHQUM1QyxDQUFDO0VBQ0g7RUFFQSxlQUFnQyxNQUFlLFdBQTZCO0dBQzFFLE1BQU0sYUFBYSxjQUFjLE1BQU0sSUFBSSxTQUFTLFFBQVEsU0FBUztHQUNyRSxLQUFLLFdBQVcsTUFBTSxVQUFVO0VBQ2xDO0VBR0Esb0JBQXFDO0dBQ25DLEtBQUssTUFBTSw4QkFBOEIsMkJBQTJCO0VBQ3RFO0VBRUEsbUJBQW9DO0dBQ2xDLEtBQUssZUFBZTtHQUNwQixLQUFLLFFBQVEsU0FBUyxNQUFNLEtBQUssRUFBRTtFQUNyQztFQUlBLDJCQUNFLFVBQ3FDO0dBQ3JDLE1BQU0sZ0JBQWdCLGVBQWU7R0FFckMsSUFDRSxLQUFLLFFBQVEsb0JBQW9CLGdCQUFnQixDQUFDLENBQUMseUJBQ25ELFNBQVMsTUFBTSxhQUNmO0lBQ0EsTUFBTSxTQUFTLGlCQUFpQixTQUFTLEtBQUssV0FBVztJQUN6RCxJQUFJLFFBQ0YsT0FBTztLQUNMLFNBQVMsT0FBTztLQUNoQixRQUFRO0tBQ1IsY0FBYyxPQUFPO0tBQ3JCLFNBQVMsT0FBTztJQUNsQjtJQUdGLEtBQUssUUFBUSxvQkFBb0IsS0FBSztLQUNwQyxNQUFNO0tBQ04sT0FBTztLQUNQLEdBQUcsS0FBSyxnQkFBZ0I7S0FDeEIsUUFBUTtNQUFFLFFBQVE7TUFBVyxhQUFhLFNBQVMsS0FBSztLQUFZO0lBQ3RFLENBQUM7R0FDSDtHQUVBLE9BQU87SUFDTCxTQUFTLEtBQUs7SUFDZCxRQUFRO0lBQ1IsY0FBYyxLQUFLLG9CQUFvQixLQUFLO0lBQzVDLFNBQVMsS0FBSztHQUNoQjtFQUNGO0VBS0EsTUFBYyxpQkFBaUIsVUFBeUM7R0FDdEUsTUFBTSxXQUFXLEtBQUssZ0JBQWdCLElBQUksU0FBUyxLQUFLO0dBQ3hELE1BQU0sU0FBUyxLQUFLLGVBQWUsU0FBUztHQUU1QyxJQUFJLENBQUMsUUFBUTtJQUNYLEtBQUssb0JBQW9CLGdCQUFnQixTQUFTLEtBQUs7SUFDdkQsS0FBSyxNQUFNLGdDQUFnQyxlQUFlO0lBQzFEO0dBQ0Y7R0FFQSxNQUFNLFNBQVMsT0FBTyxVQUFVLFNBQVMsSUFBSTtHQUM3QyxJQUFJLENBQUMsT0FBTyxTQUFTO0lBQ25CLEtBQUssb0JBQW9CLGVBQWUsU0FBUyxLQUFLO0lBQ3RELEtBQUssTUFBTSwwQ0FBMEMsb0JBQW9CO0lBQ3pFO0dBQ0Y7R0FFQSxJQUFJLENBQUMsWUFBWSxTQUFTLFdBQVcsR0FBRztJQUN0QyxJQUFJLEtBQUssZ0JBQWdCLFVBQVUsc0JBQXNCO0tBQ3ZELEtBQUssUUFBUSxvQkFBb0IsS0FBSztNQUNwQyxNQUFNO01BQ04sT0FBTztNQUNQLEdBQUcsS0FBSyxnQkFBZ0I7TUFDeEIsUUFBUSxFQUFFLE9BQU8sU0FBUyxNQUFNO0tBQ2xDLENBQUM7S0FDRCxLQUFLLGdCQUFnQixNQUFNO0lBQzdCO0lBQ0EsS0FBSyxnQkFBZ0IsS0FBSyxRQUFRO0lBQ2xDLEtBQUssUUFBUSxvQkFBb0IsS0FBSztLQUNwQyxNQUFNO0tBQ04sT0FBTztLQUNQLEdBQUcsS0FBSyxnQkFBZ0I7S0FDeEIsUUFBUSxFQUFFLE9BQU8sU0FBUyxNQUFNO0lBQ2xDLENBQUM7SUFDRDtHQUNGO0dBRUEsTUFBTSxXQUFXLEtBQUssMkJBQTJCLFFBQVE7R0FFekQsTUFBTSxxQkFBcUI7SUFDekIsY0FBYyxLQUFLO0lBQ25CLFdBQVcsS0FBSztJQUNoQixRQUFRLEtBQUs7SUFDYixTQUFTLFNBQVM7SUFDbEIsUUFBUSxTQUFTO0lBQ2pCLGNBQWMsU0FBUztJQUN2QixTQUFTLFNBQVM7R0FDcEI7R0FDQSxJQUFJO0lBQ0YsS0FBSyxNQUFNLFdBQVcsVUFDcEIsTUFBTSxRQUFRLE9BQU8sTUFBTSxRQUFRO0lBRXJDLEtBQUssUUFBUSxvQkFBb0IsS0FBSztLQUNwQyxNQUFNO0tBQ04sT0FBTztLQUNQLEdBQUc7S0FDSCxRQUFRLEVBQUUsT0FBTyxTQUFTLE1BQU07SUFDbEMsQ0FBQztJQUNELEtBQUssUUFBUSxvQkFBb0IsYUFBYTtLQUM1QyxNQUFNO0tBQ04sTUFBTTtLQUNOLE9BQU87S0FDUCxNQUFNO0tBQ04sTUFBTTtNQUFFLFdBQVc7TUFBVyxPQUFPLFNBQVM7TUFBTyxTQUFTO0tBQVc7S0FDekUsR0FBRztJQUNMLENBQUM7R0FDSCxTQUFTLE9BQU87SUFDZCxLQUFLLFFBQVEsb0JBQW9CLEtBQUs7S0FDcEMsTUFBTTtLQUNOLE9BQU87S0FDUCxHQUFHO0tBQ0gsUUFBUSxFQUFFLE9BQU8sU0FBUyxNQUFNO0lBQ2xDLENBQUM7SUFDRCxNQUFNO0dBQ1I7RUFDRjtFQUVBLHFCQUE2QixPQUFxQjtHQUNoRCxNQUFNLFlBQThCLENBQUM7R0FDckMsTUFBTSxVQUE0QixDQUFDO0dBRW5DLEtBQUssTUFBTSxXQUFXLEtBQUssaUJBQWlCO0lBQzFDLElBQUksUUFBUSxVQUFVLE9BQU87S0FDM0IsVUFBVSxLQUFLLE9BQU87S0FDdEI7SUFDRjtJQUVBLFFBQVEsS0FBSyxPQUFPO0dBQ3RCO0dBRUEsS0FBSyxnQkFBZ0IsU0FBUztHQUM5QixLQUFLLGdCQUFnQixLQUFLLEdBQUcsU0FBUztHQUV0QyxLQUFLLE1BQU0sV0FBVyxTQUNwQixLQUFLLG1CQUFtQixZQUFZO0lBQ2xDLE1BQU0sS0FBSyxpQkFBaUIsT0FBTztHQUNyQyxDQUFDO0VBRUw7RUFFQSxpQkFBK0IsT0FBZSxNQUFrQjtHQUM5RCxNQUFNLFNBQVMsS0FBSyxnQkFBZ0I7R0FDcEMsSUFBSSxDQUFDLFFBQVE7SUFDWCxLQUFLLFFBQVEsb0JBQW9CLEtBQUs7S0FDcEMsTUFBTTtLQUNOLE9BQU87S0FDUCxHQUFHLEtBQUssZ0JBQWdCO0tBQ3hCLFFBQVE7TUFBRTtNQUFPLFFBQVE7S0FBZTtJQUMxQyxDQUFDO0lBQ0QsTUFBTSxJQUFJLE1BQU0sNEJBQTRCLE9BQU87R0FDckQ7R0FFQSxNQUFNLFNBQVMsT0FBTyxVQUFVLElBQUk7R0FDcEMsSUFBSSxDQUFDLE9BQU8sU0FBUztJQUNuQixLQUFLLFFBQVEsb0JBQW9CLEtBQUs7S0FDcEMsTUFBTTtLQUNOLE9BQU87S0FDUCxHQUFHLEtBQUssZ0JBQWdCO0tBQ3hCLFFBQVE7TUFBRTtNQUFPLFFBQVE7S0FBaUI7SUFDNUMsQ0FBQztJQUNELE1BQU0sSUFBSSxNQUFNLG9DQUFvQyxPQUFPO0dBQzdEO0dBRUEsSUFBSSxLQUFLLGtCQUFrQixLQUFLLE9BQU8sZUFBZSxTQUFTO0lBQzdELEtBQUssUUFBUSxvQkFBb0IsS0FBSztLQUNwQyxNQUFNO0tBQ04sT0FBTztLQUNQLEdBQUcsS0FBSyxnQkFBZ0I7S0FDeEIsUUFBUTtNQUFFO01BQU8sUUFBUTtLQUFtQjtJQUM5QyxDQUFDO0lBQ0Q7R0FDRjtHQUVBLEtBQUssdUJBQ0gsS0FBSyxVQUFVO0lBQ2I7SUFDQSxNQUFNLE9BQU87R0FDZixDQUFDLEdBQ0QsS0FDRjtFQUNGO0VBSUEsV0FBbUIsTUFBZSxTQUF3QjtHQUN4RCxJQUFJLEtBQUssZ0JBQ1A7R0FHRixLQUFLLGlCQUFpQjtHQUN0QixLQUFLLGVBQWU7R0FDcEIsS0FBSyxjQUFjO0dBQ25CLE1BQU0sU0FBUyxLQUFLLGdCQUFnQjtHQUNwQyxLQUFLLFFBQVEsb0JBQW9CLEtBQUs7SUFDcEMsTUFBTTtJQUNOLE9BQU87SUFDUCxHQUFHO0dBQ0wsQ0FBQztHQUNELElBQUksS0FBSyxRQUFRLG9CQUFvQixnQkFBZ0IsQ0FBQyxDQUFDLDhCQUNyRCxLQUFLLFFBQVEsb0JBQW9CLFdBQVc7SUFDMUMsZUFBZTtJQUNmLE1BQU07SUFDTixZQUFZLFlBQVksSUFBSSxJQUFJLEtBQUs7SUFDckMsUUFBUSxxQkFBcUIsSUFBSTtJQUNqQyxHQUFHO0dBQ0wsQ0FBQztHQUVILEtBQUssT0FBTyxJQUFJLFdBQVcsS0FBSyxhQUFhO0dBQzdDLEtBQUssT0FBTyxJQUFJLFNBQVMsS0FBSyxXQUFXO0dBQ3pDLEtBQUssT0FBTyxJQUFJLFNBQVMsS0FBSyxXQUFXO0dBQ3pDLEtBQUssT0FBTyxJQUFJLFFBQVEsS0FBSyxVQUFVO0dBQ3ZDLEtBQUssZUFBZTtHQUNwQixLQUFLLGdCQUFnQixTQUFTO0dBQzlCLEtBQUssd0JBQXdCLFNBQVM7R0FDdEMsS0FBSyxRQUFRLFNBQVMsV0FBVyxLQUFLLEVBQUU7R0FDeEMsS0FBSyxNQUFNLFlBQVksS0FBSyxlQUFlLE9BQU8sQ0FBQyxHQUNqRCxJQUFJO0lBQ0YsTUFBTSxTQUFTLFNBQVM7SUFDeEIsSUFBSSxjQUFjLE1BQU0sR0FDdEIsQUFBSyxPQUFPLFlBQVksQ0FFeEIsQ0FBQztHQUVMLFFBQVEsQ0FFUjtHQUVGLEtBQUssb0JBQW9CO0VBQzNCO0VBR0EsaUJBQStCO0dBQzdCLElBQUksS0FBSyxlQUFlLEdBQ3RCO0dBR0YsS0FBSyxpQkFBaUIsa0JBQWtCO0lBQ3RDLElBQUksS0FBSyxrQkFBa0IsS0FBSyxPQUFPLGVBQWUsU0FDcEQ7SUFHRixJQUFJLEtBQUssY0FBYztLQUNyQixLQUFLLFFBQVEsb0JBQW9CLEtBQUs7TUFDcEMsTUFBTTtNQUNOLE9BQU87TUFDUCxHQUFHLEtBQUssZ0JBQWdCO0tBQzFCLENBQUM7S0FDRCxLQUFLLE1BQU0sMEJBQTBCLG1CQUFtQjtLQUN4RDtJQUNGO0lBRUEsS0FBSyxlQUFlO0lBQ3BCLEtBQUssT0FBTyxLQUFLO0dBQ25CLEdBQUcsS0FBSyxXQUFXO0VBQ3JCO0VBRUEsZ0JBQThCO0dBQzVCLElBQUksQ0FBQyxLQUFLLGdCQUNSO0dBR0YsY0FBYyxLQUFLLGNBQWM7R0FDakMsS0FBSyxpQkFBaUI7RUFDeEI7RUFHQSxlQUF1QixNQUFlLFFBQXVCO0dBQzNELElBQUk7SUFDRixJQUFJLEtBQUssT0FBTyxlQUFlLFdBQVcsS0FBSyxPQUFPLGVBQWUsZUFBZTtLQUNsRixLQUFLLE9BQU8sTUFBTSxNQUFNLG9CQUFvQixNQUFNLENBQUM7S0FDbkQ7SUFDRjtJQUVBLEtBQUssT0FBTyxVQUFVO0dBQ3hCLFFBQVE7SUFDTixJQUFJO0tBQ0YsS0FBSyxPQUFPLFVBQVU7SUFDeEIsUUFBUSxDQUVSO0dBQ0Y7RUFDRjtFQUdBLG1CQUEyQixNQUFpQztHQUMxRCxLQUFLLGVBQWUsS0FBSyxhQUN0QixLQUFLLFlBQVk7SUFDaEIsSUFBSSxLQUFLLGdCQUNQO0lBR0YsTUFBTSxLQUFLO0dBQ2IsQ0FBQyxDQUFDLENBQ0QsWUFBWTtJQUNYLEtBQUssTUFBTSw4QkFBOEIseUJBQXlCO0dBQ3BFLENBQUM7RUFDTDtFQUlBLHVCQUErQixTQUFpQixPQUFxQjtHQUNuRSxJQUFJLEtBQUssd0JBQXdCLFVBQVUsK0JBQStCO0lBQ3hFLEtBQUssUUFBUSxvQkFBb0IsS0FBSztLQUNwQyxNQUFNO0tBQ04sT0FBTztLQUNQLEdBQUcsS0FBSyxnQkFBZ0I7SUFDMUIsQ0FBQztJQUNELEtBQUssTUFBTSwrQkFBK0IsaUNBQWlDO0lBQzNFO0dBQ0Y7R0FFQSxLQUFLLHdCQUF3QixLQUFLO0lBQUU7SUFBUztHQUFNLENBQUM7R0FDcEQsS0FBSyxRQUFRLG9CQUFvQixLQUFLO0lBQ3BDLE1BQU07SUFDTixPQUFPO0lBQ1AsR0FBRyxLQUFLLGdCQUFnQjtJQUN4QixRQUFRLEVBQUUsTUFBTTtJQUNoQixTQUFTLGtCQUFrQixPQUFPLENBQUMsRUFBRTtHQUN2QyxDQUFDO0dBQ0QsS0FBSyxzQkFBc0I7RUFDN0I7RUFFQSxzQkFBOEIsVUFBa0IsR0FBUztHQUN2RCxJQUFJLEtBQUssMEJBQTBCLEtBQUssZ0JBQ3RDO0dBR0YsS0FBSyx5QkFBeUI7R0FDOUIsTUFBTSxjQUFjO0lBQ2xCLEtBQUsseUJBQXlCO0lBQzlCLEtBQUssc0JBQXNCO0dBQzdCO0dBRUEsSUFBSSxVQUFVLEdBQUc7SUFDZixXQUFXLE9BQU8sT0FBTztJQUN6QjtHQUNGO0dBRUEsYUFBYSxLQUFLO0VBQ3BCO0VBSUEsd0JBQXNDO0dBQ3BDLElBQUksS0FBSyxrQkFBa0IsS0FBSyxPQUFPLGVBQWUsU0FDcEQ7R0FHRixJQUFJLEtBQUssT0FBTyxpQkFBaUIsNEJBQTRCO0lBQzNELEtBQUssUUFBUSxvQkFBb0IsS0FBSztLQUNwQyxNQUFNO0tBQ04sT0FBTztLQUNQLEdBQUcsS0FBSyxnQkFBZ0I7SUFDMUIsQ0FBQztJQUNELEtBQUssc0JBQXNCLHVCQUF1QjtJQUNsRDtHQUNGO0dBRUEsSUFBSSxPQUFPO0dBQ1gsT0FDRSxPQUFPLHVCQUNQLEtBQUssd0JBQXdCLFNBQVMsS0FDdEMsS0FBSyxPQUFPLGVBQWUsU0FDM0I7SUFDQSxNQUFNLE9BQU8sS0FBSyx3QkFBd0IsTUFBTTtJQUNoRCxJQUFJLENBQUMsTUFDSDtJQUVGLE1BQU0sRUFBRSxTQUFTLFVBQVU7SUFFM0IsTUFBTSxZQUFZLFlBQVksSUFBSTtJQUNsQyxNQUFNLFNBQVMsS0FBSyxnQkFBZ0I7SUFDcEMsSUFBSTtLQUNGLEtBQUssT0FBTyxLQUFLLE9BQU87S0FDeEIsTUFBTSxhQUFhLFlBQVksSUFBSSxJQUFJO0tBQ3ZDLEtBQUssUUFBUSxvQkFBb0IsS0FBSztNQUNwQyxNQUFNO01BQ04sT0FBTztNQUNQLEdBQUc7TUFDSCxRQUFRLEVBQUUsTUFBTTtLQUNsQixDQUFDO0tBQ0QsS0FBSyxRQUFRLG9CQUFvQixXQUFXO01BQzFDLGVBQWU7TUFDZixNQUFNO01BQ047TUFDQSxRQUFRO01BQ1IsR0FBRztNQUNILFlBQVksRUFBRSxNQUFNO0tBQ3RCLENBQUM7S0FDRCxLQUFLLFFBQVEsb0JBQW9CLGFBQWE7TUFDNUMsTUFBTTtNQUNOLE1BQU07TUFDTixPQUFPO01BQ1AsTUFBTTtNQUNOLE1BQU07T0FBRSxTQUFTO09BQVE7TUFBTTtNQUMvQixHQUFHO0tBQ0wsQ0FBQztJQUNILFNBQVMsT0FBTztLQUNkLE1BQU0sYUFBYSxZQUFZLElBQUksSUFBSTtLQUN2QyxLQUFLLFFBQVEsb0JBQW9CLEtBQUs7TUFDcEMsTUFBTTtNQUNOLE9BQU87TUFDUCxHQUFHO01BQ0gsUUFBUSxFQUFFLE1BQU07S0FDbEIsQ0FBQztLQUNELEtBQUssUUFBUSxvQkFBb0IsV0FBVztNQUMxQyxlQUFlO01BQ2YsTUFBTTtNQUNOO01BQ0EsUUFBUTtNQUNSLEdBQUc7TUFDSCxZQUFZLEVBQUUsTUFBTTtNQUNwQixXQUFXLGlCQUFpQixRQUFRLE1BQU0sT0FBTyxjQUFjLEtBQUs7S0FDdEUsQ0FBQztLQUNELEtBQUssTUFBTSw4QkFBOEIseUJBQXlCO0tBQ2xFO0lBQ0Y7SUFFQSxRQUFRO0lBQ1IsSUFBSSxLQUFLLE9BQU8saUJBQWlCLDRCQUMvQjtHQUVKO0dBRUEsSUFBSSxLQUFLLHdCQUF3QixTQUFTLEdBQ3hDLEtBQUssc0JBQ0gsS0FBSyxPQUFPLGlCQUFpQiw2QkFBNkIsMEJBQTBCLENBQ3RGO0VBRUo7Q0FDRiJ9
|
|
659
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyB0eXBlIEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuXG5pbXBvcnQgeyB0eXBlIFJhd0RhdGEsIHR5cGUgV2ViU29ja2V0IH0gZnJvbSBcIndzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBydW50aW1lVHlwZU9mIH0gZnJvbSBcIi4uL3J1bnRpbWUtdHlwZVwiO1xuaW1wb3J0IHsgaXNTdHJpbmdWYWx1ZSB9IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldEF1ZGllbmNlIH0gZnJvbSBcIi4vd3MtYXVkaWVuY2VcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0Q2x1c3RlckJ1cyB9IGZyb20gXCIuL3dzLWNsdXN0ZXItYnVzXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldEZyYW1lQ29ubmVjdGlvbiB9IGZyb20gXCIuL3dzLWNvcmVcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0Um91dGVEZWZpbml0aW9uIH0gZnJvbSBcIi4vd3MtZGVsaXZlcnlcIjtcbmltcG9ydCB7IGVuY29kZVdlYlNvY2tldEZyYW1lIH0gZnJvbSBcIi4vd3MtZnJhbWVcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0UHJlc2VuY2VTdG9yZSB9IGZyb20gXCIuL3dzLXByZXNlbmNlLXN0b3JlXCI7XG5pbXBvcnQge1xuICB0eXBlIE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uLFxuICBXZWJTb2NrZXRSZWdpc3RyeSxcbiAgdHlwZSBXZWJTb2NrZXRSZWdpc3RyeU9wdGlvbnMsXG4gIHR5cGUgV2ViU29ja2V0Um9vbUlkLFxuICB0eXBlIFdlYlNvY2tldFVzZXJJZCxcbn0gZnJvbSBcIi4vd3MtcmVnaXN0cnlcIjtcbmltcG9ydCB7IGNyZWF0ZVdlYlNvY2tldE5vZGVJZCwgY3JlYXRlV2ViU29ja2V0U2Vzc2lvbklkIH0gZnJvbSBcIi4vd3Mtc2Vzc2lvbi1pZFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIsXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvblNuYXBzaG90LFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0LFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIsXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5T3B0aW9ucyxcbiAgdHlwZSBUZWxlbWV0cnlJbnNwZWN0YWJsZUNvbm5lY3Rpb24sXG4gIGNyZWF0ZVdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIsXG4gIGlzUHJvbWlzZUxpa2UsXG59IGZyb20gXCIuL3dzLXRlbGVtZXRyeVwiO1xuaW1wb3J0IHsgcGFyc2VUcmFjZVBhcmVudCwgZ2VuZXJhdGVTcGFuSWQgfSBmcm9tIFwiLi93cy10ZWxlbWV0cnktdHJhY2VcIjtcblxuLy8gdHJhbnNwb3J0LWxldmVsIOyDgeyImOyZgCBxdWV1ZSB0aHJlc2hvbGTrpbwg7ZWcIO2MjOydvOyXkCDrqqjslYQgbGlmZWN5Y2xlL2JhY2twcmVzc3VyZSDsoJXssYXsnYQg7KSR7JWZ7ZmU7ZWoXG5jb25zdCBXU19DT05ORUNUSU5HID0gMDtcbmNvbnN0IFdTX09QRU4gPSAxO1xuY29uc3QgV1NfQ0xPU0VEID0gMztcbi8vIFJGQyA2NDU1IGNsb3NlIGNvZGVzIHVzZWQgYnkgU29uYW11J3MgV2ViU29ja2V0IHJ1bnRpbWUuXG5jb25zdCBXU19DTE9TRV9DT0RFX0dPSU5HX0FXQVkgPSAxMDAxO1xuY29uc3QgV1NfQ0xPU0VfQ09ERV9JTlZBTElEX0ZSQU1FX1BBWUxPQURfREFUQSA9IDEwMDc7XG5jb25zdCBXU19DTE9TRV9DT0RFX1BPTElDWV9WSU9MQVRJT04gPSAxMDA4O1xuY29uc3QgV1NfQ0xPU0VfQ09ERV9JTlRFUk5BTF9FUlJPUiA9IDEwMTE7XG5jb25zdCBXU19DTE9TRV9DT0RFX1RSWV9BR0FJTl9MQVRFUiA9IDEwMTM7XG5jb25zdCBNQVhfUEVORElOR19NRVNTQUdFUyA9IDEwMDtcbmNvbnN0IE1BWF9QRU5ESU5HX09VVEJPVU5EX01FU1NBR0VTID0gMV8wMDA7XG5jb25zdCBNQVhfU09DS0VUX0JVRkZFUkVEX0FNT1VOVCA9IDFfMDQ4XzU3NjtcbmNvbnN0IE9VVEJPVU5EX0JBVENIX1NJWkUgPSA1MDtcbmNvbnN0IE9VVEJPVU5EX1JFVFJZX0RFTEFZX01TID0gNTtcblxuLy8gZW52ZWxvcGXsnYQgYHtldmVudCwgZGF0YX1gIO2Yle2DnOuhnCDqs6DsoJXtlbQgc2VydmVyIGhhbmRsZXLsmYAgZ2VuZXJhdGVkIGNsaWVudOqwgCDqsJnsnYAgZnJhbWluZyBjb250cmFjdOulvCDsk7Dqsowg7ZWoXG4vLyBtZXRh64qUIG9wdGlvbmFs7J2066+A66GcIOq4sOyhtCBge2V2ZW50LCBkYXRhfWAg66mU7Iuc7KeA64+EIOq3uOuMgOuhnCDtjIzsi7HrkKggKGJhY2t3YXJkLWNvbXBhdGlibGUpXG5jb25zdCBXZWJTb2NrZXRFbnZlbG9wZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgZXZlbnQ6IHouc3RyaW5nKCksXG4gIGRhdGE6IHouanNvbigpLFxuICBtZXRhOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICB0cmFjZXBhcmVudDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgdHJhY2VzdGF0ZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxudHlwZSBNZXNzYWdlSGFuZGxlcjxUPiA9IChcbiAgZGF0YTogVCxcbiAgdGVsZW1ldHJ5Q29udGV4dD86IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0LFxuKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbnR5cGUgQ2xvc2VIYW5kbGVyID0gKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldEV2ZW50TWFwPEV2ZW50UGF5bG9hZCA9IG5ldmVyPiA9IFJlY29yZDxzdHJpbmcsIEV2ZW50UGF5bG9hZD47XG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUcmFuc3BvcnQgPSBQaWNrPFxuICBXZWJTb2NrZXQsXG4gIFwiYnVmZmVyZWRBbW91bnRcIiB8IFwiY2xvc2VcIiB8IFwicGluZ1wiIHwgXCJyZWFkeVN0YXRlXCIgfCBcInNlbmRcIiB8IFwidGVybWluYXRlXCJcbj4gJiB7XG4gIG9mZjogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8RXZlbnRFbWl0dGVyW1wib2ZmXCJdPikgPT4gdm9pZDtcbiAgb246ICguLi5hcmdzOiBQYXJhbWV0ZXJzPEV2ZW50RW1pdHRlcltcIm9uXCJdPikgPT4gdm9pZDtcbn07XG5cbnR5cGUgV2ViU29ja2V0RXZlbnRGaWVsZHMgPSBSZWNvcmQ8c3RyaW5nLCB6LlpvZFR5cGU+O1xudHlwZSBJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRTY2hlbWEgZXh0ZW5kcyBXZWJTb2NrZXRFdmVudEZpZWxkcz4gPSB6LmluZmVyPHouWm9kT2JqZWN0PFRTY2hlbWE+PjtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0T3V0RXZlbnRzPFRPdXQgZXh0ZW5kcyBvYmplY3QgPSBXZWJTb2NrZXRFdmVudE1hcD4gPSBUT3V0O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRJbkV2ZW50czxUSW4gZXh0ZW5kcyBvYmplY3QgPSBXZWJTb2NrZXRFdmVudE1hcD4gPSBUSW47XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU29ja2V0Q29ubmVjdGlvbjxcbiAgVE91dCBleHRlbmRzIG9iamVjdCA9IFdlYlNvY2tldEV2ZW50TWFwLFxuICBUSW4gZXh0ZW5kcyBvYmplY3QgPSBXZWJTb2NrZXRFdmVudE1hcCxcbj4gZXh0ZW5kcyBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbiB7XG4gIHRyYW5zcG9ydDogXCJ3c1wiO1xuICBvbkNsb3NlKGNhbGxiYWNrOiBDbG9zZUhhbmRsZXIpOiB2b2lkO1xuICBvbk1lc3NhZ2U8SyBleHRlbmRzIGtleW9mIFdlYlNvY2tldEluRXZlbnRzPFRJbj4+KFxuICAgIGV2ZW50OiBLLFxuICAgIGhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyPFdlYlNvY2tldEluRXZlbnRzPFRJbj5bS10+LFxuICApOiB2b2lkO1xuICBwdWJsaXNoPEsgZXh0ZW5kcyBrZXlvZiBXZWJTb2NrZXRPdXRFdmVudHM8VE91dD4+KFxuICAgIGV2ZW50OiBLLFxuICAgIGRhdGE6IFdlYlNvY2tldE91dEV2ZW50czxUT3V0PltLXSxcbiAgKTogdm9pZDtcbiAgd2FpdEZvckNsb3NlKCk6IFByb21pc2U8dm9pZD47XG4gIC8vIOyVhOuemCBtdXRhdGlvbuydgCDrqZTrqqjrpqzrpbwg7KaJ7IucIOqwseyLoO2VmOqzoCwgc3RvcmUg67CY7JiB7J20IOuBneuCmOuptCByZXNvbHZl7ZWc64ukLiByZWplY3TtlZjsp4Ag7JWK64qU64ukXG4gIGpvaW4ocm9vbUlkOiBXZWJTb2NrZXRSb29tSWQpOiBQcm9taXNlPHZvaWQ+O1xuICBsZWF2ZShyb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IFByb21pc2U8dm9pZD47XG4gIHNldFVzZXJJZCh1c2VySWQ6IFdlYlNvY2tldFVzZXJJZCk6IFByb21pc2U8dm9pZD47XG4gIGNsZWFyVXNlcklkKCk6IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCB0eXBlIEFueVdlYlNvY2tldENvbm5lY3Rpb24gPSBXZWJTb2NrZXRDb25uZWN0aW9uPG9iamVjdCwgb2JqZWN0PjtcblxudHlwZSBQYXJzZWRFbnZlbG9wZSA9IHouaW5mZXI8dHlwZW9mIFdlYlNvY2tldEVudmVsb3BlU2NoZW1hPjtcblxudHlwZSBXZWJTb2NrZXRDb25uZWN0aW9uT3B0aW9uczxcbiAgVE91dCBleHRlbmRzIFdlYlNvY2tldEV2ZW50RmllbGRzLFxuICBUSW4gZXh0ZW5kcyBXZWJTb2NrZXRFdmVudEZpZWxkcyxcbj4gPSB7XG4gIC8vIHJvdXRlIHRhYmxlIO2CpCjrs7TthrUgQVBJIHBhdGgpLiDsm5Dqsqkg64W465Oc6rCAIOuztOuCuCBlbnZlbG9wZeyXkOyEnCDsnbQg7Jew6rKw7J20IOuwm+ydhCBmcmFtZeydhCDqs6Drpbwg65WMIOyTtOuLpFxuICByb3V0ZUtleT86IHN0cmluZztcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICBoZWFydGJlYXQ/OiBudW1iZXI7XG4gIGFjdGl2ZT86IGJvb2xlYW47XG4gIG91dEV2ZW50czogei5ab2RPYmplY3Q8VE91dD47XG4gIGluRXZlbnRzOiB6LlpvZE9iamVjdDxUSW4+O1xuICByZWdpc3RyeTogV2ViU29ja2V0UmVnaXN0cnk7XG4gIHRlbGVtZXRyeUNvbnRyb2xsZXI6IFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXI7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFJ1bnRpbWVPcHRpb25zID0ge1xuICBub2RlSWQ/OiBzdHJpbmc7XG4gIHByZXNlbmNlU3RvcmU/OiBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlO1xuICBjbHVzdGVyQnVzPzogV2ViU29ja2V0Q2x1c3RlckJ1cztcbiAgdGVsZW1ldHJ5PzogYm9vbGVhbiB8IFdlYlNvY2tldFRlbGVtZXRyeU9wdGlvbnM7XG4gIC8vIHNodXRkb3duIOyLnCDsp4Ttlokg7KSR7J24IHN0b3JlIG11dGF0aW9u6rO8IHB1Ymxpc2jrpbwg6riw64uk66as64qUIOyDge2VnC4g6riw67O46rCSIDUwMDBtc1xuICBkcmFpblRpbWVvdXRNcz86IG51bWJlcjtcbn07XG5cbi8vIHJlZ2lzdHJ566W8IOyGjOycoO2VmOqzoCBjb25uZWN0aW9uIOyDneyEsS9zaHV0ZG93buydhCDri7Tri7ntlaguIFNvbmFtdSDslaDtlIzrpqzsvIDsnbTshZgg7IiY66qF7KO86riw7JmAIOqwmeydtCDsm4Dsp4HsnbTrj4TroZ0g7ISk6rOE7ZWoXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0UnVudGltZSB7XG4gIHJlYWRvbmx5IHJlZ2lzdHJ5OiBXZWJTb2NrZXRSZWdpc3RyeTtcbiAgcmVhZG9ubHkgdGVsZW1ldHJ5Q29udHJvbGxlcjogV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBXZWJTb2NrZXRSdW50aW1lT3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gbm9kZUlk66W8IOyjvOyngCDslYrsnLzrqbQgc3RvcmUvYnVz6rCAIOqwgOynhCBub2RlSWTrpbwg65Sw66W06rOgLCDrkZgg64ukIOyXhuycvOuptCBob3N0bmFtZS1waWQt656c642k7Jy866GcIOunjOuToOuLpC5cbiAgICAvLyBzdG9yZeuCmCBidXPsnZggbm9kZUlk6rCAIOydtCDqsJLqs7wg64uk66W066m0IHJlZ2lzdHJ5IOyDneyEsSDsi5wg7KaJ7IucIOyLpO2MqO2VnOuLpFxuICAgIGNvbnN0IHJlc29sdmVkTm9kZUlkID1cbiAgICAgIG9wdGlvbnMubm9kZUlkID8/XG4gICAgICBvcHRpb25zLnByZXNlbmNlU3RvcmU/Lm5vZGVJZCA/P1xuICAgICAgb3B0aW9ucy5jbHVzdGVyQnVzPy5ub2RlSWQgPz9cbiAgICAgIGNyZWF0ZVdlYlNvY2tldE5vZGVJZCgpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlciA9IGNyZWF0ZVdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIob3B0aW9ucy50ZWxlbWV0cnksIHtcbiAgICAgIHJ1bnRpbWVJZDogcmFuZG9tVVVJRCgpLFxuICAgICAgbm9kZUlkOiByZXNvbHZlZE5vZGVJZCxcbiAgICB9KTtcbiAgICBjb25zdCByZWdpc3RyeU9wdGlvbnM6IFdlYlNvY2tldFJlZ2lzdHJ5T3B0aW9ucyA9IHtcbiAgICAgIG5vZGVJZDogcmVzb2x2ZWROb2RlSWQsXG4gICAgICBwcmVzZW5jZVN0b3JlOiBvcHRpb25zLnByZXNlbmNlU3RvcmUsXG4gICAgICBjbHVzdGVyQnVzOiBvcHRpb25zLmNsdXN0ZXJCdXMsXG4gICAgICB0ZWxlbWV0cnlDb250cm9sbGVyOiB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIsXG4gICAgICBkcmFpblRpbWVvdXRNczogb3B0aW9ucy5kcmFpblRpbWVvdXRNcyxcbiAgICB9O1xuICAgIHRoaXMucmVnaXN0cnkgPSBuZXcgV2ViU29ja2V0UmVnaXN0cnkocmVnaXN0cnlPcHRpb25zKTtcbiAgfVxuXG4gIC8vIHJvdXRlS2V567OEIG91dEV2ZW50c+ulvCDrk7HroZ3tlZzri6QuIOqwmeydgCDtgqTroZwg64uk7IucIO2YuOy2nO2VmOuptCDsiqTtgqTrp4jrpbwg6rWQ7LK07ZWc64ukXG4gIHJlZ2lzdGVyUm91dGUocm91dGVLZXk6IHN0cmluZywgcm91dGU6IHsgb3V0RXZlbnRzOiB6LlpvZE9iamVjdCB9KTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RyeS5yZWdpc3RlclJvdXRlKHJvdXRlS2V5LCByb3V0ZS5vdXRFdmVudHMpO1xuICB9XG5cbiAgLy8gcm91dGUgdGFibGUg7KCE7LK066W8IOq1kOyytO2VnOuLpC4g66qp66Gd7JeQIOyXhuuKlCByb3V0ZUtleeuKlCDsoJzqsbDrkJzri6RcbiAgcmVwbGFjZVJvdXRlcyhyb3V0ZXM6IFdlYlNvY2tldFJvdXRlRGVmaW5pdGlvbltdKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RyeS5yZXBsYWNlUm91dGVzKHJvdXRlcyk7XG4gIH1cblxuICAvKipcbiAgICog7IaM7LyTIOumrOyKpOuEiOulvCDrj5nquLDroZwg67aZ7J206rOgIHJlZ2lzdHJ57JeQIOuTseuhne2VnOuLpC4gc3RvcmUucmVnaXN0ZXLqsIAg64Gd64KY66m0KOyLpO2MqO2VtOuPhCkgcmVzb2x2Ze2VnOuLpC5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyQ29ubmVjdGlvbjxcbiAgICBUT3V0U2NoZW1hIGV4dGVuZHMgV2ViU29ja2V0RXZlbnRGaWVsZHMsXG4gICAgVEluU2NoZW1hIGV4dGVuZHMgV2ViU29ja2V0RXZlbnRGaWVsZHMsXG4gID4oXG4gICAgc29ja2V0OiBXZWJTb2NrZXRUcmFuc3BvcnQsXG4gICAgb3B0aW9uczogT21pdDxcbiAgICAgIFdlYlNvY2tldENvbm5lY3Rpb25PcHRpb25zPFRPdXRTY2hlbWEsIFRJblNjaGVtYT4sXG4gICAgICBcInJlZ2lzdHJ5XCIgfCBcInRlbGVtZXRyeUNvbnRyb2xsZXJcIlxuICAgID4sXG4gICk6IFByb21pc2U8XG4gICAgV2ViU29ja2V0Q29ubmVjdGlvbjxJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRPdXRTY2hlbWE+LCBJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRJblNjaGVtYT4+XG4gID4ge1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBuZXcgV2ViU29ja2V0Q29ubmVjdGlvbkltcGwoc29ja2V0LCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgcmVnaXN0cnk6IHRoaXMucmVnaXN0cnksXG4gICAgICB0ZWxlbWV0cnlDb250cm9sbGVyOiB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIsXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5yZWdpc3RyeS5yZWdpc3Rlcihjb25uZWN0aW9uLCBvcHRpb25zLmFjdGl2ZSA/PyB0cnVlKTtcbiAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgfVxuXG4gIGFjdGl2YXRlQ29ubmVjdGlvbihjb25uZWN0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmFjdGl2YXRlKGNvbm5lY3Rpb25JZCk7XG4gIH1cblxuICBicm9hZGNhc3Q8RGF0YT4oZXZlbnQ6IHN0cmluZywgZGF0YTogRGF0YSwgbmFtZXNwYWNlPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuYnJvYWRjYXN0KGV2ZW50LCBkYXRhLCBuYW1lc3BhY2UpO1xuICB9XG5cbiAgcHVibGlzaFRvUm9vbTxEYXRhPihcbiAgICByb29tSWQ6IFdlYlNvY2tldFJvb21JZCxcbiAgICBldmVudDogc3RyaW5nLFxuICAgIGRhdGE6IERhdGEsXG4gICAgbmFtZXNwYWNlPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5wdWJsaXNoVG9Sb29tKHJvb21JZCwgZXZlbnQsIGRhdGEsIG5hbWVzcGFjZSk7XG4gIH1cblxuICBwdWJsaXNoVG9Vc2VyPERhdGE+KFxuICAgIHVzZXJJZDogV2ViU29ja2V0VXNlcklkLFxuICAgIGV2ZW50OiBzdHJpbmcsXG4gICAgZGF0YTogRGF0YSxcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LnB1Ymxpc2hUb1VzZXIodXNlcklkLCBldmVudCwgZGF0YSwgbmFtZXNwYWNlKTtcbiAgfVxuXG4gIHB1Ymxpc2hUb0F1ZGllbmNlPERhdGE+KGF1ZGllbmNlOiBXZWJTb2NrZXRBdWRpZW5jZSwgZXZlbnQ6IHN0cmluZywgZGF0YTogRGF0YSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LnB1Ymxpc2hUb0F1ZGllbmNlKGF1ZGllbmNlLCBldmVudCwgZGF0YSk7XG4gIH1cblxuICAvLyDtlITroZzshLjsiqQg7KKF66OMIOyLnCDsgrTslYTsnojripQg7Jew6rKw7J20IOuCqOyngCDslYrrj4TroZ0gcmVnaXN0cnnrpbwg7Iic7ZqM7ZW0IOydvOq0hCDsooXro4ztlahcbiAgYXN5bmMgc2h1dGRvd24oXG4gICAgY29kZTogbnVtYmVyID0gV1NfQ0xPU0VfQ09ERV9HT0lOR19BV0FZLFxuICAgIHJlYXNvbiA9IFwiU2VydmVyIHNodXR0aW5nIGRvd25cIixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZWdpc3RyeS5zaHV0ZG93bihjb2RlLCByZWFzb24pO1xuICAgIGF3YWl0IHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5zaHV0ZG93bigpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJTb2NrZXRSdW50aW1lKG9wdGlvbnM6IFdlYlNvY2tldFJ1bnRpbWVPcHRpb25zID0ge30pOiBXZWJTb2NrZXRSdW50aW1lIHtcbiAgcmV0dXJuIG5ldyBXZWJTb2NrZXRSdW50aW1lKG9wdGlvbnMpO1xufVxuXG5jbGFzcyBXZWJTb2NrZXRDb25uZWN0aW9uSW1wbDxcbiAgVE91dFNjaGVtYSBleHRlbmRzIFdlYlNvY2tldEV2ZW50RmllbGRzLFxuICBUSW5TY2hlbWEgZXh0ZW5kcyBXZWJTb2NrZXRFdmVudEZpZWxkcyxcbj5cbiAgaW1wbGVtZW50c1xuICAgIFdlYlNvY2tldENvbm5lY3Rpb248SW5mZXJXZWJTb2NrZXRFdmVudE1hcDxUT3V0U2NoZW1hPiwgSW5mZXJXZWJTb2NrZXRFdmVudE1hcDxUSW5TY2hlbWE+PixcbiAgICBXZWJTb2NrZXRGcmFtZUNvbm5lY3Rpb24sXG4gICAgVGVsZW1ldHJ5SW5zcGVjdGFibGVDb25uZWN0aW9uLFxuICAgIFRlbGVtZXRyeUNvbnRleHRQcm92aWRlclxue1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSB0cmFuc3BvcnQgPSBcIndzXCI7XG4gIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nO1xuICByZWFkb25seSByb3V0ZUtleT86IHN0cmluZztcbiAgcmVhZG9ubHkgb3V0RXZlbnRzOiB6LlpvZE9iamVjdDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNsb3NlQ2FsbGJhY2tzOiBDbG9zZUhhbmRsZXJbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VIYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTxNZXNzYWdlSGFuZGxlcjx1bmtub3duPj4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ01lc3NhZ2VzOiBQYXJzZWRFbnZlbG9wZVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ091dGJvdW5kTWVzc2FnZXM6IEFycmF5PHsgcGF5bG9hZDogc3RyaW5nOyBldmVudDogc3RyaW5nIH0+ID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xvc2VQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVDbG9zZVByb21pc2U6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGVhcnRiZWF0TXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudFNjaGVtYXNJbjogUmVjb3JkPHN0cmluZywgei5ab2RUeXBlQW55PjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpb25UcmFjZUlkPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpb25TcGFuSWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGlvblBhcmVudFNwYW5JZD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0aW9uU2FtcGxlZD86IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGlvblN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gIC8vIGNvbm5lY3Rpb24g7IiY66qFIOuPmeyViCDsnKDsp4DrkJjripQg7Iud67OE7J6QLiBzZXRVc2VySWQvY2xlYXJVc2VySWTroZwg7JeF642w7J207Yq465CY66mwIGVtaXQgaG90IHBhdGjsl5DshJwg66ek67KIIHJlZ2lzdHJ5IGxvb2t1cO2VmOyngCDslYrrj4TroZ0g7LqQ7Iuc7ZWoXG4gIHByaXZhdGUgY3VycmVudFVzZXJJZD86IHN0cmluZztcblxuICBnZXQgdXNlcklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFVzZXJJZDtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VkSW50ZXJuYWwgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjbG9zZVN0YXJ0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhd2FpdGluZ1BvbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBoZWFydGJlYXRUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWVzc2FnZVF1ZXVlOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHByaXZhdGUgb3V0Ym91bmRGbHVzaFNjaGVkdWxlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc29ja2V0OiBXZWJTb2NrZXRUcmFuc3BvcnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBXZWJTb2NrZXRDb25uZWN0aW9uT3B0aW9uczxUT3V0U2NoZW1hLCBUSW5TY2hlbWE+LFxuICApIHtcbiAgICB0aGlzLmlkID0gY3JlYXRlV2ViU29ja2V0U2Vzc2lvbklkKG9wdGlvbnMucmVnaXN0cnkubm9kZUlkKTtcbiAgICB0aGlzLnJvdXRlS2V5ID0gb3B0aW9ucy5yb3V0ZUtleTtcbiAgICB0aGlzLm91dEV2ZW50cyA9IG9wdGlvbnMub3V0RXZlbnRzO1xuICAgIHRoaXMubmFtZXNwYWNlID0gb3B0aW9ucy5uYW1lc3BhY2UgPz8gXCJkZWZhdWx0XCI7XG4gICAgdGhpcy5oZWFydGJlYXRNcyA9IG9wdGlvbnMuaGVhcnRiZWF0ID8/IDMwMDAwO1xuICAgIHRoaXMuY29ubmVjdGlvblRyYWNlSWQgPSBvcHRpb25zLnRyYWNlSWQ7XG4gICAgdGhpcy5jb25uZWN0aW9uU3BhbklkID0gb3B0aW9ucy5zcGFuSWQ7XG4gICAgdGhpcy5jb25uZWN0aW9uUGFyZW50U3BhbklkID0gb3B0aW9ucy5wYXJlbnRTcGFuSWQ7XG4gICAgdGhpcy5jb25uZWN0aW9uU2FtcGxlZCA9IG9wdGlvbnMuc2FtcGxlZDtcbiAgICB0aGlzLmV2ZW50U2NoZW1hc0luID0gb3B0aW9ucy5pbkV2ZW50c1tcInNoYXBlXCJdO1xuXG4gICAgbGV0IHJlc29sdmVDbG9zZVByb21pc2UhOiAoKSA9PiB2b2lkO1xuICAgIHRoaXMuY2xvc2VQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIHJlc29sdmVDbG9zZVByb21pc2UgPSByZXNvbHZlO1xuICAgIH0pO1xuICAgIHRoaXMucmVzb2x2ZUNsb3NlUHJvbWlzZSA9IHJlc29sdmVDbG9zZVByb21pc2U7XG5cbiAgICAvLyDrpqzsiqTrhIjrpbwg64+Z6riw66GcIOu2meyXrCByZWdpc3RyeSDrk7HroZ3snbQg64Gd64KY6riwIOyghOyXkCDri6vtmIDrj4QgY2xvc2Xrpbwg64aT7LmY7KeAIOyViuuKlOuLpC4g65Ox66Gd7J2AIHJ1bnRpbWXsnbQg7J207Ja07IScIOyImO2Wie2VnOuLpFxuICAgIHRoaXMuc29ja2V0Lm9uKFwibWVzc2FnZVwiLCB0aGlzLmhhbmRsZU1lc3NhZ2UpO1xuICAgIHRoaXMuc29ja2V0Lm9uKFwiY2xvc2VcIiwgdGhpcy5oYW5kbGVDbG9zZSk7XG4gICAgdGhpcy5zb2NrZXQub24oXCJlcnJvclwiLCB0aGlzLmhhbmRsZUVycm9yKTtcbiAgICB0aGlzLnNvY2tldC5vbihcInBvbmdcIiwgdGhpcy5oYW5kbGVQb25nKTtcbiAgICB0aGlzLnN0YXJ0SGVhcnRiZWF0KCk7XG4gIH1cblxuICBnZXQgY2xvc2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNsb3NlZEludGVybmFsO1xuICB9XG5cbiAgb25DbG9zZShjYWxsYmFjazogQ2xvc2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgfVxuXG4gIG9uTWVzc2FnZTxLIGV4dGVuZHMga2V5b2YgSW5mZXJXZWJTb2NrZXRFdmVudE1hcDxUSW5TY2hlbWE+PihcbiAgICBldmVudDogSyxcbiAgICBoYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjxJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRJblNjaGVtYT5bS10+LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBldmVudEtleSA9IFN0cmluZyhldmVudCk7XG4gICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVycy5nZXQoZXZlbnRLZXkpID8/IFtdO1xuICAgIGhhbmRsZXJzLnB1c2goXG4gICAgICAvKiBTQUZFVFk6IOuTseuhneuQnCBXZWJTb2NrZXQg7J2067Kk7Yq4IOyKpO2CpOuniOqwgCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIGhhbmRsZXIgYXMgTWVzc2FnZUhhbmRsZXI8dW5rbm93bj4sXG4gICAgKTtcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycy5zZXQoZXZlbnRLZXksIGhhbmRsZXJzKTtcbiAgICB0aGlzLmZsdXNoUGVuZGluZ01lc3NhZ2VzKGV2ZW50S2V5KTtcbiAgfVxuXG4gIHB1Ymxpc2g8SyBleHRlbmRzIGtleW9mIEluZmVyV2ViU29ja2V0RXZlbnRNYXA8VE91dFNjaGVtYT4+KFxuICAgIGV2ZW50OiBLLFxuICAgIGRhdGE6IEluZmVyV2ViU29ja2V0RXZlbnRNYXA8VE91dFNjaGVtYT5bS10sXG4gICk6IHZvaWQge1xuICAgIHRoaXMucHVibGlzaFZhbGlkYXRlZChTdHJpbmcoZXZlbnQpLCBkYXRhKTtcbiAgfVxuXG4gIHB1Ymxpc2hVbnR5cGVkPERhdGE+KGV2ZW50OiBzdHJpbmcsIGRhdGE6IERhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnB1Ymxpc2hWYWxpZGF0ZWQoZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgd2FpdEZvckNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsb3NlUHJvbWlzZTtcbiAgfVxuXG4gIGpvaW4ocm9vbUlkOiBXZWJTb2NrZXRSb29tSWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnJlZ2lzdHJ5LmpvaW4odGhpcy5pZCwgcm9vbUlkKTtcbiAgfVxuXG4gIGxlYXZlKHJvb21JZDogV2ViU29ja2V0Um9vbUlkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5yZWdpc3RyeS5sZWF2ZSh0aGlzLmlkLCByb29tSWQpO1xuICB9XG5cbiAgc2V0VXNlcklkKHVzZXJJZDogV2ViU29ja2V0VXNlcklkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jdXJyZW50VXNlcklkID0gU3RyaW5nKHVzZXJJZCk7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5yZWdpc3RyeS5zZXRVc2VySWQodGhpcy5pZCwgdXNlcklkKTtcbiAgfVxuXG4gIGNsZWFyVXNlcklkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY3VycmVudFVzZXJJZCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnJlZ2lzdHJ5LmNsZWFyVXNlcklkKHRoaXMuaWQpO1xuICB9XG5cbiAgLy8gcmVnaXN0cnkgZmFuLW91dOydtCDsnbTrr7gg6rKA7KadwrfsnbjsvZTrlKntlZwgZnJhbWXsnYQg6re464yA66GcIOuztOuCuOuLpFxuICBzZW5kRnJhbWUoZXZlbnQ6IHN0cmluZywgZnJhbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsIHx8IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IFdTX09QRU4pIHtcbiAgICAgIHRoaXMuZW1pdFB1Ymxpc2hEcm9wcGVkKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVucXVldWVPdXRib3VuZE1lc3NhZ2UoZnJhbWUsIGV2ZW50KTtcbiAgfVxuXG4gIGdldFRlbGVtZXRyeVNuYXBzaG90KCk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25TbmFwc2hvdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlbmRpbmdJbmJvdW5kTWVzc2FnZXM6IHRoaXMucGVuZGluZ01lc3NhZ2VzLmxlbmd0aCxcbiAgICAgIHBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzOiB0aGlzLnBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzLmxlbmd0aCxcbiAgICAgIHNvY2tldEJ1ZmZlcmVkQnl0ZXM6IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IFdTX09QRU4gPyB0aGlzLnNvY2tldC5idWZmZXJlZEFtb3VudCA6IDAsXG4gICAgfTtcbiAgfVxuXG4gIGdldFRlbGVtZXRyeUNvbnRleHQoKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICB0cmFjZUlkOiB0aGlzLmNvbm5lY3Rpb25UcmFjZUlkLFxuICAgICAgc3BhbklkOiB0aGlzLmNvbm5lY3Rpb25TcGFuSWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IHRoaXMuY29ubmVjdGlvblBhcmVudFNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IHRoaXMuY29ubmVjdGlvblNhbXBsZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8vIOuqqOuToCB0ZWxlbWV0cnkgZW1pdCBzaXRl6rCAIOqzteycoO2VmOuKlCBjb25uZWN0aW9uLWxldmVsIGZpZWxkIOustuydjC5cbiAgLy8g7Zal7ZuEIGNvbm5lY3Rpb24tc2NvcGVkIOyLneuzhOyekChlLmcuIHRlbmFudElkKeqwgCDstpTqsIDrkKAg65WMIO2VnCDqs7Prp4wg7IaQ64yA66m0IOuQqFxuICBwcml2YXRlIHRlbGVtZXRyeUZpZWxkcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29ubmVjdGlvbklkOiB0aGlzLmlkLFxuICAgICAgbmFtZXNwYWNlOiB0aGlzLm5hbWVzcGFjZSxcbiAgICAgIHVzZXJJZDogdGhpcy5jdXJyZW50VXNlcklkLFxuICAgICAgdHJhY2VJZDogdGhpcy5jb25uZWN0aW9uVHJhY2VJZCxcbiAgICAgIHNwYW5JZDogdGhpcy5jb25uZWN0aW9uU3BhbklkLFxuICAgICAgcGFyZW50U3BhbklkOiB0aGlzLmNvbm5lY3Rpb25QYXJlbnRTcGFuSWQsXG4gICAgICBzYW1wbGVkOiB0aGlzLmNvbm5lY3Rpb25TYW1wbGVkLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGVtaXRJbmJvdW5kUmVqZWN0ZWQocmVhc29uOiBzdHJpbmcsIGV2ZW50Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy50ZWxlbWV0cnlGaWVsZHMoKTtcbiAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MubWVzc2FnZS5yZWplY3RlZFwiLFxuICAgICAgbGV2ZWw6IFwid2FyblwiLFxuICAgICAgLi4uZmllbGRzLFxuICAgICAgZGV0YWlsOiBldmVudCAhPT0gdW5kZWZpbmVkID8geyByZWFzb24sIGV2ZW50IH0gOiB7IHJlYXNvbiB9LFxuICAgIH0pO1xuICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLnJlY29yZE1ldHJpYyh7XG4gICAgICBuYW1lOiBcInNvbmFtdS53cy5tZXNzYWdlc1wiLFxuICAgICAga2luZDogXCJjb3VudGVyXCIsXG4gICAgICB2YWx1ZTogMSxcbiAgICAgIHVuaXQ6IFwiMVwiLFxuICAgICAgdGFnczogeyBkaXJlY3Rpb246IFwiaW5ib3VuZFwiLCBvdXRjb21lOiBcInJlamVjdGVkXCIgfSxcbiAgICAgIC4uLmZpZWxkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHRyYW5zcG9ydCDsooXro4wg64+E7KSRIOyYiOyZuOqwgCDrgpjrj4QgbWFya0Nsb3NlZOqwgCDrsJjrk5zsi5wg7Iuk7ZaJ65CY64+E66GdIHRyeS9maW5hbGx566GcIOqwkOyMiFxuICBjbG9zZShjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZWRJbnRlcm5hbCB8fCB0aGlzLmNsb3NlU3RhcnRlZCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSBXU19DTE9TRUQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNsb3NlU3RhcnRlZCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY2xvc2VUcmFuc3BvcnQoY29kZSwgcmVhc29uKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5tYXJrQ2xvc2VkKGNvZGUsIHJlYXNvbik7XG4gICAgfVxuICB9XG5cbiAgLy8g7J2467CU7Jq065OcIOuplOyLnOyngOulvCDsiJzssKgg7LKY66asIO2BkOyXkCDsmKzrprwuIFNvbmFtdSBlbnZlbG9wZSDqsoDspp0g7IiY7ZaJXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlTWVzc2FnZSA9IChyYXc6IFJhd0RhdGEpID0+IHtcbiAgICB0aGlzLmVucXVldWVNZXNzYWdlVGFzayhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gbm9ybWFsaXplTWVzc2FnZShyYXcpO1xuICAgICAgY29uc3QgcGFyc2VkRW52ZWxvcGUgPSBzYWZlUGFyc2VFbnZlbG9wZSh0ZXh0KTtcbiAgICAgIGlmICghcGFyc2VkRW52ZWxvcGUpIHtcbiAgICAgICAgdGhpcy5lbWl0SW5ib3VuZFJlamVjdGVkKFwiaW52YWxpZFBheWxvYWRcIik7XG4gICAgICAgIHRoaXMuY2xvc2UoV1NfQ0xPU0VfQ09ERV9JTlZBTElEX0ZSQU1FX1BBWUxPQURfREFUQSwgXCJJbnZhbGlkIG1lc3NhZ2UgcGF5bG9hZFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5tZXNzYWdlLnJlY2VpdmVkXCIsXG4gICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBldmVudDogcGFyc2VkRW52ZWxvcGUuZXZlbnQgfSxcbiAgICAgICAgcGF5bG9hZDogcGFyc2VkRW52ZWxvcGUuZGF0YSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vcHRpb25zLnJlZ2lzdHJ5LnRvdWNoKHRoaXMuaWQpO1xuICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaEVudmVsb3BlKHBhcnNlZEVudmVsb3BlKTtcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZUNsb3NlID0gKGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IEJ1ZmZlciB8IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJlYXNvblRleHQgPSBpc1N0cmluZ1ZhbHVlKHJlYXNvbikgPyByZWFzb24gOiByZWFzb24/LnRvU3RyaW5nKCk7XG4gICAgdGhpcy5tYXJrQ2xvc2VkKGNvZGUsIHJlYXNvblRleHQpO1xuICB9O1xuXG4gIC8vIOyGjOy8k+ydtCB0cmFuc3BvcnQgZXJyb3LrpbwgZW1pdO2VmOuptCDsponsi5wgMTAxMSBjbG9zZeuhnCDsiJjroLTsi5zsvJwg7IOB7YOcIOuIhOudveydhCDrp4nsnYxcbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVFcnJvciA9ICgpID0+IHtcbiAgICB0aGlzLmNsb3NlKFdTX0NMT1NFX0NPREVfSU5URVJOQUxfRVJST1IsIFwiV2ViU29ja2V0IHRyYW5zcG9ydCBlcnJvclwiKTtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZVBvbmcgPSAoKSA9PiB7XG4gICAgdGhpcy5hd2FpdGluZ1BvbmcgPSBmYWxzZTtcbiAgICB0aGlzLm9wdGlvbnMucmVnaXN0cnkudG91Y2godGhpcy5pZCk7XG4gIH07XG5cbiAgLy8gZW52ZWxvcGXsnZggbWV0YS50cmFjZXBhcmVudOuhnOu2gO2EsCB0cmFjZSBjb250ZXh066W8IOy2lOy2nO2VqFxuICAvLyBpbnZhbGlkIHRyYWNlcGFyZW5064qUIOyXsOqysOydhCDqsbDrtoDtlZjsp4Ag7JWK6rOgIGRlYnVnIOugiOuyqCDqsr3qs6Drp4wgZW1pdO2VqFxuICBwcml2YXRlIHJlc29sdmVNZXNzYWdlVHJhY2VDb250ZXh0KFxuICAgIGVudmVsb3BlOiBQYXJzZWRFbnZlbG9wZSxcbiAgKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQge1xuICAgIGNvbnN0IG1lc3NhZ2VTcGFuSWQgPSBnZW5lcmF0ZVNwYW5JZCgpO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZ2V0VHJhY2VPcHRpb25zKCkucHJvcGFnYXRlTWVzc2FnZVRyYWNlICYmXG4gICAgICBlbnZlbG9wZS5tZXRhPy50cmFjZXBhcmVudFxuICAgICkge1xuICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VUcmFjZVBhcmVudChlbnZlbG9wZS5tZXRhLnRyYWNlcGFyZW50KTtcbiAgICAgIGlmIChwYXJzZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0cmFjZUlkOiBwYXJzZWQudHJhY2VJZCxcbiAgICAgICAgICBzcGFuSWQ6IG1lc3NhZ2VTcGFuSWQsXG4gICAgICAgICAgcGFyZW50U3BhbklkOiBwYXJzZWQucGFyZW50SWQsXG4gICAgICAgICAgc2FtcGxlZDogcGFyc2VkLnNhbXBsZWQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBpbnZhbGlkIHRyYWNlcGFyZW50OiB3YXJuIGJ1dCBkbyBub3QgcmVqZWN0XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy50cmFjZS5pbnZhbGlkXCIsXG4gICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBzb3VyY2U6IFwibWVzc2FnZVwiLCB0cmFjZXBhcmVudDogZW52ZWxvcGUubWV0YS50cmFjZXBhcmVudCB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYWNlSWQ6IHRoaXMuY29ubmVjdGlvblRyYWNlSWQsXG4gICAgICBzcGFuSWQ6IG1lc3NhZ2VTcGFuSWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IHRoaXMuY29ubmVjdGlvblNwYW5JZCA/PyB0aGlzLmNvbm5lY3Rpb25QYXJlbnRTcGFuSWQsXG4gICAgICBzYW1wbGVkOiB0aGlzLmNvbm5lY3Rpb25TYW1wbGVkLFxuICAgIH07XG4gIH1cblxuICAvLyBldmVudCDsobTsnqwg7Jes67aAIOKGkiBzY2hlbWEg6rKA7KadIOKGkiBoYW5kbGVyIOyLpO2WiSDsiJzsnLzroZwg67aE6riw7ZWoXG4gIC8vIGhhbmRsZXLqsIAg7JWE7KeBIOuTseuhneuQmOyngCDslYrsnYAg7LSI6riwIOuplOyLnOyngOuKlCDrsoTtjbzsl5Ag67O06rSA7ZaI64uk6rCAIG9uTWVzc2FnZSDrk7HroZ0g7IucIGZsdXNo7ZWoXG4gIC8vIGhhbmRsZXLripQgYGF3YWl0YOycvOuhnCDsiJzssKgg7Iuk7ZaJ7ZW0IO2VnCBjb25uZWN0aW9uIOyViOydmCDrqZTsi5zsp4Ag7Iic7ISc66W8IOuztOyepe2VqFxuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoRW52ZWxvcGUoZW52ZWxvcGU6IFBhcnNlZEVudmVsb3BlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVycy5nZXQoZW52ZWxvcGUuZXZlbnQpO1xuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuZXZlbnRTY2hlbWFzSW5bZW52ZWxvcGUuZXZlbnRdO1xuXG4gICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgIHRoaXMuZW1pdEluYm91bmRSZWplY3RlZChcInVua25vd25FdmVudFwiLCBlbnZlbG9wZS5ldmVudCk7XG4gICAgICB0aGlzLmNsb3NlKFdTX0NMT1NFX0NPREVfUE9MSUNZX1ZJT0xBVElPTiwgXCJVbmtub3duIGV2ZW50XCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IHNjaGVtYS5zYWZlUGFyc2UoZW52ZWxvcGUuZGF0YSk7XG4gICAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgICAgdGhpcy5lbWl0SW5ib3VuZFJlamVjdGVkKFwiaW52YWxpZERhdGFcIiwgZW52ZWxvcGUuZXZlbnQpO1xuICAgICAgdGhpcy5jbG9zZShXU19DTE9TRV9DT0RFX0lOVkFMSURfRlJBTUVfUEFZTE9BRF9EQVRBLCBcIkludmFsaWQgZXZlbnQgZGF0YVwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWhhbmRsZXJzIHx8IGhhbmRsZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHRoaXMucGVuZGluZ01lc3NhZ2VzLmxlbmd0aCA+PSBNQVhfUEVORElOR19NRVNTQUdFUykge1xuICAgICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgICBuYW1lOiBcIndzLm1lc3NhZ2UuYnVmZmVyLmRyb3BwZWRcIixcbiAgICAgICAgICBsZXZlbDogXCJ3YXJuXCIsXG4gICAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgICAgICBkZXRhaWw6IHsgZXZlbnQ6IGVudmVsb3BlLmV2ZW50IH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBlbmRpbmdNZXNzYWdlcy5zaGlmdCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5wZW5kaW5nTWVzc2FnZXMucHVzaChlbnZlbG9wZSk7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5tZXNzYWdlLmJ1ZmZlcmVkXCIsXG4gICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBldmVudDogZW52ZWxvcGUuZXZlbnQgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNlQ3R4ID0gdGhpcy5yZXNvbHZlTWVzc2FnZVRyYWNlQ29udGV4dChlbnZlbG9wZSk7XG4gICAgLy8gbWVzc2FnZS1sZXZlbCB0cmFjZeuKlCBjb25uZWN0aW9uLWxldmVsIHRyYWNl66W8IG92ZXJyaWRl7ZWoLiB1c2VySWQgLyBjb25uZWN0aW9uSWQgLyBuYW1lc3BhY2XripQg6re464yA66GcIOycoOyngFxuICAgIGNvbnN0IG1lc3NhZ2VUcmFjZUZpZWxkcyA9IHtcbiAgICAgIGNvbm5lY3Rpb25JZDogdGhpcy5pZCxcbiAgICAgIG5hbWVzcGFjZTogdGhpcy5uYW1lc3BhY2UsXG4gICAgICB1c2VySWQ6IHRoaXMuY3VycmVudFVzZXJJZCxcbiAgICAgIHRyYWNlSWQ6IHRyYWNlQ3R4LnRyYWNlSWQsXG4gICAgICBzcGFuSWQ6IHRyYWNlQ3R4LnNwYW5JZCxcbiAgICAgIHBhcmVudFNwYW5JZDogdHJhY2VDdHgucGFyZW50U3BhbklkLFxuICAgICAgc2FtcGxlZDogdHJhY2VDdHguc2FtcGxlZCxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgYXdhaXQgaGFuZGxlcihwYXJzZWQuZGF0YSwgdHJhY2VDdHgpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICAgIG5hbWU6IFwid3MubWVzc2FnZS5kaXNwYXRjaGVkXCIsXG4gICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgIC4uLm1lc3NhZ2VUcmFjZUZpZWxkcyxcbiAgICAgICAgZGV0YWlsOiB7IGV2ZW50OiBlbnZlbG9wZS5ldmVudCB9LFxuICAgICAgfSk7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5yZWNvcmRNZXRyaWMoe1xuICAgICAgICBuYW1lOiBcInNvbmFtdS53cy5tZXNzYWdlc1wiLFxuICAgICAgICBraW5kOiBcImNvdW50ZXJcIixcbiAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgIHVuaXQ6IFwiMVwiLFxuICAgICAgICB0YWdzOiB7IGRpcmVjdGlvbjogXCJpbmJvdW5kXCIsIGV2ZW50OiBlbnZlbG9wZS5ldmVudCwgb3V0Y29tZTogXCJhY2NlcHRlZFwiIH0sXG4gICAgICAgIC4uLm1lc3NhZ2VUcmFjZUZpZWxkcyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5tZXNzYWdlLmZhaWxlZFwiLFxuICAgICAgICBsZXZlbDogXCJlcnJvclwiLFxuICAgICAgICAuLi5tZXNzYWdlVHJhY2VGaWVsZHMsXG4gICAgICAgIGRldGFpbDogeyBldmVudDogZW52ZWxvcGUuZXZlbnQgfSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmbHVzaFBlbmRpbmdNZXNzYWdlcyhldmVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcmVtYWluaW5nOiBQYXJzZWRFbnZlbG9wZVtdID0gW107XG4gICAgY29uc3QgdG9GbHVzaDogUGFyc2VkRW52ZWxvcGVbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHRoaXMucGVuZGluZ01lc3NhZ2VzKSB7XG4gICAgICBpZiAobWVzc2FnZS5ldmVudCAhPT0gZXZlbnQpIHtcbiAgICAgICAgcmVtYWluaW5nLnB1c2gobWVzc2FnZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0b0ZsdXNoLnB1c2gobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nTWVzc2FnZXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLnBlbmRpbmdNZXNzYWdlcy5wdXNoKC4uLnJlbWFpbmluZyk7XG5cbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgdG9GbHVzaCkge1xuICAgICAgdGhpcy5lbnF1ZXVlTWVzc2FnZVRhc2soYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoRW52ZWxvcGUobWVzc2FnZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHB1Ymxpc2hWYWxpZGF0ZWQ8RGF0YT4oZXZlbnQ6IHN0cmluZywgZGF0YTogRGF0YSk6IHZvaWQge1xuICAgIGNvbnN0IGVuY29kaW5nID0gZW5jb2RlV2ViU29ja2V0RnJhbWUodGhpcy5vdXRFdmVudHMsIGV2ZW50LCBkYXRhKTtcbiAgICBpZiAoZW5jb2Rpbmcuc3RhdHVzID09PSBcInVua25vd25FdmVudFwiKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5wdWJsaXNoLnJlamVjdGVkXCIsXG4gICAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBldmVudCwgcmVhc29uOiBcInVua25vd25FdmVudFwiIH0sXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB3ZWJzb2NrZXQgZXZlbnQ6ICR7ZXZlbnR9YCk7XG4gICAgfVxuXG4gICAgaWYgKGVuY29kaW5nLnN0YXR1cyA9PT0gXCJpbnZhbGlkUGF5bG9hZFwiKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5wdWJsaXNoLnJlamVjdGVkXCIsXG4gICAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBldmVudCwgcmVhc29uOiBcImludmFsaWRQYXlsb2FkXCIgfSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHdlYnNvY2tldCBldmVudCBwYXlsb2FkOiAke2V2ZW50fWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsIHx8IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IFdTX09QRU4pIHtcbiAgICAgIHRoaXMuZW1pdFB1Ymxpc2hEcm9wcGVkKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVucXVldWVPdXRib3VuZE1lc3NhZ2UoZW5jb2RpbmcuZnJhbWUsIGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFB1Ymxpc2hEcm9wcGVkKGV2ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MucHVibGlzaC5kcm9wcGVkXCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgIGRldGFpbDogeyBldmVudCwgcmVhc29uOiBcImNvbm5lY3Rpb25DbG9zZWRcIiB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gbGlzdGVuZXIg7ZW07KCcIC8gaGVhcnRiZWF0IOykkeuLqCAvIHBlbmRpbmcgcXVldWUg67mE7JuAIC8gcmVnaXN0cnkgdW5yZWdpc3RlciAvIG9uQ2xvc2Ug7Iuk7ZaJIC8gd2FpdEZvckNsb3NlIHJlc29sdmUg7J2EIO2VnCDqs7Psl5Ag66qo7JWEIOybkOyekOyggeycvOuhnCDsspjrpqztlahcbiAgLy8gYXN5bmMgb25DbG9zZeqwgCByZWplY3TtlbTrj4QgdW5oYW5kbGVkIHJlamVjdGlvbuycvOuhnCDsg4jsp4Ag7JWK64+E66GdIGNhdGNo66GcIOqyqeumrO2VqFxuICBwcml2YXRlIG1hcmtDbG9zZWQoY29kZT86IG51bWJlciwgX3JlYXNvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZWRJbnRlcm5hbCA9IHRydWU7XG4gICAgdGhpcy5jbG9zZVN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnN0b3BIZWFydGJlYXQoKTtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnRlbGVtZXRyeUZpZWxkcygpO1xuICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLmNsb3NlZFwiLFxuICAgICAgbGV2ZWw6IFwiaW5mb1wiLFxuICAgICAgLi4uZmllbGRzLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5nZXRUcmFjZU9wdGlvbnMoKS5yZWNvcmRDb25uZWN0aW9uTGlmZXRpbWVTcGFuKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5yZWNvcmRTcGFuKHtcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ3cy5jb25uZWN0aW9uLmxpZmV0aW1lXCIsXG4gICAgICAgIGtpbmQ6IFwic2VydmVyXCIsXG4gICAgICAgIGR1cmF0aW9uTXM6IHBlcmZvcm1hbmNlLm5vdygpIC0gdGhpcy5jb25uZWN0aW9uU3RhcnRlZEF0LFxuICAgICAgICBzdGF0dXM6IGRlcml2ZUxpZmV0aW1lU3RhdHVzKGNvZGUpLFxuICAgICAgICAuLi5maWVsZHMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zb2NrZXQub2ZmKFwibWVzc2FnZVwiLCB0aGlzLmhhbmRsZU1lc3NhZ2UpO1xuICAgIHRoaXMuc29ja2V0Lm9mZihcImNsb3NlXCIsIHRoaXMuaGFuZGxlQ2xvc2UpO1xuICAgIHRoaXMuc29ja2V0Lm9mZihcImVycm9yXCIsIHRoaXMuaGFuZGxlRXJyb3IpO1xuICAgIHRoaXMuc29ja2V0Lm9mZihcInBvbmdcIiwgdGhpcy5oYW5kbGVQb25nKTtcbiAgICB0aGlzLmF3YWl0aW5nUG9uZyA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ01lc3NhZ2VzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5sZW5ndGggPSAwO1xuICAgIHRoaXMub3B0aW9ucy5yZWdpc3RyeS51bnJlZ2lzdGVyKHRoaXMuaWQpO1xuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jbG9zZUNhbGxiYWNrcy5zcGxpY2UoMCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbGxiYWNrKCk7XG4gICAgICAgIGlmIChpc1Byb21pc2VMaWtlKHJlc3VsdCkpIHtcbiAgICAgICAgICB2b2lkIHJlc3VsdC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAvLyBhc3luYyBjbG9zZSBjYWxsYmFja3MgbXVzdCBub3QgZXNjYXBlIGFzIHVuaGFuZGxlZCByZWplY3Rpb25zXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBjbG9zZSBjYWxsYmFja3MgbXVzdCBub3QgYmxvY2sgdHJhbnNwb3J0IGNsZWFudXBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZXNvbHZlQ2xvc2VQcm9taXNlKCk7XG4gIH1cblxuICAvLyBwb25n7J20IOyYpOyngCDslYrsnYAg7IOB7YOc7JeQ7IScIOuLpOydjCB0aWNr7J20IOyYpOuptCB0aW1lb3V0IGNsb3Nl66GcIOyymOumrO2VtCB6b21iaWUgY29ubmVjdGlvbuydhCDsoJXrpqztlahcbiAgcHJpdmF0ZSBzdGFydEhlYXJ0YmVhdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oZWFydGJlYXRNcyA8PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsIHx8IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IFdTX09QRU4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hd2FpdGluZ1BvbmcpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICAgICAgbmFtZTogXCJ3cy5oZWFydGJlYXQudGltZW91dFwiLFxuICAgICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgICAuLi50aGlzLnRlbGVtZXRyeUZpZWxkcygpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jbG9zZShXU19DTE9TRV9DT0RFX0dPSU5HX0FXQVksIFwiSGVhcnRiZWF0IHRpbWVvdXRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hd2FpdGluZ1BvbmcgPSB0cnVlO1xuICAgICAgdGhpcy5zb2NrZXQucGluZygpO1xuICAgIH0sIHRoaXMuaGVhcnRiZWF0TXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wSGVhcnRiZWF0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oZWFydGJlYXRUaW1lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydGJlYXRUaW1lcik7XG4gICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IG51bGw7XG4gIH1cblxuICAvLyBjbG9zZeqwgCDsi6TtjKjtlbTrj4QgdGVybWluYXRlIO2PtOuwseq5jOyngCDsi5zrj4TtlZjqs6AsIOuBneuCtCDsi6TtjKjtlZjrqbQgbWFya0Nsb3NlZOyXkCDsg4Htg5wg7KCV66as66W8IOychOyehO2VqFxuICBwcml2YXRlIGNsb3NlVHJhbnNwb3J0KGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gV1NfT1BFTiB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSBXU19DT05ORUNUSU5HKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKGNvZGUsIHRydW5jYXRlQ2xvc2VSZWFzb24ocmVhc29uKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXQudGVybWluYXRlKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyB0cmFuc3BvcnQgaXMgYWxyZWFkeSBicm9rZW47IHN0YXRlIGNsZWFudXAgaXMgaGFuZGxlZCBieSBtYXJrQ2xvc2VkKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyDsnbjrsJTsmrTrk5wgaGFuZGxlcuulvCBwcm9taXNlIGNoYWlu7Jy866GcIHNlcmlhbGl6ZSDtlZjqs6AsIGhhbmRsZXIg7JiI7Jm464qUIGNvbm5lY3Rpb24tbG9jYWwgMTAxMSBjbG9zZeuhnCDstpXshoztlahcbiAgcHJpdmF0ZSBlbnF1ZXVlTWVzc2FnZVRhc2sodGFzazogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gdGhpcy5tZXNzYWdlUXVldWVcbiAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkSW50ZXJuYWwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0YXNrKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZShXU19DTE9TRV9DT0RFX0lOVEVSTkFMX0VSUk9SLCBcIk1lc3NhZ2UgaGFuZGxpbmcgZmFpbGVkXCIpO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBxdWV1ZeqwgCDtlZzqs4Tsl5Ag64+E64us7ZWY66m0IDEwMTPsnLzroZwg64ur7JWEIOuKkOumsCDshozruYTsnpDqsIAg66mU66qo66as66W8IOuBneyXhuydtCDsnqHslYTrqLnsp4Ag66q77ZWY6rKMIO2VqFxuICAvLyB0ZWxlbWV0cnkgcHJldmlld+uKlCDsp4HroKztmZTrkJwgcGF5bG9hZOyXkOyEnCDrs7Xsm5DtlbQg7KCE7IahIOuNsOydtO2EsOyZgCDqsJnsnYAgSlNPTiDqs4Tslb3snYQg7Jyg7KeA7ZWoXG4gIHByaXZhdGUgZW5xdWV1ZU91dGJvdW5kTWVzc2FnZShwYXlsb2FkOiBzdHJpbmcsIGV2ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5sZW5ndGggPj0gTUFYX1BFTkRJTkdfT1VUQk9VTkRfTUVTU0FHRVMpIHtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLmJhY2twcmVzc3VyZS5vdmVyZmxvd1wiLFxuICAgICAgICBsZXZlbDogXCJlcnJvclwiLFxuICAgICAgICAuLi50aGlzLnRlbGVtZXRyeUZpZWxkcygpLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmNsb3NlKFdTX0NMT1NFX0NPREVfVFJZX0FHQUlOX0xBVEVSLCBcIldlYlNvY2tldCBiYWNrcHJlc3N1cmUgb3ZlcmZsb3dcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5wdXNoKHsgcGF5bG9hZCwgZXZlbnQgfSk7XG4gICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICBuYW1lOiBcIndzLnB1Ymxpc2gucXVldWVkXCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgIGRldGFpbDogeyBldmVudCB9LFxuICAgICAgcGF5bG9hZDogc2FmZVBhcnNlRW52ZWxvcGUocGF5bG9hZCk/LmRhdGEsXG4gICAgfSk7XG4gICAgdGhpcy5zY2hlZHVsZU91dGJvdW5kRmx1c2goKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVPdXRib3VuZEZsdXNoKGRlbGF5TXM6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vdXRib3VuZEZsdXNoU2NoZWR1bGVkIHx8IHRoaXMuY2xvc2VkSW50ZXJuYWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm91dGJvdW5kRmx1c2hTY2hlZHVsZWQgPSB0cnVlO1xuICAgIGNvbnN0IGZsdXNoID0gKCkgPT4ge1xuICAgICAgdGhpcy5vdXRib3VuZEZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmZsdXNoT3V0Ym91bmRNZXNzYWdlcygpO1xuICAgIH07XG5cbiAgICBpZiAoZGVsYXlNcyA+IDApIHtcbiAgICAgIHNldFRpbWVvdXQoZmx1c2gsIGRlbGF5TXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldEltbWVkaWF0ZShmbHVzaCk7XG4gIH1cblxuICAvLyBidWZmZXJlZEFtb3VudOqwgCDsnoTqs4TsuZjrpbwg64SY7Jy866m0IGZsdXNo66W8IOuvuOukhCBzb2NrZXQg64K067aAIO2BkOqwgCDthLDsp4Dsp4Ag7JWK64+E66GdIGJhY2twcmVzc3VyZeulvCDsobTspJHtlahcbiAgLy8g7ZWcIOuyiOyXkCDrsLDsuZgg64uo7JyE66Gc66eMIHNlbmTtlbQg64+Z6riwIOujqO2UhOqwgCDsnbTrsqTtirgg66Oo7ZSE66W8IOyepeyLnOqwhCDsoJDsnKDtlZjsp4Ag7JWK6rKMIO2VqFxuICBwcml2YXRlIGZsdXNoT3V0Ym91bmRNZXNzYWdlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZWRJbnRlcm5hbCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSBXU19PUEVOKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ja2V0LmJ1ZmZlcmVkQW1vdW50ID4gTUFYX1NPQ0tFVF9CVUZGRVJFRF9BTU9VTlQpIHtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLmJhY2twcmVzc3VyZS5kZWxheWVkXCIsXG4gICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zY2hlZHVsZU91dGJvdW5kRmx1c2goT1VUQk9VTkRfUkVUUllfREVMQVlfTVMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzZW50ID0gMDtcbiAgICB3aGlsZSAoXG4gICAgICBzZW50IDwgT1VUQk9VTkRfQkFUQ0hfU0laRSAmJlxuICAgICAgdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5sZW5ndGggPiAwICYmXG4gICAgICB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSBXU19PUEVOXG4gICAgKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5zaGlmdCgpO1xuICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBwYXlsb2FkLCBldmVudCB9ID0gbmV4dDtcblxuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnRlbGVtZXRyeUZpZWxkcygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChwYXlsb2FkKTtcbiAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0O1xuICAgICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgICBuYW1lOiBcIndzLnB1Ymxpc2guc2VudFwiLFxuICAgICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgICAgLi4uZmllbGRzLFxuICAgICAgICAgIGRldGFpbDogeyBldmVudCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkU3Bhbih7XG4gICAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ3cy5wdWJsaXNoLnNlbmRcIixcbiAgICAgICAgICBraW5kOiBcInByb2R1Y2VyXCIsXG4gICAgICAgICAgZHVyYXRpb25NcyxcbiAgICAgICAgICBzdGF0dXM6IFwidW5zZXRcIixcbiAgICAgICAgICAuLi5maWVsZHMsXG4gICAgICAgICAgYXR0cmlidXRlczogeyBldmVudCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkTWV0cmljKHtcbiAgICAgICAgICBuYW1lOiBcInNvbmFtdS53cy5wdWJsaXNoZXNcIixcbiAgICAgICAgICBraW5kOiBcImNvdW50ZXJcIixcbiAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICB1bml0OiBcIjFcIixcbiAgICAgICAgICB0YWdzOiB7IG91dGNvbWU6IFwic2VudFwiLCBldmVudCB9LFxuICAgICAgICAgIC4uLmZpZWxkcyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQ7XG4gICAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICAgIG5hbWU6IFwid3MucHVibGlzaC5mYWlsZWRcIixcbiAgICAgICAgICBsZXZlbDogXCJlcnJvclwiLFxuICAgICAgICAgIC4uLmZpZWxkcyxcbiAgICAgICAgICBkZXRhaWw6IHsgZXZlbnQgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLnJlY29yZFNwYW4oe1xuICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IFwid3MucHVibGlzaC5zZW5kXCIsXG4gICAgICAgICAga2luZDogXCJwcm9kdWNlclwiLFxuICAgICAgICAgIGR1cmF0aW9uTXMsXG4gICAgICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICAgICAgLi4uZmllbGRzLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgZXZlbnQgfSxcbiAgICAgICAgICBlcnJvclR5cGU6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5uYW1lIDogcnVudGltZVR5cGVPZihlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNsb3NlKFdTX0NMT1NFX0NPREVfSU5URVJOQUxfRVJST1IsIFwiT3V0Ym91bmQgcHVibGlzaCBmYWlsZWRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2VudCArPSAxO1xuICAgICAgaWYgKHRoaXMuc29ja2V0LmJ1ZmZlcmVkQW1vdW50ID4gTUFYX1NPQ0tFVF9CVUZGRVJFRF9BTU9VTlQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVuZGluZ091dGJvdW5kTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zY2hlZHVsZU91dGJvdW5kRmx1c2goXG4gICAgICAgIHRoaXMuc29ja2V0LmJ1ZmZlcmVkQW1vdW50ID4gTUFYX1NPQ0tFVF9CVUZGRVJFRF9BTU9VTlQgPyBPVVRCT1VORF9SRVRSWV9ERUxBWV9NUyA6IDAsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVNZXNzYWdlKHJhdzogUmF3RGF0YSk6IHN0cmluZyB7XG4gIGlmIChpc1N0cmluZ1ZhbHVlKHJhdykpIHtcbiAgICByZXR1cm4gcmF3O1xuICB9XG5cbiAgaWYgKHJhdyBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgIHJldHVybiByYXcudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgfVxuXG4gIGlmIChyYXcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShyYXcpLnRvU3RyaW5nKFwidXRmLThcIik7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShyYXcpKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQocmF3LmZpbHRlcigoY2h1bmspOiBjaHVuayBpcyBCdWZmZXIgPT4gY2h1bmsgaW5zdGFuY2VvZiBCdWZmZXIpKS50b1N0cmluZyhcbiAgICAgIFwidXRmLThcIixcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJhdyk7XG59XG5cbmZ1bmN0aW9uIHNhZmVQYXJzZUVudmVsb3BlKHJhdzogc3RyaW5nKTogUGFyc2VkRW52ZWxvcGUgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPVxuICAgICAgLyogU0FGRVRZOiDrk7HroZ3rkJwgV2ViU29ja2V0IOydtOuypO2KuCDsiqTtgqTrp4jqsIAg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBKU09OLnBhcnNlKFxuICAgICAgICByYXcsXG4gICAgICApIGFzIHVua25vd247XG4gICAgY29uc3QgdmFsaWRhdGVkID0gV2ViU29ja2V0RW52ZWxvcGVTY2hlbWEuc2FmZVBhcnNlKHBhcnNlZCk7XG4gICAgcmV0dXJuIHZhbGlkYXRlZC5zdWNjZXNzID8gdmFsaWRhdGVkLmRhdGEgOiBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBSRkMgNjQ1NeqwgCBjbG9zZSBmcmFtZSByZWFzb27snYQgMTIzIGJ5dGXroZwg7KCc7ZWc7ZWY66+A66GcIOy0iOqzvOu2hOydgCDsnpjrnbwg7KCE7IahIOyLpO2MqOulvCDrsKnsp4DtlahcbmZ1bmN0aW9uIHRydW5jYXRlQ2xvc2VSZWFzb24ocmVhc29uPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyZWFzb24pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIEJ1ZmZlci5ieXRlTGVuZ3RoKHJlYXNvbiwgXCJ1dGYtOFwiKSA8PSAxMjNcbiAgICA/IHJlYXNvblxuICAgIDogQnVmZmVyLmZyb20ocmVhc29uKS5zdWJhcnJheSgwLCAxMjMpLnRvU3RyaW5nKFwidXRmLThcIik7XG59XG5cbi8vIGNvbm5lY3Rpb24gbGlmZXRpbWUgc3BhbuydmCBzdGF0dXPrpbwgY2xvc2UgY29kZSDquLDspIDsnLzroZwg67aE6riw7ZWoICgxMDAwLzEwMDEg7KCV7IOBIOyiheujjCwg6re4IOyZuCBrbm93biBjb2RlIGVycm9yLCBjb2RlIOuvuOyDgeydgCB1bnNldClcbmZ1bmN0aW9uIGRlcml2ZUxpZmV0aW1lU3RhdHVzKGNvZGU6IG51bWJlciB8IHVuZGVmaW5lZCk6IFwib2tcIiB8IFwiZXJyb3JcIiB8IFwidW5zZXRcIiB7XG4gIGlmIChjb2RlID09PSB1bmRlZmluZWQpIHJldHVybiBcInVuc2V0XCI7XG4gIGlmIChjb2RlID09PSAxMDAwIHx8IGNvZGUgPT09IDEwMDEpIHJldHVybiBcIm9rXCI7XG4gIHJldHVybiBcImVycm9yXCI7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBZ1BBLFNBQWdCLHVCQUF1QixVQUFtQyxDQUFDLEdBQXFCO0NBQzlGLE9BQU8sSUFBSSxpQkFBaUIsT0FBTztBQUNyQztBQThwQkEsU0FBUyxpQkFBaUIsS0FBc0I7Q0FDOUMsSUFBSSxjQUFjLEdBQUcsR0FDbkIsT0FBTztDQUdULElBQUksZUFBZSxRQUNqQixPQUFPLElBQUksU0FBUyxPQUFPO0NBRzdCLElBQUksZUFBZSxhQUNqQixPQUFPLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU87Q0FHMUMsSUFBSSxNQUFNLFFBQVEsR0FBRyxHQUNuQixPQUFPLE9BQU8sT0FBTyxJQUFJLFFBQVEsVUFBMkIsaUJBQWlCLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FDcEYsT0FDRjtDQUdGLE9BQU8sS0FBSyxVQUFVLEdBQUc7QUFDM0I7QUFFQSxTQUFTLGtCQUFrQixLQUFvQztDQUM3RCxJQUFJO0VBQ0YsTUFBTSxTQUNnRCxLQUFLLE1BQ3ZELEdBQ0Y7RUFDRixNQUFNLFlBQVksd0JBQXdCLFVBQVUsTUFBTTtFQUMxRCxPQUFPLFVBQVUsVUFBVSxVQUFVLE9BQU87Q0FDOUMsUUFBUTtFQUNOLE9BQU87Q0FDVDtBQUNGO0FBR0EsU0FBUyxvQkFBb0IsUUFBcUM7Q0FDaEUsSUFBSSxDQUFDLFFBQ0g7Q0FHRixPQUFPLE9BQU8sV0FBVyxRQUFRLE9BQU8sS0FB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
|