@dbx-tools/appkit-mastra 0.3.44 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.d.ts +71 -0
- package/lib/index.js +56 -0
- package/lib/src/agents.d.ts +347 -0
- package/lib/src/agents.js +554 -0
- package/lib/src/chart.d.ts +192 -0
- package/lib/src/chart.js +638 -0
- package/lib/src/config.d.ts +479 -0
- package/lib/src/config.js +190 -0
- package/lib/src/defaults.d.ts +68 -0
- package/lib/src/defaults.js +107 -0
- package/lib/src/filesystems.d.ts +208 -0
- package/lib/src/filesystems.js +958 -0
- package/lib/src/genie.d.ts +166 -0
- package/lib/src/genie.js +969 -0
- package/lib/src/history.d.ts +97 -0
- package/lib/src/history.js +264 -0
- package/lib/src/mcp.d.ts +66 -0
- package/lib/src/mcp.js +65 -0
- package/lib/src/memory.d.ts +111 -0
- package/lib/src/memory.js +275 -0
- package/lib/src/mlflow.d.ts +63 -0
- package/lib/src/mlflow.js +117 -0
- package/lib/src/model.d.ts +62 -0
- package/lib/src/model.js +168 -0
- package/lib/src/observability.d.ts +81 -0
- package/lib/src/observability.js +98 -0
- package/lib/src/pagination.d.ts +23 -0
- package/lib/src/pagination.js +31 -0
- package/lib/src/plugin.d.ts +352 -0
- package/lib/src/plugin.js +1015 -0
- package/lib/src/processors.d.ts +62 -0
- package/lib/src/processors.js +162 -0
- package/lib/src/rest.d.ts +36 -0
- package/lib/src/rest.js +46 -0
- package/lib/src/server.d.ts +155 -0
- package/lib/src/server.js +336 -0
- package/lib/src/serving-sanitize.d.ts +104 -0
- package/lib/src/serving-sanitize.js +228 -0
- package/lib/src/serving.d.ts +61 -0
- package/lib/src/serving.js +78 -0
- package/lib/src/statement.d.ts +51 -0
- package/lib/src/statement.js +83 -0
- package/lib/src/storage-schema.d.ts +14 -0
- package/lib/src/storage-schema.js +34 -0
- package/lib/src/summarize.d.ts +70 -0
- package/lib/src/summarize.js +142 -0
- package/lib/src/threads.d.ts +109 -0
- package/lib/src/threads.js +301 -0
- package/lib/src/validation.d.ts +19 -0
- package/lib/src/validation.js +17 -0
- package/lib/src/workspaces.d.ts +68 -0
- package/lib/src/workspaces.js +246 -0
- package/lib/src/writer.d.ts +25 -0
- package/lib/src/writer.js +40 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/package.json +17 -13
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin configuration types and shared `RequestContext` keys.
|
|
3
|
+
*
|
|
4
|
+
* Owns the typed {@link MastraPluginConfig} (the plugin's slice of AppKit
|
|
5
|
+
* config) and {@link MASTRA_CONFIG_SCHEMA}, the JSON Schema the manifest
|
|
6
|
+
* publishes for it so scaffolding tools and agents can read the option set.
|
|
7
|
+
*
|
|
8
|
+
* Precedence per field is explicit plugin config, then the environment
|
|
9
|
+
* variable named on the field, then a built-in default.
|
|
10
|
+
*
|
|
11
|
+
* Kept in a leaf module so `plugin.ts`, `server.ts`, `model.ts`, and
|
|
12
|
+
* `memory.ts` can import them without creating a cycle.
|
|
13
|
+
*
|
|
14
|
+
* @module
|
|
15
|
+
*/
|
|
16
|
+
import { getExecutionContext } from "@databricks/appkit";
|
|
17
|
+
import { MASTRA_RESOURCE_ID_KEY, MASTRA_THREAD_ID_KEY } from "@mastra/core/request-context";
|
|
18
|
+
/**
|
|
19
|
+
* `RequestContext` key under which {@link MastraServer} stores the
|
|
20
|
+
* resolved AppKit user. `model.ts` reads it to mint user-scoped
|
|
21
|
+
* Databricks tokens.
|
|
22
|
+
*/
|
|
23
|
+
export const MASTRA_USER_KEY = "mastra__user";
|
|
24
|
+
/**
|
|
25
|
+
* `RequestContext` keys for AppKit user metadata stamped by
|
|
26
|
+
* {@link MastraServer}. Surfaced as trace metadata via
|
|
27
|
+
* {@link TRACE_REQUEST_CONTEXT_KEYS} so traces are filterable by who
|
|
28
|
+
* issued the request without leaking the full user object.
|
|
29
|
+
*/
|
|
30
|
+
export const MASTRA_USER_NAME_KEY = "mastra__userName";
|
|
31
|
+
export const MASTRA_USER_EMAIL_KEY = "mastra__userEmail";
|
|
32
|
+
/**
|
|
33
|
+
* `RequestContext` key for the per-HTTP-request id stamped by
|
|
34
|
+
* {@link MastraServer}. Reads `X-Request-Id` from the incoming
|
|
35
|
+
* headers when present (so an upstream load balancer / API gateway
|
|
36
|
+
* can keep its trace correlation), falls back to a freshly minted
|
|
37
|
+
* UUID. Echoed back on the response and surfaced on every span via
|
|
38
|
+
* {@link TRACE_REQUEST_CONTEXT_KEYS} so logs and traces share a
|
|
39
|
+
* join key.
|
|
40
|
+
*/
|
|
41
|
+
export const MASTRA_REQUEST_ID_KEY = "mastra__requestId";
|
|
42
|
+
/**
|
|
43
|
+
* `RequestContext` key for OAuth scopes parsed from the forwarded
|
|
44
|
+
* access token by {@link MastraServer.configureRequestContextScopes}.
|
|
45
|
+
* Workspace mounts that touch Databricks workspace files require
|
|
46
|
+
* `workspace` or `all-apis` in this list.
|
|
47
|
+
*/
|
|
48
|
+
export const MASTRA_SCOPES_KEY = "mastra__scopes";
|
|
49
|
+
/**
|
|
50
|
+
* Canonical list of `RequestContext` keys we want Mastra to extract
|
|
51
|
+
* as metadata on every observability span (agent runs, model calls,
|
|
52
|
+
* tool invocations, workflow steps).
|
|
53
|
+
*
|
|
54
|
+
* Mirrors {@link https://mastra.ai/docs/observability/tracing/overview#automatic-metadata-from-requestcontext}:
|
|
55
|
+
* passed verbatim into `Observability.configs[*].requestContextKeys`,
|
|
56
|
+
* so any key listed here is read from `RequestContext` at trace
|
|
57
|
+
* start and attached as scalar span metadata. Keep the set to plain
|
|
58
|
+
* scalars - never include {@link MASTRA_USER_KEY} (it carries the
|
|
59
|
+
* full AppKit execution context with a `WorkspaceClient` reference).
|
|
60
|
+
*
|
|
61
|
+
* Order is purely cosmetic; Mastra de-dupes internally.
|
|
62
|
+
*/
|
|
63
|
+
export const TRACE_REQUEST_CONTEXT_KEYS = [
|
|
64
|
+
MASTRA_RESOURCE_ID_KEY,
|
|
65
|
+
MASTRA_THREAD_ID_KEY,
|
|
66
|
+
MASTRA_REQUEST_ID_KEY,
|
|
67
|
+
MASTRA_USER_NAME_KEY,
|
|
68
|
+
MASTRA_USER_EMAIL_KEY,
|
|
69
|
+
// Model override key is owned by `serving.ts`; spelled inline here
|
|
70
|
+
// so this module stays leaf-level (no cycles with `serving.ts`).
|
|
71
|
+
"mastra__model_override",
|
|
72
|
+
];
|
|
73
|
+
/**
|
|
74
|
+
* Canonical identity for an AppKit execution context: the OBO user id on a
|
|
75
|
+
* user-scoped call, the service principal id otherwise.
|
|
76
|
+
*/
|
|
77
|
+
export function executionContextUserId(context) {
|
|
78
|
+
return "userId" in context ? context.userId : context.serviceUserId;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Identity every per-user cache entry is namespaced under, so an OBO result
|
|
82
|
+
* cannot be read back by another caller.
|
|
83
|
+
*
|
|
84
|
+
* Prefers the {@link User} that {@link MastraServer} stamps on the request
|
|
85
|
+
* context. The MCP transport routes do not thread that context into tool
|
|
86
|
+
* execution, so those fall back to the ambient execution context (the active
|
|
87
|
+
* OBO scope, or the service principal).
|
|
88
|
+
*/
|
|
89
|
+
export function resolveUserKey(requestContext) {
|
|
90
|
+
const user = requestContext?.get(MASTRA_USER_KEY);
|
|
91
|
+
return user?.id ?? executionContextUserId(getExecutionContext());
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* JSON Schema published on the manifest's `config.schema`, mirroring the
|
|
95
|
+
* documented defaults and environment fallbacks of {@link MastraPluginConfig}.
|
|
96
|
+
*
|
|
97
|
+
* Covers the JSON-expressible options only. `agents`, `tools`, and a
|
|
98
|
+
* `defaultModel` passed as a Mastra `DynamicArgument` are code-defined
|
|
99
|
+
* (functions / class instances), so they carry no schema entry; the
|
|
100
|
+
* `defaultModel` property below describes its string form.
|
|
101
|
+
*/
|
|
102
|
+
export const MASTRA_CONFIG_SCHEMA = {
|
|
103
|
+
type: "object",
|
|
104
|
+
properties: {
|
|
105
|
+
providerId: {
|
|
106
|
+
type: "string",
|
|
107
|
+
description: 'Mastra OpenAI-compatible provider id. Defaults to "databricks".',
|
|
108
|
+
},
|
|
109
|
+
storage: {
|
|
110
|
+
type: ["boolean", "object"],
|
|
111
|
+
description: "PostgresStore for Mastra threads / messages. `true` reuses the `lakebase` plugin's pool, an object opens a dedicated store. Auto-enabled when the `lakebase` plugin is registered.",
|
|
112
|
+
},
|
|
113
|
+
memory: {
|
|
114
|
+
type: ["boolean", "object"],
|
|
115
|
+
description: "PgVector store for Mastra semantic recall. `true` reuses the `lakebase` plugin's pool, an object opens a dedicated store. Auto-enabled when the `lakebase` plugin is registered.",
|
|
116
|
+
},
|
|
117
|
+
defaultAgent: {
|
|
118
|
+
type: "string",
|
|
119
|
+
description: "Agent id used when the client names none. Defaults to the first registered agent, else the built-in `default`.",
|
|
120
|
+
},
|
|
121
|
+
defaultModel: {
|
|
122
|
+
type: "string",
|
|
123
|
+
description: "Serving endpoint applied to every agent that omits its own model. Falls back to DATABRICKS_SERVING_ENDPOINT_NAME, then the auto-resolved catalogue.",
|
|
124
|
+
},
|
|
125
|
+
defaultModelFallbacks: {
|
|
126
|
+
type: "array",
|
|
127
|
+
items: { type: "string" },
|
|
128
|
+
description: "Priority-ordered endpoint names tried before the score-classified catalogue when nothing else pins a model.",
|
|
129
|
+
},
|
|
130
|
+
modelFuzzyMatch: {
|
|
131
|
+
type: "boolean",
|
|
132
|
+
description: "Fuzzy-match loose model names against the workspace catalogue. Defaults to true.",
|
|
133
|
+
},
|
|
134
|
+
modelFuzzyThreshold: {
|
|
135
|
+
type: "number",
|
|
136
|
+
description: "Fuse.js score threshold for the fuzzy matcher, 0 (exact) to 1 (anything). Defaults to 0.4.",
|
|
137
|
+
},
|
|
138
|
+
modelCacheTtlMs: {
|
|
139
|
+
type: "number",
|
|
140
|
+
description: "TTL in ms for the serving-endpoints list cache, per workspace host. Defaults to 5 minutes.",
|
|
141
|
+
},
|
|
142
|
+
modelOverride: {
|
|
143
|
+
type: "boolean",
|
|
144
|
+
description: "Honor a per-request model override from the X-Mastra-Model header, ?model= query, or a `model` body field. Defaults to true.",
|
|
145
|
+
},
|
|
146
|
+
genieSpaces: {
|
|
147
|
+
type: "object",
|
|
148
|
+
additionalProperties: { type: ["string", "object"] },
|
|
149
|
+
description: "Genie spaces the agents can delegate to, keyed by alias (the tool-name suffix). Each value is a space id or `{ spaceId, hint }`. Falls back to the `genie` plugin's own `spaces` config, then DATABRICKS_GENIE_SPACE_ID under the `default` alias.",
|
|
150
|
+
},
|
|
151
|
+
genieSpaceCacheTtlMs: {
|
|
152
|
+
type: "number",
|
|
153
|
+
description: "TTL in ms for the Genie space metadata cache. Defaults to 5 minutes.",
|
|
154
|
+
},
|
|
155
|
+
agentMaxSteps: {
|
|
156
|
+
type: "number",
|
|
157
|
+
description: "Maximum LLM steps each agent gets per turn (a tool call and the final reply each consume one). Defaults to 25.",
|
|
158
|
+
},
|
|
159
|
+
stripStaleCharts: {
|
|
160
|
+
type: "boolean",
|
|
161
|
+
description: "Strip chartIds from recalled assistant tool results so the model cannot reuse a turn-scoped chart marker. Defaults to true.",
|
|
162
|
+
},
|
|
163
|
+
styleInstructions: {
|
|
164
|
+
type: ["string", "boolean"],
|
|
165
|
+
description: "Style guardrails appended to every agent's instructions. A string replaces the built-in block, `false` disables it.",
|
|
166
|
+
},
|
|
167
|
+
observability: {
|
|
168
|
+
type: "boolean",
|
|
169
|
+
description: "Bridge Mastra spans into AppKit's OTel pipeline. Defaults to on only when OTEL_EXPORTER_OTLP_ENDPOINT or OTEL_EXPORTER_OTLP_TRACES_ENDPOINT is set.",
|
|
170
|
+
},
|
|
171
|
+
feedback: {
|
|
172
|
+
type: "boolean",
|
|
173
|
+
description: "Log thumbs / comment assessments to MLflow and surface the feedback controls. Defaults to on only when an OTLP endpoint and MLFLOW_EXPERIMENT_ID or MLFLOW_EXPERIMENT_NAME are set.",
|
|
174
|
+
},
|
|
175
|
+
mcp: {
|
|
176
|
+
type: ["boolean", "object"],
|
|
177
|
+
description: "Expose the registered agents over MCP. Defaults to agents-only; an object tunes the server id, advertised metadata, and whether ambient tools are exposed.",
|
|
178
|
+
},
|
|
179
|
+
apiAccess: {
|
|
180
|
+
type: "string",
|
|
181
|
+
enum: ["scoped", "full"],
|
|
182
|
+
description: 'How much of the stock @mastra/express API is reachable through the mount. "scoped" (default) allows agent inference, read-only agent metadata, this plugin\'s own routes, and MCP; "full" dispatches the entire management surface.',
|
|
183
|
+
},
|
|
184
|
+
brand: {
|
|
185
|
+
type: "object",
|
|
186
|
+
description: "Portable brand context applied to generated charts (series palette from colors.primary / colors.accent, base font from typography.sans).",
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBNEMsTUFBTSxvQkFBb0IsQ0FBQztBQUtuRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQU01Rjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQztBQUU5Qzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLG1CQUFtQixDQUFDO0FBRXpEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsbUJBQW1CLENBQUM7QUFFekQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUVsRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQXNCO0lBQzNELHNCQUFzQjtJQUN0QixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQixxQkFBcUI7SUFDckIsbUVBQW1FO0lBQ25FLGlFQUFpRTtJQUNqRSx3QkFBd0I7Q0FDekIsQ0FBQztBQVFGOzs7R0FHRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxPQUFvQztJQUN6RSxPQUFPLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDdEUsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxjQUErQjtJQUM1RCxNQUFNLElBQUksR0FBRyxjQUFjLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBcUIsQ0FBQztJQUN0RSxPQUFPLElBQUksRUFBRSxFQUFFLElBQUksc0JBQXNCLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO0FBQ25FLENBQUM7QUFpWUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBaUI7SUFDaEQsSUFBSSxFQUFFLFFBQVE7SUFDZCxVQUFVLEVBQUU7UUFDVixVQUFVLEVBQUU7WUFDVixJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFBRSxpRUFBaUU7U0FDL0U7UUFDRCxPQUFPLEVBQUU7WUFDUCxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDO1lBQzNCLFdBQVcsRUFDVCxvTEFBb0w7U0FDdkw7UUFDRCxNQUFNLEVBQUU7WUFDTixJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDO1lBQzNCLFdBQVcsRUFDVCxrTEFBa0w7U0FDckw7UUFDRCxZQUFZLEVBQUU7WUFDWixJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFDVCxnSEFBZ0g7U0FDbkg7UUFDRCxZQUFZLEVBQUU7WUFDWixJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFDVCxxSkFBcUo7U0FDeEo7UUFDRCxxQkFBcUIsRUFBRTtZQUNyQixJQUFJLEVBQUUsT0FBTztZQUNiLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDekIsV0FBVyxFQUNULDZHQUE2RztTQUNoSDtRQUNELGVBQWUsRUFBRTtZQUNmLElBQUksRUFBRSxTQUFTO1lBQ2YsV0FBVyxFQUNULGtGQUFrRjtTQUNyRjtRQUNELG1CQUFtQixFQUFFO1lBQ25CLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUNULDRGQUE0RjtTQUMvRjtRQUNELGVBQWUsRUFBRTtZQUNmLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUNULDRGQUE0RjtTQUMvRjtRQUNELGFBQWEsRUFBRTtZQUNiLElBQUksRUFBRSxTQUFTO1lBQ2YsV0FBVyxFQUNULDhIQUE4SDtTQUNqSTtRQUNELFdBQVcsRUFBRTtZQUNYLElBQUksRUFBRSxRQUFRO1lBQ2Qsb0JBQW9CLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEVBQUU7WUFDcEQsV0FBVyxFQUNULG9QQUFvUDtTQUN2UDtRQUNELG9CQUFvQixFQUFFO1lBQ3BCLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUFFLHNFQUFzRTtTQUNwRjtRQUNELGFBQWEsRUFBRTtZQUNiLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUNULGdIQUFnSDtTQUNuSDtRQUNELGdCQUFnQixFQUFFO1lBQ2hCLElBQUksRUFBRSxTQUFTO1lBQ2YsV0FBVyxFQUNULDZIQUE2SDtTQUNoSTtRQUNELGlCQUFpQixFQUFFO1lBQ2pCLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUM7WUFDM0IsV0FBVyxFQUNULHFIQUFxSDtTQUN4SDtRQUNELGFBQWEsRUFBRTtZQUNiLElBQUksRUFBRSxTQUFTO1lBQ2YsV0FBVyxFQUNULHFKQUFxSjtTQUN4SjtRQUNELFFBQVEsRUFBRTtZQUNSLElBQUksRUFBRSxTQUFTO1lBQ2YsV0FBVyxFQUNULHFMQUFxTDtTQUN4TDtRQUNELEdBQUcsRUFBRTtZQUNILElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUM7WUFDM0IsV0FBVyxFQUNULDRKQUE0SjtTQUMvSjtRQUNELFNBQVMsRUFBRTtZQUNULElBQUksRUFBRSxRQUFRO1lBQ2QsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztZQUN4QixXQUFXLEVBQ1QscU9BQXFPO1NBQ3hPO1FBQ0QsS0FBSyxFQUFFO1lBQ0wsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQ1QsMElBQTBJO1NBQzdJO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQbHVnaW4gY29uZmlndXJhdGlvbiB0eXBlcyBhbmQgc2hhcmVkIGBSZXF1ZXN0Q29udGV4dGAga2V5cy5cbiAqXG4gKiBPd25zIHRoZSB0eXBlZCB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnfSAodGhlIHBsdWdpbidzIHNsaWNlIG9mIEFwcEtpdFxuICogY29uZmlnKSBhbmQge0BsaW5rIE1BU1RSQV9DT05GSUdfU0NIRU1BfSwgdGhlIEpTT04gU2NoZW1hIHRoZSBtYW5pZmVzdFxuICogcHVibGlzaGVzIGZvciBpdCBzbyBzY2FmZm9sZGluZyB0b29scyBhbmQgYWdlbnRzIGNhbiByZWFkIHRoZSBvcHRpb24gc2V0LlxuICpcbiAqIFByZWNlZGVuY2UgcGVyIGZpZWxkIGlzIGV4cGxpY2l0IHBsdWdpbiBjb25maWcsIHRoZW4gdGhlIGVudmlyb25tZW50XG4gKiB2YXJpYWJsZSBuYW1lZCBvbiB0aGUgZmllbGQsIHRoZW4gYSBidWlsdC1pbiBkZWZhdWx0LlxuICpcbiAqIEtlcHQgaW4gYSBsZWFmIG1vZHVsZSBzbyBgcGx1Z2luLnRzYCwgYHNlcnZlci50c2AsIGBtb2RlbC50c2AsIGFuZFxuICogYG1lbW9yeS50c2AgY2FuIGltcG9ydCB0aGVtIHdpdGhvdXQgY3JlYXRpbmcgYSBjeWNsZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZ2V0RXhlY3V0aW9uQ29udGV4dCwgdHlwZSBCYXNlUGx1Z2luQ29uZmlnLCB0eXBlIENvbmZpZ1NjaGVtYSB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBCcmFuZENvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudENvbmZpZyB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgTUFTVFJBX1JFU09VUkNFX0lEX0tFWSwgTUFTVFJBX1RIUkVBRF9JRF9LRVkgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBQZ1ZlY3RvckNvbmZpZywgUG9zdGdyZXNTdG9yZUNvbmZpZyB9IGZyb20gXCJAbWFzdHJhL3BnXCI7XG5cbmltcG9ydCB0eXBlIHsgTWFzdHJhQWdlbnREZWZpbml0aW9uLCBNYXN0cmFUb29scyB9IGZyb20gXCIuL2FnZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBHZW5pZVNwYWNlc0NvbmZpZyB9IGZyb20gXCIuL2dlbmllXCI7XG5cbi8qKlxuICogYFJlcXVlc3RDb250ZXh0YCBrZXkgdW5kZXIgd2hpY2gge0BsaW5rIE1hc3RyYVNlcnZlcn0gc3RvcmVzIHRoZVxuICogcmVzb2x2ZWQgQXBwS2l0IHVzZXIuIGBtb2RlbC50c2AgcmVhZHMgaXQgdG8gbWludCB1c2VyLXNjb3BlZFxuICogRGF0YWJyaWNrcyB0b2tlbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVNUUkFfVVNFUl9LRVkgPSBcIm1hc3RyYV9fdXNlclwiO1xuXG4vKipcbiAqIGBSZXF1ZXN0Q29udGV4dGAga2V5cyBmb3IgQXBwS2l0IHVzZXIgbWV0YWRhdGEgc3RhbXBlZCBieVxuICoge0BsaW5rIE1hc3RyYVNlcnZlcn0uIFN1cmZhY2VkIGFzIHRyYWNlIG1ldGFkYXRhIHZpYVxuICoge0BsaW5rIFRSQUNFX1JFUVVFU1RfQ09OVEVYVF9LRVlTfSBzbyB0cmFjZXMgYXJlIGZpbHRlcmFibGUgYnkgd2hvXG4gKiBpc3N1ZWQgdGhlIHJlcXVlc3Qgd2l0aG91dCBsZWFraW5nIHRoZSBmdWxsIHVzZXIgb2JqZWN0LlxuICovXG5leHBvcnQgY29uc3QgTUFTVFJBX1VTRVJfTkFNRV9LRVkgPSBcIm1hc3RyYV9fdXNlck5hbWVcIjtcbmV4cG9ydCBjb25zdCBNQVNUUkFfVVNFUl9FTUFJTF9LRVkgPSBcIm1hc3RyYV9fdXNlckVtYWlsXCI7XG5cbi8qKlxuICogYFJlcXVlc3RDb250ZXh0YCBrZXkgZm9yIHRoZSBwZXItSFRUUC1yZXF1ZXN0IGlkIHN0YW1wZWQgYnlcbiAqIHtAbGluayBNYXN0cmFTZXJ2ZXJ9LiBSZWFkcyBgWC1SZXF1ZXN0LUlkYCBmcm9tIHRoZSBpbmNvbWluZ1xuICogaGVhZGVycyB3aGVuIHByZXNlbnQgKHNvIGFuIHVwc3RyZWFtIGxvYWQgYmFsYW5jZXIgLyBBUEkgZ2F0ZXdheVxuICogY2FuIGtlZXAgaXRzIHRyYWNlIGNvcnJlbGF0aW9uKSwgZmFsbHMgYmFjayB0byBhIGZyZXNobHkgbWludGVkXG4gKiBVVUlELiBFY2hvZWQgYmFjayBvbiB0aGUgcmVzcG9uc2UgYW5kIHN1cmZhY2VkIG9uIGV2ZXJ5IHNwYW4gdmlhXG4gKiB7QGxpbmsgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVN9IHNvIGxvZ3MgYW5kIHRyYWNlcyBzaGFyZSBhXG4gKiBqb2luIGtleS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9SRVFVRVNUX0lEX0tFWSA9IFwibWFzdHJhX19yZXF1ZXN0SWRcIjtcblxuLyoqXG4gKiBgUmVxdWVzdENvbnRleHRgIGtleSBmb3IgT0F1dGggc2NvcGVzIHBhcnNlZCBmcm9tIHRoZSBmb3J3YXJkZWRcbiAqIGFjY2VzcyB0b2tlbiBieSB7QGxpbmsgTWFzdHJhU2VydmVyLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0U2NvcGVzfS5cbiAqIFdvcmtzcGFjZSBtb3VudHMgdGhhdCB0b3VjaCBEYXRhYnJpY2tzIHdvcmtzcGFjZSBmaWxlcyByZXF1aXJlXG4gKiBgd29ya3NwYWNlYCBvciBgYWxsLWFwaXNgIGluIHRoaXMgbGlzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9TQ09QRVNfS0VZID0gXCJtYXN0cmFfX3Njb3Blc1wiO1xuXG4vKipcbiAqIENhbm9uaWNhbCBsaXN0IG9mIGBSZXF1ZXN0Q29udGV4dGAga2V5cyB3ZSB3YW50IE1hc3RyYSB0byBleHRyYWN0XG4gKiBhcyBtZXRhZGF0YSBvbiBldmVyeSBvYnNlcnZhYmlsaXR5IHNwYW4gKGFnZW50IHJ1bnMsIG1vZGVsIGNhbGxzLFxuICogdG9vbCBpbnZvY2F0aW9ucywgd29ya2Zsb3cgc3RlcHMpLlxuICpcbiAqIE1pcnJvcnMge0BsaW5rIGh0dHBzOi8vbWFzdHJhLmFpL2RvY3Mvb2JzZXJ2YWJpbGl0eS90cmFjaW5nL292ZXJ2aWV3I2F1dG9tYXRpYy1tZXRhZGF0YS1mcm9tLXJlcXVlc3Rjb250ZXh0fTpcbiAqIHBhc3NlZCB2ZXJiYXRpbSBpbnRvIGBPYnNlcnZhYmlsaXR5LmNvbmZpZ3NbKl0ucmVxdWVzdENvbnRleHRLZXlzYCxcbiAqIHNvIGFueSBrZXkgbGlzdGVkIGhlcmUgaXMgcmVhZCBmcm9tIGBSZXF1ZXN0Q29udGV4dGAgYXQgdHJhY2VcbiAqIHN0YXJ0IGFuZCBhdHRhY2hlZCBhcyBzY2FsYXIgc3BhbiBtZXRhZGF0YS4gS2VlcCB0aGUgc2V0IHRvIHBsYWluXG4gKiBzY2FsYXJzIC0gbmV2ZXIgaW5jbHVkZSB7QGxpbmsgTUFTVFJBX1VTRVJfS0VZfSAoaXQgY2FycmllcyB0aGVcbiAqIGZ1bGwgQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0IHdpdGggYSBgV29ya3NwYWNlQ2xpZW50YCByZWZlcmVuY2UpLlxuICpcbiAqIE9yZGVyIGlzIHB1cmVseSBjb3NtZXRpYzsgTWFzdHJhIGRlLWR1cGVzIGludGVybmFsbHkuXG4gKi9cbmV4cG9ydCBjb25zdCBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksXG4gIE1BU1RSQV9USFJFQURfSURfS0VZLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9VU0VSX05BTUVfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIC8vIE1vZGVsIG92ZXJyaWRlIGtleSBpcyBvd25lZCBieSBgc2VydmluZy50c2A7IHNwZWxsZWQgaW5saW5lIGhlcmVcbiAgLy8gc28gdGhpcyBtb2R1bGUgc3RheXMgbGVhZi1sZXZlbCAobm8gY3ljbGVzIHdpdGggYHNlcnZpbmcudHNgKS5cbiAgXCJtYXN0cmFfX21vZGVsX292ZXJyaWRlXCIsXG5dO1xuXG4vKiogQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0IHBsdXMgdGhlIGNhbm9uaWNhbCB1c2VyIGlkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyIHtcbiAgaWQ6IHN0cmluZztcbiAgZXhlY3V0aW9uQ29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlO1xufVxuXG4vKipcbiAqIENhbm9uaWNhbCBpZGVudGl0eSBmb3IgYW4gQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0OiB0aGUgT0JPIHVzZXIgaWQgb24gYVxuICogdXNlci1zY29wZWQgY2FsbCwgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIGlkIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoY29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlKTogc3RyaW5nIHtcbiAgcmV0dXJuIFwidXNlcklkXCIgaW4gY29udGV4dCA/IGNvbnRleHQudXNlcklkIDogY29udGV4dC5zZXJ2aWNlVXNlcklkO1xufVxuXG4vKipcbiAqIElkZW50aXR5IGV2ZXJ5IHBlci11c2VyIGNhY2hlIGVudHJ5IGlzIG5hbWVzcGFjZWQgdW5kZXIsIHNvIGFuIE9CTyByZXN1bHRcbiAqIGNhbm5vdCBiZSByZWFkIGJhY2sgYnkgYW5vdGhlciBjYWxsZXIuXG4gKlxuICogUHJlZmVycyB0aGUge0BsaW5rIFVzZXJ9IHRoYXQge0BsaW5rIE1hc3RyYVNlcnZlcn0gc3RhbXBzIG9uIHRoZSByZXF1ZXN0XG4gKiBjb250ZXh0LiBUaGUgTUNQIHRyYW5zcG9ydCByb3V0ZXMgZG8gbm90IHRocmVhZCB0aGF0IGNvbnRleHQgaW50byB0b29sXG4gKiBleGVjdXRpb24sIHNvIHRob3NlIGZhbGwgYmFjayB0byB0aGUgYW1iaWVudCBleGVjdXRpb24gY29udGV4dCAodGhlIGFjdGl2ZVxuICogT0JPIHNjb3BlLCBvciB0aGUgc2VydmljZSBwcmluY2lwYWwpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVVzZXJLZXkocmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dCk6IHN0cmluZyB7XG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9VU0VSX0tFWSkgYXMgVXNlciB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHVzZXI/LmlkID8/IGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoZ2V0RXhlY3V0aW9uQ29udGV4dCgpKTtcbn1cblxuLyoqIFBnVmVjdG9yIGNvbmZpZyB3aXRoIGFuIG9wdGlvbmFsIE1hc3RyYSBzdG9yZSBpZC4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYU1lbW9yeUNvbmZpZyA9IFBnVmVjdG9yQ29uZmlnICYge1xuICBpZD86IHN0cmluZztcbn07XG5cbi8qKlxuICogRmluZS1ncmFpbmVkIGNvbnRyb2wgZm9yIHRoZSBvcHRpb25hbCBNQ1Agc2VydmVyIGV4cG9zdXJlXG4gKiAoe0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5tY3B9KS4gRXZlcnkgZmllbGQgaXMgb3B0aW9uYWw7IHRoZSBvYmplY3RcbiAqIGZvcm0gb25seSBuZWVkcyB0byBzZXQgd2hhdCBkaWZmZXJzIGZyb20gdGhlIGRlZmF1bHRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYU1jcENvbmZpZyB7XG4gIC8qKlxuICAgKiBTZXJ2ZXIgaWQgdXNlZCBpbiB0aGUgcm91dGUgcGF0aCAoYC9tY3AvPHNlcnZlcklkPi8uLi5gKSBhbmQgYXMgdGhlXG4gICAqIE1DUCByZWdpc3RyeSBpZC4gRGVmYXVsdHMgdG8gdGhlIHBsdWdpbidzIHJlZ2lzdGVyZWQgbmFtZS5cbiAgICovXG4gIHNlcnZlcklkPzogc3RyaW5nO1xuICAvKiogRGlzcGxheSBuYW1lIGFkdmVydGlzZWQgb3ZlciBNQ1AuIERlZmF1bHRzIHRvIGBcIjxkaXNwbGF5TmFtZT4gTUNQXCJgLiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogU2VtYW50aWMgdmVyc2lvbiBhZHZlcnRpc2VkIG92ZXIgTUNQLiBEZWZhdWx0cyB0byBgXCIxLjAuMFwiYC4gKi9cbiAgdmVyc2lvbj86IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGFkdmVydGlzZWQgb3ZlciBNQ1AuICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogRXhwb3NlIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnQgYXMgYW4gYGFza188YWdlbnRJZD5gIE1DUCB0b29sLlxuICAgKiBEZWZhdWx0cyB0byBgdHJ1ZWAgLSB0aGlzIGlzIHRoZSBcImxldmVyYWdlIHRoZSBNYXN0cmEgYWdlbnRzIG92ZXJcbiAgICogTUNQXCIgYmVoYXZpb3IgbW9zdCBjYWxsZXJzIHdhbnQuXG4gICAqL1xuICBhZ2VudHM/OiBib29sZWFuO1xuICAvKipcbiAgICogQWxzbyBleHBvc2UgdGhlIHBsdWdpbidzIGFtYmllbnQgdG9vbHMgKHRoZSBidWlsdC1pbiBgcmVuZGVyX2RhdGFgXG4gICAqIHBsdXMgYW55dGhpbmcgaW4gYGNvbmZpZy50b29sc2ApIGFzIE1DUCB0b29scy4gRGVmYXVsdHMgdG8gYGZhbHNlYDpcbiAgICogdGhlIGFtYmllbnQgdG9vbHMgYXNzdW1lIGFuIGluLXByb2Nlc3MgY2hhdCB0dXJuICh0aGV5IHB1Ymxpc2hcbiAgICogd3JpdGVyIGV2ZW50cyB0aGUgY2hhdCBVSSBjb25zdW1lcyksIHNvIHRoZXkgYXJlbid0IHVzZWZ1bCB0byBhXG4gICAqIHN0YW5kYWxvbmUgTUNQIGNsaWVudC4gVHVybiB0aGlzIG9uIG9ubHkgd2hlbiB0aG9zZSB0b29scyBhcmUgc2FmZVxuICAgKiB0byBjYWxsIG91dC1vZi1iYW5kLlxuICAgKi9cbiAgdG9vbHM/OiBib29sZWFuO1xuICAvKipcbiAgICogRXh0cmEgdG9vbHMgdG8gZXhwb3NlIG92ZXIgTUNQIGJleW9uZCB0aGUgYWdlbnQgLyBhbWJpZW50IHNldHMuXG4gICAqIFVzZSB0aGlzIGZvciB0b29scyB3cml0dGVuIHNwZWNpZmljYWxseSBmb3IgTUNQIGNvbnN1bWVycy5cbiAgICovXG4gIGV4dHJhVG9vbHM/OiBNYXN0cmFUb29scztcbn1cblxuLyoqIENvbmZpZ3VyYXRpb24gYWNjZXB0ZWQgYnkgdGhlIE1hc3RyYSBBcHBLaXQgcGx1Z2luLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFQbHVnaW5Db25maWcgZXh0ZW5kcyBCYXNlUGx1Z2luQ29uZmlnIHtcbiAgLyoqIE1hc3RyYSBPcGVuQUktY29tcGF0aWJsZSBwcm92aWRlciBpZC4gRGVmYXVsdHMgdG8gYFwiZGF0YWJyaWNrc1wiYDsgbm8gZW52IGZhbGxiYWNrLiAqL1xuICBwcm92aWRlcklkPzogc3RyaW5nO1xuICAvKipcbiAgICogUG9zdGdyZXNTdG9yZSBmb3IgTWFzdHJhIHRocmVhZHMvbWVzc2FnZXMuIGB0cnVlYCByZXVzZXMgdGhlXG4gICAqIGBsYWtlYmFzZWAgcGx1Z2luJ3MgcG9vbDsgYW4gb2JqZWN0IG9wZW5zIGEgZGVkaWNhdGVkIHN0b3JlLlxuICAgKi9cbiAgc3RvcmFnZT86IGJvb2xlYW4gfCBQb3N0Z3Jlc1N0b3JlQ29uZmlnO1xuICAvKipcbiAgICogUGdWZWN0b3Igc3RvcmUgZm9yIE1hc3RyYSBtZW1vcnkgcmVjYWxsLiBgdHJ1ZWAgcmV1c2VzIHRoZVxuICAgKiBgbGFrZWJhc2VgIHBsdWdpbidzIHBvb2w7IGFuIG9iamVjdCBvcGVucyBhIGRlZGljYXRlZCBzdG9yZS5cbiAgICovXG4gIG1lbW9yeT86IGJvb2xlYW4gfCBNYXN0cmFNZW1vcnlDb25maWc7XG4gIC8qKlxuICAgKiBDb2RlLWRlZmluZWQgYWdlbnRzLiBBY2NlcHRzIHRocmVlIHNoYXBlcyBmb3IgY29udmVuaWVuY2U6XG4gICAqXG4gICAqIC0gKipSZWNvcmQqKjogYHsgYW5hbHlzdDogZGVmLCBoZWxwZXI6IGRlZiB9YCAtIGtleXMgYmVjb21lIHRoZVxuICAgKiAgIHJlZ2lzdGVyZWQgaWRzIGFuZCB0aGUgZmlyc3Qga2V5IGlzIHRoZSBkZWZhdWx0LlxuICAgKiAtICoqU2luZ2xlIGRlZmluaXRpb24qKjogYGRlZmAgLSByZWdpc3RlcmVkIHVuZGVyXG4gICAqICAgYHNsdWdpZnkoZGVmLm5hbWUpYCAob3IgYFwiZGVmYXVsdFwiYCB3aGVuIGBuYW1lYCBpcyBvbWl0dGVkKSBhbmRcbiAgICogICBhdXRvbWF0aWNhbGx5IG1hcmtlZCBhcyB0aGUgZGVmYXVsdCBhZ2VudC5cbiAgICogLSAqKkFycmF5Kio6IGBbZGVmMSwgZGVmMl1gIC0gZWFjaCByZWdpc3RlcmVkIHVuZGVyXG4gICAqICAgYHNsdWdpZnkoZGVmLm5hbWUpYCAob3IgYGFnZW50XyR7aX1gIHdoZW4gYG5hbWVgIGlzIG9taXR0ZWQpO1xuICAgKiAgIHRoZSBmaXJzdCBlbnRyeSBpcyB0aGUgZGVmYXVsdC5cbiAgICpcbiAgICogRWFjaCBlbnRyeSBiZWNvbWVzIGEgTWFzdHJhIGBBZ2VudGAgcmVhY2hhYmxlIGF0XG4gICAqIGAvYXBpLzxwbHVnaW4+L3JvdXRlL2NoYXQvPGlkPmAgKHRoZSBjaGF0IHJvdXRlIGFsc28gbWF0Y2hlc1xuICAgKiBgOmFnZW50SWRgKS4gV2hlbiBgYWdlbnRzYCBpcyBvbWl0dGVkIGVudGlyZWx5LCB0aGUgcGx1Z2luXG4gICAqIHJlZ2lzdGVycyBhIHNpbmdsZSBidWlsdC1pbiBgZGVmYXVsdGAgYW5hbHlzdCBzbyB0aGUgYmFyZVxuICAgKiBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZyBjaGF0IGVuZHBvaW50LlxuICAgKlxuICAgKiBAZXhhbXBsZSBTaW5nbGUtYWdlbnQgc2hvcnRoYW5kXG4gICAqIGBgYHRzXG4gICAqIG1hc3RyYSh7XG4gICAqICAgYWdlbnRzOiBjcmVhdGVBZ2VudCh7IGluc3RydWN0aW9uczogXCIuLi5cIiB9KSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZSBBcnJheVxuICAgKiBgYGB0c1xuICAgKiBtYXN0cmEoe1xuICAgKiAgIGFnZW50czogW1xuICAgKiAgICAgY3JlYXRlQWdlbnQoeyBuYW1lOiBcImFuYWx5c3RcIiwgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiIH0pLFxuICAgKiAgICAgY3JlYXRlQWdlbnQoeyBuYW1lOiBcImhlbHBlclwiLCBpbnN0cnVjdGlvbnM6IFwiLi4uXCIgfSksXG4gICAqICAgXSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZSBSZWNvcmQgKGV4cGxpY2l0IGlkcylcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHtcbiAgICogICBhZ2VudHM6IHtcbiAgICogICAgIGFuYWx5c3Q6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiIH0pLFxuICAgKiAgICAgaGVscGVyOiBjcmVhdGVBZ2VudCh7IGluc3RydWN0aW9uczogXCIuLi5cIiB9KSxcbiAgICogICB9LFxuICAgKiAgIGRlZmF1bHRBZ2VudDogXCJhbmFseXN0XCIsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFnZW50cz86IFJlY29yZDxzdHJpbmcsIE1hc3RyYUFnZW50RGVmaW5pdGlvbj4gfCBNYXN0cmFBZ2VudERlZmluaXRpb24gfCBNYXN0cmFBZ2VudERlZmluaXRpb25bXTtcbiAgLyoqXG4gICAqIEFtYmllbnQgdG9vbHMgc3ByZWFkIGludG8gZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudCdzIHRvb2xzIHJlY29yZDtcbiAgICogcGVyLWFnZW50IHRvb2xzIHdpbiBvbiBrZXkgY29sbGlzaW9uLiBVc2UgZm9yIGEgc21hbGwgc2hhcmVkXG4gICAqIGxpYnJhcnk7IGZvciBwZXItYWdlbnQgdG9vbHMgc2V0IGBhZ2VudHNbaWRdLnRvb2xzYCBpbnN0ZWFkLlxuICAgKi9cbiAgdG9vbHM/OiBNYXN0cmFUb29scztcbiAgLyoqXG4gICAqIEFnZW50IGlkIHVzZWQgd2hlbiB0aGUgY2xpZW50IGRvZXNuJ3Qgc3BlY2lmeSBvbmUgKHRoZSBiYXJlLFxuICAgKiB1bi1zdWZmaXhlZCBoaXN0b3J5IC8gc3VnZ2VzdGlvbnMgcm91dGVzIHJlc29sdmUgdG8gaXQpLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgZmlyc3Qga2V5IGluIGBhZ2VudHNgIChvciBgXCJkZWZhdWx0XCJgIHdoZW5cbiAgICogYGFnZW50c2AgaXMgb21pdHRlZCkuIE11c3QgbWF0Y2ggYW4gaWQgaW4gYGFnZW50c2Agd2hlbiBib3RoIGFyZVxuICAgKiBzZXQ7IGEgbWlzbWF0Y2ggdGhyb3dzIGF0IHNldHVwIHdpdGggdGhlIGF2YWlsYWJsZSBjYW5kaWRhdGVzLlxuICAgKi9cbiAgZGVmYXVsdEFnZW50Pzogc3RyaW5nO1xuICAvKipcbiAgICogUGx1Z2luLWxldmVsIGRlZmF1bHQgbW9kZWwgYXBwbGllZCB0byBldmVyeSBhZ2VudCB0aGF0IG9taXRzIGl0c1xuICAgKiBvd24gYG1vZGVsYC4gTWlycm9ycyBBcHBLaXQncyBgYWdlbnRzKHsgZGVmYXVsdE1vZGVsIH0pYC5cbiAgICpcbiAgICogLSBgc3RyaW5nYDogc2hvcnRoYW5kIGZvciBcInVzZSB0aGUgT0JPIGF1dG8tcmVzb2x2ZXIgYnV0IHN3YXAgdGhlXG4gICAqICAgYG1vZGVsSWRgXCIgKGUuZy4gYFwiZGF0YWJyaWNrcy1jbGF1ZGUtc29ubmV0LTQtNlwiYCkuXG4gICAqIC0gQW55IG90aGVyIE1hc3RyYSBgRHluYW1pY0FyZ3VtZW50PE1hc3RyYU1vZGVsQ29uZmlnPmA6IHBhc3NlZFxuICAgKiAgIHRocm91Z2ggdmVyYmF0aW0uIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgZnVsbCBjb250cm9sIG92ZXIgYXV0aFxuICAgKiAgIG9yIGBwcm92aWRlcklkYC5cbiAgICpcbiAgICogUmVzb2x1dGlvbiBvcmRlciBwZXIgYWdlbnQ6IGBkZWYubW9kZWxgIOKGkiBgZGVmYXVsdE1vZGVsYCDihpJcbiAgICogYERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FYCDihpIgYnVpbHQtaW4gYC9zZXJ2aW5nLWVuZHBvaW50c2BcbiAgICogcmVzb2x2ZXIuXG4gICAqL1xuICBkZWZhdWx0TW9kZWw/OiBBZ2VudENvbmZpZ1tcIm1vZGVsXCJdIHwgc3RyaW5nO1xuICAvKipcbiAgICogRnV6enktbWF0Y2ggbG9vc2UgbW9kZWwgbmFtZXMgKGBcImNsYXVkZSBzb25uZXRcImApIGFnYWluc3QgdGhlIHdvcmtzcGFjZSdzXG4gICAqIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnRzLiBEZWZhdWx0cyB0byBgdHJ1ZWA7IG5vIGVudiBmYWxsYmFjay5cbiAgICpcbiAgICogU2V0IGBmYWxzZWAgdG8gcmVxdWlyZSBleGFjdCBlbmRwb2ludCBuYW1lcyBldmVyeXdoZXJlLlxuICAgKi9cbiAgbW9kZWxGdXp6eU1hdGNoPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEZ1c2UuanMgc2NvcmUgdGhyZXNob2xkIGZvciB0aGUgZnV6enkgbWF0Y2hlciwgMCAoZXhhY3QpIHRvIDEgKGFueXRoaW5nKS5cbiAgICogRGVmYXVsdHMgdG8gYDAuNGA7IG5vIGVudiBmYWxsYmFjay5cbiAgICpcbiAgICogTG93ZXIgdmFsdWVzIHJlamVjdCBsb29zZSBtYXRjaGVzOyByYWlzZSBpdCBpZiB5b3UgaGF2ZSBhIHNwcmF3bGluZ1xuICAgKiBlbmRwb2ludCBjYXRhbG9ndWUgd2l0aCBzaW1pbGFyLWxvb2tpbmcgbmFtZXMuXG4gICAqL1xuICBtb2RlbEZ1enp5VGhyZXNob2xkPzogbnVtYmVyO1xuICAvKipcbiAgICogVFRMIGZvciB0aGUgaW4tbWVtb3J5IHNlcnZpbmctZW5kcG9pbnRzIGxpc3QgY2FjaGUsIGluIG1pbGxpc2Vjb25kcy5cbiAgICogRGVmYXVsdHMgdG8gNSBtaW51dGVzOyBubyBlbnYgZmFsbGJhY2suXG4gICAqXG4gICAqIFRoZSBjYWNoZSBpcyBwZXIgd29ya3NwYWNlIGhvc3QgYW5kIHNoYXJlZCBhY3Jvc3MgdXNlcnM7IGNvbmN1cnJlbnRcbiAgICogY2FsbGVycyBjb2FsZXNjZSBvbiBhIHNpbmdsZSBpbi1mbGlnaHQgZmV0Y2guXG4gICAqL1xuICBtb2RlbENhY2hlVHRsTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBMZXQgY2xpZW50cyBwaWNrIHRoZSBiYWNraW5nIGVuZHBvaW50IHBlciByZXF1ZXN0LiBEZWZhdWx0cyB0byBgdHJ1ZWA7XG4gICAqIG5vIGVudiBmYWxsYmFjay5cbiAgICpcbiAgICogUmVhZHMgdGhlIGBYLU1hc3RyYS1Nb2RlbGAgaGVhZGVyLCB0aGUgYD9tb2RlbD1gIHF1ZXJ5IHN0cmluZywgb3IgYVxuICAgKiBgbW9kZWxgIGJvZHkgZmllbGQsIGluIHRoYXQgb3JkZXIuIERpc2FibGUgd2hlbiBydW5uaW5nIG11bHRpLXRlbmFudFxuICAgKiB3aGVyZSB1bnRydXN0ZWQgY2xpZW50cyBzaG91bGRuJ3QgY2hvb3NlIHRoZSBlbmRwb2ludC5cbiAgICovXG4gIG1vZGVsT3ZlcnJpZGU/OiBib29sZWFuO1xuICAvKipcbiAgICogUHJpb3JpdHktb3JkZXJlZCBsaXN0IG9mIGVuZHBvaW50IG5hbWVzIHRyaWVkICpmaXJzdCogd2hlbiBub1xuICAgKiBhZ2VudCAvIHBsdWdpbiAvIGVudiAvIHJlcXVlc3Qtb3ZlcnJpZGUgbW9kZWwgaWQgaXMgc2V0LCBhaGVhZCBvZlxuICAgKiB0aGUgZHluYW1pYyBzY29yZS1jbGFzc2lmaWVkIGNhdGFsb2d1ZS4gVGhlIHJlc29sdmVyIHBpY2tzIHRoZVxuICAgKiBmaXJzdCBpZCB0aGF0IGlzIGFjdHVhbGx5IHByZXNlbnQgaW4gdGhlIHdvcmtzcGFjZSdzXG4gICAqIGAvc2VydmluZy1lbmRwb2ludHNgIGxpc3RpbmcuXG4gICAqXG4gICAqIFdoZW4gdW5zZXQsIHJlc29sdXRpb24gaXMgZHJpdmVuIGJ5IHRoZSBsaXZlIEZvdW5kYXRpb24gTW9kZWwgQVBJXG4gICAqIGBxdWFsaXR5YCAvIGBzcGVlZGAgLyBgY29zdGAgc2NvcmVzOiBlbmRwb2ludHMgYXJlIGNsYXNzaWZpZWQgaW50b1xuICAgKiBjaGF0IGNsYXNzZXMgKGBjbGFzc2lmeUVuZHBvaW50c2ApIGFuZCB3YWxrZWQgYmVzdC1maXJzdFxuICAgKiAoQ2hhdFRoaW5raW5nIC0+IENoYXRCYWxhbmNlZCAtPiBDaGF0RmFzdCksIHdpdGggdGhlIHNtYWxsIGJ1aWx0LWluXG4gICAqIGBGQUxMQkFDS19NT0RFTF9JRFNgIGxpc3QgYXMgdGhlIGZsb29yIHdoZW4gdGhlIGNhdGFsb2d1ZSBjYW4ndCBiZVxuICAgKiByZWFkLiBTZXQgdGhpcyB0b1xuICAgKiBwaW4gYSByZWd1bGF0ZWQgd29ya3NwYWNlIHRvIGFuIGFwcHJvdmVkIHN1YnNldCwgb3IgdG8gcHV0IGN1c3RvbVxuICAgKiBlbmRwb2ludHMgaW4gZnJvbnQgb2YgdGhlIGF1dG8tY2xhc3NpZmllZCBjYXRhbG9ndWUuXG4gICAqL1xuICBkZWZhdWx0TW9kZWxGYWxsYmFja3M/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgIChkZWZhdWx0KSwgZXZlcnkgYWdlbnQgZ2V0cyBhIGJ1aWx0LWluIGlucHV0XG4gICAqIHByb2Nlc3NvciB0aGF0IHN0cmlwcyBgY2hhcnRJZGAgZmllbGRzIGZyb20gcHJpb3IgYXNzaXN0YW50XG4gICAqIHRvb2wtaW52b2NhdGlvbiByZXN1bHRzIGJlZm9yZSB0aGV5IHJlYWNoIHRoZSBtb2RlbC4gVGhpc1xuICAgKiBwcmV2ZW50cyB0aGUgbW9kZWwgZnJvbSByZXVzaW5nIHR1cm4tc2NvcGVkIGNoYXJ0SWRzIGl0IHNlZXNcbiAgICogaW4gbWVtb3J5IHJlY2FsbCAod2hpY2ggd291bGQgbGVhdmUgYFtjaGFydDo8aWQ+XWAgbWFya2Vyc1xuICAgKiBwb2ludGluZyBhdCB3cml0ZXIgZXZlbnRzIHRoYXQgbm8gbG9uZ2VyIGV4aXN0KS5cbiAgICpcbiAgICogU2V0IHRvIGBmYWxzZWAgdG8gb3B0IG91dCAtIHVzZWZ1bCBpZiBhIG5vbi1kZWZhdWx0IGFnZW50XG4gICAqIG5lZWRzIGZ1bGwgdmlzaWJpbGl0eSBpbnRvIHByaW9yIGNoYXJ0SWRzIChlLmcuIGFuIGF1ZGl0XG4gICAqIGFnZW50IHJlYXNvbmluZyBhYm91dCBjaGFydCBsaW5lYWdlKS5cbiAgICovXG4gIHN0cmlwU3RhbGVDaGFydHM/OiBib29sZWFuO1xuICAvKipcbiAgICogU3R5bGUgZ3VhcmRyYWlscyBhcHBlbmRlZCB0byBldmVyeSBhZ2VudCdzIGBpbnN0cnVjdGlvbnNgIHRvIGN1cmJcbiAgICogY29tbW9uIExMTS1pc21zIChlbSBkYXNoZXMsIGVtb2ppcywgc3ljb3BoYW50aWMgb3BlbmVycywgdGhyb3dhd2F5XG4gICAqIGNsb3NlcnMsIGV4Y2Vzc2l2ZSBoZWRnaW5nKS5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IHVzZSB0aGUgYnVpbHQtaW5cbiAgICogICBgREVGQVVMVF9TVFlMRV9JTlNUUlVDVElPTlNgIGZyb20gYGFnZW50cy50c2AuXG4gICAqIC0gYHN0cmluZ2A6IHJlcGxhY2UgdGhlIGRlZmF1bHQgd2l0aCB0aGUgc3VwcGxpZWQgYmxvY2suXG4gICAqIC0gYGZhbHNlYDogZGlzYWJsZSBlbnRpcmVseSAoYWdlbnRzIHNlZSBvbmx5IHRoZWlyIGJlc3Bva2VcbiAgICogICBgaW5zdHJ1Y3Rpb25zYCkuXG4gICAqXG4gICAqIEFwcGVuZGVkIChub3QgcHJlcGVuZGVkKSBzbyB0aGUgYWdlbnQncyByb2xlIGFuZCBydWxlcyBjb21lIGZpcnN0XG4gICAqIGFuZCB0aGUgc3R5bGUgYmxvY2sgbGVhbnMgb24gdGhlIG1vZGVsJ3MgcmVjZW5jeSBiaWFzLlxuICAgKi9cbiAgc3R5bGVJbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBmYWxzZTtcbiAgLyoqXG4gICAqIEdlbmllIHNwYWNlcyB0aGlzIHBsdWdpbidzIGFnZW50cyBjYW4gZGVsZWdhdGUgdG8uIE9uZSBNYXN0cmFcbiAgICogdG9vbCBpcyByZWdpc3RlcmVkIHBlciBhbGlhcyAoYGdlbmllYCBmb3IgdGhlIHdlbGwta25vd25cbiAgICogYGRlZmF1bHRgIGFsaWFzLCBgZ2VuaWVfPGFsaWFzPmAgb3RoZXJ3aXNlKS4gRWFjaCB0b29sIHNwaW5zXG4gICAqIHVwIGEgcGVyLXF1ZXN0aW9uIEdlbmllIHN1Yi1hZ2VudCB0aGF0IHJ1bnMgRGF0YWJyaWNrc1xuICAgKiBcImFnZW50IG1vZGVcIiBhZ2FpbnN0IHRoZSBzcGFjZSwgYnJvYWRjYXN0cyB3aXJlIGV2ZW50cyB0byB0aGVcbiAgICogVUksIGZldGNoZXMgc3RhdGVtZW50IHJvd3MgZm9yIG5vbi1lbXB0eSByZXN1bHRzLCBhbmQgcmV0dXJuc1xuICAgKiBhIGAoc3RyaW5nIHwgZGF0YSB8IGNoYXJ0KVtdYCBzdW1tYXJ5IHRoZSBob3N0IFVJIHJlbmRlcnNcbiAgICogaW5saW5lLlxuICAgKlxuICAgKiBFbnRyaWVzIGFjY2VwdCBlaXRoZXIgYSBmdWxsIHtAbGluayBHZW5pZVNwYWNlQ29uZmlnfSBvYmplY3RcbiAgICogb3IgYSBiYXJlIGBzcGFjZV9pZGAgc3RyaW5nIHdoZW4gbm8gZXh0cmFzIGFyZSBuZWVkZWQ6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIG1hc3RyYSh7XG4gICAqICAgZ2VuaWVTcGFjZXM6IHtcbiAgICogICAgIGRlZmF1bHQ6IFwiMDFlZjBkM2MwZTFiMWY0YThkMmMzZTRmNWE2YjdjOGRcIixcbiAgICogICAgIGZvcmVjYXN0czogeyBzcGFjZUlkOiBcIjAxZWYuLi5cIiwgaGludDogXCJ3ZWVrbHkgZGVtYW5kIGZvcmVjYXN0c1wiIH0sXG4gICAqICAgfSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBSZWFjaCB0aGUgc3BhY2VzIGZyb20gYW4gYWdlbnQncyBgdG9vbHMocGx1Z2lucylgIGNhbGxiYWNrIHZpYVxuICAgKiBgcGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpYDsgdGhlIHJlc3VsdGluZyB0b29scyBhY2NlcHRcbiAgICogYHsgY29udGVudCwgY29udmVyc2F0aW9uSWQ/IH1gIGFuZCByZXR1cm4gYSBoeWRyYXRlZCBzdW1tYXJ5LlxuICAgKlxuICAgKiAqKkZhbGxiYWNrIGRpc2NvdmVyeSoqIChoaWdoZXN0IHByZWNlZGVuY2UgZmlyc3QpOiBpZiB0aGlzXG4gICAqIGZpZWxkIGlzIG9taXR0ZWQsIHRoZSBHZW5pZSBhZ2VudCBhbHNvIHBpY2tzIHVwIHNwYWNlcyBmcm9tXG4gICAqICgxKSB0aGUgQXBwS2l0IGBnZW5pZSh7IHNwYWNlczogeyAuLi4gfSB9KWAgcGx1Z2luIGluc3RhbmNlXG4gICAqIHdoZW4gcmVnaXN0ZXJlZCwgYW5kICgyKSB0aGUgYERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSURgXG4gICAqIGVudiB2YXIgKHJlZ2lzdGVyZWQgdW5kZXIgdGhlIGBkZWZhdWx0YCBhbGlhcykuIFRoaXMga2VlcHNcbiAgICogZXhpc3RpbmcgQXBwS2l0IGRlcGxveW1lbnRzIHdvcmtpbmcgd2l0aG91dCByZXN0YXRpbmcgdGhlXG4gICAqIHNwYWNlcyBjb25maWcgaW4gdHdvIHBsYWNlcy5cbiAgICovXG4gIGdlbmllU3BhY2VzPzogR2VuaWVTcGFjZXNDb25maWc7XG4gIC8qKlxuICAgKiBUVEwgZm9yIHRoZSBpbi1tZW1vcnkgR2VuaWUgc3BhY2UgbWV0YWRhdGEgY2FjaGUsIGluXG4gICAqIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gNSBtaW51dGVzLiBUaGUgR2VuaWUgYWdlbnQgY2FsbHNcbiAgICogYGNsaWVudC5nZW5pZS5nZXRTcGFjZSguLi4pYCBvbiBldmVyeSBjb2xkLXN0YXJ0IHRvIGdldCB0aGVcbiAgICogdGl0bGUgLyBkZXNjcmlwdGlvbiAvIHdhcmVob3VzZSBpZDsgY2FjaGVkIHJlc3BvbnNlcyBza2lwIHRoZVxuICAgKiByb3VuZC10cmlwIGFuZCBjb25jdXJyZW50IGNhbGxlcnMgY29hbGVzY2Ugb24gYSBzaW5nbGVcbiAgICogaW4tZmxpZ2h0IGZldGNoLiBEcm9wIHRvIGEgc21hbGxlciB2YWx1ZSB3aGVuIGFuYWx5c3RzIGFyZVxuICAgKiBhY3RpdmVseSBlZGl0aW5nIHNwYWNlIG1ldGFkYXRhIGFuZCB5b3Ugd2FudCBjaGFuZ2VzIHZpc2libGVcbiAgICogd2l0aGluIHNlY29uZHM7IHJhaXNlIGl0IHRvIGFtb3J0aXNlIHRoZSByb3VuZC10cmlwIHdoZW5cbiAgICogc3BhY2UgbWV0YWRhdGEgaXMgZWZmZWN0aXZlbHkgZnJvemVuLlxuICAgKlxuICAgKiBCYWNrZWQgYnkgQXBwS2l0J3MgYENhY2hlTWFuYWdlcmAsIHNvIHRoZSBjYWNoZSBwYXJ0aWNpcGF0ZXNcbiAgICogaW4gdGVsZW1ldHJ5IHNwYW5zIChgY2FjaGUuZ2V0T3JFeGVjdXRlYCkgYW5kIGJlbmVmaXRzIGZyb21cbiAgICogTGFrZWJhc2UgcGVyc2lzdGVuY2Ugd2hlbiB0aGUgYGxha2ViYXNlYCBwbHVnaW4gaXMgd2lyZWQgdXAuXG4gICAqL1xuICBnZW5pZVNwYWNlQ2FjaGVUdGxNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1heGltdW0gTExNIHN0ZXBzIGVhY2ggYWdlbnQgZ2V0cyBwZXIgdHVybi4gT25lIHN0ZXAgPSBvbmVcbiAgICogcm91bmQtdHJpcCB0byB0aGUgdW5kZXJseWluZyBtb2RlbCAoYSB0b29sIGNhbGwgY29uc3VtZXMgYVxuICAgKiBzdGVwLCB0aGUgZmluYWwtdGV4dCByZXBseSBjb25zdW1lcyBvbmUgdG9vKS4gQXBwbGllcyB0b1xuICAgKiBldmVyeSBhZ2VudCByZWdpc3RlcmVkIHRocm91Z2gge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudHN9XG4gICAqIC0gcGVyLWFnZW50IG92ZXJyaWRlcyBhcmVuJ3Qgc3VyZmFjZWQgeWV0IGJlY2F1c2UgdGhlIHNhbWVcbiAgICogY2VpbGluZyBoYXMgYmVlbiBzdWZmaWNpZW50IGFjcm9zcyBldmVyeSB3b3JrbG9hZCB3ZSd2ZSBydW4uXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0FHRU5UX01BWF9TVEVQU30gKDI1KSwgc2l6ZWQgdG8gZml0XG4gICAqIGEgZGVjb21wb3NlZCBHZW5pZSB0dXJuIChncm91bmRpbmcgKyBzZXZlcmFsIGBhc2tfZ2VuaWVgIGNhbGxzXG4gICAqICsgYHByZXBhcmVfY2hhcnRgIHBlciBkYXRhc2V0ICsgdGhlIGZpbmFsLXRleHQgcmVwbHkpIHdpdGhcbiAgICogaGVhZHJvb20gZm9yIHRoZSBtb2RlbCB0byBjaGFpbiBhIGNvdXBsZSBvZiBmb2xsb3ctdXBzIGJlZm9yZVxuICAgKiBhbnN3ZXJpbmcuIE1hc3RyYSdzIG93biBgYWdlbnQuZ2VuZXJhdGVgIGRlZmF1bHQgb2YgNSB3b3VsZFxuICAgKiBjdXQgbXVsdGktc3RlcCBvcmNoZXN0cmF0aW9uIG9mZiBhZnRlciAyLTMgdG9vbCBjYWxscywgc29cbiAgICogZXhwbGljaXRseSByYWlzaW5nIHRoZSBjZWlsaW5nIGhlcmUgaXMgd2hhdCBsZXRzIHRoZVxuICAgKiBhZ2VudC1tb2RlIGxvb3AgcGxheSBvdXQuXG4gICAqXG4gICAqIExvd2VyIHdoZW4gYW4gdW51c3VhbGx5IHNsb3cgb3IgZXhwZW5zaXZlIG1vZGVsIG1ha2VzIGxvbmdcbiAgICogdHVybnMgdW5hZmZvcmRhYmxlOyByYWlzZSBmb3IgZXhwbG9yYXRvcnkgd29ya2xvYWRzIHRoYXQgbmVlZFxuICAgKiB0byBkcmlsbCBkZWVwIGludG8gYSBkYXRhc2V0IHdpdGhpbiBhIHNpbmdsZSB0dXJuLlxuICAgKi9cbiAgYWdlbnRNYXhTdGVwcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdpcmUgTWFzdHJhIHNwYW5zIGludG8gQXBwS2l0J3MgZ2xvYmFsIE9UZWwgcGlwZWxpbmUgdmlhXG4gICAqIGBAbWFzdHJhL290ZWwtYnJpZGdlYC5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCwgYXV0byk6IG9uIG9ubHkgd2hlblxuICAgKiAgIGBPVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlRgIG9yXG4gICAqICAgYE9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfRU5EUE9JTlRgIGlzIHNldC4gV2hlbiB1bnNldCwgdGhlXG4gICAqICAgYnJpZGdlIGlzIHNraXBwZWQgc28gTWFzdHJhIGRvZXMgbm90IGxvZ1xuICAgKiAgIGBbT3RlbEJyaWRnZV0gTm8gT1RFTCBzcGFuIGZvdW5kYCBvbiB0aGUgbm9vcCB0cmFjZXIuXG4gICAqIC0gYHRydWVgOiBmb3JjZSBvbiBldmVuIHdpdGhvdXQgYW4gT1RMUCBlbmRwb2ludC5cbiAgICogLSBgZmFsc2VgOiBmb3JjZSBvZmYuXG4gICAqL1xuICBvYnNlcnZhYmlsaXR5PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIExvZyB1c2VyIGZlZWRiYWNrICh0aHVtYnMgdXAvZG93biArIGZyZWVmb3JtIGNvbW1lbnRzKSB0byBNTGZsb3cgYXNcbiAgICogdHJhY2UgYXNzZXNzbWVudHMsIGFuZCBzdXJmYWNlIHRoZSBmZWVkYmFjayBjb250cm9scyBpbiB0aGUgY2hhdCBVSS5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCwgYXV0byk6IGVuYWJsZWQgb25seSB3aGVuIE1MZmxvdyB0cmFjaW5nIGlzXG4gICAqICAgd2lyZWQgLSBhbiBPVExQIGV4cG9ydGVyIGVuZHBvaW50IGlzIHNldCBhbmQgYW4gTUxmbG93IGV4cGVyaW1lbnRcbiAgICogICBpcyBuYW1lZCAodGhlIHNhbWUgc2lnbmFscyB0aGUgb2JzZXJ2YWJpbGl0eSBwaXBlbGluZSBuZWVkcyB0b1xuICAgKiAgIHNoaXAgdHJhY2VzIHRvIE1MZmxvdykuIE90aGVyd2lzZSBvZmYsIHNpbmNlIHRoZXJlJ2QgYmUgbm8gdHJhY2VcbiAgICogICB0byBhdHRhY2ggZmVlZGJhY2sgdG8uXG4gICAqIC0gYHRydWVgOiBmb3JjZSBvbi4gRmVlZGJhY2sgY29udHJvbHMgc2hvdyBhbmQgd3JpdGVzIGFyZSBhdHRlbXB0ZWRcbiAgICogICByZWdhcmRsZXNzIG9mIGVudiBkZXRlY3Rpb24gKHVzZSB3aGVuIHRoZSBlbnYgaXMgY29uZmlndXJlZCBpbiBhXG4gICAqICAgd2F5IHRoZSBhdXRvLXByb2JlIGRvZXNuJ3QgcmVjb2duaXplKS5cbiAgICogLSBgZmFsc2VgOiBmb3JjZSBvZmYuIE5vIHRyYWNlLWlkIGhlYWRlciwgbm8gZmVlZGJhY2sgcm91dGUsIG5vIFVJLlxuICAgKlxuICAgKiBGZWVkYmFjayBhdHRhY2hlcyB0byBhIHR1cm4ncyBNTGZsb3cgdHJhY2UgdmlhIHRoZSBPcGVuVGVsZW1ldHJ5XG4gICAqIHRyYWNlIGlkIHRoZSBzZXJ2ZXIgc3RhbXBzIG9uIGVhY2ggcmVzcG9uc2U7IHNlZSBgbWxmbG93LnRzYC5cbiAgICovXG4gIGZlZWRiYWNrPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEV4cG9zZSB0aGUgcGx1Z2luJ3MgYWdlbnRzIChhbmQgb3B0aW9uYWxseSB0b29scykgYXMgYSBNYXN0cmEgTUNQXG4gICAqIHNlcnZlciBzbyBleHRlcm5hbCBNQ1AgY2xpZW50cyAtIENsYXVkZSBEZXNrdG9wLCBDdXJzb3IsIHRoZSBNYXN0cmFcbiAgICogcGxheWdyb3VuZCwgb3IgYW5vdGhlciBhZ2VudCAtIGNhbiBjYWxsIHRoZW0gb3ZlciB0aGUgc3RhbmRhcmQgTUNQXG4gICAqIHRyYW5zcG9ydHMuIEVuYWJsZWQgYnkgZGVmYXVsdCAoYWdlbnRzIG9ubHkpOiB3cmFwcGluZyB0aGVcbiAgICogYWxyZWFkeS1yZWdpc3RlcmVkIGFnZW50cyBjb3N0cyBub3RoaW5nIGV4dHJhLCBzbyB0aGUgZW5kcG9pbnQgaXMgb25cbiAgICogb3V0IG9mIHRoZSBib3g7IG9ubHkgdGhlIGFtYmllbnQgdG9vbHMgKHdoaWNoIGFzc3VtZSBhbiBpbi1wcm9jZXNzXG4gICAqIGNoYXQgdHVybikgc3RheSBvZmYgdW5sZXNzIGV4cGxpY2l0bHkgb3B0ZWQgaW4uXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpIC8gYHRydWVgOiBleHBvc2UgZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudCBhc1xuICAgKiAgIGFuIGBhc2tfPGFnZW50SWQ+YCBNQ1AgdG9vbCB1bmRlciBhIHNlcnZlciB3aG9zZSBpZCBpcyB0aGUgcGx1Z2luXG4gICAqICAgbmFtZS5cbiAgICogLSBgZmFsc2VgOiBubyBNQ1AgZW5kcG9pbnRzLlxuICAgKiAtIHtAbGluayBNYXN0cmFNY3BDb25maWd9OiBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIHRoZSBzZXJ2ZXIgaWQsXG4gICAqICAgYWR2ZXJ0aXNlZCBtZXRhZGF0YSwgYW5kIHdoaWNoIGFnZW50cyAvIHRvb2xzIGFyZSBleHBvc2VkLlxuICAgKlxuICAgKiBXaGVuIGVuYWJsZWQsIHRoZSBzdG9jayBNYXN0cmEgTUNQIHJvdXRlcyBtb3VudCB1bmRlciB0aGUgcGx1Z2luJ3NcbiAgICogYmFzZSBwYXRoIChubyBiZXNwb2tlIHJvdXRlIGlzIGFkZGVkIC0gdGhlIHNlcnZlciBpcyBoYW5kZWQgdG8gdGhlXG4gICAqIGBNYXN0cmFgIGluc3RhbmNlIHZpYSBgbWNwU2VydmVyc2AsIHdoaWNoIGBAbWFzdHJhL2V4cHJlc3NgIHNlcnZlcyk6XG4gICAqXG4gICAqIC0gU3RyZWFtYWJsZSBIVFRQOiBgUE9TVCAvYXBpLzxwbHVnaW4+L21jcC88c2VydmVySWQ+L21jcGBcbiAgICogLSBTU0UgKGxlZ2FjeSk6ICAgIGBHRVQgIC9hcGkvPHBsdWdpbj4vbWNwLzxzZXJ2ZXJJZD4vc3NlYFxuICAgKiAgICAgICAgICAgICAgICAgICAgYFBPU1QgL2FwaS88cGx1Z2luPi9tY3AvPHNlcnZlcklkPi9tZXNzYWdlc2BcbiAgICpcbiAgICogUmVxdWVzdHMgcnVuIHVuZGVyIHRoZSBzYW1lIEFwcEtpdCBPQk8gc2NvcGUgYXMgdGhlIGNoYXQgcm91dGVzLCBzb1xuICAgKiBhbiBhZ2VudCBpbnZva2VkIG92ZXIgTUNQIHJlc29sdmVzIGl0cyBtb2RlbCBhbmQgdG9vbHMgYXMgdGhlXG4gICAqIGNhbGxpbmcgdXNlci5cbiAgICovXG4gIG1jcD86IGJvb2xlYW4gfCBNYXN0cmFNY3BDb25maWc7XG4gIC8qKlxuICAgKiBIb3cgbXVjaCBvZiB0aGUgc3RvY2sgYEBtYXN0cmEvZXhwcmVzc2AgbWFuYWdlbWVudCBBUEkgaXMgcmVhY2hhYmxlXG4gICAqIHRocm91Z2ggdGhlIHBsdWdpbiBtb3VudC4gYEBtYXN0cmEvZXhwcmVzc2AgcmVnaXN0ZXJzIGl0cyBmdWxsIHJvdXRlXG4gICAqIHRhYmxlIChhZ2VudCBpbmZlcmVuY2UgcGx1cyBhZG1pbiAvIG11dGF0aW5nIHJvdXRlczogZGlyZWN0IHRvb2xcbiAgICogZXhlY3V0aW9uLCB3b3JrZmxvdyBjb250cm9sLCByYXcgbWVtb3J5IHJlYWQvd3JpdGUsIHRlbGVtZXRyeSwgbG9ncyxcbiAgICogc2NvcmVzKS4gQXBwS2l0IGFscmVhZHkgYXV0aGVudGljYXRlcyBldmVyeSByZXF1ZXN0IGFzIHRoZSBPQk8gdXNlcixcbiAgICogYnV0IG5vdGhpbmcgdGhlcmUgcmVzdHJpY3RzICp3aGljaCogb2YgdGhvc2Ugb3BlcmF0aW9ucyB0aGUgYnJvd3NlclxuICAgKiBjbGllbnQgbWF5IGludm9rZS5cbiAgICpcbiAgICogLSBgXCJzY29wZWRcImAgKGRlZmF1bHQpOiBvbmx5IHRoZSByb3V0ZXMgdGhlIGNoYXQgY2xpZW50IGxlZ2l0aW1hdGVseVxuICAgKiAgIG5lZWRzIGFyZSBkaXNwYXRjaGVkIHRvIE1hc3RyYSAtIGFnZW50IGluZmVyZW5jZVxuICAgKiAgIChgc3RyZWFtYCAvIGBnZW5lcmF0ZWAgLyBgbmV0d29ya2ApLCByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEsIHRoaXNcbiAgICogICBwbHVnaW4ncyBvd24gT0JPLSBhbmQgcmVzb3VyY2Utc2NvcGVkIGAvcm91dGUvKmAgcm91dGVzIChoaXN0b3J5IC9cbiAgICogICB0aHJlYWRzKSwgYW5kLCB3aGVuIHtAbGluayBtY3B9IGlzIGVuYWJsZWQsIHRoZSBNQ1AgdHJhbnNwb3J0LlxuICAgKiAgIEV2ZXJ5dGhpbmcgZWxzZSAodG9vbCBleGVjdXRpb24sIHdvcmtmbG93IGNvbnRyb2wsIHJhdyBtZW1vcnksXG4gICAqICAgdGVsZW1ldHJ5LCBsb2dzLCBzY29yZXMsIGFuZCBvdGhlciBtdXRhdGlvbnMpIGlzIHJlamVjdGVkIHdpdGhcbiAgICogICBgNDAzYCBiZWZvcmUgaXQgcmVhY2hlcyBNYXN0cmEuXG4gICAqIC0gYFwiZnVsbFwiYDogZGlzcGF0Y2ggdGhlIGVudGlyZSBzdG9jayBNYXN0cmEgQVBJLiBVc2Ugb25seSBmb3IgYVxuICAgKiAgIHRydXN0ZWQgZmlyc3QtcGFydHkgY29uc29sZSB0aGF0IGdlbnVpbmVseSBuZWVkcyB0aGUgbWFuYWdlbWVudFxuICAgKiAgIHN1cmZhY2UuXG4gICAqL1xuICBhcGlBY2Nlc3M/OiBcInNjb3BlZFwiIHwgXCJmdWxsXCI7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBicmFuZCBjb250ZXh0IGFwcGxpZWQgdG8gY2hhcnRzIHByb2R1Y2VkIGJ5IHRoZSBidWlsdC1pblxuICAgKiBgcmVuZGVyX2RhdGFgIC8gYHByZXBhcmVfY2hhcnRgIHRvb2xzLiBXaGVuIHNldCwgdGhlIGNoYXJ0IHBsYW5uZXInc1xuICAgKiBFY2hhcnRzIG91dHB1dCBpcyB0aGVtZWQgd2l0aCB0aGUgYnJhbmQncyBwYWxldHRlIChzZXJpZXMgY29sb3JzIGRlcml2ZWRcbiAgICogZnJvbSBgY29sb3JzLnByaW1hcnlgIC8gYGNvbG9ycy5hY2NlbnRgKSBhbmQgc2FucyBmb250XG4gICAqIChgdHlwb2dyYXBoeS5zYW5zYCkgaW5zdGVhZCBvZiBFY2hhcnRzJyBkZWZhdWx0cy4gT21pdCBmb3IgdGhlIGRlZmF1bHRcbiAgICogRWNoYXJ0cyBsb29rLlxuICAgKlxuICAgKiBQYXNzIHRoZSBwb3J0YWJsZSB7QGxpbmsgQnJhbmRDb250ZXh0fSBzaGFyZWQgYWNyb3NzIHRoZSBVSSBhbmRcbiAgICogbGlicmFyaWVzIChlLmcuIGBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0YCBmcm9tIGBAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlYCxcbiAgICogb3IgYSBjdXN0b21lciBicmFuZCkgLSB0aGUgc2FtZSBvYmplY3QgdGhlIGVtYWlsIGFkZC1vbiBhbmQgdGhlIFVJXG4gICAqIGBCcmFuZFByb3ZpZGVyYCBjb25zdW1lLCBzbyBhIGhvc3QgdGhlbWVzIGNoYXJ0cywgZW1haWwsIGFuZCBVSSBmcm9tIG9uZVxuICAgKiBzb3VyY2UuXG4gICAqL1xuICBicmFuZD86IEJyYW5kQ29udGV4dDtcbn1cblxuLyoqXG4gKiBKU09OIFNjaGVtYSBwdWJsaXNoZWQgb24gdGhlIG1hbmlmZXN0J3MgYGNvbmZpZy5zY2hlbWFgLCBtaXJyb3JpbmcgdGhlXG4gKiBkb2N1bWVudGVkIGRlZmF1bHRzIGFuZCBlbnZpcm9ubWVudCBmYWxsYmFja3Mgb2Yge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZ30uXG4gKlxuICogQ292ZXJzIHRoZSBKU09OLWV4cHJlc3NpYmxlIG9wdGlvbnMgb25seS4gYGFnZW50c2AsIGB0b29sc2AsIGFuZCBhXG4gKiBgZGVmYXVsdE1vZGVsYCBwYXNzZWQgYXMgYSBNYXN0cmEgYER5bmFtaWNBcmd1bWVudGAgYXJlIGNvZGUtZGVmaW5lZFxuICogKGZ1bmN0aW9ucyAvIGNsYXNzIGluc3RhbmNlcyksIHNvIHRoZXkgY2Fycnkgbm8gc2NoZW1hIGVudHJ5OyB0aGVcbiAqIGBkZWZhdWx0TW9kZWxgIHByb3BlcnR5IGJlbG93IGRlc2NyaWJlcyBpdHMgc3RyaW5nIGZvcm0uXG4gKi9cbmV4cG9ydCBjb25zdCBNQVNUUkFfQ09ORklHX1NDSEVNQTogQ29uZmlnU2NoZW1hID0ge1xuICB0eXBlOiBcIm9iamVjdFwiLFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgcHJvdmlkZXJJZDoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOiAnTWFzdHJhIE9wZW5BSS1jb21wYXRpYmxlIHByb3ZpZGVyIGlkLiBEZWZhdWx0cyB0byBcImRhdGFicmlja3NcIi4nLFxuICAgIH0sXG4gICAgc3RvcmFnZToge1xuICAgICAgdHlwZTogW1wiYm9vbGVhblwiLCBcIm9iamVjdFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlBvc3RncmVzU3RvcmUgZm9yIE1hc3RyYSB0aHJlYWRzIC8gbWVzc2FnZXMuIGB0cnVlYCByZXVzZXMgdGhlIGBsYWtlYmFzZWAgcGx1Z2luJ3MgcG9vbCwgYW4gb2JqZWN0IG9wZW5zIGEgZGVkaWNhdGVkIHN0b3JlLiBBdXRvLWVuYWJsZWQgd2hlbiB0aGUgYGxha2ViYXNlYCBwbHVnaW4gaXMgcmVnaXN0ZXJlZC5cIixcbiAgICB9LFxuICAgIG1lbW9yeToge1xuICAgICAgdHlwZTogW1wiYm9vbGVhblwiLCBcIm9iamVjdFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlBnVmVjdG9yIHN0b3JlIGZvciBNYXN0cmEgc2VtYW50aWMgcmVjYWxsLiBgdHJ1ZWAgcmV1c2VzIHRoZSBgbGFrZWJhc2VgIHBsdWdpbidzIHBvb2wsIGFuIG9iamVjdCBvcGVucyBhIGRlZGljYXRlZCBzdG9yZS4gQXV0by1lbmFibGVkIHdoZW4gdGhlIGBsYWtlYmFzZWAgcGx1Z2luIGlzIHJlZ2lzdGVyZWQuXCIsXG4gICAgfSxcbiAgICBkZWZhdWx0QWdlbnQ6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJBZ2VudCBpZCB1c2VkIHdoZW4gdGhlIGNsaWVudCBuYW1lcyBub25lLiBEZWZhdWx0cyB0byB0aGUgZmlyc3QgcmVnaXN0ZXJlZCBhZ2VudCwgZWxzZSB0aGUgYnVpbHQtaW4gYGRlZmF1bHRgLlwiLFxuICAgIH0sXG4gICAgZGVmYXVsdE1vZGVsOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiU2VydmluZyBlbmRwb2ludCBhcHBsaWVkIHRvIGV2ZXJ5IGFnZW50IHRoYXQgb21pdHMgaXRzIG93biBtb2RlbC4gRmFsbHMgYmFjayB0byBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRSwgdGhlbiB0aGUgYXV0by1yZXNvbHZlZCBjYXRhbG9ndWUuXCIsXG4gICAgfSxcbiAgICBkZWZhdWx0TW9kZWxGYWxsYmFja3M6IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlByaW9yaXR5LW9yZGVyZWQgZW5kcG9pbnQgbmFtZXMgdHJpZWQgYmVmb3JlIHRoZSBzY29yZS1jbGFzc2lmaWVkIGNhdGFsb2d1ZSB3aGVuIG5vdGhpbmcgZWxzZSBwaW5zIGEgbW9kZWwuXCIsXG4gICAgfSxcbiAgICBtb2RlbEZ1enp5TWF0Y2g6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiRnV6enktbWF0Y2ggbG9vc2UgbW9kZWwgbmFtZXMgYWdhaW5zdCB0aGUgd29ya3NwYWNlIGNhdGFsb2d1ZS4gRGVmYXVsdHMgdG8gdHJ1ZS5cIixcbiAgICB9LFxuICAgIG1vZGVsRnV6enlUaHJlc2hvbGQ6IHtcbiAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJGdXNlLmpzIHNjb3JlIHRocmVzaG9sZCBmb3IgdGhlIGZ1enp5IG1hdGNoZXIsIDAgKGV4YWN0KSB0byAxIChhbnl0aGluZykuIERlZmF1bHRzIHRvIDAuNC5cIixcbiAgICB9LFxuICAgIG1vZGVsQ2FjaGVUdGxNczoge1xuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlRUTCBpbiBtcyBmb3IgdGhlIHNlcnZpbmctZW5kcG9pbnRzIGxpc3QgY2FjaGUsIHBlciB3b3Jrc3BhY2UgaG9zdC4gRGVmYXVsdHMgdG8gNSBtaW51dGVzLlwiLFxuICAgIH0sXG4gICAgbW9kZWxPdmVycmlkZToge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJIb25vciBhIHBlci1yZXF1ZXN0IG1vZGVsIG92ZXJyaWRlIGZyb20gdGhlIFgtTWFzdHJhLU1vZGVsIGhlYWRlciwgP21vZGVsPSBxdWVyeSwgb3IgYSBgbW9kZWxgIGJvZHkgZmllbGQuIERlZmF1bHRzIHRvIHRydWUuXCIsXG4gICAgfSxcbiAgICBnZW5pZVNwYWNlczoge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7IHR5cGU6IFtcInN0cmluZ1wiLCBcIm9iamVjdFwiXSB9LFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiR2VuaWUgc3BhY2VzIHRoZSBhZ2VudHMgY2FuIGRlbGVnYXRlIHRvLCBrZXllZCBieSBhbGlhcyAodGhlIHRvb2wtbmFtZSBzdWZmaXgpLiBFYWNoIHZhbHVlIGlzIGEgc3BhY2UgaWQgb3IgYHsgc3BhY2VJZCwgaGludCB9YC4gRmFsbHMgYmFjayB0byB0aGUgYGdlbmllYCBwbHVnaW4ncyBvd24gYHNwYWNlc2AgY29uZmlnLCB0aGVuIERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSUQgdW5kZXIgdGhlIGBkZWZhdWx0YCBhbGlhcy5cIixcbiAgICB9LFxuICAgIGdlbmllU3BhY2VDYWNoZVR0bE1zOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiVFRMIGluIG1zIGZvciB0aGUgR2VuaWUgc3BhY2UgbWV0YWRhdGEgY2FjaGUuIERlZmF1bHRzIHRvIDUgbWludXRlcy5cIixcbiAgICB9LFxuICAgIGFnZW50TWF4U3RlcHM6IHtcbiAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJNYXhpbXVtIExMTSBzdGVwcyBlYWNoIGFnZW50IGdldHMgcGVyIHR1cm4gKGEgdG9vbCBjYWxsIGFuZCB0aGUgZmluYWwgcmVwbHkgZWFjaCBjb25zdW1lIG9uZSkuIERlZmF1bHRzIHRvIDI1LlwiLFxuICAgIH0sXG4gICAgc3RyaXBTdGFsZUNoYXJ0czoge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJTdHJpcCBjaGFydElkcyBmcm9tIHJlY2FsbGVkIGFzc2lzdGFudCB0b29sIHJlc3VsdHMgc28gdGhlIG1vZGVsIGNhbm5vdCByZXVzZSBhIHR1cm4tc2NvcGVkIGNoYXJ0IG1hcmtlci4gRGVmYXVsdHMgdG8gdHJ1ZS5cIixcbiAgICB9LFxuICAgIHN0eWxlSW5zdHJ1Y3Rpb25zOiB7XG4gICAgICB0eXBlOiBbXCJzdHJpbmdcIiwgXCJib29sZWFuXCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiU3R5bGUgZ3VhcmRyYWlscyBhcHBlbmRlZCB0byBldmVyeSBhZ2VudCdzIGluc3RydWN0aW9ucy4gQSBzdHJpbmcgcmVwbGFjZXMgdGhlIGJ1aWx0LWluIGJsb2NrLCBgZmFsc2VgIGRpc2FibGVzIGl0LlwiLFxuICAgIH0sXG4gICAgb2JzZXJ2YWJpbGl0eToge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJCcmlkZ2UgTWFzdHJhIHNwYW5zIGludG8gQXBwS2l0J3MgT1RlbCBwaXBlbGluZS4gRGVmYXVsdHMgdG8gb24gb25seSB3aGVuIE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVCBvciBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0VORFBPSU5UIGlzIHNldC5cIixcbiAgICB9LFxuICAgIGZlZWRiYWNrOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkxvZyB0aHVtYnMgLyBjb21tZW50IGFzc2Vzc21lbnRzIHRvIE1MZmxvdyBhbmQgc3VyZmFjZSB0aGUgZmVlZGJhY2sgY29udHJvbHMuIERlZmF1bHRzIHRvIG9uIG9ubHkgd2hlbiBhbiBPVExQIGVuZHBvaW50IGFuZCBNTEZMT1dfRVhQRVJJTUVOVF9JRCBvciBNTEZMT1dfRVhQRVJJTUVOVF9OQU1FIGFyZSBzZXQuXCIsXG4gICAgfSxcbiAgICBtY3A6IHtcbiAgICAgIHR5cGU6IFtcImJvb2xlYW5cIiwgXCJvYmplY3RcIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJFeHBvc2UgdGhlIHJlZ2lzdGVyZWQgYWdlbnRzIG92ZXIgTUNQLiBEZWZhdWx0cyB0byBhZ2VudHMtb25seTsgYW4gb2JqZWN0IHR1bmVzIHRoZSBzZXJ2ZXIgaWQsIGFkdmVydGlzZWQgbWV0YWRhdGEsIGFuZCB3aGV0aGVyIGFtYmllbnQgdG9vbHMgYXJlIGV4cG9zZWQuXCIsXG4gICAgfSxcbiAgICBhcGlBY2Nlc3M6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBlbnVtOiBbXCJzY29wZWRcIiwgXCJmdWxsXCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdIb3cgbXVjaCBvZiB0aGUgc3RvY2sgQG1hc3RyYS9leHByZXNzIEFQSSBpcyByZWFjaGFibGUgdGhyb3VnaCB0aGUgbW91bnQuIFwic2NvcGVkXCIgKGRlZmF1bHQpIGFsbG93cyBhZ2VudCBpbmZlcmVuY2UsIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgdGhpcyBwbHVnaW5cXCdzIG93biByb3V0ZXMsIGFuZCBNQ1A7IFwiZnVsbFwiIGRpc3BhdGNoZXMgdGhlIGVudGlyZSBtYW5hZ2VtZW50IHN1cmZhY2UuJyxcbiAgICB9LFxuICAgIGJyYW5kOiB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUG9ydGFibGUgYnJhbmQgY29udGV4dCBhcHBsaWVkIHRvIGdlbmVyYXRlZCBjaGFydHMgKHNlcmllcyBwYWxldHRlIGZyb20gY29sb3JzLnByaW1hcnkgLyBjb2xvcnMuYWNjZW50LCBiYXNlIGZvbnQgZnJvbSB0eXBvZ3JhcGh5LnNhbnMpLlwiLFxuICAgIH0sXG4gIH0sXG59O1xuIl19
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interceptor defaults for every outbound call the plugin's own routes make
|
|
3
|
+
* through `Plugin.execute()`.
|
|
4
|
+
*
|
|
5
|
+
* One constant per call site so the cache / retry / timeout decision lives
|
|
6
|
+
* beside its reasoning instead of at the call site. The interceptor chain runs
|
|
7
|
+
* telemetry, timeout, retry, cache, so a disabled interceptor is a deliberate
|
|
8
|
+
* choice and is commented as such.
|
|
9
|
+
*
|
|
10
|
+
* The cache interceptor is inert without a `cache.cacheKey`, which is
|
|
11
|
+
* request-specific (a statement id, an agent id). Call sites therefore spread
|
|
12
|
+
* the constant and add the key; the identity namespace comes from the
|
|
13
|
+
* execution context's user id, which `execute()` resolves on its own.
|
|
14
|
+
*
|
|
15
|
+
* Cancellation is not expressed here: `execute()` derives a signal from the
|
|
16
|
+
* `timeout` setting only, so a caller's own signal is combined with it at the
|
|
17
|
+
* call site instead.
|
|
18
|
+
*
|
|
19
|
+
* @module
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Per-call interceptor settings. Structural stand-in for AppKit's
|
|
23
|
+
* `PluginExecuteConfig`: the barrel exports `StreamExecutionSettings` but not
|
|
24
|
+
* the non-streaming config, so the nominal type is unimportable here. Declared
|
|
25
|
+
* as a type alias (not an interface) so it keeps the implicit index signature
|
|
26
|
+
* AppKit's own config carries.
|
|
27
|
+
*/
|
|
28
|
+
type ExecuteConfig = {
|
|
29
|
+
cache?: {
|
|
30
|
+
enabled?: boolean;
|
|
31
|
+
ttl?: number;
|
|
32
|
+
cacheKey?: (string | number | object)[];
|
|
33
|
+
};
|
|
34
|
+
retry?: {
|
|
35
|
+
enabled?: boolean;
|
|
36
|
+
attempts?: number;
|
|
37
|
+
initialDelay?: number;
|
|
38
|
+
maxDelay?: number;
|
|
39
|
+
};
|
|
40
|
+
timeout?: number;
|
|
41
|
+
};
|
|
42
|
+
/** Default plus optional user-scoped settings, as `execute()` accepts them. */
|
|
43
|
+
type ExecuteSettings = {
|
|
44
|
+
default: ExecuteConfig;
|
|
45
|
+
user?: ExecuteConfig;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* `GET /models`: the workspace's Model Serving catalogue.
|
|
49
|
+
*/
|
|
50
|
+
export declare const modelCatalogueDefaults: ExecuteSettings;
|
|
51
|
+
/**
|
|
52
|
+
* `GET /suggestions`: the curated `sample_questions` on each Genie space.
|
|
53
|
+
*/
|
|
54
|
+
export declare const genieSuggestionDefaults: ExecuteSettings;
|
|
55
|
+
/**
|
|
56
|
+
* `GET /embed/data/:id`: one Statement Execution result set.
|
|
57
|
+
*/
|
|
58
|
+
export declare const statementDataDefaults: ExecuteSettings;
|
|
59
|
+
/**
|
|
60
|
+
* `GET /embed/chart/:id`: the cached chart entry behind a `[chart:<id>]`
|
|
61
|
+
* marker.
|
|
62
|
+
*/
|
|
63
|
+
export declare const chartFetchDefaults: ExecuteSettings;
|
|
64
|
+
/**
|
|
65
|
+
* `POST /route/feedback`: an MLflow trace assessment.
|
|
66
|
+
*/
|
|
67
|
+
export declare const feedbackWriteDefaults: ExecuteSettings;
|
|
68
|
+
export {};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interceptor defaults for every outbound call the plugin's own routes make
|
|
3
|
+
* through `Plugin.execute()`.
|
|
4
|
+
*
|
|
5
|
+
* One constant per call site so the cache / retry / timeout decision lives
|
|
6
|
+
* beside its reasoning instead of at the call site. The interceptor chain runs
|
|
7
|
+
* telemetry, timeout, retry, cache, so a disabled interceptor is a deliberate
|
|
8
|
+
* choice and is commented as such.
|
|
9
|
+
*
|
|
10
|
+
* The cache interceptor is inert without a `cache.cacheKey`, which is
|
|
11
|
+
* request-specific (a statement id, an agent id). Call sites therefore spread
|
|
12
|
+
* the constant and add the key; the identity namespace comes from the
|
|
13
|
+
* execution context's user id, which `execute()` resolves on its own.
|
|
14
|
+
*
|
|
15
|
+
* Cancellation is not expressed here: `execute()` derives a signal from the
|
|
16
|
+
* `timeout` setting only, so a caller's own signal is combined with it at the
|
|
17
|
+
* call site instead.
|
|
18
|
+
*
|
|
19
|
+
* @module
|
|
20
|
+
*/
|
|
21
|
+
/** Ceiling on a single Model Serving / Genie / MLflow REST round-trip. */
|
|
22
|
+
const REST_TIMEOUT_MS = 30_000;
|
|
23
|
+
/** Ceiling on one Statement Execution fetch, which can page a large result. */
|
|
24
|
+
const STATEMENT_TIMEOUT_MS = 60_000;
|
|
25
|
+
/** TTL for a cached statement result set, in seconds. */
|
|
26
|
+
const STATEMENT_CACHE_TTL_SEC = 5 * 60;
|
|
27
|
+
/**
|
|
28
|
+
* `GET /models`: the workspace's Model Serving catalogue.
|
|
29
|
+
*/
|
|
30
|
+
export const modelCatalogueDefaults = {
|
|
31
|
+
default: {
|
|
32
|
+
// Cache disabled here because `listServingEndpoints` already memoizes the
|
|
33
|
+
// catalogue through the same `CacheManager`, keyed by workspace host with
|
|
34
|
+
// `config.modelCacheTtlMs`. That entry is shared across identities; a
|
|
35
|
+
// second interceptor cache would duplicate it once per user.
|
|
36
|
+
cache: { enabled: false },
|
|
37
|
+
// Retry enabled: listing endpoints is an idempotent GET, and the listing
|
|
38
|
+
// is on the chat UI's load path, so a transient 5xx should not blank the
|
|
39
|
+
// model picker.
|
|
40
|
+
retry: { enabled: true, attempts: 3 },
|
|
41
|
+
timeout: REST_TIMEOUT_MS,
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* `GET /suggestions`: the curated `sample_questions` on each Genie space.
|
|
46
|
+
*/
|
|
47
|
+
export const genieSuggestionDefaults = {
|
|
48
|
+
default: {
|
|
49
|
+
// Cache disabled here because `collectSpaceSuggestions` keeps its own
|
|
50
|
+
// space-id-keyed entry; the questions are authored config, identical for
|
|
51
|
+
// every caller, so caching them per identity would only fan out copies.
|
|
52
|
+
cache: { enabled: false },
|
|
53
|
+
// Retry enabled: reading space metadata is idempotent, and the route
|
|
54
|
+
// degrades to an empty starter list on failure, so one retry is cheaper
|
|
55
|
+
// than an empty chat state.
|
|
56
|
+
retry: { enabled: true, attempts: 2 },
|
|
57
|
+
timeout: REST_TIMEOUT_MS,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* `GET /embed/data/:id`: one Statement Execution result set.
|
|
62
|
+
*/
|
|
63
|
+
export const statementDataDefaults = {
|
|
64
|
+
default: {
|
|
65
|
+
// Cache enabled: a completed statement's result set is immutable, and the
|
|
66
|
+
// same id is re-fetched every time the transcript re-renders a
|
|
67
|
+
// `[data:<statement_id>]` marker. The entry is namespaced by the caller's
|
|
68
|
+
// identity, so an OBO result never crosses users.
|
|
69
|
+
cache: { enabled: true, ttl: STATEMENT_CACHE_TTL_SEC },
|
|
70
|
+
// Retry enabled: fetching a statement by id is idempotent.
|
|
71
|
+
retry: { enabled: true, attempts: 3 },
|
|
72
|
+
timeout: STATEMENT_TIMEOUT_MS,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* `GET /embed/chart/:id`: the cached chart entry behind a `[chart:<id>]`
|
|
77
|
+
* marker.
|
|
78
|
+
*/
|
|
79
|
+
export const chartFetchDefaults = {
|
|
80
|
+
default: {
|
|
81
|
+
// Cache disabled: the read long-polls a cache entry that is expected to
|
|
82
|
+
// change from processing to settled, so a cached answer would pin the
|
|
83
|
+
// client to the pre-planner state.
|
|
84
|
+
cache: { enabled: false },
|
|
85
|
+
// Retry disabled: the helper already polls to its own deadline, so a retry
|
|
86
|
+
// would only restart a wait the caller is already inside.
|
|
87
|
+
retry: { enabled: false },
|
|
88
|
+
// No timeout: the poll budget is per request (`?timeoutMs=`, capped by the
|
|
89
|
+
// route) and cancellation rides the connection's abort signal, so a second
|
|
90
|
+
// ceiling here could cut a legitimate long-poll short.
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* `POST /route/feedback`: an MLflow trace assessment.
|
|
95
|
+
*/
|
|
96
|
+
export const feedbackWriteDefaults = {
|
|
97
|
+
default: {
|
|
98
|
+
// Cache disabled: a write, and each submission is a distinct assessment.
|
|
99
|
+
cache: { enabled: false },
|
|
100
|
+
// Retry disabled: posting an assessment is not idempotent (a retry records
|
|
101
|
+
// a duplicate), and `logFeedback` already retries the one recoverable case
|
|
102
|
+
// itself, the trace not having finished exporting to MLflow yet.
|
|
103
|
+
retry: { enabled: false },
|
|
104
|
+
timeout: REST_TIMEOUT_MS,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGVmYXVsdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFxQkgsMEVBQTBFO0FBQzFFLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUUvQiwrRUFBK0U7QUFDL0UsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFFcEMseURBQXlEO0FBQ3pELE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUV2Qzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFvQjtJQUNyRCxPQUFPLEVBQUU7UUFDUCwwRUFBMEU7UUFDMUUsMEVBQTBFO1FBQzFFLHNFQUFzRTtRQUN0RSw2REFBNkQ7UUFDN0QsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtRQUN6Qix5RUFBeUU7UUFDekUseUVBQXlFO1FBQ3pFLGdCQUFnQjtRQUNoQixLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUU7UUFDckMsT0FBTyxFQUFFLGVBQWU7S0FDekI7Q0FDRixDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBb0I7SUFDdEQsT0FBTyxFQUFFO1FBQ1Asc0VBQXNFO1FBQ3RFLHlFQUF5RTtRQUN6RSx3RUFBd0U7UUFDeEUsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtRQUN6QixxRUFBcUU7UUFDckUsd0VBQXdFO1FBQ3hFLDRCQUE0QjtRQUM1QixLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUU7UUFDckMsT0FBTyxFQUFFLGVBQWU7S0FDekI7Q0FDRixDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBb0I7SUFDcEQsT0FBTyxFQUFFO1FBQ1AsMEVBQTBFO1FBQzFFLCtEQUErRDtRQUMvRCwwRUFBMEU7UUFDMUUsa0RBQWtEO1FBQ2xELEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLHVCQUF1QixFQUFFO1FBQ3RELDJEQUEyRDtRQUMzRCxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUU7UUFDckMsT0FBTyxFQUFFLG9CQUFvQjtLQUM5QjtDQUNGLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBb0I7SUFDakQsT0FBTyxFQUFFO1FBQ1Asd0VBQXdFO1FBQ3hFLHNFQUFzRTtRQUN0RSxtQ0FBbUM7UUFDbkMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtRQUN6QiwyRUFBMkU7UUFDM0UsMERBQTBEO1FBQzFELEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7UUFDekIsMkVBQTJFO1FBQzNFLDJFQUEyRTtRQUMzRSx1REFBdUQ7S0FDeEQ7Q0FDRixDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBb0I7SUFDcEQsT0FBTyxFQUFFO1FBQ1AseUVBQXlFO1FBQ3pFLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7UUFDekIsMkVBQTJFO1FBQzNFLDJFQUEyRTtRQUMzRSxpRUFBaUU7UUFDakUsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtRQUN6QixPQUFPLEVBQUUsZUFBZTtLQUN6QjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEludGVyY2VwdG9yIGRlZmF1bHRzIGZvciBldmVyeSBvdXRib3VuZCBjYWxsIHRoZSBwbHVnaW4ncyBvd24gcm91dGVzIG1ha2VcbiAqIHRocm91Z2ggYFBsdWdpbi5leGVjdXRlKClgLlxuICpcbiAqIE9uZSBjb25zdGFudCBwZXIgY2FsbCBzaXRlIHNvIHRoZSBjYWNoZSAvIHJldHJ5IC8gdGltZW91dCBkZWNpc2lvbiBsaXZlc1xuICogYmVzaWRlIGl0cyByZWFzb25pbmcgaW5zdGVhZCBvZiBhdCB0aGUgY2FsbCBzaXRlLiBUaGUgaW50ZXJjZXB0b3IgY2hhaW4gcnVuc1xuICogdGVsZW1ldHJ5LCB0aW1lb3V0LCByZXRyeSwgY2FjaGUsIHNvIGEgZGlzYWJsZWQgaW50ZXJjZXB0b3IgaXMgYSBkZWxpYmVyYXRlXG4gKiBjaG9pY2UgYW5kIGlzIGNvbW1lbnRlZCBhcyBzdWNoLlxuICpcbiAqIFRoZSBjYWNoZSBpbnRlcmNlcHRvciBpcyBpbmVydCB3aXRob3V0IGEgYGNhY2hlLmNhY2hlS2V5YCwgd2hpY2ggaXNcbiAqIHJlcXVlc3Qtc3BlY2lmaWMgKGEgc3RhdGVtZW50IGlkLCBhbiBhZ2VudCBpZCkuIENhbGwgc2l0ZXMgdGhlcmVmb3JlIHNwcmVhZFxuICogdGhlIGNvbnN0YW50IGFuZCBhZGQgdGhlIGtleTsgdGhlIGlkZW50aXR5IG5hbWVzcGFjZSBjb21lcyBmcm9tIHRoZVxuICogZXhlY3V0aW9uIGNvbnRleHQncyB1c2VyIGlkLCB3aGljaCBgZXhlY3V0ZSgpYCByZXNvbHZlcyBvbiBpdHMgb3duLlxuICpcbiAqIENhbmNlbGxhdGlvbiBpcyBub3QgZXhwcmVzc2VkIGhlcmU6IGBleGVjdXRlKClgIGRlcml2ZXMgYSBzaWduYWwgZnJvbSB0aGVcbiAqIGB0aW1lb3V0YCBzZXR0aW5nIG9ubHksIHNvIGEgY2FsbGVyJ3Mgb3duIHNpZ25hbCBpcyBjb21iaW5lZCB3aXRoIGl0IGF0IHRoZVxuICogY2FsbCBzaXRlIGluc3RlYWQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbi8qKlxuICogUGVyLWNhbGwgaW50ZXJjZXB0b3Igc2V0dGluZ3MuIFN0cnVjdHVyYWwgc3RhbmQtaW4gZm9yIEFwcEtpdCdzXG4gKiBgUGx1Z2luRXhlY3V0ZUNvbmZpZ2A6IHRoZSBiYXJyZWwgZXhwb3J0cyBgU3RyZWFtRXhlY3V0aW9uU2V0dGluZ3NgIGJ1dCBub3RcbiAqIHRoZSBub24tc3RyZWFtaW5nIGNvbmZpZywgc28gdGhlIG5vbWluYWwgdHlwZSBpcyB1bmltcG9ydGFibGUgaGVyZS4gRGVjbGFyZWRcbiAqIGFzIGEgdHlwZSBhbGlhcyAobm90IGFuIGludGVyZmFjZSkgc28gaXQga2VlcHMgdGhlIGltcGxpY2l0IGluZGV4IHNpZ25hdHVyZVxuICogQXBwS2l0J3Mgb3duIGNvbmZpZyBjYXJyaWVzLlxuICovXG50eXBlIEV4ZWN1dGVDb25maWcgPSB7XG4gIGNhY2hlPzogeyBlbmFibGVkPzogYm9vbGVhbjsgdHRsPzogbnVtYmVyOyBjYWNoZUtleT86IChzdHJpbmcgfCBudW1iZXIgfCBvYmplY3QpW10gfTtcbiAgcmV0cnk/OiB7IGVuYWJsZWQ/OiBib29sZWFuOyBhdHRlbXB0cz86IG51bWJlcjsgaW5pdGlhbERlbGF5PzogbnVtYmVyOyBtYXhEZWxheT86IG51bWJlciB9O1xuICB0aW1lb3V0PzogbnVtYmVyO1xufTtcblxuLyoqIERlZmF1bHQgcGx1cyBvcHRpb25hbCB1c2VyLXNjb3BlZCBzZXR0aW5ncywgYXMgYGV4ZWN1dGUoKWAgYWNjZXB0cyB0aGVtLiAqL1xudHlwZSBFeGVjdXRlU2V0dGluZ3MgPSB7XG4gIGRlZmF1bHQ6IEV4ZWN1dGVDb25maWc7XG4gIHVzZXI/OiBFeGVjdXRlQ29uZmlnO1xufTtcblxuLyoqIENlaWxpbmcgb24gYSBzaW5nbGUgTW9kZWwgU2VydmluZyAvIEdlbmllIC8gTUxmbG93IFJFU1Qgcm91bmQtdHJpcC4gKi9cbmNvbnN0IFJFU1RfVElNRU9VVF9NUyA9IDMwXzAwMDtcblxuLyoqIENlaWxpbmcgb24gb25lIFN0YXRlbWVudCBFeGVjdXRpb24gZmV0Y2gsIHdoaWNoIGNhbiBwYWdlIGEgbGFyZ2UgcmVzdWx0LiAqL1xuY29uc3QgU1RBVEVNRU5UX1RJTUVPVVRfTVMgPSA2MF8wMDA7XG5cbi8qKiBUVEwgZm9yIGEgY2FjaGVkIHN0YXRlbWVudCByZXN1bHQgc2V0LCBpbiBzZWNvbmRzLiAqL1xuY29uc3QgU1RBVEVNRU5UX0NBQ0hFX1RUTF9TRUMgPSA1ICogNjA7XG5cbi8qKlxuICogYEdFVCAvbW9kZWxzYDogdGhlIHdvcmtzcGFjZSdzIE1vZGVsIFNlcnZpbmcgY2F0YWxvZ3VlLlxuICovXG5leHBvcnQgY29uc3QgbW9kZWxDYXRhbG9ndWVEZWZhdWx0czogRXhlY3V0ZVNldHRpbmdzID0ge1xuICBkZWZhdWx0OiB7XG4gICAgLy8gQ2FjaGUgZGlzYWJsZWQgaGVyZSBiZWNhdXNlIGBsaXN0U2VydmluZ0VuZHBvaW50c2AgYWxyZWFkeSBtZW1vaXplcyB0aGVcbiAgICAvLyBjYXRhbG9ndWUgdGhyb3VnaCB0aGUgc2FtZSBgQ2FjaGVNYW5hZ2VyYCwga2V5ZWQgYnkgd29ya3NwYWNlIGhvc3Qgd2l0aFxuICAgIC8vIGBjb25maWcubW9kZWxDYWNoZVR0bE1zYC4gVGhhdCBlbnRyeSBpcyBzaGFyZWQgYWNyb3NzIGlkZW50aXRpZXM7IGFcbiAgICAvLyBzZWNvbmQgaW50ZXJjZXB0b3IgY2FjaGUgd291bGQgZHVwbGljYXRlIGl0IG9uY2UgcGVyIHVzZXIuXG4gICAgY2FjaGU6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAvLyBSZXRyeSBlbmFibGVkOiBsaXN0aW5nIGVuZHBvaW50cyBpcyBhbiBpZGVtcG90ZW50IEdFVCwgYW5kIHRoZSBsaXN0aW5nXG4gICAgLy8gaXMgb24gdGhlIGNoYXQgVUkncyBsb2FkIHBhdGgsIHNvIGEgdHJhbnNpZW50IDV4eCBzaG91bGQgbm90IGJsYW5rIHRoZVxuICAgIC8vIG1vZGVsIHBpY2tlci5cbiAgICByZXRyeTogeyBlbmFibGVkOiB0cnVlLCBhdHRlbXB0czogMyB9LFxuICAgIHRpbWVvdXQ6IFJFU1RfVElNRU9VVF9NUyxcbiAgfSxcbn07XG5cbi8qKlxuICogYEdFVCAvc3VnZ2VzdGlvbnNgOiB0aGUgY3VyYXRlZCBgc2FtcGxlX3F1ZXN0aW9uc2Agb24gZWFjaCBHZW5pZSBzcGFjZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGdlbmllU3VnZ2VzdGlvbkRlZmF1bHRzOiBFeGVjdXRlU2V0dGluZ3MgPSB7XG4gIGRlZmF1bHQ6IHtcbiAgICAvLyBDYWNoZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgYGNvbGxlY3RTcGFjZVN1Z2dlc3Rpb25zYCBrZWVwcyBpdHMgb3duXG4gICAgLy8gc3BhY2UtaWQta2V5ZWQgZW50cnk7IHRoZSBxdWVzdGlvbnMgYXJlIGF1dGhvcmVkIGNvbmZpZywgaWRlbnRpY2FsIGZvclxuICAgIC8vIGV2ZXJ5IGNhbGxlciwgc28gY2FjaGluZyB0aGVtIHBlciBpZGVudGl0eSB3b3VsZCBvbmx5IGZhbiBvdXQgY29waWVzLlxuICAgIGNhY2hlOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgLy8gUmV0cnkgZW5hYmxlZDogcmVhZGluZyBzcGFjZSBtZXRhZGF0YSBpcyBpZGVtcG90ZW50LCBhbmQgdGhlIHJvdXRlXG4gICAgLy8gZGVncmFkZXMgdG8gYW4gZW1wdHkgc3RhcnRlciBsaXN0IG9uIGZhaWx1cmUsIHNvIG9uZSByZXRyeSBpcyBjaGVhcGVyXG4gICAgLy8gdGhhbiBhbiBlbXB0eSBjaGF0IHN0YXRlLlxuICAgIHJldHJ5OiB7IGVuYWJsZWQ6IHRydWUsIGF0dGVtcHRzOiAyIH0sXG4gICAgdGltZW91dDogUkVTVF9USU1FT1VUX01TLFxuICB9LFxufTtcblxuLyoqXG4gKiBgR0VUIC9lbWJlZC9kYXRhLzppZGA6IG9uZSBTdGF0ZW1lbnQgRXhlY3V0aW9uIHJlc3VsdCBzZXQuXG4gKi9cbmV4cG9ydCBjb25zdCBzdGF0ZW1lbnREYXRhRGVmYXVsdHM6IEV4ZWN1dGVTZXR0aW5ncyA9IHtcbiAgZGVmYXVsdDoge1xuICAgIC8vIENhY2hlIGVuYWJsZWQ6IGEgY29tcGxldGVkIHN0YXRlbWVudCdzIHJlc3VsdCBzZXQgaXMgaW1tdXRhYmxlLCBhbmQgdGhlXG4gICAgLy8gc2FtZSBpZCBpcyByZS1mZXRjaGVkIGV2ZXJ5IHRpbWUgdGhlIHRyYW5zY3JpcHQgcmUtcmVuZGVycyBhXG4gICAgLy8gYFtkYXRhOjxzdGF0ZW1lbnRfaWQ+XWAgbWFya2VyLiBUaGUgZW50cnkgaXMgbmFtZXNwYWNlZCBieSB0aGUgY2FsbGVyJ3NcbiAgICAvLyBpZGVudGl0eSwgc28gYW4gT0JPIHJlc3VsdCBuZXZlciBjcm9zc2VzIHVzZXJzLlxuICAgIGNhY2hlOiB7IGVuYWJsZWQ6IHRydWUsIHR0bDogU1RBVEVNRU5UX0NBQ0hFX1RUTF9TRUMgfSxcbiAgICAvLyBSZXRyeSBlbmFibGVkOiBmZXRjaGluZyBhIHN0YXRlbWVudCBieSBpZCBpcyBpZGVtcG90ZW50LlxuICAgIHJldHJ5OiB7IGVuYWJsZWQ6IHRydWUsIGF0dGVtcHRzOiAzIH0sXG4gICAgdGltZW91dDogU1RBVEVNRU5UX1RJTUVPVVRfTVMsXG4gIH0sXG59O1xuXG4vKipcbiAqIGBHRVQgL2VtYmVkL2NoYXJ0LzppZGA6IHRoZSBjYWNoZWQgY2hhcnQgZW50cnkgYmVoaW5kIGEgYFtjaGFydDo8aWQ+XWBcbiAqIG1hcmtlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGNoYXJ0RmV0Y2hEZWZhdWx0czogRXhlY3V0ZVNldHRpbmdzID0ge1xuICBkZWZhdWx0OiB7XG4gICAgLy8gQ2FjaGUgZGlzYWJsZWQ6IHRoZSByZWFkIGxvbmctcG9sbHMgYSBjYWNoZSBlbnRyeSB0aGF0IGlzIGV4cGVjdGVkIHRvXG4gICAgLy8gY2hhbmdlIGZyb20gcHJvY2Vzc2luZyB0byBzZXR0bGVkLCBzbyBhIGNhY2hlZCBhbnN3ZXIgd291bGQgcGluIHRoZVxuICAgIC8vIGNsaWVudCB0byB0aGUgcHJlLXBsYW5uZXIgc3RhdGUuXG4gICAgY2FjaGU6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAvLyBSZXRyeSBkaXNhYmxlZDogdGhlIGhlbHBlciBhbHJlYWR5IHBvbGxzIHRvIGl0cyBvd24gZGVhZGxpbmUsIHNvIGEgcmV0cnlcbiAgICAvLyB3b3VsZCBvbmx5IHJlc3RhcnQgYSB3YWl0IHRoZSBjYWxsZXIgaXMgYWxyZWFkeSBpbnNpZGUuXG4gICAgcmV0cnk6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAvLyBObyB0aW1lb3V0OiB0aGUgcG9sbCBidWRnZXQgaXMgcGVyIHJlcXVlc3QgKGA/dGltZW91dE1zPWAsIGNhcHBlZCBieSB0aGVcbiAgICAvLyByb3V0ZSkgYW5kIGNhbmNlbGxhdGlvbiByaWRlcyB0aGUgY29ubmVjdGlvbidzIGFib3J0IHNpZ25hbCwgc28gYSBzZWNvbmRcbiAgICAvLyBjZWlsaW5nIGhlcmUgY291bGQgY3V0IGEgbGVnaXRpbWF0ZSBsb25nLXBvbGwgc2hvcnQuXG4gIH0sXG59O1xuXG4vKipcbiAqIGBQT1NUIC9yb3V0ZS9mZWVkYmFja2A6IGFuIE1MZmxvdyB0cmFjZSBhc3Nlc3NtZW50LlxuICovXG5leHBvcnQgY29uc3QgZmVlZGJhY2tXcml0ZURlZmF1bHRzOiBFeGVjdXRlU2V0dGluZ3MgPSB7XG4gIGRlZmF1bHQ6IHtcbiAgICAvLyBDYWNoZSBkaXNhYmxlZDogYSB3cml0ZSwgYW5kIGVhY2ggc3VibWlzc2lvbiBpcyBhIGRpc3RpbmN0IGFzc2Vzc21lbnQuXG4gICAgY2FjaGU6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAvLyBSZXRyeSBkaXNhYmxlZDogcG9zdGluZyBhbiBhc3Nlc3NtZW50IGlzIG5vdCBpZGVtcG90ZW50IChhIHJldHJ5IHJlY29yZHNcbiAgICAvLyBhIGR1cGxpY2F0ZSksIGFuZCBgbG9nRmVlZGJhY2tgIGFscmVhZHkgcmV0cmllcyB0aGUgb25lIHJlY292ZXJhYmxlIGNhc2VcbiAgICAvLyBpdHNlbGYsIHRoZSB0cmFjZSBub3QgaGF2aW5nIGZpbmlzaGVkIGV4cG9ydGluZyB0byBNTGZsb3cgeWV0LlxuICAgIHJldHJ5OiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgdGltZW91dDogUkVTVF9USU1FT1VUX01TLFxuICB9LFxufTtcbiJdfQ==
|