@dbx-tools/appkit-mastra 0.9.119 → 0.9.120
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 +39 -32
- package/index.ts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/src/agents.js +3 -4
- package/lib/src/chart.js +4 -4
- package/lib/src/chat.js +2 -2
- package/lib/src/config.d.ts +6 -4
- package/lib/src/config.js +3 -3
- package/lib/src/genie.d.ts +3 -1
- package/lib/src/genie.js +11 -7
- package/lib/src/memory.d.ts +2 -22
- package/lib/src/memory.js +2 -32
- package/lib/src/mlflow.d.ts +3 -10
- package/lib/src/mlflow.js +6 -6
- package/lib/src/monty-sandbox.js +2 -2
- package/lib/src/plugin.d.ts +2 -19
- package/lib/src/plugin.js +13 -71
- package/lib/src/remote-skills.js +12 -6
- package/lib/src/server.js +2 -2
- package/lib/src/workspaces.js +6 -6
- package/lib/src/writer.js +2 -2
- package/package.json +16 -16
- package/src/agents.ts +2 -3
- package/src/chart.ts +3 -3
- package/src/chat.ts +1 -1
- package/src/config.ts +8 -6
- package/src/genie.ts +9 -6
- package/src/memory.ts +2 -32
- package/src/mlflow.ts +7 -15
- package/src/monty-sandbox.ts +1 -1
- package/src/plugin.ts +14 -69
- package/src/remote-skills.ts +11 -5
- package/src/server.ts +1 -1
- package/src/workspaces.ts +5 -5
- package/src/writer.ts +1 -1
package/lib/src/genie.js
CHANGED
|
@@ -165,7 +165,7 @@ async function readCachedConversationId(cacheKey) {
|
|
|
165
165
|
}
|
|
166
166
|
catch (err) {
|
|
167
167
|
logger.warn("conversation-cache:read-error", {
|
|
168
|
-
error: errorUtils.
|
|
168
|
+
error: errorUtils.toError(err),
|
|
169
169
|
});
|
|
170
170
|
return undefined;
|
|
171
171
|
}
|
|
@@ -187,7 +187,7 @@ async function saveCachedConversationId(cacheKey, conversationId) {
|
|
|
187
187
|
}
|
|
188
188
|
catch (err) {
|
|
189
189
|
logger.warn("conversation-cache:write-error", {
|
|
190
|
-
error: errorUtils.
|
|
190
|
+
error: errorUtils.toError(err),
|
|
191
191
|
});
|
|
192
192
|
}
|
|
193
193
|
}
|
|
@@ -200,7 +200,7 @@ async function evictCachedConversationId(cacheKey) {
|
|
|
200
200
|
}
|
|
201
201
|
catch (err) {
|
|
202
202
|
logger.warn("conversation-cache:delete-error", {
|
|
203
|
-
error: errorUtils.
|
|
203
|
+
error: errorUtils.toError(err),
|
|
204
204
|
});
|
|
205
205
|
}
|
|
206
206
|
}
|
|
@@ -408,7 +408,7 @@ function buildAskGenieTool(opts) {
|
|
|
408
408
|
logger.warn("conversation-cache:stale, resetting", {
|
|
409
409
|
spaceId,
|
|
410
410
|
conversationId: rejectedConversationId,
|
|
411
|
-
error: errorUtils.
|
|
411
|
+
error: errorUtils.toError(err),
|
|
412
412
|
});
|
|
413
413
|
if (ownsReusableConversation) {
|
|
414
414
|
await evictCachedConversationId(cacheKey);
|
|
@@ -955,7 +955,9 @@ async function writeSuggestionCache(spaceId, questions) {
|
|
|
955
955
|
* questions and a multi-space app round-trips breadth-first up to the
|
|
956
956
|
* cap. A per-space fetch failure degrades to "no questions for that
|
|
957
957
|
* space" (logged, not thrown) so one unreachable space never blanks
|
|
958
|
-
* the whole list.
|
|
958
|
+
* the whole list. When `signal` aborts (the HTTP caller disconnected),
|
|
959
|
+
* collection stops silently and returns what was merged so far.
|
|
960
|
+
* Returns `[]` when no spaces are configured.
|
|
959
961
|
*/
|
|
960
962
|
export async function collectSpaceSuggestions(opts) {
|
|
961
963
|
const limit = opts.limit ?? SUGGESTION_LIMIT;
|
|
@@ -973,9 +975,11 @@ export async function collectSpaceSuggestions(opts) {
|
|
|
973
975
|
await writeSuggestionCache(spaceId, questions);
|
|
974
976
|
}
|
|
975
977
|
catch (err) {
|
|
978
|
+
if (opts.signal?.aborted)
|
|
979
|
+
return merged;
|
|
976
980
|
logger.warn("suggestions:fetch-error", {
|
|
977
981
|
spaceId,
|
|
978
|
-
error: errorUtils.
|
|
982
|
+
error: errorUtils.toError(err),
|
|
979
983
|
});
|
|
980
984
|
questions = [];
|
|
981
985
|
}
|
|
@@ -991,4 +995,4 @@ export async function collectSpaceSuggestions(opts) {
|
|
|
991
995
|
}
|
|
992
996
|
return merged;
|
|
993
997
|
}
|
|
994
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuaWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuaWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DRztBQUVILE9BQU8sRUFDTCxZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxLQUFLLEVBQ0wsZUFBZSxHQUNoQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLElBQUksVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFVBQVUsRUFBcUIsTUFBTSx5QkFBeUIsQ0FBQztBQUd4RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsVUFBVSxFQUE2QixNQUFNLG9CQUFvQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFHeEIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1RixPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU5RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFaEQsTUFBTSxNQUFNLEdB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RCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFO29CQUNyQyxPQUFPO29CQUNQLEtBQUssRUFBRSxVQUFVLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztpQkFDcEMsQ0FBQyxDQUFDO2dCQUNILFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDakIsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7Z0JBQUUsU0FBUztZQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEIsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLEtBQUs7Z0JBQUUsT0FBTyxNQUFNLENBQUM7UUFDNUMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5pZSB0b29scyBmb3IgTWFzdHJhLlxuICpcbiAqIFN1cmZhY2VzIGVhY2ggY29uZmlndXJlZCBHZW5pZSBzcGFjZSBhcyBhIHNtYWxsIHNldCBvZiBmbGF0IE1hc3RyYVxuICogdG9vbHMgdGhlIGNhbGxpbmcgYWdlbnQgZHJpdmVzIGRpcmVjdGx5IC0gbm8gaW5uZXIgb3JjaGVzdHJhdG9yXG4gKiBhZ2VudC4gVGhlIGNlbnRyYWwgYWdlbnQgZGVjb21wb3NlcyB1c2VyIHF1ZXN0aW9ucywgcGlja3Mgd2hpY2hcbiAqIHNwYWNlIHRvIGFzaywgc3RyZWFtcyB0aGUgcGVyLXR1cm4gd2lyZSBldmVudHMgKHN0YXR1cywgdGhpbmtpbmcsXG4gKiBzcWwsIHJvd3MpIHRocm91Z2ggYGN0eC53cml0ZXJgLCBhbmQgY29tcG9zZXMgdGhlIGZpbmFsIHJlcGx5LlxuICogUm93cyBhcmUgbmV2ZXIgZmV0Y2hlZCBlYWdlcmx5OiB0aGUgYWdlbnQgcmVhZHMgYSBzdGF0ZW1lbnQnc1xuICogdmFsdWVzIG9ubHkgd2hlbiBpdCBuZWVkcyB0byByZWFzb24gYWJvdXQgdGhlbSwgb3RoZXJ3aXNlIGl0IGVtYmVkc1xuICogYSBgW2RhdGE6PHN0YXRlbWVudF9pZD5dYCBtYXJrZXIgaW4gcHJvc2UgYW5kIGxldHMgdGhlIGhvc3QgVUlcbiAqIHJlc29sdmUgdGhlIGRhdGEuIENoYXJ0cyBhcmUgbWludGVkIGFzeW5jaHJvbm91c2x5IGFuZCByZWZlcmVuY2VkXG4gKiBieSBgW2NoYXJ0OjxjaGFydElkPl1gIG1hcmtlcnMgc28gcHJvc2UgaXNuJ3QgYmxvY2tlZCBvbiBjaGFydFxuICogZ2VuZXJhdGlvbjsgdGhlIGhvc3QgVUkgZmV0Y2hlcyB0aGUgY2FjaGVkIHNwZWMgYnkgaWQgb25jZSByZWFkeS5cbiAqIFNwYWNlIGRlc2NyaXB0aW9uIGFuZCBzZXJpYWxpemVkLXNwYWNlIGxvb2t1cHMgYXJlIGF2YWlsYWJsZSBmb3JcbiAqIGdyb3VuZGluZyB3aGVuIHRoZSBhZ2VudCBuZWVkcyBzY2hlbWEgY29udGV4dC5cbiAqXG4gKiBFYWNoIHRvb2wncyBgZXhlY3V0ZWAgcHVsbHMgdGhlIHBlci1yZXF1ZXN0XG4gKiB7QGxpbmsgV29ya3NwYWNlQ2xpZW50fSBvZmYgYGN0eC5yZXF1ZXN0Q29udGV4dGAgKHN0YW1wZWQgYnlcbiAqIGBNYXN0cmFTZXJ2ZXJgIHVuZGVyIHtAbGluayBNQVNUUkFfVVNFUl9LRVl9KSBhbmQgdGhlIHBlci1jYWxsXG4gKiBgd3JpdGVyYCAvIGBhYm9ydFNpZ25hbGAgb2ZmIGBjdHhgLCBzbyB0aGUgdG9vbHMgYXJlIHN0YXRlbGVzc1xuICogYWNyb3NzIHJlcXVlc3RzIGFuZCB0aGUgY2VudHJhbCBhZ2VudCBvd25zIHRoZSBsb29wLlxuICpcbiAqIFRoZSB0b29scyB0YWxrIHRvIEdlbmllIGRpcmVjdGx5IHZpYSBgQGRieC10b29scy9nZW5pZWBcbiAqIChgZ2VuaWVFdmVudENoYXRgKTsgc3RhdGVtZW50LXJvdyBmZXRjaGluZyBpcyBkZWxlZ2F0ZWQgdG9cbiAqIHtAbGluayBmZXRjaFN0YXRlbWVudERhdGF9IGZyb20gYC4vc3RhdGVtZW50LmpzYCwgd2hpY2ggd3JhcHNcbiAqIHRoZSB3b3Jrc3BhY2UgYHN0YXRlbWVudEV4ZWN1dGlvbi5nZXRTdGF0ZW1lbnRgIEFQSS4gQXBwS2l0J3NcbiAqIHN0b2NrIGBnZW5pZWAgcGx1Z2luIGlzIGhvbm9yZWQgb25seSBmb3IgaXRzIGBzcGFjZXNgIGNvbmZpZ1xuICogc28gZXhpc3RpbmcgQXBwS2l0LXN0eWxlIHdpcmluZyBrZWVwcyB3b3JraW5nIHdpdGhvdXQgY2hhbmdlLlxuICpcbiAqIFN1Z2dlc3RlZCBvcmNoZXN0cmF0aW9uIHByb21wdCBmb3IgdGhlIGNlbnRyYWwgYWdlbnQgbGl2ZXMgaW5cbiAqIHtAbGluayBHRU5JRV9JTlNUUlVDVElPTlN9OyBjb21wb3NlIGl0IGludG8gdGhlIGFnZW50J3Mgb3duXG4gKiBgaW5zdHJ1Y3Rpb25zYCB3aGVuIHlvdSB3YW50IHRoZSBjYW5vbmljYWwgXCJob3cgdG8gZHJpdmUgdGhlXG4gKiBHZW5pZSB0b29sc1wiIGd1aWRhbmNlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBDYWNoZU1hbmFnZXIsXG4gIENvbmZpZ3VyYXRpb25FcnJvcixcbiAgRXhlY3V0aW9uRXJyb3IsXG4gIGdlbmllLFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgcGx1Z2luUmVnaXN0cnkgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGNyZWF0ZUNhY2hlIH0gZnJvbSBcIkBkYngtdG9vbHMvY2FjaGUvY2FjaGVcIjtcbmltcG9ydCB7IGNoYXQsIHNwYWNlIGFzIGdlbmllU3BhY2UgfSBmcm9tIFwiQGRieC10b29scy9nZW5pZVwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nLCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBnZW5pZU1vZGVsLCB0eXBlIEdlbmllTWVzc2FnZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1nZW5pZVwiO1xuaW1wb3J0IHR5cGUgeyBTdGFydGVkRXZlbnQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7IE1BU1RSQV9USFJFQURfSURfS0VZIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7IGNyZWF0ZVRvb2wsIHR5cGUgVG9vbEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgdHlwZSB7IE1hc3RyYVRvb2xzIH0gZnJvbSBcIi4vYWdlbnRzLnRzXCI7XG5pbXBvcnQgeyBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hLCBjaGFydFRvb2xPdXRwdXRTY2hlbWEsIHByZXBhcmVDaGFydCB9IGZyb20gXCIuL2NoYXJ0LnRzXCI7XG5pbXBvcnQgeyBNQVNUUkFfVVNFUl9LRVksIHJlc29sdmVVc2VyS2V5IH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1hc3RyYVBsdWdpbkNvbmZpZywgVXNlciB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgZmV0Y2hTdGF0ZW1lbnREYXRhIH0gZnJvbSBcIi4vc3RhdGVtZW50LnRzXCI7XG5pbXBvcnQgeyByZWNvcmRBY3RpdmVUcmFjZUF1dGgsIHN0YW1wR2VuaWVUb29sU3BhbiB9IGZyb20gXCIuL3RlbGVtZXRyeS50c1wiO1xuaW1wb3J0IHsgc2FmZVdyaXRlUHJvZ3Jlc3MgfSBmcm9tIFwiLi93cml0ZXIudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9nZW5pZVwiKTtcblxuLyoqIERlZmF1bHQgYWxpYXMgdXNlZCB3aGVuIGEgc2luZ2xlIHVubmFtZWQgR2VuaWUgc3BhY2UgaXMgd2lyZWQgdXAuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9HRU5JRV9BTElBUyA9IFwiZGVmYXVsdFwiO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29uZmlnIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogUGVyLXNwYWNlIEdlbmllIGFnZW50IGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmllU3BhY2VDb25maWcge1xuICAvKiogR2VuaWUgYHNwYWNlX2lkYC4gUmVxdWlyZWQ7IHJlc29sdmVzIHZpYSBgY2xpZW50LmdlbmllLmdldFNwYWNlYC4gKi9cbiAgc3BhY2VJZDogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gYXBwZW5kZWQgdG8gdGhlIHBlci1zcGFjZVxuICAgKiB0b29sIGRlc2NyaXB0aW9ucyBzbyB0aGUgY2FsbGluZyBMTE0gaGFzIGhpbnRzIGFib3V0ICp3aGF0XG4gICAqIGRhdGEqIHRoaXMgc3BhY2UgY292ZXJzIChlLmcuIFwib3JkZXJzLCByZXR1cm5zLFxuICAgKiBmdWxmaWxsbWVudFwiKS4gV2hlbiBvbWl0dGVkLCBvbmx5IHRoZSBzcGFjZSdzIG93blxuICAgKiBgZGVzY3JpcHRpb25gIChmZXRjaGVkIG9uIGZpcnN0IHVzZSBvZiBgZ2V0X3NwYWNlX2Rlc2NyaXB0aW9uYClcbiAgICogaXMgc2hvd24uXG4gICAqL1xuICBoaW50Pzogc3RyaW5nO1xufVxuXG4vKiogTWFwIG9mIGFsaWFzIC0+IHNwYWNlIGNvbmZpZy4gQWNjZXB0cyBlaXRoZXIgZXhwbGljaXQgb2JqZWN0cyBvciBiYXJlIHNwYWNlIGlkcy4gKi9cbmV4cG9ydCB0eXBlIEdlbmllU3BhY2VzQ29uZmlnID0gUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZyB8IHN0cmluZz47XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY3R4IGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE5hcnJvdyB2aWV3IG9mIHRoZSBzZWNvbmQgYXJnIE1hc3RyYSBwYXNzZXMgdG8gYSB0b29sJ3NcbiAqIGBleGVjdXRlKGlucHV0LCBjdHgpYC4gQ2FwdHVyZXMgdGhlIGZpZWxkcyB0aGUgR2VuaWUgdG9vbHNcbiAqIGFjdHVhbGx5IHJlYWQgLSBgcmVxdWVzdENvbnRleHRgIChmb3IgdXNlciAvIGNvbnZlcnNhdGlvblxuICogc3RhdGUpLCBgd3JpdGVyYCAoZm9yIHN0cmVhbWluZyBldmVudHMgdG8gdGhlIGhvc3QgVUkpLCBhbmRcbiAqIGBhYm9ydFNpZ25hbGAgKGZvciBwZXItY2FsbCBjYW5jZWxsYXRpb24pLlxuICovXG50eXBlIFRvb2xFeGVjdXRlQ3R4ID1cbiAgUGljazxUb29sRXhlY3V0aW9uQ29udGV4dCwgXCJyZXF1ZXN0Q29udGV4dFwiIHwgXCJ3cml0ZXJcIiB8IFwiYWJvcnRTaWduYWxcIiB8IFwiYWdlbnRcIj4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUHVsbCB0aGUgcGVyLXJlcXVlc3Qge0BsaW5rIFdvcmtzcGFjZUNsaWVudH0gb2ZmIHRoZSBhY3RpdmVcbiAqIGBSZXF1ZXN0Q29udGV4dGAuIFRoZSBNYXN0cmEgcGx1Z2luJ3Mgc2VydmVyIG1pZGRsZXdhcmUgc3RhbXBzXG4gKiBhIHtAbGluayBVc2VyfSBvbiB0aGUgY29udGV4dCB1bmRlciB7QGxpbmsgTUFTVFJBX1VTRVJfS0VZfVxuICogZm9yIGV2ZXJ5IHJlcXVlc3Q7IHRvb2xzIGZhaWwgbG91ZGx5IHdoZW4gaXQncyBtaXNzaW5nIGJlY2F1c2VcbiAqIHRoYXQgbWVhbnMgdGhlIE1hc3RyYSBwbHVnaW4gaXNuJ3QgcnVubmluZyAoZS5nLiBhIHRvb2wgd2FzXG4gKiBpbnZva2VkIG91dHNpZGUgdGhlIGNoYXQgcm91dGUpLlxuICovXG5mdW5jdGlvbiByZXF1aXJlQ2xpZW50KFxuICBjdHg6IFRvb2xFeGVjdXRlQ3R4LFxuICB0b29sSWQ6IHN0cmluZyxcbik6IHtcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQ7XG4gIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dDtcbn0ge1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IGN0eD8ucmVxdWVzdENvbnRleHQ7XG4gIGlmICghcmVxdWVzdENvbnRleHQpIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIGAke3Rvb2xJZH0gcmVxdWVzdCBjb250ZXh0YCxcbiAgICAgIFwiSW52b2tlIHRoZSB0b29sIGZyb20gYW4gYWdlbnQgdHVybiBzZXJ2ZWQgYnkgdGhlIG1hc3RyYSBwbHVnaW4uXCIsXG4gICAgKTtcbiAgfVxuICBjb25zdCB1c2VyID0gcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX0tFWSkgYXMgVXNlciB8IHVuZGVmaW5lZDtcbiAgaWYgKCF1c2VyKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgJHt0b29sSWR9IHVzZXIgY29udGV4dGAsXG4gICAgICBcIkludm9rZSB0aGUgdG9vbCBmcm9tIGFuIGFnZW50IHR1cm4gc2VydmVkIGJ5IHRoZSBtYXN0cmEgcGx1Z2luLCB3aGljaCBzdGFtcHMgdGhlIEFwcEtpdCB1c2VyIG9uIHRoZSBNYXN0cmEgcmVxdWVzdCBjb250ZXh0LlwiLFxuICAgICk7XG4gIH1cbiAgcmVjb3JkQWN0aXZlVHJhY2VBdXRoKFwiaXNVc2VyQ29udGV4dFwiIGluIHVzZXIuZXhlY3V0aW9uQ29udGV4dCA/IFwib2JvXCIgOiBcInNlcnZpY2UtcHJpbmNpcGFsXCIpO1xuICByZXR1cm4geyBjbGllbnQ6IHVzZXIuZXhlY3V0aW9uQ29udGV4dC5jbGllbnQsIHJlcXVlc3RDb250ZXh0IH07XG59XG5cbi8qKlxuICogTG93ZXJjYXNlZCBwbGFjZWhvbGRlciBzdHJpbmdzIHdlIHJlamVjdCBhdCB0aGUgYGFza19nZW5pZWBcbiAqIGJvdW5kYXJ5IHNvIHRoZSBMTE0gZG9lc24ndCBzcGVuZCBhIEdlbmllIHJvdW5kLXRyaXAgb24gYVxuICogbm9uLXF1ZXN0aW9uLiBHZW5pZSBwb2xpdGVseSBhbnN3ZXJzIGFueSBvZiB0aGVzZSB3aXRoIFwiWW91clxuICogcmVxdWVzdCAnLi4uJyBkb2VzIG5vdCByZWxhdGUgdG8uLi5cIiB3aGljaCBpcyBwdXJlIFVJIG5vaXNlLlxuICogS2VwdCBuYXJyb3cgb24gcHVycG9zZSAtIHJlYWwgcXVlc3Rpb25zIHNvbWV0aW1lcyBzdGFydCB3aXRoXG4gKiBvbmUgb2YgdGhlc2UgdG9rZW5zLCBzbyB3ZSBvbmx5IG1hdGNoIHRoZSBGVUxMIHRyaW1tZWQgc3RyaW5nLlxuICovXG5jb25zdCBQTEFDRUhPTERFUl9RVUVTVElPTlMgPSBuZXcgU2V0KFtcbiAgXCJub29wXCIsXG4gIFwibm8tb3BcIixcbiAgXCJza2lwXCIsXG4gIFwibm9uZVwiLFxuICBcIm4vYVwiLFxuICBcIm5hXCIsXG4gIFwibnVsbFwiLFxuICBcInVuZGVmaW5lZFwiLFxuICBcInRlc3RcIixcbiAgXCJwbGFjZWhvbGRlclwiLFxuXSk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbnZlcnNhdGlvbiBzdGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEVzdGltYXRlZCBHZW5pZSBjb252ZXJzYXRpb24gbGlmZXRpbWUgaW4gc2Vjb25kcy4gRGF0YWJyaWNrc1xuICogcHVibGlzaGVzIG5vIG9mZmljaWFsIFRUTCBvbiB0aGUgY29udmVyc2F0aW9uIHJlc291cmNlIGl0c2VsZjtcbiAqIGNvbW11bml0eSBwcm9qZWN0cyAoZS5nLiB0aGUgb3Blbi1zb3VyY2UgRGF0YWJyaWNrcyBHZW5pZSBCb3QpXG4gKiBjb252ZXJnZSBvbiA0IGhvdXJzIG9mIGluYWN0aXZpdHkgYXMgYSBzYWZlIG9wZXJhdGluZyB3aW5kb3cuXG4gKiBUcmVhdCB0aGlzIGFzIGFuIGVzdGltYXRlIHRoYXQgZ2V0cyAqZXh0ZW5kZWQgb24gZXZlcnkgdXNlKiBieVxuICogcmUtc2V0dGluZyB0aGUgY2FjaGUgZW50cnkgYWZ0ZXIgZWFjaCBzdWNjZXNzZnVsIHR1cm4gKHNsaWRpbmdcbiAqIFRUTCB2aWEgcmUtYHNldGApLiBXaGVuIHRoZSBlc3RpbWF0ZSBlbmRzIHVwIHdyb25nIChjb252ZXJzYXRpb25cbiAqIGRlbGV0ZWQsIGV4cGlyZWQgdXBzdHJlYW0sIGNyb3NzLXNwYWNlIHJlZmVyZW5jZWQpLCBgYXNrX2dlbmllYFxuICogY2F0Y2hlcyB0aGUgU0RLJ3MgYFJFU09VUkNFX0RPRVNfTk9UX0VYSVNUYC80MDQgYW5kIHRyYW5zcGFyZW50bHlcbiAqIHN0YXJ0cyBhIGZyZXNoIGNvbnZlcnNhdGlvbi5cbiAqL1xuY29uc3QgQ09OVkVSU0FUSU9OX1RUTF9TRUMgPSA0ICogNjAgKiA2MDtcblxuLyoqIENhY2hlIG5hbWVzcGFjZSBwcmVmaXggc28gY29leGlzdGluZyBNYXN0cmEgY2FjaGVzIGRvbid0IGNvbGxpZGUuICovXG5jb25zdCBDT05WRVJTQVRJT05fQ0FDSEVfTkFNRVNQQUNFID0gXCJtYXN0cmE6Z2VuaWU6Y29udmVyc2F0aW9uXCI7XG5cbi8qKlxuICogUGVyLXJlcXVlc3Qgc3RhdGUgZm9yIG9uZSBHZW5pZSBzcGFjZS4gVGhlIHJldXNhYmxlIGNvbnZlcnNhdGlvbiBpcyByZXNlcnZlZFxuICogYnkgYXQgbW9zdCBvbmUgaW52b2NhdGlvbiBhdCBhIHRpbWUuIEFkZGl0aW9uYWwgY29uY3VycmVudCBpbnZvY2F0aW9ucyB1c2VcbiAqIGlzb2xhdGVkIGNvbnZlcnNhdGlvbnMgc28gTWFzdHJhIGNhbiBleGVjdXRlIHBhcmFsbGVsIHRvb2wgY2FsbHMgd2l0aG91dFxuICogYXBwZW5kaW5nIG11bHRpcGxlIGFjdGl2ZSBtZXNzYWdlcyB0byB0aGUgc2FtZSBHZW5pZSBjb252ZXJzYXRpb24uXG4gKi9cbmludGVyZmFjZSBDb252ZXJzYXRpb25TdGF0ZSB7XG4gIGNvbnZlcnNhdGlvbklkPzogc3RyaW5nO1xuICByZXVzYWJsZUNvbnZlcnNhdGlvbkluRmxpZ2h0OiBib29sZWFuO1xufVxuXG4vKiogQnVpbGQgdGhlIHBlci1yZXF1ZXN0IHtAbGluayBSZXF1ZXN0Q29udGV4dH0ga2V5IGZvciBvbmUgR2VuaWUgc3BhY2UuICovXG5jb25zdCBjb252ZXJzYXRpb25Db250ZXh0S2V5ID0gKHNwYWNlSWQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICBgbWFzdHJhX19nZW5pZV9jb252ZXJzYXRpb25fXyR7c3BhY2VJZH1gO1xuXG4vKipcbiAqIFJlYWQgb3IgaW5pdGlhbGl6ZSB0aGUgcGVyLXNwYWNlIGNvbnZlcnNhdGlvbiBzdGF0ZS4gVGhlIHN0cmluZyBicmFuY2hcbiAqIHByZXNlcnZlcyBjb21wYXRpYmlsaXR5IHdpdGggYSBjb250ZXh0IHBvcHVsYXRlZCBieSBhbiBvbGRlciBwYWNrYWdlIGNvcHkuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnNhdGlvblN0YXRlKHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCwgc3BhY2VJZDogc3RyaW5nKTogQ29udmVyc2F0aW9uU3RhdGUge1xuICBjb25zdCBrZXkgPSBjb252ZXJzYXRpb25Db250ZXh0S2V5KHNwYWNlSWQpO1xuICBjb25zdCBjdXJyZW50ID0gcmVxdWVzdENvbnRleHQuZ2V0KGtleSkgYXMgQ29udmVyc2F0aW9uU3RhdGUgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChjdXJyZW50ICYmIHR5cGVvZiBjdXJyZW50ID09PSBcIm9iamVjdFwiKSByZXR1cm4gY3VycmVudDtcbiAgY29uc3Qgc3RhdGU6IENvbnZlcnNhdGlvblN0YXRlID0ge1xuICAgIC4uLih0eXBlb2YgY3VycmVudCA9PT0gXCJzdHJpbmdcIiA/IHsgY29udmVyc2F0aW9uSWQ6IGN1cnJlbnQgfSA6IHt9KSxcbiAgICByZXVzYWJsZUNvbnZlcnNhdGlvbkluRmxpZ2h0OiBmYWxzZSxcbiAgfTtcbiAgcmVxdWVzdENvbnRleHQuc2V0KGtleSwgc3RhdGUpO1xuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogUmVzZXJ2ZSB0aGUgcmV1c2FibGUgY29udmVyc2F0aW9uIHdoZW4gaXQgaXMgaWRsZS4gQSBjYWxsZXIgdGhhdCBjYW5ub3RcbiAqIHJlc2VydmUgaXQgZ2V0cyBhbiBpc29sYXRlZCBjb252ZXJzYXRpb24gYW5kIG1heSBydW4gaW4gcGFyYWxsZWwuXG4gKi9cbmZ1bmN0aW9uIHJlc2VydmVDb252ZXJzYXRpb24oc3RhdGU6IENvbnZlcnNhdGlvblN0YXRlKTogYm9vbGVhbiB7XG4gIGlmIChzdGF0ZS5yZXVzYWJsZUNvbnZlcnNhdGlvbkluRmxpZ2h0KSByZXR1cm4gZmFsc2U7XG4gIHN0YXRlLnJldXNhYmxlQ29udmVyc2F0aW9uSW5GbGlnaHQgPSB0cnVlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgY2Fub25pY2FsIGNhY2hlIGtleSBmb3IgYSBgKHNwYWNlSWQsIHRocmVhZElkKWAgcGFpciwgb3duZWQgYnlcbiAqIGB1c2VyS2V5YC4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIGB0aHJlYWRJZGAgaXMgbWlzc2luZyAtIGNhbGxlcnMgc2hvdWxkXG4gKiBza2lwIGNhY2hpbmcgZW50aXJlbHkgaW4gdGhhdCBjYXNlIChubyBNYXN0cmEgbWVtb3J5IHdpcmVkIHVwKS5cbiAqXG4gKiBUaGUgaWRlbnRpdHkgaXMgcGFydCBvZiB0aGUga2V5IGJlY2F1c2UgYSBjbGllbnQgcGlja3MgaXRzIG93biBgdGhyZWFkSWRgXG4gKiAodGhlIHRocmVhZC1zZWxlY3Rpb24gaGVhZGVyIC8gYD90aHJlYWRJZD1gKSwgc28gdGhlIGlkIGFsb25lIGRvZXMgbm90XG4gKiBlc3RhYmxpc2ggd2hvIG93bnMgdGhlIEdlbmllIGNvbnZlcnNhdGlvbiBiZWhpbmQgaXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbnZlcnNhdGlvbkNhY2hlS2V5KFxuICBzcGFjZUlkOiBzdHJpbmcsXG4gIHRocmVhZElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHVzZXJLZXk6IHN0cmluZyxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghdGhyZWFkSWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiAoYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlKCkpLmdlbmVyYXRlS2V5KFxuICAgIFtDT05WRVJTQVRJT05fQ0FDSEVfTkFNRVNQQUNFLCBzcGFjZUlkLCB0aHJlYWRJZF0sXG4gICAgdXNlcktleSxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZWFkIHRoZSBjYWNoZWQgR2VuaWUgY29udmVyc2F0aW9uIGlkIGZvciBgKHNwYWNlSWQsIHRocmVhZElkKWAuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIG9uIG1pc3MsIG9uIGV4cGlyeSwgb3Igd2hlbiB0aGUgY2FjaGUgbGF5ZXJcbiAqIGlzIHVuaGVhbHRoeSAtIG5ldmVyIHRocm93cy4gVGhlIFRUTCBpcyByZW5ld2VkIHZpYSByZS1gc2V0YFxuICogYWZ0ZXIgZWFjaCBzdWNjZXNzZnVsIHR1cm4gKHNlZSB7QGxpbmsgc2F2ZUNhY2hlZENvbnZlcnNhdGlvbklkfSkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDYWNoZWRDb252ZXJzYXRpb25JZChjYWNoZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgaWYgKCFjYWNoZUtleSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCB2ID0gYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLmdldDxzdHJpbmc+KGNhY2hlS2V5KTtcbiAgICByZXR1cm4gdiA/PyB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiY29udmVyc2F0aW9uLWNhY2hlOnJlYWQtZXJyb3JcIiwge1xuICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFBlcnNpc3QgdGhlIGFjdGl2ZSBjb252ZXJzYXRpb24gaWQgdW5kZXIgYGNhY2hlS2V5YCwgcmVmcmVzaGluZ1xuICogaXRzIFRUTC4gSWRlbXBvdGVudDsgbm8tb3Agd2hlbiBgY2FjaGVLZXlgIG9yIGBjb252ZXJzYXRpb25JZGBcbiAqIGlzIG1pc3NpbmcuIFJlLXNldHRpbmcgdGhlIHNhbWUga2V5IGFjdHMgYXMgYSBzbGlkaW5nIFRUTDogZXZlcnlcbiAqIHR1cm4gdGhhdCB1c2VzIHRoZSBjb252ZXJzYXRpb24gZXh0ZW5kcyB0aGUgd2luZG93IGJ5IGFub3RoZXJcbiAqIHtAbGluayBDT05WRVJTQVRJT05fVFRMX1NFQ30gc2Vjb25kcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2F2ZUNhY2hlZENvbnZlcnNhdGlvbklkKFxuICBjYWNoZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBjb252ZXJzYXRpb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghY2FjaGVLZXkgfHwgIWNvbnZlcnNhdGlvbklkKSByZXR1cm47XG4gIHRyeSB7XG4gICAgYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLnNldChjYWNoZUtleSwgY29udmVyc2F0aW9uSWQsIHtcbiAgICAgIHR0bDogQ09OVkVSU0FUSU9OX1RUTF9TRUMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiY29udmVyc2F0aW9uLWNhY2hlOndyaXRlLWVycm9yXCIsIHtcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKiBGb3JjZS1ldmljdCBhIGNhY2hlZCBjb252ZXJzYXRpb24gaWQuIFVzZWQgb24gdGhlIHN0YWxlLWlkIHJlY292ZXJ5IHBhdGguICovXG5hc3luYyBmdW5jdGlvbiBldmljdENhY2hlZENvbnZlcnNhdGlvbklkKGNhY2hlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFjYWNoZUtleSkgcmV0dXJuO1xuICB0cnkge1xuICAgIGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5kZWxldGUoY2FjaGVLZXkpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImNvbnZlcnNhdGlvbi1jYWNoZTpkZWxldGUtZXJyb3JcIiwge1xuICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBMYXp5LXNlZWQgdGhlIGFjdGl2ZSBHZW5pZSBgY29udmVyc2F0aW9uX2lkYCBmb3IgYHNwYWNlSWRgIGZyb21cbiAqIHRoZSBjcm9zcy1yZXF1ZXN0IGNhY2hlIG9udG8gdGhlIHBlci1yZXF1ZXN0IGBSZXF1ZXN0Q29udGV4dGAuXG4gKiBOby1vcCB3aGVuIHRoZSBzbG90IGlzIGFscmVhZHkgcG9wdWxhdGVkIChzdWJzZXF1ZW50XG4gKiBgYXNrX2dlbmllYCBjYWxscyBpbiB0aGUgc2FtZSB0dXJuKSBzbyB3ZSBoaXQgdGhlIGNhY2hlIGF0IG1vc3RcbiAqIG9uY2UgcGVyIHJlcXVlc3QgcGVyIHNwYWNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVDb252ZXJzYXRpb25TZWVkZWQoXG4gIHN0YXRlOiBDb252ZXJzYXRpb25TdGF0ZSxcbiAgY2FjaGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoc3RhdGUuY29udmVyc2F0aW9uSWQpIHJldHVybjtcbiAgY29uc3QgY2FjaGVkID0gYXdhaXQgcmVhZENhY2hlZENvbnZlcnNhdGlvbklkKGNhY2hlS2V5KTtcbiAgaWYgKGNhY2hlZCkgc3RhdGUuY29udmVyc2F0aW9uSWQgPSBjYWNoZWQ7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcmVwYXJlX2NoYXJ0IGlucHV0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEFnZW50LWZhY2luZyBgcHJlcGFyZV9jaGFydGAgaW5wdXQgc2NoZW1hLiBSZXVzZXNcbiAqIHtAbGluayBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hfSAodGhlIGRhdGFzZXQtZHJpdmVuIHBsYW5uZXJcbiAqIGNvbnRyYWN0KSBidXQgc3dhcHMgdGhlIGlubGluZSBgZGF0YWAgZmllbGQgZm9yIGEgR2VuaWVcbiAqIGBzdGF0ZW1lbnRfaWRgIHRoZSB0b29sIHJlc29sdmVzIGludG8gcm93cyBzZXJ2ZXItc2lkZS5cbiAqIGB0aXRsZWAgaXMgbG9vc2VuZWQgdG8gb3B0aW9uYWwgLSB0aGUgcGxhbm5lciBmYWxscyBiYWNrIHRvIGFcbiAqIGdlbmVyaWMgcGxhY2Vob2xkZXIgd2hlbiB0aGUgYWdlbnQgZG9lc24ndCBzdXBwbHkgb25lLlxuICpcbiAqIFNoYXBlZCB0byBtYXRjaCBHZW5pZSdzIHdpcmUgZm9ybSAtIGBzdGF0ZW1lbnRfaWRgIChzbmFrZSlcbiAqIG1pcnJvcnMgYHF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRgIGFuZCB0aGUgYGdldF9zdGF0ZW1lbnRgXG4gKiB0b29sJ3MgaW5wdXQgZmllbGQgbmFtZSwgc28gdGhlIExMTSBvbmx5IGV2ZXIgc2VlcyBvbmVcbiAqIHNwZWxsaW5nIGZvciB0aGUgc2FtZSBpZGVudGlmaWVyLlxuICovXG5jb25zdCBwcmVwYXJlQ2hhcnRSZXF1ZXN0U2NoZW1hID0gY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYVxuICAub21pdCh7IGRhdGE6IHRydWUsIHRpdGxlOiB0cnVlIH0pXG4gIC5leHRlbmQoe1xuICAgIHN0YXRlbWVudF9pZDogelxuICAgICAgLnN0cmluZygpXG4gICAgICAubWluKDEsIFwic3RhdGVtZW50X2lkIGlzIHJlcXVpcmVkXCIpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICAgIEdlbmllIFxcYHN0YXRlbWVudF9pZFxcYCB0byBjaGFydC4gUmVhZCBmcm9tXG4gICAgICAgICAgXFxgbWVzc2FnZS5xdWVyeV9yZXN1bHQuc3RhdGVtZW50X2lkXFxgIG9yXG4gICAgICAgICAgXFxgbWVzc2FnZS5hdHRhY2htZW50c1sqXS5xdWVyeS5zdGF0ZW1lbnRfaWRcXGAgcmV0dXJuZWQgYnlcbiAgICAgICAgICBcXGBhc2tfZ2VuaWVcXGAuXG4gICAgICAgIGApLFxuICAgICAgKSxcbiAgICB0aXRsZTogY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYS5zaGFwZS50aXRsZS5vcHRpb25hbCgpLFxuICB9KTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdG9vbCBpZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBTdWZmaXggYXBwZW5kZWQgdG8gcGVyLXNwYWNlIHRvb2wgaWRzIHdoZW4gdGhlIGFsaWFzIGlzbid0IHRoZVxuICogd2VsbC1rbm93biBgZGVmYXVsdGAuIFNpbmdsZS1zcGFjZSBkZXBsb3ltZW50cyBnZXQgdGhlIGJhcmVcbiAqIG5hbWVzIChgYXNrX2dlbmllYCwgYGdldF9zcGFjZV9kZXNjcmlwdGlvbmAsIC4uLik7IG11bHRpLXNwYWNlXG4gKiBkZXBsb3ltZW50cyBnZXQgYGFza19nZW5pZV88YWxpYXM+YCBldGMuIHNvIGVhY2ggc3BhY2UncyB0b29sc1xuICogc3RheSBkaXNhbWJpZ3VhdGVkIGluIHRoZSBjZW50cmFsIGFnZW50J3MgdG9vbCByZWdpc3RyeS5cbiAqL1xuZnVuY3Rpb24gYWxpYXNTdWZmaXgoYWxpYXM6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChhbGlhcyA9PT0gREVGQVVMVF9HRU5JRV9BTElBUykgcmV0dXJuIFwiXCI7XG4gIGNvbnN0IHNsdWcgPSBzdHJpbmdVdGlscy50b0lkZW50aWZpZXIoYWxpYXMpO1xuICByZXR1cm4gc2x1ZyA/IGBfJHtzbHVnfWAgOiBcIlwiO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGVyLXNwYWNlIHRvb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIERyb3AgYHN1Z2dlc3RlZF9xdWVzdGlvbnNgIGF0dGFjaG1lbnRzIGZyb20gYSB7QGxpbmsgR2VuaWVNZXNzYWdlfVxuICogYmVmb3JlIGhhbmRpbmcgaXQgdG8gdGhlIGNlbnRyYWwgTExNLiBUaG9zZSBlbnRyaWVzIGFscmVhZHlcbiAqIHN1cmZhY2UgaW4gdGhlIFVJIGFzIG9uZS10YXAgcGlsbHMgdmlhIHRoZSB3cml0ZXInc1xuICogYHN1Z2dlc3RlZF9xdWVzdGlvbnNgIGV2ZW50cyAoc2VlIGBjb2xsZWN0U3VnZ2VzdGlvbnNgIG9uIHRoZVxuICogY2xpZW50KTsgaWYgd2UgbGV0IHRoZW0gcmlkZSBiYWNrIGluIHRoZSB0b29sIHJlc3VsdCB0aGUgTExNXG4gKiB0ZW5kcyB0byBxdW90ZSB0aGVtIGlubGluZSBpbiBpdHMgcHJvc2UsIGRvdWJsZS1zaG93aW5nIHRoZVxuICogc2FtZSBxdWVzdGlvbnMgYW5kIHN0ZXBwaW5nIG9uIHRoZSBkZWRpY2F0ZWQgc3VnZ2VzdGlvbiBVSS5cbiAqIFF1ZXJ5IC8gdGV4dCAvIHJvdyBhdHRhY2htZW50cyBhcmUgcHJlc2VydmVkIHNvIHRoZSBtb2RlbCBjYW5cbiAqIHN0aWxsIHJlYWQgYHN0YXRlbWVudF9pZGAsIFNRTCwgYW5kIHRoZSBhbnN3ZXIgdGV4dC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBTdWdnZXN0ZWRRdWVzdGlvbnMobWVzc2FnZTogR2VuaWVNZXNzYWdlKTogR2VuaWVNZXNzYWdlIHtcbiAgY29uc3QgYXR0YWNobWVudHMgPSBtZXNzYWdlLmF0dGFjaG1lbnRzO1xuICBpZiAoIWF0dGFjaG1lbnRzIHx8IGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG1lc3NhZ2U7XG4gIGNvbnN0IGZpbHRlcmVkID0gYXR0YWNobWVudHMuZmlsdGVyKChhdHQpID0+ICFhdHQuc3VnZ2VzdGVkX3F1ZXN0aW9ucyk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IGF0dGFjaG1lbnRzLmxlbmd0aCkgcmV0dXJuIG1lc3NhZ2U7XG4gIHJldHVybiB7IC4uLm1lc3NhZ2UsIGF0dGFjaG1lbnRzOiBmaWx0ZXJlZCB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEFza0dlbmllVG9vbChvcHRzOiB7XG4gIHNwYWNlSWQ6IHN0cmluZztcbiAgYWxpYXM6IHN0cmluZztcbiAgaGludD86IHN0cmluZztcbiAgYWdlbnRNb2RlPzogYm9vbGVhbjtcbn0pIHtcbiAgY29uc3QgeyBzcGFjZUlkLCBhbGlhcywgaGludCwgYWdlbnRNb2RlIH0gPSBvcHRzO1xuICBjb25zdCB0b29sSWQgPSBgYXNrX2dlbmllJHthbGlhc1N1ZmZpeChhbGlhcyl9YDtcbiAgY29uc3QgaGludExpbmUgPSBoaW50ID8gYCAoJHtoaW50fSlgIDogXCJcIjtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiB0b29sSWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgQXNrIHRoZSBHZW5pZSBzcGFjZSBcIiR7YWxpYXN9XCIke2hpbnRMaW5lfSBPTkUgZm9jdXNlZFxuICAgICAgbmF0dXJhbC1sYW5ndWFnZSBzdWItcXVlc3Rpb24gYW5kIHdhaXQgZm9yIHRoZSB0dXJuIHRvXG4gICAgICBjb21wbGV0ZS4gR2VuaWUgYW5zd2VycyBiZXN0IHdoZW4gZWFjaCBjYWxsIGNvdmVycyBhXG4gICAgICBzaW5nbGUgbWV0cmljIC8gZGltZW5zaW9uIC8gdGltZSB3aW5kb3csIHNvIGV4cGVjdCB0b1xuICAgICAgY2FsbCB0aGlzIHRvb2wgTVVMVElQTEUgVElNRVMgcGVyIHVzZXIgdHVybiAodHlwaWNhbGx5XG4gICAgICB0d28gdG8gc2l4KS4gSW5kZXBlbmRlbnQgc3ViLXF1ZXN0aW9ucyBtYXkgYmUgY2FsbGVkIGluXG4gICAgICBQQVJBTExFTDsgY2FsbHMgdGhhdCBkZXBlbmQgb24gYW4gZWFybGllciBhbnN3ZXIgc2hvdWxkIHN0YXlcbiAgICAgIHNlcXVlbnRpYWwuIFBhcmFsbGVsIGNhbGxzIHVzZSBpc29sYXRlZCBHZW5pZSBjb252ZXJzYXRpb25zLFxuICAgICAgd2hpbGUgc2VxdWVudGlhbCBjYWxscyByZXRhaW4gdGhlIHJldXNhYmxlIGNvbnZlcnNhdGlvbiBjb250ZXh0LlxuICAgICAgVGhpcyBpcyB0aGUgbm9ybWFsIHBhdHRlcm4sIG5vdCB0aGUgZXhjZXB0aW9uLlxuICAgICAgRG8gTk9UIHRyeSB0byBjcmFtIGEgbXVsdGktcGFydCBxdWVzdGlvbiBpbnRvIGEgc2luZ2xlXG4gICAgICBjYWxsOyBkZWNvbXBvc2UgZmlyc3QsIHRoZW4gYXNrIGVhY2ggcGllY2UuXG5cbiAgICAgIFJldHVybnMgdGhlIGZpbmFsIFxcYEdlbmllTWVzc2FnZVxcYC4gQWdlbnQgTW9kZSBpbmNsdWRlcyB0aGVcbiAgICAgIHN5bnRoZXNpemVkIGFuc3dlciBhbmQgY2FuIGluY2x1ZGUgU1FMIHJlc3VsdCB2YWx1ZXMgYXMgYVxuICAgICAgTWFya2Rvd24gdGV4dCBhdHRhY2htZW50LiBBZ2VudCBNb2RlIGhhcyBubyBcXGBzdGF0ZW1lbnRfaWRcXGA7XG4gICAgICB1c2UgXFxgcmVuZGVyX2RhdGFcXGAgd2l0aCBpdHMgaW5saW5lIHJvd3Mgd2hlbiBhIGNoYXJ0IGlzIG5lZWRlZC5cbiAgICAgIEEgbGVnYWN5IHBvbGxpbmcgcmVzdWx0IGluc3RlYWQgY2FycmllcyBhIFxcYHN0YXRlbWVudF9pZFxcYCAoYXRcbiAgICAgIFxcYG1lc3NhZ2UucXVlcnlfcmVzdWx0LnN0YXRlbWVudF9pZFxcYCBvciB0aGUgZmlyc3RcbiAgICAgIGF0dGFjaG1lbnQncyBcXGBxdWVyeS5zdGF0ZW1lbnRfaWRcXGApOyBjYWxsXG4gICAgICBcXGBnZXRfc3RhdGVtZW50XFxgIHdpdGggdGhhdCBpZCBvbmx5IHdoZW4geW91IG5lZWQgdG8gcmVhZFxuICAgICAgdGhlIHVuZGVybHlpbmcgdmFsdWVzIHRvIHJlYXNvbiBhYm91dCB0aGVtLiBJZiB5b3UganVzdCB3YW50XG4gICAgICB0byBkaXNwbGF5IGEgbGVnYWN5IHJlc3VsdCwgZW1iZWQgYVxuICAgICAgXFxgW2RhdGE6PHN0YXRlbWVudF9pZD5dXFxgIG1hcmtlciBpbiBwcm9zZS4gV2lyZSBldmVudHNcbiAgICAgIChzdGF0dXMsIHJlYXNvbmluZywgU1FMLCBxdWVyeSBvdXRwdXQsIGFuc3dlciB0ZXh0KSBzdHJlYW1cbiAgICAgIGF1dG9tYXRpY2FsbHkgd2hpbGUgdGhlIGNhbGwgaXMgaW4gZmxpZ2h0LlxuICAgIGApLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBxdWVzdGlvbjogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm1pbigxLCBcInF1ZXN0aW9uIGlzIHJlcXVpcmVkXCIpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgICAgIE9ORSBmb2N1c2VkIG5hdHVyYWwtbGFuZ3VhZ2UgcXVlc3Rpb24gYWJvdXQgdGhlIGRhdGEgaW4gdGhpc1xuICAgICAgICAgICAgc3BhY2UsIGNvdmVyaW5nIGEgc2luZ2xlIG1ldHJpYyAvIGRpbWVuc2lvbiAvIHRpbWUgd2luZG93XG4gICAgICAgICAgICAoZS5nLiBcIldoYXQgd2FzIFEzIHJldmVudWUgYnkgcmVnaW9uP1wiKS4gRGVjb21wb3NlIGFcbiAgICAgICAgICAgIG11bHRpLXBhcnQgYXNrIGludG8gc2VwYXJhdGUgY2FsbHMgcmF0aGVyIHRoYW4gY29tYmluaW5nIGl0XG4gICAgICAgICAgICBoZXJlLlxuICAgICAgICAgIGApLFxuICAgICAgICApLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbWVzc2FnZTogZ2VuaWVNb2RlbC5HZW5pZU1lc3NhZ2VTY2hlbWEsXG4gICAgfSksXG4gICAgZXhlY3V0ZTogYXN5bmMgKHsgcXVlc3Rpb24gfSwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCBjdHggPSBjdHhSYXcgYXMgVG9vbEV4ZWN1dGVDdHg7XG4gICAgICBzdGFtcEdlbmllVG9vbFNwYW4oKTtcbiAgICAgIGNvbnN0IHsgY2xpZW50LCByZXF1ZXN0Q29udGV4dCB9ID0gcmVxdWlyZUNsaWVudChjdHgsIHRvb2xJZCk7XG4gICAgICBjb25zdCB3cml0ZXIgPSBjdHg/LndyaXRlcjtcbiAgICAgIGNvbnN0IHRvb2xDYWxsSWQgPSBjdHg/LmFnZW50Py50b29sQ2FsbElkO1xuICAgICAgY29uc3Qgc2lnbmFsID0gY3R4Py5hYm9ydFNpZ25hbDtcbiAgICAgIGNvbnN0IHRocmVhZElkID0gcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9USFJFQURfSURfS0VZKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIEJvdW5jZSBwbGFjZWhvbGRlciAvIG5vLW9wIHF1ZXN0aW9ucyBCRUZPUkUgc3BlbmRpbmcgYSBHZW5pZVxuICAgICAgLy8gcm91bmQtdHJpcCBvbiB0aGVtLiBHZW5pZSBhbnN3ZXJzIGFueSBvZiB0aGVzZSB3aXRoIFwiWW91clxuICAgICAgLy8gcmVxdWVzdCAnbm9vcCcgZG9lcyBub3QgcmVsYXRlIHRvLi4uXCIgLSB1c2VsZXNzIG5vaXNlIHRoYXRcbiAgICAgIC8vIHNob3dzIHVwIGluIHRoZSBVSSBhbmQgZWF0cyBvbmUgb2YgdGhlIHdvcmtzcGFjZSdzIDVcbiAgICAgIC8vIHF1ZXN0aW9ucy9taW51dGUuIFJldHVybmluZyBhIGNsZWFyIGVycm9yIGhlcmUgc3VyZmFjZXMgdGhlXG4gICAgICAvLyBpc3N1ZSB0byB0aGUgYWdlbnQgbG9vcCBzbyB0aGUgbW9kZWwgY29ycmVjdHMgY291cnNlIGluc3RlYWRcbiAgICAgIC8vIG9mIHdhc3RpbmcgYSB0dXJuLlxuICAgICAgY29uc3QgdHJpbW1lZCA9IHF1ZXN0aW9uLnRyaW0oKTtcbiAgICAgIGlmICh0cmltbWVkLmxlbmd0aCA9PT0gMCB8fCBQTEFDRUhPTERFUl9RVUVTVElPTlMuaGFzKHRyaW1tZWQudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcbiAgICAgICAgICBgJHt0b29sSWR9LnF1ZXN0aW9uYCxcbiAgICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgICBcImEgcmVhbCBuYXR1cmFsLWxhbmd1YWdlIHF1ZXN0aW9uLCBub3QgYSBwbGFjZWhvbGRlcjsgc2tpcCB0aGUgY2FsbCBpbnN0ZWFkXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0YXRlID0gY29udmVyc2F0aW9uU3RhdGUocmVxdWVzdENvbnRleHQsIHNwYWNlSWQpO1xuICAgICAgY29uc3Qgb3duc1JldXNhYmxlQ29udmVyc2F0aW9uID0gcmVzZXJ2ZUNvbnZlcnNhdGlvbihzdGF0ZSk7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBPbmx5IHRoZSByZXNlcnZlZCBsYW5lIHNlZWRzIGFuZCB1cGRhdGVzIHRoZSB0aHJlYWQncyByZXVzYWJsZVxuICAgICAgICAvLyBjb252ZXJzYXRpb24uIENvbmN1cnJlbnQgbGFuZXMgZGVsaWJlcmF0ZWx5IHN0YXJ0IGZyZXNoIGNvbnZlcnNhdGlvbnMuXG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gb3duc1JldXNhYmxlQ29udmVyc2F0aW9uXG4gICAgICAgICAgPyBhd2FpdCBjb252ZXJzYXRpb25DYWNoZUtleShzcGFjZUlkLCB0aHJlYWRJZCwgcmVzb2x2ZVVzZXJLZXkocmVxdWVzdENvbnRleHQpKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAob3duc1JldXNhYmxlQ29udmVyc2F0aW9uKSB7XG4gICAgICAgICAgYXdhaXQgZW5zdXJlQ29udmVyc2F0aW9uU2VlZGVkKHN0YXRlLCBjYWNoZUtleSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFYWNoIGludm9jYXRpb24ga2VlcHMgaXRzIGNvbnZlcnNhdGlvbiBpZCBsb2NhbGx5LiBPbmx5IHRoZSByZXVzYWJsZVxuICAgICAgICAvLyBsYW5lIHB1Ymxpc2hlcyB1cGRhdGVzIHRvIHNoYXJlZCByZXF1ZXN0IGFuZCBjcm9zcy1yZXF1ZXN0IHN0YXRlLlxuICAgICAgICBsZXQgY29udmVyc2F0aW9uSWQgPSBvd25zUmV1c2FibGVDb252ZXJzYXRpb24gPyBzdGF0ZS5jb252ZXJzYXRpb25JZCA6IHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCBzdGFydGVkRXZlbnQ6IFN0YXJ0ZWRFdmVudCA9IHtcbiAgICAgICAgICB0eXBlOiBcInN0YXJ0ZWRcIixcbiAgICAgICAgICBzcGFjZUlkLFxuICAgICAgICAgIGNvbnRlbnQ6IHF1ZXN0aW9uLFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCBzYWZlV3JpdGVQcm9ncmVzcyhsb2dnZXIsIHdyaXRlciwgdG9vbENhbGxJZCwgc3RhcnRlZEV2ZW50KTtcblxuICAgICAgICBjb25zdCBydW5UdXJuID0gYXN5bmMgKCk6IFByb21pc2U8R2VuaWVNZXNzYWdlPiA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VlZENvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uSWQ7XG4gICAgICAgICAgbGV0IGZpbmFsTWVzc2FnZTogR2VuaWVNZXNzYWdlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2YgY2hhdC5nZW5pZUV2ZW50Q2hhdChzcGFjZUlkLCBxdWVzdGlvbiwge1xuICAgICAgICAgICAgd29ya3NwYWNlQ2xpZW50OiBjbGllbnQsXG4gICAgICAgICAgICAuLi4oYWdlbnRNb2RlICE9PSB1bmRlZmluZWQgPyB7IGFnZW50TW9kZSB9IDoge30pLFxuICAgICAgICAgICAgLi4uKHNlZWRDb252ZXJzYXRpb25JZCA/IHsgY29udmVyc2F0aW9uSWQ6IHNlZWRDb252ZXJzYXRpb25JZCB9IDoge30pLFxuICAgICAgICAgICAgLi4uKHNpZ25hbCA/IHsgY29udGV4dDogc2lnbmFsIH0gOiB7fSksXG4gICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIGlmIChldmVudC50eXBlICE9PSBcIm1lc3NhZ2VcIikge1xuICAgICAgICAgICAgICBhd2FpdCBzYWZlV3JpdGVQcm9ncmVzcyhsb2dnZXIsIHdyaXRlciwgdG9vbENhbGxJZCwgZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXZlbnRDb252ZXJzYXRpb25JZCA9IGV2ZW50LmNvbnZlcnNhdGlvbl9pZDtcbiAgICAgICAgICAgIGlmIChldmVudENvbnZlcnNhdGlvbklkKSB7XG4gICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkID0gZXZlbnRDb252ZXJzYXRpb25JZDtcbiAgICAgICAgICAgICAgaWYgKG93bnNSZXVzYWJsZUNvbnZlcnNhdGlvbikgc3RhdGUuY29udmVyc2F0aW9uSWQgPSBldmVudENvbnZlcnNhdGlvbklkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwicmVzdWx0XCIpIHtcbiAgICAgICAgICAgICAgZmluYWxNZXNzYWdlID0gZXZlbnQubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFmaW5hbE1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRocm93IEV4ZWN1dGlvbkVycm9yLm1pc3NpbmdEYXRhKFwiR2VuaWUgcmVzdWx0IGV2ZW50XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmluYWxNZXNzYWdlO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBmaW5hbE1lc3NhZ2U6IEdlbmllTWVzc2FnZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmaW5hbE1lc3NhZ2UgPSBhd2FpdCBydW5UdXJuKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIEEgcmVqZWN0ZWQgY29udmVyc2F0aW9uIGlkIGlzIHN0YWxlIG9yIGluYWNjZXNzaWJsZS4gUmVzZXQgdGhpc1xuICAgICAgICAgIC8vIGxhbmUgYW5kIHJldHJ5IG9uY2Ugd2l0aCBhIGZyZXNoIEdlbmllIGNvbnZlcnNhdGlvbi5cbiAgICAgICAgICBjb25zdCByZWplY3RlZENvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uSWQ7XG4gICAgICAgICAgaWYgKHJlamVjdGVkQ29udmVyc2F0aW9uSWQgJiYgZXJyb3JVdGlscy5lcnJvckNvbnRleHQoZXJyKS5ub3RBY2Nlc3NpYmxlKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcImNvbnZlcnNhdGlvbi1jYWNoZTpzdGFsZSwgcmVzZXR0aW5nXCIsIHtcbiAgICAgICAgICAgICAgc3BhY2VJZCxcbiAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQ6IHJlamVjdGVkQ29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAob3duc1JldXNhYmxlQ29udmVyc2F0aW9uKSB7XG4gICAgICAgICAgICAgIGF3YWl0IGV2aWN0Q2FjaGVkQ29udmVyc2F0aW9uSWQoY2FjaGVLZXkpO1xuICAgICAgICAgICAgICBzdGF0ZS5jb252ZXJzYXRpb25JZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgZmluYWxNZXNzYWdlID0gYXdhaXQgcnVuVHVybigpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG93bnNSZXVzYWJsZUNvbnZlcnNhdGlvbikge1xuICAgICAgICAgIGF3YWl0IHNhdmVDYWNoZWRDb252ZXJzYXRpb25JZChjYWNoZUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogc3RyaXBTdWdnZXN0ZWRRdWVzdGlvbnMoZmluYWxNZXNzYWdlKSB9O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKG93bnNSZXVzYWJsZUNvbnZlcnNhdGlvbikgc3RhdGUucmV1c2FibGVDb252ZXJzYXRpb25JbkZsaWdodCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZFNwYWNlRGVzY3JpcHRpb25Ub29sKG9wdHM6IHsgc3BhY2VJZDogc3RyaW5nOyBhbGlhczogc3RyaW5nIH0pIHtcbiAgY29uc3QgeyBzcGFjZUlkLCBhbGlhcyB9ID0gb3B0cztcbiAgY29uc3QgdG9vbElkID0gYGdldF9zcGFjZV9kZXNjcmlwdGlvbiR7YWxpYXNTdWZmaXgoYWxpYXMpfWA7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogdG9vbElkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgIFJldHVybiB0aGUgR2VuaWUgc3BhY2UgXCIke2FsaWFzfVwiJ3MgdGl0bGUsIGRlc2NyaXB0aW9uLCBhbmRcbiAgICAgIHdhcmVob3VzZSBpZC4gQ2hlYXAgKHNpbmdsZSBSRVNUIGNhbGwsIG5vIExMTSByb3VuZC10cmlwKS5cbiAgICAgIENhbGwgdGhpcyBGSVJTVCBvbiBhbnkgdXNlciB0dXJuIHRoYXQncyBnb2luZyB0byB0b3VjaFxuICAgICAgXFxgYXNrX2dlbmllXFxgLCB1bmxlc3MgdGhlIHNhbWUgZGVzY3JpcHRpb24gYWxyZWFkeSBsYW5kZWRcbiAgICAgIGVhcmxpZXIgaW4gdGhpcyBjb252ZXJzYXRpb24gLSB0aGUgdGl0bGUgKyBkZXNjcmlwdGlvbiB0ZWxsXG4gICAgICB5b3Ugd2hhdCB0YWJsZXMsIG1ldHJpY3MsIGFuZCB0aW1lIHdpbmRvd3MgdGhlIHNwYWNlXG4gICAgICBhY3R1YWxseSBjb3ZlcnMsIHdoaWNoIGlzIHdoYXQgbGV0cyB5b3UgZGVjb21wb3NlIHRoZVxuICAgICAgdXNlcidzIHF1ZXN0aW9uIGludG8gdGhlIHJpZ2h0IFxcYGFza19nZW5pZVxcYCBzdWItcXVlc3Rpb25zLlxuICAgIGApLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7fSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBzcGFjZUlkOiB6LnN0cmluZygpLFxuICAgICAgdGl0bGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICB3YXJlaG91c2VJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChfaW5wdXQsIGN0eFJhdykgPT4ge1xuICAgICAgY29uc3QgY3R4ID0gY3R4UmF3IGFzIFRvb2xFeGVjdXRlQ3R4O1xuICAgICAgY29uc3QgeyBjbGllbnQgfSA9IHJlcXVpcmVDbGllbnQoY3R4LCB0b29sSWQpO1xuICAgICAgY29uc3Qgc2lnbmFsID0gY3R4Py5hYm9ydFNpZ25hbDtcbiAgICAgIC8vIFJvdXRlIHRocm91Z2ggdGhlIHBhY2thZ2UncyBjZW50cmFsIEdlbmllIHNwYWNlIGZldGNoLiBUaGVcbiAgICAgIC8vIGRlc2NyaXB0aW9uIHN1cmZhY2UgKHRpdGxlIC8gZGVzY3JpcHRpb24gLyB3YXJlaG91c2UgaWQpIGxpdmVzXG4gICAgICAvLyBvbiB0aGUgZGlyZWN0b3J5LWxpc3Rpbmcgc2hhcGUsIHNvIHNraXAgdGhlIGxhcmdlclxuICAgICAgLy8gYHNlcmlhbGl6ZWRfc3BhY2VgIHBheWxvYWQgaGVyZS5cbiAgICAgIGNvbnN0IHNwYWNlID0gYXdhaXQgZ2VuaWVTcGFjZS5nZXRHZW5pZVNwYWNlKHNwYWNlSWQsIHtcbiAgICAgICAgd29ya3NwYWNlQ2xpZW50OiBjbGllbnQsXG4gICAgICAgIHNlcmlhbGl6ZWQ6IGZhbHNlLFxuICAgICAgICAuLi4oc2lnbmFsID8geyBjb250ZXh0OiBzaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3BhY2VJZCxcbiAgICAgICAgLi4uKHNwYWNlLnRpdGxlID8geyB0aXRsZTogc3BhY2UudGl0bGUgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwYWNlLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogc3BhY2UuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwYWNlLndhcmVob3VzZV9pZCA/IHsgd2FyZWhvdXNlSWQ6IHNwYWNlLndhcmVob3VzZV9pZCB9IDoge30pLFxuICAgICAgfTtcbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTcGFjZVNlcmlhbGl6ZWRUb29sKG9wdHM6IHsgc3BhY2VJZDogc3RyaW5nOyBhbGlhczogc3RyaW5nIH0pIHtcbiAgY29uc3QgeyBzcGFjZUlkLCBhbGlhcyB9ID0gb3B0cztcbiAgY29uc3QgdG9vbElkID0gYGdldF9zcGFjZV9zZXJpYWxpemVkJHthbGlhc1N1ZmZpeChhbGlhcyl9YDtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiB0b29sSWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgUmV0dXJuIHRoZSBmdWxsIFxcYEdlbmllU3BhY2VcXGAgSlNPTiBmb3IgdGhlIFwiJHthbGlhc31cIiBzcGFjZS5cbiAgICAgIFVzZSBvbmx5IHdoZW4geW91IG5lZWQgZXhhY3QgY29sdW1uIC8gdGFibGUgaWRlbnRpZmllcnNcbiAgICAgIFxcYGdldF9zcGFjZV9kZXNjcmlwdGlvblxcYCBkb2Vzbid0IGV4cG9zZS4gTGFyZ2VyIHBheWxvYWQsIHNvXG4gICAgICBwcmVmZXIgdGhlIGRlc2NyaXB0aW9uIHRvb2wgd2hlbiBpdCdzIGVub3VnaC5cbiAgICBgKSxcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe30pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3QoeyBzcGFjZTogei51bmtub3duKCkgfSksXG4gICAgZXhlY3V0ZTogYXN5bmMgKF9pbnB1dCwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCBjdHggPSBjdHhSYXcgYXMgVG9vbEV4ZWN1dGVDdHg7XG4gICAgICBjb25zdCB7IGNsaWVudCB9ID0gcmVxdWlyZUNsaWVudChjdHgsIHRvb2xJZCk7XG4gICAgICBjb25zdCBzaWduYWwgPSBjdHg/LmFib3J0U2lnbmFsO1xuICAgICAgLy8gQ2VudHJhbCBHZW5pZSBzcGFjZSBmZXRjaCB3aXRoIHRoZSBvcHQtaW4gYHNlcmlhbGl6ZWRfc3BhY2VgXG4gICAgICAvLyBibG9iIChjYXRhbG9ncywgdGFibGVzLCBzYW1wbGUgcXVlc3Rpb25zLCBwcm9tcHRzKSB0aGF0IHRoZVxuICAgICAgLy8gdHlwZWQgU0RLIGBnZXRTcGFjZWAgb21pdHMgLSB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyB0b29sLlxuICAgICAgY29uc3Qgc3BhY2UgPSBhd2FpdCBnZW5pZVNwYWNlLmdldEdlbmllU3BhY2Uoc3BhY2VJZCwge1xuICAgICAgICB3b3Jrc3BhY2VDbGllbnQ6IGNsaWVudCxcbiAgICAgICAgLi4uKHNpZ25hbCA/IHsgY29udGV4dDogc2lnbmFsIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHNwYWNlIH07XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzaGFyZWQgdG9vbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRGVmYXVsdCByb3cgY2FwIGZvciB7QGxpbmsgYnVpbGRHZXRTdGF0ZW1lbnRUb29sfSB3aGVuIHRoZSBhZ2VudFxuICogZG9lc24ndCBzdXBwbHkgYSBgbGltaXRgLiBTaXplZCB0byBrZWVwIHJlc3VsdCBzZXRzIG91dCBvZiB0aGVcbiAqIG1vZGVsIGNvbnRleHQgdW5sZXNzIHRoZSBhZ2VudCBleHBsaWNpdGx5IG9wdHMgaW50byBtb3JlIHJvd3MgLVxuICogdGhlIGNoZWFwIHNoYXBlIChjb2x1bW4gbmFtZXMgKyBhIGhhbmRmdWwgb2YgcmVwcmVzZW50YXRpdmVcbiAqIHJvd3MpIGlzIHVzdWFsbHkgZW5vdWdoIHRvIHJlYXNvbiBhYm91dCBhIHF1ZXJ5LlxuICovXG5jb25zdCBERUZBVUxUX1NUQVRFTUVOVF9MSU1JVCA9IDUwO1xuXG5mdW5jdGlvbiBidWlsZEdldFN0YXRlbWVudFRvb2woKSB7XG4gIGNvbnN0IHRvb2xJZCA9IFwiZ2V0X3N0YXRlbWVudFwiO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IHRvb2xJZCxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICBGZXRjaCB0aGUgcm93cyBvZiBhIEdlbmllIHN0YXRlbWVudCBieSBpdHMgXFxgc3RhdGVtZW50X2lkXFxgICh0aGVcbiAgICAgIHZhbHVlIGF0IFxcYG1lc3NhZ2UucXVlcnlfcmVzdWx0LnN0YXRlbWVudF9pZFxcYCBvclxuICAgICAgXFxgbWVzc2FnZS5hdHRhY2htZW50c1sqXS5xdWVyeS5zdGF0ZW1lbnRfaWRcXGAgcmV0dXJuZWQgZnJvbVxuICAgICAgXFxgYXNrX2dlbmllXFxgKS4gVXNlIHRoaXMgT05MWSB3aGVuIHlvdSBuZWVkIHRvIHJlYWQgdGhlIHVuZGVybHlpbmdcbiAgICAgIHZhbHVlcyB0byByZWFzb24gYWJvdXQgdGhlbSBpbiB5b3VyIHJlcGx5IC0gZS5nLiBuYW1pbmcgdGhlXG4gICAgICBsYXJnZXN0IHJvdywgY29tcHV0aW5nIGEgZGVsdGEgdGhlIHZpc3VhbGl6YXRpb24gd291bGRuJ3QgYWxyZWFkeVxuICAgICAgY29udmV5LCBvciBmaWx0ZXJpbmcgZG93biB0byBhIHNwZWNpZmljIHJlY29yZC4gSWYgeW91J2QganVzdCBiZVxuICAgICAgcmVjaXRpbmcgbnVtYmVycyB0aGUgdXNlciB3aWxsIHNlZSBhbnl3YXksIHNraXAgdGhlIGNhbGwgYW5kXG4gICAgICBlbWJlZCBhIFxcYFtkYXRhOjxzdGF0ZW1lbnRfaWQ+XVxcYCBtYXJrZXIgaW4geW91ciBwcm9zZSBpbnN0ZWFkO1xuICAgICAgdGhlIGhvc3QgVUkgZmV0Y2hlcyBhbmQgcmVuZGVycyB0aGUgcm93cyBvbiBpdHMgb3duLiBcXGBsaW1pdFxcYFxuICAgICAgY2FwcyB0aGUgbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWQgKGRlZmF1bHRzIHRvXG4gICAgICAke0RFRkFVTFRfU1RBVEVNRU5UX0xJTUlUfSkuIFxcYHJvd0NvdW50XFxgIHJlZmxlY3RzIHRoZSBmdWxsXG4gICAgICB1cHN0cmVhbSB0b3RhbCAtIGNvbXBhcmUgdG8gXFxgcm93cy5sZW5ndGhcXGAgdG8gZGV0ZWN0IHRydW5jYXRpb24uXG4gICAgYCksXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHN0YXRlbWVudF9pZDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm1pbigxLCBcInN0YXRlbWVudF9pZCBpcyByZXF1aXJlZFwiKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBHZW5pZSBcXGBzdGF0ZW1lbnRfaWRcXGAgd2hvc2Ugcm93cyB0byByZWFkLiBUYWtlIGl0IGZyb21cbiAgICAgICAgICAgIFxcYG1lc3NhZ2UucXVlcnlfcmVzdWx0LnN0YXRlbWVudF9pZFxcYCBvclxuICAgICAgICAgICAgXFxgbWVzc2FnZS5hdHRhY2htZW50c1sqXS5xdWVyeS5zdGF0ZW1lbnRfaWRcXGAgb24gYW5cbiAgICAgICAgICAgIFxcYGFza19nZW5pZVxcYCByZXN1bHQ7IGl0IGlzIG5ldmVyIGEgdmFsdWUgeW91IGNvbnN0cnVjdC5cbiAgICAgICAgICBgKSxcbiAgICAgICAgKSxcbiAgICAgIGxpbWl0OiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAuaW50KClcbiAgICAgICAgLm5vbm5lZ2F0aXZlKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiTWF4IHJvd3MgdG8gcmV0dXJuLiBEZWZhdWx0cyB0byBhIHNtYWxsIHNhbXBsZTsgcmFpc2Ugb25seSB3aGVuIG1vcmUgcm93cyBhcmUgZ2VudWluZWx5IG5lZWRlZC5cIixcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGNvbHVtbnM6IHouYXJyYXkoei5zdHJpbmcoKSksXG4gICAgICByb3dzOiB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKSksXG4gICAgICByb3dDb3VudDogei5udW1iZXIoKSxcbiAgICAgIHRydW5jYXRlZDogei5ib29sZWFuKCksXG4gICAgfSksXG4gICAgZXhlY3V0ZTogYXN5bmMgKHsgc3RhdGVtZW50X2lkLCBsaW1pdCB9LCBjdHhSYXcpID0+IHtcbiAgICAgIGNvbnN0IGN0eCA9IGN0eFJhdyBhcyBUb29sRXhlY3V0ZUN0eDtcbiAgICAgIGNvbnN0IHsgY2xpZW50IH0gPSByZXF1aXJlQ2xpZW50KGN0eCwgdG9vbElkKTtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGN0eD8uYWJvcnRTaWduYWw7XG4gICAgICBjb25zdCBlZmZlY3RpdmVMaW1pdCA9IGxpbWl0ID8/IERFRkFVTFRfU1RBVEVNRU5UX0xJTUlUO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGZldGNoU3RhdGVtZW50RGF0YShjbGllbnQsIHN0YXRlbWVudF9pZCwge1xuICAgICAgICBsaW1pdDogZWZmZWN0aXZlTGltaXQsXG4gICAgICAgIC4uLihzaWduYWwgPyB7IHNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2x1bW5zOiBkYXRhLmNvbHVtbnMsXG4gICAgICAgIHJvd3M6IGRhdGEucm93cyxcbiAgICAgICAgcm93Q291bnQ6IGRhdGEucm93Q291bnQsXG4gICAgICAgIHRydW5jYXRlZDogZGF0YS5yb3dzLmxlbmd0aCA8IGRhdGEucm93Q291bnQsXG4gICAgICB9O1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIGBwcmVwYXJlX2NoYXJ0YCBNYXN0cmEgdG9vbC4gVGhpbiB3cmFwcGVyIG92ZXJcbiAqIHtAbGluayBwcmVwYXJlQ2hhcnR9IHRoYXQgcmVzb2x2ZXMgdGhlIGRhdGFzZXQgYnkgZmV0Y2hpbmcgdGhlXG4gKiBHZW5pZSBzdGF0ZW1lbnQncyByb3dzIG9uIGRlbWFuZC4gVGhlIHRvb2wgbWludHMgYSBgY2hhcnRJZGBcbiAqIHN5bmNocm9ub3VzbHksIGNhY2hlcyBhbiBlbXB0eSBwbGFjZWhvbGRlciwgYW5kIGtpY2tzIG9mZiB0aGVcbiAqIHBsYW5uZXIgaW4gdGhlIGJhY2tncm91bmQgc28gdGhlIGFnZW50IGxvb3AgbmV2ZXIgYmxvY2tzLiBUaGUgcmVzdWx0IGNhcnJpZXNcbiAqIHRoZSBjb21wbGV0ZSBtYXJrZXIgdG8gY29weTsgdGhlIGhvc3QgVUkgcmVzb2x2ZXMgaXQgYnkgcmVhZGluZyB0aGUgY2FjaGVkXG4gKiB7QGxpbmsgQ2hhcnR9IGVudHJ5ICgxaCBUVEwpLlxuICpcbiAqIFNwYWNlLWFnbm9zdGljOiBhIEdlbmllIGBzdGF0ZW1lbnRfaWRgIGlzIHdvcmtzcGFjZS1zY29wZWQsIHNvXG4gKiBvbmUgc2hhcmVkIGBwcmVwYXJlX2NoYXJ0YCB0b29sIGNvdmVycyBldmVyeSB3aXJlZCBHZW5pZSBzcGFjZS5cbiAqXG4gKiBDYW5jZWxsYXRpb246IGRlbGliZXJhdGVseSBkb2VzIE5PVCBmb3J3YXJkIHRoZSBwZXItY2FsbFxuICogYGFib3J0U2lnbmFsYCB0byB7QGxpbmsgcHJlcGFyZUNoYXJ0fS4gVGhlIHBsYW5uZXIgdGFzayBpc1xuICogZmlyZS1hbmQtZm9yZ2V0IGJhY2tncm91bmQgd29yazsgdGhlIHRvb2wncyBvd24gYGV4ZWN1dGVgXG4gKiByZXNvbHZlcyB0aGUgbW9tZW50IHRoZSBgY2hhcnRJZGAgaXMgbWludGVkLCBzbyB0aGUgcGVyLWNhbGxcbiAqIHNpZ25hbCBhYm9ydHMgdGhlIHNlY29uZCB0aGUgdG9vbCByZXR1cm5zLiBUaGUgMWggY2FjaGUgVFRMXG4gKiBjYXBzIGFiYW5kb25lZCBlbnRyaWVzLlxuICovXG5mdW5jdGlvbiBidWlsZFByZXBhcmVDaGFydFRvb2wob3B0czogeyBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyB9KSB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBvcHRzO1xuICBjb25zdCB0b29sSWQgPSBcInByZXBhcmVfY2hhcnRcIjtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiB0b29sSWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oW1xuICAgICAgYFxuICAgICAgICBRdWV1ZSBhIGNoYXJ0IGZvciB0aGUgcm93cyBvZiBhIEdlbmllIHN0YXRlbWVudC4gTWludHMgYVxuICAgICAgICBcXGBjaGFydElkXFxgIHBsdXMgaXRzIGNvbXBsZXRlIFxcYG1hcmtlclxcYCBzeW5jaHJvbm91c2x5IGFuZFxuICAgICAgICBraWNrcyBvZmYgYSBCQUNLR1JPVU5EXG4gICAgICAgIHRhc2sgdGhhdCBmZXRjaGVzIHRoZSBzdGF0ZW1lbnQncyByb3dzLCBydW5zIHRoZVxuICAgICAgICBjaGFydC1wbGFubmVyIHRvIHBpY2sgYSBjaGFydCB0eXBlIGFuZCBFY2hhcnRzIHNwZWMsIGFuZFxuICAgICAgICBjYWNoZXMgdGhlIHJlc3VsdCB1bmRlciB0aGUgXFxgY2hhcnRJZFxcYCBmb3Igb25lIGhvdXIuIFRoZVxuICAgICAgICBob3N0IFVJIGZldGNoZXMgdGhlIGNhY2hlZCBjaGFydCBvbiBpdHMgb3duIG9uY2UgaXQgbGFuZHMuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBUbyBkaXNwbGF5IHRoZSBjaGFydCBpbiB5b3VyIHJlcGx5LCBjb3B5IHRoZSByZXR1cm5lZFxuICAgICAgICBcXGBtYXJrZXJcXGAgVkVSQkFUSU0gb250byBpdHMgb3duIGxpbmUgYXQgdGhlIHBvc2l0aW9uIHlvdVxuICAgICAgICB3YW50IGl0IHRvIGFwcGVhci4gTmV2ZXIgY29uc3RydWN0LCBhbHRlciwgb3IgaW52ZW50IGFcbiAgICAgICAgbWFya2VyIGZyb20gXFxgY2hhcnRJZFxcYCAoYW5kIG5ldmVyIHVzZSB0aGUgXFxgc3RhdGVtZW50X2lkXFxgXG4gICAgICAgIG9yIGFueSB2YXJpYXRpb24gb2YgaXQpIC0gb25seSB0aGUgY29tcGxldGUgdmFsdWUgcmV0dXJuZWRcbiAgICAgICAgYnkgdGhpcyB0b29sIHJlc29sdmVzIHRvIGEgcmVhbCBjaGFydC4gVGhlIHRvb2wgcmV0dXJuc1xuICAgICAgICBpbW1lZGlhdGVseSAtIGRvIE5PVCB3YWl0IG9yIGNhbGwgaXQgYWdhaW4gdG9cbiAgICAgICAgXCJjaGVjayBwcm9ncmVzc1wiOyB0aGUgY2hhcnQgcmVzb2x2ZXMgYXN5bmNocm9ub3VzbHkgb24gdGhlXG4gICAgICAgIGhvc3QgVUkncyBzaWRlLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgVXNlIHRoaXMgb25seSB3aGVuIHRoZSBkYXRhIGhhcyBhIHN0b3J5IGEgY2hhcnQgY29udmV5c1xuICAgICAgICBiZXR0ZXIgdGhhbiBhIHRhYmxlICh0cmVuZHMsIHJhbmtpbmdzLCBkaXN0cmlidXRpb25zLFxuICAgICAgICBwYXJ0cy1vZi1hLXdob2xlKS4gRm9yIHJhdyByb3dzLCBlbWJlZFxuICAgICAgICBcXGBbZGF0YTo8c3RhdGVtZW50X2lkPl1cXGAgaW5zdGVhZCBhbmQgc2tpcCB0aGlzIHRvb2wuXG4gICAgICBgLFxuICAgIF0pLFxuICAgIGlucHV0U2NoZW1hOiBwcmVwYXJlQ2hhcnRSZXF1ZXN0U2NoZW1hLFxuICAgIG91dHB1dFNjaGVtYTogY2hhcnRUb29sT3V0cHV0U2NoZW1hLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChyZXF1ZXN0LCBjdHhSYXcpID0+IHtcbiAgICAgIGNvbnN0IGN0eCA9IGN0eFJhdyBhcyBUb29sRXhlY3V0ZUN0eDtcbiAgICAgIGNvbnN0IHsgY2xpZW50LCByZXF1ZXN0Q29udGV4dCB9ID0gcmVxdWlyZUNsaWVudChjdHgsIHRvb2xJZCk7XG4gICAgICByZXR1cm4gcHJlcGFyZUNoYXJ0KHtcbiAgICAgICAgY29uZmlnLFxuICAgICAgICB1c2VyS2V5OiByZXNvbHZlVXNlcktleShyZXF1ZXN0Q29udGV4dCksXG4gICAgICAgIC4uLihyZXF1ZXN0LnRpdGxlID8geyB0aXRsZTogcmVxdWVzdC50aXRsZSB9IDoge30pLFxuICAgICAgICAuLi4ocmVxdWVzdC5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IHJlcXVlc3QuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgICAgcmVzb2x2ZURhdGE6ICh0YXNrU2lnbmFsKSA9PlxuICAgICAgICAgIGZldGNoU3RhdGVtZW50RGF0YShjbGllbnQsIHJlcXVlc3Quc3RhdGVtZW50X2lkLCB7XG4gICAgICAgICAgICAuLi4odGFza1NpZ25hbCA/IHsgc2lnbmFsOiB0YXNrU2lnbmFsIH0gOiB7fSksXG4gICAgICAgICAgfSksXG4gICAgICAgIC4uLihjdHg/LnJlcXVlc3RDb250ZXh0ID8geyByZXF1ZXN0Q29udGV4dDogY3R4LnJlcXVlc3RDb250ZXh0IH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG9yY2hlc3RyYXRpb24gcHJvbXB0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFN1Z2dlc3RlZCBvcmNoZXN0cmF0aW9uIHByb21wdCBmb3IgdGhlIGNlbnRyYWwgYWdlbnQgdGhhdCBvd25zXG4gKiB0aGUgR2VuaWUgdG9vbHMuIENvbXBvc2UgaW50byB5b3VyIGFnZW50J3MgYGluc3RydWN0aW9uc2AgdG9cbiAqIGdldCB0aGUgY2Fub25pY2FsIFwiZGVjb21wb3NlIHF1ZXN0aW9ucywgYXNrIEdlbmllIGZvY3VzZWRcbiAqIHN1Yi1xdWVzdGlvbnMsIHBsYWNlIGRhdGEgLyBjaGFydCBtYXJrZXJzIGluIHByb3NlXCIgYmVoYXZpb3I6XG4gKlxuICogYGBgdHNcbiAqIGNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBgJHtteUFnZW50SW5zdHJ1Y3Rpb25zfVxcblxcbiR7R0VOSUVfSU5TVFJVQ1RJT05TfWAsXG4gKiAgIGFzeW5jIHRvb2xzKHBsdWdpbnMpIHtcbiAqICAgICByZXR1cm4geyAuLi4oYXdhaXQgcGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpKSB9O1xuICogICB9LFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBUaGUgcHJvbXB0IHJlZmVyZW5jZXMgdGhlIGJhcmUgdG9vbCBuYW1lcyAoYGFza19nZW5pZWAsXG4gKiBgZ2V0X3NwYWNlX2Rlc2NyaXB0aW9uYCwgYGdldF9zcGFjZV9zZXJpYWxpemVkYCxcbiAqIGBnZXRfc3RhdGVtZW50YCwgYHByZXBhcmVfY2hhcnRgKSB1c2VkIGZvciB0aGUgc2luZ2xlLXNwYWNlXG4gKiBkZWZhdWx0IGFsaWFzLiBNdWx0aS1zcGFjZSBkZXBsb3ltZW50cyBzaG91bGQgd3JpdGUgdGhlaXIgb3duXG4gKiB2YXJpYW50IHRoYXQgbmFtZXMgdGhlIHN1ZmZpeGVkIHBlci1zcGFjZSB0b29sc1xuICogKGUuZy4gYGFza19nZW5pZV9zYWxlc2ApLlxuICovXG5leHBvcnQgY29uc3QgR0VOSUVfSU5TVFJVQ1RJT05TID0gc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihbXG4gIFwiR2VuaWUgb3JjaGVzdHJhdGlvbi4gRm9yIGV2ZXJ5IHVzZXIgcXVlc3Rpb24gdGhhdCBuZWVkcyBTUUwtYmFja2VkIGRhdGE6XCIsXG4gIHtcbiAgICBudW1iZXJlZDogW1xuICAgICAgYFxuICAgICAgICBTdGFydCBieSBjYWxsaW5nIFxcYGdldF9zcGFjZV9kZXNjcmlwdGlvblxcYCB0byBncm91bmQgeW91cnNlbGZcbiAgICAgICAgaW4gd2hhdCB0aGUgc3BhY2UgY292ZXJzICh0YWJsZXMsIG1ldHJpY3MsIHRpbWUgd2luZG93cyksXG4gICAgICAgIHVubGVzcyB5b3UgYWxyZWFkeSBzYXcgdGhlIHNhbWUgZGVzY3JpcHRpb24gZWFybGllciBpbiB0aGlzXG4gICAgICAgIGNvbnZlcnNhdGlvbi4gUmVhY2ggZm9yIFxcYGdldF9zcGFjZV9zZXJpYWxpemVkXFxgIG9ubHkgd2hlbiB5b3VcbiAgICAgICAgbmVlZCBleGFjdCBjb2x1bW4gLyB0YWJsZSBpZGVudGlmaWVycyB0aGUgZGVzY3JpcHRpb24gZG9lc24ndFxuICAgICAgICBleHBvc2UgLSBpdCdzIGEgbXVjaCBsYXJnZXIgcGF5bG9hZC5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIERlY29tcG9zZSB0aGUgdXNlcidzIHF1ZXN0aW9uIGludG8gZm9jdXNlZCBzdWItcXVlc3Rpb25zXG4gICAgICAgIEJFRk9SRSBhc2tpbmcgR2VuaWUgYW55dGhpbmcuIE9uZSBzdWItcXVlc3Rpb24gcGVyIGRpc3RpbmN0XG4gICAgICAgIG1ldHJpYywgZGltZW5zaW9uLCBvciB0aW1lIHdpbmRvdy4gVGhlbiBjYWxsIFxcYGFza19nZW5pZVxcYFxuICAgICAgICBvbmNlIHBlciBzdWItcXVlc3Rpb24gLSB1c3VhbGx5IHR3byB0byBzaXggY2FsbHMgcGVyIHR1cm4uXG4gICAgICAgIElzc3VlIGluZGVwZW5kZW50IGNhbGxzIGluIHBhcmFsbGVsIHRvIHJlZHVjZSBsYXRlbmN5LiBLZWVwXG4gICAgICAgIGRlcGVuZGVudCBjYWxscyBzZXF1ZW50aWFsIHdoZW4gYW4gZWFybGllciBhbnN3ZXIgZGV0ZXJtaW5lc1xuICAgICAgICB0aGUgbmV4dCBxdWVzdGlvbi4gUGFyYWxsZWwgY2FsbHMgdXNlIGlzb2xhdGVkIEdlbmllXG4gICAgICAgIGNvbnZlcnNhdGlvbnM7IHNlcXVlbnRpYWwgY2FsbHMgcmV0YWluIGNvbnZlcnNhdGlvbiBjb250ZXh0LlxuICAgICAgICBDcmFtbWluZyBhIG11bHRpLXBhcnQgcXVlc3Rpb24gaW50byBvbmUgXFxgYXNrX2dlbmllXFxgIGNhbGxcbiAgICAgICAgYWxtb3N0IGFsd2F5cyBwcm9kdWNlcyBhIHdvcnNlIGFuc3dlciB0aGFuIGFza2luZyB0aGUgcGllY2VzXG4gICAgICAgIHNlcGFyYXRlbHkuIE9ubHkgY29sbGFwc2UgdG8gYSBzaW5nbGUgY2FsbCB3aGVuIHRoZSBxdWVzdGlvblxuICAgICAgICBpcyBnZW51aW5lbHkgYXRvbWljIChcIndoYXQgd2FzIFEzIHJldmVudWU/XCIpLlxuXG4gICAgICAgIFdvcmtlZCBleGFtcGxlOiB1c2VyIGFza3MgXCJIb3cgZGlkIFNLVSAxMjM0J3MgcmV2ZW51ZVxuICAgICAgICBjb21wYXJlIHRvIGl0cyBjYXRlZ29yeSBhdmVyYWdlIGxhc3QgcXVhcnRlciwgYW5kIHdoaWNoXG4gICAgICAgIHJlZ2lvbnMgZHJvdmUgdGhlIGdhcD9cIiBEZWNvbXBvc2VzIHRvOiAoYSkgXFxgYXNrX2dlbmllXFxgXG4gICAgICAgIGZvciBTS1UgMTIzNCdzIFEzIHJldmVudWUsIChiKSBcXGBhc2tfZ2VuaWVcXGAgZm9yIHRoZVxuICAgICAgICBjYXRlZ29yeS1hdmVyYWdlIFEzIHJldmVudWUsIChjKSBcXGBhc2tfZ2VuaWVcXGAgZm9yIFNLVVxuICAgICAgICAxMjM0J3MgUTMgcmV2ZW51ZSBzcGxpdCBieSByZWdpb24uIFRoZSBmaXJzdCB0d28gY2FsbHMgYXJlXG4gICAgICAgIGluZGVwZW5kZW50IGFuZCBjYW4gcnVuIGluIHBhcmFsbGVsOyBydW4gdGhlIHJlZ2lvbmFsIGNhbGxcbiAgICAgICAgYWZ0ZXJ3YXJkIG9ubHkgaWYgaXRzIHdvcmRpbmcgZGVwZW5kcyBvbiB0aG9zZSByZXN1bHRzLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgRWFjaCBcXGBhc2tfZ2VuaWVcXGAgY2FsbCByZXR1cm5zIHRoZSB0ZXJtaW5hbCBcXGBHZW5pZU1lc3NhZ2VcXGAuXG4gICAgICAgIFJlYWQgQWdlbnQgTW9kZSdzIHN5bnRoZXNpemVkIGFuc3dlciBhbmQgTWFya2Rvd24gcXVlcnkgb3V0cHV0XG4gICAgICAgIGRpcmVjdGx5IGZyb20gaXRzIHRleHQgYXR0YWNobWVudHMuIEFnZW50IE1vZGUgZG9lcyBOT1QgZXhwb3NlIGFcbiAgICAgICAgXFxgc3RhdGVtZW50X2lkXFxgLiBUbyBjaGFydCBpdHMgcmVzdWx0LCBjYWxsIFxcYHJlbmRlcl9kYXRhXFxgIHdpdGhcbiAgICAgICAgcm93cyBjb3BpZWQgZnJvbSB0aGUgTWFya2Rvd24gdGFibGUgb3Igc3RydWN0dXJlZCB0YWJsZSBtZXRhZGF0YSxcbiAgICAgICAgdGhlbiBjb3B5IHRoZSByZXR1cm5lZCBtYXJrZXIuIE5ldmVyIHBhc3MgYW4gQWdlbnQgTW9kZSByZXNwb25zZSBpZCxcbiAgICAgICAgY29udmVyc2F0aW9uIGlkLCBmdW5jdGlvbi1jYWxsIGlkLCBvciBhbnkgb3RoZXIgaWRlbnRpZmllciB0b1xuICAgICAgICBcXGBwcmVwYXJlX2NoYXJ0XFxgLlxuXG4gICAgICAgIEEgbGVnYWN5IHBvbGxpbmcgcmVzdWx0IG1heSBpbnN0ZWFkIGV4cG9zZSBhIFxcYHN0YXRlbWVudF9pZFxcYCBhdFxuICAgICAgICBcXGBtZXNzYWdlLnF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRcXGAgKG9yIHRoZSBmaXJzdFxuICAgICAgICBhdHRhY2htZW50J3MgXFxgcXVlcnkuc3RhdGVtZW50X2lkXFxgKS4gT25seSB0aGF0IHJlYWwgc3RhdGVtZW50IGlkXG4gICAgICAgIGJlbG9uZ3MgaW4gXFxgcHJlcGFyZV9jaGFydFxcYCBvciBhIFxcYFtkYXRhOjxzdGF0ZW1lbnRfaWQ+XVxcYCBtYXJrZXIuXG4gICAgICBgLFxuICAgICAgW1xuICAgICAgICBgXG4gICAgICAgICAgVG8gRElTUExBWSBhIHJlc3VsdCBzZXQgaW4geW91ciByZXBseSwgZW1iZWQgYSBtYXJrZXIgb24gaXRzXG4gICAgICAgICAgb3duIGxpbmUgd2hlcmUgdGhlIHZpc3VhbGl6YXRpb24gc2hvdWxkIGFwcGVhci4gVHdvIG1hcmtlclxuICAgICAgICAgIHNoYXBlczpcbiAgICAgICAgYCxcbiAgICAgICAge1xuICAgICAgICAgIGJ1bGxldHM6IFtcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgICAgXFxgW2RhdGE6PHN0YXRlbWVudF9pZD5dXFxgIC0gcmVuZGVyIGxlZ2FjeSBwb2xsaW5nIHJvd3MgYXMgYSB0YWJsZS5cbiAgICAgICAgICAgICAgVXNlIHRoaXMgd2hlbiB0aGVyZSdzIG5vIGNsZWFyIHZpc3VhbCBzdG9yeSAobG9uZyBsaXN0cyxcbiAgICAgICAgICAgICAgcmVmZXJlbmNlIGRhdGEsIHNpbmdsZS1yb3cgcmVzdWx0cywgb3IgdGhlIHVzZXIganVzdFxuICAgICAgICAgICAgICB3YW50cyB0byBzZWUgdGhlIGRhdGEpLiBFbWJlZCB0aGUgbWFya2VyIGRpcmVjdGx5IHdoZW5cbiAgICAgICAgICAgICAgXFxgYXNrX2dlbmllXFxgIHJldHVybmVkIGEgcmVhbCBcXGBzdGF0ZW1lbnRfaWRcXGA7IEFnZW50IE1vZGVcbiAgICAgICAgICAgICAgYWxyZWFkeSBjYXJyaWVzIGl0cyBxdWVyeSBvdXRwdXQgaW5saW5lLlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgICAgXFxgW2NoYXJ0OjxjaGFydElkPl1cXGAgLSByZW5kZXIgdGhlIHJvd3MgYXMgYSBjaGFydC4gVG9cbiAgICAgICAgICAgICAgZ2V0IG9uZSBmcm9tIEFnZW50IE1vZGUsIGNhbGwgXFxgcmVuZGVyX2RhdGFcXGAgd2l0aCB0aGVcbiAgICAgICAgICAgICAgaW5saW5lIHJvd3MuIFRvIGdldCBvbmUgZnJvbSBsZWdhY3kgcG9sbGluZywgY2FsbFxuICAgICAgICAgICAgICBcXGBwcmVwYXJlX2NoYXJ0XFxgIHdpdGggdGhlIHJlYWwgc3RhdGVtZW50IGlkLiBCb3RoIHRvb2xzXG4gICAgICAgICAgICAgIGFjY2VwdCBhbiBvcHRpb25hbCBcXGB0aXRsZVxcYCAvIG9uZS1saW5lIFxcYGRlc2NyaXB0aW9uXFxgXG4gICAgICAgICAgICAgIG9mIHRoZSBpbnNpZ2h0IHRvIHN1cmZhY2UsIHJldHVybiB0aGUgY29tcGxldGUgXFxgbWFya2VyXFxgXG4gICAgICAgICAgICAgIHN5bmNocm9ub3VzbHksIGFuZCBwcmVwYXJlIHRoZSBjaGFydCBzcGVjIGluIHRoZVxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kLiBDb3B5IHRoYXQgbWFya2VyIFZFUkJBVElNIG9udG8gaXRzIG93biBsaW5lXG4gICAgICAgICAgICAgIHdoZXJldmVyIHRoZSBjaGFydCBzaG91bGQgYXBwZWFyLiBVc2UgYSBjaGFydCB3aGVuIHRoZVxuICAgICAgICAgICAgICBkYXRhIGhhcyBhIHN0b3J5IGEgdmlzdWFsIGNvbnZleXMgYmV0dGVyIHRoYW4gYSB0YWJsZVxuICAgICAgICAgICAgICAodHJlbmRzLCByYW5raW5ncywgZGlzdHJpYnV0aW9ucywgcGFydHMtb2YtYS13aG9sZSkuXG5cbiAgICAgICAgICAgICAgTkVWRVIgaW52ZW50IG9yIGhhbmQtYnVpbGQgYSBtYXJrZXIuIEEgdmFsaWQgbWFya2VyIGlzXG4gICAgICAgICAgICAgIHRoZSBjb21wbGV0ZSBvcGFxdWUgc3RyaW5nIGEgXFxgcmVuZGVyX2RhdGFcXGAgb3JcbiAgICAgICAgICAgICAgXFxgcHJlcGFyZV9jaGFydFxcYCBjYWxsIHJldHVybmVkIHRvIHlvdSBpbiBUSElTIHR1cm4gLVxuICAgICAgICAgICAgICBub3RoaW5nIGVsc2UuIEl0cyBpZCBpcyBOT1QgYSBcXGBzdGF0ZW1lbnRfaWRcXGAsIGFuZCBpdCBpcyBOT1QgYVxuICAgICAgICAgICAgICBcXGBzdGF0ZW1lbnRfaWRcXGAgcHJlZml4IHdpdGggYSBsYWJlbCBhcHBlbmRlZCAoZS5nLlxuICAgICAgICAgICAgICBcXGAwMWYxLi4uLXJlZ2lvbi1maWxsXFxgKS4gSWYgeW91IGhhdmUgbm90IGNhbGxlZFxuICAgICAgICAgICAgICBvbmUgb2YgdGhvc2UgY2hhcnQgdG9vbHMgYW5kIHJlY2VpdmVkIGFuIGlkIGJhY2ssIGRvIG5vdFxuICAgICAgICAgICAgICB3cml0ZSBhIFxcYFtjaGFydDouLi5dXFxgIG1hcmtlciBhdCBhbGwuIEEgZmFicmljYXRlZCBjaGFydFxuICAgICAgICAgICAgICBpZCByZW5kZXJzIG5vdGhpbmcgYW5kIHdhc3RlcyBhIHJlcXVlc3QuXG4gICAgICAgICAgICBgLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGBcbiAgICAgICAgICBUaGUgaG9zdCBVSSByZXNvbHZlcyBib3RoIG1hcmtlcnMgb24gaXRzIG93biBvbmNlIGl0IHNlZXNcbiAgICAgICAgICB0aGVtIC0geW91IGRvIE5PVCBuZWVkIHRvIGNhbGwgXFxgZ2V0X3N0YXRlbWVudFxcYCBqdXN0IHRvXG4gICAgICAgICAgZGlzcGxheSBkYXRhLCBhbmQgeW91IGRvIE5PVCBuZWVkIHRvIHdhaXQgb25cbiAgICAgICAgICBcXGByZW5kZXJfZGF0YVxcYCBvciBcXGBwcmVwYXJlX2NoYXJ0XFxgICh0aGV5IHJldHVybiB0aGUgaWRcbiAgICAgICAgICBpbW1lZGlhdGVseSBhbmQgdGhlIGhvc3QgVUkgZmV0Y2hlcyB0aGUgY2FjaGVkIGNoYXJ0IGxhdGVyKS5cbiAgICAgICAgICBQaWNrIGF0IG1vc3Qgb25lIG1hcmtlciBwZXIgcmVzdWx0OyBkb24ndCBjaGFydCBBTkQgdGFibGUgdGhlXG4gICAgICAgICAgc2FtZSByZXN1bHQgc2lkZSBieSBzaWRlLlxuICAgICAgICBgLFxuICAgICAgXSxcbiAgICAgIGBcbiAgICAgICAgQ2FsbCBcXGBnZXRfc3RhdGVtZW50KHN0YXRlbWVudF9pZCwgbGltaXQ/KVxcYCBPTkxZIHdoZW4geW91IG5lZWRcbiAgICAgICAgdG8gcmVhZCB0aGUgYWN0dWFsIHZhbHVlcyB0byByZWFzb24gYWJvdXQgdGhlbSAoZS5nLiBuYW1pbmcgYVxuICAgICAgICBzcGVjaWZpYyByb3csIGNvbXB1dGluZyBhIGRlbHRhIHRoZSB0YWJsZSBvciBjaGFydCB3b3VsZG4ndFxuICAgICAgICBzaG93LCBvciBzYW5pdHktY2hlY2tpbmcgYSByZXN1bHQgYmVmb3JlIGludGVycHJldGluZyBpdCkuIElmXG4gICAgICAgIHlvdSdkIGp1c3QgYmUgcmVjaXRpbmcgbnVtYmVycyB0aGUgdmlzdWFsaXphdGlvbiBhbHJlYWR5IHNob3dzLFxuICAgICAgICBza2lwIHRoZSBjYWxsIGFuZCB1c2UgYSBtYXJrZXIgaW5zdGVhZC4gXFxgbGltaXRcXGAgZGVmYXVsdHMgdG8gYVxuICAgICAgICBzbWFsbCBzYW1wbGU7IHJhaXNlIGl0IG9ubHkgd2hlbiB5b3UgZ2VudWluZWx5IG5lZWQgbW9yZSByb3dzLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgQ29tcG9zZSB5b3VyIGZpbmFsIHJlcGx5IGFzIHBsYWluIHByb3NlLiBJbnRlcmxlYXZlIHBhcmFncmFwaHNcbiAgICAgICAgd2l0aCBcXGBbZGF0YTouLi5dXFxgIC8gXFxgW2NoYXJ0Oi4uLl1cXGAgbWFya2VycyB3aGVyZXZlciBhIHJlc3VsdFxuICAgICAgICBzaG91bGQgcmVuZGVyLiBEb24ndCBkdW1wIGFsbCBtYXJrZXJzIGF0IHRoZSBlbmQgLSBwbGFjZSBlYWNoXG4gICAgICAgIG9uZSBuZXh0IHRvIHRoZSBwcm9zZSB0aGF0IGludGVycHJldHMgaXQuIERvbid0IHJlc3RhdGUgZXZlcnlcbiAgICAgICAgbnVtYmVyIHRoZSB2aXN1YWxpemF0aW9uIGFscmVhZHkgc2hvd3M7IGNhbGwgb3V0IGRlbHRhcyxcbiAgICAgICAgYW5vbWFsaWVzLCB0YWtlYXdheXMuXG4gICAgICBgLFxuICAgIF0sXG4gIH0sXG5dKTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG11bHRpLWFsaWFzIHN1cmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogTm9ybWFsaXplIHRoZSB7QGxpbmsgR2VuaWVTcGFjZXNDb25maWd9IHJlY29yZC4gQmFyZS1zdHJpbmdcbiAqIGVudHJpZXMgKGB7IGRlZmF1bHQ6IFwiMDFlZi4uLlwiIH1gKSBnZXQgd3JhcHBlZCBhc1xuICogYHsgc3BhY2VJZDogXCIwMWVmLi4uXCIgfWA7IG9iamVjdCBlbnRyaWVzIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQuXG4gKlxuICogQHRocm93cyBDb25maWd1cmF0aW9uRXJyb3Igd2hlbiBhbiBhbGlhcyBpcyBwcmVzZW50IGJ1dCBjYXJyaWVzIG5vIHNwYWNlIGlkXG4gKiAgIChgeyBkZWZhdWx0OiBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEIH1gIHdpdGggdGhlIHZhcmlhYmxlXG4gKiAgIHVuc2V0KS4gQW4gYWxpYXMgdGhhdCByZXNvbHZlcyB0byBub3RoaW5nIGlzIGEgd2lyaW5nIGNvbnRyYWRpY3Rpb246IHRoZVxuICogICBhZ2VudCB3b3VsZCBhZHZlcnRpc2Ugbm8gR2VuaWUgdG9vbCBmb3IgYSBzcGFjZSB0aGUgZGVwbG95bWVudCBiZWxpZXZlcyBpdFxuICogICBjb25maWd1cmVkLCBzbyBpdCBmYWlscyBhdCBjb25zdHJ1Y3Rpb24gaW5zdGVhZCBvZiBnb2luZyBxdWlldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUdlbmllU3BhY2VzKFxuICBzcGFjZXM6IEdlbmllU3BhY2VzQ29uZmlnIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgR2VuaWVTcGFjZUNvbmZpZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQsXG4pOiBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnPiB7XG4gIGlmICghc3BhY2VzKSByZXR1cm4ge307XG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz4gPSB7fTtcbiAgZm9yIChjb25zdCBbYWxpYXMsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzcGFjZXMpKSB7XG4gICAgY29uc3Qgc3BhY2VJZCA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWU/LnNwYWNlSWQ7XG4gICAgaWYgKCFzcGFjZUlkKSB0aHJvdyBtaXNzaW5nU3BhY2VJZChhbGlhcyk7XG4gICAgb3V0W2FsaWFzXSA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHsgc3BhY2VJZCB9IDogdmFsdWUhO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBDb25maWcgY29udHJhZGljdGlvbjogYW4gYWxpYXMgcHJlc2VudCBpbiBgZ2VuaWVTcGFjZXNgIHdpdGggbm8gc3BhY2UgaWQuICovXG5mdW5jdGlvbiBtaXNzaW5nU3BhY2VJZChhbGlhczogc3RyaW5nKTogQ29uZmlndXJhdGlvbkVycm9yIHtcbiAgY29uc3QgZW52SGludCA9XG4gICAgYWxpYXMgPT09IERFRkFVTFRfR0VOSUVfQUxJQVNcbiAgICAgID8gXCJTZXQgREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCwgcGFzcyB0aGUgc3BhY2UgaWQgaW5saW5lLCBvciBkcm9wIHRoZSBhbGlhcy5cIlxuICAgICAgOiBgUGFzcyB0aGUgc3BhY2UgaWQgaW5saW5lIChEQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEIG9ubHkgYmFja3MgdGhlIFwiJHtERUZBVUxUX0dFTklFX0FMSUFTfVwiIGFsaWFzKSBvciBkcm9wIHRoZSBhbGlhcy5gO1xuICByZXR1cm4gQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoYGdlbmllU3BhY2VzLiR7YWxpYXN9IHNwYWNlIGlkYCwgZW52SGludCk7XG59XG5cbi8qKlxuICogQXBwS2l0IGBnZW5pZWAgcGx1Z2luJ3MgY29uZmlnIHNoYXBlLCBkZXJpdmVkIGZyb20gdGhlIGZhY3RvcnlcbiAqIGl0c2VsZiBzbyBpdCBzdGF5cyBpbiBsb2NrLXN0ZXAgd2l0aCB0aGUgdXBzdHJlYW0gdHlwZSB3aXRob3V0XG4gKiBkZWVwLWltcG9ydGluZyBgSUdlbmllQ29uZmlnYCAod2hpY2ggdGhlIHBhY2thZ2UncyB0b3AtbGV2ZWxcbiAqIGJhcnJlbCBkb2Vzbid0IHN1cmZhY2UpLiBUaGUgcGx1Z2luJ3MgYGNvbmZpZ2AgZmllbGQgaXNcbiAqIGBwcm90ZWN0ZWRgIGluIFRTIG9ubHk7IHRoZSBydW50aW1lIGxheW91dCBpcyBwbGFpbiBvYmplY3RcbiAqIHByb3BlcnR5IGFjY2Vzcywgc28gcmVhZGluZyBvZmYgdGhlIGluc3RhbmNlIHdpdGggYSBzdHJ1Y3R1cmFsXG4gKiBjYXN0IGlzIHNhZmUuXG4gKi9cbnR5cGUgQXBwS2l0R2VuaWVDb25maWcgPSBOb25OdWxsYWJsZTxQYXJhbWV0ZXJzPHR5cGVvZiBnZW5pZT5bMF0+O1xuXG4vKipcbiAqIERpc2NvdmVyIEdlbmllIHNwYWNlIGFsaWFzZXMgZnJvbSBldmVyeSBzdXBwb3J0ZWQgc291cmNlIGFuZFxuICogbWVyZ2UgdGhlbSBpbnRvIGEgc2luZ2xlIHJlY29yZC4gUHJlY2VkZW5jZSAoaGlnaGVzdCBmaXJzdCk6XG4gKlxuICogICAxLiB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLmdlbmllU3BhY2VzfSBvbiB0aGUgYG1hc3RyYSguLi4pYFxuICogICAgICBjYWxsLiBFeHBsaWNpdCBNYXN0cmEgd2lyaW5nIGFsd2F5cyB3aW5zIHNvIHVzZXJzIGNhblxuICogICAgICBvdmVycmlkZSBBcHBLaXQncyBkZWZhdWx0cyBwZXItYWdlbnQuXG4gKiAgIDIuIEFwcEtpdCBgZ2VuaWUoeyBzcGFjZXM6IHsgLi4uIH0gfSlgIHBsdWdpbiBpbnN0YW5jZS4gTGV0c1xuICogICAgICB1c2VycyBrZWVwIHVzaW5nIHRoZSBleGlzdGluZyBBcHBLaXQgY29uZmlnIGZvcm1hdFxuICogICAgICAoYGdlbmllKHsgc3BhY2VzOiB7IHNhbGVzOiBcIi4uLlwiLCBvcHM6IFwiLi4uXCIgfSB9KWApXG4gKiAgICAgIHdpdGhvdXQgcmVzdGF0aW5nIHRoZSBzYW1lIHJlY29yZCBvbiB0aGUgTWFzdHJhIHBsdWdpbi5cbiAqICAgICAgUmVhZCBvZmYgdGhlIGxpdmUgcGx1Z2luIGluc3RhbmNlIHZpYSBhIHN0cnVjdHVyYWwgY2FzdFxuICogICAgICBzaW5jZSBgUGx1Z2luLmNvbmZpZ2AgaXMgVFMtcHJvdGVjdGVkIChub3QgcnVudGltZS1wcml2YXRlKS5cbiAqICAgMy4gYERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSURgIGVudiB2YXIgKHJlZ2lzdGVyZWQgdW5kZXIgdGhlXG4gKiAgICAgIHdlbGwta25vd24gYGRlZmF1bHRgIGFsaWFzKS4gTWF0Y2hlcyB0aGUgQXBwS2l0IGBnZW5pZSgpYFxuICogICAgICBwbHVnaW4ncyBmYWxsYmFjayBiZWhhdmlvciBzbyBhIGJhcmUgYG1hc3RyYSgpYCArIGBnZW5pZSgpYFxuICogICAgICBwYWlyIGp1c3Qgd29ya3MuXG4gKlxuICogQWxpYXNlcyBjb2xsaWRlIGNsZWFubHk6IGEgaGlnaGVyLXByZWNlZGVuY2Ugc291cmNlJ3MgdmFsdWVcbiAqIHJlcGxhY2VzIGEgbG93ZXIgb25lJ3Mgd2hvbGVzYWxlLiBBIHNvdXJjZSB0aGF0IGNvbnRyaWJ1dGVzIHplcm9cbiAqIGFsaWFzZXMgaXMgc2tpcHBlZDsgYSBzb3VyY2UgdGhhdCBuYW1lcyBhbiBhbGlhcyB3aXRob3V0IGEgc3BhY2VcbiAqIGlkIGZhaWxzIHRocm91Z2gge0BsaW5rIG5vcm1hbGl6ZUdlbmllU3BhY2VzfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVHZW5pZVNwYWNlcyhcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGNvbnRleHQ6IHBsdWdpblJlZ2lzdHJ5LlBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkLFxuKTogUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz4ge1xuICBjb25zdCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIEdlbmllU3BhY2VDb25maWc+ID0ge307XG5cbiAgLy8gU291cmNlIDMgKGxvd2VzdCBwcmVjZWRlbmNlKTogZW52IHZhci5cbiAgY29uc3QgZW52U3BhY2VJZCA9IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSUQ7XG4gIGlmIChlbnZTcGFjZUlkKSB7XG4gICAgbWVyZ2VkW0RFRkFVTFRfR0VOSUVfQUxJQVNdID0geyBzcGFjZUlkOiBlbnZTcGFjZUlkIH07XG4gIH1cblxuICAvLyBTb3VyY2UgMjogQXBwS2l0IGBnZW5pZSgpYCBwbHVnaW4gaW5zdGFuY2UgY29uZmlnLiBVc2UgYVxuICAvLyBzdHJ1Y3R1cmFsIGNhc3QgLSBgUGx1Z2luLmNvbmZpZ2AgaXMgYHByb3RlY3RlZGAgaW4gVFMgb25seSxcbiAgLy8gYW5kIHRoZSBydW50aW1lIGxheW91dCBpcyBwbGFpbiBvYmplY3QgcHJvcGVydHkgYWNjZXNzLlxuICBjb25zdCBnZW5pZVBsdWdpbiA9IHBsdWdpblJlZ2lzdHJ5Lmluc3RhbmNlKGNvbnRleHQsIGdlbmllKTtcbiAgaWYgKGdlbmllUGx1Z2luKSB7XG4gICAgY29uc3QgcGx1Z2luU3BhY2VzID0gKGdlbmllUGx1Z2luIGFzIHVua25vd24gYXMgeyBjb25maWc/OiBBcHBLaXRHZW5pZUNvbmZpZyB9KS5jb25maWc/LnNwYWNlcztcbiAgICBpZiAocGx1Z2luU3BhY2VzKSB7XG4gICAgICBPYmplY3QuYXNzaWduKG1lcmdlZCwgbm9ybWFsaXplR2VuaWVTcGFjZXMocGx1Z2luU3BhY2VzKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gU291cmNlIDEgKGhpZ2hlc3QgcHJlY2VkZW5jZSk6IGV4cGxpY2l0IE1hc3RyYSB3aXJpbmcuXG4gIGlmIChjb25maWcuZ2VuaWVTcGFjZXMpIHtcbiAgICBPYmplY3QuYXNzaWduKG1lcmdlZCwgbm9ybWFsaXplR2VuaWVTcGFjZXMoY29uZmlnLmdlbmllU3BhY2VzKSk7XG4gIH1cblxuICByZXR1cm4gbWVyZ2VkO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBmbGF0IE1hc3RyYSB0b29scyByZWNvcmQgZm9yIGV2ZXJ5IGNvbmZpZ3VyZWQgR2VuaWVcbiAqIHNwYWNlLiBUd28gc2hhcmVkLCBzcGFjZS1hZ25vc3RpYyB0b29scyAoYGdldF9zdGF0ZW1lbnRgLFxuICogYHByZXBhcmVfY2hhcnRgKSBhcmUgcmVnaXN0ZXJlZCBvbmNlIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnlcbiAqIHNwYWNlcyBhcmUgd2lyZWQ7IHRoZSBwZXItc3BhY2UgdG9vbHMgKGBhc2tfZ2VuaWVgLFxuICogYGdldF9zcGFjZV9kZXNjcmlwdGlvbmAsIGBnZXRfc3BhY2Vfc2VyaWFsaXplZGApIGFyZSBzdWZmaXhlZFxuICogd2l0aCBgXzxhbGlhcz5gIGZvciBub24tZGVmYXVsdCBhbGlhc2VzIHNvIG11bHRpLXNwYWNlXG4gKiBkZXBsb3ltZW50cyBzdGF5IGRpc2FtYmlndWF0ZWQuXG4gKlxuICogUmV0dXJucyBhIHJlY29yZCBrZXllZCBieSB0b29sIGlkLCByZWFkeSB0byBzcHJlYWQgaW50byB0aGVcbiAqIGNlbnRyYWwgYEFnZW50YCdzIGB0b29sc2AgbWFwIChvciBzdXJmYWNlZCB2aWEgdGhlXG4gKiBgcGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpYCBjYWxsYmFjaykuIFJldHVybnMgYW4gZW1wdHkgcmVjb3JkXG4gKiB3aGVuIGBzcGFjZXNgIHJlc29sdmVzIHRvIHplcm8gZW50cmllcyBzbyB0aGUgY2FsbGVyIGNhbiBzcHJlYWRcbiAqIHNhZmVseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkR2VuaWVUb29scyhvcHRzOiB7XG4gIHNwYWNlczogR2VuaWVTcGFjZXNDb25maWcgfCBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnPjtcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWc7XG59KTogTWFzdHJhVG9vbHMge1xuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplR2VuaWVTcGFjZXMob3B0cy5zcGFjZXMpO1xuICBjb25zdCB0b29sczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlVG9vbD4+ID0ge307XG4gIGlmIChPYmplY3Qua2V5cyhub3JtYWxpemVkKS5sZW5ndGggPT09IDApIHJldHVybiB0b29scztcblxuICAvLyBTaGFyZWQsIHNwYWNlLWFnbm9zdGljIHRvb2xzLlxuICB0b29scy5nZXRfc3RhdGVtZW50ID0gYnVpbGRHZXRTdGF0ZW1lbnRUb29sKCk7XG4gIHRvb2xzLnByZXBhcmVfY2hhcnQgPSBidWlsZFByZXBhcmVDaGFydFRvb2woeyBjb25maWc6IG9wdHMuY29uZmlnIH0pO1xuXG4gIGZvciAoY29uc3QgW2FsaWFzLCBzcGFjZV0gb2YgT2JqZWN0LmVudHJpZXMobm9ybWFsaXplZCkpIHtcbiAgICBjb25zdCBhc2tUb29sID0gYnVpbGRBc2tHZW5pZVRvb2woe1xuICAgICAgc3BhY2VJZDogc3BhY2Uuc3BhY2VJZCxcbiAgICAgIGFsaWFzLFxuICAgICAgLi4uKG9wdHMuY29uZmlnLmdlbmllQWdlbnRNb2RlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IGFnZW50TW9kZTogb3B0cy5jb25maWcuZ2VuaWVBZ2VudE1vZGUgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLihzcGFjZS5oaW50ID8geyBoaW50OiBzcGFjZS5oaW50IH0gOiB7fSksXG4gICAgfSk7XG4gICAgY29uc3QgZGVzY1Rvb2wgPSBidWlsZFNwYWNlRGVzY3JpcHRpb25Ub29sKHsgc3BhY2VJZDogc3BhY2Uuc3BhY2VJZCwgYWxpYXMgfSk7XG4gICAgY29uc3Qgc2VyVG9vbCA9IGJ1aWxkU3BhY2VTZXJpYWxpemVkVG9vbCh7IHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQsIGFsaWFzIH0pO1xuICAgIHRvb2xzW2Fza1Rvb2wuaWRdID0gYXNrVG9vbDtcbiAgICB0b29sc1tkZXNjVG9vbC5pZF0gPSBkZXNjVG9vbDtcbiAgICB0b29sc1tzZXJUb29sLmlkXSA9IHNlclRvb2w7XG4gIH1cbiAgcmV0dXJuIHRvb2xzO1xufVxuXG4vKipcbiAqIFBsdWdpbi10b29sa2l0IGFkYXB0ZXIgc28gdGhlIGBwbHVnaW5zLmdlbmllPy50b29sa2l0KClgIGxvb2t1cFxuICogaW5zaWRlIGFuIGFnZW50J3MgYHRvb2xzKHBsdWdpbnMpYCBjYWxsYmFjayByZXR1cm5zIHRoZVxuICogZmxhdCBHZW5pZSB0b29scyByZWNvcmQgaW5zdGVhZCBvZiB0aHJvd2luZyBvbiBtaXNzaW5nIHBsdWdpbi5cbiAqIE1pcnJvcnMgQXBwS2l0J3MgYFBsdWdpblRvb2xraXRQcm92aWRlcmAgc2hhcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEdlbmllVG9vbGtpdFByb3ZpZGVyKG9wdHM6IHtcbiAgc3BhY2VzOiBHZW5pZVNwYWNlc0NvbmZpZyB8IFJlY29yZDxzdHJpbmcsIEdlbmllU3BhY2VDb25maWc+O1xuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZztcbn0pOiB7XG4gIHRvb2xraXQob3B0cz86IHVua25vd24pOiBNYXN0cmFUb29scztcbn0ge1xuICByZXR1cm4ge1xuICAgIHRvb2xraXQoX29wdHM/OiB1bmtub3duKSB7XG4gICAgICByZXR1cm4gYnVpbGRHZW5pZVRvb2xzKG9wdHMpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGFydGVyIHN1Z2dlc3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIERlZmF1bHQgY2FwIG9uIHN0YXJ0ZXIgc3VnZ2VzdGlvbnMgc3VyZmFjZWQgdG8gdGhlIGNoYXQgZW1wdHlcbiAqIHN0YXRlLiBTYW1wbGUtcXVlc3Rpb24gbGlzdHMgY2FuIHJ1biBsb25nICgxMCsgb24gYSBjdXJhdGVkXG4gKiBzcGFjZSk7IGEgaGFuZGZ1bCBvZiBvbmUtdGFwIHByb21wdHMgcmVhZHMgYmV0dGVyIHRoYW4gYSB3YWxsIG9mXG4gKiBidXR0b25zLlxuICovXG5jb25zdCBTVUdHRVNUSU9OX0xJTUlUID0gNjtcblxuLyoqXG4gKiBIb3cgbG9uZyBhIHNwYWNlJ3MgcGFyc2VkIHNhbXBsZSBxdWVzdGlvbnMgc3RheSBjYWNoZWQuIFRoZXkncmVcbiAqIGF1dGhvcmVkIGNvbmZpZyB0aGF0IGNoYW5nZXMgcmFyZWx5LCBhbmQgdGhlIGxvb2t1cCBpcyBhbiBleHRyYVxuICogUkVTVCByb3VuZC10cmlwIHBlciBjaGF0IG1vdW50LCBzbyBhIGZldyBtaW51dGVzIG9mIGNhY2hpbmcga2VlcHNcbiAqIHRoZSBlbXB0eSBzdGF0ZSBpbnN0YW50IG9uIHJlbG9hZCB3aXRob3V0IGdvaW5nIHN0YWxlIGZvciBsb25nLlxuICovXG5jb25zdCBTVUdHRVNUSU9OX0NBQ0hFX1RUTF9NUyA9IDEwICogNjBfMDAwO1xuXG4vKiogQm91bmRlZCBwcm9jZXNzLWxvY2FsIGNhY2hlIG9mIHBhcnNlZCBzYW1wbGUgcXVlc3Rpb25zIGJ5IEdlbmllIHNwYWNlIGlkLiAqL1xuY29uc3QgX3N1Z2dlc3Rpb25DYWNoZSA9IGNyZWF0ZUNhY2hlKHtcbiAgbWF4RW50cmllczogMTI4LFxuICB0dGw6IFNVR0dFU1RJT05fQ0FDSEVfVFRMX01TLFxufSk7XG5cbi8qKiBSZWFkIGEgc3BhY2UncyBjYWNoZWQgcXVlc3Rpb25zLCBvciBgdW5kZWZpbmVkYCBvbiBtaXNzIC8gZXhwaXJ5LiAqL1xuZnVuY3Rpb24gcmVhZFN1Z2dlc3Rpb25DYWNoZShzcGFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB7XG4gIHJldHVybiBfc3VnZ2VzdGlvbkNhY2hlLmdldDxzdHJpbmdbXT4oc3BhY2VJZCk7XG59XG5cbi8qKiBDYWNoZSBhIHNwYWNlJ3MgcGFyc2VkIHF1ZXN0aW9ucyBmb3Ige0BsaW5rIFNVR0dFU1RJT05fQ0FDSEVfVFRMX01TfS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlU3VnZ2VzdGlvbkNhY2hlKHNwYWNlSWQ6IHN0cmluZywgcXVlc3Rpb25zOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBfc3VnZ2VzdGlvbkNhY2hlLnNldChzcGFjZUlkLCBxdWVzdGlvbnMpO1xufVxuXG4vKipcbiAqIENvbGxlY3QgdGhlIGN1cmF0ZWQgc3RhcnRlciBxdWVzdGlvbnMgYWNyb3NzIGV2ZXJ5IHJlc29sdmVkIEdlbmllXG4gKiBzcGFjZSwgZGVkdXBlZCBhbmQgY2FwcGVkLiBFYWNoIHNwYWNlJ3MgYHNhbXBsZV9xdWVzdGlvbnNgIGFyZVxuICogZmV0Y2hlZCBvbmNlIChjYWNoZWQgZm9yIHtAbGluayBTVUdHRVNUSU9OX0NBQ0hFX1RUTF9NU30pIHZpYVxuICoge0BsaW5rIGdldEdlbmllU3BhY2V9ICsge0BsaW5rIGdlbmllU2FtcGxlUXVlc3Rpb25zfSwgdGhlbiBtZXJnZWQgaW5cbiAqIGFsaWFzLWl0ZXJhdGlvbiBvcmRlciBzbyBhIHNpbmdsZS1zcGFjZSBhcHAgc3VyZmFjZXMgdGhhdCBzcGFjZSdzXG4gKiBxdWVzdGlvbnMgYW5kIGEgbXVsdGktc3BhY2UgYXBwIHJvdW5kLXRyaXBzIGJyZWFkdGgtZmlyc3QgdXAgdG8gdGhlXG4gKiBjYXAuIEEgcGVyLXNwYWNlIGZldGNoIGZhaWx1cmUgZGVncmFkZXMgdG8gXCJubyBxdWVzdGlvbnMgZm9yIHRoYXRcbiAqIHNwYWNlXCIgKGxvZ2dlZCwgbm90IHRocm93bikgc28gb25lIHVucmVhY2hhYmxlIHNwYWNlIG5ldmVyIGJsYW5rc1xuICogdGhlIHdob2xlIGxpc3QuIFJldHVybnMgYFtdYCB3aGVuIG5vIHNwYWNlcyBhcmUgY29uZmlndXJlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RTcGFjZVN1Z2dlc3Rpb25zKG9wdHM6IHtcbiAgc3BhY2VzOiBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnPjtcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQ7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBsaW1pdD86IG51bWJlcjtcbn0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGxpbWl0ID0gb3B0cy5saW1pdCA/PyBTVUdHRVNUSU9OX0xJTUlUO1xuICBjb25zdCBtZXJnZWQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHsgc3BhY2VJZCB9IG9mIE9iamVjdC52YWx1ZXMob3B0cy5zcGFjZXMpKSB7XG4gICAgbGV0IHF1ZXN0aW9ucyA9IGF3YWl0IHJlYWRTdWdnZXN0aW9uQ2FjaGUoc3BhY2VJZCk7XG4gICAgaWYgKCFxdWVzdGlvbnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNwYWNlID0gYXdhaXQgZ2VuaWVTcGFjZS5nZXRHZW5pZVNwYWNlKHNwYWNlSWQsIHtcbiAgICAgICAgICB3b3Jrc3BhY2VDbGllbnQ6IG9wdHMuY2xpZW50LFxuICAgICAgICAgIC4uLihvcHRzLnNpZ25hbCA/IHsgY29udGV4dDogb3B0cy5zaWduYWwgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHF1ZXN0aW9ucyA9IGdlbmllU3BhY2UuZ2VuaWVTYW1wbGVRdWVzdGlvbnMoc3BhY2UpO1xuICAgICAgICBhd2FpdCB3cml0ZVN1Z2dlc3Rpb25DYWNoZShzcGFjZUlkLCBxdWVzdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwic3VnZ2VzdGlvbnM6ZmV0Y2gtZXJyb3JcIiwge1xuICAgICAgICAgIHNwYWNlSWQsXG4gICAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgICBxdWVzdGlvbnMgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBxdWVzdGlvbiBvZiBxdWVzdGlvbnMpIHtcbiAgICAgIGlmIChzZWVuLmhhcyhxdWVzdGlvbikpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQocXVlc3Rpb24pO1xuICAgICAgbWVyZ2VkLnB1c2gocXVlc3Rpb24pO1xuICAgICAgaWYgKG1lcmdlZC5sZW5ndGggPj0gbGltaXQpIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZWQ7XG59XG4iXX0=
|
|
998
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuaWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuaWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DRztBQUVILE9BQU8sRUFDTCxZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxLQUFLLEVBQ0wsZUFBZSxHQUNoQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLElBQUksVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFVBQVUsRUFBcUIsTUFBTSx5QkFBeUIsQ0FBQztBQUd4RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsVUFBVSxFQUE2QixNQUFNLG9CQUFvQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFHeEIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1RixPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU5RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFaEQsTUFBTSxNQUFNLEdB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Q2pELENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPO29CQUFFLE9BQU8sTUFBTSxDQUFDO2dCQUN4QyxNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFO29CQUNyQyxPQUFPO29CQUNQLEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztpQkFDL0IsQ0FBQyxDQUFDO2dCQUNILFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDakIsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7Z0JBQUUsU0FBUztZQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEIsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLEtBQUs7Z0JBQUUsT0FBTyxNQUFNLENBQUM7UUFDNUMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5pZSB0b29scyBmb3IgTWFzdHJhLlxuICpcbiAqIFN1cmZhY2VzIGVhY2ggY29uZmlndXJlZCBHZW5pZSBzcGFjZSBhcyBhIHNtYWxsIHNldCBvZiBmbGF0IE1hc3RyYVxuICogdG9vbHMgdGhlIGNhbGxpbmcgYWdlbnQgZHJpdmVzIGRpcmVjdGx5IC0gbm8gaW5uZXIgb3JjaGVzdHJhdG9yXG4gKiBhZ2VudC4gVGhlIGNlbnRyYWwgYWdlbnQgZGVjb21wb3NlcyB1c2VyIHF1ZXN0aW9ucywgcGlja3Mgd2hpY2hcbiAqIHNwYWNlIHRvIGFzaywgc3RyZWFtcyB0aGUgcGVyLXR1cm4gd2lyZSBldmVudHMgKHN0YXR1cywgdGhpbmtpbmcsXG4gKiBzcWwsIHJvd3MpIHRocm91Z2ggYGN0eC53cml0ZXJgLCBhbmQgY29tcG9zZXMgdGhlIGZpbmFsIHJlcGx5LlxuICogUm93cyBhcmUgbmV2ZXIgZmV0Y2hlZCBlYWdlcmx5OiB0aGUgYWdlbnQgcmVhZHMgYSBzdGF0ZW1lbnQnc1xuICogdmFsdWVzIG9ubHkgd2hlbiBpdCBuZWVkcyB0byByZWFzb24gYWJvdXQgdGhlbSwgb3RoZXJ3aXNlIGl0IGVtYmVkc1xuICogYSBgW2RhdGE6PHN0YXRlbWVudF9pZD5dYCBtYXJrZXIgaW4gcHJvc2UgYW5kIGxldHMgdGhlIGhvc3QgVUlcbiAqIHJlc29sdmUgdGhlIGRhdGEuIENoYXJ0cyBhcmUgbWludGVkIGFzeW5jaHJvbm91c2x5IGFuZCByZWZlcmVuY2VkXG4gKiBieSBgW2NoYXJ0OjxjaGFydElkPl1gIG1hcmtlcnMgc28gcHJvc2UgaXNuJ3QgYmxvY2tlZCBvbiBjaGFydFxuICogZ2VuZXJhdGlvbjsgdGhlIGhvc3QgVUkgZmV0Y2hlcyB0aGUgY2FjaGVkIHNwZWMgYnkgaWQgb25jZSByZWFkeS5cbiAqIFNwYWNlIGRlc2NyaXB0aW9uIGFuZCBzZXJpYWxpemVkLXNwYWNlIGxvb2t1cHMgYXJlIGF2YWlsYWJsZSBmb3JcbiAqIGdyb3VuZGluZyB3aGVuIHRoZSBhZ2VudCBuZWVkcyBzY2hlbWEgY29udGV4dC5cbiAqXG4gKiBFYWNoIHRvb2wncyBgZXhlY3V0ZWAgcHVsbHMgdGhlIHBlci1yZXF1ZXN0XG4gKiB7QGxpbmsgV29ya3NwYWNlQ2xpZW50fSBvZmYgYGN0eC5yZXF1ZXN0Q29udGV4dGAgKHN0YW1wZWQgYnlcbiAqIGBNYXN0cmFTZXJ2ZXJgIHVuZGVyIHtAbGluayBNQVNUUkFfVVNFUl9LRVl9KSBhbmQgdGhlIHBlci1jYWxsXG4gKiBgd3JpdGVyYCAvIGBhYm9ydFNpZ25hbGAgb2ZmIGBjdHhgLCBzbyB0aGUgdG9vbHMgYXJlIHN0YXRlbGVzc1xuICogYWNyb3NzIHJlcXVlc3RzIGFuZCB0aGUgY2VudHJhbCBhZ2VudCBvd25zIHRoZSBsb29wLlxuICpcbiAqIFRoZSB0b29scyB0YWxrIHRvIEdlbmllIGRpcmVjdGx5IHZpYSBgQGRieC10b29scy9nZW5pZWBcbiAqIChgZ2VuaWVFdmVudENoYXRgKTsgc3RhdGVtZW50LXJvdyBmZXRjaGluZyBpcyBkZWxlZ2F0ZWQgdG9cbiAqIHtAbGluayBmZXRjaFN0YXRlbWVudERhdGF9IGZyb20gYC4vc3RhdGVtZW50LmpzYCwgd2hpY2ggd3JhcHNcbiAqIHRoZSB3b3Jrc3BhY2UgYHN0YXRlbWVudEV4ZWN1dGlvbi5nZXRTdGF0ZW1lbnRgIEFQSS4gQXBwS2l0J3NcbiAqIHN0b2NrIGBnZW5pZWAgcGx1Z2luIGlzIGhvbm9yZWQgb25seSBmb3IgaXRzIGBzcGFjZXNgIGNvbmZpZ1xuICogc28gZXhpc3RpbmcgQXBwS2l0LXN0eWxlIHdpcmluZyBrZWVwcyB3b3JraW5nIHdpdGhvdXQgY2hhbmdlLlxuICpcbiAqIFN1Z2dlc3RlZCBvcmNoZXN0cmF0aW9uIHByb21wdCBmb3IgdGhlIGNlbnRyYWwgYWdlbnQgbGl2ZXMgaW5cbiAqIHtAbGluayBHRU5JRV9JTlNUUlVDVElPTlN9OyBjb21wb3NlIGl0IGludG8gdGhlIGFnZW50J3Mgb3duXG4gKiBgaW5zdHJ1Y3Rpb25zYCB3aGVuIHlvdSB3YW50IHRoZSBjYW5vbmljYWwgXCJob3cgdG8gZHJpdmUgdGhlXG4gKiBHZW5pZSB0b29sc1wiIGd1aWRhbmNlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBDYWNoZU1hbmFnZXIsXG4gIENvbmZpZ3VyYXRpb25FcnJvcixcbiAgRXhlY3V0aW9uRXJyb3IsXG4gIGdlbmllLFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgcGx1Z2luUmVnaXN0cnkgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGNyZWF0ZUNhY2hlIH0gZnJvbSBcIkBkYngtdG9vbHMvY2FjaGUvY2FjaGVcIjtcbmltcG9ydCB7IGNoYXQsIHNwYWNlIGFzIGdlbmllU3BhY2UgfSBmcm9tIFwiQGRieC10b29scy9nZW5pZVwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nLCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBnZW5pZU1vZGVsLCB0eXBlIEdlbmllTWVzc2FnZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1nZW5pZVwiO1xuaW1wb3J0IHR5cGUgeyBTdGFydGVkRXZlbnQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7IE1BU1RSQV9USFJFQURfSURfS0VZIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7IGNyZWF0ZVRvb2wsIHR5cGUgVG9vbEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgdHlwZSB7IE1hc3RyYVRvb2xzIH0gZnJvbSBcIi4vYWdlbnRzLnRzXCI7XG5pbXBvcnQgeyBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hLCBjaGFydFRvb2xPdXRwdXRTY2hlbWEsIHByZXBhcmVDaGFydCB9IGZyb20gXCIuL2NoYXJ0LnRzXCI7XG5pbXBvcnQgeyBNQVNUUkFfVVNFUl9LRVksIHJlc29sdmVVc2VyS2V5IH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1hc3RyYVBsdWdpbkNvbmZpZywgVXNlciB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgZmV0Y2hTdGF0ZW1lbnREYXRhIH0gZnJvbSBcIi4vc3RhdGVtZW50LnRzXCI7XG5pbXBvcnQgeyByZWNvcmRBY3RpdmVUcmFjZUF1dGgsIHN0YW1wR2VuaWVUb29sU3BhbiB9IGZyb20gXCIuL3RlbGVtZXRyeS50c1wiO1xuaW1wb3J0IHsgc2FmZVdyaXRlUHJvZ3Jlc3MgfSBmcm9tIFwiLi93cml0ZXIudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9nZW5pZVwiKTtcblxuLyoqIERlZmF1bHQgYWxpYXMgdXNlZCB3aGVuIGEgc2luZ2xlIHVubmFtZWQgR2VuaWUgc3BhY2UgaXMgd2lyZWQgdXAuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9HRU5JRV9BTElBUyA9IFwiZGVmYXVsdFwiO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29uZmlnIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogUGVyLXNwYWNlIEdlbmllIGFnZW50IGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmllU3BhY2VDb25maWcge1xuICAvKiogR2VuaWUgYHNwYWNlX2lkYC4gUmVxdWlyZWQ7IHJlc29sdmVzIHZpYSBgY2xpZW50LmdlbmllLmdldFNwYWNlYC4gKi9cbiAgc3BhY2VJZDogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gYXBwZW5kZWQgdG8gdGhlIHBlci1zcGFjZVxuICAgKiB0b29sIGRlc2NyaXB0aW9ucyBzbyB0aGUgY2FsbGluZyBMTE0gaGFzIGhpbnRzIGFib3V0ICp3aGF0XG4gICAqIGRhdGEqIHRoaXMgc3BhY2UgY292ZXJzIChlLmcuIFwib3JkZXJzLCByZXR1cm5zLFxuICAgKiBmdWxmaWxsbWVudFwiKS4gV2hlbiBvbWl0dGVkLCBvbmx5IHRoZSBzcGFjZSdzIG93blxuICAgKiBgZGVzY3JpcHRpb25gIChmZXRjaGVkIG9uIGZpcnN0IHVzZSBvZiBgZ2V0X3NwYWNlX2Rlc2NyaXB0aW9uYClcbiAgICogaXMgc2hvd24uXG4gICAqL1xuICBoaW50Pzogc3RyaW5nO1xufVxuXG4vKiogTWFwIG9mIGFsaWFzIC0+IHNwYWNlIGNvbmZpZy4gQWNjZXB0cyBlaXRoZXIgZXhwbGljaXQgb2JqZWN0cyBvciBiYXJlIHNwYWNlIGlkcy4gKi9cbmV4cG9ydCB0eXBlIEdlbmllU3BhY2VzQ29uZmlnID0gUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZyB8IHN0cmluZz47XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY3R4IGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE5hcnJvdyB2aWV3IG9mIHRoZSBzZWNvbmQgYXJnIE1hc3RyYSBwYXNzZXMgdG8gYSB0b29sJ3NcbiAqIGBleGVjdXRlKGlucHV0LCBjdHgpYC4gQ2FwdHVyZXMgdGhlIGZpZWxkcyB0aGUgR2VuaWUgdG9vbHNcbiAqIGFjdHVhbGx5IHJlYWQgLSBgcmVxdWVzdENvbnRleHRgIChmb3IgdXNlciAvIGNvbnZlcnNhdGlvblxuICogc3RhdGUpLCBgd3JpdGVyYCAoZm9yIHN0cmVhbWluZyBldmVudHMgdG8gdGhlIGhvc3QgVUkpLCBhbmRcbiAqIGBhYm9ydFNpZ25hbGAgKGZvciBwZXItY2FsbCBjYW5jZWxsYXRpb24pLlxuICovXG50eXBlIFRvb2xFeGVjdXRlQ3R4ID1cbiAgUGljazxUb29sRXhlY3V0aW9uQ29udGV4dCwgXCJyZXF1ZXN0Q29udGV4dFwiIHwgXCJ3cml0ZXJcIiB8IFwiYWJvcnRTaWduYWxcIiB8IFwiYWdlbnRcIj4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUHVsbCB0aGUgcGVyLXJlcXVlc3Qge0BsaW5rIFdvcmtzcGFjZUNsaWVudH0gb2ZmIHRoZSBhY3RpdmVcbiAqIGBSZXF1ZXN0Q29udGV4dGAuIFRoZSBNYXN0cmEgcGx1Z2luJ3Mgc2VydmVyIG1pZGRsZXdhcmUgc3RhbXBzXG4gKiBhIHtAbGluayBVc2VyfSBvbiB0aGUgY29udGV4dCB1bmRlciB7QGxpbmsgTUFTVFJBX1VTRVJfS0VZfVxuICogZm9yIGV2ZXJ5IHJlcXVlc3Q7IHRvb2xzIGZhaWwgbG91ZGx5IHdoZW4gaXQncyBtaXNzaW5nIGJlY2F1c2VcbiAqIHRoYXQgbWVhbnMgdGhlIE1hc3RyYSBwbHVnaW4gaXNuJ3QgcnVubmluZyAoZS5nLiBhIHRvb2wgd2FzXG4gKiBpbnZva2VkIG91dHNpZGUgdGhlIGNoYXQgcm91dGUpLlxuICovXG5mdW5jdGlvbiByZXF1aXJlQ2xpZW50KFxuICBjdHg6IFRvb2xFeGVjdXRlQ3R4LFxuICB0b29sSWQ6IHN0cmluZyxcbik6IHtcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQ7XG4gIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dDtcbn0ge1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IGN0eD8ucmVxdWVzdENvbnRleHQ7XG4gIGlmICghcmVxdWVzdENvbnRleHQpIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIGAke3Rvb2xJZH0gcmVxdWVzdCBjb250ZXh0YCxcbiAgICAgIFwiSW52b2tlIHRoZSB0b29sIGZyb20gYW4gYWdlbnQgdHVybiBzZXJ2ZWQgYnkgdGhlIG1hc3RyYSBwbHVnaW4uXCIsXG4gICAgKTtcbiAgfVxuICBjb25zdCB1c2VyID0gcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX0tFWSkgYXMgVXNlciB8IHVuZGVmaW5lZDtcbiAgaWYgKCF1c2VyKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgJHt0b29sSWR9IHVzZXIgY29udGV4dGAsXG4gICAgICBcIkludm9rZSB0aGUgdG9vbCBmcm9tIGFuIGFnZW50IHR1cm4gc2VydmVkIGJ5IHRoZSBtYXN0cmEgcGx1Z2luLCB3aGljaCBzdGFtcHMgdGhlIEFwcEtpdCB1c2VyIG9uIHRoZSBNYXN0cmEgcmVxdWVzdCBjb250ZXh0LlwiLFxuICAgICk7XG4gIH1cbiAgcmVjb3JkQWN0aXZlVHJhY2VBdXRoKFwiaXNVc2VyQ29udGV4dFwiIGluIHVzZXIuZXhlY3V0aW9uQ29udGV4dCA/IFwib2JvXCIgOiBcInNlcnZpY2UtcHJpbmNpcGFsXCIpO1xuICByZXR1cm4geyBjbGllbnQ6IHVzZXIuZXhlY3V0aW9uQ29udGV4dC5jbGllbnQsIHJlcXVlc3RDb250ZXh0IH07XG59XG5cbi8qKlxuICogTG93ZXJjYXNlZCBwbGFjZWhvbGRlciBzdHJpbmdzIHdlIHJlamVjdCBhdCB0aGUgYGFza19nZW5pZWBcbiAqIGJvdW5kYXJ5IHNvIHRoZSBMTE0gZG9lc24ndCBzcGVuZCBhIEdlbmllIHJvdW5kLXRyaXAgb24gYVxuICogbm9uLXF1ZXN0aW9uLiBHZW5pZSBwb2xpdGVseSBhbnN3ZXJzIGFueSBvZiB0aGVzZSB3aXRoIFwiWW91clxuICogcmVxdWVzdCAnLi4uJyBkb2VzIG5vdCByZWxhdGUgdG8uLi5cIiB3aGljaCBpcyBwdXJlIFVJIG5vaXNlLlxuICogS2VwdCBuYXJyb3cgb24gcHVycG9zZSAtIHJlYWwgcXVlc3Rpb25zIHNvbWV0aW1lcyBzdGFydCB3aXRoXG4gKiBvbmUgb2YgdGhlc2UgdG9rZW5zLCBzbyB3ZSBvbmx5IG1hdGNoIHRoZSBGVUxMIHRyaW1tZWQgc3RyaW5nLlxuICovXG5jb25zdCBQTEFDRUhPTERFUl9RVUVTVElPTlMgPSBuZXcgU2V0KFtcbiAgXCJub29wXCIsXG4gIFwibm8tb3BcIixcbiAgXCJza2lwXCIsXG4gIFwibm9uZVwiLFxuICBcIm4vYVwiLFxuICBcIm5hXCIsXG4gIFwibnVsbFwiLFxuICBcInVuZGVmaW5lZFwiLFxuICBcInRlc3RcIixcbiAgXCJwbGFjZWhvbGRlclwiLFxuXSk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbnZlcnNhdGlvbiBzdGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEVzdGltYXRlZCBHZW5pZSBjb252ZXJzYXRpb24gbGlmZXRpbWUgaW4gc2Vjb25kcy4gRGF0YWJyaWNrc1xuICogcHVibGlzaGVzIG5vIG9mZmljaWFsIFRUTCBvbiB0aGUgY29udmVyc2F0aW9uIHJlc291cmNlIGl0c2VsZjtcbiAqIGNvbW11bml0eSBwcm9qZWN0cyAoZS5nLiB0aGUgb3Blbi1zb3VyY2UgRGF0YWJyaWNrcyBHZW5pZSBCb3QpXG4gKiBjb252ZXJnZSBvbiA0IGhvdXJzIG9mIGluYWN0aXZpdHkgYXMgYSBzYWZlIG9wZXJhdGluZyB3aW5kb3cuXG4gKiBUcmVhdCB0aGlzIGFzIGFuIGVzdGltYXRlIHRoYXQgZ2V0cyAqZXh0ZW5kZWQgb24gZXZlcnkgdXNlKiBieVxuICogcmUtc2V0dGluZyB0aGUgY2FjaGUgZW50cnkgYWZ0ZXIgZWFjaCBzdWNjZXNzZnVsIHR1cm4gKHNsaWRpbmdcbiAqIFRUTCB2aWEgcmUtYHNldGApLiBXaGVuIHRoZSBlc3RpbWF0ZSBlbmRzIHVwIHdyb25nIChjb252ZXJzYXRpb25cbiAqIGRlbGV0ZWQsIGV4cGlyZWQgdXBzdHJlYW0sIGNyb3NzLXNwYWNlIHJlZmVyZW5jZWQpLCBgYXNrX2dlbmllYFxuICogY2F0Y2hlcyB0aGUgU0RLJ3MgYFJFU09VUkNFX0RPRVNfTk9UX0VYSVNUYC80MDQgYW5kIHRyYW5zcGFyZW50bHlcbiAqIHN0YXJ0cyBhIGZyZXNoIGNvbnZlcnNhdGlvbi5cbiAqL1xuY29uc3QgQ09OVkVSU0FUSU9OX1RUTF9TRUMgPSA0ICogNjAgKiA2MDtcblxuLyoqIENhY2hlIG5hbWVzcGFjZSBwcmVmaXggc28gY29leGlzdGluZyBNYXN0cmEgY2FjaGVzIGRvbid0IGNvbGxpZGUuICovXG5jb25zdCBDT05WRVJTQVRJT05fQ0FDSEVfTkFNRVNQQUNFID0gXCJtYXN0cmE6Z2VuaWU6Y29udmVyc2F0aW9uXCI7XG5cbi8qKlxuICogUGVyLXJlcXVlc3Qgc3RhdGUgZm9yIG9uZSBHZW5pZSBzcGFjZS4gVGhlIHJldXNhYmxlIGNvbnZlcnNhdGlvbiBpcyByZXNlcnZlZFxuICogYnkgYXQgbW9zdCBvbmUgaW52b2NhdGlvbiBhdCBhIHRpbWUuIEFkZGl0aW9uYWwgY29uY3VycmVudCBpbnZvY2F0aW9ucyB1c2VcbiAqIGlzb2xhdGVkIGNvbnZlcnNhdGlvbnMgc28gTWFzdHJhIGNhbiBleGVjdXRlIHBhcmFsbGVsIHRvb2wgY2FsbHMgd2l0aG91dFxuICogYXBwZW5kaW5nIG11bHRpcGxlIGFjdGl2ZSBtZXNzYWdlcyB0byB0aGUgc2FtZSBHZW5pZSBjb252ZXJzYXRpb24uXG4gKi9cbmludGVyZmFjZSBDb252ZXJzYXRpb25TdGF0ZSB7XG4gIGNvbnZlcnNhdGlvbklkPzogc3RyaW5nO1xuICByZXVzYWJsZUNvbnZlcnNhdGlvbkluRmxpZ2h0OiBib29sZWFuO1xufVxuXG4vKiogQnVpbGQgdGhlIHBlci1yZXF1ZXN0IHtAbGluayBSZXF1ZXN0Q29udGV4dH0ga2V5IGZvciBvbmUgR2VuaWUgc3BhY2UuICovXG5jb25zdCBjb252ZXJzYXRpb25Db250ZXh0S2V5ID0gKHNwYWNlSWQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICBgbWFzdHJhX19nZW5pZV9jb252ZXJzYXRpb25fXyR7c3BhY2VJZH1gO1xuXG4vKipcbiAqIFJlYWQgb3IgaW5pdGlhbGl6ZSB0aGUgcGVyLXNwYWNlIGNvbnZlcnNhdGlvbiBzdGF0ZS4gVGhlIHN0cmluZyBicmFuY2hcbiAqIHByZXNlcnZlcyBjb21wYXRpYmlsaXR5IHdpdGggYSBjb250ZXh0IHBvcHVsYXRlZCBieSBhbiBvbGRlciBwYWNrYWdlIGNvcHkuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnNhdGlvblN0YXRlKHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCwgc3BhY2VJZDogc3RyaW5nKTogQ29udmVyc2F0aW9uU3RhdGUge1xuICBjb25zdCBrZXkgPSBjb252ZXJzYXRpb25Db250ZXh0S2V5KHNwYWNlSWQpO1xuICBjb25zdCBjdXJyZW50ID0gcmVxdWVzdENvbnRleHQuZ2V0KGtleSkgYXMgQ29udmVyc2F0aW9uU3RhdGUgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChjdXJyZW50ICYmIHR5cGVvZiBjdXJyZW50ID09PSBcIm9iamVjdFwiKSByZXR1cm4gY3VycmVudDtcbiAgY29uc3Qgc3RhdGU6IENvbnZlcnNhdGlvblN0YXRlID0ge1xuICAgIC4uLih0eXBlb2YgY3VycmVudCA9PT0gXCJzdHJpbmdcIiA/IHsgY29udmVyc2F0aW9uSWQ6IGN1cnJlbnQgfSA6IHt9KSxcbiAgICByZXVzYWJsZUNvbnZlcnNhdGlvbkluRmxpZ2h0OiBmYWxzZSxcbiAgfTtcbiAgcmVxdWVzdENvbnRleHQuc2V0KGtleSwgc3RhdGUpO1xuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogUmVzZXJ2ZSB0aGUgcmV1c2FibGUgY29udmVyc2F0aW9uIHdoZW4gaXQgaXMgaWRsZS4gQSBjYWxsZXIgdGhhdCBjYW5ub3RcbiAqIHJlc2VydmUgaXQgZ2V0cyBhbiBpc29sYXRlZCBjb252ZXJzYXRpb24gYW5kIG1heSBydW4gaW4gcGFyYWxsZWwuXG4gKi9cbmZ1bmN0aW9uIHJlc2VydmVDb252ZXJzYXRpb24oc3RhdGU6IENvbnZlcnNhdGlvblN0YXRlKTogYm9vbGVhbiB7XG4gIGlmIChzdGF0ZS5yZXVzYWJsZUNvbnZlcnNhdGlvbkluRmxpZ2h0KSByZXR1cm4gZmFsc2U7XG4gIHN0YXRlLnJldXNhYmxlQ29udmVyc2F0aW9uSW5GbGlnaHQgPSB0cnVlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgY2Fub25pY2FsIGNhY2hlIGtleSBmb3IgYSBgKHNwYWNlSWQsIHRocmVhZElkKWAgcGFpciwgb3duZWQgYnlcbiAqIGB1c2VyS2V5YC4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIGB0aHJlYWRJZGAgaXMgbWlzc2luZyAtIGNhbGxlcnMgc2hvdWxkXG4gKiBza2lwIGNhY2hpbmcgZW50aXJlbHkgaW4gdGhhdCBjYXNlIChubyBNYXN0cmEgbWVtb3J5IHdpcmVkIHVwKS5cbiAqXG4gKiBUaGUgaWRlbnRpdHkgaXMgcGFydCBvZiB0aGUga2V5IGJlY2F1c2UgYSBjbGllbnQgcGlja3MgaXRzIG93biBgdGhyZWFkSWRgXG4gKiAodGhlIHRocmVhZC1zZWxlY3Rpb24gaGVhZGVyIC8gYD90aHJlYWRJZD1gKSwgc28gdGhlIGlkIGFsb25lIGRvZXMgbm90XG4gKiBlc3RhYmxpc2ggd2hvIG93bnMgdGhlIEdlbmllIGNvbnZlcnNhdGlvbiBiZWhpbmQgaXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbnZlcnNhdGlvbkNhY2hlS2V5KFxuICBzcGFjZUlkOiBzdHJpbmcsXG4gIHRocmVhZElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHVzZXJLZXk6IHN0cmluZyxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghdGhyZWFkSWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiAoYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlKCkpLmdlbmVyYXRlS2V5KFxuICAgIFtDT05WRVJTQVRJT05fQ0FDSEVfTkFNRVNQQUNFLCBzcGFjZUlkLCB0aHJlYWRJZF0sXG4gICAgdXNlcktleSxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZWFkIHRoZSBjYWNoZWQgR2VuaWUgY29udmVyc2F0aW9uIGlkIGZvciBgKHNwYWNlSWQsIHRocmVhZElkKWAuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIG9uIG1pc3MsIG9uIGV4cGlyeSwgb3Igd2hlbiB0aGUgY2FjaGUgbGF5ZXJcbiAqIGlzIHVuaGVhbHRoeSAtIG5ldmVyIHRocm93cy4gVGhlIFRUTCBpcyByZW5ld2VkIHZpYSByZS1gc2V0YFxuICogYWZ0ZXIgZWFjaCBzdWNjZXNzZnVsIHR1cm4gKHNlZSB7QGxpbmsgc2F2ZUNhY2hlZENvbnZlcnNhdGlvbklkfSkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDYWNoZWRDb252ZXJzYXRpb25JZChjYWNoZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgaWYgKCFjYWNoZUtleSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCB2ID0gYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLmdldDxzdHJpbmc+KGNhY2hlS2V5KTtcbiAgICByZXR1cm4gdiA/PyB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiY29udmVyc2F0aW9uLWNhY2hlOnJlYWQtZXJyb3JcIiwge1xuICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnIpLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBQZXJzaXN0IHRoZSBhY3RpdmUgY29udmVyc2F0aW9uIGlkIHVuZGVyIGBjYWNoZUtleWAsIHJlZnJlc2hpbmdcbiAqIGl0cyBUVEwuIElkZW1wb3RlbnQ7IG5vLW9wIHdoZW4gYGNhY2hlS2V5YCBvciBgY29udmVyc2F0aW9uSWRgXG4gKiBpcyBtaXNzaW5nLiBSZS1zZXR0aW5nIHRoZSBzYW1lIGtleSBhY3RzIGFzIGEgc2xpZGluZyBUVEw6IGV2ZXJ5XG4gKiB0dXJuIHRoYXQgdXNlcyB0aGUgY29udmVyc2F0aW9uIGV4dGVuZHMgdGhlIHdpbmRvdyBieSBhbm90aGVyXG4gKiB7QGxpbmsgQ09OVkVSU0FUSU9OX1RUTF9TRUN9IHNlY29uZHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNhdmVDYWNoZWRDb252ZXJzYXRpb25JZChcbiAgY2FjaGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY29udmVyc2F0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWNhY2hlS2V5IHx8ICFjb252ZXJzYXRpb25JZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5zZXQoY2FjaGVLZXksIGNvbnZlcnNhdGlvbklkLCB7XG4gICAgICB0dGw6IENPTlZFUlNBVElPTl9UVExfU0VDLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImNvbnZlcnNhdGlvbi1jYWNoZTp3cml0ZS1lcnJvclwiLCB7XG4gICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVyciksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIEZvcmNlLWV2aWN0IGEgY2FjaGVkIGNvbnZlcnNhdGlvbiBpZC4gVXNlZCBvbiB0aGUgc3RhbGUtaWQgcmVjb3ZlcnkgcGF0aC4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV2aWN0Q2FjaGVkQ29udmVyc2F0aW9uSWQoY2FjaGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWNhY2hlS2V5KSByZXR1cm47XG4gIHRyeSB7XG4gICAgYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLmRlbGV0ZShjYWNoZUtleSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiY29udmVyc2F0aW9uLWNhY2hlOmRlbGV0ZS1lcnJvclwiLCB7XG4gICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVyciksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBMYXp5LXNlZWQgdGhlIGFjdGl2ZSBHZW5pZSBgY29udmVyc2F0aW9uX2lkYCBmb3IgYHNwYWNlSWRgIGZyb21cbiAqIHRoZSBjcm9zcy1yZXF1ZXN0IGNhY2hlIG9udG8gdGhlIHBlci1yZXF1ZXN0IGBSZXF1ZXN0Q29udGV4dGAuXG4gKiBOby1vcCB3aGVuIHRoZSBzbG90IGlzIGFscmVhZHkgcG9wdWxhdGVkIChzdWJzZXF1ZW50XG4gKiBgYXNrX2dlbmllYCBjYWxscyBpbiB0aGUgc2FtZSB0dXJuKSBzbyB3ZSBoaXQgdGhlIGNhY2hlIGF0IG1vc3RcbiAqIG9uY2UgcGVyIHJlcXVlc3QgcGVyIHNwYWNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVDb252ZXJzYXRpb25TZWVkZWQoXG4gIHN0YXRlOiBDb252ZXJzYXRpb25TdGF0ZSxcbiAgY2FjaGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoc3RhdGUuY29udmVyc2F0aW9uSWQpIHJldHVybjtcbiAgY29uc3QgY2FjaGVkID0gYXdhaXQgcmVhZENhY2hlZENvbnZlcnNhdGlvbklkKGNhY2hlS2V5KTtcbiAgaWYgKGNhY2hlZCkgc3RhdGUuY29udmVyc2F0aW9uSWQgPSBjYWNoZWQ7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcmVwYXJlX2NoYXJ0IGlucHV0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEFnZW50LWZhY2luZyBgcHJlcGFyZV9jaGFydGAgaW5wdXQgc2NoZW1hLiBSZXVzZXNcbiAqIHtAbGluayBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hfSAodGhlIGRhdGFzZXQtZHJpdmVuIHBsYW5uZXJcbiAqIGNvbnRyYWN0KSBidXQgc3dhcHMgdGhlIGlubGluZSBgZGF0YWAgZmllbGQgZm9yIGEgR2VuaWVcbiAqIGBzdGF0ZW1lbnRfaWRgIHRoZSB0b29sIHJlc29sdmVzIGludG8gcm93cyBzZXJ2ZXItc2lkZS5cbiAqIGB0aXRsZWAgaXMgbG9vc2VuZWQgdG8gb3B0aW9uYWwgLSB0aGUgcGxhbm5lciBmYWxscyBiYWNrIHRvIGFcbiAqIGdlbmVyaWMgcGxhY2Vob2xkZXIgd2hlbiB0aGUgYWdlbnQgZG9lc24ndCBzdXBwbHkgb25lLlxuICpcbiAqIFNoYXBlZCB0byBtYXRjaCBHZW5pZSdzIHdpcmUgZm9ybSAtIGBzdGF0ZW1lbnRfaWRgIChzbmFrZSlcbiAqIG1pcnJvcnMgYHF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRgIGFuZCB0aGUgYGdldF9zdGF0ZW1lbnRgXG4gKiB0b29sJ3MgaW5wdXQgZmllbGQgbmFtZSwgc28gdGhlIExMTSBvbmx5IGV2ZXIgc2VlcyBvbmVcbiAqIHNwZWxsaW5nIGZvciB0aGUgc2FtZSBpZGVudGlmaWVyLlxuICovXG5jb25zdCBwcmVwYXJlQ2hhcnRSZXF1ZXN0U2NoZW1hID0gY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYVxuICAub21pdCh7IGRhdGE6IHRydWUsIHRpdGxlOiB0cnVlIH0pXG4gIC5leHRlbmQoe1xuICAgIHN0YXRlbWVudF9pZDogelxuICAgICAgLnN0cmluZygpXG4gICAgICAubWluKDEsIFwic3RhdGVtZW50X2lkIGlzIHJlcXVpcmVkXCIpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICAgIEdlbmllIFxcYHN0YXRlbWVudF9pZFxcYCB0byBjaGFydC4gUmVhZCBmcm9tXG4gICAgICAgICAgXFxgbWVzc2FnZS5xdWVyeV9yZXN1bHQuc3RhdGVtZW50X2lkXFxgIG9yXG4gICAgICAgICAgXFxgbWVzc2FnZS5hdHRhY2htZW50c1sqXS5xdWVyeS5zdGF0ZW1lbnRfaWRcXGAgcmV0dXJuZWQgYnlcbiAgICAgICAgICBcXGBhc2tfZ2VuaWVcXGAuXG4gICAgICAgIGApLFxuICAgICAgKSxcbiAgICB0aXRsZTogY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYS5zaGFwZS50aXRsZS5vcHRpb25hbCgpLFxuICB9KTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdG9vbCBpZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBTdWZmaXggYXBwZW5kZWQgdG8gcGVyLXNwYWNlIHRvb2wgaWRzIHdoZW4gdGhlIGFsaWFzIGlzbid0IHRoZVxuICogd2VsbC1rbm93biBgZGVmYXVsdGAuIFNpbmdsZS1zcGFjZSBkZXBsb3ltZW50cyBnZXQgdGhlIGJhcmVcbiAqIG5hbWVzIChgYXNrX2dlbmllYCwgYGdldF9zcGFjZV9kZXNjcmlwdGlvbmAsIC4uLik7IG11bHRpLXNwYWNlXG4gKiBkZXBsb3ltZW50cyBnZXQgYGFza19nZW5pZV88YWxpYXM+YCBldGMuIHNvIGVhY2ggc3BhY2UncyB0b29sc1xuICogc3RheSBkaXNhbWJpZ3VhdGVkIGluIHRoZSBjZW50cmFsIGFnZW50J3MgdG9vbCByZWdpc3RyeS5cbiAqL1xuZnVuY3Rpb24gYWxpYXNTdWZmaXgoYWxpYXM6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChhbGlhcyA9PT0gREVGQVVMVF9HRU5JRV9BTElBUykgcmV0dXJuIFwiXCI7XG4gIGNvbnN0IHNsdWcgPSBzdHJpbmdVdGlscy50b0lkZW50aWZpZXIoYWxpYXMpO1xuICByZXR1cm4gc2x1ZyA/IGBfJHtzbHVnfWAgOiBcIlwiO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGVyLXNwYWNlIHRvb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIERyb3AgYHN1Z2dlc3RlZF9xdWVzdGlvbnNgIGF0dGFjaG1lbnRzIGZyb20gYSB7QGxpbmsgR2VuaWVNZXNzYWdlfVxuICogYmVmb3JlIGhhbmRpbmcgaXQgdG8gdGhlIGNlbnRyYWwgTExNLiBUaG9zZSBlbnRyaWVzIGFscmVhZHlcbiAqIHN1cmZhY2UgaW4gdGhlIFVJIGFzIG9uZS10YXAgcGlsbHMgdmlhIHRoZSB3cml0ZXInc1xuICogYHN1Z2dlc3RlZF9xdWVzdGlvbnNgIGV2ZW50cyAoc2VlIGBjb2xsZWN0U3VnZ2VzdGlvbnNgIG9uIHRoZVxuICogY2xpZW50KTsgaWYgd2UgbGV0IHRoZW0gcmlkZSBiYWNrIGluIHRoZSB0b29sIHJlc3VsdCB0aGUgTExNXG4gKiB0ZW5kcyB0byBxdW90ZSB0aGVtIGlubGluZSBpbiBpdHMgcHJvc2UsIGRvdWJsZS1zaG93aW5nIHRoZVxuICogc2FtZSBxdWVzdGlvbnMgYW5kIHN0ZXBwaW5nIG9uIHRoZSBkZWRpY2F0ZWQgc3VnZ2VzdGlvbiBVSS5cbiAqIFF1ZXJ5IC8gdGV4dCAvIHJvdyBhdHRhY2htZW50cyBhcmUgcHJlc2VydmVkIHNvIHRoZSBtb2RlbCBjYW5cbiAqIHN0aWxsIHJlYWQgYHN0YXRlbWVudF9pZGAsIFNRTCwgYW5kIHRoZSBhbnN3ZXIgdGV4dC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBTdWdnZXN0ZWRRdWVzdGlvbnMobWVzc2FnZTogR2VuaWVNZXNzYWdlKTogR2VuaWVNZXNzYWdlIHtcbiAgY29uc3QgYXR0YWNobWVudHMgPSBtZXNzYWdlLmF0dGFjaG1lbnRzO1xuICBpZiAoIWF0dGFjaG1lbnRzIHx8IGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG1lc3NhZ2U7XG4gIGNvbnN0IGZpbHRlcmVkID0gYXR0YWNobWVudHMuZmlsdGVyKChhdHQpID0+ICFhdHQuc3VnZ2VzdGVkX3F1ZXN0aW9ucyk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IGF0dGFjaG1lbnRzLmxlbmd0aCkgcmV0dXJuIG1lc3NhZ2U7XG4gIHJldHVybiB7IC4uLm1lc3NhZ2UsIGF0dGFjaG1lbnRzOiBmaWx0ZXJlZCB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEFza0dlbmllVG9vbChvcHRzOiB7XG4gIHNwYWNlSWQ6IHN0cmluZztcbiAgYWxpYXM6IHN0cmluZztcbiAgaGludD86IHN0cmluZztcbiAgYWdlbnRNb2RlPzogYm9vbGVhbjtcbn0pIHtcbiAgY29uc3QgeyBzcGFjZUlkLCBhbGlhcywgaGludCwgYWdlbnRNb2RlIH0gPSBvcHRzO1xuICBjb25zdCB0b29sSWQgPSBgYXNrX2dlbmllJHthbGlhc1N1ZmZpeChhbGlhcyl9YDtcbiAgY29uc3QgaGludExpbmUgPSBoaW50ID8gYCAoJHtoaW50fSlgIDogXCJcIjtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiB0b29sSWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgQXNrIHRoZSBHZW5pZSBzcGFjZSBcIiR7YWxpYXN9XCIke2hpbnRMaW5lfSBPTkUgZm9jdXNlZFxuICAgICAgbmF0dXJhbC1sYW5ndWFnZSBzdWItcXVlc3Rpb24gYW5kIHdhaXQgZm9yIHRoZSB0dXJuIHRvXG4gICAgICBjb21wbGV0ZS4gR2VuaWUgYW5zd2VycyBiZXN0IHdoZW4gZWFjaCBjYWxsIGNvdmVycyBhXG4gICAgICBzaW5nbGUgbWV0cmljIC8gZGltZW5zaW9uIC8gdGltZSB3aW5kb3csIHNvIGV4cGVjdCB0b1xuICAgICAgY2FsbCB0aGlzIHRvb2wgTVVMVElQTEUgVElNRVMgcGVyIHVzZXIgdHVybiAodHlwaWNhbGx5XG4gICAgICB0d28gdG8gc2l4KS4gSW5kZXBlbmRlbnQgc3ViLXF1ZXN0aW9ucyBtYXkgYmUgY2FsbGVkIGluXG4gICAgICBQQVJBTExFTDsgY2FsbHMgdGhhdCBkZXBlbmQgb24gYW4gZWFybGllciBhbnN3ZXIgc2hvdWxkIHN0YXlcbiAgICAgIHNlcXVlbnRpYWwuIFBhcmFsbGVsIGNhbGxzIHVzZSBpc29sYXRlZCBHZW5pZSBjb252ZXJzYXRpb25zLFxuICAgICAgd2hpbGUgc2VxdWVudGlhbCBjYWxscyByZXRhaW4gdGhlIHJldXNhYmxlIGNvbnZlcnNhdGlvbiBjb250ZXh0LlxuICAgICAgVGhpcyBpcyB0aGUgbm9ybWFsIHBhdHRlcm4sIG5vdCB0aGUgZXhjZXB0aW9uLlxuICAgICAgRG8gTk9UIHRyeSB0byBjcmFtIGEgbXVsdGktcGFydCBxdWVzdGlvbiBpbnRvIGEgc2luZ2xlXG4gICAgICBjYWxsOyBkZWNvbXBvc2UgZmlyc3QsIHRoZW4gYXNrIGVhY2ggcGllY2UuXG5cbiAgICAgIFJldHVybnMgdGhlIGZpbmFsIFxcYEdlbmllTWVzc2FnZVxcYC4gQWdlbnQgTW9kZSBpbmNsdWRlcyB0aGVcbiAgICAgIHN5bnRoZXNpemVkIGFuc3dlciBhbmQgY2FuIGluY2x1ZGUgU1FMIHJlc3VsdCB2YWx1ZXMgYXMgYVxuICAgICAgTWFya2Rvd24gdGV4dCBhdHRhY2htZW50LiBBZ2VudCBNb2RlIGhhcyBubyBcXGBzdGF0ZW1lbnRfaWRcXGA7XG4gICAgICB1c2UgXFxgcmVuZGVyX2RhdGFcXGAgd2l0aCBpdHMgaW5saW5lIHJvd3Mgd2hlbiBhIGNoYXJ0IGlzIG5lZWRlZC5cbiAgICAgIEEgbGVnYWN5IHBvbGxpbmcgcmVzdWx0IGluc3RlYWQgY2FycmllcyBhIFxcYHN0YXRlbWVudF9pZFxcYCAoYXRcbiAgICAgIFxcYG1lc3NhZ2UucXVlcnlfcmVzdWx0LnN0YXRlbWVudF9pZFxcYCBvciB0aGUgZmlyc3RcbiAgICAgIGF0dGFjaG1lbnQncyBcXGBxdWVyeS5zdGF0ZW1lbnRfaWRcXGApOyBjYWxsXG4gICAgICBcXGBnZXRfc3RhdGVtZW50XFxgIHdpdGggdGhhdCBpZCBvbmx5IHdoZW4geW91IG5lZWQgdG8gcmVhZFxuICAgICAgdGhlIHVuZGVybHlpbmcgdmFsdWVzIHRvIHJlYXNvbiBhYm91dCB0aGVtLiBJZiB5b3UganVzdCB3YW50XG4gICAgICB0byBkaXNwbGF5IGEgbGVnYWN5IHJlc3VsdCwgZW1iZWQgYVxuICAgICAgXFxgW2RhdGE6PHN0YXRlbWVudF9pZD5dXFxgIG1hcmtlciBpbiBwcm9zZS4gV2lyZSBldmVudHNcbiAgICAgIChzdGF0dXMsIHJlYXNvbmluZywgU1FMLCBxdWVyeSBvdXRwdXQsIGFuc3dlciB0ZXh0KSBzdHJlYW1cbiAgICAgIGF1dG9tYXRpY2FsbHkgd2hpbGUgdGhlIGNhbGwgaXMgaW4gZmxpZ2h0LlxuICAgIGApLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBxdWVzdGlvbjogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm1pbigxLCBcInF1ZXN0aW9uIGlzIHJlcXVpcmVkXCIpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgICAgIE9ORSBmb2N1c2VkIG5hdHVyYWwtbGFuZ3VhZ2UgcXVlc3Rpb24gYWJvdXQgdGhlIGRhdGEgaW4gdGhpc1xuICAgICAgICAgICAgc3BhY2UsIGNvdmVyaW5nIGEgc2luZ2xlIG1ldHJpYyAvIGRpbWVuc2lvbiAvIHRpbWUgd2luZG93XG4gICAgICAgICAgICAoZS5nLiBcIldoYXQgd2FzIFEzIHJldmVudWUgYnkgcmVnaW9uP1wiKS4gRGVjb21wb3NlIGFcbiAgICAgICAgICAgIG11bHRpLXBhcnQgYXNrIGludG8gc2VwYXJhdGUgY2FsbHMgcmF0aGVyIHRoYW4gY29tYmluaW5nIGl0XG4gICAgICAgICAgICBoZXJlLlxuICAgICAgICAgIGApLFxuICAgICAgICApLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbWVzc2FnZTogZ2VuaWVNb2RlbC5HZW5pZU1lc3NhZ2VTY2hlbWEsXG4gICAgfSksXG4gICAgZXhlY3V0ZTogYXN5bmMgKHsgcXVlc3Rpb24gfSwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCBjdHggPSBjdHhSYXcgYXMgVG9vbEV4ZWN1dGVDdHg7XG4gICAgICBzdGFtcEdlbmllVG9vbFNwYW4oKTtcbiAgICAgIGNvbnN0IHsgY2xpZW50LCByZXF1ZXN0Q29udGV4dCB9ID0gcmVxdWlyZUNsaWVudChjdHgsIHRvb2xJZCk7XG4gICAgICBjb25zdCB3cml0ZXIgPSBjdHg/LndyaXRlcjtcbiAgICAgIGNvbnN0IHRvb2xDYWxsSWQgPSBjdHg/LmFnZW50Py50b29sQ2FsbElkO1xuICAgICAgY29uc3Qgc2lnbmFsID0gY3R4Py5hYm9ydFNpZ25hbDtcbiAgICAgIGNvbnN0IHRocmVhZElkID0gcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9USFJFQURfSURfS0VZKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIEJvdW5jZSBwbGFjZWhvbGRlciAvIG5vLW9wIHF1ZXN0aW9ucyBCRUZPUkUgc3BlbmRpbmcgYSBHZW5pZVxuICAgICAgLy8gcm91bmQtdHJpcCBvbiB0aGVtLiBHZW5pZSBhbnN3ZXJzIGFueSBvZiB0aGVzZSB3aXRoIFwiWW91clxuICAgICAgLy8gcmVxdWVzdCAnbm9vcCcgZG9lcyBub3QgcmVsYXRlIHRvLi4uXCIgLSB1c2VsZXNzIG5vaXNlIHRoYXRcbiAgICAgIC8vIHNob3dzIHVwIGluIHRoZSBVSSBhbmQgZWF0cyBvbmUgb2YgdGhlIHdvcmtzcGFjZSdzIDVcbiAgICAgIC8vIHF1ZXN0aW9ucy9taW51dGUuIFJldHVybmluZyBhIGNsZWFyIGVycm9yIGhlcmUgc3VyZmFjZXMgdGhlXG4gICAgICAvLyBpc3N1ZSB0byB0aGUgYWdlbnQgbG9vcCBzbyB0aGUgbW9kZWwgY29ycmVjdHMgY291cnNlIGluc3RlYWRcbiAgICAgIC8vIG9mIHdhc3RpbmcgYSB0dXJuLlxuICAgICAgY29uc3QgdHJpbW1lZCA9IHF1ZXN0aW9uLnRyaW0oKTtcbiAgICAgIGlmICh0cmltbWVkLmxlbmd0aCA9PT0gMCB8fCBQTEFDRUhPTERFUl9RVUVTVElPTlMuaGFzKHRyaW1tZWQudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcbiAgICAgICAgICBgJHt0b29sSWR9LnF1ZXN0aW9uYCxcbiAgICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgICBcImEgcmVhbCBuYXR1cmFsLWxhbmd1YWdlIHF1ZXN0aW9uLCBub3QgYSBwbGFjZWhvbGRlcjsgc2tpcCB0aGUgY2FsbCBpbnN0ZWFkXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0YXRlID0gY29udmVyc2F0aW9uU3RhdGUocmVxdWVzdENvbnRleHQsIHNwYWNlSWQpO1xuICAgICAgY29uc3Qgb3duc1JldXNhYmxlQ29udmVyc2F0aW9uID0gcmVzZXJ2ZUNvbnZlcnNhdGlvbihzdGF0ZSk7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBPbmx5IHRoZSByZXNlcnZlZCBsYW5lIHNlZWRzIGFuZCB1cGRhdGVzIHRoZSB0aHJlYWQncyByZXVzYWJsZVxuICAgICAgICAvLyBjb252ZXJzYXRpb24uIENvbmN1cnJlbnQgbGFuZXMgZGVsaWJlcmF0ZWx5IHN0YXJ0IGZyZXNoIGNvbnZlcnNhdGlvbnMuXG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gb3duc1JldXNhYmxlQ29udmVyc2F0aW9uXG4gICAgICAgICAgPyBhd2FpdCBjb252ZXJzYXRpb25DYWNoZUtleShzcGFjZUlkLCB0aHJlYWRJZCwgcmVzb2x2ZVVzZXJLZXkocmVxdWVzdENvbnRleHQpKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAob3duc1JldXNhYmxlQ29udmVyc2F0aW9uKSB7XG4gICAgICAgICAgYXdhaXQgZW5zdXJlQ29udmVyc2F0aW9uU2VlZGVkKHN0YXRlLCBjYWNoZUtleSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFYWNoIGludm9jYXRpb24ga2VlcHMgaXRzIGNvbnZlcnNhdGlvbiBpZCBsb2NhbGx5LiBPbmx5IHRoZSByZXVzYWJsZVxuICAgICAgICAvLyBsYW5lIHB1Ymxpc2hlcyB1cGRhdGVzIHRvIHNoYXJlZCByZXF1ZXN0IGFuZCBjcm9zcy1yZXF1ZXN0IHN0YXRlLlxuICAgICAgICBsZXQgY29udmVyc2F0aW9uSWQgPSBvd25zUmV1c2FibGVDb252ZXJzYXRpb24gPyBzdGF0ZS5jb252ZXJzYXRpb25JZCA6IHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCBzdGFydGVkRXZlbnQ6IFN0YXJ0ZWRFdmVudCA9IHtcbiAgICAgICAgICB0eXBlOiBcInN0YXJ0ZWRcIixcbiAgICAgICAgICBzcGFjZUlkLFxuICAgICAgICAgIGNvbnRlbnQ6IHF1ZXN0aW9uLFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCBzYWZlV3JpdGVQcm9ncmVzcyhsb2dnZXIsIHdyaXRlciwgdG9vbENhbGxJZCwgc3RhcnRlZEV2ZW50KTtcblxuICAgICAgICBjb25zdCBydW5UdXJuID0gYXN5bmMgKCk6IFByb21pc2U8R2VuaWVNZXNzYWdlPiA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VlZENvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uSWQ7XG4gICAgICAgICAgbGV0IGZpbmFsTWVzc2FnZTogR2VuaWVNZXNzYWdlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2YgY2hhdC5nZW5pZUV2ZW50Q2hhdChzcGFjZUlkLCBxdWVzdGlvbiwge1xuICAgICAgICAgICAgd29ya3NwYWNlQ2xpZW50OiBjbGllbnQsXG4gICAgICAgICAgICAuLi4oYWdlbnRNb2RlICE9PSB1bmRlZmluZWQgPyB7IGFnZW50TW9kZSB9IDoge30pLFxuICAgICAgICAgICAgLi4uKHNlZWRDb252ZXJzYXRpb25JZCA/IHsgY29udmVyc2F0aW9uSWQ6IHNlZWRDb252ZXJzYXRpb25JZCB9IDoge30pLFxuICAgICAgICAgICAgLi4uKHNpZ25hbCA/IHsgY29udGV4dDogc2lnbmFsIH0gOiB7fSksXG4gICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIGlmIChldmVudC50eXBlICE9PSBcIm1lc3NhZ2VcIikge1xuICAgICAgICAgICAgICBhd2FpdCBzYWZlV3JpdGVQcm9ncmVzcyhsb2dnZXIsIHdyaXRlciwgdG9vbENhbGxJZCwgZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXZlbnRDb252ZXJzYXRpb25JZCA9IGV2ZW50LmNvbnZlcnNhdGlvbl9pZDtcbiAgICAgICAgICAgIGlmIChldmVudENvbnZlcnNhdGlvbklkKSB7XG4gICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkID0gZXZlbnRDb252ZXJzYXRpb25JZDtcbiAgICAgICAgICAgICAgaWYgKG93bnNSZXVzYWJsZUNvbnZlcnNhdGlvbikgc3RhdGUuY29udmVyc2F0aW9uSWQgPSBldmVudENvbnZlcnNhdGlvbklkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwicmVzdWx0XCIpIHtcbiAgICAgICAgICAgICAgZmluYWxNZXNzYWdlID0gZXZlbnQubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFmaW5hbE1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRocm93IEV4ZWN1dGlvbkVycm9yLm1pc3NpbmdEYXRhKFwiR2VuaWUgcmVzdWx0IGV2ZW50XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmluYWxNZXNzYWdlO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBmaW5hbE1lc3NhZ2U6IEdlbmllTWVzc2FnZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmaW5hbE1lc3NhZ2UgPSBhd2FpdCBydW5UdXJuKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIEEgcmVqZWN0ZWQgY29udmVyc2F0aW9uIGlkIGlzIHN0YWxlIG9yIGluYWNjZXNzaWJsZS4gUmVzZXQgdGhpc1xuICAgICAgICAgIC8vIGxhbmUgYW5kIHJldHJ5IG9uY2Ugd2l0aCBhIGZyZXNoIEdlbmllIGNvbnZlcnNhdGlvbi5cbiAgICAgICAgICBjb25zdCByZWplY3RlZENvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uSWQ7XG4gICAgICAgICAgaWYgKHJlamVjdGVkQ29udmVyc2F0aW9uSWQgJiYgZXJyb3JVdGlscy5lcnJvckNvbnRleHQoZXJyKS5ub3RBY2Nlc3NpYmxlKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcImNvbnZlcnNhdGlvbi1jYWNoZTpzdGFsZSwgcmVzZXR0aW5nXCIsIHtcbiAgICAgICAgICAgICAgc3BhY2VJZCxcbiAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQ6IHJlamVjdGVkQ29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG93bnNSZXVzYWJsZUNvbnZlcnNhdGlvbikge1xuICAgICAgICAgICAgICBhd2FpdCBldmljdENhY2hlZENvbnZlcnNhdGlvbklkKGNhY2hlS2V5KTtcbiAgICAgICAgICAgICAgc3RhdGUuY29udmVyc2F0aW9uSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb252ZXJzYXRpb25JZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGZpbmFsTWVzc2FnZSA9IGF3YWl0IHJ1blR1cm4oKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvd25zUmV1c2FibGVDb252ZXJzYXRpb24pIHtcbiAgICAgICAgICBhd2FpdCBzYXZlQ2FjaGVkQ29udmVyc2F0aW9uSWQoY2FjaGVLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IHN0cmlwU3VnZ2VzdGVkUXVlc3Rpb25zKGZpbmFsTWVzc2FnZSkgfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChvd25zUmV1c2FibGVDb252ZXJzYXRpb24pIHN0YXRlLnJldXNhYmxlQ29udmVyc2F0aW9uSW5GbGlnaHQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTcGFjZURlc2NyaXB0aW9uVG9vbChvcHRzOiB7IHNwYWNlSWQ6IHN0cmluZzsgYWxpYXM6IHN0cmluZyB9KSB7XG4gIGNvbnN0IHsgc3BhY2VJZCwgYWxpYXMgfSA9IG9wdHM7XG4gIGNvbnN0IHRvb2xJZCA9IGBnZXRfc3BhY2VfZGVzY3JpcHRpb24ke2FsaWFzU3VmZml4KGFsaWFzKX1gO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IHRvb2xJZCxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICBSZXR1cm4gdGhlIEdlbmllIHNwYWNlIFwiJHthbGlhc31cIidzIHRpdGxlLCBkZXNjcmlwdGlvbiwgYW5kXG4gICAgICB3YXJlaG91c2UgaWQuIENoZWFwIChzaW5nbGUgUkVTVCBjYWxsLCBubyBMTE0gcm91bmQtdHJpcCkuXG4gICAgICBDYWxsIHRoaXMgRklSU1Qgb24gYW55IHVzZXIgdHVybiB0aGF0J3MgZ29pbmcgdG8gdG91Y2hcbiAgICAgIFxcYGFza19nZW5pZVxcYCwgdW5sZXNzIHRoZSBzYW1lIGRlc2NyaXB0aW9uIGFscmVhZHkgbGFuZGVkXG4gICAgICBlYXJsaWVyIGluIHRoaXMgY29udmVyc2F0aW9uIC0gdGhlIHRpdGxlICsgZGVzY3JpcHRpb24gdGVsbFxuICAgICAgeW91IHdoYXQgdGFibGVzLCBtZXRyaWNzLCBhbmQgdGltZSB3aW5kb3dzIHRoZSBzcGFjZVxuICAgICAgYWN0dWFsbHkgY292ZXJzLCB3aGljaCBpcyB3aGF0IGxldHMgeW91IGRlY29tcG9zZSB0aGVcbiAgICAgIHVzZXIncyBxdWVzdGlvbiBpbnRvIHRoZSByaWdodCBcXGBhc2tfZ2VuaWVcXGAgc3ViLXF1ZXN0aW9ucy5cbiAgICBgKSxcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe30pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgc3BhY2VJZDogei5zdHJpbmcoKSxcbiAgICAgIHRpdGxlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBkZXNjcmlwdGlvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgd2FyZWhvdXNlSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICBleGVjdXRlOiBhc3luYyAoX2lucHV0LCBjdHhSYXcpID0+IHtcbiAgICAgIGNvbnN0IGN0eCA9IGN0eFJhdyBhcyBUb29sRXhlY3V0ZUN0eDtcbiAgICAgIGNvbnN0IHsgY2xpZW50IH0gPSByZXF1aXJlQ2xpZW50KGN0eCwgdG9vbElkKTtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGN0eD8uYWJvcnRTaWduYWw7XG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIHRoZSBwYWNrYWdlJ3MgY2VudHJhbCBHZW5pZSBzcGFjZSBmZXRjaC4gVGhlXG4gICAgICAvLyBkZXNjcmlwdGlvbiBzdXJmYWNlICh0aXRsZSAvIGRlc2NyaXB0aW9uIC8gd2FyZWhvdXNlIGlkKSBsaXZlc1xuICAgICAgLy8gb24gdGhlIGRpcmVjdG9yeS1saXN0aW5nIHNoYXBlLCBzbyBza2lwIHRoZSBsYXJnZXJcbiAgICAgIC8vIGBzZXJpYWxpemVkX3NwYWNlYCBwYXlsb2FkIGhlcmUuXG4gICAgICBjb25zdCBzcGFjZSA9IGF3YWl0IGdlbmllU3BhY2UuZ2V0R2VuaWVTcGFjZShzcGFjZUlkLCB7XG4gICAgICAgIHdvcmtzcGFjZUNsaWVudDogY2xpZW50LFxuICAgICAgICBzZXJpYWxpemVkOiBmYWxzZSxcbiAgICAgICAgLi4uKHNpZ25hbCA/IHsgY29udGV4dDogc2lnbmFsIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNwYWNlSWQsXG4gICAgICAgIC4uLihzcGFjZS50aXRsZSA/IHsgdGl0bGU6IHNwYWNlLnRpdGxlIH0gOiB7fSksXG4gICAgICAgIC4uLihzcGFjZS5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IHNwYWNlLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIC4uLihzcGFjZS53YXJlaG91c2VfaWQgPyB7IHdhcmVob3VzZUlkOiBzcGFjZS53YXJlaG91c2VfaWQgfSA6IHt9KSxcbiAgICAgIH07XG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU3BhY2VTZXJpYWxpemVkVG9vbChvcHRzOiB7IHNwYWNlSWQ6IHN0cmluZzsgYWxpYXM6IHN0cmluZyB9KSB7XG4gIGNvbnN0IHsgc3BhY2VJZCwgYWxpYXMgfSA9IG9wdHM7XG4gIGNvbnN0IHRvb2xJZCA9IGBnZXRfc3BhY2Vfc2VyaWFsaXplZCR7YWxpYXNTdWZmaXgoYWxpYXMpfWA7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogdG9vbElkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgIFJldHVybiB0aGUgZnVsbCBcXGBHZW5pZVNwYWNlXFxgIEpTT04gZm9yIHRoZSBcIiR7YWxpYXN9XCIgc3BhY2UuXG4gICAgICBVc2Ugb25seSB3aGVuIHlvdSBuZWVkIGV4YWN0IGNvbHVtbiAvIHRhYmxlIGlkZW50aWZpZXJzXG4gICAgICBcXGBnZXRfc3BhY2VfZGVzY3JpcHRpb25cXGAgZG9lc24ndCBleHBvc2UuIExhcmdlciBwYXlsb2FkLCBzb1xuICAgICAgcHJlZmVyIHRoZSBkZXNjcmlwdGlvbiB0b29sIHdoZW4gaXQncyBlbm91Z2guXG4gICAgYCksXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHt9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHsgc3BhY2U6IHoudW5rbm93bigpIH0pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChfaW5wdXQsIGN0eFJhdykgPT4ge1xuICAgICAgY29uc3QgY3R4ID0gY3R4UmF3IGFzIFRvb2xFeGVjdXRlQ3R4O1xuICAgICAgY29uc3QgeyBjbGllbnQgfSA9IHJlcXVpcmVDbGllbnQoY3R4LCB0b29sSWQpO1xuICAgICAgY29uc3Qgc2lnbmFsID0gY3R4Py5hYm9ydFNpZ25hbDtcbiAgICAgIC8vIENlbnRyYWwgR2VuaWUgc3BhY2UgZmV0Y2ggd2l0aCB0aGUgb3B0LWluIGBzZXJpYWxpemVkX3NwYWNlYFxuICAgICAgLy8gYmxvYiAoY2F0YWxvZ3MsIHRhYmxlcywgc2FtcGxlIHF1ZXN0aW9ucywgcHJvbXB0cykgdGhhdCB0aGVcbiAgICAgIC8vIHR5cGVkIFNESyBgZ2V0U3BhY2VgIG9taXRzIC0gdGhlIHdob2xlIHBvaW50IG9mIHRoaXMgdG9vbC5cbiAgICAgIGNvbnN0IHNwYWNlID0gYXdhaXQgZ2VuaWVTcGFjZS5nZXRHZW5pZVNwYWNlKHNwYWNlSWQsIHtcbiAgICAgICAgd29ya3NwYWNlQ2xpZW50OiBjbGllbnQsXG4gICAgICAgIC4uLihzaWduYWwgPyB7IGNvbnRleHQ6IHNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBzcGFjZSB9O1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2hhcmVkIHRvb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIERlZmF1bHQgcm93IGNhcCBmb3Ige0BsaW5rIGJ1aWxkR2V0U3RhdGVtZW50VG9vbH0gd2hlbiB0aGUgYWdlbnRcbiAqIGRvZXNuJ3Qgc3VwcGx5IGEgYGxpbWl0YC4gU2l6ZWQgdG8ga2VlcCByZXN1bHQgc2V0cyBvdXQgb2YgdGhlXG4gKiBtb2RlbCBjb250ZXh0IHVubGVzcyB0aGUgYWdlbnQgZXhwbGljaXRseSBvcHRzIGludG8gbW9yZSByb3dzIC1cbiAqIHRoZSBjaGVhcCBzaGFwZSAoY29sdW1uIG5hbWVzICsgYSBoYW5kZnVsIG9mIHJlcHJlc2VudGF0aXZlXG4gKiByb3dzKSBpcyB1c3VhbGx5IGVub3VnaCB0byByZWFzb24gYWJvdXQgYSBxdWVyeS5cbiAqL1xuY29uc3QgREVGQVVMVF9TVEFURU1FTlRfTElNSVQgPSA1MDtcblxuZnVuY3Rpb24gYnVpbGRHZXRTdGF0ZW1lbnRUb29sKCkge1xuICBjb25zdCB0b29sSWQgPSBcImdldF9zdGF0ZW1lbnRcIjtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiB0b29sSWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgRmV0Y2ggdGhlIHJvd3Mgb2YgYSBHZW5pZSBzdGF0ZW1lbnQgYnkgaXRzIFxcYHN0YXRlbWVudF9pZFxcYCAodGhlXG4gICAgICB2YWx1ZSBhdCBcXGBtZXNzYWdlLnF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRcXGAgb3JcbiAgICAgIFxcYG1lc3NhZ2UuYXR0YWNobWVudHNbKl0ucXVlcnkuc3RhdGVtZW50X2lkXFxgIHJldHVybmVkIGZyb21cbiAgICAgIFxcYGFza19nZW5pZVxcYCkuIFVzZSB0aGlzIE9OTFkgd2hlbiB5b3UgbmVlZCB0byByZWFkIHRoZSB1bmRlcmx5aW5nXG4gICAgICB2YWx1ZXMgdG8gcmVhc29uIGFib3V0IHRoZW0gaW4geW91ciByZXBseSAtIGUuZy4gbmFtaW5nIHRoZVxuICAgICAgbGFyZ2VzdCByb3csIGNvbXB1dGluZyBhIGRlbHRhIHRoZSB2aXN1YWxpemF0aW9uIHdvdWxkbid0IGFscmVhZHlcbiAgICAgIGNvbnZleSwgb3IgZmlsdGVyaW5nIGRvd24gdG8gYSBzcGVjaWZpYyByZWNvcmQuIElmIHlvdSdkIGp1c3QgYmVcbiAgICAgIHJlY2l0aW5nIG51bWJlcnMgdGhlIHVzZXIgd2lsbCBzZWUgYW55d2F5LCBza2lwIHRoZSBjYWxsIGFuZFxuICAgICAgZW1iZWQgYSBcXGBbZGF0YTo8c3RhdGVtZW50X2lkPl1cXGAgbWFya2VyIGluIHlvdXIgcHJvc2UgaW5zdGVhZDtcbiAgICAgIHRoZSBob3N0IFVJIGZldGNoZXMgYW5kIHJlbmRlcnMgdGhlIHJvd3Mgb24gaXRzIG93bi4gXFxgbGltaXRcXGBcbiAgICAgIGNhcHMgdGhlIG51bWJlciBvZiByb3dzIHJldHVybmVkIChkZWZhdWx0cyB0b1xuICAgICAgJHtERUZBVUxUX1NUQVRFTUVOVF9MSU1JVH0pLiBcXGByb3dDb3VudFxcYCByZWZsZWN0cyB0aGUgZnVsbFxuICAgICAgdXBzdHJlYW0gdG90YWwgLSBjb21wYXJlIHRvIFxcYHJvd3MubGVuZ3RoXFxgIHRvIGRldGVjdCB0cnVuY2F0aW9uLlxuICAgIGApLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBzdGF0ZW1lbnRfaWQ6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5taW4oMSwgXCJzdGF0ZW1lbnRfaWQgaXMgcmVxdWlyZWRcIilcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICAgICAgR2VuaWUgXFxgc3RhdGVtZW50X2lkXFxgIHdob3NlIHJvd3MgdG8gcmVhZC4gVGFrZSBpdCBmcm9tXG4gICAgICAgICAgICBcXGBtZXNzYWdlLnF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRcXGAgb3JcbiAgICAgICAgICAgIFxcYG1lc3NhZ2UuYXR0YWNobWVudHNbKl0ucXVlcnkuc3RhdGVtZW50X2lkXFxgIG9uIGFuXG4gICAgICAgICAgICBcXGBhc2tfZ2VuaWVcXGAgcmVzdWx0OyBpdCBpcyBuZXZlciBhIHZhbHVlIHlvdSBjb25zdHJ1Y3QuXG4gICAgICAgICAgYCksXG4gICAgICAgICksXG4gICAgICBsaW1pdDogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLmludCgpXG4gICAgICAgIC5ub25uZWdhdGl2ZSgpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIk1heCByb3dzIHRvIHJldHVybi4gRGVmYXVsdHMgdG8gYSBzbWFsbCBzYW1wbGU7IHJhaXNlIG9ubHkgd2hlbiBtb3JlIHJvd3MgYXJlIGdlbnVpbmVseSBuZWVkZWQuXCIsXG4gICAgICAgICksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBjb2x1bW5zOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICAgICAgcm93czogei5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkpLFxuICAgICAgcm93Q291bnQ6IHoubnVtYmVyKCksXG4gICAgICB0cnVuY2F0ZWQ6IHouYm9vbGVhbigpLFxuICAgIH0pLFxuICAgIGV4ZWN1dGU6IGFzeW5jICh7IHN0YXRlbWVudF9pZCwgbGltaXQgfSwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCBjdHggPSBjdHhSYXcgYXMgVG9vbEV4ZWN1dGVDdHg7XG4gICAgICBjb25zdCB7IGNsaWVudCB9ID0gcmVxdWlyZUNsaWVudChjdHgsIHRvb2xJZCk7XG4gICAgICBjb25zdCBzaWduYWwgPSBjdHg/LmFib3J0U2lnbmFsO1xuICAgICAgY29uc3QgZWZmZWN0aXZlTGltaXQgPSBsaW1pdCA/PyBERUZBVUxUX1NUQVRFTUVOVF9MSU1JVDtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaFN0YXRlbWVudERhdGEoY2xpZW50LCBzdGF0ZW1lbnRfaWQsIHtcbiAgICAgICAgbGltaXQ6IGVmZmVjdGl2ZUxpbWl0LFxuICAgICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uczogZGF0YS5jb2x1bW5zLFxuICAgICAgICByb3dzOiBkYXRhLnJvd3MsXG4gICAgICAgIHJvd0NvdW50OiBkYXRhLnJvd0NvdW50LFxuICAgICAgICB0cnVuY2F0ZWQ6IGRhdGEucm93cy5sZW5ndGggPCBkYXRhLnJvd0NvdW50LFxuICAgICAgfTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBgcHJlcGFyZV9jaGFydGAgTWFzdHJhIHRvb2wuIFRoaW4gd3JhcHBlciBvdmVyXG4gKiB7QGxpbmsgcHJlcGFyZUNoYXJ0fSB0aGF0IHJlc29sdmVzIHRoZSBkYXRhc2V0IGJ5IGZldGNoaW5nIHRoZVxuICogR2VuaWUgc3RhdGVtZW50J3Mgcm93cyBvbiBkZW1hbmQuIFRoZSB0b29sIG1pbnRzIGEgYGNoYXJ0SWRgXG4gKiBzeW5jaHJvbm91c2x5LCBjYWNoZXMgYW4gZW1wdHkgcGxhY2Vob2xkZXIsIGFuZCBraWNrcyBvZmYgdGhlXG4gKiBwbGFubmVyIGluIHRoZSBiYWNrZ3JvdW5kIHNvIHRoZSBhZ2VudCBsb29wIG5ldmVyIGJsb2Nrcy4gVGhlIHJlc3VsdCBjYXJyaWVzXG4gKiB0aGUgY29tcGxldGUgbWFya2VyIHRvIGNvcHk7IHRoZSBob3N0IFVJIHJlc29sdmVzIGl0IGJ5IHJlYWRpbmcgdGhlIGNhY2hlZFxuICoge0BsaW5rIENoYXJ0fSBlbnRyeSAoMWggVFRMKS5cbiAqXG4gKiBTcGFjZS1hZ25vc3RpYzogYSBHZW5pZSBgc3RhdGVtZW50X2lkYCBpcyB3b3Jrc3BhY2Utc2NvcGVkLCBzb1xuICogb25lIHNoYXJlZCBgcHJlcGFyZV9jaGFydGAgdG9vbCBjb3ZlcnMgZXZlcnkgd2lyZWQgR2VuaWUgc3BhY2UuXG4gKlxuICogQ2FuY2VsbGF0aW9uOiBkZWxpYmVyYXRlbHkgZG9lcyBOT1QgZm9yd2FyZCB0aGUgcGVyLWNhbGxcbiAqIGBhYm9ydFNpZ25hbGAgdG8ge0BsaW5rIHByZXBhcmVDaGFydH0uIFRoZSBwbGFubmVyIHRhc2sgaXNcbiAqIGZpcmUtYW5kLWZvcmdldCBiYWNrZ3JvdW5kIHdvcms7IHRoZSB0b29sJ3Mgb3duIGBleGVjdXRlYFxuICogcmVzb2x2ZXMgdGhlIG1vbWVudCB0aGUgYGNoYXJ0SWRgIGlzIG1pbnRlZCwgc28gdGhlIHBlci1jYWxsXG4gKiBzaWduYWwgYWJvcnRzIHRoZSBzZWNvbmQgdGhlIHRvb2wgcmV0dXJucy4gVGhlIDFoIGNhY2hlIFRUTFxuICogY2FwcyBhYmFuZG9uZWQgZW50cmllcy5cbiAqL1xuZnVuY3Rpb24gYnVpbGRQcmVwYXJlQ2hhcnRUb29sKG9wdHM6IHsgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcgfSkge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0cztcbiAgY29uc3QgdG9vbElkID0gXCJwcmVwYXJlX2NoYXJ0XCI7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogdG9vbElkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKFtcbiAgICAgIGBcbiAgICAgICAgUXVldWUgYSBjaGFydCBmb3IgdGhlIHJvd3Mgb2YgYSBHZW5pZSBzdGF0ZW1lbnQuIE1pbnRzIGFcbiAgICAgICAgXFxgY2hhcnRJZFxcYCBwbHVzIGl0cyBjb21wbGV0ZSBcXGBtYXJrZXJcXGAgc3luY2hyb25vdXNseSBhbmRcbiAgICAgICAga2lja3Mgb2ZmIGEgQkFDS0dST1VORFxuICAgICAgICB0YXNrIHRoYXQgZmV0Y2hlcyB0aGUgc3RhdGVtZW50J3Mgcm93cywgcnVucyB0aGVcbiAgICAgICAgY2hhcnQtcGxhbm5lciB0byBwaWNrIGEgY2hhcnQgdHlwZSBhbmQgRWNoYXJ0cyBzcGVjLCBhbmRcbiAgICAgICAgY2FjaGVzIHRoZSByZXN1bHQgdW5kZXIgdGhlIFxcYGNoYXJ0SWRcXGAgZm9yIG9uZSBob3VyLiBUaGVcbiAgICAgICAgaG9zdCBVSSBmZXRjaGVzIHRoZSBjYWNoZWQgY2hhcnQgb24gaXRzIG93biBvbmNlIGl0IGxhbmRzLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgVG8gZGlzcGxheSB0aGUgY2hhcnQgaW4geW91ciByZXBseSwgY29weSB0aGUgcmV0dXJuZWRcbiAgICAgICAgXFxgbWFya2VyXFxgIFZFUkJBVElNIG9udG8gaXRzIG93biBsaW5lIGF0IHRoZSBwb3NpdGlvbiB5b3VcbiAgICAgICAgd2FudCBpdCB0byBhcHBlYXIuIE5ldmVyIGNvbnN0cnVjdCwgYWx0ZXIsIG9yIGludmVudCBhXG4gICAgICAgIG1hcmtlciBmcm9tIFxcYGNoYXJ0SWRcXGAgKGFuZCBuZXZlciB1c2UgdGhlIFxcYHN0YXRlbWVudF9pZFxcYFxuICAgICAgICBvciBhbnkgdmFyaWF0aW9uIG9mIGl0KSAtIG9ubHkgdGhlIGNvbXBsZXRlIHZhbHVlIHJldHVybmVkXG4gICAgICAgIGJ5IHRoaXMgdG9vbCByZXNvbHZlcyB0byBhIHJlYWwgY2hhcnQuIFRoZSB0b29sIHJldHVybnNcbiAgICAgICAgaW1tZWRpYXRlbHkgLSBkbyBOT1Qgd2FpdCBvciBjYWxsIGl0IGFnYWluIHRvXG4gICAgICAgIFwiY2hlY2sgcHJvZ3Jlc3NcIjsgdGhlIGNoYXJ0IHJlc29sdmVzIGFzeW5jaHJvbm91c2x5IG9uIHRoZVxuICAgICAgICBob3N0IFVJJ3Mgc2lkZS5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIFVzZSB0aGlzIG9ubHkgd2hlbiB0aGUgZGF0YSBoYXMgYSBzdG9yeSBhIGNoYXJ0IGNvbnZleXNcbiAgICAgICAgYmV0dGVyIHRoYW4gYSB0YWJsZSAodHJlbmRzLCByYW5raW5ncywgZGlzdHJpYnV0aW9ucyxcbiAgICAgICAgcGFydHMtb2YtYS13aG9sZSkuIEZvciByYXcgcm93cywgZW1iZWRcbiAgICAgICAgXFxgW2RhdGE6PHN0YXRlbWVudF9pZD5dXFxgIGluc3RlYWQgYW5kIHNraXAgdGhpcyB0b29sLlxuICAgICAgYCxcbiAgICBdKSxcbiAgICBpbnB1dFNjaGVtYTogcHJlcGFyZUNoYXJ0UmVxdWVzdFNjaGVtYSxcbiAgICBvdXRwdXRTY2hlbWE6IGNoYXJ0VG9vbE91dHB1dFNjaGVtYSxcbiAgICBleGVjdXRlOiBhc3luYyAocmVxdWVzdCwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCBjdHggPSBjdHhSYXcgYXMgVG9vbEV4ZWN1dGVDdHg7XG4gICAgICBjb25zdCB7IGNsaWVudCwgcmVxdWVzdENvbnRleHQgfSA9IHJlcXVpcmVDbGllbnQoY3R4LCB0b29sSWQpO1xuICAgICAgcmV0dXJuIHByZXBhcmVDaGFydCh7XG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgdXNlcktleTogcmVzb2x2ZVVzZXJLZXkocmVxdWVzdENvbnRleHQpLFxuICAgICAgICAuLi4ocmVxdWVzdC50aXRsZSA/IHsgdGl0bGU6IHJlcXVlc3QudGl0bGUgfSA6IHt9KSxcbiAgICAgICAgLi4uKHJlcXVlc3QuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiByZXF1ZXN0LmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIHJlc29sdmVEYXRhOiAodGFza1NpZ25hbCkgPT5cbiAgICAgICAgICBmZXRjaFN0YXRlbWVudERhdGEoY2xpZW50LCByZXF1ZXN0LnN0YXRlbWVudF9pZCwge1xuICAgICAgICAgICAgLi4uKHRhc2tTaWduYWwgPyB7IHNpZ25hbDogdGFza1NpZ25hbCB9IDoge30pLFxuICAgICAgICAgIH0pLFxuICAgICAgICAuLi4oY3R4Py5yZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQ6IGN0eC5yZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBvcmNoZXN0cmF0aW9uIHByb21wdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBTdWdnZXN0ZWQgb3JjaGVzdHJhdGlvbiBwcm9tcHQgZm9yIHRoZSBjZW50cmFsIGFnZW50IHRoYXQgb3duc1xuICogdGhlIEdlbmllIHRvb2xzLiBDb21wb3NlIGludG8geW91ciBhZ2VudCdzIGBpbnN0cnVjdGlvbnNgIHRvXG4gKiBnZXQgdGhlIGNhbm9uaWNhbCBcImRlY29tcG9zZSBxdWVzdGlvbnMsIGFzayBHZW5pZSBmb2N1c2VkXG4gKiBzdWItcXVlc3Rpb25zLCBwbGFjZSBkYXRhIC8gY2hhcnQgbWFya2VycyBpbiBwcm9zZVwiIGJlaGF2aW9yOlxuICpcbiAqIGBgYHRzXG4gKiBjcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogYCR7bXlBZ2VudEluc3RydWN0aW9uc31cXG5cXG4ke0dFTklFX0lOU1RSVUNUSU9OU31gLFxuICogICBhc3luYyB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgcmV0dXJuIHsgLi4uKGF3YWl0IHBsdWdpbnMuZ2VuaWU/LnRvb2xraXQoKSkgfTtcbiAqICAgfSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogVGhlIHByb21wdCByZWZlcmVuY2VzIHRoZSBiYXJlIHRvb2wgbmFtZXMgKGBhc2tfZ2VuaWVgLFxuICogYGdldF9zcGFjZV9kZXNjcmlwdGlvbmAsIGBnZXRfc3BhY2Vfc2VyaWFsaXplZGAsXG4gKiBgZ2V0X3N0YXRlbWVudGAsIGBwcmVwYXJlX2NoYXJ0YCkgdXNlZCBmb3IgdGhlIHNpbmdsZS1zcGFjZVxuICogZGVmYXVsdCBhbGlhcy4gTXVsdGktc3BhY2UgZGVwbG95bWVudHMgc2hvdWxkIHdyaXRlIHRoZWlyIG93blxuICogdmFyaWFudCB0aGF0IG5hbWVzIHRoZSBzdWZmaXhlZCBwZXItc3BhY2UgdG9vbHNcbiAqIChlLmcuIGBhc2tfZ2VuaWVfc2FsZXNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IEdFTklFX0lOU1RSVUNUSU9OUyA9IHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oW1xuICBcIkdlbmllIG9yY2hlc3RyYXRpb24uIEZvciBldmVyeSB1c2VyIHF1ZXN0aW9uIHRoYXQgbmVlZHMgU1FMLWJhY2tlZCBkYXRhOlwiLFxuICB7XG4gICAgbnVtYmVyZWQ6IFtcbiAgICAgIGBcbiAgICAgICAgU3RhcnQgYnkgY2FsbGluZyBcXGBnZXRfc3BhY2VfZGVzY3JpcHRpb25cXGAgdG8gZ3JvdW5kIHlvdXJzZWxmXG4gICAgICAgIGluIHdoYXQgdGhlIHNwYWNlIGNvdmVycyAodGFibGVzLCBtZXRyaWNzLCB0aW1lIHdpbmRvd3MpLFxuICAgICAgICB1bmxlc3MgeW91IGFscmVhZHkgc2F3IHRoZSBzYW1lIGRlc2NyaXB0aW9uIGVhcmxpZXIgaW4gdGhpc1xuICAgICAgICBjb252ZXJzYXRpb24uIFJlYWNoIGZvciBcXGBnZXRfc3BhY2Vfc2VyaWFsaXplZFxcYCBvbmx5IHdoZW4geW91XG4gICAgICAgIG5lZWQgZXhhY3QgY29sdW1uIC8gdGFibGUgaWRlbnRpZmllcnMgdGhlIGRlc2NyaXB0aW9uIGRvZXNuJ3RcbiAgICAgICAgZXhwb3NlIC0gaXQncyBhIG11Y2ggbGFyZ2VyIHBheWxvYWQuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBEZWNvbXBvc2UgdGhlIHVzZXIncyBxdWVzdGlvbiBpbnRvIGZvY3VzZWQgc3ViLXF1ZXN0aW9uc1xuICAgICAgICBCRUZPUkUgYXNraW5nIEdlbmllIGFueXRoaW5nLiBPbmUgc3ViLXF1ZXN0aW9uIHBlciBkaXN0aW5jdFxuICAgICAgICBtZXRyaWMsIGRpbWVuc2lvbiwgb3IgdGltZSB3aW5kb3cuIFRoZW4gY2FsbCBcXGBhc2tfZ2VuaWVcXGBcbiAgICAgICAgb25jZSBwZXIgc3ViLXF1ZXN0aW9uIC0gdXN1YWxseSB0d28gdG8gc2l4IGNhbGxzIHBlciB0dXJuLlxuICAgICAgICBJc3N1ZSBpbmRlcGVuZGVudCBjYWxscyBpbiBwYXJhbGxlbCB0byByZWR1Y2UgbGF0ZW5jeS4gS2VlcFxuICAgICAgICBkZXBlbmRlbnQgY2FsbHMgc2VxdWVudGlhbCB3aGVuIGFuIGVhcmxpZXIgYW5zd2VyIGRldGVybWluZXNcbiAgICAgICAgdGhlIG5leHQgcXVlc3Rpb24uIFBhcmFsbGVsIGNhbGxzIHVzZSBpc29sYXRlZCBHZW5pZVxuICAgICAgICBjb252ZXJzYXRpb25zOyBzZXF1ZW50aWFsIGNhbGxzIHJldGFpbiBjb252ZXJzYXRpb24gY29udGV4dC5cbiAgICAgICAgQ3JhbW1pbmcgYSBtdWx0aS1wYXJ0IHF1ZXN0aW9uIGludG8gb25lIFxcYGFza19nZW5pZVxcYCBjYWxsXG4gICAgICAgIGFsbW9zdCBhbHdheXMgcHJvZHVjZXMgYSB3b3JzZSBhbnN3ZXIgdGhhbiBhc2tpbmcgdGhlIHBpZWNlc1xuICAgICAgICBzZXBhcmF0ZWx5LiBPbmx5IGNvbGxhcHNlIHRvIGEgc2luZ2xlIGNhbGwgd2hlbiB0aGUgcXVlc3Rpb25cbiAgICAgICAgaXMgZ2VudWluZWx5IGF0b21pYyAoXCJ3aGF0IHdhcyBRMyByZXZlbnVlP1wiKS5cblxuICAgICAgICBXb3JrZWQgZXhhbXBsZTogdXNlciBhc2tzIFwiSG93IGRpZCBTS1UgMTIzNCdzIHJldmVudWVcbiAgICAgICAgY29tcGFyZSB0byBpdHMgY2F0ZWdvcnkgYXZlcmFnZSBsYXN0IHF1YXJ0ZXIsIGFuZCB3aGljaFxuICAgICAgICByZWdpb25zIGRyb3ZlIHRoZSBnYXA/XCIgRGVjb21wb3NlcyB0bzogKGEpIFxcYGFza19nZW5pZVxcYFxuICAgICAgICBmb3IgU0tVIDEyMzQncyBRMyByZXZlbnVlLCAoYikgXFxgYXNrX2dlbmllXFxgIGZvciB0aGVcbiAgICAgICAgY2F0ZWdvcnktYXZlcmFnZSBRMyByZXZlbnVlLCAoYykgXFxgYXNrX2dlbmllXFxgIGZvciBTS1VcbiAgICAgICAgMTIzNCdzIFEzIHJldmVudWUgc3BsaXQgYnkgcmVnaW9uLiBUaGUgZmlyc3QgdHdvIGNhbGxzIGFyZVxuICAgICAgICBpbmRlcGVuZGVudCBhbmQgY2FuIHJ1biBpbiBwYXJhbGxlbDsgcnVuIHRoZSByZWdpb25hbCBjYWxsXG4gICAgICAgIGFmdGVyd2FyZCBvbmx5IGlmIGl0cyB3b3JkaW5nIGRlcGVuZHMgb24gdGhvc2UgcmVzdWx0cy5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIEVhY2ggXFxgYXNrX2dlbmllXFxgIGNhbGwgcmV0dXJucyB0aGUgdGVybWluYWwgXFxgR2VuaWVNZXNzYWdlXFxgLlxuICAgICAgICBSZWFkIEFnZW50IE1vZGUncyBzeW50aGVzaXplZCBhbnN3ZXIgYW5kIE1hcmtkb3duIHF1ZXJ5IG91dHB1dFxuICAgICAgICBkaXJlY3RseSBmcm9tIGl0cyB0ZXh0IGF0dGFjaG1lbnRzLiBBZ2VudCBNb2RlIGRvZXMgTk9UIGV4cG9zZSBhXG4gICAgICAgIFxcYHN0YXRlbWVudF9pZFxcYC4gVG8gY2hhcnQgaXRzIHJlc3VsdCwgY2FsbCBcXGByZW5kZXJfZGF0YVxcYCB3aXRoXG4gICAgICAgIHJvd3MgY29waWVkIGZyb20gdGhlIE1hcmtkb3duIHRhYmxlIG9yIHN0cnVjdHVyZWQgdGFibGUgbWV0YWRhdGEsXG4gICAgICAgIHRoZW4gY29weSB0aGUgcmV0dXJuZWQgbWFya2VyLiBOZXZlciBwYXNzIGFuIEFnZW50IE1vZGUgcmVzcG9uc2UgaWQsXG4gICAgICAgIGNvbnZlcnNhdGlvbiBpZCwgZnVuY3Rpb24tY2FsbCBpZCwgb3IgYW55IG90aGVyIGlkZW50aWZpZXIgdG9cbiAgICAgICAgXFxgcHJlcGFyZV9jaGFydFxcYC5cblxuICAgICAgICBBIGxlZ2FjeSBwb2xsaW5nIHJlc3VsdCBtYXkgaW5zdGVhZCBleHBvc2UgYSBcXGBzdGF0ZW1lbnRfaWRcXGAgYXRcbiAgICAgICAgXFxgbWVzc2FnZS5xdWVyeV9yZXN1bHQuc3RhdGVtZW50X2lkXFxgIChvciB0aGUgZmlyc3RcbiAgICAgICAgYXR0YWNobWVudCdzIFxcYHF1ZXJ5LnN0YXRlbWVudF9pZFxcYCkuIE9ubHkgdGhhdCByZWFsIHN0YXRlbWVudCBpZFxuICAgICAgICBiZWxvbmdzIGluIFxcYHByZXBhcmVfY2hhcnRcXGAgb3IgYSBcXGBbZGF0YTo8c3RhdGVtZW50X2lkPl1cXGAgbWFya2VyLlxuICAgICAgYCxcbiAgICAgIFtcbiAgICAgICAgYFxuICAgICAgICAgIFRvIERJU1BMQVkgYSByZXN1bHQgc2V0IGluIHlvdXIgcmVwbHksIGVtYmVkIGEgbWFya2VyIG9uIGl0c1xuICAgICAgICAgIG93biBsaW5lIHdoZXJlIHRoZSB2aXN1YWxpemF0aW9uIHNob3VsZCBhcHBlYXIuIFR3byBtYXJrZXJcbiAgICAgICAgICBzaGFwZXM6XG4gICAgICAgIGAsXG4gICAgICAgIHtcbiAgICAgICAgICBidWxsZXRzOiBbXG4gICAgICAgICAgICBgXG4gICAgICAgICAgICAgIFxcYFtkYXRhOjxzdGF0ZW1lbnRfaWQ+XVxcYCAtIHJlbmRlciBsZWdhY3kgcG9sbGluZyByb3dzIGFzIGEgdGFibGUuXG4gICAgICAgICAgICAgIFVzZSB0aGlzIHdoZW4gdGhlcmUncyBubyBjbGVhciB2aXN1YWwgc3RvcnkgKGxvbmcgbGlzdHMsXG4gICAgICAgICAgICAgIHJlZmVyZW5jZSBkYXRhLCBzaW5nbGUtcm93IHJlc3VsdHMsIG9yIHRoZSB1c2VyIGp1c3RcbiAgICAgICAgICAgICAgd2FudHMgdG8gc2VlIHRoZSBkYXRhKS4gRW1iZWQgdGhlIG1hcmtlciBkaXJlY3RseSB3aGVuXG4gICAgICAgICAgICAgIFxcYGFza19nZW5pZVxcYCByZXR1cm5lZCBhIHJlYWwgXFxgc3RhdGVtZW50X2lkXFxgOyBBZ2VudCBNb2RlXG4gICAgICAgICAgICAgIGFscmVhZHkgY2FycmllcyBpdHMgcXVlcnkgb3V0cHV0IGlubGluZS5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBgXG4gICAgICAgICAgICAgIFxcYFtjaGFydDo8Y2hhcnRJZD5dXFxgIC0gcmVuZGVyIHRoZSByb3dzIGFzIGEgY2hhcnQuIFRvXG4gICAgICAgICAgICAgIGdldCBvbmUgZnJvbSBBZ2VudCBNb2RlLCBjYWxsIFxcYHJlbmRlcl9kYXRhXFxgIHdpdGggdGhlXG4gICAgICAgICAgICAgIGlubGluZSByb3dzLiBUbyBnZXQgb25lIGZyb20gbGVnYWN5IHBvbGxpbmcsIGNhbGxcbiAgICAgICAgICAgICAgXFxgcHJlcGFyZV9jaGFydFxcYCB3aXRoIHRoZSByZWFsIHN0YXRlbWVudCBpZC4gQm90aCB0b29sc1xuICAgICAgICAgICAgICBhY2NlcHQgYW4gb3B0aW9uYWwgXFxgdGl0bGVcXGAgLyBvbmUtbGluZSBcXGBkZXNjcmlwdGlvblxcYFxuICAgICAgICAgICAgICBvZiB0aGUgaW5zaWdodCB0byBzdXJmYWNlLCByZXR1cm4gdGhlIGNvbXBsZXRlIFxcYG1hcmtlclxcYFxuICAgICAgICAgICAgICBzeW5jaHJvbm91c2x5LCBhbmQgcHJlcGFyZSB0aGUgY2hhcnQgc3BlYyBpbiB0aGVcbiAgICAgICAgICAgICAgYmFja2dyb3VuZC4gQ29weSB0aGF0IG1hcmtlciBWRVJCQVRJTSBvbnRvIGl0cyBvd24gbGluZVxuICAgICAgICAgICAgICB3aGVyZXZlciB0aGUgY2hhcnQgc2hvdWxkIGFwcGVhci4gVXNlIGEgY2hhcnQgd2hlbiB0aGVcbiAgICAgICAgICAgICAgZGF0YSBoYXMgYSBzdG9yeSBhIHZpc3VhbCBjb252ZXlzIGJldHRlciB0aGFuIGEgdGFibGVcbiAgICAgICAgICAgICAgKHRyZW5kcywgcmFua2luZ3MsIGRpc3RyaWJ1dGlvbnMsIHBhcnRzLW9mLWEtd2hvbGUpLlxuXG4gICAgICAgICAgICAgIE5FVkVSIGludmVudCBvciBoYW5kLWJ1aWxkIGEgbWFya2VyLiBBIHZhbGlkIG1hcmtlciBpc1xuICAgICAgICAgICAgICB0aGUgY29tcGxldGUgb3BhcXVlIHN0cmluZyBhIFxcYHJlbmRlcl9kYXRhXFxgIG9yXG4gICAgICAgICAgICAgIFxcYHByZXBhcmVfY2hhcnRcXGAgY2FsbCByZXR1cm5lZCB0byB5b3UgaW4gVEhJUyB0dXJuIC1cbiAgICAgICAgICAgICAgbm90aGluZyBlbHNlLiBJdHMgaWQgaXMgTk9UIGEgXFxgc3RhdGVtZW50X2lkXFxgLCBhbmQgaXQgaXMgTk9UIGFcbiAgICAgICAgICAgICAgXFxgc3RhdGVtZW50X2lkXFxgIHByZWZpeCB3aXRoIGEgbGFiZWwgYXBwZW5kZWQgKGUuZy5cbiAgICAgICAgICAgICAgXFxgMDFmMS4uLi1yZWdpb24tZmlsbFxcYCkuIElmIHlvdSBoYXZlIG5vdCBjYWxsZWRcbiAgICAgICAgICAgICAgb25lIG9mIHRob3NlIGNoYXJ0IHRvb2xzIGFuZCByZWNlaXZlZCBhbiBpZCBiYWNrLCBkbyBub3RcbiAgICAgICAgICAgICAgd3JpdGUgYSBcXGBbY2hhcnQ6Li4uXVxcYCBtYXJrZXIgYXQgYWxsLiBBIGZhYnJpY2F0ZWQgY2hhcnRcbiAgICAgICAgICAgICAgaWQgcmVuZGVycyBub3RoaW5nIGFuZCB3YXN0ZXMgYSByZXF1ZXN0LlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBgXG4gICAgICAgICAgVGhlIGhvc3QgVUkgcmVzb2x2ZXMgYm90aCBtYXJrZXJzIG9uIGl0cyBvd24gb25jZSBpdCBzZWVzXG4gICAgICAgICAgdGhlbSAtIHlvdSBkbyBOT1QgbmVlZCB0byBjYWxsIFxcYGdldF9zdGF0ZW1lbnRcXGAganVzdCB0b1xuICAgICAgICAgIGRpc3BsYXkgZGF0YSwgYW5kIHlvdSBkbyBOT1QgbmVlZCB0byB3YWl0IG9uXG4gICAgICAgICAgXFxgcmVuZGVyX2RhdGFcXGAgb3IgXFxgcHJlcGFyZV9jaGFydFxcYCAodGhleSByZXR1cm4gdGhlIGlkXG4gICAgICAgICAgaW1tZWRpYXRlbHkgYW5kIHRoZSBob3N0IFVJIGZldGNoZXMgdGhlIGNhY2hlZCBjaGFydCBsYXRlcikuXG4gICAgICAgICAgUGljayBhdCBtb3N0IG9uZSBtYXJrZXIgcGVyIHJlc3VsdDsgZG9uJ3QgY2hhcnQgQU5EIHRhYmxlIHRoZVxuICAgICAgICAgIHNhbWUgcmVzdWx0IHNpZGUgYnkgc2lkZS5cbiAgICAgICAgYCxcbiAgICAgIF0sXG4gICAgICBgXG4gICAgICAgIENhbGwgXFxgZ2V0X3N0YXRlbWVudChzdGF0ZW1lbnRfaWQsIGxpbWl0PylcXGAgT05MWSB3aGVuIHlvdSBuZWVkXG4gICAgICAgIHRvIHJlYWQgdGhlIGFjdHVhbCB2YWx1ZXMgdG8gcmVhc29uIGFib3V0IHRoZW0gKGUuZy4gbmFtaW5nIGFcbiAgICAgICAgc3BlY2lmaWMgcm93LCBjb21wdXRpbmcgYSBkZWx0YSB0aGUgdGFibGUgb3IgY2hhcnQgd291bGRuJ3RcbiAgICAgICAgc2hvdywgb3Igc2FuaXR5LWNoZWNraW5nIGEgcmVzdWx0IGJlZm9yZSBpbnRlcnByZXRpbmcgaXQpLiBJZlxuICAgICAgICB5b3UnZCBqdXN0IGJlIHJlY2l0aW5nIG51bWJlcnMgdGhlIHZpc3VhbGl6YXRpb24gYWxyZWFkeSBzaG93cyxcbiAgICAgICAgc2tpcCB0aGUgY2FsbCBhbmQgdXNlIGEgbWFya2VyIGluc3RlYWQuIFxcYGxpbWl0XFxgIGRlZmF1bHRzIHRvIGFcbiAgICAgICAgc21hbGwgc2FtcGxlOyByYWlzZSBpdCBvbmx5IHdoZW4geW91IGdlbnVpbmVseSBuZWVkIG1vcmUgcm93cy5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIENvbXBvc2UgeW91ciBmaW5hbCByZXBseSBhcyBwbGFpbiBwcm9zZS4gSW50ZXJsZWF2ZSBwYXJhZ3JhcGhzXG4gICAgICAgIHdpdGggXFxgW2RhdGE6Li4uXVxcYCAvIFxcYFtjaGFydDouLi5dXFxgIG1hcmtlcnMgd2hlcmV2ZXIgYSByZXN1bHRcbiAgICAgICAgc2hvdWxkIHJlbmRlci4gRG9uJ3QgZHVtcCBhbGwgbWFya2VycyBhdCB0aGUgZW5kIC0gcGxhY2UgZWFjaFxuICAgICAgICBvbmUgbmV4dCB0byB0aGUgcHJvc2UgdGhhdCBpbnRlcnByZXRzIGl0LiBEb24ndCByZXN0YXRlIGV2ZXJ5XG4gICAgICAgIG51bWJlciB0aGUgdmlzdWFsaXphdGlvbiBhbHJlYWR5IHNob3dzOyBjYWxsIG91dCBkZWx0YXMsXG4gICAgICAgIGFub21hbGllcywgdGFrZWF3YXlzLlxuICAgICAgYCxcbiAgICBdLFxuICB9LFxuXSk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtdWx0aS1hbGlhcyBzdXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUge0BsaW5rIEdlbmllU3BhY2VzQ29uZmlnfSByZWNvcmQuIEJhcmUtc3RyaW5nXG4gKiBlbnRyaWVzIChgeyBkZWZhdWx0OiBcIjAxZWYuLi5cIiB9YCkgZ2V0IHdyYXBwZWQgYXNcbiAqIGB7IHNwYWNlSWQ6IFwiMDFlZi4uLlwiIH1gOyBvYmplY3QgZW50cmllcyBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkLlxuICpcbiAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkVycm9yIHdoZW4gYW4gYWxpYXMgaXMgcHJlc2VudCBidXQgY2FycmllcyBubyBzcGFjZSBpZFxuICogICAoYHsgZGVmYXVsdDogcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCB9YCB3aXRoIHRoZSB2YXJpYWJsZVxuICogICB1bnNldCkuIEFuIGFsaWFzIHRoYXQgcmVzb2x2ZXMgdG8gbm90aGluZyBpcyBhIHdpcmluZyBjb250cmFkaWN0aW9uOiB0aGVcbiAqICAgYWdlbnQgd291bGQgYWR2ZXJ0aXNlIG5vIEdlbmllIHRvb2wgZm9yIGEgc3BhY2UgdGhlIGRlcGxveW1lbnQgYmVsaWV2ZXMgaXRcbiAqICAgY29uZmlndXJlZCwgc28gaXQgZmFpbHMgYXQgY29uc3RydWN0aW9uIGluc3RlYWQgb2YgZ29pbmcgcXVpZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVHZW5pZVNwYWNlcyhcbiAgc3BhY2VzOiBHZW5pZVNwYWNlc0NvbmZpZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IEdlbmllU3BhY2VDb25maWcgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkLFxuKTogUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz4ge1xuICBpZiAoIXNwYWNlcykgcmV0dXJuIHt9O1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIEdlbmllU3BhY2VDb25maWc+ID0ge307XG4gIGZvciAoY29uc3QgW2FsaWFzLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc3BhY2VzKSkge1xuICAgIGNvbnN0IHNwYWNlSWQgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlPy5zcGFjZUlkO1xuICAgIGlmICghc3BhY2VJZCkgdGhyb3cgbWlzc2luZ1NwYWNlSWQoYWxpYXMpO1xuICAgIG91dFthbGlhc10gPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB7IHNwYWNlSWQgfSA6IHZhbHVlITtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogQ29uZmlnIGNvbnRyYWRpY3Rpb246IGFuIGFsaWFzIHByZXNlbnQgaW4gYGdlbmllU3BhY2VzYCB3aXRoIG5vIHNwYWNlIGlkLiAqL1xuZnVuY3Rpb24gbWlzc2luZ1NwYWNlSWQoYWxpYXM6IHN0cmluZyk6IENvbmZpZ3VyYXRpb25FcnJvciB7XG4gIGNvbnN0IGVudkhpbnQgPVxuICAgIGFsaWFzID09PSBERUZBVUxUX0dFTklFX0FMSUFTXG4gICAgICA/IFwiU2V0IERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSUQsIHBhc3MgdGhlIHNwYWNlIGlkIGlubGluZSwgb3IgZHJvcCB0aGUgYWxpYXMuXCJcbiAgICAgIDogYFBhc3MgdGhlIHNwYWNlIGlkIGlubGluZSAoREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCBvbmx5IGJhY2tzIHRoZSBcIiR7REVGQVVMVF9HRU5JRV9BTElBU31cIiBhbGlhcykgb3IgZHJvcCB0aGUgYWxpYXMuYDtcbiAgcmV0dXJuIENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKGBnZW5pZVNwYWNlcy4ke2FsaWFzfSBzcGFjZSBpZGAsIGVudkhpbnQpO1xufVxuXG4vKipcbiAqIEFwcEtpdCBgZ2VuaWVgIHBsdWdpbidzIGNvbmZpZyBzaGFwZSwgZGVyaXZlZCBmcm9tIHRoZSBmYWN0b3J5XG4gKiBpdHNlbGYgc28gaXQgc3RheXMgaW4gbG9jay1zdGVwIHdpdGggdGhlIHVwc3RyZWFtIHR5cGUgd2l0aG91dFxuICogZGVlcC1pbXBvcnRpbmcgYElHZW5pZUNvbmZpZ2AgKHdoaWNoIHRoZSBwYWNrYWdlJ3MgdG9wLWxldmVsXG4gKiBiYXJyZWwgZG9lc24ndCBzdXJmYWNlKS4gVGhlIHBsdWdpbidzIGBjb25maWdgIGZpZWxkIGlzXG4gKiBgcHJvdGVjdGVkYCBpbiBUUyBvbmx5OyB0aGUgcnVudGltZSBsYXlvdXQgaXMgcGxhaW4gb2JqZWN0XG4gKiBwcm9wZXJ0eSBhY2Nlc3MsIHNvIHJlYWRpbmcgb2ZmIHRoZSBpbnN0YW5jZSB3aXRoIGEgc3RydWN0dXJhbFxuICogY2FzdCBpcyBzYWZlLlxuICovXG50eXBlIEFwcEtpdEdlbmllQ29uZmlnID0gTm9uTnVsbGFibGU8UGFyYW1ldGVyczx0eXBlb2YgZ2VuaWU+WzBdPjtcblxuLyoqXG4gKiBEaXNjb3ZlciBHZW5pZSBzcGFjZSBhbGlhc2VzIGZyb20gZXZlcnkgc3VwcG9ydGVkIHNvdXJjZSBhbmRcbiAqIG1lcmdlIHRoZW0gaW50byBhIHNpbmdsZSByZWNvcmQuIFByZWNlZGVuY2UgKGhpZ2hlc3QgZmlyc3QpOlxuICpcbiAqICAgMS4ge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5nZW5pZVNwYWNlc30gb24gdGhlIGBtYXN0cmEoLi4uKWBcbiAqICAgICAgY2FsbC4gRXhwbGljaXQgTWFzdHJhIHdpcmluZyBhbHdheXMgd2lucyBzbyB1c2VycyBjYW5cbiAqICAgICAgb3ZlcnJpZGUgQXBwS2l0J3MgZGVmYXVsdHMgcGVyLWFnZW50LlxuICogICAyLiBBcHBLaXQgYGdlbmllKHsgc3BhY2VzOiB7IC4uLiB9IH0pYCBwbHVnaW4gaW5zdGFuY2UuIExldHNcbiAqICAgICAgdXNlcnMga2VlcCB1c2luZyB0aGUgZXhpc3RpbmcgQXBwS2l0IGNvbmZpZyBmb3JtYXRcbiAqICAgICAgKGBnZW5pZSh7IHNwYWNlczogeyBzYWxlczogXCIuLi5cIiwgb3BzOiBcIi4uLlwiIH0gfSlgKVxuICogICAgICB3aXRob3V0IHJlc3RhdGluZyB0aGUgc2FtZSByZWNvcmQgb24gdGhlIE1hc3RyYSBwbHVnaW4uXG4gKiAgICAgIFJlYWQgb2ZmIHRoZSBsaXZlIHBsdWdpbiBpbnN0YW5jZSB2aWEgYSBzdHJ1Y3R1cmFsIGNhc3RcbiAqICAgICAgc2luY2UgYFBsdWdpbi5jb25maWdgIGlzIFRTLXByb3RlY3RlZCAobm90IHJ1bnRpbWUtcHJpdmF0ZSkuXG4gKiAgIDMuIGBEQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEYCBlbnYgdmFyIChyZWdpc3RlcmVkIHVuZGVyIHRoZVxuICogICAgICB3ZWxsLWtub3duIGBkZWZhdWx0YCBhbGlhcykuIE1hdGNoZXMgdGhlIEFwcEtpdCBgZ2VuaWUoKWBcbiAqICAgICAgcGx1Z2luJ3MgZmFsbGJhY2sgYmVoYXZpb3Igc28gYSBiYXJlIGBtYXN0cmEoKWAgKyBgZ2VuaWUoKWBcbiAqICAgICAgcGFpciBqdXN0IHdvcmtzLlxuICpcbiAqIEFsaWFzZXMgY29sbGlkZSBjbGVhbmx5OiBhIGhpZ2hlci1wcmVjZWRlbmNlIHNvdXJjZSdzIHZhbHVlXG4gKiByZXBsYWNlcyBhIGxvd2VyIG9uZSdzIHdob2xlc2FsZS4gQSBzb3VyY2UgdGhhdCBjb250cmlidXRlcyB6ZXJvXG4gKiBhbGlhc2VzIGlzIHNraXBwZWQ7IGEgc291cmNlIHRoYXQgbmFtZXMgYW4gYWxpYXMgd2l0aG91dCBhIHNwYWNlXG4gKiBpZCBmYWlscyB0aHJvdWdoIHtAbGluayBub3JtYWxpemVHZW5pZVNwYWNlc30uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlR2VuaWVTcGFjZXMoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBjb250ZXh0OiBwbHVnaW5SZWdpc3RyeS5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCxcbik6IFJlY29yZDxzdHJpbmcsIEdlbmllU3BhY2VDb25maWc+IHtcbiAgY29uc3QgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnPiA9IHt9O1xuXG4gIC8vIFNvdXJjZSAzIChsb3dlc3QgcHJlY2VkZW5jZSk6IGVudiB2YXIuXG4gIGNvbnN0IGVudlNwYWNlSWQgPSBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEO1xuICBpZiAoZW52U3BhY2VJZCkge1xuICAgIG1lcmdlZFtERUZBVUxUX0dFTklFX0FMSUFTXSA9IHsgc3BhY2VJZDogZW52U3BhY2VJZCB9O1xuICB9XG5cbiAgLy8gU291cmNlIDI6IEFwcEtpdCBgZ2VuaWUoKWAgcGx1Z2luIGluc3RhbmNlIGNvbmZpZy4gVXNlIGFcbiAgLy8gc3RydWN0dXJhbCBjYXN0IC0gYFBsdWdpbi5jb25maWdgIGlzIGBwcm90ZWN0ZWRgIGluIFRTIG9ubHksXG4gIC8vIGFuZCB0aGUgcnVudGltZSBsYXlvdXQgaXMgcGxhaW4gb2JqZWN0IHByb3BlcnR5IGFjY2Vzcy5cbiAgY29uc3QgZ2VuaWVQbHVnaW4gPSBwbHVnaW5SZWdpc3RyeS5pbnN0YW5jZShjb250ZXh0LCBnZW5pZSk7XG4gIGlmIChnZW5pZVBsdWdpbikge1xuICAgIGNvbnN0IHBsdWdpblNwYWNlcyA9IChnZW5pZVBsdWdpbiBhcyB1bmtub3duIGFzIHsgY29uZmlnPzogQXBwS2l0R2VuaWVDb25maWcgfSkuY29uZmlnPy5zcGFjZXM7XG4gICAgaWYgKHBsdWdpblNwYWNlcykge1xuICAgICAgT2JqZWN0LmFzc2lnbihtZXJnZWQsIG5vcm1hbGl6ZUdlbmllU3BhY2VzKHBsdWdpblNwYWNlcykpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNvdXJjZSAxIChoaWdoZXN0IHByZWNlZGVuY2UpOiBleHBsaWNpdCBNYXN0cmEgd2lyaW5nLlxuICBpZiAoY29uZmlnLmdlbmllU3BhY2VzKSB7XG4gICAgT2JqZWN0LmFzc2lnbihtZXJnZWQsIG5vcm1hbGl6ZUdlbmllU3BhY2VzKGNvbmZpZy5nZW5pZVNwYWNlcykpO1xuICB9XG5cbiAgcmV0dXJuIG1lcmdlZDtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgZmxhdCBNYXN0cmEgdG9vbHMgcmVjb3JkIGZvciBldmVyeSBjb25maWd1cmVkIEdlbmllXG4gKiBzcGFjZS4gVHdvIHNoYXJlZCwgc3BhY2UtYWdub3N0aWMgdG9vbHMgKGBnZXRfc3RhdGVtZW50YCxcbiAqIGBwcmVwYXJlX2NoYXJ0YCkgYXJlIHJlZ2lzdGVyZWQgb25jZSByZWdhcmRsZXNzIG9mIGhvdyBtYW55XG4gKiBzcGFjZXMgYXJlIHdpcmVkOyB0aGUgcGVyLXNwYWNlIHRvb2xzIChgYXNrX2dlbmllYCxcbiAqIGBnZXRfc3BhY2VfZGVzY3JpcHRpb25gLCBgZ2V0X3NwYWNlX3NlcmlhbGl6ZWRgKSBhcmUgc3VmZml4ZWRcbiAqIHdpdGggYF88YWxpYXM+YCBmb3Igbm9uLWRlZmF1bHQgYWxpYXNlcyBzbyBtdWx0aS1zcGFjZVxuICogZGVwbG95bWVudHMgc3RheSBkaXNhbWJpZ3VhdGVkLlxuICpcbiAqIFJldHVybnMgYSByZWNvcmQga2V5ZWQgYnkgdG9vbCBpZCwgcmVhZHkgdG8gc3ByZWFkIGludG8gdGhlXG4gKiBjZW50cmFsIGBBZ2VudGAncyBgdG9vbHNgIG1hcCAob3Igc3VyZmFjZWQgdmlhIHRoZVxuICogYHBsdWdpbnMuZ2VuaWU/LnRvb2xraXQoKWAgY2FsbGJhY2spLiBSZXR1cm5zIGFuIGVtcHR5IHJlY29yZFxuICogd2hlbiBgc3BhY2VzYCByZXNvbHZlcyB0byB6ZXJvIGVudHJpZXMgc28gdGhlIGNhbGxlciBjYW4gc3ByZWFkXG4gKiBzYWZlbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEdlbmllVG9vbHMob3B0czoge1xuICBzcGFjZXM6IEdlbmllU3BhY2VzQ29uZmlnIHwgUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz47XG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xufSk6IE1hc3RyYVRvb2xzIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUdlbmllU3BhY2VzKG9wdHMuc3BhY2VzKTtcbiAgY29uc3QgdG9vbHM6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVRvb2w+PiA9IHt9O1xuICBpZiAoT2JqZWN0LmtleXMobm9ybWFsaXplZCkubGVuZ3RoID09PSAwKSByZXR1cm4gdG9vbHM7XG5cbiAgLy8gU2hhcmVkLCBzcGFjZS1hZ25vc3RpYyB0b29scy5cbiAgdG9vbHMuZ2V0X3N0YXRlbWVudCA9IGJ1aWxkR2V0U3RhdGVtZW50VG9vbCgpO1xuICB0b29scy5wcmVwYXJlX2NoYXJ0ID0gYnVpbGRQcmVwYXJlQ2hhcnRUb29sKHsgY29uZmlnOiBvcHRzLmNvbmZpZyB9KTtcblxuICBmb3IgKGNvbnN0IFthbGlhcywgc3BhY2VdIG9mIE9iamVjdC5lbnRyaWVzKG5vcm1hbGl6ZWQpKSB7XG4gICAgY29uc3QgYXNrVG9vbCA9IGJ1aWxkQXNrR2VuaWVUb29sKHtcbiAgICAgIHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQsXG4gICAgICBhbGlhcyxcbiAgICAgIC4uLihvcHRzLmNvbmZpZy5nZW5pZUFnZW50TW9kZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8geyBhZ2VudE1vZGU6IG9wdHMuY29uZmlnLmdlbmllQWdlbnRNb2RlIH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4oc3BhY2UuaGludCA/IHsgaGludDogc3BhY2UuaGludCB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRlc2NUb29sID0gYnVpbGRTcGFjZURlc2NyaXB0aW9uVG9vbCh7IHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQsIGFsaWFzIH0pO1xuICAgIGNvbnN0IHNlclRvb2wgPSBidWlsZFNwYWNlU2VyaWFsaXplZFRvb2woeyBzcGFjZUlkOiBzcGFjZS5zcGFjZUlkLCBhbGlhcyB9KTtcbiAgICB0b29sc1thc2tUb29sLmlkXSA9IGFza1Rvb2w7XG4gICAgdG9vbHNbZGVzY1Rvb2wuaWRdID0gZGVzY1Rvb2w7XG4gICAgdG9vbHNbc2VyVG9vbC5pZF0gPSBzZXJUb29sO1xuICB9XG4gIHJldHVybiB0b29scztcbn1cblxuLyoqXG4gKiBQbHVnaW4tdG9vbGtpdCBhZGFwdGVyIHNvIHRoZSBgcGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpYCBsb29rdXBcbiAqIGluc2lkZSBhbiBhZ2VudCdzIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2sgcmV0dXJucyB0aGVcbiAqIGZsYXQgR2VuaWUgdG9vbHMgcmVjb3JkIGluc3RlYWQgb2YgdGhyb3dpbmcgb24gbWlzc2luZyBwbHVnaW4uXG4gKiBNaXJyb3JzIEFwcEtpdCdzIGBQbHVnaW5Ub29sa2l0UHJvdmlkZXJgIHNoYXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRHZW5pZVRvb2xraXRQcm92aWRlcihvcHRzOiB7XG4gIHNwYWNlczogR2VuaWVTcGFjZXNDb25maWcgfCBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnPjtcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWc7XG59KToge1xuICB0b29sa2l0KG9wdHM/OiB1bmtub3duKTogTWFzdHJhVG9vbHM7XG59IHtcbiAgcmV0dXJuIHtcbiAgICB0b29sa2l0KF9vcHRzPzogdW5rbm93bikge1xuICAgICAgcmV0dXJuIGJ1aWxkR2VuaWVUb29scyhvcHRzKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3RhcnRlciBzdWdnZXN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBEZWZhdWx0IGNhcCBvbiBzdGFydGVyIHN1Z2dlc3Rpb25zIHN1cmZhY2VkIHRvIHRoZSBjaGF0IGVtcHR5XG4gKiBzdGF0ZS4gU2FtcGxlLXF1ZXN0aW9uIGxpc3RzIGNhbiBydW4gbG9uZyAoMTArIG9uIGEgY3VyYXRlZFxuICogc3BhY2UpOyBhIGhhbmRmdWwgb2Ygb25lLXRhcCBwcm9tcHRzIHJlYWRzIGJldHRlciB0aGFuIGEgd2FsbCBvZlxuICogYnV0dG9ucy5cbiAqL1xuY29uc3QgU1VHR0VTVElPTl9MSU1JVCA9IDY7XG5cbi8qKlxuICogSG93IGxvbmcgYSBzcGFjZSdzIHBhcnNlZCBzYW1wbGUgcXVlc3Rpb25zIHN0YXkgY2FjaGVkLiBUaGV5J3JlXG4gKiBhdXRob3JlZCBjb25maWcgdGhhdCBjaGFuZ2VzIHJhcmVseSwgYW5kIHRoZSBsb29rdXAgaXMgYW4gZXh0cmFcbiAqIFJFU1Qgcm91bmQtdHJpcCBwZXIgY2hhdCBtb3VudCwgc28gYSBmZXcgbWludXRlcyBvZiBjYWNoaW5nIGtlZXBzXG4gKiB0aGUgZW1wdHkgc3RhdGUgaW5zdGFudCBvbiByZWxvYWQgd2l0aG91dCBnb2luZyBzdGFsZSBmb3IgbG9uZy5cbiAqL1xuY29uc3QgU1VHR0VTVElPTl9DQUNIRV9UVExfTVMgPSAxMCAqIDYwXzAwMDtcblxuLyoqIEJvdW5kZWQgcHJvY2Vzcy1sb2NhbCBjYWNoZSBvZiBwYXJzZWQgc2FtcGxlIHF1ZXN0aW9ucyBieSBHZW5pZSBzcGFjZSBpZC4gKi9cbmNvbnN0IF9zdWdnZXN0aW9uQ2FjaGUgPSBjcmVhdGVDYWNoZSh7XG4gIG1heEVudHJpZXM6IDEyOCxcbiAgdHRsOiBTVUdHRVNUSU9OX0NBQ0hFX1RUTF9NUyxcbn0pO1xuXG4vKiogUmVhZCBhIHNwYWNlJ3MgY2FjaGVkIHF1ZXN0aW9ucywgb3IgYHVuZGVmaW5lZGAgb24gbWlzcyAvIGV4cGlyeS4gKi9cbmZ1bmN0aW9uIHJlYWRTdWdnZXN0aW9uQ2FjaGUoc3BhY2VJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXSB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4gX3N1Z2dlc3Rpb25DYWNoZS5nZXQ8c3RyaW5nW10+KHNwYWNlSWQpO1xufVxuXG4vKiogQ2FjaGUgYSBzcGFjZSdzIHBhcnNlZCBxdWVzdGlvbnMgZm9yIHtAbGluayBTVUdHRVNUSU9OX0NBQ0hFX1RUTF9NU30uICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZVN1Z2dlc3Rpb25DYWNoZShzcGFjZUlkOiBzdHJpbmcsIHF1ZXN0aW9uczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgX3N1Z2dlc3Rpb25DYWNoZS5zZXQoc3BhY2VJZCwgcXVlc3Rpb25zKTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IHRoZSBjdXJhdGVkIHN0YXJ0ZXIgcXVlc3Rpb25zIGFjcm9zcyBldmVyeSByZXNvbHZlZCBHZW5pZVxuICogc3BhY2UsIGRlZHVwZWQgYW5kIGNhcHBlZC4gRWFjaCBzcGFjZSdzIGBzYW1wbGVfcXVlc3Rpb25zYCBhcmVcbiAqIGZldGNoZWQgb25jZSAoY2FjaGVkIGZvciB7QGxpbmsgU1VHR0VTVElPTl9DQUNIRV9UVExfTVN9KSB2aWFcbiAqIHtAbGluayBnZXRHZW5pZVNwYWNlfSArIHtAbGluayBnZW5pZVNhbXBsZVF1ZXN0aW9uc30sIHRoZW4gbWVyZ2VkIGluXG4gKiBhbGlhcy1pdGVyYXRpb24gb3JkZXIgc28gYSBzaW5nbGUtc3BhY2UgYXBwIHN1cmZhY2VzIHRoYXQgc3BhY2Unc1xuICogcXVlc3Rpb25zIGFuZCBhIG11bHRpLXNwYWNlIGFwcCByb3VuZC10cmlwcyBicmVhZHRoLWZpcnN0IHVwIHRvIHRoZVxuICogY2FwLiBBIHBlci1zcGFjZSBmZXRjaCBmYWlsdXJlIGRlZ3JhZGVzIHRvIFwibm8gcXVlc3Rpb25zIGZvciB0aGF0XG4gKiBzcGFjZVwiIChsb2dnZWQsIG5vdCB0aHJvd24pIHNvIG9uZSB1bnJlYWNoYWJsZSBzcGFjZSBuZXZlciBibGFua3NcbiAqIHRoZSB3aG9sZSBsaXN0LiBXaGVuIGBzaWduYWxgIGFib3J0cyAodGhlIEhUVFAgY2FsbGVyIGRpc2Nvbm5lY3RlZCksXG4gKiBjb2xsZWN0aW9uIHN0b3BzIHNpbGVudGx5IGFuZCByZXR1cm5zIHdoYXQgd2FzIG1lcmdlZCBzbyBmYXIuXG4gKiBSZXR1cm5zIGBbXWAgd2hlbiBubyBzcGFjZXMgYXJlIGNvbmZpZ3VyZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb2xsZWN0U3BhY2VTdWdnZXN0aW9ucyhvcHRzOiB7XG4gIHNwYWNlczogUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz47XG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgbGltaXQ/OiBudW1iZXI7XG59KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBsaW1pdCA9IG9wdHMubGltaXQgPz8gU1VHR0VTVElPTl9MSU1JVDtcbiAgY29uc3QgbWVyZ2VkOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCB7IHNwYWNlSWQgfSBvZiBPYmplY3QudmFsdWVzKG9wdHMuc3BhY2VzKSkge1xuICAgIGxldCBxdWVzdGlvbnMgPSBhd2FpdCByZWFkU3VnZ2VzdGlvbkNhY2hlKHNwYWNlSWQpO1xuICAgIGlmICghcXVlc3Rpb25zKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzcGFjZSA9IGF3YWl0IGdlbmllU3BhY2UuZ2V0R2VuaWVTcGFjZShzcGFjZUlkLCB7XG4gICAgICAgICAgd29ya3NwYWNlQ2xpZW50OiBvcHRzLmNsaWVudCxcbiAgICAgICAgICAuLi4ob3B0cy5zaWduYWwgPyB7IGNvbnRleHQ6IG9wdHMuc2lnbmFsIH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgICBxdWVzdGlvbnMgPSBnZW5pZVNwYWNlLmdlbmllU2FtcGxlUXVlc3Rpb25zKHNwYWNlKTtcbiAgICAgICAgYXdhaXQgd3JpdGVTdWdnZXN0aW9uQ2FjaGUoc3BhY2VJZCwgcXVlc3Rpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAob3B0cy5zaWduYWw/LmFib3J0ZWQpIHJldHVybiBtZXJnZWQ7XG4gICAgICAgIGxvZ2dlci53YXJuKFwic3VnZ2VzdGlvbnM6ZmV0Y2gtZXJyb3JcIiwge1xuICAgICAgICAgIHNwYWNlSWQsXG4gICAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnIpLFxuICAgICAgICB9KTtcbiAgICAgICAgcXVlc3Rpb25zID0gW107XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgcXVlc3Rpb24gb2YgcXVlc3Rpb25zKSB7XG4gICAgICBpZiAoc2Vlbi5oYXMocXVlc3Rpb24pKSBjb250aW51ZTtcbiAgICAgIHNlZW4uYWRkKHF1ZXN0aW9uKTtcbiAgICAgIG1lcmdlZC5wdXNoKHF1ZXN0aW9uKTtcbiAgICAgIGlmIChtZXJnZWQubGVuZ3RoID49IGxpbWl0KSByZXR1cm4gbWVyZ2VkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWVyZ2VkO1xufVxuIl19
|
package/lib/src/memory.d.ts
CHANGED
|
@@ -35,7 +35,7 @@ import type { AgentMemoryOption } from "@mastra/core/agent";
|
|
|
35
35
|
import { type RequestContext } from "@mastra/core/request-context";
|
|
36
36
|
import { Memory } from "@mastra/memory";
|
|
37
37
|
import { PostgresStore } from "@mastra/pg";
|
|
38
|
-
import { Pool
|
|
38
|
+
import type { Pool } from "pg";
|
|
39
39
|
import type { AnyMastraAgentDefinition } from "./agents.ts";
|
|
40
40
|
import type { MastraPluginConfig } from "./config.ts";
|
|
41
41
|
/** Resolve the trusted Mastra memory scope stamped by AppKit middleware. */
|
|
@@ -57,26 +57,6 @@ export declare function withRequestMemoryScope<T extends object>(options: T, req
|
|
|
57
57
|
* fatal so missing schemas/tables are retried or surfaced instead of hidden.
|
|
58
58
|
*/
|
|
59
59
|
export declare function withSoftStorageInit(store: PostgresStore): PostgresStore;
|
|
60
|
-
/**
|
|
61
|
-
* Build a dedicated **service-principal** Lakebase pool for Mastra
|
|
62
|
-
* memory from the lakebase plugin's resolved SP pg config.
|
|
63
|
-
*
|
|
64
|
-
* The plugin's `exports().pool` is a `RoutingPool` that switches to
|
|
65
|
-
* the per-user (OBO) pool whenever a query runs inside an `asUser`
|
|
66
|
-
* scope - exactly the context the mastra plugin establishes around
|
|
67
|
-
* every chat turn. Memory (threads / messages + semantic recall) must
|
|
68
|
-
* instead always act as the app service principal: it owns the
|
|
69
|
-
* auto-created `mastra_*` schemas (a per-user role usually can't
|
|
70
|
-
* `CREATE SCHEMA`) and is shared across users, so it cannot inherit a
|
|
71
|
-
* request's OBO identity.
|
|
72
|
-
*
|
|
73
|
-
* `pgConfig` must be the plugin's `exports().getPgConfig()` evaluated
|
|
74
|
-
* **outside** any `asUser` scope (i.e. during setup), so it carries
|
|
75
|
-
* the SP connection target, OAuth token-refresh `password` callback,
|
|
76
|
-
* and any `lakebase({ pool })` tuning overrides - all of which this
|
|
77
|
-
* pool inherits. See the call site in `plugin.ts`.
|
|
78
|
-
*/
|
|
79
|
-
export declare function createServicePrincipalPool(pgConfig: PoolConfig): Promise<Pool>;
|
|
80
60
|
/**
|
|
81
61
|
* True when any plugin-level or per-agent setting could need the
|
|
82
62
|
* Lakebase pool. Used by `plugin.ts` to gate creation of the
|
|
@@ -86,7 +66,7 @@ export declare function createServicePrincipalPool(pgConfig: PoolConfig): Promis
|
|
|
86
66
|
export declare function needsLakebase(config: MastraPluginConfig): boolean;
|
|
87
67
|
/**
|
|
88
68
|
* Construct a per-agent {@link Memory} factory bound to the supplied
|
|
89
|
-
* service-principal pool
|
|
69
|
+
* service-principal pool.
|
|
90
70
|
* Caches the shared `PgVector` singleton (built on first need) so each
|
|
91
71
|
* agent build is O(1) after the first.
|
|
92
72
|
*/
|