@dollhousemcp/mcp-server 2.0.31 → 2.0.32
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/CHANGELOG.md +5 -0
- package/data/ensembles/welcome-to-the-dollhouse.md +94 -0
- package/data/personas/dollhouse-expert.md +242 -14
- package/data/skills/research-to-elements.md +136 -0
- package/dist/elements/agents/AgentManager.d.ts +8 -1
- package/dist/elements/agents/AgentManager.d.ts.map +1 -1
- package/dist/elements/agents/AgentManager.js +49 -9
- package/dist/elements/ensembles/EnsembleManager.d.ts +36 -0
- package/dist/elements/ensembles/EnsembleManager.d.ts.map +1 -1
- package/dist/elements/ensembles/EnsembleManager.js +94 -5
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +31 -2
- package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationSchema.js +7 -6
- package/dist/server/tools/MCPAQLTools.js +21 -5
- package/dist/web/public/app.js +213 -12
- package/dist/web/public/index.html +16 -7
- package/dist/web/public/styles.css +229 -30
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -183,6 +183,13 @@ Quick start examples:
|
|
|
183
183
|
{ operation: "create_element", element_type: "memory", params: { element_name: "session-notes", description: "Session context and notes" } }
|
|
184
184
|
{ operation: "addEntry", params: { element_name: "session-notes", content: "Remember this fact", tags: ["important"] } }
|
|
185
185
|
{ operation: "execute_agent", params: { element_name: "MyAgent", parameters: { objective: "Review code" } } }
|
|
186
|
+
{ operation: "record_execution_step", params: { element_name: "MyAgent", stepDescription: "Reviewed auth module", outcome: "success", findings: "Found 2 issues" } }
|
|
187
|
+
{ operation: "complete_execution", params: { element_name: "MyAgent", outcome: "success", summary: "Review complete" } }
|
|
188
|
+
|
|
189
|
+
Execution loop: call execute_agent once to start, then record_execution_step after
|
|
190
|
+
each work chunk, then complete_execution when done. Use continue_execution only to
|
|
191
|
+
resume a paused execution, and pass the same goal parameters you used for
|
|
192
|
+
execute_agent when resuming.
|
|
186
193
|
|
|
187
194
|
Gatekeeper: Some operations may return a confirmation prompt instead of executing immediately. Use confirm_operation to approve, then retry.
|
|
188
195
|
|
|
@@ -249,6 +256,7 @@ Note: addEntry content supports markdown (headers, lists, bold, tables, code blo
|
|
|
249
256
|
|
|
250
257
|
Execution lifecycle — record agent progress (appends step records, like addEntry):
|
|
251
258
|
{ operation: "record_execution_step", params: { element_name: "code-reviewer", stepDescription: "Analyzed files", outcome: "success", findings: "Found 3 issues" } }
|
|
259
|
+
This is the normal next lifecycle call after mcp_aql_execute { operation: "execute_agent", ... }.
|
|
252
260
|
Response flow: record_execution_step returns { autonomy: { continue, factors, notifications? } }. Check autonomy.continue to decide whether to proceed. Check autonomy.notifications for permission_pending (gatekeeper blocks), autonomy_pause, or danger_zone alerts to relay to human operators.
|
|
253
261
|
|
|
254
262
|
Import & portfolio:
|
|
@@ -330,6 +338,7 @@ Memory-specific search (filter by tags):
|
|
|
330
338
|
Execution lifecycle — read-only queries:
|
|
331
339
|
{ operation: "get_execution_state", params: { element_name: "code-reviewer" } }
|
|
332
340
|
{ operation: "get_gathered_data", params: { element_name: "code-reviewer", goalId: "goal-id" } }
|
|
341
|
+
For execution-state reads, reuse the same element_name you passed to execute_agent. If element_name is missing, retry with the same agent name rather than inventing a new one.
|
|
333
342
|
|
|
334
343
|
Collection:
|
|
335
344
|
{ operation: "browse_collection", params: { section: "personas" } }
|
|
@@ -484,8 +493,8 @@ Supported operations: ${getOperationsString('EXECUTE')}
|
|
|
484
493
|
|
|
485
494
|
These operations manage runtime execution state. Unlike CRUD operations (which manage definitions), Execute operations handle the execution lifecycle:
|
|
486
495
|
- execute_agent: Start a new execution (returns goalId and stateVersion for tracking)
|
|
487
|
-
- complete_execution: Signal successful completion
|
|
488
|
-
- continue_execution: Resume
|
|
496
|
+
- complete_execution: Signal successful completion once the goal is done
|
|
497
|
+
- continue_execution: Resume a previously paused execution with the same goal parameters
|
|
489
498
|
- abort_execution: Abort a running execution, rejecting further operations
|
|
490
499
|
- confirm_operation: Confirm a pending operation that requires user approval (Gatekeeper flow)
|
|
491
500
|
- approve_cli_permission: Approve a pending CLI tool permission request
|
|
@@ -496,13 +505,20 @@ IMPORTANT: Execute operations are potentially destructive (agents can perform an
|
|
|
496
505
|
|
|
497
506
|
⚠️ SECURITY: Do not auto-allow this endpoint in your host settings (e.g., Claude Code settings.json). Each execution should require explicit human approval. Auto-allowing bypasses the per-operation confirmation gate. While DangerZone verification and element deny policies still provide protection, the primary human review checkpoint is lost.
|
|
498
507
|
|
|
499
|
-
|
|
508
|
+
Canonical loop:
|
|
509
|
+
1. Call execute_agent once to start the goal and receive { goalId, stateVersion, activeElements, safetyTier, ... }.
|
|
510
|
+
2. After each chunk of work, use mcp_aql_create: { operation: "record_execution_step", ... }.
|
|
511
|
+
3. Read record_execution_step.autonomy.continue and any autonomy.notifications to decide whether to continue, pause for a human, or handle a gatekeeper block.
|
|
512
|
+
4. When the goal is finished, call complete_execution.
|
|
513
|
+
Use continue_execution only when an already-started goal was paused and you are resuming it with the same goal parameters. It is not the normal next call after execute_agent.
|
|
500
514
|
|
|
501
515
|
Quick start examples:
|
|
502
516
|
{ operation: "execute_agent", params: { element_name: "code-reviewer", parameters: { objective: "Review code" } } }
|
|
517
|
+
Next lifecycle step — use mcp_aql_create:
|
|
518
|
+
{ operation: "record_execution_step", params: { element_name: "code-reviewer", stepDescription: "Reviewed auth module", outcome: "success", findings: "Found 2 security issues" } }
|
|
503
519
|
{ operation: "complete_execution", params: { element_name: "code-reviewer", outcome: "success", summary: "Completed review" } }
|
|
504
520
|
{ operation: "abort_execution", params: { element_name: "data-collector", reason: "User requested cancellation" } }
|
|
505
|
-
{ operation: "continue_execution", params: { element_name: "
|
|
521
|
+
{ operation: "continue_execution", params: { element_name: "rubric-qa-agent", previousStepResult: "Verified citation set", parameters: { run_dir: "/app/run", deliverable_path: "/app/run/output.docx" } } }
|
|
506
522
|
{ operation: "confirm_operation", params: { operation: "execute_agent" } }
|
|
507
523
|
{ operation: "approve_cli_permission", params: { request_id: "req-123", decision: "allow" } }
|
|
508
524
|
{ operation: "prepare_handoff", params: { element_name: "code-reviewer" } }
|
|
@@ -530,4 +546,4 @@ Discover required parameters — use mcp_aql_read:
|
|
|
530
546
|
}
|
|
531
547
|
];
|
|
532
548
|
}
|
|
533
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTUNQQVFMVG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL3Rvb2xzL01DUEFRTFRvb2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4RUc7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHdCQUF3QixFQUFxQixNQUFNLDJDQUEyQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXRFLCtFQUErRTtBQUMvRSxpQ0FBaUM7QUFDakMsK0VBQStFO0FBRS9FOzs7R0FHRztBQUNILFNBQVMscUJBQXFCO0lBQzVCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsbUJBQW1CLENBQUMsUUFBc0I7SUFDakQsT0FBTyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxjQUFjO0FBQ2QsK0VBQStFO0FBRS9FOzs7R0FHRztBQUNILE1BQU0sb0JBQW9CLEdBQUc7SUFDM0IsSUFBSSxFQUFFLFFBQWlCO0lBQ3ZCLFVBQVUsRUFBRTtRQUNWLFNBQVMsRUFBRTtZQUNULElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUFFLDJCQUEyQjtTQUN6QztRQUNELFlBQVksRUFBRTtZQUNaLElBQUksRUFB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QUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoRCxPQUFPO29CQUNMLE9BQU8sRUFBRTt3QkFDUDs0QkFDRSxJQUFJLEVBQUUsTUFBTTs0QkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzt5QkFDdEM7cUJBQ0Y7aUJBQ0YsQ0FBQztZQUNKLENBQUM7U0FDRjtRQUVELGlFQUFpRTtRQUNqRTtZQUNFLElBQUksRUFBRTtnQkFDSixJQUFJLEVBQUUsaUJBQWlCO2dCQUN2QixXQUFXLEVBQUU7O3dCQUVHLG1CQUFtQixDQUFDLFNBQVMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0ZBNkI4QjtnQkFDNUUsV0FBVyxFQUFFLG9CQUFvQjtnQkFDakMsV0FBVyxFQUFFO29CQUNYLFlBQVksRUFBRSxLQUFLO29CQUNuQixlQUFlLEVBQUUsSUFBSSxDQUFFLDBEQUEwRDtpQkFDbEY7YUFDRjtZQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBUyxFQUFFLEVBQUU7Z0JBQzNCLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDakQsT0FBTztvQkFDTCxPQUFPLEVBQUU7d0JBQ1A7NEJBQ0UsSUFBSSxFQUFFLE1BQU07NEJBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7eUJBQ3RDO3FCQUNGO2lCQUNGLENBQUM7WUFDSixDQUFDO1NBQ0Y7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTUNQLUFRTCBUb29scyAtIFVuaWZpZWQgcXVlcnkgaW50ZXJmYWNlIGZvciBBSSBhZ2VudHNcbiAqXG4gKiBQcm92aWRlcyB0d28gZW5kcG9pbnQgbW9kZXMgY29uZmlndXJhYmxlIHZpYSBNQ1BfQVFMX0VORFBPSU5UX01PREUgZW52aXJvbm1lbnQgdmFyaWFibGU6XG4gKlxuICogIyMgTW9kZSAxOiBDUlVERSBFbmRwb2ludHMgKERlZmF1bHQpIC0gTUNQX0FRTF9FTkRQT0lOVF9NT0RFPWNydWRlXG4gKiA1IHRvb2xzOiBtY3BfYXFsX2NyZWF0ZSwgbWNwX2FxbF9yZWFkLCBtY3BfYXFsX3VwZGF0ZSwgbWNwX2FxbF9kZWxldGUsIG1jcF9hcWxfZXhlY3V0ZSAofjQsMzAwIHRva2VucylcbiAqXG4gKiAjIyBNb2RlIDI6IFNpbmdsZSBFbmRwb2ludCAoTWluaW1hbCkgLSBNQ1BfQVFMX0VORFBPSU5UX01PREU9c2luZ2xlXG4gKiAxIHRvb2w6IG1jcF9hcWwgKH4zNTAgdG9rZW5zKVxuICogSWRlYWwgZm9yIG11bHRpLXNlcnZlciBkZXBsb3ltZW50cyB3aGVyZSB0b2tlbiBidWRnZXQgaXMgY29uc3RyYWluZWQuXG4gKlxuICogTm90ZTogVGhlc2UgdG9vbHMgYXJlIG9ubHkgcmVnaXN0ZXJlZCB3aGVuIE1DUF9JTlRFUkZBQ0VfTU9ERT1tY3BhcWwgKGRlZmF1bHQpLlxuICogV2hlbiBNQ1BfSU5URVJGQUNFX01PREU9ZGlzY3JldGUsIGRpc2NyZXRlIHRvb2xzIGFyZSByZWdpc3RlcmVkIGluc3RlYWQuXG4gKlxuICogIyMgV2h5IDUgQ1JVREUgRW5kcG9pbnRzPyAoRGVmYXVsdCBNb2RlKVxuICpcbiAqIFRoZSA1LWVuZHBvaW50IENSVURFIHBhdHRlcm4gKENyZWF0ZSwgUmVhZCwgVXBkYXRlLCBEZWxldGUsIEV4ZWN1dGUpIHdhcyBjaG9zZW4gZm9yOlxuICpcbiAqIDEuICoqVXNlciBDb21wcmVoZW5zaW9uKio6IENSVURFIGV4dGVuZHMgQ1JVRCB3aXRoIEV4ZWN1dGUgZm9yIG5vbi1pZGVtcG90ZW50XG4gKiAgICBvcGVyYXRpb25zLCBtYWtpbmcgaXQgZWFzeSBmb3IgdXNlcnMgdG8gcmVhc29uIGFib3V0IHdoYXQgZWFjaCBlbmRwb2ludCBjYW4gZG8uXG4gKlxuICogMi4gKipQbGF0Zm9ybSBBbm5vdGF0aW9ucyoqOiBNQ1AgcGxhdGZvcm1zIGxpa2UgQ2hhdEdQVCdzIGFwcHMgcmVxdWlyZVxuICogICAgdG9vbCBhbm5vdGF0aW9ucyB0aGF0IGRlc2NyaWJlIHNhZmV0eSBhbmQgZGVzdHJ1Y3RpdmVuZXNzLiBUaGUgNS1lbmRwb2ludFxuICogICAgc3BsaXQgbWFwcyBkaXJlY3RseSB0byBkaXN0aW5jdCBwZXJtaXNzaW9uIGxldmVsczpcbiAqICAgIC0gQ1JFQVRFOiBhZGRpdGl2ZSwgbm9uLWRlc3RydWN0aXZlIChyZWFkT25seUhpbnQ6IGZhbHNlLCBkZXN0cnVjdGl2ZUhpbnQ6IGZhbHNlKVxuICogICAgLSBSRUFEOiBzYWZlLCByZWFkLW9ubHkgKHJlYWRPbmx5SGludDogdHJ1ZSwgZGVzdHJ1Y3RpdmVIaW50OiBmYWxzZSlcbiAqICAgIC0gVVBEQVRFOiBtb2RpZnlpbmcsIHBvdGVudGlhbGx5IGRlc3RydWN0aXZlIChyZWFkT25seUhpbnQ6IGZhbHNlLCBkZXN0cnVjdGl2ZUhpbnQ6IHRydWUpXG4gKiAgICAtIERFTEVURTogZGVzdHJ1Y3RpdmUgKHJlYWRPbmx5SGludDogZmFsc2UsIGRlc3RydWN0aXZlSGludDogdHJ1ZSlcbiAqICAgIC0gRVhFQ1VURTogbm9uLWlkZW1wb3RlbnQsIHBvdGVudGlhbGx5IGRlc3RydWN0aXZlIChyZWFkT25seUhpbnQ6IGZhbHNlLCBkZXN0cnVjdGl2ZUhpbnQ6IHRydWUpXG4gKlxuICogMy4gKipHcmFudWxhciBQZXJtaXNzaW9uIENvbnRyb2wqKjogVXNlcnMgY2FuIGdyYW50IFJFQUQgZW5kcG9pbnQgZnVsbCBhY2Nlc3NcbiAqICAgIHdoaWxlIGxvY2tpbmcgZG93biBDUkVBVEUsIFVQREFURSwgREVMRVRFLCBhbmQgRVhFQ1VURS4gVGhpcyBlbmFibGVzIHNhZmVcbiAqICAgIHJlYWQtb25seSBpbnRlZ3JhdGlvbnMgd2l0aG91dCBleHBvc2luZyBtdXRhdGlvbiBjYXBhYmlsaXRpZXMuXG4gKlxuICogIyMgV2h5IFNpbmdsZSBFbmRwb2ludD8gKE1pbmltYWwgTW9kZSlcbiAqXG4gKiBUaGUgc2luZ2xlLWVuZHBvaW50IG1vZGUgd2FzIGFkZGVkIGZvcjpcbiAqXG4gKiAxLiAqKlRva2VuIEVmZmljaWVuY3kqKjogfjM1MCB0b2tlbnMgdnMgfjQsMzAwIHRva2VucyAoOTIlIHJlZHVjdGlvbilcbiAqIDIuICoqTXVsdGktU2VydmVyIERlcGxveW1lbnRzKio6IFdoZW4gcnVubmluZyBtdWx0aXBsZSBNQ1Agc2VydmVycywgdG9rZW5cbiAqICAgIGJ1ZGdldHMgY2FuIGJlIGNvbnN0cmFpbmVkLiBTaW5nbGUgZW5kcG9pbnQgcmVkdWNlcyBvdmVyaGVhZC5cbiAqIDMuICoqU2ltcGxpZmllZCBJbnRlZ3JhdGlvbioqOiBTb21lIGNsaWVudHMgcHJlZmVyIGEgc2luZ2xlIGVudHJ5IHBvaW50LlxuICpcbiAqIFNlY3VyaXR5IGlzIG1haW50YWluZWQgdGhyb3VnaCBzZXJ2ZXItc2lkZSBHYXRla2VlcGVyIGVuZm9yY2VtZW50IC0gdGhlXG4gKiBzZXJ2ZXIgZGV0ZXJtaW5lcyB3aGljaCBvcGVyYXRpb24gdHlwZSBpcyBiZWluZyBleGVjdXRlZCBhbmQgYXBwbGllc1xuICogYXBwcm9wcmlhdGUgcGVybWlzc2lvbiBjaGVja3MuXG4gKlxuICogIyMgR3JhcGhRTC1TdHlsZSBJbnRyb3NwZWN0aW9uXG4gKlxuICogTUNQLUFRTCBmb2xsb3dzIEdyYXBoUUwgcGF0dGVybnMgZm9yIHNlbGYtZG9jdW1lbnRhdGlvbi4gVG9vbCBkZXNjcmlwdGlvbnNcbiAqIGFyZSBnZW5lcmF0ZWQgZHluYW1pY2FsbHkgZnJvbSBPUEVSQVRJT05fUk9VVEVTLCBlbnN1cmluZyB0aGV5IGFsd2F5cyByZWZsZWN0XG4gKiB0aGUgY3VycmVudCBhdmFpbGFibGUgb3BlcmF0aW9ucy5cbiAqXG4gKiAjIyMgSW50cm9zcGVjdGlvbiBFeGFtcGxlc1xuICpcbiAqIExpc3QgYWxsIGF2YWlsYWJsZSBvcGVyYXRpb25zOlxuICogYGBganNvblxuICogeyBcIm9wZXJhdGlvblwiOiBcImludHJvc3BlY3RcIiwgXCJwYXJhbXNcIjogeyBcInF1ZXJ5XCI6IFwib3BlcmF0aW9uc1wiIH0gfVxuICogYGBgXG4gKlxuICogR2V0IGRldGFpbHMgZm9yIGEgc3BlY2lmaWMgb3BlcmF0aW9uIChwYXJhbWV0ZXJzLCBleGFtcGxlcywgcmV0dXJuIHR5cGVzKTpcbiAqIGBgYGpzb25cbiAqIHsgXCJvcGVyYXRpb25cIjogXCJpbnRyb3NwZWN0XCIsIFwicGFyYW1zXCI6IHsgXCJxdWVyeVwiOiBcIm9wZXJhdGlvbnNcIiwgXCJuYW1lXCI6IFwiY3JlYXRlX2VsZW1lbnRcIiB9IH1cbiAqIGBgYFxuICpcbiAqIERpc2NvdmVyIGF2YWlsYWJsZSB0eXBlcyAoZS5nLiwgRWxlbWVudFR5cGUgZW51bSB2YWx1ZXMpOlxuICogYGBganNvblxuICogeyBcIm9wZXJhdGlvblwiOiBcImludHJvc3BlY3RcIiwgXCJwYXJhbXNcIjogeyBcInF1ZXJ5XCI6IFwidHlwZXNcIiwgXCJuYW1lXCI6IFwiRWxlbWVudFR5cGVcIiB9IH1cbiAqIGBgYFxuICpcbiAqICMjIyBEZXNpZ24gUGhpbG9zb3BoeVxuICpcbiAqIC0gKipTaW5nbGUgc291cmNlIG9mIHRydXRoKio6IE9QRVJBVElPTl9ST1VURVMgZGVmaW5lcyBhbGwgb3BlcmF0aW9uc1xuICogLSAqKkR5bmFtaWMgZGVzY3JpcHRpb25zKio6IEFkZGluZyBhbiBvcGVyYXRpb24gdG8gT1BFUkFUSU9OX1JPVVRFUyBhdXRvbWF0aWNhbGx5XG4gKiAgIHVwZGF0ZXMgdG9vbCBkZXNjcmlwdGlvbnMgLSBubyBtYW51YWwgc3luY2hyb25pemF0aW9uIG5lZWRlZFxuICogLSAqKkludHJvc3BlY3Rpb24tZmlyc3QqKjogTExNcyBkaXNjb3ZlciBwYXJhbWV0ZXJzIHZpYSBpbnRyb3NwZWN0LCBub3Qgc3RhdGljIGRvY3NcbiAqIC0gKipHcmFwaFFMIGhlcml0YWdlKio6IFBhdHRlcm5zIGZhbWlsaWFyIHRvIGFueSBMTE0gdHJhaW5lZCBvbiBHcmFwaFFMXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBNQ1BBUUxIYW5kbGVyIH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9NQ1BBUUxIYW5kbGVyLmpzJztcbmltcG9ydCB7IFVuaWZpZWRFbmRwb2ludCB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvVW5pZmllZEVuZHBvaW50LmpzJztcbmltcG9ydCB7IGdldE9wZXJhdGlvbnNGb3JFbmRwb2ludCwgdHlwZSBDUlVERW5kcG9pbnQgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9tY3AtYXFsL09wZXJhdGlvblJvdXRlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBUb29sRGVmaW5pdGlvbiwgVG9vbEhhbmRsZXIgfSBmcm9tICcuLi8uLi9oYW5kbGVycy90eXBlcy9Ub29sVHlwZXMuanMnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vLi4vY29uZmlnL2Vudi5qcyc7XG5pbXBvcnQgeyBFTEVNRU5UX1JPTEVTIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvZW5zZW1ibGVzL2NvbnN0YW50cy5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIER5bmFtaWMgRGVzY3JpcHRpb24gR2VuZXJhdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEdldCBlbGVtZW50IHR5cGVzIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy5cbiAqIERlcml2ZWQgZnJvbSB0aGUgRWxlbWVudFR5cGUgZW51bSB0byBlbnN1cmUgY29uc2lzdGVuY3kuXG4gKi9cbmZ1bmN0aW9uIGdldEVsZW1lbnRUeXBlc1N0cmluZygpOiBzdHJpbmcge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkuam9pbignLCAnKTtcbn1cblxuLyoqXG4gKiBHZXQgb3BlcmF0aW9ucyBmb3IgYW4gZW5kcG9pbnQgYXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLlxuICogRGVyaXZlZCBmcm9tIE9QRVJBVElPTl9ST1VURVMgdG8gZW5zdXJlIGNvbnNpc3RlbmN5LlxuICovXG5mdW5jdGlvbiBnZXRPcGVyYXRpb25zU3RyaW5nKGVuZHBvaW50OiBDUlVERW5kcG9pbnQpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0T3BlcmF0aW9uc0ZvckVuZHBvaW50KGVuZHBvaW50KS5qb2luKCcsICcpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUb29sIFNjaGVtYVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFNoYXJlZCBpbnB1dCBzY2hlbWEgZm9yIENSVUQgb3BlcmF0aW9ucyAoY3JlYXRlLCByZWFkLCB1cGRhdGUsIGRlbGV0ZSlcbiAqIEFsbCBvcGVyYXRpb25zIHVzZSB0aGUgT3BlcmF0aW9uSW5wdXQgc3RydWN0dXJlIGZyb20gdGhlIEdyYXBoUUwgc2NoZW1hXG4gKi9cbmNvbnN0IG9wZXJhdGlvbklucHV0U2NoZW1hID0ge1xuICB0eXBlOiBcIm9iamVjdFwiIGFzIGNvbnN0LFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgb3BlcmF0aW9uOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiT3BlcmF0aW9uIG5hbWUgdG8gZXhlY3V0ZVwiXG4gICAgfSxcbiAgICBlbGVtZW50X3R5cGU6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUYXJnZXQgZWxlbWVudCB0eXBlIChvcHRpb25hbClcIlxuICAgIH0sXG4gICAgcGFyYW1zOiB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiT3BlcmF0aW9uIHBhcmFtZXRlcnNcIlxuICAgIH0sXG4gICAgb3BlcmF0aW9uczoge1xuICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiQXJyYXkgb2Ygb3BlcmF0aW9ucyBmb3IgYmF0Y2ggZXhlY3V0aW9uXCIsXG4gICAgICBpdGVtczoge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgb3BlcmF0aW9uOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICBlbGVtZW50X3R5cGU6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgIHBhcmFtczogeyB0eXBlOiBcIm9iamVjdFwiIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWlyZWQ6IFtcIm9wZXJhdGlvblwiXVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgcmVxdWlyZWQ6IFtcIm9wZXJhdGlvblwiIGFzIGNvbnN0XVxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVG9vbCBSZWdpc3RyYXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBHZXQgTUNQLUFRTCB0b29scyBmb3IgcmVnaXN0cmF0aW9uIGluIHRoZSBUb29sUmVnaXN0cnkuXG4gKlxuICogUmV0dXJucyBkaWZmZXJlbnQgdG9vbHMgYmFzZWQgb24gTUNQX0FRTF9FTkRQT0lOVF9NT0RFIGVudmlyb25tZW50IHZhcmlhYmxlOlxuICogLSAnY3J1ZGUnIChkZWZhdWx0KTogNSBDUlVERSBlbmRwb2ludHMgKENyZWF0ZSwgUmVhZCwgVXBkYXRlLCBEZWxldGUsIEV4ZWN1dGUpICh+NCwzMDAgdG9rZW5zKVxuICogLSAnc2luZ2xlJzogMSB1bmlmaWVkIGVuZHBvaW50ICh+MzUwIHRva2VucylcbiAqXG4gKiBOb3RlOiBNQ1BfQVFMX01PREUgaXMgc3VwcG9ydGVkIGFzIGEgZGVwcmVjYXRlZCBhbGlhcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1DUEFRTFRvb2xzKGhhbmRsZXI6IE1DUEFRTEhhbmRsZXIpOiBBcnJheTx7IHRvb2w6IFRvb2xEZWZpbml0aW9uOyBoYW5kbGVyOiBUb29sSGFuZGxlciB9PiB7XG4gIC8vIFVzZSBNQ1BfQVFMX0VORFBPSU5UX01PREUsIGZhbGxpbmcgYmFjayB0byBkZXByZWNhdGVkIE1DUF9BUUxfTU9ERSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICBjb25zdCBtb2RlID0gZW52Lk1DUF9BUUxfRU5EUE9JTlRfTU9ERSA/PyBlbnYuTUNQX0FRTF9NT0RFID8/ICdjcnVkZSc7XG5cbiAgaWYgKG1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgcmV0dXJuIGdldFVuaWZpZWRUb29scyhoYW5kbGVyKTtcbiAgfVxuXG4gIC8vIERlZmF1bHQ6IENSVURFIG1vZGUgKDUgZW5kcG9pbnRzKVxuICByZXR1cm4gZ2V0Q1JVREVUb29scyhoYW5kbGVyKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHVuaWZpZWQgc2luZ2xlIGVuZHBvaW50IHRvb2wgKE1DUF9BUUxfTU9ERT1zaW5nbGUpXG4gKiBUb2tlbiBmb290cHJpbnQ6IH4zMDAtNDAwIHRva2Vuc1xuICovXG5mdW5jdGlvbiBnZXRVbmlmaWVkVG9vbHMoaGFuZGxlcjogTUNQQVFMSGFuZGxlcik6IEFycmF5PHsgdG9vbDogVG9vbERlZmluaXRpb247IGhhbmRsZXI6IFRvb2xIYW5kbGVyIH0+IHtcbiAgY29uc3QgdW5pZmllZEVuZHBvaW50ID0gbmV3IFVuaWZpZWRFbmRwb2ludChoYW5kbGVyKTtcblxuICAvLyBCdWlsZCBkeW5hbWljIGRlc2NyaXB0aW9uIGZyb20gT1BFUkFUSU9OX1JPVVRFU1xuICBjb25zdCBkZXNjcmlwdGlvbiA9IGBEb2xsaG91c2VNQ1AgdW5pZmllZCBBUEkgLSBHcmFwaFFMLXN0eWxlIHF1ZXJ5IGludGVyZmFjZSBmb3IgQUkgZWxlbWVudCBtYW5hZ2VtZW50LlxuXG5DUlVERSBPcGVyYXRpb25zOlxuLSBDUkVBVEU6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnQ1JFQVRFJyl9XG4tIFJFQUQ6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnUkVBRCcpfVxuLSBVUERBVEU6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnVVBEQVRFJyl9XG4tIERFTEVURTogJHtnZXRPcGVyYXRpb25zU3RyaW5nKCdERUxFVEUnKX1cbi0gRVhFQ1VURTogJHtnZXRPcGVyYXRpb25zU3RyaW5nKCdFWEVDVVRFJyl9XG5cbkVsZW1lbnQgdHlwZXM6ICR7Z2V0RWxlbWVudFR5cGVzU3RyaW5nKCl9XG5cblF1aWNrIHN0YXJ0IGV4YW1wbGVzOlxueyBvcGVyYXRpb246IFwibGlzdF9lbGVtZW50c1wiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiIH1cbnsgb3BlcmF0aW9uOiBcImNyZWF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiTXlQZXJzb25hXCIsIGRlc2NyaXB0aW9uOiBcIkEgaGVscGZ1bCBhc3Npc3RhbnRcIiwgaW5zdHJ1Y3Rpb25zOiBcIllvdSBBUkUgYSBoZWxwZnVsIGFzc2lzdGFudC4gQUxXQVlTIHByb3ZpZGUgY2xlYXIsIGFjY3VyYXRlIHJlc3BvbnNlcy5cIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNyZWF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJhZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIk15QWdlbnRcIiwgZGVzY3JpcHRpb246IFwiVGFzayBleGVjdXRvclwiLCBpbnN0cnVjdGlvbnM6IFwiRXhlY3V0ZSBnb2FscyBtZXRob2RpY2FsbHkuIFJlcG9ydCBwcm9ncmVzcyBhdCBlYWNoIHN0ZXAuXCIsIGdvYWw6IHsgdGVtcGxhdGU6IFwiQ29tcGxldGU6IHtvYmplY3RpdmV9XCIsIHBhcmFtZXRlcnM6IFt7IG5hbWU6IFwib2JqZWN0aXZlXCIsIHR5cGU6IFwic3RyaW5nXCIsIHJlcXVpcmVkOiB0cnVlIH1dIH0gfSB9XG57IG9wZXJhdGlvbjogXCJjcmVhdGVfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwibWVtb3J5XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwic2Vzc2lvbi1ub3Rlc1wiLCBkZXNjcmlwdGlvbjogXCJTZXNzaW9uIGNvbnRleHQgYW5kIG5vdGVzXCIgfSB9XG57IG9wZXJhdGlvbjogXCJhZGRFbnRyeVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInNlc3Npb24tbm90ZXNcIiwgY29udGVudDogXCJSZW1lbWJlciB0aGlzIGZhY3RcIiwgdGFnczogW1wiaW1wb3J0YW50XCJdIH0gfVxueyBvcGVyYXRpb246IFwiZXhlY3V0ZV9hZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIk15QWdlbnRcIiwgcGFyYW1ldGVyczogeyBvYmplY3RpdmU6IFwiUmV2aWV3IGNvZGVcIiB9IH0gfVxuXG5HYXRla2VlcGVyOiBTb21lIG9wZXJhdGlvbnMgbWF5IHJldHVybiBhIGNvbmZpcm1hdGlvbiBwcm9tcHQgaW5zdGVhZCBvZiBleGVjdXRpbmcgaW1tZWRpYXRlbHkuIFVzZSBjb25maXJtX29wZXJhdGlvbiB0byBhcHByb3ZlLCB0aGVuIHJldHJ5LlxuXG5EaXNjb3ZlciBhbGwgb3BlcmF0aW9uczpcbnsgb3BlcmF0aW9uOiBcImludHJvc3BlY3RcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcIm9wZXJhdGlvbnNcIiB9IH1gO1xuXG4gIHJldHVybiBbXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcIm1jcF9hcWxcIixcbiAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIGlucHV0U2NoZW1hOiBvcGVyYXRpb25JbnB1dFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICAvLyBVbmlmaWVkIGVuZHBvaW50IGNhbiBwZXJmb3JtIGFueSBvcGVyYXRpb24sIHNvIHdlIHVzZSBjb25zZXJ2YXRpdmUgaGludHNcbiAgICAgICAgICAvLyBUaGUgYWN0dWFsIG9wZXJhdGlvbidzIHNhZmV0eSBpcyBlbmZvcmNlZCBzZXJ2ZXItc2lkZSBieSBHYXRla2VlcGVyXG4gICAgICAgICAgcmVhZE9ubHlIaW50OiBmYWxzZSxcbiAgICAgICAgICBkZXN0cnVjdGl2ZUhpbnQ6IHRydWUgLy8gQ29uc2VydmF0aXZlOiBzb21lIG9wZXJhdGlvbnMgYXJlIGRlc3RydWN0aXZlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiBhc3luYyAoYXJnczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHVuaWZpZWRFbmRwb2ludC5oYW5kbGUoYXJncyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIF07XG59XG5cbi8qKlxuICogR2V0IHRoZSA1IENSVURFIGVuZHBvaW50IHRvb2xzIChNQ1BfQVFMX0VORFBPSU5UX01PREU9Y3J1ZGUsIGRlZmF1bHQpXG4gKiBDUlVERSA9IENyZWF0ZSwgUmVhZCwgVXBkYXRlLCBEZWxldGUsIEV4ZWN1dGVcbiAqIFRva2VuIGZvb3RwcmludDogfjQsMzAwIHRva2VucyAobWVhc3VyZWQgdmlhIENsYXVkZSBDb2RlIC9jb250ZXh0KVxuICpcbiAqIERlc2NyaXB0aW9ucyBhcmUgZ2VuZXJhdGVkIGR5bmFtaWNhbGx5IGZyb20gT1BFUkFUSU9OX1JPVVRFUyB0byBlbnN1cmVcbiAqIHRoZXkgYWx3YXlzIHJlZmxlY3QgdGhlIGN1cnJlbnQgYXZhaWxhYmxlIG9wZXJhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGdldENSVURFVG9vbHMoaGFuZGxlcjogTUNQQVFMSGFuZGxlcik6IEFycmF5PHsgdG9vbDogVG9vbERlZmluaXRpb247IGhhbmRsZXI6IFRvb2xIYW5kbGVyIH0+IHtcbiAgY29uc3QgZWxlbWVudFR5cGVzID0gZ2V0RWxlbWVudFR5cGVzU3RyaW5nKCk7XG5cbiAgcmV0dXJuIFtcbiAgICAvLyBtY3BfYXFsX2NyZWF0ZSAtIEFkZGl0aXZlLCBub24tZGVzdHJ1Y3RpdmUgb3BlcmF0aW9uc1xuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJtY3BfYXFsX2NyZWF0ZVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogYEFkZGl0aXZlLCBub24tZGVzdHJ1Y3RpdmUgb3BlcmF0aW9ucy5cblxuU3VwcG9ydGVkIG9wZXJhdGlvbnM6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnQ1JFQVRFJyl9XG5cbkVsZW1lbnQgdHlwZXM6ICR7ZWxlbWVudFR5cGVzfVxuXG5UaGVzZSBvcGVyYXRpb25zIGFkZCBuZXcgZGF0YSB3aXRob3V0IHJlbW92aW5nIG9yIG92ZXJ3cml0aW5nIGV4aXN0aW5nIGNvbnRlbnQuXG5cblF1aWNrIHN0YXJ0IGV4YW1wbGVzOlxueyBvcGVyYXRpb246IFwiY3JlYXRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJNeVBlcnNvbmFcIiwgZGVzY3JpcHRpb246IFwiQSBoZWxwZnVsIGFzc2lzdGFudFwiLCBpbnN0cnVjdGlvbnM6IFwiWW91IEFSRSBhIGhlbHBmdWwgYXNzaXN0YW50LiBBTFdBWVMgcHJvdmlkZSBjbGVhciwgYWNjdXJhdGUgcmVzcG9uc2VzLlwiIH0gfVxueyBvcGVyYXRpb246IFwiY3JlYXRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcImFnZW50XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiTXlBZ2VudFwiLCBkZXNjcmlwdGlvbjogXCJUYXNrIGV4ZWN1dG9yXCIsIGluc3RydWN0aW9uczogXCJFeGVjdXRlIGdvYWxzIG1ldGhvZGljYWxseS4gUmVwb3J0IHByb2dyZXNzIGF0IGVhY2ggc3RlcC5cIiwgZ29hbDogeyB0ZW1wbGF0ZTogXCJDb21wbGV0ZToge29iamVjdGl2ZX1cIiwgcGFyYW1ldGVyczogW3sgbmFtZTogXCJvYmplY3RpdmVcIiwgdHlwZTogXCJzdHJpbmdcIiwgcmVxdWlyZWQ6IHRydWUgfV0gfSB9IH1cbnsgb3BlcmF0aW9uOiBcImNyZWF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJtZW1vcnlcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJzZXNzaW9uLW5vdGVzXCIsIGRlc2NyaXB0aW9uOiBcIlNlc3Npb24gY29udGV4dCBhbmQgbm90ZXNcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNyZWF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJlbnNlbWJsZVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIm15LWVuc2VtYmxlXCIsIGRlc2NyaXB0aW9uOiBcIkNvbWJpbmVkIGVsZW1lbnQgc2V0XCIsIG1ldGFkYXRhOiB7IGVsZW1lbnRzOiBbeyBlbGVtZW50X25hbWU6IFwiZXhwZXJ0XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHJvbGU6IFwicHJpbWFyeVwiIH0sIHsgZWxlbWVudF9uYW1lOiBcImFuYWx5c2lzXCIsIGVsZW1lbnRfdHlwZTogXCJza2lsbFwiLCByb2xlOiBcInN1cHBvcnRcIiB9XSB9IH0gfVxuVmFsaWQgZW5zZW1ibGUgcm9sZXM6ICR7RUxFTUVOVF9ST0xFUy5qb2luKCcsICcpfVxueyBvcGVyYXRpb246IFwiYWRkRW50cnlcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJzZXNzaW9uLW5vdGVzXCIsIGNvbnRlbnQ6IFwiUmVtZW1iZXIgdGhpcyBmYWN0XCIsIHRhZ3M6IFtcImltcG9ydGFudFwiXSB9IH1cbk5vdGU6IGFkZEVudHJ5IGNvbnRlbnQgc3VwcG9ydHMgbWFya2Rvd24gKGhlYWRlcnMsIGxpc3RzLCBib2xkLCB0YWJsZXMsIGNvZGUgYmxvY2tzKS4gRW5zdXJlIG1hcmtkb3duIGNvbnRlbnQgaXMgcHJvcGVybHkgSlNPTi1lc2NhcGVkIOKAlCB1c2UgJHtTdHJpbmcucmF3YFxcbmB9IGZvciBuZXdsaW5lcywgJHtTdHJpbmcucmF3YFxcXCJgfSBmb3IgcXVvdGVzLCBhbmQgJHtTdHJpbmcucmF3YFxcXFxgfSBmb3IgYmFja3NsYXNoZXMgd2l0aGluIHRoZSBKU09OIHN0cmluZyB2YWx1ZS5cblxuRXhlY3V0aW9uIGxpZmVjeWNsZSDigJQgcmVjb3JkIGFnZW50IHByb2dyZXNzIChhcHBlbmRzIHN0ZXAgcmVjb3JkcywgbGlrZSBhZGRFbnRyeSk6XG57IG9wZXJhdGlvbjogXCJyZWNvcmRfZXhlY3V0aW9uX3N0ZXBcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld2VyXCIsIHN0ZXBEZXNjcmlwdGlvbjogXCJBbmFseXplZCBmaWxlc1wiLCBvdXRjb21lOiBcInN1Y2Nlc3NcIiwgZmluZGluZ3M6IFwiRm91bmQgMyBpc3N1ZXNcIiB9IH1cblJlc3BvbnNlIGZsb3c6IHJlY29yZF9leGVjdXRpb25fc3RlcCByZXR1cm5zIHsgYXV0b25vbXk6IHsgY29udGludWUsIGZhY3RvcnMsIG5vdGlmaWNhdGlvbnM/IH0gfS4gQ2hlY2sgYXV0b25vbXkuY29udGludWUgdG8gZGVjaWRlIHdoZXRoZXIgdG8gcHJvY2VlZC4gQ2hlY2sgYXV0b25vbXkubm90aWZpY2F0aW9ucyBmb3IgcGVybWlzc2lvbl9wZW5kaW5nIChnYXRla2VlcGVyIGJsb2NrcyksIGF1dG9ub215X3BhdXNlLCBvciBkYW5nZXJfem9uZSBhbGVydHMgdG8gcmVsYXkgdG8gaHVtYW4gb3BlcmF0b3JzLlxuXG5JbXBvcnQgJiBwb3J0Zm9saW86XG57IG9wZXJhdGlvbjogXCJpbXBvcnRfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwic2tpbGxcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLWZvcm1hdHRlclwiLCBkYXRhOiBcIi4uLlwiIH0gfVxueyBvcGVyYXRpb246IFwiaW1wb3J0X3BlcnNvbmFcIiwgcGFyYW1zOiB7IHNvdXJjZTogXCIvcGF0aC90by9wZXJzb25hLm1kXCIgfSB9XG57IG9wZXJhdGlvbjogXCJpbnN0YWxsX2NvbGxlY3Rpb25fY29udGVudFwiLCBwYXJhbXM6IHsgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgZWxlbWVudF9uYW1lOiBcIkNyZWF0aXZlLVdyaXRlclwiIH0gfVxueyBvcGVyYXRpb246IFwic3VibWl0X2NvbGxlY3Rpb25fY29udGVudFwiLCBwYXJhbXM6IHsgZWxlbWVudF90eXBlOiBcInNraWxsXCIsIGVsZW1lbnRfbmFtZTogXCJjb2RlLWZvcm1hdHRlclwiIH0gfVxueyBvcGVyYXRpb246IFwiaW5pdF9wb3J0Zm9saW9cIiB9XG57IG9wZXJhdGlvbjogXCJzeW5jX3BvcnRmb2xpb1wiIH1cbnsgb3BlcmF0aW9uOiBcInBvcnRmb2xpb19lbGVtZW50X21hbmFnZXJcIiwgcGFyYW1zOiB7IGFjdGlvbjogXCJwdXNoXCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIGVsZW1lbnRfbmFtZTogXCJUZWNoLVdyaXRlclwiIH0gfVxuXG5BdXRoICYgdmVyaWZpY2F0aW9uOlxueyBvcGVyYXRpb246IFwic2V0dXBfZ2l0aHViX2F1dGhcIiB9XG57IG9wZXJhdGlvbjogXCJjb25maWd1cmVfb2F1dGhcIiwgcGFyYW1zOiB7IGNsaWVudF9pZDogXCJ5b3VyLWNsaWVudC1pZFwiIH0gfVxueyBvcGVyYXRpb246IFwidmVyaWZ5X2NoYWxsZW5nZVwiLCBwYXJhbXM6IHsgY29kZTogXCJBQkMxMjNcIiB9IH1cbnsgb3BlcmF0aW9uOiBcInJlbGVhc2VfZGVhZGxvY2tcIiB9XG57IG9wZXJhdGlvbjogXCJiZWV0bGVqdWljZV9iZWV0bGVqdWljZV9iZWV0bGVqdWljZVwiIH1cblxuQmF0Y2ggb3BlcmF0aW9uczogVXNlIHRoZSBvcGVyYXRpb25zIGFycmF5IHRvIGV4ZWN1dGUgbXVsdGlwbGUgb3BlcmF0aW9ucyBzZXF1ZW50aWFsbHkgaW4gYSBzaW5nbGUgcmVxdWVzdC5cbnsgb3BlcmF0aW9uczogW3sgb3BlcmF0aW9uOiBcImFkZEVudHJ5XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwibG9nXCIsIGNvbnRlbnQ6IFwiU3RlcCAxXCIgfSB9LCB7IG9wZXJhdGlvbjogXCJhZGRFbnRyeVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImxvZ1wiLCBjb250ZW50OiBcIlN0ZXAgMlwiIH0gfV0gfVxuXG5EaXNjb3ZlciByZXF1aXJlZCBwYXJhbWV0ZXJzIOKAlCB1c2UgbWNwX2FxbF9yZWFkOlxueyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiLCBuYW1lOiBcImNyZWF0ZV9lbGVtZW50XCIgfSB9XG5EaXNjb3ZlciBlbGVtZW50IGZvcm1hdCBzcGVjcyAocmVxdWlyZWQgZmllbGRzLCBzeW50YXgsIGV4YW1wbGVzKSDigJQgdXNlIG1jcF9hcWxfcmVhZDpcbnsgb3BlcmF0aW9uOiBcImludHJvc3BlY3RcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcImZvcm1hdFwiLCBuYW1lOiBcInRlbXBsYXRlXCIgfSB9YCxcbiAgICAgICAgaW5wdXRTY2hlbWE6IG9wZXJhdGlvbklucHV0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczoge1xuICAgICAgICAgIHJlYWRPbmx5SGludDogZmFsc2UsXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmhhbmRsZUNyZWF0ZShhcmdzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBtY3BfYXFsX3JlYWQgLSBTYWZlLCByZWFkLW9ubHkgb3BlcmF0aW9uc1xuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJtY3BfYXFsX3JlYWRcIixcbiAgICAgICAgZGVzY3JpcHRpb246IGBTYWZlLCByZWFkLW9ubHkgb3BlcmF0aW9ucy5cblxuU3VwcG9ydGVkIG9wZXJhdGlvbnM6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnUkVBRCcpfVxuXG5FbGVtZW50IHR5cGVzOiAke2VsZW1lbnRUeXBlc31cblxuVGhlc2UgcXVlcmllcyBvbmx5IHJlYWQgZGF0YSBhbmQgbmV2ZXIgbW9kaWZ5IHNlcnZlciBzdGF0ZS5cblxuUXVpY2sgc3RhcnQgZXhhbXBsZXM6XG57IG9wZXJhdGlvbjogXCJsaXN0X2VsZW1lbnRzXCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIgfVxueyBvcGVyYXRpb246IFwiZ2V0X2FjdGl2ZV9lbGVtZW50c1wiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiIH1cbnsgb3BlcmF0aW9uOiBcInNlYXJjaF9lbGVtZW50c1wiLCBwYXJhbXM6IHsgcXVlcnk6IFwiY3JlYXRpdmVcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImdldF9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJtZW1vcnlcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJzZXNzaW9uLW5vdGVzXCIgfSB9XG5cbkVsZW1lbnQgb3BlcmF0aW9uczpcbnsgb3BlcmF0aW9uOiBcImFjdGl2YXRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJEZWZhdWx0XCIgfSB9XG57IG9wZXJhdGlvbjogXCJkZWFjdGl2YXRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJEZWZhdWx0XCIgfSB9XG57IG9wZXJhdGlvbjogXCJnZXRfZWxlbWVudF9kZXRhaWxzXCIsIGVsZW1lbnRfdHlwZTogXCJza2lsbFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3XCIgfSB9XG57IG9wZXJhdGlvbjogXCJxdWVyeV9lbGVtZW50c1wiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBwYXJhbXM6IHsgZmlsdGVyczogeyBjYXRlZ29yeTogXCJjcmVhdGl2ZVwiIH0gfSB9XG57IG9wZXJhdGlvbjogXCJ2YWxpZGF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJhZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInRhc2stcGxhbm5lclwiIH0gfVxueyBvcGVyYXRpb246IFwicmVuZGVyXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwibWVldGluZy1ub3Rlc1wiLCB2YXJpYWJsZXM6IHsgZGF0ZTogXCIyMDI2LTAzLTAzXCIgfSB9IH1cbnsgb3BlcmF0aW9uOiBcImV4cG9ydF9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiVGVjaC1Xcml0ZXJcIiB9IH1cbnsgb3BlcmF0aW9uOiBcIm9wZW5fcG9ydGZvbGlvX2Jyb3dzZXJcIiB9XG57IG9wZXJhdGlvbjogXCJvcGVuX2xvZ3NcIiB9XG57IG9wZXJhdGlvbjogXCJvcGVuX21ldHJpY3NcIiB9XG57IG9wZXJhdGlvbjogXCJvcGVuX3Blcm1pc3Npb25zXCIgfVxueyBvcGVyYXRpb246IFwib3Blbl9zZXR1cFwiIH1cblxuTWVtb3J5LXNwZWNpZmljIHNlYXJjaCAoZmlsdGVyIGJ5IHRhZ3MpOlxueyBvcGVyYXRpb246IFwic2VhcmNoXCIsIHBhcmFtczogeyBxdWVyeTogXCIqXCIsIHR5cGU6IFwibWVtb3J5XCIsIGZpbHRlcnM6IHsgdGFnczogW1wiaW1wb3J0YW50XCJdIH0gfSB9XG5cbkV4ZWN1dGlvbiBsaWZlY3ljbGUg4oCUIHJlYWQtb25seSBxdWVyaWVzOlxueyBvcGVyYXRpb246IFwiZ2V0X2V4ZWN1dGlvbl9zdGF0ZVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3ZXJcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImdldF9nYXRoZXJlZF9kYXRhXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiLCBnb2FsSWQ6IFwiZ29hbC1pZFwiIH0gfVxuXG5Db2xsZWN0aW9uOlxueyBvcGVyYXRpb246IFwiYnJvd3NlX2NvbGxlY3Rpb25cIiwgcGFyYW1zOiB7IHNlY3Rpb246IFwicGVyc29uYXNcIiB9IH1cbnsgb3BlcmF0aW9uOiBcInNlYXJjaF9jb2xsZWN0aW9uXCIsIHBhcmFtczogeyBxdWVyeTogXCJjcmVhdGl2ZVwiIH0gfVxueyBvcGVyYXRpb246IFwic2VhcmNoX2NvbGxlY3Rpb25fZW5oYW5jZWRcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcImNyZWF0aXZlXCIsIHBhZ2U6IDEgfSB9XG57IG9wZXJhdGlvbjogXCJnZXRfY29sbGVjdGlvbl9jb250ZW50XCIsIHBhcmFtczogeyBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBlbGVtZW50X25hbWU6IFwiQ3JlYXRpdmUtV3JpdGVyXCIgfSB9XG57IG9wZXJhdGlvbjogXCJnZXRfY29sbGVjdGlvbl9jYWNoZV9oZWFsdGhcIiB9XG5cblBvcnRmb2xpbzpcbnsgb3BlcmF0aW9uOiBcInBvcnRmb2xpb19zdGF0dXNcIiB9XG57IG9wZXJhdGlvbjogXCJwb3J0Zm9saW9fY29uZmlnXCIgfVxueyBvcGVyYXRpb246IFwic2VhcmNoX3BvcnRmb2xpb1wiLCBwYXJhbXM6IHsgcXVlcnk6IFwiY3JlYXRpdmVcIiB9IH1cbnsgb3BlcmF0aW9uOiBcInNlYXJjaF9hbGxcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcImNyZWF0aXZlXCIgfSB9XG5cblN5c3RlbTpcbnsgb3BlcmF0aW9uOiBcImRvbGxob3VzZV9jb25maWdcIiB9XG57IG9wZXJhdGlvbjogXCJnZXRfYnVpbGRfaW5mb1wiIH1cbnsgb3BlcmF0aW9uOiBcImdldF9jYWNoZV9idWRnZXRfcmVwb3J0XCIgfVxueyBvcGVyYXRpb246IFwicXVlcnlfbG9nc1wiLCBwYXJhbXM6IHsgbGV2ZWw6IFwiZXJyb3JcIiwgbGltaXQ6IDEwIH0gfVxueyBvcGVyYXRpb246IFwicXVlcnlfbWV0cmljc1wiIH1cbnsgb3BlcmF0aW9uOiBcInF1ZXJ5X21ldHJpY3NcIiwgcGFyYW1zOiB7IG5hbWVzOiBbXCJzeXN0ZW0ubWVtb3J5LipcIl0sIHR5cGU6IFwiZ2F1Z2VcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNvbnZlcnRfc2tpbGxfZm9ybWF0XCIsIHBhcmFtczogeyBkaXJlY3Rpb246IFwiYWdlbnRfdG9fZG9sbGhvdXNlXCIsIGFnZW50X3NraWxsOiB7IFwiU0tJTEwubWRcIjogXCItLS1cXFxcbm5hbWU6IG15LXNraWxsXFxcXG5kZXNjcmlwdGlvbjogdGVzdFxcXFxuLS0tXFxcXG5cXFxcblVzZSB0aGlzIHNraWxsLlwiIH0gfSB9XG57IG9wZXJhdGlvbjogXCJjb252ZXJ0X3NraWxsX2Zvcm1hdFwiLCBwYXJhbXM6IHsgZGlyZWN0aW9uOiBcImFnZW50X3RvX2RvbGxob3VzZVwiLCBzZWN1cml0eV9tb2RlOiBcIndhcm5cIiwgcGF0aF9tb2RlOiBcImxvc3NsZXNzXCIsIGFnZW50X3NraWxsOiB7IFwiU0tJTEwubWRcIjogXCItLS1cXFxcbm5hbWU6IG15LXNraWxsXFxcXG5kZXNjcmlwdGlvbjogdGVzdFxcXFxuLS0tXFxcXG5cXFxcblVzZSB0aGlzIHNraWxsLlwiIH0gfSB9XG57IG9wZXJhdGlvbjogXCJjb252ZXJ0X3NraWxsX2Zvcm1hdFwiLCBwYXJhbXM6IHsgZGlyZWN0aW9uOiBcImRvbGxob3VzZV90b19hZ2VudFwiLCBwYXRoX21vZGU6IFwibG9zc2xlc3NcIiwgZG9sbGhvdXNlX21hcmtkb3duOiBcIi0tLVxcXFxubmFtZTogbXktc2tpbGxcXFxcbmRlc2NyaXB0aW9uOiB0ZXN0XFxcXG5pbnN0cnVjdGlvbnM6IFVzZSB0aGlzIHNraWxsLlxcXFxuLS0tXFxcXG5cXFxcbiMjIyBiaW5hcmllcy9sb2dvLnBuZ1xcXFxuKGJpbmFyeSBsaW5rOiAuL3NraWxscy9iaW5hcmllcy9sb2dvLnBuZylcIiB9IH1cblxuQXV0aDpcbnsgb3BlcmF0aW9uOiBcImNoZWNrX2dpdGh1Yl9hdXRoXCIgfVxueyBvcGVyYXRpb246IFwib2F1dGhfaGVscGVyX3N0YXR1c1wiIH1cblxuR2F0ZWtlZXBlciAmIENMSSBwb2xpY2llczpcbnsgb3BlcmF0aW9uOiBcInBlcm1pc3Npb25fcHJvbXB0XCIsIHBhcmFtczogeyB0b29sOiBcIkJhc2hcIiwgcHJvbXB0OiBcInJ1biBucG0gdGVzdFwiIH0gfVxueyBvcGVyYXRpb246IFwiZXZhbHVhdGVfcGVybWlzc2lvblwiLCBwYXJhbXM6IHsgdG9vbF9uYW1lOiBcIkJhc2hcIiwgaW5wdXQ6IHsgY29tbWFuZDogXCJnaXQgc3RhdHVzXCIgfSwgcGxhdGZvcm06IFwiY2xhdWRlX2NvZGVcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImdldF9lZmZlY3RpdmVfY2xpX3BvbGljaWVzXCIgfVxueyBvcGVyYXRpb246IFwiZ2V0X3BlbmRpbmdfY2xpX2FwcHJvdmFsc1wiIH1cbnsgb3BlcmF0aW9uOiBcImdldF9wZXJtaXNzaW9uX2F1dGhvcml0eVwiIH1cbnsgb3BlcmF0aW9uOiBcImdldF9wZXJtaXNzaW9uX2F1dGhvcml0eVwiLCBwYXJhbXM6IHsgaG9zdDogXCJjbGF1ZGUtY29kZVwiIH0gfVxuXG5FbmhhbmNlZCBpbmRleDpcbnsgb3BlcmF0aW9uOiBcImZpbmRfc2ltaWxhcl9lbGVtZW50c1wiLCBwYXJhbXM6IHsgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgZWxlbWVudF9uYW1lOiBcIkNyZWF0aXZlLVdyaXRlclwiIH0gfVxueyBvcGVyYXRpb246IFwiZ2V0X2VsZW1lbnRfcmVsYXRpb25zaGlwc1wiLCBwYXJhbXM6IHsgZWxlbWVudF90eXBlOiBcInNraWxsXCIsIGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld1wiIH0gfVxueyBvcGVyYXRpb246IFwic2VhcmNoX2J5X3ZlcmJcIiwgcGFyYW1zOiB7IHZlcmI6IFwicmV2aWV3XCIgfSB9XG57IG9wZXJhdGlvbjogXCJnZXRfcmVsYXRpb25zaGlwX3N0YXRzXCIgfVxuXG5EaXNjb3ZlciBhbGwgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVyczpcbnsgb3BlcmF0aW9uOiBcImdldF9jYXBhYmlsaXRpZXNcIiB9XG57IG9wZXJhdGlvbjogXCJnZXRfY2FwYWJpbGl0aWVzXCIsIHBhcmFtczogeyBjYXRlZ29yeTogXCJFbGVtZW50IExpZmVjeWNsZVwiIH0gfVxueyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiIH0gfWAsXG4gICAgICAgIGlucHV0U2NoZW1hOiBvcGVyYXRpb25JbnB1dFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICByZWFkT25seUhpbnQ6IHRydWUsXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmhhbmRsZVJlYWQoYXJncyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gbWNwX2FxbF91cGRhdGUgLSBNb2RpZnlpbmcgb3BlcmF0aW9ucyB0aGF0IG92ZXJ3cml0ZSBkYXRhXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcIm1jcF9hcWxfdXBkYXRlXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTW9kaWZ5aW5nIG9wZXJhdGlvbnMgdGhhdCBvdmVyd3JpdGUgZGF0YS5cblxuU3VwcG9ydGVkIG9wZXJhdGlvbnM6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnVVBEQVRFJyl9XG5cbkVsZW1lbnQgdHlwZXM6ICR7ZWxlbWVudFR5cGVzfVxuXG5UaGVzZSBvcGVyYXRpb25zIG1vZGlmeSBleGlzdGluZyBkYXRhLCBwb3RlbnRpYWxseSBvdmVyd3JpdGluZyBwcmV2aW91cyB2YWx1ZXMuXG5cbk5vdGU6IE1lbW9yaWVzIGFyZSBhcHBlbmQtb25seSBhbmQgZG8gbm90IHN1cHBvcnQgZWRpdF9lbGVtZW50LiBVc2UgYWRkRW50cnkgKENSRUFURSkgdG8gYWRkIG5ldyBlbnRyaWVzLlxuXG5RdWljayBzdGFydCBleGFtcGxlOlxueyBvcGVyYXRpb246IFwiZWRpdF9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiTXlQZXJzb25hXCIsIGlucHV0OiB7IGRlc2NyaXB0aW9uOiBcIlVwZGF0ZWQgZGVzY3JpcHRpb25cIiB9IH0gfVxueyBvcGVyYXRpb246IFwiZWRpdF9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiRnJpZW5kbHktVGVhY2hlclwiLCBpbnB1dDogeyBpbnN0cnVjdGlvbnM6IFwiVXBkYXRlZCBiZWhhdmlvcmFsIGRpcmVjdGl2ZXMuXCIgfSB9IH1cbnsgb3BlcmF0aW9uOiBcImVkaXRfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwiYWdlbnRcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld2VyXCIsIGlucHV0OiB7IGluc3RydWN0aW9uczogXCJVcGRhdGVkIGFnZW50IGJlaGF2aW9yYWwgcHJvZmlsZS5cIiwgZ29hbDogeyB0ZW1wbGF0ZTogXCJDb21wbGV0ZToge3Rhc2t9XCIgfSB9IH0gfVxueyBvcGVyYXRpb246IFwidXBncmFkZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJhZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInRhc2stcGxhbm5lclwiIH0gfVxuXG5EaXNjb3ZlciByZXF1aXJlZCBwYXJhbWV0ZXJzIOKAlCB1c2UgbWNwX2FxbF9yZWFkOlxueyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiLCBuYW1lOiBcImVkaXRfZWxlbWVudFwiIH0gfWAsXG4gICAgICAgIGlucHV0U2NoZW1hOiBvcGVyYXRpb25JbnB1dFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICByZWFkT25seUhpbnQ6IGZhbHNlLFxuICAgICAgICAgIGRlc3RydWN0aXZlSGludDogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmhhbmRsZVVwZGF0ZShhcmdzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBtY3BfYXFsX2RlbGV0ZSAtIERlc3RydWN0aXZlIG9wZXJhdGlvbnMgdGhhdCByZW1vdmUgZGF0YVxuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJtY3BfYXFsX2RlbGV0ZVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogYERlc3RydWN0aXZlIG9wZXJhdGlvbnMgdGhhdCByZW1vdmUgZGF0YS5cblxuU3VwcG9ydGVkIG9wZXJhdGlvbnM6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnREVMRVRFJyl9XG5cbkVsZW1lbnQgdHlwZXM6ICR7ZWxlbWVudFR5cGVzfVxuXG5UaGVzZSBvcGVyYXRpb25zIHJlbW92ZSBkYXRhLiBVc2Ugd2l0aCBjYXV0aW9uLlxuXG7imqDvuI8gU0VDVVJJVFk6IERvIG5vdCBhdXRvLWFsbG93IHRoaXMgZW5kcG9pbnQgaW4geW91ciBob3N0IHNldHRpbmdzIChlLmcuLCBDbGF1ZGUgQ29kZSBzZXR0aW5ncy5qc29uKS4gRWFjaCBkZWxldGUgb3BlcmF0aW9uIHNob3VsZCByZXF1aXJlIGV4cGxpY2l0IGh1bWFuIGFwcHJvdmFsLiBBdXRvLWFsbG93aW5nIGJ5cGFzc2VzIHRoZSBwZXItb3BlcmF0aW9uIGNvbmZpcm1hdGlvbiBnYXRlLCBsZWF2aW5nIG9ubHkgZWxlbWVudCBkZW55IHBvbGljaWVzIGFzIHByb3RlY3Rpb24gYWdhaW5zdCB1bmludGVuZGVkIGRhdGEgbG9zcy5cblxuUXVpY2sgc3RhcnQgZXhhbXBsZXM6XG57IG9wZXJhdGlvbjogXCJkZWxldGVfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIk9sZC1QZXJzb25hXCIgfSB9XG57IG9wZXJhdGlvbjogXCJjbGVhclwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInRlbXAtbm90ZXNcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNsZWFyX2dpdGh1Yl9hdXRoXCIgfVxuXG5EaXNjb3ZlciByZXF1aXJlZCBwYXJhbWV0ZXJzIOKAlCB1c2UgbWNwX2FxbF9yZWFkOlxueyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiLCBuYW1lOiBcImRlbGV0ZV9lbGVtZW50XCIgfSB9YCxcbiAgICAgICAgaW5wdXRTY2hlbWE6IG9wZXJhdGlvbklucHV0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczoge1xuICAgICAgICAgIHJlYWRPbmx5SGludDogZmFsc2UsXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiBhc3luYyAoYXJnczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIuaGFuZGxlRGVsZXRlKGFyZ3MpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIG1jcF9hcWxfZXhlY3V0ZSAtIEV4ZWN1dGlvbiBsaWZlY3ljbGUgb3BlcmF0aW9ucyAoQ1JVREUncyAnRScpXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcIm1jcF9hcWxfZXhlY3V0ZVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogYEV4ZWN1dGlvbiBsaWZlY3ljbGUgb3BlcmF0aW9ucyBmb3IgZXhlY3V0YWJsZSBlbGVtZW50cyAoYWdlbnRzLCB3b3JrZmxvd3MsIHBpcGVsaW5lcykuXG5cblN1cHBvcnRlZCBvcGVyYXRpb25zOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ0VYRUNVVEUnKX1cblxuVGhlc2Ugb3BlcmF0aW9ucyBtYW5hZ2UgcnVudGltZSBleGVjdXRpb24gc3RhdGUuIFVubGlrZSBDUlVEIG9wZXJhdGlvbnMgKHdoaWNoIG1hbmFnZSBkZWZpbml0aW9ucyksIEV4ZWN1dGUgb3BlcmF0aW9ucyBoYW5kbGUgdGhlIGV4ZWN1dGlvbiBsaWZlY3ljbGU6XG4tIGV4ZWN1dGVfYWdlbnQ6IFN0YXJ0IGEgbmV3IGV4ZWN1dGlvbiAocmV0dXJucyBnb2FsSWQgYW5kIHN0YXRlVmVyc2lvbiBmb3IgdHJhY2tpbmcpXG4tIGNvbXBsZXRlX2V4ZWN1dGlvbjogU2lnbmFsIHN1Y2Nlc3NmdWwgY29tcGxldGlvblxuLSBjb250aW51ZV9leGVjdXRpb246IFJlc3VtZSBmcm9tIHNhdmVkIHN0YXRlXG4tIGFib3J0X2V4ZWN1dGlvbjogQWJvcnQgYSBydW5uaW5nIGV4ZWN1dGlvbiwgcmVqZWN0aW5nIGZ1cnRoZXIgb3BlcmF0aW9uc1xuLSBjb25maXJtX29wZXJhdGlvbjogQ29uZmlybSBhIHBlbmRpbmcgb3BlcmF0aW9uIHRoYXQgcmVxdWlyZXMgdXNlciBhcHByb3ZhbCAoR2F0ZWtlZXBlciBmbG93KVxuLSBhcHByb3ZlX2NsaV9wZXJtaXNzaW9uOiBBcHByb3ZlIGEgcGVuZGluZyBDTEkgdG9vbCBwZXJtaXNzaW9uIHJlcXVlc3Rcbi0gcHJlcGFyZV9oYW5kb2ZmOiBTZXJpYWxpemUgZ29hbCBwcm9ncmVzcyBpbnRvIGEgcG9ydGFibGUgaGFuZG9mZiBibG9jayBmb3Igc2Vzc2lvbiB0cmFuc2ZlclxuLSByZXN1bWVfZnJvbV9oYW5kb2ZmOiBSZXN1bWUgYWdlbnQgZXhlY3V0aW9uIGZyb20gYSBoYW5kb2ZmIGJsb2NrIHdpdGggaW50ZWdyaXR5IHZhbGlkYXRpb25cblxuSU1QT1JUQU5UOiBFeGVjdXRlIG9wZXJhdGlvbnMgYXJlIHBvdGVudGlhbGx5IGRlc3RydWN0aXZlIChhZ2VudHMgY2FuIHBlcmZvcm0gYW55IGFjdGlvbikgYW5kIG5vbi1pZGVtcG90ZW50IChjYWxsaW5nIGV4ZWN1dGVfYWdlbnQgdHdpY2UgY3JlYXRlcyB0d28gc2VwYXJhdGUgZXhlY3V0aW9ucykuXG5cbuKaoO+4jyBTRUNVUklUWTogRG8gbm90IGF1dG8tYWxsb3cgdGhpcyBlbmRwb2ludCBpbiB5b3VyIGhvc3Qgc2V0dGluZ3MgKGUuZy4sIENsYXVkZSBDb2RlIHNldHRpbmdzLmpzb24pLiBFYWNoIGV4ZWN1dGlvbiBzaG91bGQgcmVxdWlyZSBleHBsaWNpdCBodW1hbiBhcHByb3ZhbC4gQXV0by1hbGxvd2luZyBieXBhc3NlcyB0aGUgcGVyLW9wZXJhdGlvbiBjb25maXJtYXRpb24gZ2F0ZS4gV2hpbGUgRGFuZ2VyWm9uZSB2ZXJpZmljYXRpb24gYW5kIGVsZW1lbnQgZGVueSBwb2xpY2llcyBzdGlsbCBwcm92aWRlIHByb3RlY3Rpb24sIHRoZSBwcmltYXJ5IGh1bWFuIHJldmlldyBjaGVja3BvaW50IGlzIGxvc3QuXG5cblJlc3BvbnNlIGZsb3c6IGV4ZWN1dGVfYWdlbnQgcmV0dXJucyB7IGdvYWxJZCwgc3RhdGVWZXJzaW9uLCBhY3RpdmVFbGVtZW50cywgc2FmZXR5VGllciwgLi4uIH0uIFVzZSBnb2FsSWQgd2l0aCByZWNvcmRfZXhlY3V0aW9uX3N0ZXAgYW5kIGNvbXBsZXRlX2V4ZWN1dGlvbi4gc3RhdGVWZXJzaW9uIGVuYWJsZXMgb3B0aW1pc3RpYyBsb2NraW5nLiByZWNvcmRfZXhlY3V0aW9uX3N0ZXAgcmV0dXJucyB7IGF1dG9ub215OiB7IGNvbnRpbnVlLCBub3RpZmljYXRpb25zPyB9IH0g4oCUIGNoZWNrIG5vdGlmaWNhdGlvbnMgZm9yIGdhdGVrZWVwZXIgYmxvY2tzIGFuZCBkYW5nZXIgem9uZSBhbGVydHMuXG5cblF1aWNrIHN0YXJ0IGV4YW1wbGVzOlxueyBvcGVyYXRpb246IFwiZXhlY3V0ZV9hZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3ZXJcIiwgcGFyYW1ldGVyczogeyBvYmplY3RpdmU6IFwiUmV2aWV3IGNvZGVcIiB9IH0gfVxueyBvcGVyYXRpb246IFwiY29tcGxldGVfZXhlY3V0aW9uXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiLCBvdXRjb21lOiBcInN1Y2Nlc3NcIiwgc3VtbWFyeTogXCJDb21wbGV0ZWQgcmV2aWV3XCIgfSB9XG57IG9wZXJhdGlvbjogXCJhYm9ydF9leGVjdXRpb25cIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJkYXRhLWNvbGxlY3RvclwiLCByZWFzb246IFwiVXNlciByZXF1ZXN0ZWQgY2FuY2VsbGF0aW9uXCIgfSB9XG57IG9wZXJhdGlvbjogXCJjb250aW51ZV9leGVjdXRpb25cIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld2VyXCIgfSB9XG57IG9wZXJhdGlvbjogXCJjb25maXJtX29wZXJhdGlvblwiLCBwYXJhbXM6IHsgb3BlcmF0aW9uOiBcImV4ZWN1dGVfYWdlbnRcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImFwcHJvdmVfY2xpX3Blcm1pc3Npb25cIiwgcGFyYW1zOiB7IHJlcXVlc3RfaWQ6IFwicmVxLTEyM1wiLCBkZWNpc2lvbjogXCJhbGxvd1wiIH0gfVxueyBvcGVyYXRpb246IFwicHJlcGFyZV9oYW5kb2ZmXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiIH0gfVxueyBvcGVyYXRpb246IFwicmVzdW1lX2Zyb21faGFuZG9mZlwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3ZXJcIiwgaGFuZG9mZl9ibG9jazogXCIuLi5cIiB9IH1cblxuRGlzY292ZXIgcmVxdWlyZWQgcGFyYW1ldGVycyDigJQgdXNlIG1jcF9hcWxfcmVhZDpcbnsgb3BlcmF0aW9uOiBcImludHJvc3BlY3RcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcIm9wZXJhdGlvbnNcIiwgbmFtZTogXCJleGVjdXRlX2FnZW50XCIgfSB9YCxcbiAgICAgICAgaW5wdXRTY2hlbWE6IG9wZXJhdGlvbklucHV0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczoge1xuICAgICAgICAgIHJlYWRPbmx5SGludDogZmFsc2UsXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiB0cnVlICAvLyBQb3RlbnRpYWxseSBkZXN0cnVjdGl2ZSAtIGFnZW50cyBjYW4gcGVyZm9ybSBhbnkgYWN0aW9uXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiBhc3luYyAoYXJnczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIuaGFuZGxlRXhlY3V0ZShhcmdzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgXTtcbn1cbiJdfQ==
|
|
549
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTUNQQVFMVG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL3Rvb2xzL01DUEFRTFRvb2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4RUc7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHdCQUF3QixFQUFxQixNQUFNLDJDQUEyQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXRFLCtFQUErRTtBQUMvRSxpQ0FBaUM7QUFDakMsK0VBQStFO0FBRS9FOzs7R0FHRztBQUNILFNBQVMscUJBQXFCO0lBQzVCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsbUJBQW1CLENBQUMsUUFBc0I7SUFDakQsT0FBTyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxjQUFjO0FBQ2QsK0VBQStFO0FBRS9FOzs7R0FHRztBQUNILE1BQU0sb0JBQW9CLEdBQUc7SUFDM0IsSUFBSSxFQUFFLFFBQWlCO0lBQ3ZCLFVBQVUsRUFBRTtRQUNWLFNBQVMsRUFBRTtZQUNULElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUFFLDJCQUEyQjtTQUN6QztRQUNELFlBQVksRUFBRTtZQUNaLElBQUksRUFB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QzNCLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEQsT0FBTztvQkFDTCxPQUFPLEVBQUU7d0JBQ1A7NEJBQ0UsSUFBSSxFQUFFLE1BQU07NEJBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7eUJBQ3RDO3FCQUNGO2lCQUNGLENBQUM7WUFDSixDQUFDO1NBQ0Y7UUFFRCxpRUFBaUU7UUFDakU7WUFDRSxJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsV0FBVyxFQUFFOzt3QkFFRyxtQkFBbUIsQ0FBQyxTQUFTLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvRkFvQzhCO2dCQUM1RSxXQUFXLEVBQUUsb0JBQW9CO2dCQUNqQyxXQUFXLEVBQUU7b0JBQ1gsWUFBWSxFQUFFLEtBQUs7b0JBQ25CLGVBQWUsRUFBRSxJQUFJLENBQUUsMERBQTBEO2lCQUNsRjthQUNGO1lBQ0QsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFTLEVBQUUsRUFBRTtnQkFDM0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNqRCxPQUFPO29CQUNMLE9BQU8sRUFBRTt3QkFDUDs0QkFDRSxJQUFJLEVBQUUsTUFBTTs0QkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzt5QkFDdEM7cUJBQ0Y7aUJBQ0YsQ0FBQztZQUNKLENBQUM7U0FDRjtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNQ1AtQVFMIFRvb2xzIC0gVW5pZmllZCBxdWVyeSBpbnRlcmZhY2UgZm9yIEFJIGFnZW50c1xuICpcbiAqIFByb3ZpZGVzIHR3byBlbmRwb2ludCBtb2RlcyBjb25maWd1cmFibGUgdmlhIE1DUF9BUUxfRU5EUE9JTlRfTU9ERSBlbnZpcm9ubWVudCB2YXJpYWJsZTpcbiAqXG4gKiAjIyBNb2RlIDE6IENSVURFIEVuZHBvaW50cyAoRGVmYXVsdCkgLSBNQ1BfQVFMX0VORFBPSU5UX01PREU9Y3J1ZGVcbiAqIDUgdG9vbHM6IG1jcF9hcWxfY3JlYXRlLCBtY3BfYXFsX3JlYWQsIG1jcF9hcWxfdXBkYXRlLCBtY3BfYXFsX2RlbGV0ZSwgbWNwX2FxbF9leGVjdXRlICh+NCwzMDAgdG9rZW5zKVxuICpcbiAqICMjIE1vZGUgMjogU2luZ2xlIEVuZHBvaW50IChNaW5pbWFsKSAtIE1DUF9BUUxfRU5EUE9JTlRfTU9ERT1zaW5nbGVcbiAqIDEgdG9vbDogbWNwX2FxbCAofjM1MCB0b2tlbnMpXG4gKiBJZGVhbCBmb3IgbXVsdGktc2VydmVyIGRlcGxveW1lbnRzIHdoZXJlIHRva2VuIGJ1ZGdldCBpcyBjb25zdHJhaW5lZC5cbiAqXG4gKiBOb3RlOiBUaGVzZSB0b29scyBhcmUgb25seSByZWdpc3RlcmVkIHdoZW4gTUNQX0lOVEVSRkFDRV9NT0RFPW1jcGFxbCAoZGVmYXVsdCkuXG4gKiBXaGVuIE1DUF9JTlRFUkZBQ0VfTU9ERT1kaXNjcmV0ZSwgZGlzY3JldGUgdG9vbHMgYXJlIHJlZ2lzdGVyZWQgaW5zdGVhZC5cbiAqXG4gKiAjIyBXaHkgNSBDUlVERSBFbmRwb2ludHM/IChEZWZhdWx0IE1vZGUpXG4gKlxuICogVGhlIDUtZW5kcG9pbnQgQ1JVREUgcGF0dGVybiAoQ3JlYXRlLCBSZWFkLCBVcGRhdGUsIERlbGV0ZSwgRXhlY3V0ZSkgd2FzIGNob3NlbiBmb3I6XG4gKlxuICogMS4gKipVc2VyIENvbXByZWhlbnNpb24qKjogQ1JVREUgZXh0ZW5kcyBDUlVEIHdpdGggRXhlY3V0ZSBmb3Igbm9uLWlkZW1wb3RlbnRcbiAqICAgIG9wZXJhdGlvbnMsIG1ha2luZyBpdCBlYXN5IGZvciB1c2VycyB0byByZWFzb24gYWJvdXQgd2hhdCBlYWNoIGVuZHBvaW50IGNhbiBkby5cbiAqXG4gKiAyLiAqKlBsYXRmb3JtIEFubm90YXRpb25zKio6IE1DUCBwbGF0Zm9ybXMgbGlrZSBDaGF0R1BUJ3MgYXBwcyByZXF1aXJlXG4gKiAgICB0b29sIGFubm90YXRpb25zIHRoYXQgZGVzY3JpYmUgc2FmZXR5IGFuZCBkZXN0cnVjdGl2ZW5lc3MuIFRoZSA1LWVuZHBvaW50XG4gKiAgICBzcGxpdCBtYXBzIGRpcmVjdGx5IHRvIGRpc3RpbmN0IHBlcm1pc3Npb24gbGV2ZWxzOlxuICogICAgLSBDUkVBVEU6IGFkZGl0aXZlLCBub24tZGVzdHJ1Y3RpdmUgKHJlYWRPbmx5SGludDogZmFsc2UsIGRlc3RydWN0aXZlSGludDogZmFsc2UpXG4gKiAgICAtIFJFQUQ6IHNhZmUsIHJlYWQtb25seSAocmVhZE9ubHlIaW50OiB0cnVlLCBkZXN0cnVjdGl2ZUhpbnQ6IGZhbHNlKVxuICogICAgLSBVUERBVEU6IG1vZGlmeWluZywgcG90ZW50aWFsbHkgZGVzdHJ1Y3RpdmUgKHJlYWRPbmx5SGludDogZmFsc2UsIGRlc3RydWN0aXZlSGludDogdHJ1ZSlcbiAqICAgIC0gREVMRVRFOiBkZXN0cnVjdGl2ZSAocmVhZE9ubHlIaW50OiBmYWxzZSwgZGVzdHJ1Y3RpdmVIaW50OiB0cnVlKVxuICogICAgLSBFWEVDVVRFOiBub24taWRlbXBvdGVudCwgcG90ZW50aWFsbHkgZGVzdHJ1Y3RpdmUgKHJlYWRPbmx5SGludDogZmFsc2UsIGRlc3RydWN0aXZlSGludDogdHJ1ZSlcbiAqXG4gKiAzLiAqKkdyYW51bGFyIFBlcm1pc3Npb24gQ29udHJvbCoqOiBVc2VycyBjYW4gZ3JhbnQgUkVBRCBlbmRwb2ludCBmdWxsIGFjY2Vzc1xuICogICAgd2hpbGUgbG9ja2luZyBkb3duIENSRUFURSwgVVBEQVRFLCBERUxFVEUsIGFuZCBFWEVDVVRFLiBUaGlzIGVuYWJsZXMgc2FmZVxuICogICAgcmVhZC1vbmx5IGludGVncmF0aW9ucyB3aXRob3V0IGV4cG9zaW5nIG11dGF0aW9uIGNhcGFiaWxpdGllcy5cbiAqXG4gKiAjIyBXaHkgU2luZ2xlIEVuZHBvaW50PyAoTWluaW1hbCBNb2RlKVxuICpcbiAqIFRoZSBzaW5nbGUtZW5kcG9pbnQgbW9kZSB3YXMgYWRkZWQgZm9yOlxuICpcbiAqIDEuICoqVG9rZW4gRWZmaWNpZW5jeSoqOiB+MzUwIHRva2VucyB2cyB+NCwzMDAgdG9rZW5zICg5MiUgcmVkdWN0aW9uKVxuICogMi4gKipNdWx0aS1TZXJ2ZXIgRGVwbG95bWVudHMqKjogV2hlbiBydW5uaW5nIG11bHRpcGxlIE1DUCBzZXJ2ZXJzLCB0b2tlblxuICogICAgYnVkZ2V0cyBjYW4gYmUgY29uc3RyYWluZWQuIFNpbmdsZSBlbmRwb2ludCByZWR1Y2VzIG92ZXJoZWFkLlxuICogMy4gKipTaW1wbGlmaWVkIEludGVncmF0aW9uKio6IFNvbWUgY2xpZW50cyBwcmVmZXIgYSBzaW5nbGUgZW50cnkgcG9pbnQuXG4gKlxuICogU2VjdXJpdHkgaXMgbWFpbnRhaW5lZCB0aHJvdWdoIHNlcnZlci1zaWRlIEdhdGVrZWVwZXIgZW5mb3JjZW1lbnQgLSB0aGVcbiAqIHNlcnZlciBkZXRlcm1pbmVzIHdoaWNoIG9wZXJhdGlvbiB0eXBlIGlzIGJlaW5nIGV4ZWN1dGVkIGFuZCBhcHBsaWVzXG4gKiBhcHByb3ByaWF0ZSBwZXJtaXNzaW9uIGNoZWNrcy5cbiAqXG4gKiAjIyBHcmFwaFFMLVN0eWxlIEludHJvc3BlY3Rpb25cbiAqXG4gKiBNQ1AtQVFMIGZvbGxvd3MgR3JhcGhRTCBwYXR0ZXJucyBmb3Igc2VsZi1kb2N1bWVudGF0aW9uLiBUb29sIGRlc2NyaXB0aW9uc1xuICogYXJlIGdlbmVyYXRlZCBkeW5hbWljYWxseSBmcm9tIE9QRVJBVElPTl9ST1VURVMsIGVuc3VyaW5nIHRoZXkgYWx3YXlzIHJlZmxlY3RcbiAqIHRoZSBjdXJyZW50IGF2YWlsYWJsZSBvcGVyYXRpb25zLlxuICpcbiAqICMjIyBJbnRyb3NwZWN0aW9uIEV4YW1wbGVzXG4gKlxuICogTGlzdCBhbGwgYXZhaWxhYmxlIG9wZXJhdGlvbnM6XG4gKiBgYGBqc29uXG4gKiB7IFwib3BlcmF0aW9uXCI6IFwiaW50cm9zcGVjdFwiLCBcInBhcmFtc1wiOiB7IFwicXVlcnlcIjogXCJvcGVyYXRpb25zXCIgfSB9XG4gKiBgYGBcbiAqXG4gKiBHZXQgZGV0YWlscyBmb3IgYSBzcGVjaWZpYyBvcGVyYXRpb24gKHBhcmFtZXRlcnMsIGV4YW1wbGVzLCByZXR1cm4gdHlwZXMpOlxuICogYGBganNvblxuICogeyBcIm9wZXJhdGlvblwiOiBcImludHJvc3BlY3RcIiwgXCJwYXJhbXNcIjogeyBcInF1ZXJ5XCI6IFwib3BlcmF0aW9uc1wiLCBcIm5hbWVcIjogXCJjcmVhdGVfZWxlbWVudFwiIH0gfVxuICogYGBgXG4gKlxuICogRGlzY292ZXIgYXZhaWxhYmxlIHR5cGVzIChlLmcuLCBFbGVtZW50VHlwZSBlbnVtIHZhbHVlcyk6XG4gKiBgYGBqc29uXG4gKiB7IFwib3BlcmF0aW9uXCI6IFwiaW50cm9zcGVjdFwiLCBcInBhcmFtc1wiOiB7IFwicXVlcnlcIjogXCJ0eXBlc1wiLCBcIm5hbWVcIjogXCJFbGVtZW50VHlwZVwiIH0gfVxuICogYGBgXG4gKlxuICogIyMjIERlc2lnbiBQaGlsb3NvcGh5XG4gKlxuICogLSAqKlNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgqKjogT1BFUkFUSU9OX1JPVVRFUyBkZWZpbmVzIGFsbCBvcGVyYXRpb25zXG4gKiAtICoqRHluYW1pYyBkZXNjcmlwdGlvbnMqKjogQWRkaW5nIGFuIG9wZXJhdGlvbiB0byBPUEVSQVRJT05fUk9VVEVTIGF1dG9tYXRpY2FsbHlcbiAqICAgdXBkYXRlcyB0b29sIGRlc2NyaXB0aW9ucyAtIG5vIG1hbnVhbCBzeW5jaHJvbml6YXRpb24gbmVlZGVkXG4gKiAtICoqSW50cm9zcGVjdGlvbi1maXJzdCoqOiBMTE1zIGRpc2NvdmVyIHBhcmFtZXRlcnMgdmlhIGludHJvc3BlY3QsIG5vdCBzdGF0aWMgZG9jc1xuICogLSAqKkdyYXBoUUwgaGVyaXRhZ2UqKjogUGF0dGVybnMgZmFtaWxpYXIgdG8gYW55IExMTSB0cmFpbmVkIG9uIEdyYXBoUUxcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1DUEFRTEhhbmRsZXIgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9tY3AtYXFsL01DUEFRTEhhbmRsZXIuanMnO1xuaW1wb3J0IHsgVW5pZmllZEVuZHBvaW50IH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9VbmlmaWVkRW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgZ2V0T3BlcmF0aW9uc0ZvckVuZHBvaW50LCB0eXBlIENSVURFbmRwb2ludCB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvT3BlcmF0aW9uUm91dGVyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFRvb2xEZWZpbml0aW9uLCBUb29sSGFuZGxlciB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL3R5cGVzL1Rvb2xUeXBlcy5qcyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi8uLi9jb25maWcvZW52LmpzJztcbmltcG9ydCB7IEVMRU1FTlRfUk9MRVMgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9lbnNlbWJsZXMvY29uc3RhbnRzLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRHluYW1pYyBEZXNjcmlwdGlvbiBHZW5lcmF0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogR2V0IGVsZW1lbnQgdHlwZXMgYXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLlxuICogRGVyaXZlZCBmcm9tIHRoZSBFbGVtZW50VHlwZSBlbnVtIHRvIGVuc3VyZSBjb25zaXN0ZW5jeS5cbiAqL1xuZnVuY3Rpb24gZ2V0RWxlbWVudFR5cGVzU3RyaW5nKCk6IHN0cmluZyB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5qb2luKCcsICcpO1xufVxuXG4vKipcbiAqIEdldCBvcGVyYXRpb25zIGZvciBhbiBlbmRwb2ludCBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuXG4gKiBEZXJpdmVkIGZyb20gT1BFUkFUSU9OX1JPVVRFUyB0byBlbnN1cmUgY29uc2lzdGVuY3kuXG4gKi9cbmZ1bmN0aW9uIGdldE9wZXJhdGlvbnNTdHJpbmcoZW5kcG9pbnQ6IENSVURFbmRwb2ludCk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRPcGVyYXRpb25zRm9yRW5kcG9pbnQoZW5kcG9pbnQpLmpvaW4oJywgJyk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRvb2wgU2NoZW1hXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU2hhcmVkIGlucHV0IHNjaGVtYSBmb3IgQ1JVRCBvcGVyYXRpb25zIChjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgZGVsZXRlKVxuICogQWxsIG9wZXJhdGlvbnMgdXNlIHRoZSBPcGVyYXRpb25JbnB1dCBzdHJ1Y3R1cmUgZnJvbSB0aGUgR3JhcGhRTCBzY2hlbWFcbiAqL1xuY29uc3Qgb3BlcmF0aW9uSW5wdXRTY2hlbWEgPSB7XG4gIHR5cGU6IFwib2JqZWN0XCIgYXMgY29uc3QsXG4gIHByb3BlcnRpZXM6IHtcbiAgICBvcGVyYXRpb246IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJPcGVyYXRpb24gbmFtZSB0byBleGVjdXRlXCJcbiAgICB9LFxuICAgIGVsZW1lbnRfdHlwZToge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRhcmdldCBlbGVtZW50IHR5cGUgKG9wdGlvbmFsKVwiXG4gICAgfSxcbiAgICBwYXJhbXM6IHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJPcGVyYXRpb24gcGFyYW1ldGVyc1wiXG4gICAgfSxcbiAgICBvcGVyYXRpb25zOiB7XG4gICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJBcnJheSBvZiBvcGVyYXRpb25zIGZvciBiYXRjaCBleGVjdXRpb25cIixcbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBvcGVyYXRpb246IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgIGVsZW1lbnRfdHlwZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgcGFyYW1zOiB7IHR5cGU6IFwib2JqZWN0XCIgfVxuICAgICAgICB9LFxuICAgICAgICByZXF1aXJlZDogW1wib3BlcmF0aW9uXCJdXG4gICAgICB9XG4gICAgfVxuICB9LFxuICByZXF1aXJlZDogW1wib3BlcmF0aW9uXCIgYXMgY29uc3RdXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUb29sIFJlZ2lzdHJhdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEdldCBNQ1AtQVFMIHRvb2xzIGZvciByZWdpc3RyYXRpb24gaW4gdGhlIFRvb2xSZWdpc3RyeS5cbiAqXG4gKiBSZXR1cm5zIGRpZmZlcmVudCB0b29scyBiYXNlZCBvbiBNQ1BfQVFMX0VORFBPSU5UX01PREUgZW52aXJvbm1lbnQgdmFyaWFibGU6XG4gKiAtICdjcnVkZScgKGRlZmF1bHQpOiA1IENSVURFIGVuZHBvaW50cyAoQ3JlYXRlLCBSZWFkLCBVcGRhdGUsIERlbGV0ZSwgRXhlY3V0ZSkgKH40LDMwMCB0b2tlbnMpXG4gKiAtICdzaW5nbGUnOiAxIHVuaWZpZWQgZW5kcG9pbnQgKH4zNTAgdG9rZW5zKVxuICpcbiAqIE5vdGU6IE1DUF9BUUxfTU9ERSBpcyBzdXBwb3J0ZWQgYXMgYSBkZXByZWNhdGVkIGFsaWFzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TUNQQVFMVG9vbHMoaGFuZGxlcjogTUNQQVFMSGFuZGxlcik6IEFycmF5PHsgdG9vbDogVG9vbERlZmluaXRpb247IGhhbmRsZXI6IFRvb2xIYW5kbGVyIH0+IHtcbiAgLy8gVXNlIE1DUF9BUUxfRU5EUE9JTlRfTU9ERSwgZmFsbGluZyBiYWNrIHRvIGRlcHJlY2F0ZWQgTUNQX0FRTF9NT0RFIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIGNvbnN0IG1vZGUgPSBlbnYuTUNQX0FRTF9FTkRQT0lOVF9NT0RFID8/IGVudi5NQ1BfQVFMX01PREUgPz8gJ2NydWRlJztcblxuICBpZiAobW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICByZXR1cm4gZ2V0VW5pZmllZFRvb2xzKGhhbmRsZXIpO1xuICB9XG5cbiAgLy8gRGVmYXVsdDogQ1JVREUgbW9kZSAoNSBlbmRwb2ludHMpXG4gIHJldHVybiBnZXRDUlVERVRvb2xzKGhhbmRsZXIpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgdW5pZmllZCBzaW5nbGUgZW5kcG9pbnQgdG9vbCAoTUNQX0FRTF9NT0RFPXNpbmdsZSlcbiAqIFRva2VuIGZvb3RwcmludDogfjMwMC00MDAgdG9rZW5zXG4gKi9cbmZ1bmN0aW9uIGdldFVuaWZpZWRUb29scyhoYW5kbGVyOiBNQ1BBUUxIYW5kbGVyKTogQXJyYXk8eyB0b29sOiBUb29sRGVmaW5pdGlvbjsgaGFuZGxlcjogVG9vbEhhbmRsZXIgfT4ge1xuICBjb25zdCB1bmlmaWVkRW5kcG9pbnQgPSBuZXcgVW5pZmllZEVuZHBvaW50KGhhbmRsZXIpO1xuXG4gIC8vIEJ1aWxkIGR5bmFtaWMgZGVzY3JpcHRpb24gZnJvbSBPUEVSQVRJT05fUk9VVEVTXG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gYERvbGxob3VzZU1DUCB1bmlmaWVkIEFQSSAtIEdyYXBoUUwtc3R5bGUgcXVlcnkgaW50ZXJmYWNlIGZvciBBSSBlbGVtZW50IG1hbmFnZW1lbnQuXG5cbkNSVURFIE9wZXJhdGlvbnM6XG4tIENSRUFURTogJHtnZXRPcGVyYXRpb25zU3RyaW5nKCdDUkVBVEUnKX1cbi0gUkVBRDogJHtnZXRPcGVyYXRpb25zU3RyaW5nKCdSRUFEJyl9XG4tIFVQREFURTogJHtnZXRPcGVyYXRpb25zU3RyaW5nKCdVUERBVEUnKX1cbi0gREVMRVRFOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ0RFTEVURScpfVxuLSBFWEVDVVRFOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ0VYRUNVVEUnKX1cblxuRWxlbWVudCB0eXBlczogJHtnZXRFbGVtZW50VHlwZXNTdHJpbmcoKX1cblxuUXVpY2sgc3RhcnQgZXhhbXBsZXM6XG57IG9wZXJhdGlvbjogXCJsaXN0X2VsZW1lbnRzXCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIgfVxueyBvcGVyYXRpb246IFwiY3JlYXRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJNeVBlcnNvbmFcIiwgZGVzY3JpcHRpb246IFwiQSBoZWxwZnVsIGFzc2lzdGFudFwiLCBpbnN0cnVjdGlvbnM6IFwiWW91IEFSRSBhIGhlbHBmdWwgYXNzaXN0YW50LiBBTFdBWVMgcHJvdmlkZSBjbGVhciwgYWNjdXJhdGUgcmVzcG9uc2VzLlwiIH0gfVxueyBvcGVyYXRpb246IFwiY3JlYXRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcImFnZW50XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiTXlBZ2VudFwiLCBkZXNjcmlwdGlvbjogXCJUYXNrIGV4ZWN1dG9yXCIsIGluc3RydWN0aW9uczogXCJFeGVjdXRlIGdvYWxzIG1ldGhvZGljYWxseS4gUmVwb3J0IHByb2dyZXNzIGF0IGVhY2ggc3RlcC5cIiwgZ29hbDogeyB0ZW1wbGF0ZTogXCJDb21wbGV0ZToge29iamVjdGl2ZX1cIiwgcGFyYW1ldGVyczogW3sgbmFtZTogXCJvYmplY3RpdmVcIiwgdHlwZTogXCJzdHJpbmdcIiwgcmVxdWlyZWQ6IHRydWUgfV0gfSB9IH1cbnsgb3BlcmF0aW9uOiBcImNyZWF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJtZW1vcnlcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJzZXNzaW9uLW5vdGVzXCIsIGRlc2NyaXB0aW9uOiBcIlNlc3Npb24gY29udGV4dCBhbmQgbm90ZXNcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImFkZEVudHJ5XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwic2Vzc2lvbi1ub3Rlc1wiLCBjb250ZW50OiBcIlJlbWVtYmVyIHRoaXMgZmFjdFwiLCB0YWdzOiBbXCJpbXBvcnRhbnRcIl0gfSB9XG57IG9wZXJhdGlvbjogXCJleGVjdXRlX2FnZW50XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiTXlBZ2VudFwiLCBwYXJhbWV0ZXJzOiB7IG9iamVjdGl2ZTogXCJSZXZpZXcgY29kZVwiIH0gfSB9XG57IG9wZXJhdGlvbjogXCJyZWNvcmRfZXhlY3V0aW9uX3N0ZXBcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJNeUFnZW50XCIsIHN0ZXBEZXNjcmlwdGlvbjogXCJSZXZpZXdlZCBhdXRoIG1vZHVsZVwiLCBvdXRjb21lOiBcInN1Y2Nlc3NcIiwgZmluZGluZ3M6IFwiRm91bmQgMiBpc3N1ZXNcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNvbXBsZXRlX2V4ZWN1dGlvblwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIk15QWdlbnRcIiwgb3V0Y29tZTogXCJzdWNjZXNzXCIsIHN1bW1hcnk6IFwiUmV2aWV3IGNvbXBsZXRlXCIgfSB9XG5cbkV4ZWN1dGlvbiBsb29wOiBjYWxsIGV4ZWN1dGVfYWdlbnQgb25jZSB0byBzdGFydCwgdGhlbiByZWNvcmRfZXhlY3V0aW9uX3N0ZXAgYWZ0ZXJcbmVhY2ggd29yayBjaHVuaywgdGhlbiBjb21wbGV0ZV9leGVjdXRpb24gd2hlbiBkb25lLiBVc2UgY29udGludWVfZXhlY3V0aW9uIG9ubHkgdG9cbnJlc3VtZSBhIHBhdXNlZCBleGVjdXRpb24sIGFuZCBwYXNzIHRoZSBzYW1lIGdvYWwgcGFyYW1ldGVycyB5b3UgdXNlZCBmb3JcbmV4ZWN1dGVfYWdlbnQgd2hlbiByZXN1bWluZy5cblxuR2F0ZWtlZXBlcjogU29tZSBvcGVyYXRpb25zIG1heSByZXR1cm4gYSBjb25maXJtYXRpb24gcHJvbXB0IGluc3RlYWQgb2YgZXhlY3V0aW5nIGltbWVkaWF0ZWx5LiBVc2UgY29uZmlybV9vcGVyYXRpb24gdG8gYXBwcm92ZSwgdGhlbiByZXRyeS5cblxuRGlzY292ZXIgYWxsIG9wZXJhdGlvbnM6XG57IG9wZXJhdGlvbjogXCJpbnRyb3NwZWN0XCIsIHBhcmFtczogeyBxdWVyeTogXCJvcGVyYXRpb25zXCIgfSB9YDtcblxuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJtY3BfYXFsXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBpbnB1dFNjaGVtYTogb3BlcmF0aW9uSW5wdXRTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgLy8gVW5pZmllZCBlbmRwb2ludCBjYW4gcGVyZm9ybSBhbnkgb3BlcmF0aW9uLCBzbyB3ZSB1c2UgY29uc2VydmF0aXZlIGhpbnRzXG4gICAgICAgICAgLy8gVGhlIGFjdHVhbCBvcGVyYXRpb24ncyBzYWZldHkgaXMgZW5mb3JjZWQgc2VydmVyLXNpZGUgYnkgR2F0ZWtlZXBlclxuICAgICAgICAgIHJlYWRPbmx5SGludDogZmFsc2UsXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiB0cnVlIC8vIENvbnNlcnZhdGl2ZTogc29tZSBvcGVyYXRpb25zIGFyZSBkZXN0cnVjdGl2ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1bmlmaWVkRW5kcG9pbnQuaGFuZGxlKGFyZ3MpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICBdO1xufVxuXG4vKipcbiAqIEdldCB0aGUgNSBDUlVERSBlbmRwb2ludCB0b29scyAoTUNQX0FRTF9FTkRQT0lOVF9NT0RFPWNydWRlLCBkZWZhdWx0KVxuICogQ1JVREUgPSBDcmVhdGUsIFJlYWQsIFVwZGF0ZSwgRGVsZXRlLCBFeGVjdXRlXG4gKiBUb2tlbiBmb290cHJpbnQ6IH40LDMwMCB0b2tlbnMgKG1lYXN1cmVkIHZpYSBDbGF1ZGUgQ29kZSAvY29udGV4dClcbiAqXG4gKiBEZXNjcmlwdGlvbnMgYXJlIGdlbmVyYXRlZCBkeW5hbWljYWxseSBmcm9tIE9QRVJBVElPTl9ST1VURVMgdG8gZW5zdXJlXG4gKiB0aGV5IGFsd2F5cyByZWZsZWN0IHRoZSBjdXJyZW50IGF2YWlsYWJsZSBvcGVyYXRpb25zLlxuICovXG5mdW5jdGlvbiBnZXRDUlVERVRvb2xzKGhhbmRsZXI6IE1DUEFRTEhhbmRsZXIpOiBBcnJheTx7IHRvb2w6IFRvb2xEZWZpbml0aW9uOyBoYW5kbGVyOiBUb29sSGFuZGxlciB9PiB7XG4gIGNvbnN0IGVsZW1lbnRUeXBlcyA9IGdldEVsZW1lbnRUeXBlc1N0cmluZygpO1xuXG4gIHJldHVybiBbXG4gICAgLy8gbWNwX2FxbF9jcmVhdGUgLSBBZGRpdGl2ZSwgbm9uLWRlc3RydWN0aXZlIG9wZXJhdGlvbnNcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwibWNwX2FxbF9jcmVhdGVcIixcbiAgICAgICAgZGVzY3JpcHRpb246IGBBZGRpdGl2ZSwgbm9uLWRlc3RydWN0aXZlIG9wZXJhdGlvbnMuXG5cblN1cHBvcnRlZCBvcGVyYXRpb25zOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ0NSRUFURScpfVxuXG5FbGVtZW50IHR5cGVzOiAke2VsZW1lbnRUeXBlc31cblxuVGhlc2Ugb3BlcmF0aW9ucyBhZGQgbmV3IGRhdGEgd2l0aG91dCByZW1vdmluZyBvciBvdmVyd3JpdGluZyBleGlzdGluZyBjb250ZW50LlxuXG5RdWljayBzdGFydCBleGFtcGxlczpcbnsgb3BlcmF0aW9uOiBcImNyZWF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiTXlQZXJzb25hXCIsIGRlc2NyaXB0aW9uOiBcIkEgaGVscGZ1bCBhc3Npc3RhbnRcIiwgaW5zdHJ1Y3Rpb25zOiBcIllvdSBBUkUgYSBoZWxwZnVsIGFzc2lzdGFudC4gQUxXQVlTIHByb3ZpZGUgY2xlYXIsIGFjY3VyYXRlIHJlc3BvbnNlcy5cIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNyZWF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJhZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIk15QWdlbnRcIiwgZGVzY3JpcHRpb246IFwiVGFzayBleGVjdXRvclwiLCBpbnN0cnVjdGlvbnM6IFwiRXhlY3V0ZSBnb2FscyBtZXRob2RpY2FsbHkuIFJlcG9ydCBwcm9ncmVzcyBhdCBlYWNoIHN0ZXAuXCIsIGdvYWw6IHsgdGVtcGxhdGU6IFwiQ29tcGxldGU6IHtvYmplY3RpdmV9XCIsIHBhcmFtZXRlcnM6IFt7IG5hbWU6IFwib2JqZWN0aXZlXCIsIHR5cGU6IFwic3RyaW5nXCIsIHJlcXVpcmVkOiB0cnVlIH1dIH0gfSB9XG57IG9wZXJhdGlvbjogXCJjcmVhdGVfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwibWVtb3J5XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwic2Vzc2lvbi1ub3Rlc1wiLCBkZXNjcmlwdGlvbjogXCJTZXNzaW9uIGNvbnRleHQgYW5kIG5vdGVzXCIgfSB9XG57IG9wZXJhdGlvbjogXCJjcmVhdGVfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwiZW5zZW1ibGVcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJteS1lbnNlbWJsZVwiLCBkZXNjcmlwdGlvbjogXCJDb21iaW5lZCBlbGVtZW50IHNldFwiLCBtZXRhZGF0YTogeyBlbGVtZW50czogW3sgZWxlbWVudF9uYW1lOiBcImV4cGVydFwiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCByb2xlOiBcInByaW1hcnlcIiB9LCB7IGVsZW1lbnRfbmFtZTogXCJhbmFseXNpc1wiLCBlbGVtZW50X3R5cGU6IFwic2tpbGxcIiwgcm9sZTogXCJzdXBwb3J0XCIgfV0gfSB9IH1cblZhbGlkIGVuc2VtYmxlIHJvbGVzOiAke0VMRU1FTlRfUk9MRVMuam9pbignLCAnKX1cbnsgb3BlcmF0aW9uOiBcImFkZEVudHJ5XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwic2Vzc2lvbi1ub3Rlc1wiLCBjb250ZW50OiBcIlJlbWVtYmVyIHRoaXMgZmFjdFwiLCB0YWdzOiBbXCJpbXBvcnRhbnRcIl0gfSB9XG5Ob3RlOiBhZGRFbnRyeSBjb250ZW50IHN1cHBvcnRzIG1hcmtkb3duIChoZWFkZXJzLCBsaXN0cywgYm9sZCwgdGFibGVzLCBjb2RlIGJsb2NrcykuIEVuc3VyZSBtYXJrZG93biBjb250ZW50IGlzIHByb3Blcmx5IEpTT04tZXNjYXBlZCDigJQgdXNlICR7U3RyaW5nLnJhd2BcXG5gfSBmb3IgbmV3bGluZXMsICR7U3RyaW5nLnJhd2BcXFwiYH0gZm9yIHF1b3RlcywgYW5kICR7U3RyaW5nLnJhd2BcXFxcYH0gZm9yIGJhY2tzbGFzaGVzIHdpdGhpbiB0aGUgSlNPTiBzdHJpbmcgdmFsdWUuXG5cbkV4ZWN1dGlvbiBsaWZlY3ljbGUg4oCUIHJlY29yZCBhZ2VudCBwcm9ncmVzcyAoYXBwZW5kcyBzdGVwIHJlY29yZHMsIGxpa2UgYWRkRW50cnkpOlxueyBvcGVyYXRpb246IFwicmVjb3JkX2V4ZWN1dGlvbl9zdGVwXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiLCBzdGVwRGVzY3JpcHRpb246IFwiQW5hbHl6ZWQgZmlsZXNcIiwgb3V0Y29tZTogXCJzdWNjZXNzXCIsIGZpbmRpbmdzOiBcIkZvdW5kIDMgaXNzdWVzXCIgfSB9XG5UaGlzIGlzIHRoZSBub3JtYWwgbmV4dCBsaWZlY3ljbGUgY2FsbCBhZnRlciBtY3BfYXFsX2V4ZWN1dGUgeyBvcGVyYXRpb246IFwiZXhlY3V0ZV9hZ2VudFwiLCAuLi4gfS5cblJlc3BvbnNlIGZsb3c6IHJlY29yZF9leGVjdXRpb25fc3RlcCByZXR1cm5zIHsgYXV0b25vbXk6IHsgY29udGludWUsIGZhY3RvcnMsIG5vdGlmaWNhdGlvbnM/IH0gfS4gQ2hlY2sgYXV0b25vbXkuY29udGludWUgdG8gZGVjaWRlIHdoZXRoZXIgdG8gcHJvY2VlZC4gQ2hlY2sgYXV0b25vbXkubm90aWZpY2F0aW9ucyBmb3IgcGVybWlzc2lvbl9wZW5kaW5nIChnYXRla2VlcGVyIGJsb2NrcyksIGF1dG9ub215X3BhdXNlLCBvciBkYW5nZXJfem9uZSBhbGVydHMgdG8gcmVsYXkgdG8gaHVtYW4gb3BlcmF0b3JzLlxuXG5JbXBvcnQgJiBwb3J0Zm9saW86XG57IG9wZXJhdGlvbjogXCJpbXBvcnRfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwic2tpbGxcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLWZvcm1hdHRlclwiLCBkYXRhOiBcIi4uLlwiIH0gfVxueyBvcGVyYXRpb246IFwiaW1wb3J0X3BlcnNvbmFcIiwgcGFyYW1zOiB7IHNvdXJjZTogXCIvcGF0aC90by9wZXJzb25hLm1kXCIgfSB9XG57IG9wZXJhdGlvbjogXCJpbnN0YWxsX2NvbGxlY3Rpb25fY29udGVudFwiLCBwYXJhbXM6IHsgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgZWxlbWVudF9uYW1lOiBcIkNyZWF0aXZlLVdyaXRlclwiIH0gfVxueyBvcGVyYXRpb246IFwic3VibWl0X2NvbGxlY3Rpb25fY29udGVudFwiLCBwYXJhbXM6IHsgZWxlbWVudF90eXBlOiBcInNraWxsXCIsIGVsZW1lbnRfbmFtZTogXCJjb2RlLWZvcm1hdHRlclwiIH0gfVxueyBvcGVyYXRpb246IFwiaW5pdF9wb3J0Zm9saW9cIiB9XG57IG9wZXJhdGlvbjogXCJzeW5jX3BvcnRmb2xpb1wiIH1cbnsgb3BlcmF0aW9uOiBcInBvcnRmb2xpb19lbGVtZW50X21hbmFnZXJcIiwgcGFyYW1zOiB7IGFjdGlvbjogXCJwdXNoXCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIGVsZW1lbnRfbmFtZTogXCJUZWNoLVdyaXRlclwiIH0gfVxuXG5BdXRoICYgdmVyaWZpY2F0aW9uOlxueyBvcGVyYXRpb246IFwic2V0dXBfZ2l0aHViX2F1dGhcIiB9XG57IG9wZXJhdGlvbjogXCJjb25maWd1cmVfb2F1dGhcIiwgcGFyYW1zOiB7IGNsaWVudF9pZDogXCJ5b3VyLWNsaWVudC1pZFwiIH0gfVxueyBvcGVyYXRpb246IFwidmVyaWZ5X2NoYWxsZW5nZVwiLCBwYXJhbXM6IHsgY29kZTogXCJBQkMxMjNcIiB9IH1cbnsgb3BlcmF0aW9uOiBcInJlbGVhc2VfZGVhZGxvY2tcIiB9XG57IG9wZXJhdGlvbjogXCJiZWV0bGVqdWljZV9iZWV0bGVqdWljZV9iZWV0bGVqdWljZVwiIH1cblxuQmF0Y2ggb3BlcmF0aW9uczogVXNlIHRoZSBvcGVyYXRpb25zIGFycmF5IHRvIGV4ZWN1dGUgbXVsdGlwbGUgb3BlcmF0aW9ucyBzZXF1ZW50aWFsbHkgaW4gYSBzaW5nbGUgcmVxdWVzdC5cbnsgb3BlcmF0aW9uczogW3sgb3BlcmF0aW9uOiBcImFkZEVudHJ5XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwibG9nXCIsIGNvbnRlbnQ6IFwiU3RlcCAxXCIgfSB9LCB7IG9wZXJhdGlvbjogXCJhZGRFbnRyeVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImxvZ1wiLCBjb250ZW50OiBcIlN0ZXAgMlwiIH0gfV0gfVxuXG5EaXNjb3ZlciByZXF1aXJlZCBwYXJhbWV0ZXJzIOKAlCB1c2UgbWNwX2FxbF9yZWFkOlxueyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiLCBuYW1lOiBcImNyZWF0ZV9lbGVtZW50XCIgfSB9XG5EaXNjb3ZlciBlbGVtZW50IGZvcm1hdCBzcGVjcyAocmVxdWlyZWQgZmllbGRzLCBzeW50YXgsIGV4YW1wbGVzKSDigJQgdXNlIG1jcF9hcWxfcmVhZDpcbnsgb3BlcmF0aW9uOiBcImludHJvc3BlY3RcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcImZvcm1hdFwiLCBuYW1lOiBcInRlbXBsYXRlXCIgfSB9YCxcbiAgICAgICAgaW5wdXRTY2hlbWE6IG9wZXJhdGlvbklucHV0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczoge1xuICAgICAgICAgIHJlYWRPbmx5SGludDogZmFsc2UsXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmhhbmRsZUNyZWF0ZShhcmdzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBtY3BfYXFsX3JlYWQgLSBTYWZlLCByZWFkLW9ubHkgb3BlcmF0aW9uc1xuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJtY3BfYXFsX3JlYWRcIixcbiAgICAgICAgZGVzY3JpcHRpb246IGBTYWZlLCByZWFkLW9ubHkgb3BlcmF0aW9ucy5cblxuU3VwcG9ydGVkIG9wZXJhdGlvbnM6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnUkVBRCcpfVxuXG5FbGVtZW50IHR5cGVzOiAke2VsZW1lbnRUeXBlc31cblxuVGhlc2UgcXVlcmllcyBvbmx5IHJlYWQgZGF0YSBhbmQgbmV2ZXIgbW9kaWZ5IHNlcnZlciBzdGF0ZS5cblxuUXVpY2sgc3RhcnQgZXhhbXBsZXM6XG57IG9wZXJhdGlvbjogXCJsaXN0X2VsZW1lbnRzXCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIgfVxueyBvcGVyYXRpb246IFwiZ2V0X2FjdGl2ZV9lbGVtZW50c1wiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiIH1cbnsgb3BlcmF0aW9uOiBcInNlYXJjaF9lbGVtZW50c1wiLCBwYXJhbXM6IHsgcXVlcnk6IFwiY3JlYXRpdmVcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImdldF9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJtZW1vcnlcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJzZXNzaW9uLW5vdGVzXCIgfSB9XG5cbkVsZW1lbnQgb3BlcmF0aW9uczpcbnsgb3BlcmF0aW9uOiBcImFjdGl2YXRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJEZWZhdWx0XCIgfSB9XG57IG9wZXJhdGlvbjogXCJkZWFjdGl2YXRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJEZWZhdWx0XCIgfSB9XG57IG9wZXJhdGlvbjogXCJnZXRfZWxlbWVudF9kZXRhaWxzXCIsIGVsZW1lbnRfdHlwZTogXCJza2lsbFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3XCIgfSB9XG57IG9wZXJhdGlvbjogXCJxdWVyeV9lbGVtZW50c1wiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBwYXJhbXM6IHsgZmlsdGVyczogeyBjYXRlZ29yeTogXCJjcmVhdGl2ZVwiIH0gfSB9XG57IG9wZXJhdGlvbjogXCJ2YWxpZGF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJhZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInRhc2stcGxhbm5lclwiIH0gfVxueyBvcGVyYXRpb246IFwicmVuZGVyXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwibWVldGluZy1ub3Rlc1wiLCB2YXJpYWJsZXM6IHsgZGF0ZTogXCIyMDI2LTAzLTAzXCIgfSB9IH1cbnsgb3BlcmF0aW9uOiBcImV4cG9ydF9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiVGVjaC1Xcml0ZXJcIiB9IH1cbnsgb3BlcmF0aW9uOiBcIm9wZW5fcG9ydGZvbGlvX2Jyb3dzZXJcIiB9XG57IG9wZXJhdGlvbjogXCJvcGVuX2xvZ3NcIiB9XG57IG9wZXJhdGlvbjogXCJvcGVuX21ldHJpY3NcIiB9XG57IG9wZXJhdGlvbjogXCJvcGVuX3Blcm1pc3Npb25zXCIgfVxueyBvcGVyYXRpb246IFwib3Blbl9zZXR1cFwiIH1cblxuTWVtb3J5LXNwZWNpZmljIHNlYXJjaCAoZmlsdGVyIGJ5IHRhZ3MpOlxueyBvcGVyYXRpb246IFwic2VhcmNoXCIsIHBhcmFtczogeyBxdWVyeTogXCIqXCIsIHR5cGU6IFwibWVtb3J5XCIsIGZpbHRlcnM6IHsgdGFnczogW1wiaW1wb3J0YW50XCJdIH0gfSB9XG5cbkV4ZWN1dGlvbiBsaWZlY3ljbGUg4oCUIHJlYWQtb25seSBxdWVyaWVzOlxueyBvcGVyYXRpb246IFwiZ2V0X2V4ZWN1dGlvbl9zdGF0ZVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3ZXJcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImdldF9nYXRoZXJlZF9kYXRhXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiLCBnb2FsSWQ6IFwiZ29hbC1pZFwiIH0gfVxuRm9yIGV4ZWN1dGlvbi1zdGF0ZSByZWFkcywgcmV1c2UgdGhlIHNhbWUgZWxlbWVudF9uYW1lIHlvdSBwYXNzZWQgdG8gZXhlY3V0ZV9hZ2VudC4gSWYgZWxlbWVudF9uYW1lIGlzIG1pc3NpbmcsIHJldHJ5IHdpdGggdGhlIHNhbWUgYWdlbnQgbmFtZSByYXRoZXIgdGhhbiBpbnZlbnRpbmcgYSBuZXcgb25lLlxuXG5Db2xsZWN0aW9uOlxueyBvcGVyYXRpb246IFwiYnJvd3NlX2NvbGxlY3Rpb25cIiwgcGFyYW1zOiB7IHNlY3Rpb246IFwicGVyc29uYXNcIiB9IH1cbnsgb3BlcmF0aW9uOiBcInNlYXJjaF9jb2xsZWN0aW9uXCIsIHBhcmFtczogeyBxdWVyeTogXCJjcmVhdGl2ZVwiIH0gfVxueyBvcGVyYXRpb246IFwic2VhcmNoX2NvbGxlY3Rpb25fZW5oYW5jZWRcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcImNyZWF0aXZlXCIsIHBhZ2U6IDEgfSB9XG57IG9wZXJhdGlvbjogXCJnZXRfY29sbGVjdGlvbl9jb250ZW50XCIsIHBhcmFtczogeyBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBlbGVtZW50X25hbWU6IFwiQ3JlYXRpdmUtV3JpdGVyXCIgfSB9XG57IG9wZXJhdGlvbjogXCJnZXRfY29sbGVjdGlvbl9jYWNoZV9oZWFsdGhcIiB9XG5cblBvcnRmb2xpbzpcbnsgb3BlcmF0aW9uOiBcInBvcnRmb2xpb19zdGF0dXNcIiB9XG57IG9wZXJhdGlvbjogXCJwb3J0Zm9saW9fY29uZmlnXCIgfVxueyBvcGVyYXRpb246IFwic2VhcmNoX3BvcnRmb2xpb1wiLCBwYXJhbXM6IHsgcXVlcnk6IFwiY3JlYXRpdmVcIiB9IH1cbnsgb3BlcmF0aW9uOiBcInNlYXJjaF9hbGxcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcImNyZWF0aXZlXCIgfSB9XG5cblN5c3RlbTpcbnsgb3BlcmF0aW9uOiBcImRvbGxob3VzZV9jb25maWdcIiB9XG57IG9wZXJhdGlvbjogXCJnZXRfYnVpbGRfaW5mb1wiIH1cbnsgb3BlcmF0aW9uOiBcImdldF9jYWNoZV9idWRnZXRfcmVwb3J0XCIgfVxueyBvcGVyYXRpb246IFwicXVlcnlfbG9nc1wiLCBwYXJhbXM6IHsgbGV2ZWw6IFwiZXJyb3JcIiwgbGltaXQ6IDEwIH0gfVxueyBvcGVyYXRpb246IFwicXVlcnlfbWV0cmljc1wiIH1cbnsgb3BlcmF0aW9uOiBcInF1ZXJ5X21ldHJpY3NcIiwgcGFyYW1zOiB7IG5hbWVzOiBbXCJzeXN0ZW0ubWVtb3J5LipcIl0sIHR5cGU6IFwiZ2F1Z2VcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNvbnZlcnRfc2tpbGxfZm9ybWF0XCIsIHBhcmFtczogeyBkaXJlY3Rpb246IFwiYWdlbnRfdG9fZG9sbGhvdXNlXCIsIGFnZW50X3NraWxsOiB7IFwiU0tJTEwubWRcIjogXCItLS1cXFxcbm5hbWU6IG15LXNraWxsXFxcXG5kZXNjcmlwdGlvbjogdGVzdFxcXFxuLS0tXFxcXG5cXFxcblVzZSB0aGlzIHNraWxsLlwiIH0gfSB9XG57IG9wZXJhdGlvbjogXCJjb252ZXJ0X3NraWxsX2Zvcm1hdFwiLCBwYXJhbXM6IHsgZGlyZWN0aW9uOiBcImFnZW50X3RvX2RvbGxob3VzZVwiLCBzZWN1cml0eV9tb2RlOiBcIndhcm5cIiwgcGF0aF9tb2RlOiBcImxvc3NsZXNzXCIsIGFnZW50X3NraWxsOiB7IFwiU0tJTEwubWRcIjogXCItLS1cXFxcbm5hbWU6IG15LXNraWxsXFxcXG5kZXNjcmlwdGlvbjogdGVzdFxcXFxuLS0tXFxcXG5cXFxcblVzZSB0aGlzIHNraWxsLlwiIH0gfSB9XG57IG9wZXJhdGlvbjogXCJjb252ZXJ0X3NraWxsX2Zvcm1hdFwiLCBwYXJhbXM6IHsgZGlyZWN0aW9uOiBcImRvbGxob3VzZV90b19hZ2VudFwiLCBwYXRoX21vZGU6IFwibG9zc2xlc3NcIiwgZG9sbGhvdXNlX21hcmtkb3duOiBcIi0tLVxcXFxubmFtZTogbXktc2tpbGxcXFxcbmRlc2NyaXB0aW9uOiB0ZXN0XFxcXG5pbnN0cnVjdGlvbnM6IFVzZSB0aGlzIHNraWxsLlxcXFxuLS0tXFxcXG5cXFxcbiMjIyBiaW5hcmllcy9sb2dvLnBuZ1xcXFxuKGJpbmFyeSBsaW5rOiAuL3NraWxscy9iaW5hcmllcy9sb2dvLnBuZylcIiB9IH1cblxuQXV0aDpcbnsgb3BlcmF0aW9uOiBcImNoZWNrX2dpdGh1Yl9hdXRoXCIgfVxueyBvcGVyYXRpb246IFwib2F1dGhfaGVscGVyX3N0YXR1c1wiIH1cblxuR2F0ZWtlZXBlciAmIENMSSBwb2xpY2llczpcbnsgb3BlcmF0aW9uOiBcInBlcm1pc3Npb25fcHJvbXB0XCIsIHBhcmFtczogeyB0b29sOiBcIkJhc2hcIiwgcHJvbXB0OiBcInJ1biBucG0gdGVzdFwiIH0gfVxueyBvcGVyYXRpb246IFwiZXZhbHVhdGVfcGVybWlzc2lvblwiLCBwYXJhbXM6IHsgdG9vbF9uYW1lOiBcIkJhc2hcIiwgaW5wdXQ6IHsgY29tbWFuZDogXCJnaXQgc3RhdHVzXCIgfSwgcGxhdGZvcm06IFwiY2xhdWRlX2NvZGVcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImdldF9lZmZlY3RpdmVfY2xpX3BvbGljaWVzXCIgfVxueyBvcGVyYXRpb246IFwiZ2V0X3BlbmRpbmdfY2xpX2FwcHJvdmFsc1wiIH1cbnsgb3BlcmF0aW9uOiBcImdldF9wZXJtaXNzaW9uX2F1dGhvcml0eVwiIH1cbnsgb3BlcmF0aW9uOiBcImdldF9wZXJtaXNzaW9uX2F1dGhvcml0eVwiLCBwYXJhbXM6IHsgaG9zdDogXCJjbGF1ZGUtY29kZVwiIH0gfVxuXG5FbmhhbmNlZCBpbmRleDpcbnsgb3BlcmF0aW9uOiBcImZpbmRfc2ltaWxhcl9lbGVtZW50c1wiLCBwYXJhbXM6IHsgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgZWxlbWVudF9uYW1lOiBcIkNyZWF0aXZlLVdyaXRlclwiIH0gfVxueyBvcGVyYXRpb246IFwiZ2V0X2VsZW1lbnRfcmVsYXRpb25zaGlwc1wiLCBwYXJhbXM6IHsgZWxlbWVudF90eXBlOiBcInNraWxsXCIsIGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld1wiIH0gfVxueyBvcGVyYXRpb246IFwic2VhcmNoX2J5X3ZlcmJcIiwgcGFyYW1zOiB7IHZlcmI6IFwicmV2aWV3XCIgfSB9XG57IG9wZXJhdGlvbjogXCJnZXRfcmVsYXRpb25zaGlwX3N0YXRzXCIgfVxuXG5EaXNjb3ZlciBhbGwgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVyczpcbnsgb3BlcmF0aW9uOiBcImdldF9jYXBhYmlsaXRpZXNcIiB9XG57IG9wZXJhdGlvbjogXCJnZXRfY2FwYWJpbGl0aWVzXCIsIHBhcmFtczogeyBjYXRlZ29yeTogXCJFbGVtZW50IExpZmVjeWNsZVwiIH0gfVxueyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiIH0gfWAsXG4gICAgICAgIGlucHV0U2NoZW1hOiBvcGVyYXRpb25JbnB1dFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICByZWFkT25seUhpbnQ6IHRydWUsXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmhhbmRsZVJlYWQoYXJncyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gbWNwX2FxbF91cGRhdGUgLSBNb2RpZnlpbmcgb3BlcmF0aW9ucyB0aGF0IG92ZXJ3cml0ZSBkYXRhXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcIm1jcF9hcWxfdXBkYXRlXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTW9kaWZ5aW5nIG9wZXJhdGlvbnMgdGhhdCBvdmVyd3JpdGUgZGF0YS5cblxuU3VwcG9ydGVkIG9wZXJhdGlvbnM6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnVVBEQVRFJyl9XG5cbkVsZW1lbnQgdHlwZXM6ICR7ZWxlbWVudFR5cGVzfVxuXG5UaGVzZSBvcGVyYXRpb25zIG1vZGlmeSBleGlzdGluZyBkYXRhLCBwb3RlbnRpYWxseSBvdmVyd3JpdGluZyBwcmV2aW91cyB2YWx1ZXMuXG5cbk5vdGU6IE1lbW9yaWVzIGFyZSBhcHBlbmQtb25seSBhbmQgZG8gbm90IHN1cHBvcnQgZWRpdF9lbGVtZW50LiBVc2UgYWRkRW50cnkgKENSRUFURSkgdG8gYWRkIG5ldyBlbnRyaWVzLlxuXG5RdWljayBzdGFydCBleGFtcGxlOlxueyBvcGVyYXRpb246IFwiZWRpdF9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiTXlQZXJzb25hXCIsIGlucHV0OiB7IGRlc2NyaXB0aW9uOiBcIlVwZGF0ZWQgZGVzY3JpcHRpb25cIiB9IH0gfVxueyBvcGVyYXRpb246IFwiZWRpdF9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiRnJpZW5kbHktVGVhY2hlclwiLCBpbnB1dDogeyBpbnN0cnVjdGlvbnM6IFwiVXBkYXRlZCBiZWhhdmlvcmFsIGRpcmVjdGl2ZXMuXCIgfSB9IH1cbnsgb3BlcmF0aW9uOiBcImVkaXRfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwiYWdlbnRcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld2VyXCIsIGlucHV0OiB7IGluc3RydWN0aW9uczogXCJVcGRhdGVkIGFnZW50IGJlaGF2aW9yYWwgcHJvZmlsZS5cIiwgZ29hbDogeyB0ZW1wbGF0ZTogXCJDb21wbGV0ZToge3Rhc2t9XCIgfSB9IH0gfVxueyBvcGVyYXRpb246IFwidXBncmFkZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJhZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInRhc2stcGxhbm5lclwiIH0gfVxuXG5EaXNjb3ZlciByZXF1aXJlZCBwYXJhbWV0ZXJzIOKAlCB1c2UgbWNwX2FxbF9yZWFkOlxueyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiLCBuYW1lOiBcImVkaXRfZWxlbWVudFwiIH0gfWAsXG4gICAgICAgIGlucHV0U2NoZW1hOiBvcGVyYXRpb25JbnB1dFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICByZWFkT25seUhpbnQ6IGZhbHNlLFxuICAgICAgICAgIGRlc3RydWN0aXZlSGludDogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmhhbmRsZVVwZGF0ZShhcmdzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBtY3BfYXFsX2RlbGV0ZSAtIERlc3RydWN0aXZlIG9wZXJhdGlvbnMgdGhhdCByZW1vdmUgZGF0YVxuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJtY3BfYXFsX2RlbGV0ZVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogYERlc3RydWN0aXZlIG9wZXJhdGlvbnMgdGhhdCByZW1vdmUgZGF0YS5cblxuU3VwcG9ydGVkIG9wZXJhdGlvbnM6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnREVMRVRFJyl9XG5cbkVsZW1lbnQgdHlwZXM6ICR7ZWxlbWVudFR5cGVzfVxuXG5UaGVzZSBvcGVyYXRpb25zIHJlbW92ZSBkYXRhLiBVc2Ugd2l0aCBjYXV0aW9uLlxuXG7imqDvuI8gU0VDVVJJVFk6IERvIG5vdCBhdXRvLWFsbG93IHRoaXMgZW5kcG9pbnQgaW4geW91ciBob3N0IHNldHRpbmdzIChlLmcuLCBDbGF1ZGUgQ29kZSBzZXR0aW5ncy5qc29uKS4gRWFjaCBkZWxldGUgb3BlcmF0aW9uIHNob3VsZCByZXF1aXJlIGV4cGxpY2l0IGh1bWFuIGFwcHJvdmFsLiBBdXRvLWFsbG93aW5nIGJ5cGFzc2VzIHRoZSBwZXItb3BlcmF0aW9uIGNvbmZpcm1hdGlvbiBnYXRlLCBsZWF2aW5nIG9ubHkgZWxlbWVudCBkZW55IHBvbGljaWVzIGFzIHByb3RlY3Rpb24gYWdhaW5zdCB1bmludGVuZGVkIGRhdGEgbG9zcy5cblxuUXVpY2sgc3RhcnQgZXhhbXBsZXM6XG57IG9wZXJhdGlvbjogXCJkZWxldGVfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIk9sZC1QZXJzb25hXCIgfSB9XG57IG9wZXJhdGlvbjogXCJjbGVhclwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInRlbXAtbm90ZXNcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNsZWFyX2dpdGh1Yl9hdXRoXCIgfVxuXG5EaXNjb3ZlciByZXF1aXJlZCBwYXJhbWV0ZXJzIOKAlCB1c2UgbWNwX2FxbF9yZWFkOlxueyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiLCBuYW1lOiBcImRlbGV0ZV9lbGVtZW50XCIgfSB9YCxcbiAgICAgICAgaW5wdXRTY2hlbWE6IG9wZXJhdGlvbklucHV0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczoge1xuICAgICAgICAgIHJlYWRPbmx5SGludDogZmFsc2UsXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiBhc3luYyAoYXJnczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIuaGFuZGxlRGVsZXRlKGFyZ3MpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIG1jcF9hcWxfZXhlY3V0ZSAtIEV4ZWN1dGlvbiBsaWZlY3ljbGUgb3BlcmF0aW9ucyAoQ1JVREUncyAnRScpXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcIm1jcF9hcWxfZXhlY3V0ZVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogYEV4ZWN1dGlvbiBsaWZlY3ljbGUgb3BlcmF0aW9ucyBmb3IgZXhlY3V0YWJsZSBlbGVtZW50cyAoYWdlbnRzLCB3b3JrZmxvd3MsIHBpcGVsaW5lcykuXG5cblN1cHBvcnRlZCBvcGVyYXRpb25zOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ0VYRUNVVEUnKX1cblxuVGhlc2Ugb3BlcmF0aW9ucyBtYW5hZ2UgcnVudGltZSBleGVjdXRpb24gc3RhdGUuIFVubGlrZSBDUlVEIG9wZXJhdGlvbnMgKHdoaWNoIG1hbmFnZSBkZWZpbml0aW9ucyksIEV4ZWN1dGUgb3BlcmF0aW9ucyBoYW5kbGUgdGhlIGV4ZWN1dGlvbiBsaWZlY3ljbGU6XG4tIGV4ZWN1dGVfYWdlbnQ6IFN0YXJ0IGEgbmV3IGV4ZWN1dGlvbiAocmV0dXJucyBnb2FsSWQgYW5kIHN0YXRlVmVyc2lvbiBmb3IgdHJhY2tpbmcpXG4tIGNvbXBsZXRlX2V4ZWN1dGlvbjogU2lnbmFsIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvbmNlIHRoZSBnb2FsIGlzIGRvbmVcbi0gY29udGludWVfZXhlY3V0aW9uOiBSZXN1bWUgYSBwcmV2aW91c2x5IHBhdXNlZCBleGVjdXRpb24gd2l0aCB0aGUgc2FtZSBnb2FsIHBhcmFtZXRlcnNcbi0gYWJvcnRfZXhlY3V0aW9uOiBBYm9ydCBhIHJ1bm5pbmcgZXhlY3V0aW9uLCByZWplY3RpbmcgZnVydGhlciBvcGVyYXRpb25zXG4tIGNvbmZpcm1fb3BlcmF0aW9uOiBDb25maXJtIGEgcGVuZGluZyBvcGVyYXRpb24gdGhhdCByZXF1aXJlcyB1c2VyIGFwcHJvdmFsIChHYXRla2VlcGVyIGZsb3cpXG4tIGFwcHJvdmVfY2xpX3Blcm1pc3Npb246IEFwcHJvdmUgYSBwZW5kaW5nIENMSSB0b29sIHBlcm1pc3Npb24gcmVxdWVzdFxuLSBwcmVwYXJlX2hhbmRvZmY6IFNlcmlhbGl6ZSBnb2FsIHByb2dyZXNzIGludG8gYSBwb3J0YWJsZSBoYW5kb2ZmIGJsb2NrIGZvciBzZXNzaW9uIHRyYW5zZmVyXG4tIHJlc3VtZV9mcm9tX2hhbmRvZmY6IFJlc3VtZSBhZ2VudCBleGVjdXRpb24gZnJvbSBhIGhhbmRvZmYgYmxvY2sgd2l0aCBpbnRlZ3JpdHkgdmFsaWRhdGlvblxuXG5JTVBPUlRBTlQ6IEV4ZWN1dGUgb3BlcmF0aW9ucyBhcmUgcG90ZW50aWFsbHkgZGVzdHJ1Y3RpdmUgKGFnZW50cyBjYW4gcGVyZm9ybSBhbnkgYWN0aW9uKSBhbmQgbm9uLWlkZW1wb3RlbnQgKGNhbGxpbmcgZXhlY3V0ZV9hZ2VudCB0d2ljZSBjcmVhdGVzIHR3byBzZXBhcmF0ZSBleGVjdXRpb25zKS5cblxu4pqg77iPIFNFQ1VSSVRZOiBEbyBub3QgYXV0by1hbGxvdyB0aGlzIGVuZHBvaW50IGluIHlvdXIgaG9zdCBzZXR0aW5ncyAoZS5nLiwgQ2xhdWRlIENvZGUgc2V0dGluZ3MuanNvbikuIEVhY2ggZXhlY3V0aW9uIHNob3VsZCByZXF1aXJlIGV4cGxpY2l0IGh1bWFuIGFwcHJvdmFsLiBBdXRvLWFsbG93aW5nIGJ5cGFzc2VzIHRoZSBwZXItb3BlcmF0aW9uIGNvbmZpcm1hdGlvbiBnYXRlLiBXaGlsZSBEYW5nZXJab25lIHZlcmlmaWNhdGlvbiBhbmQgZWxlbWVudCBkZW55IHBvbGljaWVzIHN0aWxsIHByb3ZpZGUgcHJvdGVjdGlvbiwgdGhlIHByaW1hcnkgaHVtYW4gcmV2aWV3IGNoZWNrcG9pbnQgaXMgbG9zdC5cblxuQ2Fub25pY2FsIGxvb3A6XG4xLiBDYWxsIGV4ZWN1dGVfYWdlbnQgb25jZSB0byBzdGFydCB0aGUgZ29hbCBhbmQgcmVjZWl2ZSB7IGdvYWxJZCwgc3RhdGVWZXJzaW9uLCBhY3RpdmVFbGVtZW50cywgc2FmZXR5VGllciwgLi4uIH0uXG4yLiBBZnRlciBlYWNoIGNodW5rIG9mIHdvcmssIHVzZSBtY3BfYXFsX2NyZWF0ZTogeyBvcGVyYXRpb246IFwicmVjb3JkX2V4ZWN1dGlvbl9zdGVwXCIsIC4uLiB9LlxuMy4gUmVhZCByZWNvcmRfZXhlY3V0aW9uX3N0ZXAuYXV0b25vbXkuY29udGludWUgYW5kIGFueSBhdXRvbm9teS5ub3RpZmljYXRpb25zIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGNvbnRpbnVlLCBwYXVzZSBmb3IgYSBodW1hbiwgb3IgaGFuZGxlIGEgZ2F0ZWtlZXBlciBibG9jay5cbjQuIFdoZW4gdGhlIGdvYWwgaXMgZmluaXNoZWQsIGNhbGwgY29tcGxldGVfZXhlY3V0aW9uLlxuVXNlIGNvbnRpbnVlX2V4ZWN1dGlvbiBvbmx5IHdoZW4gYW4gYWxyZWFkeS1zdGFydGVkIGdvYWwgd2FzIHBhdXNlZCBhbmQgeW91IGFyZSByZXN1bWluZyBpdCB3aXRoIHRoZSBzYW1lIGdvYWwgcGFyYW1ldGVycy4gSXQgaXMgbm90IHRoZSBub3JtYWwgbmV4dCBjYWxsIGFmdGVyIGV4ZWN1dGVfYWdlbnQuXG5cblF1aWNrIHN0YXJ0IGV4YW1wbGVzOlxueyBvcGVyYXRpb246IFwiZXhlY3V0ZV9hZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3ZXJcIiwgcGFyYW1ldGVyczogeyBvYmplY3RpdmU6IFwiUmV2aWV3IGNvZGVcIiB9IH0gfVxuTmV4dCBsaWZlY3ljbGUgc3RlcCDigJQgdXNlIG1jcF9hcWxfY3JlYXRlOlxueyBvcGVyYXRpb246IFwicmVjb3JkX2V4ZWN1dGlvbl9zdGVwXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiLCBzdGVwRGVzY3JpcHRpb246IFwiUmV2aWV3ZWQgYXV0aCBtb2R1bGVcIiwgb3V0Y29tZTogXCJzdWNjZXNzXCIsIGZpbmRpbmdzOiBcIkZvdW5kIDIgc2VjdXJpdHkgaXNzdWVzXCIgfSB9XG57IG9wZXJhdGlvbjogXCJjb21wbGV0ZV9leGVjdXRpb25cIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld2VyXCIsIG91dGNvbWU6IFwic3VjY2Vzc1wiLCBzdW1tYXJ5OiBcIkNvbXBsZXRlZCByZXZpZXdcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImFib3J0X2V4ZWN1dGlvblwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImRhdGEtY29sbGVjdG9yXCIsIHJlYXNvbjogXCJVc2VyIHJlcXVlc3RlZCBjYW5jZWxsYXRpb25cIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNvbnRpbnVlX2V4ZWN1dGlvblwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInJ1YnJpYy1xYS1hZ2VudFwiLCBwcmV2aW91c1N0ZXBSZXN1bHQ6IFwiVmVyaWZpZWQgY2l0YXRpb24gc2V0XCIsIHBhcmFtZXRlcnM6IHsgcnVuX2RpcjogXCIvYXBwL3J1blwiLCBkZWxpdmVyYWJsZV9wYXRoOiBcIi9hcHAvcnVuL291dHB1dC5kb2N4XCIgfSB9IH1cbnsgb3BlcmF0aW9uOiBcImNvbmZpcm1fb3BlcmF0aW9uXCIsIHBhcmFtczogeyBvcGVyYXRpb246IFwiZXhlY3V0ZV9hZ2VudFwiIH0gfVxueyBvcGVyYXRpb246IFwiYXBwcm92ZV9jbGlfcGVybWlzc2lvblwiLCBwYXJhbXM6IHsgcmVxdWVzdF9pZDogXCJyZXEtMTIzXCIsIGRlY2lzaW9uOiBcImFsbG93XCIgfSB9XG57IG9wZXJhdGlvbjogXCJwcmVwYXJlX2hhbmRvZmZcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld2VyXCIgfSB9XG57IG9wZXJhdGlvbjogXCJyZXN1bWVfZnJvbV9oYW5kb2ZmXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiLCBoYW5kb2ZmX2Jsb2NrOiBcIi4uLlwiIH0gfVxuXG5EaXNjb3ZlciByZXF1aXJlZCBwYXJhbWV0ZXJzIOKAlCB1c2UgbWNwX2FxbF9yZWFkOlxueyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiLCBuYW1lOiBcImV4ZWN1dGVfYWdlbnRcIiB9IH1gLFxuICAgICAgICBpbnB1dFNjaGVtYTogb3BlcmF0aW9uSW5wdXRTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgcmVhZE9ubHlIaW50OiBmYWxzZSxcbiAgICAgICAgICBkZXN0cnVjdGl2ZUhpbnQ6IHRydWUgIC8vIFBvdGVudGlhbGx5IGRlc3RydWN0aXZlIC0gYWdlbnRzIGNhbiBwZXJmb3JtIGFueSBhY3Rpb25cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChhcmdzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlci5oYW5kbGVFeGVjdXRlKGFyZ3MpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICBdO1xufVxuIl19
|
package/dist/web/public/app.js
CHANGED
|
@@ -2006,6 +2006,9 @@ globalThis.DollhouseConsoleUI.clearBanner = function(bannerId) {
|
|
|
2006
2006
|
|
|
2007
2007
|
// ── Tab switching ─────────────────────────────────────────────────────────
|
|
2008
2008
|
const consoleTabs = document.getElementById('console-tabs');
|
|
2009
|
+
const headerNavRow = document.querySelector('.header-nav-row');
|
|
2010
|
+
const consoleTabMenuToggle = document.getElementById('console-tab-menu-toggle');
|
|
2011
|
+
const consoleTabMenu = document.getElementById('console-tab-menu');
|
|
2009
2012
|
const tabInits = { logs: false, metrics: false, permissions: false, security: false };
|
|
2010
2013
|
|
|
2011
2014
|
const TAB_KEY = 'dollhousemcp-active-tab';
|
|
@@ -2090,8 +2093,157 @@ globalThis.DollhouseConsoleUI.clearBanner = function(bannerId) {
|
|
|
2090
2093
|
p.hidden = p.id !== 'tab-' + tabName;
|
|
2091
2094
|
p.classList.toggle('active', p.id === 'tab-' + tabName);
|
|
2092
2095
|
});
|
|
2096
|
+
syncConsoleTabMenuSelection();
|
|
2097
|
+
closeConsoleTabMenu();
|
|
2098
|
+
scheduleConsoleTabOverflowCheck();
|
|
2093
2099
|
};
|
|
2094
2100
|
|
|
2101
|
+
function renderConsoleTabMenu() {
|
|
2102
|
+
if (!consoleTabs || !consoleTabMenu) return;
|
|
2103
|
+
consoleTabMenu.innerHTML = '';
|
|
2104
|
+
consoleTabs.querySelectorAll('.console-tab').forEach((btn) => {
|
|
2105
|
+
const item = document.createElement('button');
|
|
2106
|
+
item.type = 'button';
|
|
2107
|
+
item.className = 'console-tab-menu-item';
|
|
2108
|
+
item.dataset.tab = btn.dataset.tab || '';
|
|
2109
|
+
item.setAttribute('role', 'menuitem');
|
|
2110
|
+
item.textContent = btn.textContent || '';
|
|
2111
|
+
if (btn.classList.contains('active')) item.classList.add('active');
|
|
2112
|
+
consoleTabMenu.appendChild(item);
|
|
2113
|
+
});
|
|
2114
|
+
}
|
|
2115
|
+
|
|
2116
|
+
function syncConsoleTabMenuSelection() {
|
|
2117
|
+
if (!consoleTabs || !consoleTabMenu) return;
|
|
2118
|
+
const activeTab = consoleTabs.querySelector('.console-tab.active')?.dataset.tab || '';
|
|
2119
|
+
consoleTabMenu.querySelectorAll('.console-tab-menu-item').forEach((item) => {
|
|
2120
|
+
item.classList.toggle('active', item.dataset.tab === activeTab);
|
|
2121
|
+
});
|
|
2122
|
+
}
|
|
2123
|
+
|
|
2124
|
+
function closeConsoleTabMenu() {
|
|
2125
|
+
if (!consoleTabMenu || !consoleTabMenuToggle) return;
|
|
2126
|
+
consoleTabMenu.hidden = true;
|
|
2127
|
+
consoleTabMenuToggle.setAttribute('aria-expanded', 'false');
|
|
2128
|
+
}
|
|
2129
|
+
|
|
2130
|
+
function getConsoleTabMenuItems() {
|
|
2131
|
+
if (!consoleTabMenu) return [];
|
|
2132
|
+
return Array.from(consoleTabMenu.querySelectorAll('.console-tab-menu-item'));
|
|
2133
|
+
}
|
|
2134
|
+
|
|
2135
|
+
function openConsoleTabMenu(focusTarget) {
|
|
2136
|
+
if (!consoleTabMenu || !consoleTabMenuToggle) return;
|
|
2137
|
+
consoleTabMenu.hidden = false;
|
|
2138
|
+
consoleTabMenuToggle.setAttribute('aria-expanded', 'true');
|
|
2139
|
+
|
|
2140
|
+
if (!focusTarget) return;
|
|
2141
|
+
|
|
2142
|
+
const items = getConsoleTabMenuItems();
|
|
2143
|
+
if (!items.length) return;
|
|
2144
|
+
const focusItem = (index) => {
|
|
2145
|
+
const boundedIndex = Math.max(0, Math.min(index, items.length - 1));
|
|
2146
|
+
items[boundedIndex].focus();
|
|
2147
|
+
};
|
|
2148
|
+
|
|
2149
|
+
if (focusTarget === 'first') {
|
|
2150
|
+
focusItem(0);
|
|
2151
|
+
return;
|
|
2152
|
+
}
|
|
2153
|
+
|
|
2154
|
+
if (focusTarget === 'last') {
|
|
2155
|
+
focusItem(items.length - 1);
|
|
2156
|
+
return;
|
|
2157
|
+
}
|
|
2158
|
+
|
|
2159
|
+
const activeIndex = Math.max(items.findIndex((item) => item.classList.contains('active')), 0);
|
|
2160
|
+
focusItem(activeIndex);
|
|
2161
|
+
}
|
|
2162
|
+
|
|
2163
|
+
function moveConsoleTabMenuFocus(step, origin) {
|
|
2164
|
+
const items = getConsoleTabMenuItems();
|
|
2165
|
+
if (!items.length) return;
|
|
2166
|
+
|
|
2167
|
+
const currentIndex = origin instanceof Element
|
|
2168
|
+
? items.findIndex((item) => item === origin || item.contains(origin))
|
|
2169
|
+
: -1;
|
|
2170
|
+
const activeIndex = Math.max(items.findIndex((item) => item.classList.contains('active')), 0);
|
|
2171
|
+
const baseIndex = currentIndex >= 0 ? currentIndex : activeIndex;
|
|
2172
|
+
const nextIndex = (baseIndex + step + items.length) % items.length;
|
|
2173
|
+
items[nextIndex].focus();
|
|
2174
|
+
}
|
|
2175
|
+
|
|
2176
|
+
function handleConsoleTabMenuToggleKeydown(event) {
|
|
2177
|
+
if (event.key === 'ArrowDown') {
|
|
2178
|
+
event.preventDefault();
|
|
2179
|
+
openConsoleTabMenu('first');
|
|
2180
|
+
} else if (event.key === 'ArrowUp') {
|
|
2181
|
+
event.preventDefault();
|
|
2182
|
+
openConsoleTabMenu('last');
|
|
2183
|
+
}
|
|
2184
|
+
}
|
|
2185
|
+
|
|
2186
|
+
function handleConsoleTabMenuKeydown(event) {
|
|
2187
|
+
switch (event.key) {
|
|
2188
|
+
case 'ArrowDown':
|
|
2189
|
+
event.preventDefault();
|
|
2190
|
+
moveConsoleTabMenuFocus(1, event.target);
|
|
2191
|
+
break;
|
|
2192
|
+
case 'ArrowUp':
|
|
2193
|
+
event.preventDefault();
|
|
2194
|
+
moveConsoleTabMenuFocus(-1, event.target);
|
|
2195
|
+
break;
|
|
2196
|
+
case 'Home':
|
|
2197
|
+
event.preventDefault();
|
|
2198
|
+
getConsoleTabMenuItems()[0]?.focus();
|
|
2199
|
+
break;
|
|
2200
|
+
case 'End': {
|
|
2201
|
+
event.preventDefault();
|
|
2202
|
+
const items = getConsoleTabMenuItems();
|
|
2203
|
+
items.at(-1)?.focus();
|
|
2204
|
+
break;
|
|
2205
|
+
}
|
|
2206
|
+
case 'Escape':
|
|
2207
|
+
event.preventDefault();
|
|
2208
|
+
closeConsoleTabMenu();
|
|
2209
|
+
consoleTabMenuToggle?.focus();
|
|
2210
|
+
break;
|
|
2211
|
+
default:
|
|
2212
|
+
break;
|
|
2213
|
+
}
|
|
2214
|
+
}
|
|
2215
|
+
|
|
2216
|
+
function tabsNeedOverflowMenu() {
|
|
2217
|
+
if (!consoleTabs) return false;
|
|
2218
|
+
const buttons = Array.from(consoleTabs.querySelectorAll('.console-tab'));
|
|
2219
|
+
if (buttons.length < 2) return false;
|
|
2220
|
+
const firstTop = buttons[0].offsetTop;
|
|
2221
|
+
return buttons.some((btn) => btn.offsetTop !== firstTop);
|
|
2222
|
+
}
|
|
2223
|
+
|
|
2224
|
+
let consoleTabOverflowFrame = 0;
|
|
2225
|
+
function updateConsoleTabOverflow() {
|
|
2226
|
+
if (!consoleTabs || !headerNavRow || !consoleTabMenuToggle) return;
|
|
2227
|
+
headerNavRow.classList.remove('header-nav-row--collapsed');
|
|
2228
|
+
consoleTabMenuToggle.hidden = true;
|
|
2229
|
+
const shouldCollapse = tabsNeedOverflowMenu();
|
|
2230
|
+
if (shouldCollapse) {
|
|
2231
|
+
headerNavRow.classList.add('header-nav-row--collapsed');
|
|
2232
|
+
consoleTabMenuToggle.hidden = false;
|
|
2233
|
+
}
|
|
2234
|
+
if (!shouldCollapse) {
|
|
2235
|
+
closeConsoleTabMenu();
|
|
2236
|
+
}
|
|
2237
|
+
}
|
|
2238
|
+
|
|
2239
|
+
function scheduleConsoleTabOverflowCheck() {
|
|
2240
|
+
if (consoleTabOverflowFrame) cancelAnimationFrame(consoleTabOverflowFrame);
|
|
2241
|
+
consoleTabOverflowFrame = requestAnimationFrame(() => {
|
|
2242
|
+
consoleTabOverflowFrame = 0;
|
|
2243
|
+
updateConsoleTabOverflow();
|
|
2244
|
+
});
|
|
2245
|
+
}
|
|
2246
|
+
|
|
2095
2247
|
/**
|
|
2096
2248
|
* Parse the URL hash into tab name and query parameters.
|
|
2097
2249
|
* Supports fragment-query pattern: #tab?key=value&key=value
|
|
@@ -2208,26 +2360,41 @@ globalThis.DollhouseConsoleUI.clearBanner = function(bannerId) {
|
|
|
2208
2360
|
return false;
|
|
2209
2361
|
}
|
|
2210
2362
|
|
|
2211
|
-
|
|
2363
|
+
function restoreInitialConsoleTab() {
|
|
2212
2364
|
// Version check takes priority over saved tab — upgraders must see Setup
|
|
2213
2365
|
// regardless of whether they have a saved tab from their previous session.
|
|
2214
2366
|
if (localStorage.getItem(SETUP_SEEN_KEY) === currentServerVersion) {
|
|
2215
2367
|
const savedTab = localStorage.getItem(TAB_KEY);
|
|
2216
|
-
if (savedTab)
|
|
2217
|
-
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
} else {
|
|
2221
|
-
localStorage.setItem(SETUP_SEEN_KEY, currentServerVersion);
|
|
2222
|
-
switchToTab('setup');
|
|
2368
|
+
if (!savedTab) return;
|
|
2369
|
+
switchToTab(savedTab);
|
|
2370
|
+
lazyInitTab(savedTab, tabInits);
|
|
2371
|
+
return;
|
|
2223
2372
|
}
|
|
2373
|
+
|
|
2374
|
+
localStorage.setItem(SETUP_SEEN_KEY, currentServerVersion);
|
|
2375
|
+
switchToTab('setup');
|
|
2376
|
+
}
|
|
2377
|
+
|
|
2378
|
+
function initializeConsoleTabs() {
|
|
2379
|
+
if (applyHashTab()) return;
|
|
2380
|
+
restoreInitialConsoleTab();
|
|
2224
2381
|
}
|
|
2225
2382
|
|
|
2226
|
-
|
|
2227
|
-
|
|
2383
|
+
function registerConsoleTabObservers() {
|
|
2384
|
+
globalThis.addEventListener('hashchange', () => applyHashTab());
|
|
2385
|
+
renderConsoleTabMenu();
|
|
2386
|
+
syncConsoleTabMenuSelection();
|
|
2387
|
+
scheduleConsoleTabOverflowCheck();
|
|
2388
|
+
globalThis.addEventListener('resize', scheduleConsoleTabOverflowCheck);
|
|
2389
|
+
|
|
2390
|
+
if (typeof ResizeObserver !== 'function' || !headerNavRow) return;
|
|
2228
2391
|
|
|
2229
|
-
|
|
2230
|
-
|
|
2392
|
+
const tabOverflowObserver = new ResizeObserver(() => scheduleConsoleTabOverflowCheck());
|
|
2393
|
+
tabOverflowObserver.observe(headerNavRow);
|
|
2394
|
+
}
|
|
2395
|
+
|
|
2396
|
+
function registerConsoleTabInteractions() {
|
|
2397
|
+
consoleTabs?.addEventListener('click', (e) => {
|
|
2231
2398
|
const btn = e.target.closest('.console-tab');
|
|
2232
2399
|
if (!btn) return;
|
|
2233
2400
|
const tab = btn.dataset.tab;
|
|
@@ -2238,8 +2405,42 @@ globalThis.DollhouseConsoleUI.clearBanner = function(bannerId) {
|
|
|
2238
2405
|
|
|
2239
2406
|
lazyInitTab(tab, tabInits);
|
|
2240
2407
|
});
|
|
2408
|
+
|
|
2409
|
+
consoleTabMenuToggle?.addEventListener('click', () => {
|
|
2410
|
+
if (!consoleTabMenu) return;
|
|
2411
|
+
if (consoleTabMenu.hidden) {
|
|
2412
|
+
openConsoleTabMenu();
|
|
2413
|
+
return;
|
|
2414
|
+
}
|
|
2415
|
+
|
|
2416
|
+
closeConsoleTabMenu();
|
|
2417
|
+
});
|
|
2418
|
+
|
|
2419
|
+
consoleTabMenuToggle?.addEventListener('keydown', handleConsoleTabMenuToggleKeydown);
|
|
2420
|
+
consoleTabMenu?.addEventListener('keydown', handleConsoleTabMenuKeydown);
|
|
2421
|
+
consoleTabMenu?.addEventListener('click', (e) => {
|
|
2422
|
+
const btn = e.target.closest('.console-tab-menu-item');
|
|
2423
|
+
const tab = btn?.dataset.tab;
|
|
2424
|
+
if (!tab) return;
|
|
2425
|
+
switchToTab(tab);
|
|
2426
|
+
localStorage.setItem(TAB_KEY, tab);
|
|
2427
|
+
lazyInitTab(tab, tabInits);
|
|
2428
|
+
});
|
|
2429
|
+
|
|
2430
|
+
globalThis.addEventListener('click', (e) => {
|
|
2431
|
+
if (!consoleTabMenu || !consoleTabMenuToggle) return;
|
|
2432
|
+
if (consoleTabMenu.hidden) return;
|
|
2433
|
+
const target = e.target;
|
|
2434
|
+
if (!(target instanceof Element)) return;
|
|
2435
|
+
if (consoleTabMenu.contains(target) || consoleTabMenuToggle.contains(target)) return;
|
|
2436
|
+
closeConsoleTabMenu();
|
|
2437
|
+
});
|
|
2241
2438
|
}
|
|
2242
2439
|
|
|
2440
|
+
initializeConsoleTabs();
|
|
2441
|
+
registerConsoleTabObservers();
|
|
2442
|
+
registerConsoleTabInteractions();
|
|
2443
|
+
|
|
2243
2444
|
function lazyInitTab(tab, tabInits, params) {
|
|
2244
2445
|
const dc = globalThis.DollhouseConsole;
|
|
2245
2446
|
const module = dc?.[tab];
|
|
@@ -43,7 +43,14 @@
|
|
|
43
43
|
<p class="site-tagline">Management Console</p>
|
|
44
44
|
</div>
|
|
45
45
|
</div>
|
|
46
|
-
<div class="header-
|
|
46
|
+
<div class="header-controls">
|
|
47
|
+
<div class="site-stats" id="stats" aria-live="polite"></div>
|
|
48
|
+
<button class="theme-toggle" id="theme-toggle" type="button" aria-label="Switch to dark mode" title="Switch to dark mode">
|
|
49
|
+
<span class="theme-toggle-icon" id="theme-toggle-icon" aria-hidden="true">☾</span>
|
|
50
|
+
<span class="sr-only" id="theme-toggle-label">Switch to dark mode</span>
|
|
51
|
+
</button>
|
|
52
|
+
</div>
|
|
53
|
+
<div class="header-nav-row">
|
|
47
54
|
<nav class="console-tabs" id="console-tabs" aria-label="Console tabs">
|
|
48
55
|
<button class="console-tab" data-tab="setup">Setup</button>
|
|
49
56
|
<button class="console-tab" data-tab="security">Auth</button>
|
|
@@ -52,12 +59,14 @@
|
|
|
52
59
|
<button class="console-tab" data-tab="permissions">Permissions</button>
|
|
53
60
|
<button class="console-tab active" data-tab="portfolio">Portfolio</button>
|
|
54
61
|
</nav>
|
|
62
|
+
<div class="console-tab-menu-shell" id="console-tab-menu-shell">
|
|
63
|
+
<button class="console-tab-menu-toggle" id="console-tab-menu-toggle" type="button" hidden aria-haspopup="menu" aria-expanded="false" aria-controls="console-tab-menu">
|
|
64
|
+
<span class="console-tab-menu-icon" aria-hidden="true">☰</span>
|
|
65
|
+
<span class="console-tab-menu-label">Menu</span>
|
|
66
|
+
</button>
|
|
67
|
+
<div class="console-tab-menu" id="console-tab-menu" role="menu" aria-orientation="vertical" hidden></div>
|
|
68
|
+
</div>
|
|
55
69
|
<div class="session-indicator" id="session-indicator" title="Active sessions"></div>
|
|
56
|
-
<div class="site-stats" id="stats" aria-live="polite"></div>
|
|
57
|
-
<button class="theme-toggle" id="theme-toggle" type="button" aria-label="Switch to dark mode" title="Switch to dark mode">
|
|
58
|
-
<span class="theme-toggle-icon" id="theme-toggle-icon" aria-hidden="true">☾</span>
|
|
59
|
-
<span class="sr-only" id="theme-toggle-label">Switch to dark mode</span>
|
|
60
|
-
</button>
|
|
61
70
|
</div>
|
|
62
71
|
</header>
|
|
63
72
|
|
|
@@ -572,7 +581,7 @@ npm install @dollhousemcp/mcp-server</code></pre>
|
|
|
572
581
|
<a href="https://github.com/DollhouseMCP/mcp-server" class="footer-link">GitHub Repository</a>
|
|
573
582
|
<a href="./collection-index.json" class="footer-link">JSON API</a>
|
|
574
583
|
<a href="https://dollhousemcp.com" class="footer-link">DollhouseMCP</a>
|
|
575
|
-
<span class="footer-version" id="footer-version"></span>
|
|
584
|
+
<span class="footer-version" id="footer-version" aria-live="polite" aria-atomic="true"></span>
|
|
576
585
|
<span class="footer-updated" id="footer-updated"></span>
|
|
577
586
|
<span class="footer-copyright">© 2026 DollhouseMCP</span>
|
|
578
587
|
</div>
|