@dbx-tools/appkit-mastra 0.6.218 → 0.6.220
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -25
- package/index.ts +4 -7
- package/lib/index.d.ts +4 -7
- package/lib/index.js +4 -5
- package/lib/src/agents.d.ts +15 -6
- package/lib/src/agents.js +30 -12
- package/lib/src/chat.d.ts +7 -0
- package/lib/src/chat.js +19 -0
- package/lib/src/config.d.ts +2 -2
- package/lib/src/config.js +1 -1
- package/lib/src/genie.js +5 -4
- package/lib/src/memory.d.ts +2 -2
- package/lib/src/memory.js +2 -2
- package/lib/src/model.d.ts +2 -0
- package/lib/src/model.js +7 -1
- package/lib/src/plugin.d.ts +1 -1
- package/lib/src/plugin.js +3 -31
- package/lib/src/processors.d.ts +4 -28
- package/lib/src/processors.js +4 -61
- package/lib/src/server.d.ts +10 -21
- package/lib/src/server.js +52 -28
- package/lib/src/serving-sanitize.d.ts +8 -5
- package/lib/src/serving-sanitize.js +16 -11
- package/lib/src/trace-io.js +7 -3
- package/lib/src/writer.d.ts +7 -7
- package/lib/src/writer.js +12 -9
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +23 -22
- package/src/agents.ts +92 -27
- package/src/chat.ts +20 -0
- package/src/config.ts +5 -2
- package/src/genie.ts +7 -11
- package/src/memory.ts +8 -8
- package/src/model.ts +7 -0
- package/src/plugin.ts +2 -30
- package/src/processors.ts +4 -66
- package/src/server.ts +49 -27
- package/src/serving-sanitize.ts +14 -10
- package/src/trace-io.ts +7 -2
- package/src/writer.ts +15 -11
- package/lib/src/history.d.ts +0 -93
- package/lib/src/history.js +0 -231
- package/lib/src/threads.d.ts +0 -104
- package/lib/src/threads.js +0 -264
- package/src/history.ts +0 -270
- package/src/threads.ts +0 -309
package/lib/src/processors.js
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Mastra stream processors wired onto the plugin's agents.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* scrubs turn-scoped `chartId` fields out of prior tool results
|
|
8
|
-
* replayed from Memory, so the model can't copy a stale id into the
|
|
9
|
-
* new turn's `[chart:<id>]` markers.
|
|
10
|
-
* - An **output** processor ({@link ResultProcessor}) that trims the
|
|
11
|
-
* bulky, redundant payload fields off targeted outbound stream frames
|
|
12
|
-
* before they're serialized to the SSE client.
|
|
4
|
+
* The input processor ({@link stripStaleChartsProcessor}) scrubs turn-scoped
|
|
5
|
+
* `chartId` fields out of prior tool results replayed from Memory, so the model
|
|
6
|
+
* cannot copy a stale id into the new turn's `[chart:<id>]` markers.
|
|
13
7
|
*
|
|
14
8
|
* @module
|
|
15
9
|
*/
|
|
@@ -108,55 +102,4 @@ export const stripStaleChartsProcessor = {
|
|
|
108
102
|
return args.messages;
|
|
109
103
|
},
|
|
110
104
|
};
|
|
111
|
-
|
|
112
|
-
* Mastra output processor that trims the bulky, redundant payload
|
|
113
|
-
* fields off targeted outbound stream frames.
|
|
114
|
-
*
|
|
115
|
-
* Mastra emits step / finish / tool-result frames whose payloads
|
|
116
|
-
* echo the full tool `output` / `result` / assistant `messages` /
|
|
117
|
-
* `response` - data the chat client already received inline and
|
|
118
|
-
* doesn't need re-sent. This processor empties those keys on the
|
|
119
|
-
* targeted frame types so the outbound SSE stream stays lean;
|
|
120
|
-
* every other frame passes through untouched.
|
|
121
|
-
*/
|
|
122
|
-
export class ResultProcessor {
|
|
123
|
-
id = "result-processor";
|
|
124
|
-
// Tell Mastra to also route tool/data parts to this processor method
|
|
125
|
-
processDataParts = true;
|
|
126
|
-
async processOutputStream({ part }) {
|
|
127
|
-
// 1. Guard clause: Ensure the chunk is a valid object
|
|
128
|
-
if (!part || typeof part !== "object") {
|
|
129
|
-
return part;
|
|
130
|
-
}
|
|
131
|
-
// 2. Filter for the targeted frame types
|
|
132
|
-
const targetedTypes = ["step-finish", "finish", "tool-result", "data-tool-agent"];
|
|
133
|
-
if (!targetedTypes.includes(part.type)) {
|
|
134
|
-
return part; // Return unchanged to pass-through
|
|
135
|
-
}
|
|
136
|
-
// 3. Check for the presence of a payload object
|
|
137
|
-
const payload = part.payload;
|
|
138
|
-
if (!payload || typeof payload !== "object") {
|
|
139
|
-
return part;
|
|
140
|
-
}
|
|
141
|
-
// 4. Safely delete the unwanted keys from the payload reference
|
|
142
|
-
const keysToDelete = ["output", "messages", "response", "result"];
|
|
143
|
-
for (const key of keysToDelete) {
|
|
144
|
-
if (key in payload) {
|
|
145
|
-
const value = payload[key];
|
|
146
|
-
if (typeof value === "object") {
|
|
147
|
-
payload[key] = {};
|
|
148
|
-
}
|
|
149
|
-
else if (Array.isArray(value)) {
|
|
150
|
-
payload[key] = [];
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
delete payload[key];
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
// 5. Return the modified part object. Mastra handles re-serialization
|
|
158
|
-
// for the outbound SSE client stream automatically.
|
|
159
|
-
return part;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzc29ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9jZXNzb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzdDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUUvQzs7Ozs7O0dBTUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxLQUFjO0lBQ25DLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdkMsTUFBTSxHQUFHLEdBQUcsS0FBZ0MsQ0FBQztRQUM3QyxNQUFNLEdBQUcsR0FBNEIsRUFBRSxDQUFDO1FBQ3hDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0MsSUFBSSxHQUFHLEtBQUssU0FBUztnQkFBRSxTQUFTO1lBQ2hDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFtQjtJQUN2RCxFQUFFLEVBQUUsb0JBQW9CO0lBQ3hCLFdBQVcsRUFDVCxpSEFBaUg7SUFDbkgsWUFBWSxDQUFDLElBQXNCO1FBQ2pDLElBQUksUUFB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QUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDbkIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMzQixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNwQixDQUFDO3FCQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNwQixDQUFDO3FCQUFNLENBQUM7b0JBQ04sT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELHNFQUFzRTtRQUN0RSxvREFBb0Q7UUFDcEQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1hc3RyYSBzdHJlYW0gcHJvY2Vzc29ycyB3aXJlZCBvbnRvIHRoZSBwbHVnaW4ncyBhZ2VudHMuXG4gKlxuICogVHdvIGNvbXBsZW1lbnRhcnkgcHJvY2Vzc29ycyBsaXZlIGhlcmU6XG4gKlxuICogLSBBbiAqKmlucHV0KiogcHJvY2Vzc29yICh7QGxpbmsgc3RyaXBTdGFsZUNoYXJ0c1Byb2Nlc3Nvcn0pIHRoYXRcbiAqICAgc2NydWJzIHR1cm4tc2NvcGVkIGBjaGFydElkYCBmaWVsZHMgb3V0IG9mIHByaW9yIHRvb2wgcmVzdWx0c1xuICogICByZXBsYXllZCBmcm9tIE1lbW9yeSwgc28gdGhlIG1vZGVsIGNhbid0IGNvcHkgYSBzdGFsZSBpZCBpbnRvIHRoZVxuICogICBuZXcgdHVybidzIGBbY2hhcnQ6PGlkPl1gIG1hcmtlcnMuXG4gKiAtIEFuICoqb3V0cHV0KiogcHJvY2Vzc29yICh7QGxpbmsgUmVzdWx0UHJvY2Vzc29yfSkgdGhhdCB0cmltcyB0aGVcbiAqICAgYnVsa3ksIHJlZHVuZGFudCBwYXlsb2FkIGZpZWxkcyBvZmYgdGFyZ2V0ZWQgb3V0Ym91bmQgc3RyZWFtIGZyYW1lc1xuICogICBiZWZvcmUgdGhleSdyZSBzZXJpYWxpemVkIHRvIHRoZSBTU0UgY2xpZW50LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBJbnB1dFByb2Nlc3NvciwgUHJvY2Vzc0lucHV0QXJncywgUHJvY2Vzc29yIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9wcm9jZXNzb3JzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvcHJvY2Vzc29yc1wiKTtcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjbG9uZSBgdmFsdWVgLCBvbWl0dGluZyBhbnkgcHJvcGVydHkgd2hvc2Uga2V5IGlzXG4gKiBgY2hhcnRJZGAuIEFycmF5cyBhcmUgbWFwcGVkIGVsZW1lbnQtd2lzZTsgcHJpbWl0aXZlcyBhcmVcbiAqIHJldHVybmVkIGFzLWlzLiBUaGUgcmVzdWx0IGlzIHN0cnVjdHVyYWxseSBpZGVudGljYWwgdG8gdGhlXG4gKiBpbnB1dCBtaW51cyBjaGFydElkcywgc28gZG93bnN0cmVhbSBtZXNzYWdlLXNoYXBlIGNvbnN1bWVyc1xuICoga2VlcCB3b3JraW5nLlxuICovXG5mdW5jdGlvbiBzdHJpcENoYXJ0SWRzKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoc3RyaXBDaGFydElkcyk7XG4gIH1cbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IG9iaiA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgaWYgKGtleSA9PT0gXCJjaGFydElkXCIpIGNvbnRpbnVlO1xuICAgICAgb3V0W2tleV0gPSBzdHJpcENoYXJ0SWRzKHZhbCk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIE1hc3RyYSBpbnB1dCBwcm9jZXNzb3IgdGhhdCBzdHJpcHMgYGNoYXJ0SWRgIGZpZWxkcyBmcm9tIGV2ZXJ5XG4gKiB0b29sLWludm9jYXRpb24gcmVzdWx0IGluIHByaW9yIGFzc2lzdGFudCBtZXNzYWdlcyBiZWZvcmUgdGhleVxuICogcmVhY2ggdGhlIG1vZGVsLlxuICpcbiAqIFdoeTogY2hhcnRJZHMgYXJlIHR1cm4tc2NvcGVkIGZyb20gdGhlIG1vZGVsJ3MgcG9pbnQgb2YgdmlldyAtXG4gKiBlYWNoIGBwcmVwYXJlX2NoYXJ0YCAvIGByZW5kZXJfZGF0YWAgY2FsbCBtaW50cyBhIGZyZXNoIGlkIGFuZFxuICogdGhlIGhvc3QgVUkgYmluZHMgaXQgdG8gdGhhdCB0dXJuJ3MgcmVwbHkuIE1hc3RyYSBNZW1vcnlcbiAqIHJlcGxheXMgcHJpb3IgdG9vbCByZXN1bHRzIGludG8gdGhlIHByb21wdDsgaWYgb2xkIGNoYXJ0SWRzXG4gKiBsZWFrIHRocm91Z2gsIHRoZSBtb2RlbCBpcyB0ZW1wdGVkIHRvIGNvcHkgdGhlbSB2ZXJiYXRpbSBpbnRvXG4gKiB0aGUgbmV3IHR1cm4ncyBgW2NoYXJ0OjxpZD5dYCBtYXJrZXJzIGFuZCB0aGUgaG9zdCBVSSBlbmRzIHVwXG4gKiByZW5kZXJpbmcgYW4gdW5yZWxhdGVkIGNoYXJ0IGZyb20gdGhlIGNoYXJ0IGNhY2hlIChvclxuICogYSA0MDQgb25jZSB0aGUgMWggVFRMIGVsYXBzZWQpLiBUaGlzIHByb2Nlc3NvciByZW1vdmVzIHRoZVxuICogdGVtcHRhdGlvbiBieSBkZWxldGluZyBgY2hhcnRJZGAga2V5cyBmcm9tIGV2ZXJ5IGFzc2lzdGFudFxuICogbWVzc2FnZSdzIHRvb2wgcmVzdWx0cyBiZWZvcmUgdGhlIHByb21wdCBpcyBidWlsdC4gVGhlIGN1cnJlbnRcbiAqIHR1cm4ncyB0b29sIHJlc3VsdHMgZG9uJ3QgZXhpc3QgeWV0IGF0IGBwcm9jZXNzSW5wdXRgIHRpbWUsIHNvXG4gKiB0aGV5IHBhc3MgdGhyb3VnaCB1bm1vZGlmaWVkLlxuICpcbiAqIFRoZSBzdHJpcCBpcyByZWN1cnNpdmUgLSBhbnkgbmVzdGVkIGBjaGFydElkYCBmaWVsZCBpcyByZW1vdmVkLFxuICogcmVnYXJkbGVzcyBvZiB3aGljaCB0b29sIHByb2R1Y2VkIHRoZSByZXN1bHQuIFRoaXMgY292ZXJzXG4gKiBgcHJlcGFyZV9jaGFydGAgLyBgcmVuZGVyX2RhdGFgIHRvcC1sZXZlbCBjaGFydElkcyBhbmQgYW55XG4gKiBsZWdhY3kgYGRhdGFzZXRzW10uY2hhcnRJZGAgcGF5bG9hZHMgdW5pZm9ybWx5IHdpdGhvdXQgY291cGxpbmdcbiAqIHRvIHNwZWNpZmljIHRvb2wgaWRzLlxuICpcbiAqIFdpcmVkIG9udG8gZXZlcnkgYWdlbnQgYnkgZGVmYXVsdCB2aWEgYGJ1aWxkQWdlbnRzYDsgb3B0IG91dCB3aXRoXG4gKiBgTWFzdHJhUGx1Z2luQ29uZmlnLnN0cmlwU3RhbGVDaGFydHM6IGZhbHNlYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHN0cmlwU3RhbGVDaGFydHNQcm9jZXNzb3I6IElucHV0UHJvY2Vzc29yID0ge1xuICBpZDogXCJzdHJpcC1zdGFsZS1jaGFydHNcIixcbiAgZGVzY3JpcHRpb246XG4gICAgXCJSZW1vdmVzIGNoYXJ0SWQgZmllbGRzIGZyb20gcHJpb3IgdG9vbC1pbnZvY2F0aW9uIHJlc3VsdHMgc28gdGhlIG1vZGVsIGNhbid0IHJldXNlIHR1cm4tc2NvcGVkIGlkcyBmcm9tIG1lbW9yeS5cIixcbiAgcHJvY2Vzc0lucHV0KGFyZ3M6IFByb2Nlc3NJbnB1dEFyZ3MpIHtcbiAgICBsZXQgc3RyaXBwZWQgPSAwO1xuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBhcmdzLm1lc3NhZ2VzKSB7XG4gICAgICBpZiAobWVzc2FnZS5yb2xlICE9PSBcImFzc2lzdGFudFwiKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHBhcnRzID0gbWVzc2FnZS5jb250ZW50Py5wYXJ0cztcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJ0cykpIGNvbnRpbnVlO1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgIC8vIFRvb2wtaW52b2NhdGlvbiBwYXJ0cyBob2xkIHRoZSBwZXJzaXN0ZWQgdG9vbCByZXN1bHQuXG4gICAgICAgIC8vIFdlIGRvbid0IHNjcnViIHRoZSBpbnB1dCBhcmdzIChgcmF3SW5wdXRgIC8gYGFyZ3NgKSBiZWNhdXNlXG4gICAgICAgIC8vIHRoZSBjaGFydElkIHRoZXJlIGlzIHRoZSBtb2RlbCdzIG91dGdvaW5nIGNsYWltLCBub3RcbiAgICAgICAgLy8gYW55dGhpbmcgaXQgY291bGQgcmUtcmVmZXJlbmNlOyBvbmx5IGByZXN1bHRgIGNhcnJpZXNcbiAgICAgICAgLy8gaWRzIHRoYXQgc3Vic2VxdWVudCB0dXJucyBtaWdodCBjb3B5LlxuICAgICAgICBpZiAoKHBhcnQgYXMgeyB0eXBlPzogdW5rbm93biB9KS50eXBlICE9PSBcInRvb2wtaW52b2NhdGlvblwiKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW52ID0gKHBhcnQgYXMgeyB0b29sSW52b2NhdGlvbj86IHsgcmVzdWx0PzogdW5rbm93biB9IH0pLnRvb2xJbnZvY2F0aW9uO1xuICAgICAgICBpZiAoIWludiB8fCBpbnYucmVzdWx0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBiZWZvcmUgPSBpbnYucmVzdWx0O1xuICAgICAgICBjb25zdCBhZnRlciA9IHN0cmlwQ2hhcnRJZHMoYmVmb3JlKTtcbiAgICAgICAgLy8gQ2hlYXAgc3RydWN0dXJhbCBjaGVjayB2aWEgSlNPTiBsZW5ndGggLSB0aGUgYWN0dWFsXG4gICAgICAgIC8vIHN0cmlwIHdyaXRlcyBhIGZyZXNoIG9iamVjdCBvbmx5IHdoZW4gY2hhcnRJZCBrZXlzXG4gICAgICAgIC8vIGV4aXN0ZWQsIHNvIGRpZmZlcmVudCBzdHJpbmdpZmljYXRpb24gbGVuZ3RoIGlzIGFcbiAgICAgICAgLy8gcmVsaWFibGUgc2lnbmFsIHRoYXQgc29tZXRoaW5nIHdhcyByZW1vdmVkLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZW9mIGJlZm9yZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgIGJlZm9yZSAhPT0gbnVsbCAmJlxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGJlZm9yZSkubGVuZ3RoICE9PSBKU09OLnN0cmluZ2lmeShhZnRlcikubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgIGludi5yZXN1bHQgPSBhZnRlcjtcbiAgICAgICAgICBzdHJpcHBlZCArPSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzdHJpcHBlZCA+IDApIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInN0cmlwcGVkXCIsIHsgcmVzdWx0czogc3RyaXBwZWQgfSk7XG4gICAgfVxuICAgIHJldHVybiBhcmdzLm1lc3NhZ2VzO1xuICB9LFxufTtcblxuLyoqXG4gKiBNYXN0cmEgb3V0cHV0IHByb2Nlc3NvciB0aGF0IHRyaW1zIHRoZSBidWxreSwgcmVkdW5kYW50IHBheWxvYWRcbiAqIGZpZWxkcyBvZmYgdGFyZ2V0ZWQgb3V0Ym91bmQgc3RyZWFtIGZyYW1lcy5cbiAqXG4gKiBNYXN0cmEgZW1pdHMgc3RlcCAvIGZpbmlzaCAvIHRvb2wtcmVzdWx0IGZyYW1lcyB3aG9zZSBwYXlsb2Fkc1xuICogZWNobyB0aGUgZnVsbCB0b29sIGBvdXRwdXRgIC8gYHJlc3VsdGAgLyBhc3Npc3RhbnQgYG1lc3NhZ2VzYCAvXG4gKiBgcmVzcG9uc2VgIC0gZGF0YSB0aGUgY2hhdCBjbGllbnQgYWxyZWFkeSByZWNlaXZlZCBpbmxpbmUgYW5kXG4gKiBkb2Vzbid0IG5lZWQgcmUtc2VudC4gVGhpcyBwcm9jZXNzb3IgZW1wdGllcyB0aG9zZSBrZXlzIG9uIHRoZVxuICogdGFyZ2V0ZWQgZnJhbWUgdHlwZXMgc28gdGhlIG91dGJvdW5kIFNTRSBzdHJlYW0gc3RheXMgbGVhbjtcbiAqIGV2ZXJ5IG90aGVyIGZyYW1lIHBhc3NlcyB0aHJvdWdoIHVudG91Y2hlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlc3VsdFByb2Nlc3NvciBpbXBsZW1lbnRzIFByb2Nlc3NvciB7XG4gIGlkID0gXCJyZXN1bHQtcHJvY2Vzc29yXCI7XG5cbiAgLy8gVGVsbCBNYXN0cmEgdG8gYWxzbyByb3V0ZSB0b29sL2RhdGEgcGFydHMgdG8gdGhpcyBwcm9jZXNzb3IgbWV0aG9kXG4gIHByb2Nlc3NEYXRhUGFydHMgPSB0cnVlO1xuXG4gIGFzeW5jIHByb2Nlc3NPdXRwdXRTdHJlYW0oeyBwYXJ0IH06IHsgcGFydDogYW55IH0pOiBQcm9taXNlPGFueSB8IG51bGw+IHtcbiAgICAvLyAxLiBHdWFyZCBjbGF1c2U6IEVuc3VyZSB0aGUgY2h1bmsgaXMgYSB2YWxpZCBvYmplY3RcbiAgICBpZiAoIXBhcnQgfHwgdHlwZW9mIHBhcnQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBwYXJ0O1xuICAgIH1cblxuICAgIC8vIDIuIEZpbHRlciBmb3IgdGhlIHRhcmdldGVkIGZyYW1lIHR5cGVzXG4gICAgY29uc3QgdGFyZ2V0ZWRUeXBlcyA9IFtcInN0ZXAtZmluaXNoXCIsIFwiZmluaXNoXCIsIFwidG9vbC1yZXN1bHRcIiwgXCJkYXRhLXRvb2wtYWdlbnRcIl07XG4gICAgaWYgKCF0YXJnZXRlZFR5cGVzLmluY2x1ZGVzKHBhcnQudHlwZSkpIHtcbiAgICAgIHJldHVybiBwYXJ0OyAvLyBSZXR1cm4gdW5jaGFuZ2VkIHRvIHBhc3MtdGhyb3VnaFxuICAgIH1cblxuICAgIC8vIDMuIENoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBwYXlsb2FkIG9iamVjdFxuICAgIGNvbnN0IHBheWxvYWQgPSBwYXJ0LnBheWxvYWQ7XG4gICAgaWYgKCFwYXlsb2FkIHx8IHR5cGVvZiBwYXlsb2FkICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gcGFydDtcbiAgICB9XG5cbiAgICAvLyA0LiBTYWZlbHkgZGVsZXRlIHRoZSB1bndhbnRlZCBrZXlzIGZyb20gdGhlIHBheWxvYWQgcmVmZXJlbmNlXG4gICAgY29uc3Qga2V5c1RvRGVsZXRlID0gW1wib3V0cHV0XCIsIFwibWVzc2FnZXNcIiwgXCJyZXNwb25zZVwiLCBcInJlc3VsdFwiXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzVG9EZWxldGUpIHtcbiAgICAgIGlmIChrZXkgaW4gcGF5bG9hZCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHBheWxvYWRba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHBheWxvYWRba2V5XSA9IHt9O1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgcGF5bG9hZFtrZXldID0gW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIHBheWxvYWRba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDUuIFJldHVybiB0aGUgbW9kaWZpZWQgcGFydCBvYmplY3QuIE1hc3RyYSBoYW5kbGVzIHJlLXNlcmlhbGl6YXRpb25cbiAgICAvLyBmb3IgdGhlIG91dGJvdW5kIFNTRSBjbGllbnQgc3RyZWFtIGF1dG9tYXRpY2FsbHkuXG4gICAgcmV0dXJuIHBhcnQ7XG4gIH1cbn1cbiJdfQ==
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzc29ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9jZXNzb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzdDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUUvQzs7Ozs7O0dBTUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxLQUFjO0lBQ25DLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdkMsTUFBTSxHQUFHLEdBQUcsS0FBZ0MsQ0FBQztRQUM3QyxNQUFNLEdBQUcsR0FBNEIsRUFBRSxDQUFDO1FBQ3hDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0MsSUFBSSxHQUFHLEtBQUssU0FBUztnQkFBRSxTQUFTO1lBQ2hDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFtQjtJQUN2RCxFQUFFLEVBQUUsb0JBQW9CO0lBQ3hCLFdBQVcsRUFDVCxpSEFBaUg7SUFDbkgsWUFBWSxDQUFDLElBQXNCO1FBQ2pDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNqQixLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssV0FBVztnQkFBRSxTQUFTO1lBQzNDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFBRSxTQUFTO1lBQ3BDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ3pCLHdEQUF3RDtnQkFDeEQsOERBQThEO2dCQUM5RCx1REFBdUQ7Z0JBQ3ZELHdEQUF3RDtnQkFDeEQsd0NBQXdDO2dCQUN4QyxJQUFLLElBQTJCLENBQUMsSUFBSSxLQUFLLGlCQUFpQixFQUFFLENBQUM7b0JBQzVELFNBQVM7Z0JBQ1gsQ0FBQztnQkFDRCxNQUFNLEdBQUcsR0FBSSxJQUFrRCxDQUFDLGNBQWMsQ0FBQztnQkFDL0UsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLFNBQVM7b0JBQUUsU0FBUztnQkFDL0MsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztnQkFDMUIsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNwQyxzREFBc0Q7Z0JBQ3RELHFEQUFxRDtnQkFDckQsb0RBQW9EO2dCQUNwRCw4Q0FBOEM7Z0JBQzlDLElBQ0UsT0FBTyxNQUFNLEtBQUssUUFBUTtvQkFDMUIsTUFBTSxLQUFLLElBQUk7b0JBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQzlELENBQUM7b0JBQ0QsR0FBRyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7b0JBQ25CLFFBQVEsSUFBSSxDQUFDLENBQUM7Z0JBQ2hCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFzdHJhIHN0cmVhbSBwcm9jZXNzb3JzIHdpcmVkIG9udG8gdGhlIHBsdWdpbidzIGFnZW50cy5cbiAqXG4gKiBUaGUgaW5wdXQgcHJvY2Vzc29yICh7QGxpbmsgc3RyaXBTdGFsZUNoYXJ0c1Byb2Nlc3Nvcn0pIHNjcnVicyB0dXJuLXNjb3BlZFxuICogYGNoYXJ0SWRgIGZpZWxkcyBvdXQgb2YgcHJpb3IgdG9vbCByZXN1bHRzIHJlcGxheWVkIGZyb20gTWVtb3J5LCBzbyB0aGUgbW9kZWxcbiAqIGNhbm5vdCBjb3B5IGEgc3RhbGUgaWQgaW50byB0aGUgbmV3IHR1cm4ncyBgW2NoYXJ0OjxpZD5dYCBtYXJrZXJzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBJbnB1dFByb2Nlc3NvciwgUHJvY2Vzc0lucHV0QXJncyB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcHJvY2Vzc29yc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL3Byb2Nlc3NvcnNcIik7XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgY2xvbmUgYHZhbHVlYCwgb21pdHRpbmcgYW55IHByb3BlcnR5IHdob3NlIGtleSBpc1xuICogYGNoYXJ0SWRgLiBBcnJheXMgYXJlIG1hcHBlZCBlbGVtZW50LXdpc2U7IHByaW1pdGl2ZXMgYXJlXG4gKiByZXR1cm5lZCBhcy1pcy4gVGhlIHJlc3VsdCBpcyBzdHJ1Y3R1cmFsbHkgaWRlbnRpY2FsIHRvIHRoZVxuICogaW5wdXQgbWludXMgY2hhcnRJZHMsIHNvIGRvd25zdHJlYW0gbWVzc2FnZS1zaGFwZSBjb25zdW1lcnNcbiAqIGtlZXAgd29ya2luZy5cbiAqL1xuZnVuY3Rpb24gc3RyaXBDaGFydElkcyh2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKHN0cmlwQ2hhcnRJZHMpO1xuICB9XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBvYmogPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgIGlmIChrZXkgPT09IFwiY2hhcnRJZFwiKSBjb250aW51ZTtcbiAgICAgIG91dFtrZXldID0gc3RyaXBDaGFydElkcyh2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBNYXN0cmEgaW5wdXQgcHJvY2Vzc29yIHRoYXQgc3RyaXBzIGBjaGFydElkYCBmaWVsZHMgZnJvbSBldmVyeVxuICogdG9vbC1pbnZvY2F0aW9uIHJlc3VsdCBpbiBwcmlvciBhc3Npc3RhbnQgbWVzc2FnZXMgYmVmb3JlIHRoZXlcbiAqIHJlYWNoIHRoZSBtb2RlbC5cbiAqXG4gKiBXaHk6IGNoYXJ0SWRzIGFyZSB0dXJuLXNjb3BlZCBmcm9tIHRoZSBtb2RlbCdzIHBvaW50IG9mIHZpZXcgLVxuICogZWFjaCBgcHJlcGFyZV9jaGFydGAgLyBgcmVuZGVyX2RhdGFgIGNhbGwgbWludHMgYSBmcmVzaCBpZCBhbmRcbiAqIHRoZSBob3N0IFVJIGJpbmRzIGl0IHRvIHRoYXQgdHVybidzIHJlcGx5LiBNYXN0cmEgTWVtb3J5XG4gKiByZXBsYXlzIHByaW9yIHRvb2wgcmVzdWx0cyBpbnRvIHRoZSBwcm9tcHQ7IGlmIG9sZCBjaGFydElkc1xuICogbGVhayB0aHJvdWdoLCB0aGUgbW9kZWwgaXMgdGVtcHRlZCB0byBjb3B5IHRoZW0gdmVyYmF0aW0gaW50b1xuICogdGhlIG5ldyB0dXJuJ3MgYFtjaGFydDo8aWQ+XWAgbWFya2VycyBhbmQgdGhlIGhvc3QgVUkgZW5kcyB1cFxuICogcmVuZGVyaW5nIGFuIHVucmVsYXRlZCBjaGFydCBmcm9tIHRoZSBjaGFydCBjYWNoZSAob3JcbiAqIGEgNDA0IG9uY2UgdGhlIDFoIFRUTCBlbGFwc2VkKS4gVGhpcyBwcm9jZXNzb3IgcmVtb3ZlcyB0aGVcbiAqIHRlbXB0YXRpb24gYnkgZGVsZXRpbmcgYGNoYXJ0SWRgIGtleXMgZnJvbSBldmVyeSBhc3Npc3RhbnRcbiAqIG1lc3NhZ2UncyB0b29sIHJlc3VsdHMgYmVmb3JlIHRoZSBwcm9tcHQgaXMgYnVpbHQuIFRoZSBjdXJyZW50XG4gKiB0dXJuJ3MgdG9vbCByZXN1bHRzIGRvbid0IGV4aXN0IHlldCBhdCBgcHJvY2Vzc0lucHV0YCB0aW1lLCBzb1xuICogdGhleSBwYXNzIHRocm91Z2ggdW5tb2RpZmllZC5cbiAqXG4gKiBUaGUgc3RyaXAgaXMgcmVjdXJzaXZlIC0gYW55IG5lc3RlZCBgY2hhcnRJZGAgZmllbGQgaXMgcmVtb3ZlZCxcbiAqIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggdG9vbCBwcm9kdWNlZCB0aGUgcmVzdWx0LiBUaGlzIGNvdmVyc1xuICogYHByZXBhcmVfY2hhcnRgIC8gYHJlbmRlcl9kYXRhYCB0b3AtbGV2ZWwgY2hhcnRJZHMgYW5kIGFueVxuICogbGVnYWN5IGBkYXRhc2V0c1tdLmNoYXJ0SWRgIHBheWxvYWRzIHVuaWZvcm1seSB3aXRob3V0IGNvdXBsaW5nXG4gKiB0byBzcGVjaWZpYyB0b29sIGlkcy5cbiAqXG4gKiBXaXJlZCBvbnRvIGV2ZXJ5IGFnZW50IGJ5IGRlZmF1bHQgdmlhIGBidWlsZEFnZW50c2A7IG9wdCBvdXQgd2l0aFxuICogYE1hc3RyYVBsdWdpbkNvbmZpZy5zdHJpcFN0YWxlQ2hhcnRzOiBmYWxzZWAuXG4gKi9cbmV4cG9ydCBjb25zdCBzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yOiBJbnB1dFByb2Nlc3NvciA9IHtcbiAgaWQ6IFwic3RyaXAtc3RhbGUtY2hhcnRzXCIsXG4gIGRlc2NyaXB0aW9uOlxuICAgIFwiUmVtb3ZlcyBjaGFydElkIGZpZWxkcyBmcm9tIHByaW9yIHRvb2wtaW52b2NhdGlvbiByZXN1bHRzIHNvIHRoZSBtb2RlbCBjYW4ndCByZXVzZSB0dXJuLXNjb3BlZCBpZHMgZnJvbSBtZW1vcnkuXCIsXG4gIHByb2Nlc3NJbnB1dChhcmdzOiBQcm9jZXNzSW5wdXRBcmdzKSB7XG4gICAgbGV0IHN0cmlwcGVkID0gMDtcbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgYXJncy5tZXNzYWdlcykge1xuICAgICAgaWYgKG1lc3NhZ2Uucm9sZSAhPT0gXCJhc3Npc3RhbnRcIikgY29udGludWU7XG4gICAgICBjb25zdCBwYXJ0cyA9IG1lc3NhZ2UuY29udGVudD8ucGFydHM7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFydHMpKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAvLyBUb29sLWludm9jYXRpb24gcGFydHMgaG9sZCB0aGUgcGVyc2lzdGVkIHRvb2wgcmVzdWx0LlxuICAgICAgICAvLyBXZSBkb24ndCBzY3J1YiB0aGUgaW5wdXQgYXJncyAoYHJhd0lucHV0YCAvIGBhcmdzYCkgYmVjYXVzZVxuICAgICAgICAvLyB0aGUgY2hhcnRJZCB0aGVyZSBpcyB0aGUgbW9kZWwncyBvdXRnb2luZyBjbGFpbSwgbm90XG4gICAgICAgIC8vIGFueXRoaW5nIGl0IGNvdWxkIHJlLXJlZmVyZW5jZTsgb25seSBgcmVzdWx0YCBjYXJyaWVzXG4gICAgICAgIC8vIGlkcyB0aGF0IHN1YnNlcXVlbnQgdHVybnMgbWlnaHQgY29weS5cbiAgICAgICAgaWYgKChwYXJ0IGFzIHsgdHlwZT86IHVua25vd24gfSkudHlwZSAhPT0gXCJ0b29sLWludm9jYXRpb25cIikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGludiA9IChwYXJ0IGFzIHsgdG9vbEludm9jYXRpb24/OiB7IHJlc3VsdD86IHVua25vd24gfSB9KS50b29sSW52b2NhdGlvbjtcbiAgICAgICAgaWYgKCFpbnYgfHwgaW52LnJlc3VsdCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgYmVmb3JlID0gaW52LnJlc3VsdDtcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSBzdHJpcENoYXJ0SWRzKGJlZm9yZSk7XG4gICAgICAgIC8vIENoZWFwIHN0cnVjdHVyYWwgY2hlY2sgdmlhIEpTT04gbGVuZ3RoIC0gdGhlIGFjdHVhbFxuICAgICAgICAvLyBzdHJpcCB3cml0ZXMgYSBmcmVzaCBvYmplY3Qgb25seSB3aGVuIGNoYXJ0SWQga2V5c1xuICAgICAgICAvLyBleGlzdGVkLCBzbyBkaWZmZXJlbnQgc3RyaW5naWZpY2F0aW9uIGxlbmd0aCBpcyBhXG4gICAgICAgIC8vIHJlbGlhYmxlIHNpZ25hbCB0aGF0IHNvbWV0aGluZyB3YXMgcmVtb3ZlZC5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR5cGVvZiBiZWZvcmUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICBiZWZvcmUgIT09IG51bGwgJiZcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShiZWZvcmUpLmxlbmd0aCAhPT0gSlNPTi5zdHJpbmdpZnkoYWZ0ZXIpLmxlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICBpbnYucmVzdWx0ID0gYWZ0ZXI7XG4gICAgICAgICAgc3RyaXBwZWQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RyaXBwZWQgPiAwKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJzdHJpcHBlZFwiLCB7IHJlc3VsdHM6IHN0cmlwcGVkIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYXJncy5tZXNzYWdlcztcbiAgfSxcbn07XG4iXX0=
|
package/lib/src/server.d.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Express-layer plumbing for the Mastra plugin: a `MastraServer` that
|
|
3
|
-
* stamps the per-request `RequestContext
|
|
4
|
-
* that lets the plugin's custom API routes (e.g. `historyRoute`) work
|
|
5
|
-
* behind an Express mount point.
|
|
3
|
+
* stamps the per-request `RequestContext` and a scoped native API gate.
|
|
6
4
|
*
|
|
7
5
|
* @module
|
|
8
6
|
*/
|
|
@@ -10,6 +8,8 @@ import { RequestContext } from "@mastra/core/request-context";
|
|
|
10
8
|
import { MastraServer as ExpressMastraServer } from "@mastra/express";
|
|
11
9
|
import type express from "express";
|
|
12
10
|
import { type MastraPluginConfig } from "./config.ts";
|
|
11
|
+
/** Remove browser-supplied values for fields owned by trusted server middleware. */
|
|
12
|
+
export declare function clearTrustedRequestContext(requestContext: RequestContext): void;
|
|
13
13
|
/**
|
|
14
14
|
* Who a turn is ATTRIBUTED to, independent of which Databricks credential runs
|
|
15
15
|
* its calls. Supplied by the HTTP middleware from the forwarded user headers so
|
|
@@ -111,7 +111,7 @@ export declare class MastraServer extends ExpressMastraServer {
|
|
|
111
111
|
/**
|
|
112
112
|
* Resolve the thread id this request targets and pin it on
|
|
113
113
|
* `RequestContext` (consumed by the agent stream for persistence and
|
|
114
|
-
* by
|
|
114
|
+
* by native memory routes). Resolution order:
|
|
115
115
|
*
|
|
116
116
|
* 1. A client-supplied thread id (the thread-selection header /
|
|
117
117
|
* `?threadId=` query). This is how the chat UI references a
|
|
@@ -148,26 +148,15 @@ export interface MastraApiGateOptions {
|
|
|
148
148
|
* dispatched, given the configured {@link MastraApiGateOptions.access}.
|
|
149
149
|
*
|
|
150
150
|
* `path` is mount-relative (what the plugin's catch-all sees, e.g.
|
|
151
|
-
* `/
|
|
151
|
+
* `/chat/x`, `/memory/threads`, `/mcp/...`). In `"scoped"`
|
|
152
152
|
* mode the allowlist is deliberately tight - the chat client only ever
|
|
153
|
-
* needs agent inference, read-only agent metadata,
|
|
154
|
-
*
|
|
155
|
-
*
|
|
156
|
-
* denied by default rather than enumerated.
|
|
153
|
+
* needs agent inference, read-only agent metadata, resource-scoped memory,
|
|
154
|
+
* this plugin's own `/route/*` routes, and (when enabled) MCP. The remaining
|
|
155
|
+
* admin, mutating, and bulk-export surface stays denied by default.
|
|
157
156
|
*/
|
|
158
157
|
export declare function isMastraRequestAllowed(method: string, path: string, opts: MastraApiGateOptions): boolean;
|
|
159
158
|
/**
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
* `MastraServer` is hosted on an Express subapp mounted under a parent
|
|
163
|
-
* path (e.g. `/api/mastra`).
|
|
164
|
-
*
|
|
165
|
-
* The adapter's `registerCustomApiRoutes` matches against `req.path`
|
|
166
|
-
* (mount-relative, correct) but dispatches to its internal Hono
|
|
167
|
-
* mini-app using `req.originalUrl`, which still contains the parent
|
|
168
|
-
* mount prefix. The Hono app registers the literal route paths
|
|
169
|
-
* (for example `/route/history`), so the absolute URL never matches
|
|
170
|
-
* until we overwrite `originalUrl` for `/route` and `/route/*` to the
|
|
171
|
-
* mount-relative path.
|
|
159
|
+
* Keep Mastra custom API routes mount-relative when the Express subapp is
|
|
160
|
+
* hosted under AppKit's `/api/<plugin>` path.
|
|
172
161
|
*/
|
|
173
162
|
export declare function attachRoutePatchMiddleware(app: express.Express): void;
|
package/lib/src/server.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Express-layer plumbing for the Mastra plugin: a `MastraServer` that
|
|
3
|
-
* stamps the per-request `RequestContext
|
|
4
|
-
* that lets the plugin's custom API routes (e.g. `historyRoute`) work
|
|
5
|
-
* behind an Express mount point.
|
|
3
|
+
* stamps the per-request `RequestContext` and a scoped native API gate.
|
|
6
4
|
*
|
|
7
5
|
* @module
|
|
8
6
|
*/
|
|
@@ -23,6 +21,22 @@ import { extractModelOverride, MASTRA_MODEL_OVERRIDE_KEY, resolveServingConfig,
|
|
|
23
21
|
* attach feedback to.
|
|
24
22
|
*/
|
|
25
23
|
const INVALID_TRACE_ID = "0".repeat(32);
|
|
24
|
+
const TRUSTED_REQUEST_CONTEXT_KEYS = [
|
|
25
|
+
MASTRA_RESOURCE_ID_KEY,
|
|
26
|
+
MASTRA_THREAD_ID_KEY,
|
|
27
|
+
MASTRA_USER_KEY,
|
|
28
|
+
MASTRA_USER_NAME_KEY,
|
|
29
|
+
MASTRA_USER_EMAIL_KEY,
|
|
30
|
+
MASTRA_REQUEST_ID_KEY,
|
|
31
|
+
MASTRA_SCOPES_KEY,
|
|
32
|
+
MASTRA_MODEL_OVERRIDE_KEY,
|
|
33
|
+
];
|
|
34
|
+
/** Remove browser-supplied values for fields owned by trusted server middleware. */
|
|
35
|
+
export function clearTrustedRequestContext(requestContext) {
|
|
36
|
+
for (const key of TRUSTED_REQUEST_CONTEXT_KEYS) {
|
|
37
|
+
requestContext.deleteRaw(key);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
26
40
|
/**
|
|
27
41
|
* Stamp the AppKit user (plus the resource id and trace metadata) onto
|
|
28
42
|
* `requestContext`.
|
|
@@ -130,6 +144,7 @@ export class MastraServer extends ExpressMastraServer {
|
|
|
130
144
|
super.registerAuthMiddleware();
|
|
131
145
|
this.app.use(async (req, res, next) => {
|
|
132
146
|
const requestContext = res.locals.requestContext;
|
|
147
|
+
clearTrustedRequestContext(requestContext);
|
|
133
148
|
await this.configureRequestContextUser(req, requestContext);
|
|
134
149
|
this.configureRequestContextThreadId(req, res, requestContext);
|
|
135
150
|
this.configureRequestContextModelOverride(req, requestContext);
|
|
@@ -217,7 +232,7 @@ export class MastraServer extends ExpressMastraServer {
|
|
|
217
232
|
/**
|
|
218
233
|
* Resolve the thread id this request targets and pin it on
|
|
219
234
|
* `RequestContext` (consumed by the agent stream for persistence and
|
|
220
|
-
* by
|
|
235
|
+
* by native memory routes). Resolution order:
|
|
221
236
|
*
|
|
222
237
|
* 1. A client-supplied thread id (the thread-selection header /
|
|
223
238
|
* `?threadId=` query). This is how the chat UI references a
|
|
@@ -294,62 +309,71 @@ export class MastraServer extends ExpressMastraServer {
|
|
|
294
309
|
* prefix their `-generate` non-streaming variants), the `-network-` variants,
|
|
295
310
|
* and `resume-stream` (covers `resume-stream-until-idle`). Without these an
|
|
296
311
|
* approval-gated tool (e.g. `send_email`) can be requested but never approved
|
|
297
|
-
* from the browser - the resume `POST` 403s under scoped mode.
|
|
298
|
-
*
|
|
312
|
+
* from the browser - the resume `POST` 403s under scoped mode. Together with
|
|
313
|
+
* the resource-scoped memory mutations below, these are the only stock Mastra
|
|
314
|
+
* writes the browser client can make.
|
|
299
315
|
*/
|
|
300
316
|
const AGENT_INFERENCE = /^\/agents\/[^/]+\/(stream|generate|network|resume-stream|approve-tool-call|decline-tool-call|approve-network-tool-call|decline-network-tool-call)/i;
|
|
301
317
|
/** Mount-relative read-only agent metadata (`/agents`, `/agents/:id`). */
|
|
302
318
|
const AGENT_METADATA = /^\/agents(\/[^/]+)?$/;
|
|
319
|
+
/** Persisted approval discovery for one agent. */
|
|
320
|
+
const AGENT_SUSPENDED_RUNS = /^\/agents\/[^/]+\/suspended-runs$/i;
|
|
321
|
+
/** Official AI SDK UI stream route, including `resumeData` continuations. */
|
|
322
|
+
const AGENT_CHAT = /^\/chat\/[^/]+$/i;
|
|
323
|
+
/** Native resource-scoped memory reads used by history and the thread list. */
|
|
324
|
+
const MEMORY_READ = /^\/memory\/threads(?:\/[^/]+(?:\/messages)?)?$/i;
|
|
325
|
+
/** Native thread rename/delete routes. */
|
|
326
|
+
const MEMORY_THREAD_MUTATION = /^\/memory\/threads\/[^/]+$/i;
|
|
303
327
|
/**
|
|
304
328
|
* Whether a request to the stock `@mastra/express` sub-app should be
|
|
305
329
|
* dispatched, given the configured {@link MastraApiGateOptions.access}.
|
|
306
330
|
*
|
|
307
331
|
* `path` is mount-relative (what the plugin's catch-all sees, e.g.
|
|
308
|
-
* `/
|
|
332
|
+
* `/chat/x`, `/memory/threads`, `/mcp/...`). In `"scoped"`
|
|
309
333
|
* mode the allowlist is deliberately tight - the chat client only ever
|
|
310
|
-
* needs agent inference, read-only agent metadata,
|
|
311
|
-
*
|
|
312
|
-
*
|
|
313
|
-
* denied by default rather than enumerated.
|
|
334
|
+
* needs agent inference, read-only agent metadata, resource-scoped memory,
|
|
335
|
+
* this plugin's own `/route/*` routes, and (when enabled) MCP. The remaining
|
|
336
|
+
* admin, mutating, and bulk-export surface stays denied by default.
|
|
314
337
|
*/
|
|
315
338
|
export function isMastraRequestAllowed(method, path, opts) {
|
|
316
339
|
if (opts.access === "full")
|
|
317
340
|
return true;
|
|
318
341
|
const p = path.startsWith("/") ? path : `/${path}`;
|
|
319
|
-
//
|
|
320
|
-
//
|
|
342
|
+
// The plugin's `/route/*` additions validate their own inputs and trusted
|
|
343
|
+
// AppKit request context before reaching product behavior.
|
|
321
344
|
if (p === "/route" || p.startsWith("/route/"))
|
|
322
345
|
return true;
|
|
323
346
|
if (opts.mcpEnabled && (p === "/mcp" || p.startsWith("/mcp/")))
|
|
324
347
|
return true;
|
|
325
348
|
const m = method.toUpperCase();
|
|
349
|
+
if (m === "POST" && AGENT_CHAT.test(p))
|
|
350
|
+
return true;
|
|
326
351
|
if (m === "POST" && AGENT_INFERENCE.test(p))
|
|
327
352
|
return true;
|
|
328
|
-
if (m === "GET" && AGENT_METADATA.test(p))
|
|
353
|
+
if (m === "GET" && (AGENT_METADATA.test(p) || AGENT_SUSPENDED_RUNS.test(p)))
|
|
354
|
+
return true;
|
|
355
|
+
if (m === "GET" && MEMORY_READ.test(p))
|
|
356
|
+
return true;
|
|
357
|
+
if ((m === "PATCH" || m === "DELETE") && MEMORY_THREAD_MUTATION.test(p))
|
|
358
|
+
return true;
|
|
359
|
+
if (m === "POST" && p === "/memory/messages/delete")
|
|
329
360
|
return true;
|
|
330
361
|
return false;
|
|
331
362
|
}
|
|
332
363
|
/**
|
|
333
|
-
*
|
|
334
|
-
*
|
|
335
|
-
* `MastraServer` is hosted on an Express subapp mounted under a parent
|
|
336
|
-
* path (e.g. `/api/mastra`).
|
|
337
|
-
*
|
|
338
|
-
* The adapter's `registerCustomApiRoutes` matches against `req.path`
|
|
339
|
-
* (mount-relative, correct) but dispatches to its internal Hono
|
|
340
|
-
* mini-app using `req.originalUrl`, which still contains the parent
|
|
341
|
-
* mount prefix. The Hono app registers the literal route paths
|
|
342
|
-
* (for example `/route/history`), so the absolute URL never matches
|
|
343
|
-
* until we overwrite `originalUrl` for `/route` and `/route/*` to the
|
|
344
|
-
* mount-relative path.
|
|
364
|
+
* Keep Mastra custom API routes mount-relative when the Express subapp is
|
|
365
|
+
* hosted under AppKit's `/api/<plugin>` path.
|
|
345
366
|
*/
|
|
346
367
|
export function attachRoutePatchMiddleware(app) {
|
|
347
368
|
app.use((req, _res, next) => {
|
|
348
|
-
const isCustomRoute = req.path === "/
|
|
369
|
+
const isCustomRoute = req.path === "/chat" ||
|
|
370
|
+
req.path.startsWith("/chat/") ||
|
|
371
|
+
req.path === "/route" ||
|
|
372
|
+
req.path.startsWith("/route/");
|
|
349
373
|
if (!isCustomRoute)
|
|
350
374
|
return next();
|
|
351
375
|
req.originalUrl = req.path;
|
|
352
376
|
next();
|
|
353
377
|
});
|
|
354
378
|
}
|
|
355
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RCxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQixjQUFjLEdBQ2YsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsWUFBWSxJQUFJLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzNDLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsZUFBZSxFQUNmLG9CQUFvQixHQUdyQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVyRCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLHlCQUF5QixFQUN6QixvQkFBb0IsR0FDckIsTUFBTSxjQUFjLENBQUM7QUFDdEI7Ozs7O0dBS0c7QUFDSCxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFpQnhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHVCQUF1QixDQUMzQyxjQUE4QixFQUM5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QixJQUFJLEVBQUUsQ0FBQztJQUNULENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXhwcmVzcy1sYXllciBwbHVtYmluZyBmb3IgdGhlIE1hc3RyYSBwbHVnaW46IGEgYE1hc3RyYVNlcnZlcmAgdGhhdFxuICogc3RhbXBzIHRoZSBwZXItcmVxdWVzdCBgUmVxdWVzdENvbnRleHRgLCBhbmQgYSByb3V0ZS1wYXRjaCBtaWRkbGV3YXJlXG4gKiB0aGF0IGxldHMgdGhlIHBsdWdpbidzIGN1c3RvbSBBUEkgcm91dGVzIChlLmcuIGBoaXN0b3J5Um91dGVgKSB3b3JrXG4gKiBiZWhpbmQgYW4gRXhwcmVzcyBtb3VudCBwb2ludC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZ2V0RXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGhhc2gsIGh0dHAsIGxvZywgb2JqZWN0LCBzdHJpbmcsIHRva2VuIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGZlZWRiYWNrLCB0aHJlYWQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQge1xuICBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLFxuICBNQVNUUkFfVEhSRUFEX0lEX0tFWSxcbiAgUmVxdWVzdENvbnRleHQsXG59IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBNYXN0cmFTZXJ2ZXIgYXMgRXhwcmVzc01hc3RyYVNlcnZlciB9IGZyb20gXCJAbWFzdHJhL2V4cHJlc3NcIjtcbmltcG9ydCB7IHRyYWNlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQge1xuICBhdHRyaWJ1dGVkVXNlcklkLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIE1BU1RSQV9VU0VSX0tFWSxcbiAgTUFTVFJBX1VTRVJfTkFNRV9LRVksXG4gIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnLFxuICB0eXBlIFVzZXIsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgcmVxdWVzdFVzZXJFbWFpbCwgcmVxdWVzdFVzZXJJZCB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlRmVlZGJhY2tFbmFibGVkIH0gZnJvbSBcIi4vbWxmbG93LnRzXCI7XG5cbmltcG9ydCB7XG4gIGV4dHJhY3RNb2RlbE92ZXJyaWRlLFxuICBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLFxuICByZXNvbHZlU2VydmluZ0NvbmZpZyxcbn0gZnJvbSBcIi4vc2VydmluZy50c1wiO1xuLyoqXG4gKiBPcGVuVGVsZW1ldHJ5J3Mgc2VudGluZWwgZm9yIFwibm8gdmFsaWQgdHJhY2VcIiAtIDMyIHplcm8gaGV4IGNoYXJzLlxuICogYHRyYWNlLmdldEFjdGl2ZVNwYW4oKWAgcmV0dXJucyBhIG5vbi1yZWNvcmRpbmcgc3BhbiB3aXRoIHRoaXMgaWRcbiAqIHdoZW4gbm8gU0RLIGlzIHJlZ2lzdGVyZWQsIHdoaWNoIG11c3QgbmV2ZXIgYmUgc3VyZmFjZWQgYXMgYSB0cmFjZSB0b1xuICogYXR0YWNoIGZlZWRiYWNrIHRvLlxuICovXG5jb25zdCBJTlZBTElEX1RSQUNFX0lEID0gXCIwXCIucmVwZWF0KDMyKTtcblxuLyoqXG4gKiBXaG8gYSB0dXJuIGlzIEFUVFJJQlVURUQgdG8sIGluZGVwZW5kZW50IG9mIHdoaWNoIERhdGFicmlja3MgY3JlZGVudGlhbCBydW5zXG4gKiBpdHMgY2FsbHMuIFN1cHBsaWVkIGJ5IHRoZSBIVFRQIG1pZGRsZXdhcmUgZnJvbSB0aGUgZm9yd2FyZGVkIHVzZXIgaGVhZGVycyBzb1xuICogdGhhdCBpbiBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgLSB3aGVyZSBldmVyeSByZXF1ZXN0IHNoYXJlcyB0aGUgYXBwIFNQJ3NcbiAqIGNsaWVudCAtIHRoZSBtZW1vcnkgdGhyZWFkLCBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2UsIGFuZCB0cmFjZSBtZXRhZGF0YVxuICogc3RpbGwga2V5IG9mZiB0aGUgcmVhbCBjYWxsZXIuIElnbm9yZWQgaW4gYW4gT0JPICh1c2VyKSBjb250ZXh0LCB3aG9zZSBvd25cbiAqIHVzZXIgaWQgLyBlbWFpbCBhcmUgYXV0aG9yaXRhdGl2ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdHRyaWJ1dGVkSWRlbnRpdHkge1xuICAvKiogRm9yd2FyZGVkIGB4LWZvcndhcmRlZC11c2VyYCBpZCwgdXNlZCB3aGVuIHRoZSBjbGllbnQgaXMgdGhlIHNlcnZpY2UgcHJpbmNpcGFsLiAqL1xuICB1c2VySWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBGb3J3YXJkZWQgYHgtZm9yd2FyZGVkLWVtYWlsYCwgdXNlZCBmb3IgdHJhY2UgbWV0YWRhdGEgdW5kZXIgdGhlIHNlcnZpY2UgcHJpbmNpcGFsLiAqL1xuICBlbWFpbD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTdGFtcCB0aGUgQXBwS2l0IHVzZXIgKHBsdXMgdGhlIHJlc291cmNlIGlkIGFuZCB0cmFjZSBtZXRhZGF0YSkgb250b1xuICogYHJlcXVlc3RDb250ZXh0YC5cbiAqXG4gKiBTcGxpdCBvdXQgb2Yge0BsaW5rIE1hc3RyYVNlcnZlcn0gYmVjYXVzZSB0aGUgSFRUUCBtaWRkbGV3YXJlIGlzIG5vdCB0aGUgb25seVxuICogY2FsbGVyIHRoYXQgbmVlZHMgaXQ6IGFuIG91dC1vZi1iYW5kIHR1cm4gKGEgVGVhbXMgYWN0aXZpdHkgYXJyaXZpbmcgb25cbiAqIGFub3RoZXIgcGx1Z2luJ3Mgcm91dGUsIGEgc2NoZWR1bGVkIGpvYikgZHJpdmVzIGBhZ2VudC5nZW5lcmF0ZWAgZGlyZWN0bHksIGFuZFxuICogd2l0aG91dCB0aGlzIHN0YW1wIGV2ZXJ5IHVzZXItc2NvcGVkIHRvb2wgLSBgYXNrX2dlbmllYCBhYm92ZSBhbGwgLSBmYWlscyB3aXRoXG4gKiBcImludm9rZSB0aGUgdG9vbCBmcm9tIGFuIGFnZW50IHR1cm4gc2VydmVkIGJ5IHRoZSBtYXN0cmEgcGx1Z2luXCIuIFRob3NlXG4gKiBjYWxsZXJzIGJ1aWxkIGEgY29udGV4dCB3aXRoIHtAbGluayBjcmVhdGVSZXF1ZXN0Q29udGV4dH0gaW5zdGVhZCBvZiBhXG4gKiByZXF1ZXN0LlxuICpcbiAqIFRoZSBEYXRhYnJpY2tzIGNyZWRlbnRpYWwgYWx3YXlzIGNvbWVzIGZyb20gdGhlIGFtYmllbnQgZXhlY3V0aW9uIGNvbnRleHQ7XG4gKiBgYXR0cmlidXRlZGAgb25seSBjaGFuZ2VzIFdITyB0aGUgdHVybiBpcyBhdHRyaWJ1dGVkIHRvIHdoZW4gdGhhdCBjb250ZXh0IGlzXG4gKiB0aGUgc2VydmljZSBwcmluY2lwYWwgKHNlZSB7QGxpbmsgQXR0cmlidXRlZElkZW50aXR5fSkuXG4gKlxuICogSWRlbXBvdGVudDogcmV0dXJucyBpbW1lZGlhdGVseSB3aGVuIHRoZSB1c2VyIGFuZCByZXNvdXJjZSBpZCBhcmUgYWxyZWFkeVxuICogcHJlc2VudCwgc28gdGhlIG1pZGRsZXdhcmUgY2FuIGNhbGwgaXQgb3ZlciBhIGNvbnRleHQgYW5vdGhlciBsYXllciBzdGFtcGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXIoXG4gIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCxcbiAgYXR0cmlidXRlZDogQXR0cmlidXRlZElkZW50aXR5ID0ge30sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKFtNQVNUUkFfVVNFUl9LRVksIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVldLmV2ZXJ5KChrZXkpID0+IHJlcXVlc3RDb250ZXh0LmdldChrZXkpKSkgcmV0dXJuO1xuICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICBjb25zdCBpc1VzZXJDb250ZXh0ID0gXCJpc1VzZXJDb250ZXh0XCIgaW4gZXhlY3V0aW9uQ29udGV4dDtcbiAgLy8gVGhlIERhdGFicmlja3MgQ1JFREVOVElBTCBpcyBhbHdheXMgdGhlIGFtYmllbnQgZXhlY3V0aW9uIGNvbnRleHQncyBjbGllbnRcbiAgLy8gKE9CTyBpbiBhIHVzZXIgY29udGV4dCwgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIG90aGVyd2lzZSkuIFdITyB0aGUgdHVybiBpc1xuICAvLyBhdHRyaWJ1dGVkIHRvIGNhbiBkaWZmZXI6IGluIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSBldmVyeSByZXF1ZXN0IHNoYXJlc1xuICAvLyB0aGUgU1AgY2xpZW50LCBidXQgdGhlIGZvcndhcmRlZCB1c2VyIGlkIG11c3Qgc3RpbGwga2V5IHRoZSBtZW1vcnkgdGhyZWFkXG4gIC8vIGFuZCB0aGUgcGVyLXVzZXIgY2FjaGUgbmFtZXNwYWNlIHNvIHR3byBjYWxsZXJzIGRvbid0IHNoYXJlIGEgY29udmVyc2F0aW9uLlxuICBjb25zdCB1c2VyOiBVc2VyID0ge1xuICAgIGlkOiBhdHRyaWJ1dGVkVXNlcklkKGV4ZWN1dGlvbkNvbnRleHQsIGF0dHJpYnV0ZWQudXNlcklkKSxcbiAgICBleGVjdXRpb25Db250ZXh0LFxuICB9O1xuICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1VTRVJfS0VZLCB1c2VyKTtcbiAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksIHVzZXIuaWQpO1xuICAvLyBBcHBLaXQncyBgVXNlckNvbnRleHRgIHN1cmZhY2VzIGRpc3BsYXkgbmFtZSAvIGVtYWlsIG9ubHkgb25cbiAgLy8gT0JPIHJlcXVlc3RzLiBTZXJ2aWNlLWNvbnRleHQgY2FsbHMgKGJhY2tncm91bmQgdGFza3MsIHNlcnZlclxuICAvLyBzdGFydC11cCkgbGVhdmUgdGhlc2UgdW5kZWZpbmVkIGFuZCB3ZSBza2lwIHRoZSBzdGFtcCBzb1xuICAvLyBkb3duc3RyZWFtIHRyYWNlIG1ldGFkYXRhIHN0YXlzIGFic2VudCByYXRoZXIgdGhhbiBlbXB0eS4gSW5cbiAgLy8gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIHRoZSBmb3J3YXJkZWQgZW1haWwgc3RpbGwgaWRlbnRpZmllcyB0aGUgY2FsbGVyLFxuICAvLyBzbyBpdCBpcyB1c2VkIGZvciB0cmFjZSBtZXRhZGF0YSBldmVuIHRob3VnaCB0aGUgY2xpZW50IGlzIHRoZSBTUC5cbiAgbGV0IHVzZXJOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBlbWFpbDogc3RyaW5nIHwgdW5kZWZpbmVkID0gYXR0cmlidXRlZC5lbWFpbDtcbiAgaWYgKGlzVXNlckNvbnRleHQpIHtcbiAgICB1c2VyTmFtZSA9IGV4ZWN1dGlvbkNvbnRleHQudXNlck5hbWU7XG4gICAgZW1haWwgPSBleGVjdXRpb25Db250ZXh0LnVzZXJFbWFpbCA/PyBlbWFpbDtcbiAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXIgPSBhd2FpdCBleGVjdXRpb25Db250ZXh0LmNsaWVudC5jdXJyZW50VXNlci5tZSgpO1xuICAgIHVzZXJOYW1lID0gY3VycmVudFVzZXI/LnVzZXJOYW1lO1xuICAgIGVtYWlsID0gY3VycmVudFVzZXI/LmVtYWlscz8uZmlsdGVyKChlbWFpbCkgPT4gZW1haWwucHJpbWFyeSkuZmluZCgoZW1haWwpID0+IGVtYWlsLnZhbHVlKVxuICAgICAgPy52YWx1ZSBhcyBzdHJpbmc7XG4gIH1cbiAgaWYgKHVzZXJOYW1lKSB7XG4gICAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9VU0VSX05BTUVfS0VZLCB1c2VyTmFtZSk7XG4gIH1cbiAgaWYgKGVtYWlsKSB7XG4gICAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9VU0VSX0VNQUlMX0tFWSwgZW1haWwpO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGBSZXF1ZXN0Q29udGV4dGAgYSBOT04tSFRUUCBhZ2VudCB0dXJuIG5lZWRzLlxuICpcbiAqIEV2ZXJ5dGhpbmcgTWFzdHJhJ3MgdG9vbHMgcmVhZCBvZmYgdGhlIGNvbnRleHQgaXMgc3RhbXBlZCB0aGUgc2FtZSB3YXkgdGhlXG4gKiByZXF1ZXN0IG1pZGRsZXdhcmUgc3RhbXBzIGl0IC0gdGhlIEFwcEtpdCB1c2VyIChzbyBgYXNrX2dlbmllYCBhbmQgdGhlIG1vZGVsXG4gKiByZXNvbHZlciBjYW4gbWludCB1c2VyLXNjb3BlZCB0b2tlbnMpLCB0aGUgbWVtb3J5IHRocmVhZCAvIHJlc291cmNlIHBhaXIsIGFuZFxuICogYSByZXF1ZXN0IGlkIHNvIHRoZSB0dXJuJ3Mgc3BhbnMgam9pbiB1cCBpbiB0cmFjZXMuIFRoZSByZXN1bHQgaXMgcGFzc2VkIGFzXG4gKiBgcmVxdWVzdENvbnRleHRgIHRvIGBhZ2VudC5nZW5lcmF0ZWAgLyBgYWdlbnQuc3RyZWFtYC5cbiAqXG4gKiBUaGlzIGlzIHdoYXQgbWFrZXMgYSBjYXJkIHR1cm4gYW5zd2VyIHdpdGggdGhlIFNBTUUgZGF0YSBhIGNoYXQgdHVybiBkb2VzOiB0aGVcbiAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGVuZHBvaW50cyBpcyBwcmVzZW50YXRpb24sIG5vdCBjYXBhYmlsaXR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUmVxdWVzdENvbnRleHQoXG4gIG9wdGlvbnM6IHsgdGhyZWFkSWQ/OiBzdHJpbmc7IHJlc291cmNlSWQ/OiBzdHJpbmc7IHJlcXVlc3RJZD86IHN0cmluZyB9ID0ge30sXG4pOiBQcm9taXNlPFJlcXVlc3RDb250ZXh0PiB7XG4gIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gbmV3IFJlcXVlc3RDb250ZXh0KCk7XG4gIGF3YWl0IHN0YW1wUmVxdWVzdENvbnRleHRVc2VyKHJlcXVlc3RDb250ZXh0KTtcbiAgaWYgKG9wdGlvbnMudGhyZWFkSWQpIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVEhSRUFEX0lEX0tFWSwgb3B0aW9ucy50aHJlYWRJZCk7XG4gIC8vIFN0YW1wZWQgQUZURVIgdGhlIHVzZXIgc28gYW4gZXhwbGljaXQgcmVzb3VyY2UgaWQgKGEgY2hhbm5lbCBtZW1iZXIsIHNheSlcbiAgLy8gd2lucyBvdmVyIHRoZSBhbWJpZW50IGlkZW50aXR5IGBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcmAgZGVmYXVsdGVkIHRvLlxuICBpZiAob3B0aW9ucy5yZXNvdXJjZUlkKSByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSwgb3B0aW9ucy5yZXNvdXJjZUlkKTtcbiAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9SRVFVRVNUX0lEX0tFWSwgb3B0aW9ucy5yZXF1ZXN0SWQgPz8gaGFzaC5pZCgpKTtcbiAgcmV0dXJuIHJlcXVlc3RDb250ZXh0O1xufVxuXG4vKipcbiAqIGBAbWFzdHJhL2V4cHJlc3NgIHN1YmNsYXNzIHRoYXQgc3RhbXBzIGBSZXF1ZXN0Q29udGV4dGAgd2l0aCB0aGVcbiAqIEFwcEtpdCB1c2VyLCByZXNvdXJjZSBpZCwgYW5kIGEgdGhyZWFkIGlkIGJhY2tlZCBieSBhbiBIVFRQLW9ubHlcbiAqIHNlc3Npb24gY29va2llIChgYXBwa2l0XzxwbHVnaW4tbmFtZT5fc2Vzc2lvbl9pZGApLlxuICovXG5leHBvcnQgY2xhc3MgTWFzdHJhU2VydmVyIGV4dGVuZHMgRXhwcmVzc01hc3RyYVNlcnZlciB7XG4gIHByaXZhdGUgbG9nOiBsb2cuTG9nZ2VyO1xuICAvKipcbiAgICogV2hldGhlciB0byBzdGFtcCB0aGUgTUxmbG93IHRyYWNlLWlkIGhlYWRlciBvbiByZXNwb25zZXMuIFNoYXJlcyB0aGVcbiAgICogcGx1Z2luJ3MgZmVlZGJhY2sgZ2F0ZSB2aWEge0BsaW5rIHJlc29sdmVGZWVkYmFja0VuYWJsZWR9LlxuICAgKi9cbiAgcHJpdmF0ZSBmZWVkYmFja0VuYWJsZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgICAuLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIEV4cHJlc3NNYXN0cmFTZXJ2ZXI+XG4gICkge1xuICAgIHN1cGVyKC4uLmFyZ3MpO1xuICAgIHRoaXMubG9nID0gbG9nLmxvZ2dlcihjb25maWcpO1xuICAgIHRoaXMuZmVlZGJhY2tFbmFibGVkID0gcmVzb2x2ZUZlZWRiYWNrRW5hYmxlZChjb25maWcuZmVlZGJhY2spO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVnaXN0ZXJBdXRoTWlkZGxld2FyZSgpOiB2b2lkIHtcbiAgICBzdXBlci5yZWdpc3RlckF1dGhNaWRkbGV3YXJlKCk7XG4gICAgdGhpcy5hcHAudXNlKGFzeW5jIChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdENvbnRleHQgPSByZXMubG9jYWxzLnJlcXVlc3RDb250ZXh0ISBhcyBSZXF1ZXN0Q29udGV4dDtcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJlUmVxdWVzdENvbnRleHRVc2VyKHJlcSwgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFRocmVhZElkKHJlcSwgcmVzLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0TW9kZWxPdmVycmlkZShyZXEsIHJlcXVlc3RDb250ZXh0KTtcbiAgICAgIHRoaXMuY29uZmlndXJlUmVxdWVzdENvbnRleHRSZXF1ZXN0SWQocmVxLCByZXMsIHJlcXVlc3RDb250ZXh0KTtcbiAgICAgIHRoaXMuY29uZmlndXJlUmVxdWVzdENvbnRleHRTY29wZXMocmVxLCByZXF1ZXN0Q29udGV4dCk7XG5cbiAgICAgIHRoaXMuY29uZmlndXJlTWxmbG93VHJhY2VJZChyZXMpO1xuICAgICAgdGhpcy5sb2cuZGVidWcoXCJhdXRoOm1pZGRsZXdhcmVcIiwge1xuICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgIHBhdGg6IHJlcS5wYXRoLFxuICAgICAgICByZXF1ZXN0SWQ6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfUkVRVUVTVF9JRF9LRVkpLFxuICAgICAgICB0aHJlYWRJZDogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9USFJFQURfSURfS0VZKSxcbiAgICAgICAgcmVzb3VyY2VJZDogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkpLFxuICAgICAgICB1c2VyTmFtZTogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX05BTUVfS0VZKSxcbiAgICAgICAgdXNlckVtYWlsOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfRU1BSUxfS0VZKSxcbiAgICAgICAgbW9kZWxPdmVycmlkZTogcmVxdWVzdENvbnRleHQuZ2V0KFxuICAgICAgICAgIC8vIGltcG9ydGVkIGJlbG93OyBsb2dnZWQgc28gYSBtaXNyb3V0ZWQgcmVxdWVzdCBzaG93c1xuICAgICAgICAgIC8vIHVwIGFsb25nc2lkZSBpdHMgbW9kZWwgc2VsZWN0aW9uIGluIGBMT0dfTEVWRUw9ZGVidWdgLlxuICAgICAgICAgIFwibWFzdHJhX19tb2RlbF9vdmVycmlkZVwiLFxuICAgICAgICApLFxuICAgICAgfSk7XG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFVzZXIocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCkge1xuICAgIC8vIFBhc3MgdGhlIGZvcndhcmRlZCBjYWxsZXIgaWRlbnRpdHkgc28gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIHN0aWxsIGtleXNcbiAgICAvLyBtZW1vcnkgLyBjYWNoZSAvIHRyYWNlcyBwZXIgdXNlciBldmVuIHRob3VnaCB0aGUgY2xpZW50IGlzIHRoZSBhcHAgU1AuXG4gICAgLy8gSW4gYW4gT0JPIGNvbnRleHQgdGhlc2UgYXJlIGlnbm9yZWQgaW4gZmF2b3Igb2YgdGhlIGNvbnRleHQncyBvd24gdXNlci5cbiAgICBhd2FpdCBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcihyZXF1ZXN0Q29udGV4dCwge1xuICAgICAgdXNlcklkOiByZXF1ZXN0VXNlcklkKHJlcSksXG4gICAgICBlbWFpbDogcmVxdWVzdFVzZXJFbWFpbChyZXEpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YW1wIGEgcGVyLXJlcXVlc3QgaWQgYW5kIGVjaG8gaXQgb24gdGhlIHJlc3BvbnNlIHNvIGFuIHVwc3RyZWFtXG4gICAqIHByb3h5IC8gY3VybCBjbGllbnQgLyBicm93c2VyLXNpZGUgbG9nIGxpbmUgY2FuIHBhaXIgaXRzIHZpZXcgb2ZcbiAgICogdGhlIHJlcXVlc3Qgd2l0aCB0aGUgbWF0Y2hpbmcgdHJhY2Ugc3Bhbi4gUmV1c2VzIGBYLVJlcXVlc3QtSWRgXG4gICAqIHdoZW4gdGhlIHVwc3RyZWFtIGFscmVhZHkgc3VwcGxpZXMgb25lIHNvIG11bHRpLWhvcCB0cmFjZXMgc3RheVxuICAgKiBqb2luZWQ7IG90aGVyd2lzZSBtaW50cyBhIFVVSUR2NC5cbiAgICpcbiAgICogVGhlIGlkIGlzIHN1cmZhY2VkIGFzIGBtYXN0cmFfX3JlcXVlc3RJZGAgc3BhbiBtZXRhZGF0YSB2aWFcbiAgICoge0BsaW5rIFRSQUNFX1JFUVVFU1RfQ09OVEVYVF9LRVlTfSBhbmQgYXMgdGhlIGBYLVJlcXVlc3QtSWRgXG4gICAqIHJlc3BvbnNlIGhlYWRlciBzbyBkZXYgdG9vbHMgY2FuIGNvcHkgaXQgZnJvbSBlaXRoZXIgc2lkZS5cbiAgICovXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0UmVxdWVzdElkKFxuICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQsXG4gICkge1xuICAgIGlmIChyZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1JFUVVFU1RfSURfS0VZKSkgcmV0dXJuO1xuICAgIGNvbnN0IGhlYWRlclZhbHVlID0gcmVxLmhlYWRlcnNbXCJ4LXJlcXVlc3QtaWRcIl07XG4gICAgY29uc3QgdXBzdHJlYW0gPSBBcnJheS5pc0FycmF5KGhlYWRlclZhbHVlKSA/IGhlYWRlclZhbHVlWzBdIDogaGVhZGVyVmFsdWU7XG4gICAgY29uc3QgcmVxdWVzdElkID0gdXBzdHJlYW0/LnRyaW0oKSB8fCBoYXNoLmlkKCk7XG4gICAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9SRVFVRVNUX0lEX0tFWSwgcmVxdWVzdElkKTtcbiAgICByZXMuc2V0SGVhZGVyKFwiWC1SZXF1ZXN0LUlkXCIsIHJlcXVlc3RJZCk7XG4gIH1cblxuICAvKipcbiAgICogU3RhbXAgT0F1dGggc2NvcGVzIGZyb20gdGhlIGZvcndhcmRlZCBhY2Nlc3MgdG9rZW4gb25cbiAgICoge0BsaW5rIE1BU1RSQV9TQ09QRVNfS0VZfSBmb3Igd29ya3NwYWNlIG1vdW50IGdhdGluZy5cbiAgICovXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0U2NvcGVzKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpIHtcbiAgICBjb25zdCBzY29wZXMgPSBbXG4gICAgICAuLi5vYmplY3RcbiAgICAgICAgLnNlcXVlbmNlKHRva2VuLmdldEFjY2Vzc1Rva2VuU2NvcGVzKHJlcSksIHRva2VuLmdldEFjY2Vzc1Rva2VuU2NvcGVzKHJlcSwgXCJhdXRob3JpemF0aW9uXCIpKVxuICAgICAgICAuZGlzdGluY3QoKSxcbiAgICBdO1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfU0NPUEVTX0tFWSwgc2NvcGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFtcCB0aGUgdHVybidzIE1MZmxvdyB0cmFjZSBpZCBvbiB0aGUgcmVzcG9uc2Ugc28gdGhlIGNoYXQgY2xpZW50XG4gICAqIGNhbiBhdHRhY2ggdGh1bWJzIC8gY29tbWVudCBmZWVkYmFjayB0byBpdCBsYXRlci4gTUxmbG93IGRlcml2ZXNcbiAgICogaXRzIHRyYWNlIGlkIGZyb20gdGhlIE9wZW5UZWxlbWV0cnkgdHJhY2UgaWQgKGB0ci08aGV4PmApLCBhbmQgZXZlcnlcbiAgICogTWFzdHJhIHNwYW4gZm9yIHRoaXMgcmVxdWVzdCBpbmhlcml0cyB0aGUgYW1iaWVudCBPVGVsIGNvbnRleHQgKHNlZVxuICAgKiBgb2JzZXJ2YWJpbGl0eS50c2ApLCBzbyB0aGUgYWN0aXZlIHNwYW4ncyB0cmFjZSBpZCBoZXJlIGlzIHRoZSBpZFxuICAgKiBNTGZsb3cgd2lsbCByZWNvcmQgZm9yIHRoZSB0dXJuLlxuICAgKlxuICAgKiBOby1vcCB1bmxlc3MgZmVlZGJhY2sgaXMgZW5hYmxlZCwgYW5kIHdoZW4gbm8gbGl2ZSBPVGVsIHNwYW4gaXNcbiAgICogYWN0aXZlIChlLmcuIHRoZSBPVExQIFNESyBpc24ndCByZWdpc3RlcmVkKTogaW4gdGhhdCBjYXNlIHRoZSBoZWFkZXJcbiAgICogaXMgc2ltcGx5IGFic2VudCBhbmQgdGhlIGNsaWVudCBoaWRlcyBmZWVkYmFjayBmb3IgdGhhdCBtZXNzYWdlLFxuICAgKiBkZWdyYWRpbmcgZ3JhY2VmdWxseSByYXRoZXIgdGhhbiBlbWl0dGluZyBhIGJvZ3VzIHRyYWNlIGlkLlxuICAgKi9cbiAgY29uZmlndXJlTWxmbG93VHJhY2VJZChyZXM6IGV4cHJlc3MuUmVzcG9uc2UpIHtcbiAgICBpZiAoIXRoaXMuZmVlZGJhY2tFbmFibGVkIHx8IHJlcy5oZWFkZXJzU2VudCkgcmV0dXJuO1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0cmFjZS5nZXRBY3RpdmVTcGFuKCk/LnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgICBpZiAoIXRyYWNlSWQgfHwgdHJhY2VJZCA9PT0gSU5WQUxJRF9UUkFDRV9JRCkgcmV0dXJuO1xuICAgIHJlcy5zZXRIZWFkZXIoZmVlZGJhY2suTUxGTE9XX1RSQUNFX0lEX0hFQURFUiwgYHRyLSR7dHJhY2VJZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSB0aHJlYWQgaWQgdGhpcyByZXF1ZXN0IHRhcmdldHMgYW5kIHBpbiBpdCBvblxuICAgKiBgUmVxdWVzdENvbnRleHRgIChjb25zdW1lZCBieSB0aGUgYWdlbnQgc3RyZWFtIGZvciBwZXJzaXN0ZW5jZSBhbmRcbiAgICogYnkgdGhlIGhpc3RvcnkgLyB0aHJlYWRzIHJvdXRlcykuIFJlc29sdXRpb24gb3JkZXI6XG4gICAqXG4gICAqICAgMS4gQSBjbGllbnQtc3VwcGxpZWQgdGhyZWFkIGlkICh0aGUgdGhyZWFkLXNlbGVjdGlvbiBoZWFkZXIgL1xuICAgKiAgICAgIGA/dGhyZWFkSWQ9YCBxdWVyeSkuIFRoaXMgaXMgaG93IHRoZSBjaGF0IFVJIHJlZmVyZW5jZXMgYVxuICAgKiAgICAgIHNwZWNpZmljIGNvbnZlcnNhdGlvbiBhbW9uZyB0aGUgbWFueSBhIHVzZXIgb3ducyAtIGl0IHBpY2tzIGFcbiAgICogICAgICB0aHJlYWQgaWQgZnJvbSB0aGUgYC90aHJlYWRzYCBsaXN0aW5nIChvciBtaW50cyBvbmUgZm9yIGEgbmV3XG4gICAqICAgICAgY29udmVyc2F0aW9uKSBhbmQgc3RhbXBzIGl0IGhlcmUuIFRoZSBpZCBpcyBzY29wZWQgdG8gdGhlXG4gICAqICAgICAgY2FsbGVyJ3MgcmVzb3VyY2UgYnkgdGhlIHJlY2FsbCAvIGxpc3Qgcm91dGVzLCBzbyBhIGNsaWVudFxuICAgKiAgICAgIGNhbiBvbmx5IGV2ZXIgcmVhZCBvciB3cml0ZSBpdHMgb3duIHRocmVhZHMuXG4gICAqICAgMi4gVGhlIHBlci1zZXNzaW9uIGNvb2tpZSAoYGFwcGtpdF88cGx1Z2luLW5hbWU+X3Nlc3Npb25faWRgKSxcbiAgICogICAgICBtaW50ZWQgb24gZmlyc3QgY29udGFjdC4gVGhpcyBpcyB0aGUgZGVmYXVsdCBzaW5nbGUtdGhyZWFkXG4gICAqICAgICAgZmFsbGJhY2sgZm9yIGNsaWVudHMgdGhhdCBkb24ndCBtYW5hZ2UgdGhyZWFkcyBleHBsaWNpdGx5LCBzb1xuICAgKiAgICAgIGV4aXN0aW5nIGVtYmVkcyBrZWVwIG9uZSBzdGFibGUgY29udmVyc2F0aW9uIHBlciBzZXNzaW9uIHdpdGhcbiAgICogICAgICBubyBjbGllbnQgY2hhbmdlcy5cbiAgICovXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VGhyZWFkSWQoXG4gICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCxcbiAgKSB7XG4gICAgaWYgKHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVEhSRUFEX0lEX0tFWSkpIHJldHVybjtcbiAgICBjb25zdCByZXF1ZXN0ZWQgPSB0aGlzLnJlYWRSZXF1ZXN0ZWRUaHJlYWRJZChyZXEpO1xuICAgIGlmIChyZXF1ZXN0ZWQpIHtcbiAgICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVEhSRUFEX0lEX0tFWSwgcmVxdWVzdGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29va2llcyA9IGh0dHAucGFyc2VDb29raWVzKHJlcS5oZWFkZXJzLmNvb2tpZSk7XG4gICAgY29uc3QgY29va2llTmFtZSA9IHN0cmluZy50b0lkZW50aWZpZXJXaXRoT3B0aW9ucyhcbiAgICAgIHsgZGVsaW1pdGVyOiBcIl9cIiwgZGlzdGluY3Q6IHRydWUgfSxcbiAgICAgIFwiYXBwa2l0XCIsXG4gICAgICB0aGlzLmNvbmZpZy5uYW1lISxcbiAgICAgIFwic2Vzc2lvbklkXCIsXG4gICAgKTtcbiAgICBsZXQgc2Vzc2lvbklkID0gY29va2llc1tjb29raWVOYW1lXTtcbiAgICBpZiAoIXNlc3Npb25JZCkge1xuICAgICAgc2Vzc2lvbklkID0gaGFzaC5pZCgpO1xuICAgICAgcmVzLmNvb2tpZShjb29raWVOYW1lLCBzZXNzaW9uSWQsIHtcbiAgICAgICAgaHR0cE9ubHk6IHRydWUsXG4gICAgICAgIHNhbWVTaXRlOiBcImxheFwiLFxuICAgICAgICBzZWN1cmU6IHJlcS5zZWN1cmUsXG4gICAgICAgIHBhdGg6IFwiL1wiLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVEhSRUFEX0lEX0tFWSwgc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBjbGllbnQtc2VsZWN0ZWQgdGhyZWFkIGlkIGZyb20gdGhlIHJlcXVlc3QsIHByZWZlcnJpbmdcbiAgICogdGhlIHRocmVhZC1zZWxlY3Rpb24gaGVhZGVyIG92ZXIgdGhlIGA/dGhyZWFkSWQ9YCBxdWVyeS4gUmV0dXJuc1xuICAgKiBgbnVsbGAgd2hlbiBuZWl0aGVyIGNhcnJpZXMgYSBub24tZW1wdHkgdmFsdWUgc28gdGhlIGNhbGxlciBmYWxsc1xuICAgKiBiYWNrIHRvIHRoZSBzZXNzaW9uIGNvb2tpZS5cbiAgICovXG4gIHByaXZhdGUgcmVhZFJlcXVlc3RlZFRocmVhZElkKHJlcTogZXhwcmVzcy5SZXF1ZXN0KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgaGVhZGVyVmFsdWUgPSByZXEuaGVhZGVyc1t0aHJlYWQuVEhSRUFEX0lEX0hFQURFUl07XG4gICAgY29uc3QgcXVlcnlWYWx1ZSA9IHJlcS5xdWVyeVt0aHJlYWQuVEhSRUFEX0lEX1FVRVJZXTtcbiAgICByZXR1cm4gKFxuICAgICAgc3RyaW5nLnRyaW1Ub051bGwoQXJyYXkuaXNBcnJheShoZWFkZXJWYWx1ZSkgPyBoZWFkZXJWYWx1ZVswXSA6IGhlYWRlclZhbHVlKSA/P1xuICAgICAgc3RyaW5nLnRyaW1Ub051bGwoQXJyYXkuaXNBcnJheShxdWVyeVZhbHVlKSA/IHF1ZXJ5VmFsdWVbMF0gOiBxdWVyeVZhbHVlKVxuICAgICk7XG4gIH1cblxuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dE1vZGVsT3ZlcnJpZGUocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCkge1xuICAgIC8vIFBlci1yZXF1ZXN0IG1vZGVsIG92ZXJyaWRlOiBvbmx5IGhvbm9yZWQgd2hlbiB0aGUgcGx1Z2luXG4gICAgLy8gb3B0cyBpbiAoZGVmYXVsdCkuIFNvdXJjZXMsIGluIHByaW9yaXR5IG9yZGVyLCBhcmVcbiAgICAvLyBgWC1NYXN0cmEtTW9kZWxgIGhlYWRlciwgYD9tb2RlbD1gIHF1ZXJ5LCBhbmQgYG1vZGVsYCAvXG4gICAgLy8gYG1vZGVsSWRgIGJvZHkgZmllbGQ7IHNlZSBgc2VydmluZy50c2AuXG4gICAgY29uc3Qgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKHRoaXMuY29uZmlnKTtcbiAgICBpZiAoc2VydmluZy5hbGxvd092ZXJyaWRlKSB7XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGV4dHJhY3RNb2RlbE92ZXJyaWRlKHtcbiAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+LFxuICAgICAgICBxdWVyeTogcmVxLnF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBib2R5OiByZXEuYm9keSxcbiAgICAgIH0pO1xuICAgICAgaWYgKG92ZXJyaWRlKSByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSwgb3ZlcnJpZGUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogSW5wdXRzIGZvciB7QGxpbmsgaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZH0uICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYUFwaUdhdGVPcHRpb25zIHtcbiAgLyoqIGBjb25maWcuYXBpQWNjZXNzYDsgYFwiZnVsbFwiYCBzaG9ydC1jaXJjdWl0cyB0byBhbGxvdyBldmVyeXRoaW5nLiAqL1xuICBhY2Nlc3M6IFwic2NvcGVkXCIgfCBcImZ1bGxcIjtcbiAgLyoqIFdoZXRoZXIgdGhlIE1DUCB0cmFuc3BvcnQgaXMgbW91bnRlZCAoc28gYC9tY3AvKmAgaXMgbGVnaXRpbWF0ZSkuICovXG4gIG1jcEVuYWJsZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogTW91bnQtcmVsYXRpdmUgYWdlbnQgaW5mZXJlbmNlIHBhdGhzIChgL2FnZW50cy86aWQvPHZlcmI+Li4uYCkuIE1hdGNoZWRcbiAqIGJ5IHByZWZpeCBvbiB0aGUgdmVyYiBzbyBmdXR1cmUgdmFyaWFudHMgKGBzdHJlYW1WTmV4dGAsIGBzdHJlYW0vdm5leHRgLFxuICogYGdlbmVyYXRlVk5leHRgKSBzdGF5IGNvdmVyZWQgd2l0aG91dCBhIGNvZGUgY2hhbmdlLlxuICpcbiAqIENvdmVycyB0aGUgcGxhaW4gaW5mZXJlbmNlIHZlcmJzIChgc3RyZWFtYCAvIGBnZW5lcmF0ZWAgLyBgbmV0d29ya2ApIHBsdXNcbiAqIHRoZSBodW1hbi1pbi10aGUtbG9vcCByZXN1bWUgdmVyYnMgYSBwYXVzZWQgYHJlcXVpcmVBcHByb3ZhbGAgdG9vbCBuZWVkc1xuICogdG8gY29udGludWU6IGBhcHByb3ZlLXRvb2wtY2FsbGAgLyBgZGVjbGluZS10b29sLWNhbGxgIChzdHJlYW1pbmcsIGFuZCB2aWFcbiAqIHByZWZpeCB0aGVpciBgLWdlbmVyYXRlYCBub24tc3RyZWFtaW5nIHZhcmlhbnRzKSwgdGhlIGAtbmV0d29yay1gIHZhcmlhbnRzLFxuICogYW5kIGByZXN1bWUtc3RyZWFtYCAoY292ZXJzIGByZXN1bWUtc3RyZWFtLXVudGlsLWlkbGVgKS4gV2l0aG91dCB0aGVzZSBhblxuICogYXBwcm92YWwtZ2F0ZWQgdG9vbCAoZS5nLiBgc2VuZF9lbWFpbGApIGNhbiBiZSByZXF1ZXN0ZWQgYnV0IG5ldmVyIGFwcHJvdmVkXG4gKiBmcm9tIHRoZSBicm93c2VyIC0gdGhlIHJlc3VtZSBgUE9TVGAgNDAzcyB1bmRlciBzY29wZWQgbW9kZS4gVGhlc2UgYXJlIHRoZVxuICogb25seSAqd3JpdGVzKiB0aGUgYnJvd3NlciBjbGllbnQgaXMgYWxsb3dlZCB0byBtYWtlIGFnYWluc3Qgc3RvY2sgTWFzdHJhLlxuICovXG5jb25zdCBBR0VOVF9JTkZFUkVOQ0UgPVxuICAvXlxcL2FnZW50c1xcL1teL10rXFwvKHN0cmVhbXxnZW5lcmF0ZXxuZXR3b3JrfHJlc3VtZS1zdHJlYW18YXBwcm92ZS10b29sLWNhbGx8ZGVjbGluZS10b29sLWNhbGx8YXBwcm92ZS1uZXR3b3JrLXRvb2wtY2FsbHxkZWNsaW5lLW5ldHdvcmstdG9vbC1jYWxsKS9pO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhIChgL2FnZW50c2AsIGAvYWdlbnRzLzppZGApLiAqL1xuY29uc3QgQUdFTlRfTUVUQURBVEEgPSAvXlxcL2FnZW50cyhcXC9bXi9dKyk/JC87XG5cbi8qKlxuICogV2hldGhlciBhIHJlcXVlc3QgdG8gdGhlIHN0b2NrIGBAbWFzdHJhL2V4cHJlc3NgIHN1Yi1hcHAgc2hvdWxkIGJlXG4gKiBkaXNwYXRjaGVkLCBnaXZlbiB0aGUgY29uZmlndXJlZCB7QGxpbmsgTWFzdHJhQXBpR2F0ZU9wdGlvbnMuYWNjZXNzfS5cbiAqXG4gKiBgcGF0aGAgaXMgbW91bnQtcmVsYXRpdmUgKHdoYXQgdGhlIHBsdWdpbidzIGNhdGNoLWFsbCBzZWVzLCBlLmcuXG4gKiBgL2FnZW50cy94L3N0cmVhbWAsIGAvcm91dGUvaGlzdG9yeS94YCwgYC9tY3AvLi4uYCkuIEluIGBcInNjb3BlZFwiYFxuICogbW9kZSB0aGUgYWxsb3dsaXN0IGlzIGRlbGliZXJhdGVseSB0aWdodCAtIHRoZSBjaGF0IGNsaWVudCBvbmx5IGV2ZXJcbiAqIG5lZWRzIGFnZW50IGluZmVyZW5jZSwgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhLCB0aGlzIHBsdWdpbidzIG93blxuICogT0JPL3Jlc291cmNlLXNjb3BlZCBgL3JvdXRlLypgIHJvdXRlcywgYW5kICh3aGVuIGVuYWJsZWQpIE1DUCAtIHNvIHRoZVxuICogd2hvbGUgYWRtaW4gLyBtdXRhdGluZyAvIGJ1bGstZXhwb3J0IHN1cmZhY2UgTWFzdHJhIGFsc28gZXhwb3NlcyBpc1xuICogZGVuaWVkIGJ5IGRlZmF1bHQgcmF0aGVyIHRoYW4gZW51bWVyYXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWQoXG4gIG1ldGhvZDogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIG9wdHM6IE1hc3RyYUFwaUdhdGVPcHRpb25zLFxuKTogYm9vbGVhbiB7XG4gIGlmIChvcHRzLmFjY2VzcyA9PT0gXCJmdWxsXCIpIHJldHVybiB0cnVlO1xuICBjb25zdCBwID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBgLyR7cGF0aH1gO1xuICAvLyBUaGlzIHBsdWdpbidzIG93biBjdXN0b20gcm91dGVzIGFyZSBpbmRpdmlkdWFsbHkgT0JPLSBhbmRcbiAgLy8gcmVzb3VyY2Utc2NvcGVkIChzZWUgaGlzdG9yeS50cyAvIHRocmVhZHMudHMpLCBzbyBldmVyeSBtZXRob2QgaXMgc2FmZS5cbiAgaWYgKHAgPT09IFwiL3JvdXRlXCIgfHwgcC5zdGFydHNXaXRoKFwiL3JvdXRlL1wiKSkgcmV0dXJuIHRydWU7XG4gIGlmIChvcHRzLm1jcEVuYWJsZWQgJiYgKHAgPT09IFwiL21jcFwiIHx8IHAuc3RhcnRzV2l0aChcIi9tY3AvXCIpKSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG0gPSBtZXRob2QudG9VcHBlckNhc2UoKTtcbiAgaWYgKG0gPT09IFwiUE9TVFwiICYmIEFHRU5UX0lORkVSRU5DRS50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiR0VUXCIgJiYgQUdFTlRfTUVUQURBVEEudGVzdChwKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBQYXRjaGVzIGFyb3VuZCBgQG1hc3RyYS9leHByZXNzYCdzIGN1c3RvbS1yb3V0ZSBkaXNwYXRjaGVyIHNvIHRoZVxuICogcGx1Z2luJ3MgY3VzdG9tIEFQSSByb3V0ZXMgKGUuZy4gYGhpc3RvcnlSb3V0ZWApIHdvcmsgd2hlblxuICogYE1hc3RyYVNlcnZlcmAgaXMgaG9zdGVkIG9uIGFuIEV4cHJlc3Mgc3ViYXBwIG1vdW50ZWQgdW5kZXIgYSBwYXJlbnRcbiAqIHBhdGggKGUuZy4gYC9hcGkvbWFzdHJhYCkuXG4gKlxuICogVGhlIGFkYXB0ZXIncyBgcmVnaXN0ZXJDdXN0b21BcGlSb3V0ZXNgIG1hdGNoZXMgYWdhaW5zdCBgcmVxLnBhdGhgXG4gKiAobW91bnQtcmVsYXRpdmUsIGNvcnJlY3QpIGJ1dCBkaXNwYXRjaGVzIHRvIGl0cyBpbnRlcm5hbCBIb25vXG4gKiBtaW5pLWFwcCB1c2luZyBgcmVxLm9yaWdpbmFsVXJsYCwgd2hpY2ggc3RpbGwgY29udGFpbnMgdGhlIHBhcmVudFxuICogbW91bnQgcHJlZml4LiBUaGUgSG9ubyBhcHAgcmVnaXN0ZXJzIHRoZSBsaXRlcmFsIHJvdXRlIHBhdGhzXG4gKiAoZm9yIGV4YW1wbGUgYC9yb3V0ZS9oaXN0b3J5YCksIHNvIHRoZSBhYnNvbHV0ZSBVUkwgbmV2ZXIgbWF0Y2hlc1xuICogdW50aWwgd2Ugb3ZlcndyaXRlIGBvcmlnaW5hbFVybGAgZm9yIGAvcm91dGVgIGFuZCBgL3JvdXRlLypgIHRvIHRoZVxuICogbW91bnQtcmVsYXRpdmUgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFJvdXRlUGF0Y2hNaWRkbGV3YXJlKGFwcDogZXhwcmVzcy5FeHByZXNzKTogdm9pZCB7XG4gIGFwcC51c2UoKHJlcSwgX3JlcywgbmV4dCkgPT4ge1xuICAgIGNvbnN0IGlzQ3VzdG9tUm91dGUgPSByZXEucGF0aCA9PT0gXCIvcm91dGVcIiB8fCByZXEucGF0aC5zdGFydHNXaXRoKFwiL3JvdXRlL1wiKTtcbiAgICBpZiAoIWlzQ3VzdG9tUm91dGUpIHJldHVybiBuZXh0KCk7XG4gICAgcmVxLm9yaWdpbmFsVXJsID0gcmVxLnBhdGg7XG4gICAgbmV4dCgpO1xuICB9KTtcbn1cbiJdfQ==
|
|
379
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsY0FBYyxHQUNmLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLFlBQVksSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUczQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLGVBQWUsRUFDZixvQkFBb0IsR0FHckIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFckQsT0FBTyxFQUNMLG9CQUFvQixFQUNwQix5QkFBeUIsRUFDekIsb0JBQW9CLEdBQ3JCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCOzs7OztHQUtHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLE1BQU0sNEJBQTRCLEdBQUc7SUFDbkMsc0JBQXNCO0lBQ3RCLG9CQUFvQjtJQUNwQixlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLHFC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QUksRUFBRSxDQUFDO1FBQ2xDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztRQUMzQixJQUFJLEVBQUUsQ0FBQztJQUNULENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXhwcmVzcy1sYXllciBwbHVtYmluZyBmb3IgdGhlIE1hc3RyYSBwbHVnaW46IGEgYE1hc3RyYVNlcnZlcmAgdGhhdFxuICogc3RhbXBzIHRoZSBwZXItcmVxdWVzdCBgUmVxdWVzdENvbnRleHRgIGFuZCBhIHNjb3BlZCBuYXRpdmUgQVBJIGdhdGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBoYXNoLCBodHRwLCBsb2csIG9iamVjdCwgc3RyaW5nLCB0b2tlbiB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBmZWVkYmFjaywgdGhyZWFkIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHtcbiAgTUFTVFJBX1JFU09VUkNFX0lEX0tFWSxcbiAgTUFTVFJBX1RIUkVBRF9JRF9LRVksXG4gIFJlcXVlc3RDb250ZXh0LFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgTWFzdHJhU2VydmVyIGFzIEV4cHJlc3NNYXN0cmFTZXJ2ZXIgfSBmcm9tIFwiQG1hc3RyYS9leHByZXNzXCI7XG5pbXBvcnQgeyB0cmFjZSB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9hcGlcIjtcbmltcG9ydCB0eXBlIGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcblxuaW1wb3J0IHtcbiAgYXR0cmlidXRlZFVzZXJJZCxcbiAgTUFTVFJBX1JFUVVFU1RfSURfS0VZLFxuICBNQVNUUkFfU0NPUEVTX0tFWSxcbiAgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLFxuICBNQVNUUkFfVVNFUl9LRVksXG4gIE1BU1RSQV9VU0VSX05BTUVfS0VZLFxuICB0eXBlIE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgdHlwZSBVc2VyLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IHJlcXVlc3RVc2VyRW1haWwsIHJlcXVlc3RVc2VySWQgfSBmcm9tIFwiLi9pZGVudGl0eS50c1wiO1xuaW1wb3J0IHsgcmVzb2x2ZUZlZWRiYWNrRW5hYmxlZCB9IGZyb20gXCIuL21sZmxvdy50c1wiO1xuXG5pbXBvcnQge1xuICBleHRyYWN0TW9kZWxPdmVycmlkZSxcbiAgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSxcbiAgcmVzb2x2ZVNlcnZpbmdDb25maWcsXG59IGZyb20gXCIuL3NlcnZpbmcudHNcIjtcbi8qKlxuICogT3BlblRlbGVtZXRyeSdzIHNlbnRpbmVsIGZvciBcIm5vIHZhbGlkIHRyYWNlXCIgLSAzMiB6ZXJvIGhleCBjaGFycy5cbiAqIGB0cmFjZS5nZXRBY3RpdmVTcGFuKClgIHJldHVybnMgYSBub24tcmVjb3JkaW5nIHNwYW4gd2l0aCB0aGlzIGlkXG4gKiB3aGVuIG5vIFNESyBpcyByZWdpc3RlcmVkLCB3aGljaCBtdXN0IG5ldmVyIGJlIHN1cmZhY2VkIGFzIGEgdHJhY2UgdG9cbiAqIGF0dGFjaCBmZWVkYmFjayB0by5cbiAqL1xuY29uc3QgSU5WQUxJRF9UUkFDRV9JRCA9IFwiMFwiLnJlcGVhdCgzMik7XG5jb25zdCBUUlVTVEVEX1JFUVVFU1RfQ09OVEVYVF9LRVlTID0gW1xuICBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLFxuICBNQVNUUkFfVEhSRUFEX0lEX0tFWSxcbiAgTUFTVFJBX1VTRVJfS0VZLFxuICBNQVNUUkFfVVNFUl9OQU1FX0tFWSxcbiAgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLFxuXSBhcyBjb25zdDtcblxuLyoqIFJlbW92ZSBicm93c2VyLXN1cHBsaWVkIHZhbHVlcyBmb3IgZmllbGRzIG93bmVkIGJ5IHRydXN0ZWQgc2VydmVyIG1pZGRsZXdhcmUuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJUcnVzdGVkUmVxdWVzdENvbnRleHQocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIFRSVVNURURfUkVRVUVTVF9DT05URVhUX0tFWVMpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5kZWxldGVSYXcoa2V5KTtcbiAgfVxufVxuXG4vKipcbiAqIFdobyBhIHR1cm4gaXMgQVRUUklCVVRFRCB0bywgaW5kZXBlbmRlbnQgb2Ygd2hpY2ggRGF0YWJyaWNrcyBjcmVkZW50aWFsIHJ1bnNcbiAqIGl0cyBjYWxscy4gU3VwcGxpZWQgYnkgdGhlIEhUVFAgbWlkZGxld2FyZSBmcm9tIHRoZSBmb3J3YXJkZWQgdXNlciBoZWFkZXJzIHNvXG4gKiB0aGF0IGluIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSAtIHdoZXJlIGV2ZXJ5IHJlcXVlc3Qgc2hhcmVzIHRoZSBhcHAgU1Anc1xuICogY2xpZW50IC0gdGhlIG1lbW9yeSB0aHJlYWQsIHBlci11c2VyIGNhY2hlIG5hbWVzcGFjZSwgYW5kIHRyYWNlIG1ldGFkYXRhXG4gKiBzdGlsbCBrZXkgb2ZmIHRoZSByZWFsIGNhbGxlci4gSWdub3JlZCBpbiBhbiBPQk8gKHVzZXIpIGNvbnRleHQsIHdob3NlIG93blxuICogdXNlciBpZCAvIGVtYWlsIGFyZSBhdXRob3JpdGF0aXZlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJpYnV0ZWRJZGVudGl0eSB7XG4gIC8qKiBGb3J3YXJkZWQgYHgtZm9yd2FyZGVkLXVzZXJgIGlkLCB1c2VkIHdoZW4gdGhlIGNsaWVudCBpcyB0aGUgc2VydmljZSBwcmluY2lwYWwuICovXG4gIHVzZXJJZD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIEZvcndhcmRlZCBgeC1mb3J3YXJkZWQtZW1haWxgLCB1c2VkIGZvciB0cmFjZSBtZXRhZGF0YSB1bmRlciB0aGUgc2VydmljZSBwcmluY2lwYWwuICovXG4gIGVtYWlsPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFN0YW1wIHRoZSBBcHBLaXQgdXNlciAocGx1cyB0aGUgcmVzb3VyY2UgaWQgYW5kIHRyYWNlIG1ldGFkYXRhKSBvbnRvXG4gKiBgcmVxdWVzdENvbnRleHRgLlxuICpcbiAqIFNwbGl0IG91dCBvZiB7QGxpbmsgTWFzdHJhU2VydmVyfSBiZWNhdXNlIHRoZSBIVFRQIG1pZGRsZXdhcmUgaXMgbm90IHRoZSBvbmx5XG4gKiBjYWxsZXIgdGhhdCBuZWVkcyBpdDogYW4gb3V0LW9mLWJhbmQgdHVybiAoYSBUZWFtcyBhY3Rpdml0eSBhcnJpdmluZyBvblxuICogYW5vdGhlciBwbHVnaW4ncyByb3V0ZSwgYSBzY2hlZHVsZWQgam9iKSBkcml2ZXMgYGFnZW50LmdlbmVyYXRlYCBkaXJlY3RseSwgYW5kXG4gKiB3aXRob3V0IHRoaXMgc3RhbXAgZXZlcnkgdXNlci1zY29wZWQgdG9vbCAtIGBhc2tfZ2VuaWVgIGFib3ZlIGFsbCAtIGZhaWxzIHdpdGhcbiAqIFwiaW52b2tlIHRoZSB0b29sIGZyb20gYW4gYWdlbnQgdHVybiBzZXJ2ZWQgYnkgdGhlIG1hc3RyYSBwbHVnaW5cIi4gVGhvc2VcbiAqIGNhbGxlcnMgYnVpbGQgYSBjb250ZXh0IHdpdGgge0BsaW5rIGNyZWF0ZVJlcXVlc3RDb250ZXh0fSBpbnN0ZWFkIG9mIGFcbiAqIHJlcXVlc3QuXG4gKlxuICogVGhlIERhdGFicmlja3MgY3JlZGVudGlhbCBhbHdheXMgY29tZXMgZnJvbSB0aGUgYW1iaWVudCBleGVjdXRpb24gY29udGV4dDtcbiAqIGBhdHRyaWJ1dGVkYCBvbmx5IGNoYW5nZXMgV0hPIHRoZSB0dXJuIGlzIGF0dHJpYnV0ZWQgdG8gd2hlbiB0aGF0IGNvbnRleHQgaXNcbiAqIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCAoc2VlIHtAbGluayBBdHRyaWJ1dGVkSWRlbnRpdHl9KS5cbiAqXG4gKiBJZGVtcG90ZW50OiByZXR1cm5zIGltbWVkaWF0ZWx5IHdoZW4gdGhlIHVzZXIgYW5kIHJlc291cmNlIGlkIGFyZSBhbHJlYWR5XG4gKiBwcmVzZW50LCBzbyB0aGUgbWlkZGxld2FyZSBjYW4gY2FsbCBpdCBvdmVyIGEgY29udGV4dCBhbm90aGVyIGxheWVyIHN0YW1wZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcihcbiAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICBhdHRyaWJ1dGVkOiBBdHRyaWJ1dGVkSWRlbnRpdHkgPSB7fSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoW01BU1RSQV9VU0VSX0tFWSwgTUFTVFJBX1JFU09VUkNFX0lEX0tFWV0uZXZlcnkoKGtleSkgPT4gcmVxdWVzdENvbnRleHQuZ2V0KGtleSkpKSByZXR1cm47XG4gIGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGNvbnN0IGlzVXNlckNvbnRleHQgPSBcImlzVXNlckNvbnRleHRcIiBpbiBleGVjdXRpb25Db250ZXh0O1xuICAvLyBUaGUgRGF0YWJyaWNrcyBDUkVERU5USUFMIGlzIGFsd2F5cyB0aGUgYW1iaWVudCBleGVjdXRpb24gY29udGV4dCdzIGNsaWVudFxuICAvLyAoT0JPIGluIGEgdXNlciBjb250ZXh0LCB0aGUgc2VydmljZSBwcmluY2lwYWwgb3RoZXJ3aXNlKS4gV0hPIHRoZSB0dXJuIGlzXG4gIC8vIGF0dHJpYnV0ZWQgdG8gY2FuIGRpZmZlcjogaW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIGV2ZXJ5IHJlcXVlc3Qgc2hhcmVzXG4gIC8vIHRoZSBTUCBjbGllbnQsIGJ1dCB0aGUgZm9yd2FyZGVkIHVzZXIgaWQgbXVzdCBzdGlsbCBrZXkgdGhlIG1lbW9yeSB0aHJlYWRcbiAgLy8gYW5kIHRoZSBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2Ugc28gdHdvIGNhbGxlcnMgZG9uJ3Qgc2hhcmUgYSBjb252ZXJzYXRpb24uXG4gIGNvbnN0IHVzZXI6IFVzZXIgPSB7XG4gICAgaWQ6IGF0dHJpYnV0ZWRVc2VySWQoZXhlY3V0aW9uQ29udGV4dCwgYXR0cmlidXRlZC51c2VySWQpLFxuICAgIGV4ZWN1dGlvbkNvbnRleHQsXG4gIH07XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVVNFUl9LRVksIHVzZXIpO1xuICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSwgdXNlci5pZCk7XG4gIC8vIEFwcEtpdCdzIGBVc2VyQ29udGV4dGAgc3VyZmFjZXMgZGlzcGxheSBuYW1lIC8gZW1haWwgb25seSBvblxuICAvLyBPQk8gcmVxdWVzdHMuIFNlcnZpY2UtY29udGV4dCBjYWxscyAoYmFja2dyb3VuZCB0YXNrcywgc2VydmVyXG4gIC8vIHN0YXJ0LXVwKSBsZWF2ZSB0aGVzZSB1bmRlZmluZWQgYW5kIHdlIHNraXAgdGhlIHN0YW1wIHNvXG4gIC8vIGRvd25zdHJlYW0gdHJhY2UgbWV0YWRhdGEgc3RheXMgYWJzZW50IHJhdGhlciB0aGFuIGVtcHR5LiBJblxuICAvLyBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgdGhlIGZvcndhcmRlZCBlbWFpbCBzdGlsbCBpZGVudGlmaWVzIHRoZSBjYWxsZXIsXG4gIC8vIHNvIGl0IGlzIHVzZWQgZm9yIHRyYWNlIG1ldGFkYXRhIGV2ZW4gdGhvdWdoIHRoZSBjbGllbnQgaXMgdGhlIFNQLlxuICBsZXQgdXNlck5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IGVtYWlsOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBhdHRyaWJ1dGVkLmVtYWlsO1xuICBpZiAoaXNVc2VyQ29udGV4dCkge1xuICAgIHVzZXJOYW1lID0gZXhlY3V0aW9uQ29udGV4dC51c2VyTmFtZTtcbiAgICBlbWFpbCA9IGV4ZWN1dGlvbkNvbnRleHQudXNlckVtYWlsID8/IGVtYWlsO1xuICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IGF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuY2xpZW50LmN1cnJlbnRVc2VyLm1lKCk7XG4gICAgdXNlck5hbWUgPSBjdXJyZW50VXNlcj8udXNlck5hbWU7XG4gICAgZW1haWwgPSBjdXJyZW50VXNlcj8uZW1haWxzPy5maWx0ZXIoKGVtYWlsKSA9PiBlbWFpbC5wcmltYXJ5KS5maW5kKChlbWFpbCkgPT4gZW1haWwudmFsdWUpXG4gICAgICA/LnZhbHVlIGFzIHN0cmluZztcbiAgfVxuICBpZiAodXNlck5hbWUpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1VTRVJfTkFNRV9LRVksIHVzZXJOYW1lKTtcbiAgfVxuICBpZiAoZW1haWwpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBlbWFpbCk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgYFJlcXVlc3RDb250ZXh0YCBhIE5PTi1IVFRQIGFnZW50IHR1cm4gbmVlZHMuXG4gKlxuICogRXZlcnl0aGluZyBNYXN0cmEncyB0b29scyByZWFkIG9mZiB0aGUgY29udGV4dCBpcyBzdGFtcGVkIHRoZSBzYW1lIHdheSB0aGVcbiAqIHJlcXVlc3QgbWlkZGxld2FyZSBzdGFtcHMgaXQgLSB0aGUgQXBwS2l0IHVzZXIgKHNvIGBhc2tfZ2VuaWVgIGFuZCB0aGUgbW9kZWxcbiAqIHJlc29sdmVyIGNhbiBtaW50IHVzZXItc2NvcGVkIHRva2VucyksIHRoZSBtZW1vcnkgdGhyZWFkIC8gcmVzb3VyY2UgcGFpciwgYW5kXG4gKiBhIHJlcXVlc3QgaWQgc28gdGhlIHR1cm4ncyBzcGFucyBqb2luIHVwIGluIHRyYWNlcy4gVGhlIHJlc3VsdCBpcyBwYXNzZWQgYXNcbiAqIGByZXF1ZXN0Q29udGV4dGAgdG8gYGFnZW50LmdlbmVyYXRlYCAvIGBhZ2VudC5zdHJlYW1gLlxuICpcbiAqIFRoaXMgaXMgd2hhdCBtYWtlcyBhIGNhcmQgdHVybiBhbnN3ZXIgd2l0aCB0aGUgU0FNRSBkYXRhIGEgY2hhdCB0dXJuIGRvZXM6IHRoZVxuICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gZW5kcG9pbnRzIGlzIHByZXNlbnRhdGlvbiwgbm90IGNhcGFiaWxpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0Q29udGV4dChcbiAgb3B0aW9uczogeyB0aHJlYWRJZD86IHN0cmluZzsgcmVzb3VyY2VJZD86IHN0cmluZzsgcmVxdWVzdElkPzogc3RyaW5nIH0gPSB7fSxcbik6IFByb21pc2U8UmVxdWVzdENvbnRleHQ+IHtcbiAgY29uc3QgcmVxdWVzdENvbnRleHQgPSBuZXcgUmVxdWVzdENvbnRleHQoKTtcbiAgYXdhaXQgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXIocmVxdWVzdENvbnRleHQpO1xuICBpZiAob3B0aW9ucy50aHJlYWRJZCkgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9USFJFQURfSURfS0VZLCBvcHRpb25zLnRocmVhZElkKTtcbiAgLy8gU3RhbXBlZCBBRlRFUiB0aGUgdXNlciBzbyBhbiBleHBsaWNpdCByZXNvdXJjZSBpZCAoYSBjaGFubmVsIG1lbWJlciwgc2F5KVxuICAvLyB3aW5zIG92ZXIgdGhlIGFtYmllbnQgaWRlbnRpdHkgYHN0YW1wUmVxdWVzdENvbnRleHRVc2VyYCBkZWZhdWx0ZWQgdG8uXG4gIGlmIChvcHRpb25zLnJlc291cmNlSWQpIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCBvcHRpb25zLnJlc291cmNlSWQpO1xuICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1JFUVVFU1RfSURfS0VZLCBvcHRpb25zLnJlcXVlc3RJZCA/PyBoYXNoLmlkKCkpO1xuICByZXR1cm4gcmVxdWVzdENvbnRleHQ7XG59XG5cbi8qKlxuICogYEBtYXN0cmEvZXhwcmVzc2Agc3ViY2xhc3MgdGhhdCBzdGFtcHMgYFJlcXVlc3RDb250ZXh0YCB3aXRoIHRoZVxuICogQXBwS2l0IHVzZXIsIHJlc291cmNlIGlkLCBhbmQgYSB0aHJlYWQgaWQgYmFja2VkIGJ5IGFuIEhUVFAtb25seVxuICogc2Vzc2lvbiBjb29raWUgKGBhcHBraXRfPHBsdWdpbi1uYW1lPl9zZXNzaW9uX2lkYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXN0cmFTZXJ2ZXIgZXh0ZW5kcyBFeHByZXNzTWFzdHJhU2VydmVyIHtcbiAgcHJpdmF0ZSBsb2c6IGxvZy5Mb2dnZXI7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN0YW1wIHRoZSBNTGZsb3cgdHJhY2UtaWQgaGVhZGVyIG9uIHJlc3BvbnNlcy4gU2hhcmVzIHRoZVxuICAgKiBwbHVnaW4ncyBmZWVkYmFjayBnYXRlIHZpYSB7QGxpbmsgcmVzb2x2ZUZlZWRiYWNrRW5hYmxlZH0uXG4gICAqL1xuICBwcml2YXRlIGZlZWRiYWNrRW5hYmxlZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICAgIC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgRXhwcmVzc01hc3RyYVNlcnZlcj5cbiAgKSB7XG4gICAgc3VwZXIoLi4uYXJncyk7XG4gICAgdGhpcy5sb2cgPSBsb2cubG9nZ2VyKGNvbmZpZyk7XG4gICAgdGhpcy5mZWVkYmFja0VuYWJsZWQgPSByZXNvbHZlRmVlZGJhY2tFbmFibGVkKGNvbmZpZy5mZWVkYmFjayk7XG4gIH1cblxuICBvdmVycmlkZSByZWdpc3RlckF1dGhNaWRkbGV3YXJlKCk6IHZvaWQge1xuICAgIHN1cGVyLnJlZ2lzdGVyQXV0aE1pZGRsZXdhcmUoKTtcbiAgICB0aGlzLmFwcC51c2UoYXN5bmMgKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IHJlcy5sb2NhbHMucmVxdWVzdENvbnRleHQhIGFzIFJlcXVlc3RDb250ZXh0O1xuICAgICAgY2xlYXJUcnVzdGVkUmVxdWVzdENvbnRleHQocmVxdWVzdENvbnRleHQpO1xuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFVzZXIocmVxLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VGhyZWFkSWQocmVxLCByZXMsIHJlcXVlc3RDb250ZXh0KTtcbiAgICAgIHRoaXMuY29uZmlndXJlUmVxdWVzdENvbnRleHRNb2RlbE92ZXJyaWRlKHJlcSwgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFJlcXVlc3RJZChyZXEsIHJlcywgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFNjb3BlcyhyZXEsIHJlcXVlc3RDb250ZXh0KTtcblxuICAgICAgdGhpcy5jb25maWd1cmVNbGZsb3dUcmFjZUlkKHJlcyk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcImF1dGg6bWlkZGxld2FyZVwiLCB7XG4gICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgIHJlcXVlc3RJZDogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVFVRVNUX0lEX0tFWSksXG4gICAgICAgIHRocmVhZElkOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVkpLFxuICAgICAgICByZXNvdXJjZUlkOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSksXG4gICAgICAgIHVzZXJOYW1lOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfTkFNRV9LRVkpLFxuICAgICAgICB1c2VyRW1haWw6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9FTUFJTF9LRVkpLFxuICAgICAgICBtb2RlbE92ZXJyaWRlOiByZXF1ZXN0Q29udGV4dC5nZXQoXG4gICAgICAgICAgLy8gaW1wb3J0ZWQgYmVsb3c7IGxvZ2dlZCBzbyBhIG1pc3JvdXRlZCByZXF1ZXN0IHNob3dzXG4gICAgICAgICAgLy8gdXAgYWxvbmdzaWRlIGl0cyBtb2RlbCBzZWxlY3Rpb24gaW4gYExPR19MRVZFTD1kZWJ1Z2AuXG4gICAgICAgICAgXCJtYXN0cmFfX21vZGVsX292ZXJyaWRlXCIsXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VXNlcihyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KSB7XG4gICAgLy8gUGFzcyB0aGUgZm9yd2FyZGVkIGNhbGxlciBpZGVudGl0eSBzbyBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgc3RpbGwga2V5c1xuICAgIC8vIG1lbW9yeSAvIGNhY2hlIC8gdHJhY2VzIHBlciB1c2VyIGV2ZW4gdGhvdWdoIHRoZSBjbGllbnQgaXMgdGhlIGFwcCBTUC5cbiAgICAvLyBJbiBhbiBPQk8gY29udGV4dCB0aGVzZSBhcmUgaWdub3JlZCBpbiBmYXZvciBvZiB0aGUgY29udGV4dCdzIG93biB1c2VyLlxuICAgIGF3YWl0IHN0YW1wUmVxdWVzdENvbnRleHRVc2VyKHJlcXVlc3RDb250ZXh0LCB7XG4gICAgICB1c2VySWQ6IHJlcXVlc3RVc2VySWQocmVxKSxcbiAgICAgIGVtYWlsOiByZXF1ZXN0VXNlckVtYWlsKHJlcSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3RhbXAgYSBwZXItcmVxdWVzdCBpZCBhbmQgZWNobyBpdCBvbiB0aGUgcmVzcG9uc2Ugc28gYW4gdXBzdHJlYW1cbiAgICogcHJveHkgLyBjdXJsIGNsaWVudCAvIGJyb3dzZXItc2lkZSBsb2cgbGluZSBjYW4gcGFpciBpdHMgdmlldyBvZlxuICAgKiB0aGUgcmVxdWVzdCB3aXRoIHRoZSBtYXRjaGluZyB0cmFjZSBzcGFuLiBSZXVzZXMgYFgtUmVxdWVzdC1JZGBcbiAgICogd2hlbiB0aGUgdXBzdHJlYW0gYWxyZWFkeSBzdXBwbGllcyBvbmUgc28gbXVsdGktaG9wIHRyYWNlcyBzdGF5XG4gICAqIGpvaW5lZDsgb3RoZXJ3aXNlIG1pbnRzIGEgVVVJRHY0LlxuICAgKlxuICAgKiBUaGUgaWQgaXMgc3VyZmFjZWQgYXMgYG1hc3RyYV9fcmVxdWVzdElkYCBzcGFuIG1ldGFkYXRhIHZpYVxuICAgKiB7QGxpbmsgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVN9IGFuZCBhcyB0aGUgYFgtUmVxdWVzdC1JZGBcbiAgICogcmVzcG9uc2UgaGVhZGVyIHNvIGRldiB0b29scyBjYW4gY29weSBpdCBmcm9tIGVpdGhlciBzaWRlLlxuICAgKi9cbiAgY29uZmlndXJlUmVxdWVzdENvbnRleHRSZXF1ZXN0SWQoXG4gICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCxcbiAgKSB7XG4gICAgaWYgKHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfUkVRVUVTVF9JRF9LRVkpKSByZXR1cm47XG4gICAgY29uc3QgaGVhZGVyVmFsdWUgPSByZXEuaGVhZGVyc1tcIngtcmVxdWVzdC1pZFwiXTtcbiAgICBjb25zdCB1cHN0cmVhbSA9IEFycmF5LmlzQXJyYXkoaGVhZGVyVmFsdWUpID8gaGVhZGVyVmFsdWVbMF0gOiBoZWFkZXJWYWx1ZTtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSB1cHN0cmVhbT8udHJpbSgpIHx8IGhhc2guaWQoKTtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1JFUVVFU1RfSURfS0VZLCByZXF1ZXN0SWQpO1xuICAgIHJlcy5zZXRIZWFkZXIoXCJYLVJlcXVlc3QtSWRcIiwgcmVxdWVzdElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFtcCBPQXV0aCBzY29wZXMgZnJvbSB0aGUgZm9yd2FyZGVkIGFjY2VzcyB0b2tlbiBvblxuICAgKiB7QGxpbmsgTUFTVFJBX1NDT1BFU19LRVl9IGZvciB3b3Jrc3BhY2UgbW91bnQgZ2F0aW5nLlxuICAgKi9cbiAgY29uZmlndXJlUmVxdWVzdENvbnRleHRTY29wZXMocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCkge1xuICAgIGNvbnN0IHNjb3BlcyA9IFtcbiAgICAgIC4uLm9iamVjdFxuICAgICAgICAuc2VxdWVuY2UodG9rZW4uZ2V0QWNjZXNzVG9rZW5TY29wZXMocmVxKSwgdG9rZW4uZ2V0QWNjZXNzVG9rZW5TY29wZXMocmVxLCBcImF1dGhvcml6YXRpb25cIikpXG4gICAgICAgIC5kaXN0aW5jdCgpLFxuICAgIF07XG4gICAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9TQ09QRVNfS0VZLCBzY29wZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YW1wIHRoZSB0dXJuJ3MgTUxmbG93IHRyYWNlIGlkIG9uIHRoZSByZXNwb25zZSBzbyB0aGUgY2hhdCBjbGllbnRcbiAgICogY2FuIGF0dGFjaCB0aHVtYnMgLyBjb21tZW50IGZlZWRiYWNrIHRvIGl0IGxhdGVyLiBNTGZsb3cgZGVyaXZlc1xuICAgKiBpdHMgdHJhY2UgaWQgZnJvbSB0aGUgT3BlblRlbGVtZXRyeSB0cmFjZSBpZCAoYHRyLTxoZXg+YCksIGFuZCBldmVyeVxuICAgKiBNYXN0cmEgc3BhbiBmb3IgdGhpcyByZXF1ZXN0IGluaGVyaXRzIHRoZSBhbWJpZW50IE9UZWwgY29udGV4dCAoc2VlXG4gICAqIGBvYnNlcnZhYmlsaXR5LnRzYCksIHNvIHRoZSBhY3RpdmUgc3BhbidzIHRyYWNlIGlkIGhlcmUgaXMgdGhlIGlkXG4gICAqIE1MZmxvdyB3aWxsIHJlY29yZCBmb3IgdGhlIHR1cm4uXG4gICAqXG4gICAqIE5vLW9wIHVubGVzcyBmZWVkYmFjayBpcyBlbmFibGVkLCBhbmQgd2hlbiBubyBsaXZlIE9UZWwgc3BhbiBpc1xuICAgKiBhY3RpdmUgKGUuZy4gdGhlIE9UTFAgU0RLIGlzbid0IHJlZ2lzdGVyZWQpOiBpbiB0aGF0IGNhc2UgdGhlIGhlYWRlclxuICAgKiBpcyBzaW1wbHkgYWJzZW50IGFuZCB0aGUgY2xpZW50IGhpZGVzIGZlZWRiYWNrIGZvciB0aGF0IG1lc3NhZ2UsXG4gICAqIGRlZ3JhZGluZyBncmFjZWZ1bGx5IHJhdGhlciB0aGFuIGVtaXR0aW5nIGEgYm9ndXMgdHJhY2UgaWQuXG4gICAqL1xuICBjb25maWd1cmVNbGZsb3dUcmFjZUlkKHJlczogZXhwcmVzcy5SZXNwb25zZSkge1xuICAgIGlmICghdGhpcy5mZWVkYmFja0VuYWJsZWQgfHwgcmVzLmhlYWRlcnNTZW50KSByZXR1cm47XG4gICAgY29uc3QgdHJhY2VJZCA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKT8uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICAgIGlmICghdHJhY2VJZCB8fCB0cmFjZUlkID09PSBJTlZBTElEX1RSQUNFX0lEKSByZXR1cm47XG4gICAgcmVzLnNldEhlYWRlcihmZWVkYmFjay5NTEZMT1dfVFJBQ0VfSURfSEVBREVSLCBgdHItJHt0cmFjZUlkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIHRocmVhZCBpZCB0aGlzIHJlcXVlc3QgdGFyZ2V0cyBhbmQgcGluIGl0IG9uXG4gICAqIGBSZXF1ZXN0Q29udGV4dGAgKGNvbnN1bWVkIGJ5IHRoZSBhZ2VudCBzdHJlYW0gZm9yIHBlcnNpc3RlbmNlIGFuZFxuICAgKiBieSBuYXRpdmUgbWVtb3J5IHJvdXRlcykuIFJlc29sdXRpb24gb3JkZXI6XG4gICAqXG4gICAqICAgMS4gQSBjbGllbnQtc3VwcGxpZWQgdGhyZWFkIGlkICh0aGUgdGhyZWFkLXNlbGVjdGlvbiBoZWFkZXIgL1xuICAgKiAgICAgIGA/dGhyZWFkSWQ9YCBxdWVyeSkuIFRoaXMgaXMgaG93IHRoZSBjaGF0IFVJIHJlZmVyZW5jZXMgYVxuICAgKiAgICAgIHNwZWNpZmljIGNvbnZlcnNhdGlvbiBhbW9uZyB0aGUgbWFueSBhIHVzZXIgb3ducyAtIGl0IHBpY2tzIGFcbiAgICogICAgICB0aHJlYWQgaWQgZnJvbSB0aGUgYC90aHJlYWRzYCBsaXN0aW5nIChvciBtaW50cyBvbmUgZm9yIGEgbmV3XG4gICAqICAgICAgY29udmVyc2F0aW9uKSBhbmQgc3RhbXBzIGl0IGhlcmUuIFRoZSBpZCBpcyBzY29wZWQgdG8gdGhlXG4gICAqICAgICAgY2FsbGVyJ3MgcmVzb3VyY2UgYnkgdGhlIHJlY2FsbCAvIGxpc3Qgcm91dGVzLCBzbyBhIGNsaWVudFxuICAgKiAgICAgIGNhbiBvbmx5IGV2ZXIgcmVhZCBvciB3cml0ZSBpdHMgb3duIHRocmVhZHMuXG4gICAqICAgMi4gVGhlIHBlci1zZXNzaW9uIGNvb2tpZSAoYGFwcGtpdF88cGx1Z2luLW5hbWU+X3Nlc3Npb25faWRgKSxcbiAgICogICAgICBtaW50ZWQgb24gZmlyc3QgY29udGFjdC4gVGhpcyBpcyB0aGUgZGVmYXVsdCBzaW5nbGUtdGhyZWFkXG4gICAqICAgICAgZmFsbGJhY2sgZm9yIGNsaWVudHMgdGhhdCBkb24ndCBtYW5hZ2UgdGhyZWFkcyBleHBsaWNpdGx5LCBzb1xuICAgKiAgICAgIGV4aXN0aW5nIGVtYmVkcyBrZWVwIG9uZSBzdGFibGUgY29udmVyc2F0aW9uIHBlciBzZXNzaW9uIHdpdGhcbiAgICogICAgICBubyBjbGllbnQgY2hhbmdlcy5cbiAgICovXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VGhyZWFkSWQoXG4gICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCxcbiAgKSB7XG4gICAgaWYgKHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVEhSRUFEX0lEX0tFWSkpIHJldHVybjtcbiAgICBjb25zdCByZXF1ZXN0ZWQgPSB0aGlzLnJlYWRSZXF1ZXN0ZWRUaHJlYWRJZChyZXEpO1xuICAgIGlmIChyZXF1ZXN0ZWQpIHtcbiAgICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVEhSRUFEX0lEX0tFWSwgcmVxdWVzdGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29va2llcyA9IGh0dHAucGFyc2VDb29raWVzKHJlcS5oZWFkZXJzLmNvb2tpZSk7XG4gICAgY29uc3QgY29va2llTmFtZSA9IHN0cmluZy50b0lkZW50aWZpZXJXaXRoT3B0aW9ucyhcbiAgICAgIHsgZGVsaW1pdGVyOiBcIl9cIiwgZGlzdGluY3Q6IHRydWUgfSxcbiAgICAgIFwiYXBwa2l0XCIsXG4gICAgICB0aGlzLmNvbmZpZy5uYW1lISxcbiAgICAgIFwic2Vzc2lvbklkXCIsXG4gICAgKTtcbiAgICBsZXQgc2Vzc2lvbklkID0gY29va2llc1tjb29raWVOYW1lXTtcbiAgICBpZiAoIXNlc3Npb25JZCkge1xuICAgICAgc2Vzc2lvbklkID0gaGFzaC5pZCgpO1xuICAgICAgcmVzLmNvb2tpZShjb29raWVOYW1lLCBzZXNzaW9uSWQsIHtcbiAgICAgICAgaHR0cE9ubHk6IHRydWUsXG4gICAgICAgIHNhbWVTaXRlOiBcImxheFwiLFxuICAgICAgICBzZWN1cmU6IHJlcS5zZWN1cmUsXG4gICAgICAgIHBhdGg6IFwiL1wiLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVEhSRUFEX0lEX0tFWSwgc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBjbGllbnQtc2VsZWN0ZWQgdGhyZWFkIGlkIGZyb20gdGhlIHJlcXVlc3QsIHByZWZlcnJpbmdcbiAgICogdGhlIHRocmVhZC1zZWxlY3Rpb24gaGVhZGVyIG92ZXIgdGhlIGA/dGhyZWFkSWQ9YCBxdWVyeS4gUmV0dXJuc1xuICAgKiBgbnVsbGAgd2hlbiBuZWl0aGVyIGNhcnJpZXMgYSBub24tZW1wdHkgdmFsdWUgc28gdGhlIGNhbGxlciBmYWxsc1xuICAgKiBiYWNrIHRvIHRoZSBzZXNzaW9uIGNvb2tpZS5cbiAgICovXG4gIHByaXZhdGUgcmVhZFJlcXVlc3RlZFRocmVhZElkKHJlcTogZXhwcmVzcy5SZXF1ZXN0KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgaGVhZGVyVmFsdWUgPSByZXEuaGVhZGVyc1t0aHJlYWQuVEhSRUFEX0lEX0hFQURFUl07XG4gICAgY29uc3QgcXVlcnlWYWx1ZSA9IHJlcS5xdWVyeVt0aHJlYWQuVEhSRUFEX0lEX1FVRVJZXTtcbiAgICByZXR1cm4gKFxuICAgICAgc3RyaW5nLnRyaW1Ub051bGwoQXJyYXkuaXNBcnJheShoZWFkZXJWYWx1ZSkgPyBoZWFkZXJWYWx1ZVswXSA6IGhlYWRlclZhbHVlKSA/P1xuICAgICAgc3RyaW5nLnRyaW1Ub051bGwoQXJyYXkuaXNBcnJheShxdWVyeVZhbHVlKSA/IHF1ZXJ5VmFsdWVbMF0gOiBxdWVyeVZhbHVlKVxuICAgICk7XG4gIH1cblxuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dE1vZGVsT3ZlcnJpZGUocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCkge1xuICAgIC8vIFBlci1yZXF1ZXN0IG1vZGVsIG92ZXJyaWRlOiBvbmx5IGhvbm9yZWQgd2hlbiB0aGUgcGx1Z2luXG4gICAgLy8gb3B0cyBpbiAoZGVmYXVsdCkuIFNvdXJjZXMsIGluIHByaW9yaXR5IG9yZGVyLCBhcmVcbiAgICAvLyBgWC1NYXN0cmEtTW9kZWxgIGhlYWRlciwgYD9tb2RlbD1gIHF1ZXJ5LCBhbmQgYG1vZGVsYCAvXG4gICAgLy8gYG1vZGVsSWRgIGJvZHkgZmllbGQ7IHNlZSBgc2VydmluZy50c2AuXG4gICAgY29uc3Qgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKHRoaXMuY29uZmlnKTtcbiAgICBpZiAoc2VydmluZy5hbGxvd092ZXJyaWRlKSB7XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGV4dHJhY3RNb2RlbE92ZXJyaWRlKHtcbiAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+LFxuICAgICAgICBxdWVyeTogcmVxLnF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBib2R5OiByZXEuYm9keSxcbiAgICAgIH0pO1xuICAgICAgaWYgKG92ZXJyaWRlKSByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSwgb3ZlcnJpZGUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogSW5wdXRzIGZvciB7QGxpbmsgaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZH0uICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYUFwaUdhdGVPcHRpb25zIHtcbiAgLyoqIGBjb25maWcuYXBpQWNjZXNzYDsgYFwiZnVsbFwiYCBzaG9ydC1jaXJjdWl0cyB0byBhbGxvdyBldmVyeXRoaW5nLiAqL1xuICBhY2Nlc3M6IFwic2NvcGVkXCIgfCBcImZ1bGxcIjtcbiAgLyoqIFdoZXRoZXIgdGhlIE1DUCB0cmFuc3BvcnQgaXMgbW91bnRlZCAoc28gYC9tY3AvKmAgaXMgbGVnaXRpbWF0ZSkuICovXG4gIG1jcEVuYWJsZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogTW91bnQtcmVsYXRpdmUgYWdlbnQgaW5mZXJlbmNlIHBhdGhzIChgL2FnZW50cy86aWQvPHZlcmI+Li4uYCkuIE1hdGNoZWRcbiAqIGJ5IHByZWZpeCBvbiB0aGUgdmVyYiBzbyBmdXR1cmUgdmFyaWFudHMgKGBzdHJlYW1WTmV4dGAsIGBzdHJlYW0vdm5leHRgLFxuICogYGdlbmVyYXRlVk5leHRgKSBzdGF5IGNvdmVyZWQgd2l0aG91dCBhIGNvZGUgY2hhbmdlLlxuICpcbiAqIENvdmVycyB0aGUgcGxhaW4gaW5mZXJlbmNlIHZlcmJzIChgc3RyZWFtYCAvIGBnZW5lcmF0ZWAgLyBgbmV0d29ya2ApIHBsdXNcbiAqIHRoZSBodW1hbi1pbi10aGUtbG9vcCByZXN1bWUgdmVyYnMgYSBwYXVzZWQgYHJlcXVpcmVBcHByb3ZhbGAgdG9vbCBuZWVkc1xuICogdG8gY29udGludWU6IGBhcHByb3ZlLXRvb2wtY2FsbGAgLyBgZGVjbGluZS10b29sLWNhbGxgIChzdHJlYW1pbmcsIGFuZCB2aWFcbiAqIHByZWZpeCB0aGVpciBgLWdlbmVyYXRlYCBub24tc3RyZWFtaW5nIHZhcmlhbnRzKSwgdGhlIGAtbmV0d29yay1gIHZhcmlhbnRzLFxuICogYW5kIGByZXN1bWUtc3RyZWFtYCAoY292ZXJzIGByZXN1bWUtc3RyZWFtLXVudGlsLWlkbGVgKS4gV2l0aG91dCB0aGVzZSBhblxuICogYXBwcm92YWwtZ2F0ZWQgdG9vbCAoZS5nLiBgc2VuZF9lbWFpbGApIGNhbiBiZSByZXF1ZXN0ZWQgYnV0IG5ldmVyIGFwcHJvdmVkXG4gKiBmcm9tIHRoZSBicm93c2VyIC0gdGhlIHJlc3VtZSBgUE9TVGAgNDAzcyB1bmRlciBzY29wZWQgbW9kZS4gVG9nZXRoZXIgd2l0aFxuICogdGhlIHJlc291cmNlLXNjb3BlZCBtZW1vcnkgbXV0YXRpb25zIGJlbG93LCB0aGVzZSBhcmUgdGhlIG9ubHkgc3RvY2sgTWFzdHJhXG4gKiB3cml0ZXMgdGhlIGJyb3dzZXIgY2xpZW50IGNhbiBtYWtlLlxuICovXG5jb25zdCBBR0VOVF9JTkZFUkVOQ0UgPVxuICAvXlxcL2FnZW50c1xcL1teL10rXFwvKHN0cmVhbXxnZW5lcmF0ZXxuZXR3b3JrfHJlc3VtZS1zdHJlYW18YXBwcm92ZS10b29sLWNhbGx8ZGVjbGluZS10b29sLWNhbGx8YXBwcm92ZS1uZXR3b3JrLXRvb2wtY2FsbHxkZWNsaW5lLW5ldHdvcmstdG9vbC1jYWxsKS9pO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhIChgL2FnZW50c2AsIGAvYWdlbnRzLzppZGApLiAqL1xuY29uc3QgQUdFTlRfTUVUQURBVEEgPSAvXlxcL2FnZW50cyhcXC9bXi9dKyk/JC87XG4vKiogUGVyc2lzdGVkIGFwcHJvdmFsIGRpc2NvdmVyeSBmb3Igb25lIGFnZW50LiAqL1xuY29uc3QgQUdFTlRfU1VTUEVOREVEX1JVTlMgPSAvXlxcL2FnZW50c1xcL1teL10rXFwvc3VzcGVuZGVkLXJ1bnMkL2k7XG4vKiogT2ZmaWNpYWwgQUkgU0RLIFVJIHN0cmVhbSByb3V0ZSwgaW5jbHVkaW5nIGByZXN1bWVEYXRhYCBjb250aW51YXRpb25zLiAqL1xuY29uc3QgQUdFTlRfQ0hBVCA9IC9eXFwvY2hhdFxcL1teL10rJC9pO1xuLyoqIE5hdGl2ZSByZXNvdXJjZS1zY29wZWQgbWVtb3J5IHJlYWRzIHVzZWQgYnkgaGlzdG9yeSBhbmQgdGhlIHRocmVhZCBsaXN0LiAqL1xuY29uc3QgTUVNT1JZX1JFQUQgPSAvXlxcL21lbW9yeVxcL3RocmVhZHMoPzpcXC9bXi9dKyg/OlxcL21lc3NhZ2VzKT8pPyQvaTtcbi8qKiBOYXRpdmUgdGhyZWFkIHJlbmFtZS9kZWxldGUgcm91dGVzLiAqL1xuY29uc3QgTUVNT1JZX1RIUkVBRF9NVVRBVElPTiA9IC9eXFwvbWVtb3J5XFwvdGhyZWFkc1xcL1teL10rJC9pO1xuXG4vKipcbiAqIFdoZXRoZXIgYSByZXF1ZXN0IHRvIHRoZSBzdG9jayBgQG1hc3RyYS9leHByZXNzYCBzdWItYXBwIHNob3VsZCBiZVxuICogZGlzcGF0Y2hlZCwgZ2l2ZW4gdGhlIGNvbmZpZ3VyZWQge0BsaW5rIE1hc3RyYUFwaUdhdGVPcHRpb25zLmFjY2Vzc30uXG4gKlxuICogYHBhdGhgIGlzIG1vdW50LXJlbGF0aXZlICh3aGF0IHRoZSBwbHVnaW4ncyBjYXRjaC1hbGwgc2VlcywgZS5nLlxuICogYC9jaGF0L3hgLCBgL21lbW9yeS90aHJlYWRzYCwgYC9tY3AvLi4uYCkuIEluIGBcInNjb3BlZFwiYFxuICogbW9kZSB0aGUgYWxsb3dsaXN0IGlzIGRlbGliZXJhdGVseSB0aWdodCAtIHRoZSBjaGF0IGNsaWVudCBvbmx5IGV2ZXJcbiAqIG5lZWRzIGFnZW50IGluZmVyZW5jZSwgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhLCByZXNvdXJjZS1zY29wZWQgbWVtb3J5LFxuICogdGhpcyBwbHVnaW4ncyBvd24gYC9yb3V0ZS8qYCByb3V0ZXMsIGFuZCAod2hlbiBlbmFibGVkKSBNQ1AuIFRoZSByZW1haW5pbmdcbiAqIGFkbWluLCBtdXRhdGluZywgYW5kIGJ1bGstZXhwb3J0IHN1cmZhY2Ugc3RheXMgZGVuaWVkIGJ5IGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01hc3RyYVJlcXVlc3RBbGxvd2VkKFxuICBtZXRob2Q6IHN0cmluZyxcbiAgcGF0aDogc3RyaW5nLFxuICBvcHRzOiBNYXN0cmFBcGlHYXRlT3B0aW9ucyxcbik6IGJvb2xlYW4ge1xuICBpZiAob3B0cy5hY2Nlc3MgPT09IFwiZnVsbFwiKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgcCA9IHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogYC8ke3BhdGh9YDtcbiAgLy8gVGhlIHBsdWdpbidzIGAvcm91dGUvKmAgYWRkaXRpb25zIHZhbGlkYXRlIHRoZWlyIG93biBpbnB1dHMgYW5kIHRydXN0ZWRcbiAgLy8gQXBwS2l0IHJlcXVlc3QgY29udGV4dCBiZWZvcmUgcmVhY2hpbmcgcHJvZHVjdCBiZWhhdmlvci5cbiAgaWYgKHAgPT09IFwiL3JvdXRlXCIgfHwgcC5zdGFydHNXaXRoKFwiL3JvdXRlL1wiKSkgcmV0dXJuIHRydWU7XG4gIGlmIChvcHRzLm1jcEVuYWJsZWQgJiYgKHAgPT09IFwiL21jcFwiIHx8IHAuc3RhcnRzV2l0aChcIi9tY3AvXCIpKSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG0gPSBtZXRob2QudG9VcHBlckNhc2UoKTtcbiAgaWYgKG0gPT09IFwiUE9TVFwiICYmIEFHRU5UX0NIQVQudGVzdChwKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtID09PSBcIlBPU1RcIiAmJiBBR0VOVF9JTkZFUkVOQ0UudGVzdChwKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtID09PSBcIkdFVFwiICYmIChBR0VOVF9NRVRBREFUQS50ZXN0KHApIHx8IEFHRU5UX1NVU1BFTkRFRF9SVU5TLnRlc3QocCkpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiR0VUXCIgJiYgTUVNT1JZX1JFQUQudGVzdChwKSkgcmV0dXJuIHRydWU7XG4gIGlmICgobSA9PT0gXCJQQVRDSFwiIHx8IG0gPT09IFwiREVMRVRFXCIpICYmIE1FTU9SWV9USFJFQURfTVVUQVRJT04udGVzdChwKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtID09PSBcIlBPU1RcIiAmJiBwID09PSBcIi9tZW1vcnkvbWVzc2FnZXMvZGVsZXRlXCIpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogS2VlcCBNYXN0cmEgY3VzdG9tIEFQSSByb3V0ZXMgbW91bnQtcmVsYXRpdmUgd2hlbiB0aGUgRXhwcmVzcyBzdWJhcHAgaXNcbiAqIGhvc3RlZCB1bmRlciBBcHBLaXQncyBgL2FwaS88cGx1Z2luPmAgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFJvdXRlUGF0Y2hNaWRkbGV3YXJlKGFwcDogZXhwcmVzcy5FeHByZXNzKTogdm9pZCB7XG4gIGFwcC51c2UoKHJlcSwgX3JlcywgbmV4dCkgPT4ge1xuICAgIGNvbnN0IGlzQ3VzdG9tUm91dGUgPVxuICAgICAgcmVxLnBhdGggPT09IFwiL2NoYXRcIiB8fFxuICAgICAgcmVxLnBhdGguc3RhcnRzV2l0aChcIi9jaGF0L1wiKSB8fFxuICAgICAgcmVxLnBhdGggPT09IFwiL3JvdXRlXCIgfHxcbiAgICAgIHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvcm91dGUvXCIpO1xuICAgIGlmICghaXNDdXN0b21Sb3V0ZSkgcmV0dXJuIG5leHQoKTtcbiAgICByZXEub3JpZ2luYWxVcmwgPSByZXEucGF0aDtcbiAgICBuZXh0KCk7XG4gIH0pO1xufVxuIl19
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* Outbound ({@link rewriteServingBody}), because the transcript Mastra
|
|
6
6
|
* persists is not always a transcript the provider will accept back:
|
|
7
7
|
* Databricks-hosted Claude rejects replayed extended-thinking blocks and reads
|
|
8
|
-
* a trailing assistant message as a prefill request, while GPT
|
|
9
|
-
*
|
|
8
|
+
* a trailing assistant message as a prefill request, while GPT tool calls need
|
|
9
|
+
* model-specific reasoning-effort normalization on Chat Completions.
|
|
10
10
|
*
|
|
11
11
|
* Inbound ({@link rewriteServingResponseBody} and
|
|
12
12
|
* {@link rewriteServingResponseStream}), because Databricks-hosted Gemini and
|
|
@@ -51,10 +51,13 @@ export interface RewrittenServingRequest {
|
|
|
51
51
|
*/
|
|
52
52
|
export declare function rewriteServingRequest(input: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]): Promise<RewrittenServingRequest>;
|
|
53
53
|
/**
|
|
54
|
-
*
|
|
55
|
-
*
|
|
54
|
+
* Normalize Chat Completions reasoning for GPT models carrying function tools.
|
|
55
|
+
*
|
|
56
|
+
* GPT 5.6 requires reasoning disabled for tool calls on this route, so `none`
|
|
57
|
+
* wins over a caller/default effort. Responses-only models are routed away
|
|
58
|
+
* from Chat Completions before this sanitizer runs.
|
|
56
59
|
*/
|
|
57
|
-
export declare function
|
|
60
|
+
export declare function applyToolReasoningCompatibility(body: Record<string, unknown>): boolean;
|
|
58
61
|
/**
|
|
59
62
|
* Drop extended-thinking / reasoning blocks from a replayed transcript.
|
|
60
63
|
*
|