@dbx-tools/appkit-mastra 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.ts +71 -71
- package/lib/index.d.ts +71 -71
- package/lib/index.js +1 -1
- package/lib/src/agents.d.ts +2 -2
- package/lib/src/agents.js +1 -1
- package/lib/src/chart.d.ts +1 -1
- package/lib/src/chart.js +1 -1
- package/lib/src/config.d.ts +2 -2
- package/lib/src/config.js +1 -1
- package/lib/src/genie.d.ts +2 -2
- package/lib/src/genie.js +1 -1
- package/lib/src/history.js +1 -1
- package/lib/src/mcp.d.ts +2 -2
- package/lib/src/mcp.js +1 -1
- package/lib/src/memory.d.ts +2 -2
- package/lib/src/memory.js +1 -1
- package/lib/src/mlflow.js +1 -1
- package/lib/src/model.d.ts +1 -1
- package/lib/src/model.js +2 -2
- package/lib/src/observability.js +1 -1
- package/lib/src/plugin.d.ts +2 -2
- package/lib/src/plugin.js +1 -1
- package/lib/src/server.d.ts +1 -1
- package/lib/src/server.js +2 -2
- package/lib/src/serving.d.ts +1 -1
- package/lib/src/serving.js +1 -1
- package/lib/src/summarize.d.ts +1 -1
- package/lib/src/summarize.js +1 -1
- package/lib/src/threads.js +1 -1
- package/lib/src/workspaces.js +1 -1
- package/package.json +9 -9
- package/src/agents.ts +8 -8
- package/src/chart.ts +2 -2
- package/src/config.ts +2 -2
- package/src/genie.ts +6 -6
- package/src/history.ts +1 -1
- package/src/mcp.ts +2 -2
- package/src/memory.ts +4 -4
- package/src/mlflow.ts +1 -1
- package/src/model.ts +3 -3
- package/src/observability.ts +1 -1
- package/src/plugin.ts +15 -15
- package/src/server.ts +7 -3
- package/src/serving.ts +1 -1
- package/src/summarize.ts +2 -2
- package/src/threads.ts +2 -2
- package/src/workspaces.ts +2 -2
package/lib/src/agents.js
CHANGED
|
@@ -551,4 +551,4 @@ function toolkitEntryToMastraTool(entry, plugin) {
|
|
|
551
551
|
},
|
|
552
552
|
});
|
|
553
553
|
}
|
|
554
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFPLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU3RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSWhELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUU5QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEVBQUUsZUFBZSxFQUFFLHlCQUF5QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBbUIvQyx5RUFBeUU7QUFDekUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWhEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxNQUFNLFVBQVUsSUFBSSxDQUFDLElBQXVCO0lBQzFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyRCxPQUFPLFVBQVUsQ0FBQztRQUNoQixFQUFFO1FBQ0YsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1FB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LEtBQWMsRUFBRSxPQUFnQixFQUFFLEVBQUU7WUFDbEQsTUFBTSxNQUFNLEdBQUksT0FBcUQsRUFBRSxXQUFXLENBQUM7WUFDbkYsT0FBTyxNQUFNLENBQUMsZ0JBQWlCLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbEUsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFnZW50IHJlZ2lzdHJhdGlvbiBmb3IgdGhlIE1hc3RyYSBBcHBLaXQgcGx1Z2luLlxuICpcbiAqIE1pcnJvcnMgdGhlIHNoYXBlIG9mIHRoZSBBcHBLaXQgYGFnZW50c2AgcGx1Z2luIChgY29uZmlnLmFnZW50c2AgbWFwXG4gKiBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9ufSwgZHVhbC1mb3JtIGB0b29sc2AgYWNjZXB0aW5nIGEgcGxhaW5cbiAqIHJlY29yZCBvciBhIGAocGx1Z2lucykgPT4gdG9vbHNgIGNhbGxiYWNrKS4gUmVzb2x2ZXMgZWFjaCBkZWZpbml0aW9uXG4gKiBpbnRvIGEgTWFzdHJhIGBBZ2VudGAgaW5zdGFuY2UgZHVyaW5nIHBsdWdpbiBzZXR1cDsgdXNlci1zdXBwbGllZFxuICogdG9vbCBjYWxsYmFja3MgYXJlIGludm9rZWQgZXhhY3RseSBvbmNlIHdpdGggYSB0eXBlZFxuICoge0BsaW5rIE1hc3RyYVBsdWdpbnN9IG1hcCBidWlsdCBmcm9tIHJlZ2lzdGVyZWQgc2libGluZyBwbHVnaW5zLlxuICpcbiAqIFdoZW4gbm8gYWdlbnRzIGFyZSByZWdpc3RlcmVkIHRoZSBwbHVnaW4gZmFsbHMgYmFjayB0byBhIHNpbmdsZVxuICogYnVpbHQtaW4gYW5hbHlzdCBzbyB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZ1xuICogc3RyZWFtYWJsZSBhZ2VudCBmb3IgZGVtb3MuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IHBsdWdpbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZmFsbGJhY2sgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nLCBvYmplY3QsIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50Q29uZmlnLCBUb29sc0lucHV0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgdHlwZSB7IFRvb2wgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5pbXBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2UgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHR5cGUgeyBQZ1ZlY3RvckNvbmZpZywgUG9zdGdyZXNTdG9yZUNvbmZpZyB9IGZyb20gXCJAbWFzdHJhL3BnXCI7XG5cbmltcG9ydCB7IGJ1aWxkUmVuZGVyRGF0YVRvb2wgfSBmcm9tIFwiLi9jaGFydFwiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB7IGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXIsIHJlc29sdmVHZW5pZVNwYWNlcyB9IGZyb20gXCIuL2dlbmllXCI7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9tZW1vcnlcIjtcbmltcG9ydCB7IGJ1aWxkTW9kZWwgfSBmcm9tIFwiLi9tb2RlbFwiO1xuaW1wb3J0IHsgUmVzdWx0UHJvY2Vzc29yLCBzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yIH0gZnJvbSBcIi4vcHJvY2Vzc29yc1wiO1xuaW1wb3J0IHsgYnVpbGRTdW1tYXJpemVUb29sIH0gZnJvbSBcIi4vc3VtbWFyaXplXCI7XG5pbXBvcnQgeyBjcmVhdGVXb3Jrc3BhY2UgfSBmcm9tIFwiLi93b3Jrc3BhY2VzXCI7XG5cbi8qKlxuICogVG9vbCByZWNvcmQgYWNjZXB0ZWQgYnkgZXZlcnkgTWFzdHJhIGBBZ2VudC50b29sc2AgZmllbGQgYW5kIGJ5IHRoZVxuICogYHRvb2xzKHBsdWdpbnMpYCBjYWxsYmFjayBvbiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9ufS5cbiAqXG4gKiBBbGlhcyBvZiBNYXN0cmEncyBgVG9vbHNJbnB1dGAsIHNvIGl0IGFscmVhZHkgYWNjZXB0czpcbiAqXG4gKiAtIE1hc3RyYSB0b29scyBidWlsdCB3aXRoIHtAbGluayBjcmVhdGVUb29sfSAob3IgYG5ldyBUb29sKC4uLilgKVxuICogLSBNYXN0cmEgdG9vbHMgYnVpbHQgd2l0aCB0aGUgQXBwS2l0LXNoYXBlZCB7QGxpbmsgdG9vbH0gd3JhcHBlclxuICogICBiZWxvd1xuICogLSBWZXJjZWwgQUkgU0RLIHRvb2xzIChgdG9vbCh7IC4uLiB9KWAgZnJvbSBgYWlgKVxuICogLSBQcm92aWRlci1kZWZpbmVkIHRvb2xzIChlLmcuIGBvcGVuYWkudG9vbHMud2ViU2VhcmNoKC4uLilgKVxuICpcbiAqIEV4aXN0aW5nIHRvb2wgbGlicmFyaWVzIGRyb3AgaW4gYXMtaXMgLSBub3RoaW5nIGluIHRoaXMgcGFja2FnZVxuICogZm9yY2VzIGEgcmVidWlsZC5cbiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhVG9vbHMgPSBUb29sc0lucHV0O1xuXG4vKiogUmUtZXhwb3J0IG9mIE1hc3RyYSdzIG5hdGl2ZSBgY3JlYXRlVG9vbGAgZm9yIGZ1bGwtZmVhdHVyZSBhY2Nlc3MuICovXG5leHBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuXG4vKipcbiAqIEFwcEtpdC1zaGFwZWQgdG9vbCBmYWN0b3J5LiBMZXRzIHVzZXJzIG1peC1hbmQtbWF0Y2ggdG9vbHMgYWNyb3NzXG4gKiBBcHBLaXQncyBgYWdlbnRzYCBwbHVnaW4gYW5kIGBtYXN0cmFgIHdpdGggYSBzaW5nbGUgaW1wb3J0OlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyB0b29sIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuICogaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbiAqXG4gKiBnZXRfd2VhdGhlcjogdG9vbCh7XG4gKiAgIGRlc2NyaXB0aW9uOiBcIldlYXRoZXJcIixcbiAqICAgc2NoZW1hOiB6Lm9iamVjdCh7IGNpdHk6IHouc3RyaW5nKCkgfSksXG4gKiAgIGV4ZWN1dGU6IGFzeW5jICh7IGNpdHkgfSkgPT4gYFN1bm55IGluICR7Y2l0eX1gLFxuICogfSksXG4gKiBgYGBcbiAqXG4gKiBNYXBzIG9udG8gTWFzdHJhJ3MgYGNyZWF0ZVRvb2xgOlxuICpcbiAqIC0gYGRlc2NyaXB0aW9uYCAtPiBgZGVzY3JpcHRpb25gIChyZXF1aXJlZClcbiAqIC0gYHNjaGVtYWAgLT4gYGlucHV0U2NoZW1hYCAob3B0aW9uYWwpXG4gKiAtIGBleGVjdXRlKGlucHV0KWAgLT4gYGV4ZWN1dGUoaW5wdXQsIGN0eClgIC0gTWFzdHJhIGFscmVhZHkgY2FsbHNcbiAqICAgdGhlIGZpcnN0IGFyZyB3aXRoIHRoZSBwYXJzZWQgaW5wdXRzLCBzbyB0aGUgYm9keSBzaGFwZSBpc1xuICogICBpZGVudGljYWwuIFRoZSBNYXN0cmEgYGNvbnRleHRgIGFyZyBpcyBmb3J3YXJkZWQgYXMgdGhlIHNlY29uZFxuICogICBwYXJhbWV0ZXIgd2hlbiB0aGUgY2FsbGVyIGRlY2xhcmVzIGl0LlxuICogLSBgaWRgOiBvcHRpb25hbC4gRGVmYXVsdHMgdG8gYSBzdGFibGUgaWRlbnRpZmllciBkZXJpdmVkIGZyb21cbiAqICAgYGRlc2NyaXB0aW9uYCAoc2x1Z2lmaWVkLCB3aXRoIGEgc2hvcnQgaGFzaCBzdWZmaXggZm9yXG4gKiAgIHVuaXF1ZW5lc3MpLiBQYXNzIGFuIGV4cGxpY2l0IGBpZGAgd2hlbiB5b3UgbmVlZCBhIHN0YWJsZSBzdHJpbmdcbiAqICAgZm9yIHRyYWNpbmcgb3IgTUNQIGV4cG9zdXJlLlxuICpcbiAqIFJlYWNoIGZvciB7QGxpbmsgY3JlYXRlVG9vbH0gd2hlbiB5b3UgbmVlZCBNYXN0cmEtb25seSBmaWVsZHNcbiAqIChgb3V0cHV0U2NoZW1hYCwgYHN1c3BlbmRTY2hlbWFgLCBgcmVxdWlyZUFwcHJvdmFsYCwgYG1jcGAsIGV0Yy4pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9vbChvcHRzOiBBcHBLaXRUb29sT3B0aW9ucyk6IFRvb2wge1xuICBjb25zdCBpZCA9IG9wdHMuaWQgPz8gZGVyaXZlVG9vbElkKG9wdHMuZGVzY3JpcHRpb24pO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQsXG4gICAgZGVzY3JpcHRpb246IG9wdHMuZGVzY3JpcHRpb24sXG4gICAgLi4uKG9wdHMuc2NoZW1hID8geyBpbnB1dFNjaGVtYTogb3B0cy5zY2hlbWEgYXMgbmV2ZXIgfSA6IHt9KSxcbiAgICBleGVjdXRlOiBvcHRzLmV4ZWN1dGUgYXMgbmV2ZXIsXG4gIH0pO1xufVxuXG4vKipcbiAqIElucHV0IHNoYXBlIGZvciB0aGUgQXBwS2l0LXN0eWxlIHtAbGluayB0b29sfSBmYWN0b3J5LiBBIHRyaW1tZWRcbiAqIHN1YnNldCBvZiBNYXN0cmEncyBgY3JlYXRlVG9vbGAgb3B0aW9ucyB0aGF0IG1pcnJvcnMgdGhlXG4gKiBgQGRhdGFicmlja3MvYXBwa2l0L2JldGFgIGB0b29sKHsgZGVzY3JpcHRpb24sIHNjaGVtYSwgZXhlY3V0ZSB9KWBcbiAqIHNpZ25hdHVyZS5cbiAqXG4gKiBHZW5lcmljcyBhcmUgaW50ZW50aW9uYWxseSBhYnNlbnQgLSBpbmZlcmVuY2UgZmxvd3MgdGhyb3VnaCB0aGVcbiAqIGNhbGxlcidzIGBzY2hlbWFgICh0eXBpY2FsbHkgYSBab2Qgb2JqZWN0KSwgYW5kIHRoZSBgZXhlY3V0ZWAgYm9keVxuICogZGVzdHJ1Y3R1cmVzIG5hdHVyYWxseSBmcm9tIHRoYXQuIFJlYWNoIGZvciB7QGxpbmsgY3JlYXRlVG9vbH0gd2hlblxuICogeW91IG5lZWQgdGhlIGZ1bGx5LXR5cGVkIGlucHV0L291dHB1dCBzY2hlbWFzIHdpcmVkIGV4cGxpY2l0bHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwS2l0VG9vbE9wdGlvbnMge1xuICAvKiogT3B0aW9uYWwgc3RhYmxlIGlkZW50aWZpZXI7IGF1dG8tZGVyaXZlZCBmcm9tIGBkZXNjcmlwdGlvbmAgd2hlbiBvbWl0dGVkLiAqL1xuICBpZD86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIHNob3duIHRvIHRoZSBtb2RlbC4gUmVxdWlyZWQuICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBpbnB1dCBzY2hlbWEgKGFueSBTdGFuZGFyZCBTY2hlbWEgaW5zdGFuY2UsIGUuZy4gWm9kKS5cbiAgICogTWFwcyB0byBNYXN0cmEncyBgaW5wdXRTY2hlbWFgOyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgbW9kZWxcbiAgICogdmVyYmF0aW0uXG4gICAqL1xuICBzY2hlbWE/OiB1bmtub3duO1xuICAvKipcbiAgICogRXhlY3V0ZSBib2R5LiBGaXJzdCBhcmcgaXMgdGhlIHBhcnNlZCBpbnB1dCAodHlwZWQgb2ZmIGBzY2hlbWFgXG4gICAqIHdoZW4gc3VwcGxpZWQpLCBzZWNvbmQgYXJnIGlzIHRoZSBmdWxsIE1hc3RyYSBleGVjdXRpb24gY29udGV4dFxuICAgKiAocmVxdWVzdCBjb250ZXh0LCBhYm9ydCBzaWduYWwsIG1hc3RyYSBpbnN0YW5jZSkgaWYgeW91IG5lZWQgaXQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBleGVjdXRlOiAoaW5wdXQ6IGFueSwgY29udGV4dD86IHVua25vd24pID0+IHVua25vd247XG59XG5cbi8qKlxuICogQnVpbGQgYSBkZXRlcm1pbmlzdGljIE1hc3RyYSB0b29sIGlkIGZyb20gYSBkZXNjcmlwdGlvbi5cbiAqIERlbGVnYXRlcyB0byB7QGxpbmsgc3RyaW5nLnRvVW5pcXVlU2x1Z306IHNsdWcgKyBhbHdheXMtb25cbiAqIDYtY2hhciBGTlYtMWEgYmFzZS0zMiBzdWZmaXggc28gdHdvIHRvb2xzIHdpdGggdGhlIHNhbWUgbGVhZGluZ1xuICogd29yZHMgZG9uJ3QgY29sbGlkZSBpbiB0cmFjZXMuIFN0YWJsZSBhY3Jvc3MgcnVucy5cbiAqL1xuZnVuY3Rpb24gZGVyaXZlVG9vbElkKGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3RyaW5nLnRvVW5pcXVlU2x1ZyhkZXNjcmlwdGlvbiwgeyBmYWxsYmFja1ByZWZpeDogXCJ0b29sXCIgfSk7XG59XG5cbi8qKlxuICogSWRlbnRpdHkgaGVscGVyIHRoYXQgYnJhbmRzIGEgZGVmaW5pdGlvbiBhcyBhIE1hc3RyYSBhZ2VudC4gTWlycm9yc1xuICogQXBwS2l0J3MgYGNyZWF0ZUFnZW50KGRlZilgIHNvIHRoZSByZWdpc3RyYXRpb24gc2hhcGUgbWF0Y2hlczpcbiAqXG4gKiBgYGB0c1xuICogY29uc3Qgc3VwcG9ydCA9IGNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiLFxuICogICBtb2RlbDogXCJkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02XCIsXG4gKiAgIHRvb2xzKHBsdWdpbnMpIHsgcmV0dXJuIHsgLi4uIH07IH0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIFJldHVybnMgdGhlIGRlZmluaXRpb24gdW5jaGFuZ2VkIC0gdGhlIHdyYXBwZXIgZXhpc3RzIG9ubHkgdG8gYW5jaG9yXG4gKiB0eXBlIGluZmVyZW5jZSBhbmQgdG8gbWF0Y2ggdGhlIEFwcEtpdCBBUEkgc3VyZmFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFnZW50PFQgZXh0ZW5kcyBNYXN0cmFBZ2VudERlZmluaXRpb24+KGRlZjogVCk6IFQge1xuICBjb25zdCB3b3Jrc3BhY2UgPSBkZWYud29ya3NwYWNlID8/IGNyZWF0ZVdvcmtzcGFjZSgpO1xuICByZXR1cm4geyAuLi5kZWYsIHdvcmtzcGFjZSB9O1xufVxuXG4vKipcbiAqIEZpbHRlciAvIHJlbmFtZSBvcHRpb25zIGFjY2VwdGVkIGJ5IGV2ZXJ5IHBsdWdpbidzIGAudG9vbGtpdCgpYFxuICogbWV0aG9kLiBNaXJyb3JzIEFwcEtpdCdzIGBUb29sa2l0T3B0aW9uc2AgdmVyYmF0aW0gc28gb3B0aW9ucyBwYXNzXG4gKiB0aHJvdWdoIHVuY2hhbmdlZCAtIHRoZSB1bmRlcmx5aW5nIEFwcEtpdCBwbHVnaW4gZG9lcyB0aGUgZmlsdGVyaW5nXG4gKiBhbmQgd2UganVzdCBhZGFwdCB0aGUgcmVzdWx0aW5nIGVudHJpZXMgaW50byBNYXN0cmEgdG9vbHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbGtpdE9wdGlvbnMge1xuICAvKipcbiAgICogS2V5IHByZWZpeCBwcmVwZW5kZWQgdG8gZXZlcnkgdG9vbCBuYW1lLiBBcHBLaXQncyBkZWZhdWx0IGlzXG4gICAqIGAke3BsdWdpbk5hbWV9LmAgd2hlbiBvbWl0dGVkOyBwYXNzIGFuIGV4cGxpY2l0IGBcIlwiYCB0byBkcm9wIGl0LlxuICAgKi9cbiAgcHJlZml4Pzogc3RyaW5nO1xuICAvKiogQWxsb3dsaXN0IG9mIGxvY2FsIHRvb2wgbmFtZXMuICovXG4gIG9ubHk/OiBzdHJpbmdbXTtcbiAgLyoqIERlbnlsaXN0IG9mIGxvY2FsIHRvb2wgbmFtZXMuICovXG4gIGV4Y2VwdD86IHN0cmluZ1tdO1xuICAvKiogUmVtYXAgc3BlY2lmaWMgbG9jYWwgbmFtZXMgdG8gZGlmZmVyZW50IGtleXMuICovXG4gIHJlbmFtZT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogVG9vbGtpdCBwcm92aWRlciBzaGFwZSBldmVyeSBlbnRyeSBpbiB0aGUge0BsaW5rIE1hc3RyYVBsdWdpbnN9IG1hcFxuICogZXhwb3Nlcy4gSWRlbnRpY2FsIHRvIEFwcEtpdCdzIGBQbHVnaW5Ub29sa2l0UHJvdmlkZXJgIC0gYW55IEFwcEtpdFxuICogcGx1Z2luIHRoYXQgaW1wbGVtZW50cyB0aGUgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYGdldEFnZW50VG9vbHNgICsgYGV4ZWN1dGVBZ2VudFRvb2xgICsgYHRvb2xraXRgKSBpcyByZWFjaGFibGVcbiAqIHRocm91Z2ggdGhpcyBzdXJmYWNlIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHtcbiAgLyoqXG4gICAqIFJldHVybnMgYSBNYXN0cmEtc2hhcGVkIHRvb2xzIHJlY29yZCBhZGFwdGVkIGZyb20gdGhlIHBsdWdpbidzXG4gICAqIGFnZW50IHRvb2xzLiBFYWNoIHRvb2wgZGlzcGF0Y2hlcyBiYWNrIHRocm91Z2ggdGhlIHBsdWdpbidzXG4gICAqIGBleGVjdXRlQWdlbnRUb29sYCBzbyBPQk8gYXV0aCBhbmQgdGVsZW1ldHJ5IHNwYW5zIHN0YXkgaW50YWN0LlxuICAgKi9cbiAgdG9vbGtpdChvcHRzPzogVG9vbGtpdE9wdGlvbnMpOiBNYXN0cmFUb29scztcbn1cblxuLyoqXG4gKiBQbHVnaW4gbWFwIGhhbmRlZCB0byB0aGUgZnVuY3Rpb24gZm9ybSBvZlxuICoge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbi50b29sc30uIE1pcnJvcnMgQXBwS2l0J3MgYFBsdWdpbnNgXG4gKiB0eXBlIGV4YWN0bHk6IGEgc3RyaW5nLWtleWVkIHJlY29yZCB3aGVyZSBldmVyeSB2YWx1ZSBleHBvc2VzXG4gKiBgLnRvb2xraXQob3B0cylgLlxuICpcbiAqIEltcGxlbWVudGVkIGFzIGEgcnVudGltZSBQcm94eSB0aGF0IGF1dG8tZGlzY292ZXJzIGFueSByZWdpc3RlcmVkXG4gKiBBcHBLaXQgcGx1Z2luIGltcGxlbWVudGluZyB0aGUgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYGFuYWx5dGljc2AsIGBmaWxlc2AsIGBsYWtlYmFzZWAsIGBnZW5pZWAsIHBsdXMgYW55IHRoaXJkLXBhcnR5XG4gKiBwbHVnaW4gdGhhdCBkb2VzIHRoZSBzYW1lKS4gVW5rbm93biBuYW1lcyByZXNvbHZlIHRvIGB1bmRlZmluZWRgXG4gKiBhdCBydW50aW1lLCBzbyBndWFyZCB3aXRoIGA/LmAgYW5kIGA/PyB7fWAgd2hlbiBzcHJlYWRpbmcgZnJvbSBhXG4gKiBwbHVnaW4gdGhhdCBtYXkgbm90IGJlIHJlZ2lzdGVyZWQgaW4gZXZlcnkgZW52aXJvbm1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogXCIuLi5cIixcbiAqICAgdG9vbHMocGx1Z2lucykge1xuICogICAgIHJldHVybiB7XG4gKiAgICAgICAuLi5wbHVnaW5zLmFuYWx5dGljcy50b29sa2l0KCksXG4gKiAgICAgICAuLi5wbHVnaW5zLmZpbGVzLnRvb2xraXQoeyBvbmx5OiBbXCJ1cGxvYWRzLnJlYWRcIl0gfSksXG4gKiAgICAgICBnZXRfd2VhdGhlcjogdG9vbCh7XG4gKiAgICAgICAgIGRlc2NyaXB0aW9uOiBcIldlYXRoZXJcIixcbiAqICAgICAgICAgc2NoZW1hOiB6Lm9iamVjdCh7IGNpdHk6IHouc3RyaW5nKCkgfSksXG4gKiAgICAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IGNpdHkgfSkgPT4gYFN1bm55IGluICR7Y2l0eX1gLFxuICogICAgICAgfSksXG4gKiAgICAgfTtcbiAqICAgfSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVBsdWdpbnMgPSBSZWNvcmQ8c3RyaW5nLCBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXI+O1xuXG4vKiogRnVuY3Rpb24gZm9ybSBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9uLnRvb2xzfS4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVRvb2xzRm4gPSAocGx1Z2luczogTWFzdHJhUGx1Z2lucykgPT4gTWFzdHJhVG9vbHMgfCBQcm9taXNlPE1hc3RyYVRvb2xzPjtcblxuLyoqIEZ1bmN0aW9uIGZvcm0gb2Yge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbi53b3Jrc3BhY2V9LiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlciA9ICgpID0+IFdvcmtzcGFjZSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIGNvZGUtZGVmaW5lZCBNYXN0cmEgYWdlbnQuIE1pcnJvcnMgdGhlIHNoYXBlIEFwcEtpdCdzIGBhZ2VudHNgXG4gKiBwbHVnaW4gdXNlcyBmb3IgYEFnZW50RGVmaW5pdGlvbmAuIFRoZSByZWdpc3RyeSBrZXkgdW5kZXJcbiAqIGBjb25maWcuYWdlbnRzYCBpcyB0aGUgYGFnZW50SWRgIHRoZSBjbGllbnQgc3RyZWFtcyBhZ2FpbnN0OyBgbmFtZWBcbiAqIGlzIHB1cmVseSBpbmZvcm1hdGlvbmFsIChkZWZhdWx0cyB0byB0aGUga2V5KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFBZ2VudERlZmluaXRpb24ge1xuICAvKiogRGlzcGxheSBuYW1lIHVzZWQgYXMgYEFnZW50Lm5hbWVgLiBEZWZhdWx0cyB0byB0aGUgcmVnaXN0cnkga2V5LiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgbG9uZy1mb3JtIGRlc2NyaXB0aW9uOyBzdXJmYWNlZCBhcyBgQWdlbnQuZGVzY3JpcHRpb25gLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN5c3RlbSBwcm9tcHQgYm9keS4gKi9cbiAgaW5zdHJ1Y3Rpb25zOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgbW9kZWwgb3ZlcnJpZGUuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBmYWxscyBiYWNrIHRvIHRoZSB3b3Jrc3BhY2VcbiAgICogICBgL3NlcnZpbmctZW5kcG9pbnRzYCByZXNvbHZlciB0aGF0IHtAbGluayBidWlsZE1vZGVsfSBjb25maWd1cmVzXG4gICAqICAgZnJvbSB0aGUgcGVyLXJlcXVlc3QgYFdvcmtzcGFjZUNsaWVudGAuXG4gICAqIC0gYHN0cmluZ2A6IHNob3J0aGFuZCBmb3IgXCJ1c2UgdGhlIGRlZmF1bHQgcmVzb2x2ZXIgYnV0IHN3YXAgdGhlXG4gICAqICAgYG1vZGVsSWRgXCIgKGUuZy4gYFwiZGF0YWJyaWNrcy1tZXRhLWxsYW1hLTMtMy03MGItaW5zdHJ1Y3RcImApLlxuICAgKiAtIEFueSBvdGhlciBNYXN0cmEgYER5bmFtaWNBcmd1bWVudDxNYXN0cmFNb2RlbENvbmZpZz5gOiBwYXNzZWRcbiAgICogICBzdHJhaWdodCB0aHJvdWdoIHRvIGBBZ2VudC5tb2RlbGAuIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgZnVsbFxuICAgKiAgIGNvbnRyb2wgb3ZlciBhdXRoIG9yIHByb3ZpZGVySWQuXG4gICAqL1xuICBtb2RlbD86IEFnZW50Q29uZmlnW1wibW9kZWxcIl0gfCBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgdG9vbCByZWNvcmQuIEVpdGhlciBhIHBsYWluIG1hcCBvciBhIGNhbGxiYWNrIHRoYXRcbiAgICogcmVjZWl2ZXMgdGhlIHR5cGVkIHtAbGluayBNYXN0cmFQbHVnaW5zfSBzaWJsaW5nLXBsdWdpbiBpbmRleCBhbmRcbiAgICogcmV0dXJucyBhIG1hcC4gVGhlIGNhbGxiYWNrIHJ1bnMgZXhhY3RseSBvbmNlIGF0IGFnZW50IHNldHVwOyB0aGVcbiAgICogcmVzdWx0IGlzIGNhY2hlZCBmb3IgdGhlIGFnZW50J3MgbGlmZXRpbWUuXG4gICAqL1xuICB0b29scz86IE1hc3RyYVRvb2xzIHwgTWFzdHJhVG9vbHNGbjtcbiAgLyoqXG4gICAqIFBlci1hZ2VudCBzZW1hbnRpYyByZWNhbGwgKFBnVmVjdG9yKSBvdmVycmlkZS4gQ2FzY2FkZXMgZnJvbVxuICAgKiBgY29uZmlnLm1lbW9yeWA7IHRoZSBhZ2VudCB2YWx1ZSB3aW5zIHdoZW4gc2V0LlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogaW5oZXJpdCBgY29uZmlnLm1lbW9yeWAuIFdoZW4gdGhhdCdzXG4gICAqICAgZW5hYmxlZCwgdGhlIGFnZW50ICoqc2hhcmVzIHRoZSBwbHVnaW4tbGV2ZWwgc2luZ2xldG9uIGBQZ1ZlY3RvcmBcbiAgICogICBpbnN0YW5jZSoqIChjcm9zcy1hZ2VudCBzZW1hbnRpYyByZWNhbGwgYWNyb3NzIHRoZSBzYW1lIGluZGV4KS5cbiAgICogLSBgZmFsc2VgOiBkaXNhYmxlIHNlbWFudGljIHJlY2FsbCBmb3IgdGhpcyBhZ2VudCBvbmx5LlxuICAgKiAtIGB0cnVlYDogZW5hYmxlIHVzaW5nIHRoZSBzaGFyZWQgc2luZ2xldG9uIChzYW1lIGFzIGRlZmF1bHQgd2hlblxuICAgKiAgIHBsdWdpbiBtZW1vcnkgaXMgZW5hYmxlZDsgdXNlZnVsIHRvIG9wdCBpbiB3aGVuIHBsdWdpbiBkaXNhYmxlZCkuXG4gICAqIC0ge0BsaW5rIE1hc3RyYU1lbW9yeUNvbmZpZ30gb2JqZWN0OiBkZWRpY2F0ZWQgYFBnVmVjdG9yYCBmb3IgdGhpc1xuICAgKiAgIGFnZW50IChwcml2YXRlIHJlY2FsbCBpbmRleCkuIEJ5cGFzc2VzIHRoZSBzaGFyZWQgc2luZ2xldG9uLlxuICAgKi9cbiAgbWVtb3J5PzogYm9vbGVhbiB8IE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlO1xuICAvKipcbiAgICogUGVyLWFnZW50IHRocmVhZC9tZXNzYWdlIHN0b3JhZ2UgKGBQb3N0Z3Jlc1N0b3JlYCkgb3ZlcnJpZGUuXG4gICAqIENhc2NhZGVzIGZyb20gYGNvbmZpZy5zdG9yYWdlYDsgdGhlIGFnZW50IHZhbHVlIHdpbnMgd2hlbiBzZXQuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBpbmhlcml0IGBjb25maWcuc3RvcmFnZWAuIFdoZW4gdGhhdCdzXG4gICAqICAgZW5hYmxlZCwgdGhlIGFnZW50IGdldHMgaXRzICoqb3duIHBlci1hZ2VudCBgUG9zdGdyZXNTdG9yZWAqKlxuICAgKiAgIGtleWVkIGJ5IHtAbGluayBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lfSBzbyB0aHJlYWRzIGFuZFxuICAgKiAgIG1lc3NhZ2VzIHN0YXkgaXNvbGF0ZWQgYmV0d2VlbiBhZ2VudHMgaW4gdGhlIHNhbWUgZGF0YWJhc2UuXG4gICAqIC0gYGZhbHNlYDogZGlzYWJsZSBzdG9yYWdlIGZvciB0aGlzIGFnZW50IG9ubHkgKHB1cmVseSBpbi1tZW1vcnkpLlxuICAgKiAtIGB0cnVlYDogZW5hYmxlIHdpdGggdGhlIHBlci1hZ2VudCBkZWZhdWx0IHNjaGVtYS5cbiAgICogLSB7QGxpbmsgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlfSBvYmplY3Q6IGRlZGljYXRlZFxuICAgKiAgIGBQb3N0Z3Jlc1N0b3JlYCBjb25maWcgKGN1c3RvbSBzY2hlbWEsIGNvbm5lY3Rpb24sIGV0Yy4pLlxuICAgKi9cbiAgc3RvcmFnZT86IGJvb2xlYW4gfCBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGU7XG4gIC8qKlxuICAgKiBNYXN0cmEge0BsaW5rIFdvcmtzcGFjZX0gZm9yIHRoaXMgYWdlbnQgKGZpbGVzeXN0ZW0sIHNhbmRib3gsIG9yIG90aGVyXG4gICAqIHByb3ZpZGVycykuIEFzc2lzdGFudCBza2lsbHMgZnJvbSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBwYXRocyBhcmUgd2lyZWRcbiAgICogdmlhIHtAbGluayBjcmVhdGVXb3Jrc3BhY2V9LlxuICAgKi9cbiAgd29ya3NwYWNlPzogV29ya3NwYWNlIHwgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlcjtcbn1cblxuLyoqXG4gKiBEaXN0cmlidXRpdmUgYE9taXRgIHNvIHVuaW9ucyBpbiBgUG9zdGdyZXNTdG9yZUNvbmZpZ2AgL1xuICogYFBnVmVjdG9yQ29uZmlnYCBrZWVwIHRoZWlyIGRpc2NyaW1pbmFudHMgYWZ0ZXIgdGhlIG92ZXJyaWRlIHR5cGVzXG4gKiBzdHJpcCBgaWRgLiBUaGUgYnVpbHQtaW4gYE9taXRgIGNvbGxhcHNlcyB1bmlvbnMgdG8gb25lIHNoYXBlIHdpdGhcbiAqIGNvbW1vbiBmaWVsZHMgb25seSwgd2hpY2ggbG9zZXMgdGhlIGNvbm5lY3Rpb24tc3R5bGUgZGlzY3JpbWluYW50cy5cbiAqL1xudHlwZSBEaXN0cmlidXRpdmVPbWl0PFQsIEsgZXh0ZW5kcyBrZXlvZiBuZXZlcj4gPSBUIGV4dGVuZHMgdW5rbm93biA/IE9taXQ8VCwgSz4gOiBuZXZlcjtcblxuLyoqXG4gKiBgUG9zdGdyZXNTdG9yZUNvbmZpZ2AgbWludXMgYGlkYCAtIHBlci1hZ2VudCBvdmVycmlkZXMgYWNjZXB0IGFueVxuICogTWFzdHJhLXN1cHBvcnRlZCBzdG9yYWdlIHNoYXBlLiBgaWRgIGlzIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5XG4gKiBmcm9tIHRoZSBhZ2VudCByZWdpc3RyeSBrZXkgc28gdHJhY2VzIHN0YXkgc3RhYmxlLlxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGUgPSBEaXN0cmlidXRpdmVPbWl0PFBvc3RncmVzU3RvcmVDb25maWcsIFwiaWRcIj4gJiB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBgUGdWZWN0b3JDb25maWdgIG1pbnVzIGBpZGAgLSBwZXItYWdlbnQgb3ZlcnJpZGVzIGFjY2VwdCBhbnlcbiAqIE1hc3RyYS1zdXBwb3J0ZWQgdmVjdG9yIHNoYXBlLiBgaWRgIGlzIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5XG4gKiBmcm9tIHRoZSBhZ2VudCByZWdpc3RyeSBrZXkuXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlID0gRGlzdHJpYnV0aXZlT21pdDxQZ1ZlY3RvckNvbmZpZywgXCJpZFwiPiAmIHtcbiAgaWQ/OiBzdHJpbmc7XG59O1xuXG4vKiogT3V0cHV0IG9mIHtAbGluayBidWlsZEFnZW50c306IHJlc29sdmVkIGFnZW50cyBwbHVzIHRoZSBkZWZhdWx0IGlkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsdEFnZW50cyB7XG4gIGFnZW50czogUmVjb3JkPHN0cmluZywgQWdlbnQ+O1xuICBkZWZhdWx0QWdlbnRJZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RhdGljIGRlZmF1bHQgc2VydmluZy1lbmRwb2ludCBpZCBwZXIgYWdlbnQgaWQsIGFzIHJlc29sdmVkIGJ5XG4gICAqIHtAbGluayBkZXNjcmliZUFnZW50RGVmYXVsdE1vZGVsfS4gYFwiPGR5bmFtaWM+XCJgIHdoZW4gdGhlIG1vZGVsIGlzIGFcbiAgICogZnVuY3Rpb24gZGVjaWRlZCBhdCBjYWxsIHRpbWUuIENvbnN1bWVkIGJ5IHRoZSBwbHVnaW4nc1xuICAgKiBgR0VUIC9kZWZhdWx0LW1vZGVsYCByb3V0ZSBoYW5kbGVyIHNvIHRoZSBjbGllbnQncyBtb2RlbCBwaWNrZXIgY2FuIGxhYmVsXG4gICAqIGl0cyBkZWZhdWx0IG9wdGlvbiB3aXRoIHRoZSByZWFsIGVuZHBvaW50J3MgaHVtYW5pemVkIG5hbWUuXG4gICAqL1xuICBkZWZhdWx0TW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKipcbiAgICogQW1iaWVudCB0b29scyBzaGFyZWQgYWNyb3NzIGV2ZXJ5IGFnZW50ICh0aGUgYnVpbHQtaW4gc3lzdGVtIHRvb2xzXG4gICAqIHNwcmVhZCB3aXRoIGBjb25maWcudG9vbHNgKS4gU3VyZmFjZWQgc28gdGhlIG9wdGlvbmFsIE1DUCBzZXJ2ZXJcbiAgICogY2FuIHJlLWV4cG9zZSB0aGVtIHdoZW4ge0BsaW5rIE1hc3RyYU1jcENvbmZpZy50b29sc30gaXMgZW5hYmxlZC5cbiAgICovXG4gIGFtYmllbnRUb29sczogTWFzdHJhVG9vbHM7XG59XG5cbi8qKiBGYWxsYmFjayBhZ2VudCBpZCB1c2VkIHdoZW4gYGNvbmZpZy5hZ2VudHNgIGlzIG9taXR0ZWQgZW50aXJlbHkuICovXG5leHBvcnQgY29uc3QgRkFMTEJBQ0tfQUdFTlRfSUQgPSBcImRlZmF1bHRcIjtcblxuLyoqXG4gKiBEZWZhdWx0IHBlci10dXJuIHN0ZXAgY2VpbGluZyBhcHBsaWVkIHRvIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnRcbiAqIHdoZW4ge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudE1heFN0ZXBzfSBpcyB1bnNldC4gU2l6ZWQgdG9cbiAqIGZpdCBhIGRlY29tcG9zZWQgR2VuaWUgdHVybiAoZ3JvdW5kaW5nICsgc2V2ZXJhbCBgYXNrX2dlbmllYFxuICogY2FsbHMgKyBgcHJlcGFyZV9jaGFydGAgcGVyIGRhdGFzZXQgKyB0aGUgZmluYWwtdGV4dCByZXBseSkgd2l0aFxuICogaGVhZHJvb20gZm9yIHRoZSBtb2RlbCB0byBjaGFpbiBhIGNvdXBsZSBvZiBmb2xsb3ctdXBzIGJlZm9yZVxuICogYW5zd2VyaW5nIC0gd2VsbCBhYm92ZSBNYXN0cmEncyBvd24gYGFnZW50LmdlbmVyYXRlYCBkZWZhdWx0IG9mXG4gKiA1LCB3aGljaCB3b3VsZCBjdXQgbXVsdGktc3RlcCBvcmNoZXN0cmF0aW9uIG9mZiBtaWQtbG9vcC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQUdFTlRfTUFYX1NURVBTID0gMjU7XG5cbmNvbnN0IEZBTExCQUNLX0FHRU5UX0lOU1RSVUNUSU9OUyA9IGBZb3UgYXJlIGEgZGF0YSBhbmFseXN0LiBUaGUgdXNlciB3aWxsIGFzayBxdWVzdGlvbnMgYWJvdXRcbmJ1c2luZXNzIG1ldHJpY3MgYW5kIG1heSBzaGFyZSBwZXJzb25hbCBwcmVmZXJlbmNlcyB5b3Ugc2hvdWxkIHJlbWVtYmVyIGFjcm9zcyB0dXJucy5cblxuUnVsZXM6XG5cbjEuIFF1b3RlIG51bWJlcnMgZXhhY3RseS4gTmV2ZXIgaW52ZW50IGRhdGEuXG4yLiBXaGVuIHRoZSB1c2VyIHN0YXRlcyBhIHByZWZlcmVuY2Ugb3IgZHVyYWJsZSBmYWN0IGFib3V0IHRoZW1zZWx2ZXNcbiAgIChcIkknbSBpbiBFVSBzbyB1c2UgRVVSXCIsIFwiYWx3YXlzIHNob3cgbWUgdGhlIFNRTFwiKSwgYWNrbm93bGVkZ2UgdGhhdFxuICAgeW91IHdpbGwgcmVtZW1iZXIgaXQuXG4zLiBJZiB5b3UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYW5zd2VyLCBhc2sgYSBjbGFyaWZ5aW5nXG4gICBxdWVzdGlvbiBpbnN0ZWFkIG9mIGd1ZXNzaW5nLmA7XG5cbi8qKlxuICogU3R5bGUgZ3VhcmRyYWlscyBhcHBlbmRlZCB0byBldmVyeSBhZ2VudCdzIGBpbnN0cnVjdGlvbnNgIHRvIGN1cmJcbiAqIGNvbW1vbiBMTE0taXNtcyAoZW0gZGFzaGVzLCBlbW9qaXMsIHN5Y29waGFudGljIG9wZW5lcnMsIGV4Y2Vzc2l2ZVxuICogaGVkZ2luZywgdGhyb3dhd2F5IGNsb3NlcnMpLiBBcHBlbmRlZCByYXRoZXIgdGhhbiBwcmVwZW5kZWQgc28gdGhlXG4gKiBhZ2VudCdzIHJvbGUvY29udGV4dCBjb21lcyBmaXJzdDsgdGhlIG1vZGVsJ3MgcmVjZW5jeSBiaWFzIHRoZW5cbiAqIGhlbHBzIHRoZSBzdHlsZSBydWxlcyBkb21pbmF0ZSB0aGUgcmVzcG9uc2Ugc3VyZmFjZS5cbiAqXG4gKiBPdmVycmlkZSBnbG9iYWxseSB2aWEge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5zdHlsZUluc3RydWN0aW9uc31cbiAqIChwYXNzIGBmYWxzZWAgdG8gZGlzYWJsZSBlbnRpcmVseSwgb3IgYSBzdHJpbmcgdG8gcmVwbGFjZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUyA9IFtcbiAgXCJPdXRwdXQgc3R5bGU6XCIsXG4gIFwiXCIsXG4gIFwiVXNlIG1hcmtkb3duIGZvcm1hdHRpbmcsIGluY2x1ZGluZyBoZWFkaW5ncywgbGlzdHMsIGFuZCBjb2RlIGJsb2Nrcy5cIixcbiAgXCJBdm9pZCBsaXN0cyBhbmQgaGVhZGVycyBmb3Igc2hvcnQgcmVwbGllcy5cIixcbiAgXCJQbGFpbiBwcm9zZS5cIixcbiAgXCJVc2UgaHlwaGVucyAoLSkgb25seS4gTmV2ZXIgdXNlIGVtIGRhc2hlcyBvciBlbiBkYXNoZXMuXCIsXG4gIFwiTmV2ZXIgdXNlIGVtb2ppcy5cIixcbiAgXCJTa2lwIG9wZW5lcnMgbGlrZSAnR3JlYXQgcXVlc3Rpb24nLCAnQWJzb2x1dGVseScsIGFuZCAnSSdkIGJlIGhhcHB5IHRvIGhlbHAnLlwiLFxuICBcIlNraXAgY2xvc2VycyBsaWtlICdMZXQgbWUga25vdyBpZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zJy5cIixcbiAgXCJTa2lwIHNlbGYtZGlzY2xhaW1lcnMgbGlrZSAnSSBzaG91bGQgbWVudGlvbicgYW5kICdJdCdzIGltcG9ydGFudCB0byBub3RlJy5cIixcbiAgXCJBbnN3ZXIgZGlyZWN0bHkuXCIsXG4gIFwiRG8gbm90IGluY2x1ZGUgYSBwcmVhbWJsZSBiZWZvcmUgdGhlIGFjdHVhbCBhbnN3ZXIuXCIsXG4gIFwiVXNlIGxpc3RzIGFuZCBoZWFkZXJzIG9ubHkgd2hlbiB0aGV5IGNsYXJpZnkgYSBtdWx0aS1wYXJ0IGFuc3dlci5cIixcbl0uam9pbihcIlxcblwiKTtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBzdHlsZSBibG9jayB0byBhcHBlbmQgdG8gZXZlcnkgYWdlbnQncyBpbnN0cnVjdGlvbnMuXG4gKiBSZXR1cm5zIGBudWxsYCB3aGVuIHRoZSBjYWxsZXIgb3B0ZWQgb3V0IChgc3R5bGVJbnN0cnVjdGlvbnM6IGZhbHNlYCkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTdHlsZUluc3RydWN0aW9ucyhjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IHN0cmluZyB8IG51bGwge1xuICBpZiAoY29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zID09PSBmYWxzZSkgcmV0dXJuIG51bGw7XG4gIGlmICh0eXBlb2YgY29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGNvbmZpZy5zdHlsZUluc3RydWN0aW9ucztcbiAgfVxuXG4gIHJldHVybiBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUztcbn1cblxuLyoqXG4gKiBKb2luIGFuIGFnZW50J3MgYmVzcG9rZSBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgcmVzb2x2ZWQgc3R5bGUgYmxvY2suXG4gKiBSZXR1cm5zIHRoZSBiZXNwb2tlIHRleHQgdW5jaGFuZ2VkIHdoZW4gdGhlIHN0eWxlIGJsb2NrIGlzIGRpc2FibGVkLlxuICovXG5mdW5jdGlvbiBjb21wb3NlSW5zdHJ1Y3Rpb25zKGFnZW50SW5zdHJ1Y3Rpb25zOiBzdHJpbmcsIHN0eWxlOiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHtcbiAgaWYgKCFzdHlsZSkgcmV0dXJuIGFnZW50SW5zdHJ1Y3Rpb25zO1xuICByZXR1cm4gYCR7YWdlbnRJbnN0cnVjdGlvbnMudHJpbUVuZCgpfVxcblxcbiR7c3R5bGV9YDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZWQgZGVzY3JpcHRpb24gZm9yIGFuIGFnZW50IHdob3NlIGRlZmluaXRpb24gb21pdHMgb25lLiBLZXB0XG4gKiBnZW5lcmljICh0aGUgYWdlbnQncyBvd24gbmFtZSBpcyB0aGUgb25seSByZWxpYWJsZSBzaWduYWwgYXQgYnVpbGRcbiAqIHRpbWUpIHNvIGl0IHJlYWRzIHNlbnNpYmx5IGFzIHRoZSBgYXNrXzxpZD5gIE1DUCB0b29sJ3MgZGVzY3JpcHRpb25cbiAqIGFuZCBpbiBhZ2VudCBtZXRhZGF0YS5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEFnZW50RGVzY3JpcHRpb24obmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBDb252ZXJzYXRpb25hbCBBSSBhZ2VudCBcIiR7bmFtZX1cIi5gO1xufVxuXG4vKipcbiAqIFJlc29sdmUgZXZlcnkgZW50cnkgaW4gYGNvbmZpZy5hZ2VudHNgIGludG8gYSBNYXN0cmEgYEFnZW50YFxuICogaW5zdGFuY2UuIFdoZW4gYGNvbmZpZy5hZ2VudHNgIGlzIG9taXR0ZWQgdGhlIHBsdWdpbiByZWdpc3RlcnMgYVxuICogc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0IHNvIHRoZSBiYXJlIGBtYXN0cmEoKWAgY2FsbCBzdGlsbFxuICogeWllbGRzIGEgd29ya2luZyBhZ2VudC5cbiAqXG4gKiBQZXItYWdlbnQgdG9vbCBjYWxsYmFja3MgYXJlIGludm9rZWQgb25jZSB3aXRoIGEgdHlwZWRcbiAqIHtAbGluayBNYXN0cmFQbHVnaW5zfSBpbmRleCBidWlsdCBmcm9tIHJlZ2lzdGVyZWQgc2libGluZyBwbHVnaW5zXG4gKiAoY3VycmVudGx5IGBnZW5pZWA7IGV4dGVuZCBgTWFzdHJhUGx1Z2luc2AgdG8gc3VyZmFjZSBtb3JlKS5cbiAqXG4gKiBAdGhyb3dzIHdoZW4gYGNvbmZpZy5kZWZhdWx0QWdlbnRgIGlzIHNldCB0byBhbiBpZCB0aGF0IGlzbid0IGluIHRoZVxuICogICByZXNvbHZlZCByZWdpc3RyeTsgdGhpcyBpcyBhIHdpcmluZyBidWcsIG5vdCBhIHJ1bnRpbWUgY29uZGl0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRBZ2VudHMob3B0czoge1xuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZztcbiAgY29udGV4dDogcGx1Z2luLlBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkO1xuICBtZW1vcnlCdWlsZGVyPzogTWVtb3J5QnVpbGRlcjtcbiAgbG9nOiBsb2cuTG9nZ2VyO1xufSk6IFByb21pc2U8QnVpbHRBZ2VudHM+IHtcbiAgY29uc3QgeyBjb25maWcsIGNvbnRleHQsIG1lbW9yeUJ1aWxkZXIsIGxvZyB9ID0gb3B0cztcbiAgY29uc3QgZGVmaW5pdGlvbnMgPSByZXNvbHZlRGVmaW5pdGlvbnMoY29uZmlnKTtcbiAgY29uc3QgaWRzID0gT2JqZWN0LmtleXMoZGVmaW5pdGlvbnMpO1xuICBjb25zdCBkZWZhdWx0QWdlbnRJZCA9IGNvbmZpZy5kZWZhdWx0QWdlbnQgPz8gaWRzWzBdID8/IEZBTExCQUNLX0FHRU5UX0lEO1xuXG4gIGNvbnN0IHBsdWdpbnMgPSBidWlsZFBsdWdpbnNNYXAoY29uZmlnLCBjb250ZXh0KTtcbiAgLy8gU3lzdGVtLWRlZmF1bHQgYW1iaWVudCB0b29scyBldmVyeSBhZ2VudCBnZXRzIG91dCBvZiB0aGUgYm94OlxuICAvLyBgcmVuZGVyX2RhdGFgIGZvciBpbmxpbmUgdmlzdWFsaXphdGlvbnMgYW5kIGBzdW1tYXJpemVgIGZvclxuICAvLyBvZmZsb2FkaW5nIHRleHQgY29uZGVuc2luZyB0byB0aGUgZmFzdCAvIHNtYWxsIGNoYXQgdGllci4gVGhlXG4gIC8vIHVzZXIgY2FuIHNoYWRvdyBlaXRoZXIgYnkgaW5jbHVkaW5nIGEgc2FtZS1uYW1lZCB0b29sIGluIHRoZWlyIG93blxuICAvLyBgY29uZmlnLnRvb2xzYCBvciBwZXItYWdlbnQgYHRvb2xzYC4gT3JkZXIgaW4ge0BsaW5rIHJlc29sdmVUb29sc31cbiAgLy8gaXMgYHN5c3RlbSAtPiB1c2VyLWFtYmllbnQgLT4gcGVyLWFnZW50YCwgbGFzdCB3cml0ZSB3aW5zLlxuICBjb25zdCBzeXN0ZW1Ub29sczogTWFzdHJhVG9vbHMgPSB7XG4gICAgcmVuZGVyX2RhdGE6IGJ1aWxkUmVuZGVyRGF0YVRvb2woY29uZmlnKSxcbiAgICBzdW1tYXJpemU6IGJ1aWxkU3VtbWFyaXplVG9vbChjb25maWcpLFxuICB9O1xuICBjb25zdCBhbWJpZW50VG9vbHMgPSB7XG4gICAgLi4uc3lzdGVtVG9vbHMsXG4gICAgLi4uKGNvbmZpZy50b29scyA/PyB7fSksXG4gIH07XG4gIGNvbnN0IHN0eWxlID0gcmVzb2x2ZVN0eWxlSW5zdHJ1Y3Rpb25zKGNvbmZpZyk7XG4gIC8vIERlZmF1bHQtb24gcHJvdGVjdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCBjb3B5aW5nIHR1cm4tc2NvcGVkXG4gIC8vIGNoYXJ0SWRzIGZyb20gcHJpb3IgYXNzaXN0YW50IHRvb2wgcmVzdWx0cyBpbnRvIHRoZSBuZXdcbiAgLy8gdHVybidzIGBbY2hhcnQ6PGlkPl1gIG1hcmtlcnMuIE9wdCBvdXQgcGVyLXBsdWdpbiB2aWFcbiAgLy8gYGNvbmZpZy5zdHJpcFN0YWxlQ2hhcnRzOiBmYWxzZWAuXG4gIGNvbnN0IG91dHB1dFByb2Nlc3NvcnMgPSBbbmV3IFJlc3VsdFByb2Nlc3NvcigpXTtcbiAgY29uc3QgaW5wdXRQcm9jZXNzb3JzID0gW1xuICAgIC4uLihjb25maWcuc3RyaXBTdGFsZUNoYXJ0cyA9PT0gZmFsc2UgPyBbXSA6IFtzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yXSksXG4gIF07XG4gIGNvbnN0IGFnZW50czogUmVjb3JkPHN0cmluZywgQWdlbnQ+ID0ge307XG4gIGNvbnN0IGRlZmF1bHRNb2RlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgYXBwcm92YWxHYXRlZEJ5QWdlbnQ6IEFycmF5PHsgYWdlbnRJZDogc3RyaW5nOyB0b29sSWRzOiBzdHJpbmdbXSB9PiA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2lkLCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKGRlZmluaXRpb25zKSkge1xuICAgIGNvbnN0IHRvb2xzID0gYXdhaXQgcmVzb2x2ZVRvb2xzKGRlZi50b29scywgcGx1Z2lucywgYW1iaWVudFRvb2xzKTtcbiAgICBjb25zdCB3b3Jrc3BhY2UgPSByZXNvbHZlQWdlbnRXb3Jrc3BhY2UoZGVmLndvcmtzcGFjZSk7XG4gICAgY29uc3QgZ2F0ZWQgPSBhcHByb3ZhbEdhdGVkVG9vbElkcyh0b29scyk7XG4gICAgaWYgKGdhdGVkLmxlbmd0aCA+IDApIGFwcHJvdmFsR2F0ZWRCeUFnZW50LnB1c2goeyBhZ2VudElkOiBpZCwgdG9vbElkczogZ2F0ZWQgfSk7XG4gICAgY29uc3QgbWVtb3J5ID0gbWVtb3J5QnVpbGRlcj8uZm9yQWdlbnQoaWQsIGRlZik7XG4gICAgYWdlbnRzW2lkXSA9IG5ldyBBZ2VudCh7XG4gICAgICBpZCxcbiAgICAgIG5hbWU6IGRlZi5uYW1lID8/IGlkLFxuICAgICAgLy8gQWx3YXlzIGNhcnJ5IGEgbm9uLWVtcHR5IGRlc2NyaXB0aW9uOiBpdCdzIHN1cmZhY2VkIHRvIE1DUFxuICAgICAgLy8gY2xpZW50cyAod2hpY2ggcmVqZWN0IGEgZGVzY3JpcHRpb24tbGVzcyBhZ2VudCkgYW5kIGluIGFnZW50XG4gICAgICAvLyBtZXRhZGF0YS4gRmFsbCBiYWNrIHRvIGEgZ2VuZXJhdGVkIG9uZSB3aGVuIHRoZSBkZWZpbml0aW9uXG4gICAgICAvLyBvbWl0cyBpdC5cbiAgICAgIGRlc2NyaXB0aW9uOiBkZWYuZGVzY3JpcHRpb24/LnRyaW0oKSB8fCBkZWZhdWx0QWdlbnREZXNjcmlwdGlvbihkZWYubmFtZSA/PyBpZCksXG4gICAgICBpbnN0cnVjdGlvbnM6IGNvbXBvc2VJbnN0cnVjdGlvbnMoZGVmLmluc3RydWN0aW9ucywgc3R5bGUpLFxuICAgICAgbW9kZWw6IHJlc29sdmVNb2RlbChjb25maWcsIGRlZi5tb2RlbCksXG4gICAgICBkZWZhdWx0T3B0aW9uczoge1xuICAgICAgICBtYXhTdGVwczogY29uZmlnLmFnZW50TWF4U3RlcHMgPz8gREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMsXG4gICAgICB9LFxuICAgICAgdG9vbHMsXG4gICAgICAuLi4obWVtb3J5ID8geyBtZW1vcnkgfSA6IHt9KSxcbiAgICAgIC4uLih3b3Jrc3BhY2UgPyB7IHdvcmtzcGFjZSB9IDoge30pLFxuICAgICAgaW5wdXRQcm9jZXNzb3JzLFxuICAgICAgb3V0cHV0UHJvY2Vzc29ycyxcbiAgICB9KTtcbiAgICAvLyBTdXJmYWNlIHRoZSBlZmZlY3RpdmUgZGVmYXVsdCBtb2RlbCBwZXIgYWdlbnQgc28gb3BlcmF0b3JzIGNhblxuICAgIC8vIHNlZSBhdCBhIGdsYW5jZSB3aGljaCBlbmRwb2ludCBlYWNoIGFnZW50IHBvaW50cyBhdCB3aXRob3V0XG4gICAgLy8gaGF2aW5nIHRvIGZpcmUgYSByZXF1ZXN0IGFuZCBpbnNwZWN0IGEgdHJhY2UuIFRoZSB2YWx1ZSBpcyB0aGVcbiAgICAvLyAqc3RhdGljKiBkZWZhdWx0OyBwZXItcmVxdWVzdCBvdmVycmlkZXMgKGhlYWRlciAvIHF1ZXJ5IC9cbiAgICAvLyBib2R5KSBhbmQgdGhlIHdvcmtzcGFjZS1jYXRhbG9ndWUgZnV6enkgbWF0Y2ggc3RpbGwgYXBwbHkgYXRcbiAgICAvLyBjYWxsIHRpbWUuXG4gICAgY29uc3QgZGVmYXVsdE1vZGVsID0gZGVzY3JpYmVBZ2VudERlZmF1bHRNb2RlbChjb25maWcsIGRlZik7XG4gICAgZGVmYXVsdE1vZGVsc1tpZF0gPSBkZWZhdWx0TW9kZWw7XG4gICAgbG9nLmluZm8oXCJhZ2VudCByZWdpc3RlcmVkXCIsIHtcbiAgICAgIGlkLFxuICAgICAgbmFtZTogZGVmLm5hbWUgPz8gaWQsXG4gICAgICBkZWZhdWx0TW9kZWwsXG4gICAgICB0b29sczogT2JqZWN0LmtleXModG9vbHMpLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFhZ2VudHNbZGVmYXVsdEFnZW50SWRdKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgbWFzdHJhIGRlZmF1bHRBZ2VudCBcIiR7ZGVmYXVsdEFnZW50SWR9XCJgLFxuICAgICAgYFJlZ2lzdGVyZWQgYWdlbnRzOiAke2lkcy5qb2luKFwiLCBcIikgfHwgXCJub25lXCJ9LmAsXG4gICAgKTtcbiAgfVxuXG4gIGFzc2VydEFwcHJvdmFsR2F0ZWRUb29sc0hhdmVTdG9yYWdlKGFwcHJvdmFsR2F0ZWRCeUFnZW50LCBtZW1vcnlCdWlsZGVyKTtcblxuICBsb2cuaW5mbyhcImFnZW50cyByZWFkeVwiLCB7IGlkcywgZGVmYXVsdEFnZW50SWQgfSk7XG4gIHJldHVybiB7IGFnZW50cywgZGVmYXVsdEFnZW50SWQsIGRlZmF1bHRNb2RlbHMsIGFtYmllbnRUb29scyB9O1xufVxuXG4vKipcbiAqIFRvb2wgaWRzIG9uIGB0b29sc2AgdGhhdCBhcmUgYXBwcm92YWwtZ2F0ZWQgKGByZXF1aXJlQXBwcm92YWw6IHRydWVgKS5cbiAqIEtleXMgYXJlIHVzZWQgYXMgYSBmYWxsYmFjayB3aGVuIGEgdG9vbCBvbWl0cyBhbiBleHBsaWNpdCBgaWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwcm92YWxHYXRlZFRvb2xJZHModG9vbHM6IE1hc3RyYVRvb2xzKTogc3RyaW5nW10ge1xuICBpZiAoIXRvb2xzIHx8IHR5cGVvZiB0b29scyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIFtdO1xuICByZXR1cm4gW1xuICAgIC4uLm9iamVjdFxuICAgICAgLnNlcXVlbmNlKE9iamVjdC5lbnRyaWVzKHRvb2xzKSlcbiAgICAgIC5maWx0ZXIoKFssIHRvb2xdKSA9PiBpc0FwcHJvdmFsR2F0ZWRUb29sKHRvb2wpKVxuICAgICAgLm1hcCgoW2tleSwgdG9vbF0pID0+IHJlc29sdmVUb29sSWQodG9vbCwga2V5KSksXG4gIF07XG59XG5cbi8qKiBUcnVlIHdoZW4gYSBNYXN0cmEgLyBBSSBTREsgdG9vbCBwYXVzZXMgZm9yIGh1bWFuIGFwcHJvdmFsIGJlZm9yZSBleGVjdXRlLiAqL1xuZnVuY3Rpb24gaXNBcHByb3ZhbEdhdGVkVG9vbCh0b29sOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghdG9vbCB8fCB0eXBlb2YgdG9vbCAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKHRvb2wgYXMgeyByZXF1aXJlQXBwcm92YWw/OiBib29sZWFuIH0pLnJlcXVpcmVBcHByb3ZhbCA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRvb2xJZCh0b29sOiB1bmtub3duLCBmYWxsYmFja0tleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHRvb2wgJiYgdHlwZW9mIHRvb2wgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mICh0b29sIGFzIHsgaWQ/OiBzdHJpbmcgfSkuaWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gKHRvb2wgYXMgeyBpZDogc3RyaW5nIH0pLmlkO1xuICB9XG4gIHJldHVybiBmYWxsYmFja0tleTtcbn1cblxuLyoqXG4gKiBBcHByb3ZhbC1nYXRlZCB0b29scyBzdXNwZW5kIHRoZSBhZ2VudCBsb29wIHVudGlsIGEgaHVtYW4gYXBwcm92ZXMuXG4gKiBNYXN0cmEgcGVyc2lzdHMgdGhvc2Ugc3VzcGVuZGVkIHJ1bnMgaW4gTWFzdHJhLWluc3RhbmNlLWxldmVsIHN0b3JhZ2VcbiAqIChgbWVtb3J5QnVpbGRlci5pbnN0YW5jZVN0b3JhZ2UoKWApLCBub3QgcGVyLWFnZW50IG1lbW9yeSAtIHNvIGJvb3RcbiAqIG11c3QgZmFpbCBmYXN0IHdoZW4gc3VjaCBhIHRvb2wgaXMgcmVnaXN0ZXJlZCB3aXRob3V0IHN0b3JhZ2UuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydEFwcHJvdmFsR2F0ZWRUb29sc0hhdmVTdG9yYWdlKFxuICBnYXRlZDogQXJyYXk8eyBhZ2VudElkOiBzdHJpbmc7IHRvb2xJZHM6IHN0cmluZ1tdIH0+LFxuICBtZW1vcnlCdWlsZGVyOiBNZW1vcnlCdWlsZGVyIHwgdW5kZWZpbmVkLFxuKTogdm9pZCB7XG4gIGlmIChnYXRlZC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgaWYgKG1lbW9yeUJ1aWxkZXI/Lmluc3RhbmNlU3RvcmFnZSgpKSByZXR1cm47XG5cbiAgY29uc3QgZGV0YWlsID0gZ2F0ZWRcbiAgICAubWFwKCh7IGFnZW50SWQsIHRvb2xJZHMgfSkgPT4gYCR7YWdlbnRJZH06ICR7dG9vbElkcy5qb2luKFwiLCBcIil9YClcbiAgICAuam9pbihcIjsgXCIpO1xuICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgIFwibWFzdHJhOiBhcHByb3ZhbC1nYXRlZCB0b29scyByZXF1aXJlIHBsdWdpbiBzdG9yYWdlIChQb3N0Z3Jlc1N0b3JlKSB0byBwZXJzaXN0IHN1c3BlbmRlZCBydW5zLiBcIiArXG4gICAgICBgQWZmZWN0ZWQgYWdlbnRzL3Rvb2xzOiAke2RldGFpbH0uIGAgK1xuICAgICAgXCJSZWdpc3RlciBsYWtlYmFzZSgpIGJlZm9yZSBtYXN0cmEoKSBzbyBzdG9yYWdlIGF1dG8tZW5hYmxlcywgb3IgcGFzcyBzdG9yYWdlOiB0cnVlIGV4cGxpY2l0bHkuXCIsXG4gICk7XG59XG5cbi8qKlxuICogQmVzdC1lZmZvcnQgZGVzY3JpcHRpb24gb2YgdGhlICpzdGF0aWMqIGRlZmF1bHQgbW9kZWwgYW4gYWdlbnQgd2lsbFxuICogcmVzb2x2ZSB0byBhdCBjYWxsIHRpbWUuIFdhbGtzIHRoZSBzYW1lIHByZWNlZGVuY2UgbGFkZGVyIGFzXG4gKiB7QGxpbmsgcmVzb2x2ZU1vZGVsfSAvIHtAbGluayBidWlsZE1vZGVsfTpcbiAqXG4gKiAgIDEuIFBlci1hZ2VudCBgZGVmLm1vZGVsYCAoc3RyaW5nIHN1Z2FyIC0+IHRoZSBsaXRlcmFsIGlkO1xuICogICAgICBmdW5jdGlvbiAvIGBEeW5hbWljQXJndW1lbnRgIC0+IGBcIjxkeW5hbWljPlwiYCBiZWNhdXNlIHRoZVxuICogICAgICByZXNvbHZlciBkZWNpZGVzIGF0IGNhbGwgdGltZSkuXG4gKiAgIDIuIFBsdWdpbi1sZXZlbCBgY29uZmlnLmRlZmF1bHRNb2RlbGAgKHNhbWUgcnVsZXMpLlxuICogICAzLiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgIGVudiB2YXIuXG4gKiAgIDQuIEZpcnN0IGVudHJ5IG9mIGBjb25maWcuZGVmYXVsdE1vZGVsRmFsbGJhY2tzID8/IGZhbGxiYWNrLkZBTExCQUNLX01PREVMX0lEU2AuXG4gKlxuICogVXNlZCBmb3IgdGhlIHN0YXJ0dXAgYGFnZW50IHJlZ2lzdGVyZWRgIGxvZyBzbyBvcGVyYXRvcnMgY2FuIHNlZVxuICogd2hpY2ggZW5kcG9pbnQgZWFjaCBhZ2VudCBwb2ludHMgYXQgYnkgZGVmYXVsdC4gUGVyLXJlcXVlc3RcbiAqIG92ZXJyaWRlcyAoYFgtTWFzdHJhLU1vZGVsYCBldGMuKSBhbmQgdGhlIHdvcmtzcGFjZS1jYXRhbG9ndWVcbiAqIGZ1enp5IG1hdGNoIGFyZSBzdGlsbCBhcHBsaWVkIGF0IHJ1bnRpbWUuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlQWdlbnREZWZhdWx0TW9kZWwoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsIGRlZjogTWFzdHJhQWdlbnREZWZpbml0aW9uKTogc3RyaW5nIHtcbiAgY29uc3QgZWZmZWN0aXZlID0gZGVmLm1vZGVsID8/IGNvbmZpZy5kZWZhdWx0TW9kZWw7XG4gIGlmICh0eXBlb2YgZWZmZWN0aXZlID09PSBcInN0cmluZ1wiKSByZXR1cm4gZWZmZWN0aXZlO1xuICBpZiAoZWZmZWN0aXZlICE9PSB1bmRlZmluZWQpIHJldHVybiBcIjxkeW5hbWljPlwiO1xuICByZXR1cm4gKFxuICAgIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FID8/XG4gICAgY29uZmlnLmRlZmF1bHRNb2RlbEZhbGxiYWNrcz8uWzBdID8/XG4gICAgZmFsbGJhY2suRkFMTEJBQ0tfTU9ERUxfSURTWzBdIVxuICApO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBgY29uZmlnLmFnZW50c2AgaW50byBhIGBSZWNvcmQ8aWQsIGRlZmluaXRpb24+YC4gQWNjZXB0c1xuICogYW55IG9mIHRoZSB0aHJlZSBzaGFwZXMgZG9jdW1lbnRlZCBvblxuICoge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudHN9OlxuICpcbiAqIC0gUmVjb3JkIC0gcmV0dXJuZWQgYXMtaXMgd2hlbiBub24tZW1wdHkuXG4gKiAtIFNpbmdsZSBkZWZpbml0aW9uIChkZXRlY3RlZCB2aWEgdGhlIHJlcXVpcmVkIGBpbnN0cnVjdGlvbnNgXG4gKiAgIGZpZWxkKSAtIGtleWVkIGJ5IGBzbHVnaWZ5KGRlZi5uYW1lKWAgb3IgYEZBTExCQUNLX0FHRU5UX0lEYC5cbiAqIC0gQXJyYXkgLSBrZXllZCBieSBgc2x1Z2lmeShkZWYubmFtZSlgIG9yIGBhZ2VudF8ke2l9YDsgZHVwbGljYXRlXG4gKiAgIHNsdWdzIGZhaWwgbG91ZGx5IHNvIHVzZXJzIGtub3cgdG8gc2V0IGV4cGxpY2l0IG5hbWVzLlxuICpcbiAqIE9taXR0ZWQgb3IgZW1wdHkgaW5wdXRzIGZhbGwgYmFjayB0byBhIHNpbmdsZSBidWlsdC1pbiBhbmFseXN0IHNvXG4gKiB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZyBjaGF0IHJvdXRlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRGVmaW5pdGlvbnMoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBSZWNvcmQ8c3RyaW5nLCBNYXN0cmFBZ2VudERlZmluaXRpb24+IHtcbiAgY29uc3QgaW5wdXQgPSBjb25maWcuYWdlbnRzO1xuICBpZiAoIWlucHV0KSByZXR1cm4gZmFsbGJhY2tEZWZpbml0aW9ucygpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIGlmIChpbnB1dC5sZW5ndGggPT09IDApIHJldHVybiBmYWxsYmFja0RlZmluaXRpb25zKCk7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBNYXN0cmFBZ2VudERlZmluaXRpb24+ID0ge307XG4gICAgaW5wdXQuZm9yRWFjaCgoZGVmLCBpKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYsIGkpO1xuICAgICAgaWYgKG91dFtrZXldKSB7XG4gICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgICAgICAgYG1hc3RyYTogZHVwbGljYXRlIGFnZW50IGlkIFwiJHtrZXl9XCIgZGVyaXZlZCBmcm9tIG5hbWUgXCIke2RlZi5uYW1lID8/IFwiXCJ9XCI7IGAgK1xuICAgICAgICAgICAgYHNldCB1bmlxdWUgXFxgbmFtZVxcYHMgb24gZWFjaCBkZWZpbml0aW9uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG91dFtrZXldID0gZGVmO1xuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvLyBTaW5nbGUtZGVmaW5pdGlvbiBzaG9ydGhhbmQ6IGFuIGFnZW50IGFsd2F5cyBoYXMgYGluc3RydWN0aW9uczogc3RyaW5nYCxcbiAgLy8gYSByZWNvcmQtb2YtYWdlbnRzIG5ldmVyIGhhcyB0aGF0IGZpZWxkIGRpcmVjdGx5LlxuICBpZiAodHlwZW9mIChpbnB1dCBhcyBNYXN0cmFBZ2VudERlZmluaXRpb24pLmluc3RydWN0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGRlZiA9IGlucHV0IGFzIE1hc3RyYUFnZW50RGVmaW5pdGlvbjtcbiAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYpO1xuICAgIHJldHVybiB7IFtrZXldOiBkZWYgfTtcbiAgfVxuXG4gIGNvbnN0IHJlY29yZCA9IGlucHV0IGFzIFJlY29yZDxzdHJpbmcsIE1hc3RyYUFnZW50RGVmaW5pdGlvbj47XG4gIGlmIChPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTtcbiAgcmV0dXJuIHJlY29yZDtcbn1cblxuLyoqIERlcml2ZSBhIHJlZ2lzdHJ5IGlkIGZyb20gYSBkZWZpbml0aW9uJ3MgYG5hbWVgLCB3aXRoIGEgZmFsbGJhY2suICovXG5mdW5jdGlvbiBkZXJpdmVBZ2VudEtleShkZWY6IE1hc3RyYUFnZW50RGVmaW5pdGlvbiwgaW5kZXg/OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoZGVmLm5hbWUpIHtcbiAgICBjb25zdCBzbHVnID0gc3RyaW5nLnRvSWRlbnRpZmllcihkZWYubmFtZSk7XG4gICAgaWYgKHNsdWcpIHJldHVybiBzbHVnO1xuICB9XG4gIHJldHVybiBpbmRleCA9PT0gdW5kZWZpbmVkID8gRkFMTEJBQ0tfQUdFTlRfSUQgOiBgYWdlbnRfJHtpbmRleH1gO1xufVxuXG4vKiogQnVpbHQtaW4gZmFsbGJhY2sgcmVnaXN0cnkgdXNlZCB3aGVuIGBhZ2VudHNgIGlzIG9taXR0ZWQgLyBlbXB0eS4gKi9cbmZ1bmN0aW9uIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTogUmVjb3JkPHN0cmluZywgTWFzdHJhQWdlbnREZWZpbml0aW9uPiB7XG4gIHJldHVybiB7XG4gICAgW0ZBTExCQUNLX0FHRU5UX0lEXToge1xuICAgICAgbmFtZTogXCJEZWZhdWx0IEFnZW50XCIsXG4gICAgICBpbnN0cnVjdGlvbnM6IEZBTExCQUNLX0FHRU5UX0lOU1RSVUNUSU9OUyxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIGVmZmVjdGl2ZSBtb2RlbCBzcGVjIGZvciBhbiBhZ2VudC4gRmFsbGJhY2sgbGFkZGVyLCBpblxuICogb3JkZXI6XG4gKlxuICogICAxLiBQZXItYWdlbnQgYGRlZi5tb2RlbGAgKHN0cmluZyBzdWdhciBvciBgRHluYW1pY0FyZ3VtZW50YCkuXG4gKiAgIDIuIFBsdWdpbi1sZXZlbCBgY29uZmlnLmRlZmF1bHRNb2RlbGAgKHN0cmluZyBzdWdhciBvclxuICogICAgICBgRHluYW1pY0FyZ3VtZW50YCkgLSBtaXJyb3JzIEFwcEtpdCdzIGBhZ2VudHMoeyBkZWZhdWx0TW9kZWwgfSlgLlxuICogICAzLiBUaGUgYXV0by1yZXNvbHZlciB0aGF0IG1pbnRzIHVzZXItc2NvcGVkIHRva2VucyBhZ2FpbnN0XG4gKiAgICAgIGAvc2VydmluZy1lbmRwb2ludHNgIHZpYSB7QGxpbmsgYnVpbGRNb2RlbH0uXG4gKlxuICogU3RyaW5nIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBgbW9kZWxJZGAgc3VnYXIgYW5kIHRocmVhZGVkIHRocm91Z2hcbiAqIGBidWlsZE1vZGVsYCdzIG92ZXJyaWRlIGhvb2sgc28gdGhlIHJ1bnRpbWUgZnV6enkgbWF0Y2hlciBhbmQgdGhlXG4gKiBwZXItcmVxdWVzdCBgWC1NYXN0cmEtTW9kZWxgIG92ZXJyaWRlIGxheWVyIG9uIHRvcCBvZiB0aGUgc3RhdGljXG4gKiBjaG9pY2UuIE5vbi1zdHJpbmcgYER5bmFtaWNBcmd1bWVudGBzIGFyZSBwYXNzZWQgdGhyb3VnaCB2ZXJiYXRpbTtcbiAqIGNhbGxlcnMgdGhhdCBuZWVkIGZ1bGwgY29udHJvbCBvdmVyIGBwcm92aWRlcklkYCAvIGBoZWFkZXJzYCAvXG4gKiBgbW9kZWxJZGAgYnlwYXNzIHRoZSByZXNvbHZlciBwaXBlbGluZSBlbnRpcmVseS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1vZGVsKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgb3ZlcnJpZGU6IE1hc3RyYUFnZW50RGVmaW5pdGlvbltcIm1vZGVsXCJdLFxuKTogQWdlbnRDb25maWdbXCJtb2RlbFwiXSB7XG4gIGNvbnN0IGVmZmVjdGl2ZSA9IG92ZXJyaWRlID8/IGNvbmZpZy5kZWZhdWx0TW9kZWw7XG4gIGlmIChlZmZlY3RpdmUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiBidWlsZE1vZGVsKGNvbmZpZywgcmVxdWVzdENvbnRleHQpO1xuICB9XG4gIGlmICh0eXBlb2YgZWZmZWN0aXZlID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgbW9kZWxJZCA9IGVmZmVjdGl2ZTtcbiAgICByZXR1cm4gKHsgcmVxdWVzdENvbnRleHQgfSkgPT4gYnVpbGRNb2RlbChjb25maWcsIHJlcXVlc3RDb250ZXh0LCB7IG1vZGVsSWQgfSk7XG4gIH1cbiAgcmV0dXJuIGVmZmVjdGl2ZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgZGVmaW5pdGlvbidzIGB0b29sc2AgZmllbGQgdG8gYSBmbGF0IGBNYXN0cmFUb29sc2AgcmVjb3JkLFxuICogbWVyZ2luZyBpbiBwbHVnaW4tbGV2ZWwgYW1iaWVudCB0b29scyAocGVyLWFnZW50IHRvb2xzIHdpbiBvbiBrZXlcbiAqIGNvbGxpc2lvbikuIENhbGxiYWNrIGVycm9ycyBwcm9wYWdhdGUgdmVyYmF0aW0gc28gdGhlIG9yaWdpbmFsIHN0YWNrXG4gKiBzdXJ2aXZlcyAtIHRoZSBjYWxsZXIgYWxyZWFkeSBrbm93cyB3aGljaCBhZ2VudCB3YXMgcmVnaXN0ZXJpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVUb29scyhcbiAgZGVmVG9vbHM6IE1hc3RyYUFnZW50RGVmaW5pdGlvbltcInRvb2xzXCJdLFxuICBwbHVnaW5zOiBNYXN0cmFQbHVnaW5zLFxuICBhbWJpZW50VG9vbHM6IE1hc3RyYVRvb2xzLFxuKTogUHJvbWlzZTxNYXN0cmFUb29scz4ge1xuICBpZiAoIWRlZlRvb2xzKSByZXR1cm4geyAuLi5hbWJpZW50VG9vbHMgfTtcbiAgY29uc3QgcmVzb2x2ZWQgPSB0eXBlb2YgZGVmVG9vbHMgPT09IFwiZnVuY3Rpb25cIiA/IGF3YWl0IGRlZlRvb2xzKHBsdWdpbnMpIDogZGVmVG9vbHM7XG4gIHJldHVybiB7IC4uLmFtYmllbnRUb29scywgLi4ucmVzb2x2ZWQgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFnZW50V29ya3NwYWNlKFxuICB3b3Jrc3BhY2U6IE1hc3RyYUFnZW50RGVmaW5pdGlvbltcIndvcmtzcGFjZVwiXSxcbik6IFdvcmtzcGFjZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghd29ya3NwYWNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIHdvcmtzcGFjZSA9PT0gXCJmdW5jdGlvblwiID8gd29ya3NwYWNlKCkgOiB3b3Jrc3BhY2U7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHtAbGluayBNYXN0cmFQbHVnaW5zfSBydW50aW1lIHByb3h5IGhhbmRlZCB0b1xuICogYHRvb2xzKHBsdWdpbnMpYCBjYWxsYmFja3MuXG4gKlxuICogSW1wbGVtZW50ZWQgYXMgYSBgUHJveHlgIG92ZXIgdGhlIEFwcEtpdCBwbHVnaW4gY29udGV4dCBzb1xuICogYHBsdWdpbnMuPG5hbWU+YCByZXNvbHZlcyBhdCBmaXJzdCBhY2Nlc3MuIEFueSBzaWJsaW5nIHBsdWdpbiB0aGF0XG4gKiBpbXBsZW1lbnRzIEFwcEtpdCdzIHN0YW5kYXJkIGBUb29sUHJvdmlkZXJgIGludGVyZmFjZVxuICogKGB0b29sa2l0KG9wdHM/KWAgKyBgZXhlY3V0ZUFnZW50VG9vbChuYW1lLCBhcmdzLCBzaWduYWw/KWApIGlzXG4gKiBhdXRvLWFkYXB0ZWQgaW50byBNYXN0cmEgdG9vbHMuIFVua25vd24gbmFtZXMgcmV0dXJuIGB1bmRlZmluZWRgLFxuICogbWF0Y2hpbmcgQXBwS2l0J3MgYFBsdWdpbnNgIHNlbWFudGljcyBzbyBgcGx1Z2lucy5mb28/LnRvb2xraXQoKWBcbiAqIHJlbWFpbnMgc2FmZSBpbiBlbnZpcm9ubWVudHMgd2hlcmUgYGZvb2AgaXNuJ3QgcmVnaXN0ZXJlZC5cbiAqXG4gKiBgZ2VuaWVgIGlzIHNwZWNpYWwtY2FzZWQgdG8gc3dhcCB0aGUgZ2VuZXJpYyBBcHBLaXQgdG9vbGtpdCAod2hpY2hcbiAqIHJ1bnMgYGV4ZWN1dGVBZ2VudFRvb2xgIGFuZCBvbmx5IGVtaXRzIGEgc2luZ2xlIGZpbmFsIGB0b29sLXJlc3VsdGBcbiAqIGNodW5rIHBlciBjYWxsKSBmb3IgdGhlIHN0cmVhbWluZy1hd2FyZSB0b29scyBidWlsdCBieVxuICoge0BsaW5rIGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXJ9LiBUaGUgc3RyZWFtaW5nIHZhcmlhbnQgZm9yd2FyZHMgZWFjaFxuICogR2VuaWUgd2lyZSBldmVudCAoc3RhdHVzLCBTUUwsIHJvdyBjb3VudHMsIGVycm9ycykgb3V0IHRocm91Z2ggdGhlXG4gKiBNYXN0cmEgYGN0eC53cml0ZXJgLCBzbyB0aGUgVUkgZ2V0cyBgdG9vbC1vdXRwdXRgIGNodW5rcyBpbiByZWFsXG4gKiB0aW1lIGluc3RlYWQgb2Ygc3RhcmluZyBhdCBhIHNwaW5uZXIgZm9yIHRoZSBmdWxsIEdlbmllIHJvdW5kLXRyaXAuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUGx1Z2luc01hcChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGNvbnRleHQ6IHBsdWdpbi5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCxcbik6IE1hc3RyYVBsdWdpbnMge1xuICBjb25zdCBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIgfCBudWxsPigpO1xuICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIE1hc3RyYVBsdWdpbnMsIHtcbiAgICBnZXQoX3RhcmdldCwgcHJvcE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcE5hbWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FjaGUuaGFzKHByb3BOYW1lKSkgcmV0dXJuIGNhY2hlLmdldChwcm9wTmFtZSkgPz8gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcHJvdmlkZXIgPSByZXNvbHZlUHJvdmlkZXIoY29uZmlnLCBjb250ZXh0LCBwcm9wTmFtZSk7XG4gICAgICBjYWNoZS5zZXQocHJvcE5hbWUsIHByb3ZpZGVyKTtcbiAgICAgIHJldHVybiBwcm92aWRlciA/PyB1bmRlZmluZWQ7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogUGljayB0aGUgcmlnaHQge0BsaW5rIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcn0gZm9yIGEgc2libGluZ1xuICogcGx1Z2luIGxvb2t1cC4gUmV0dXJucyB0aGUgR2VuaWUgYWdlbnQtYmFja2VkIGFkYXB0ZXIgd2hlblxuICogdGhlIGNhbGxlciBhc2tzIGZvciBgZ2VuaWVgIEFORCBhdCBsZWFzdCBvbmUgc3BhY2UgaXMgcmVhY2hhYmxlXG4gKiB2aWEge0BsaW5rIHJlc29sdmVHZW5pZVNwYWNlc30gKHRoZSBleHBsaWNpdFxuICogYGNvbmZpZy5nZW5pZVNwYWNlc2AsIHRoZSByZWdpc3RlcmVkIEFwcEtpdCBgZ2VuaWUoKWAgcGx1Z2luJ3NcbiAqIGBzcGFjZXNgIGNvbmZpZywgb3IgdGhlIGBEQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEYCBlbnYgdmFyKS5cbiAqIEZhbGxzIGJhY2sgdG8gdGhlIGdlbmVyaWMgQXBwS2l0IGBUb29sUHJvdmlkZXJgIGFkYXB0ZXIgZm9yXG4gKiBldmVyeSBvdGhlciBwbHVnaW4gbmFtZS4gYGNvbmZpZ2AgaXMgdGhyZWFkZWQgdGhyb3VnaCBzbyB0aGVcbiAqIEdlbmllIGFnZW50IGluaGVyaXRzIHRoZSBzYW1lIG1vZGVsIHJlc29sdmVyIC8gZmFsbGJhY2tcbiAqIGxhZGRlciB0aGUgY2FsbGluZyBhZ2VudHMgdXNlLlxuICpcbiAqIFRoZSBHZW5pZSB0b29scyB0YWxrIHRvIEdlbmllIGRpcmVjdGx5IHRocm91Z2ggYEBkYngtdG9vbHMvZ2VuaWVgXG4gKiAoYGdlbmllRXZlbnRDaGF0YCkgYW5kIHRoZSB3b3Jrc3BhY2UgYHN0YXRlbWVudEV4ZWN1dGlvbi5nZXRTdGF0ZW1lbnRgXG4gKiBBUEk7IEFwcEtpdCdzIHN0b2NrIGBnZW5pZWAgcGx1Z2luIGNvbnRyaWJ1dGVzIG9ubHkgaXRzIHJlc291cmNlXG4gKiBtYW5pZmVzdCBhbmQgYHNwYWNlc2AgY29uZmlnLCBzbyBhbiBgYXBwLnlhbWxgIHJlc291cmNlIGJpbmRpbmcgYW5kIGFcbiAqIGBnZW5pZSh7IHNwYWNlcyB9KWAgcmVjb3JkIGhhdmUgdGhlIHNhbWUgbWVhbmluZyBoZXJlIGFzIHRoZXkgZG8gdGhlcmUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVQcm92aWRlcihcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGNvbnRleHQ6IHBsdWdpbi5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCxcbiAgcHJvcE5hbWU6IHN0cmluZyxcbik6IE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB8IG51bGwge1xuICBpZiAocHJvcE5hbWUgPT09IFwiZ2VuaWVcIikge1xuICAgIGNvbnN0IHNwYWNlcyA9IHJlc29sdmVHZW5pZVNwYWNlcyhjb25maWcsIGNvbnRleHQpO1xuICAgIGlmIChPYmplY3Qua2V5cyhzcGFjZXMpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXIoe1xuICAgICAgc3BhY2VzLFxuICAgICAgY29uZmlnLFxuICAgIH0pIGFzIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcjtcbiAgfVxuICBjb25zdCBwbHVnaW4gPSBjb250ZXh0Py5nZXRQbHVnaW5zKCkuZ2V0KHByb3BOYW1lKTtcbiAgcmV0dXJuIGFkYXB0UGx1Z2luVG9vbGtpdChwbHVnaW4pO1xufVxuXG4vKipcbiAqIEFwcEtpdCBgVG9vbFByb3ZpZGVyYCBzaGFwZSB3ZSBkdWNrLXR5cGUgYWdhaW5zdCBhbnkgcmVnaXN0ZXJlZFxuICogcGx1Z2luLiBEZWZpbmVkIHN0cnVjdHVyYWxseSB0byBhdm9pZCBjb3VwbGluZyB0byBBcHBLaXQncyBpbnRlcm5hbFxuICogdHlwZSBtb2R1bGUgbGF5b3V0LlxuICovXG5pbnRlcmZhY2UgQXBwS2l0VG9vbGtpdFByb3ZpZGVyIHtcbiAgdG9vbGtpdD86IChvcHRzPzogVG9vbGtpdE9wdGlvbnMpID0+IFJlY29yZDxzdHJpbmcsIEFwcEtpdFRvb2xraXRFbnRyeT47XG4gIGV4ZWN1dGVBZ2VudFRvb2w/OiAobmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzZTx1bmtub3duPjtcbn1cblxuLyoqIFNpbmdsZSBlbnRyeSByZXR1cm5lZCBieSBhbiBBcHBLaXQgcGx1Z2luJ3MgYC50b29sa2l0KG9wdHMpYCBjYWxsLiAqL1xuaW50ZXJmYWNlIEFwcEtpdFRvb2xraXRFbnRyeSB7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgbG9jYWxOYW1lOiBzdHJpbmc7XG4gIGRlZjoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHBhcmFtZXRlcnM6IHVua25vd247XG4gIH07XG59XG5cbi8qKlxuICogQWRhcHQgYW4gQXBwS2l0IGBUb29sUHJvdmlkZXJgIHBsdWdpbiBpbnN0YW5jZSBpbnRvIGFcbiAqIHtAbGluayBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXJ9LiBSZXR1cm5zIGBudWxsYCBmb3IgYW55IHBsdWdpblxuICogdGhhdCBkb2Vzbid0IGltcGxlbWVudCBib3RoIGB0b29sa2l0YCBhbmQgYGV4ZWN1dGVBZ2VudFRvb2xgIChlLmcuXG4gKiBgc2VydmVyYCwgYGxha2ViYXNlYCB3aGVuIHVzZWQgb25seSBhcyBhIFBvc3RncmVzIHBvb2wsIGV0Yy4pLlxuICovXG5mdW5jdGlvbiBhZGFwdFBsdWdpblRvb2xraXQocGx1Z2luOiB1bmtub3duKTogTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHwgbnVsbCB7XG4gIGlmICghcGx1Z2luIHx8IHR5cGVvZiBwbHVnaW4gIT09IFwib2JqZWN0XCIpIHJldHVybiBudWxsO1xuICBjb25zdCBwID0gcGx1Z2luIGFzIEFwcEtpdFRvb2xraXRQcm92aWRlcjtcbiAgaWYgKHR5cGVvZiBwLnRvb2xraXQgIT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgcC5leGVjdXRlQWdlbnRUb29sICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHRvb2xraXQob3B0cz86IFRvb2xraXRPcHRpb25zKTogTWFzdHJhVG9vbHMge1xuICAgICAgY29uc3QgZW50cmllcyA9IHAudG9vbGtpdCEob3B0cyk7XG4gICAgICBjb25zdCB0b29sczogTWFzdHJhVG9vbHMgPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgICAgIHRvb2xzW2tleV0gPSB0b29sa2l0RW50cnlUb01hc3RyYVRvb2woZW50cnksIHApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRvb2xzO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogV3JhcCBhIHNpbmdsZSB7QGxpbmsgQXBwS2l0VG9vbGtpdEVudHJ5fSBhcyBhIE1hc3RyYSB0b29sIHdob3NlXG4gKiBgZXhlY3V0ZWAgZGlzcGF0Y2hlcyBiYWNrIHRocm91Z2ggYHBsdWdpbi5leGVjdXRlQWdlbnRUb29sKC4uLilgIHNvXG4gKiBBcHBLaXQncyBPQk8gYXV0aCAoYGFzVXNlcmApIGFuZCB0ZWxlbWV0cnkgc3BhbnMgc3RheSBpbnRhY3QuIEpTT05cbiAqIFNjaGVtYSBwYXJhbWV0ZXJzIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQgLSBNYXN0cmEncyBgUHVibGljU2NoZW1hYFxuICogYWNjZXB0cyBgSlNPTlNjaGVtYTdgIGRpcmVjdGx5IHZpYSBgQG1hc3RyYS9zY2hlbWEtY29tcGF0YC5cbiAqL1xuZnVuY3Rpb24gdG9vbGtpdEVudHJ5VG9NYXN0cmFUb29sKGVudHJ5OiBBcHBLaXRUb29sa2l0RW50cnksIHBsdWdpbjogQXBwS2l0VG9vbGtpdFByb3ZpZGVyKTogVG9vbCB7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogYCR7ZW50cnkucGx1Z2luTmFtZX1fXyR7ZW50cnkubG9jYWxOYW1lfWAsXG4gICAgZGVzY3JpcHRpb246IGVudHJ5LmRlZi5kZXNjcmlwdGlvbixcbiAgICAuLi4oZW50cnkuZGVmLnBhcmFtZXRlcnMgPyB7IGlucHV0U2NoZW1hOiBlbnRyeS5kZWYucGFyYW1ldGVycyBhcyBuZXZlciB9IDoge30pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3Qgc2lnbmFsID0gKGNvbnRleHQgYXMgeyBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsIH0gfCB1bmRlZmluZWQpPy5hYm9ydFNpZ25hbDtcbiAgICAgIHJldHVybiBwbHVnaW4uZXhlY3V0ZUFnZW50VG9vbCEoZW50cnkubG9jYWxOYW1lLCBpbnB1dCwgc2lnbmFsKTtcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
|
|
554
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFPLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU3RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSWhELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVqRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFM0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBbUJsRCx5RUFBeUU7QUFDekUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWhEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxNQUFNLFVBQVUsSUFBSSxDQUFDLElBQXVCO0lBQzFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyRCxPQUFPLFVBQVUsQ0FBQztRQUNoQixFQUFFO1FBQ0YsV0FBVyxFQUFFLElBQUksQ0FBQyxX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SyxFQUFFLEtBQWMsRUFBRSxPQUFnQixFQUFFLEVBQUU7WUFDbEQsTUFBTSxNQUFNLEdBQUksT0FBcUQsRUFBRSxXQUFXLENBQUM7WUFDbkYsT0FBTyxNQUFNLENBQUMsZ0JBQWlCLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbEUsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFnZW50IHJlZ2lzdHJhdGlvbiBmb3IgdGhlIE1hc3RyYSBBcHBLaXQgcGx1Z2luLlxuICpcbiAqIE1pcnJvcnMgdGhlIHNoYXBlIG9mIHRoZSBBcHBLaXQgYGFnZW50c2AgcGx1Z2luIChgY29uZmlnLmFnZW50c2AgbWFwXG4gKiBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9ufSwgZHVhbC1mb3JtIGB0b29sc2AgYWNjZXB0aW5nIGEgcGxhaW5cbiAqIHJlY29yZCBvciBhIGAocGx1Z2lucykgPT4gdG9vbHNgIGNhbGxiYWNrKS4gUmVzb2x2ZXMgZWFjaCBkZWZpbml0aW9uXG4gKiBpbnRvIGEgTWFzdHJhIGBBZ2VudGAgaW5zdGFuY2UgZHVyaW5nIHBsdWdpbiBzZXR1cDsgdXNlci1zdXBwbGllZFxuICogdG9vbCBjYWxsYmFja3MgYXJlIGludm9rZWQgZXhhY3RseSBvbmNlIHdpdGggYSB0eXBlZFxuICoge0BsaW5rIE1hc3RyYVBsdWdpbnN9IG1hcCBidWlsdCBmcm9tIHJlZ2lzdGVyZWQgc2libGluZyBwbHVnaW5zLlxuICpcbiAqIFdoZW4gbm8gYWdlbnRzIGFyZSByZWdpc3RlcmVkIHRoZSBwbHVnaW4gZmFsbHMgYmFjayB0byBhIHNpbmdsZVxuICogYnVpbHQtaW4gYW5hbHlzdCBzbyB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZ1xuICogc3RyZWFtYWJsZSBhZ2VudCBmb3IgZGVtb3MuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IHBsdWdpbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZmFsbGJhY2sgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nLCBvYmplY3QsIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50Q29uZmlnLCBUb29sc0lucHV0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgdHlwZSB7IFRvb2wgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5pbXBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2UgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHR5cGUgeyBQZ1ZlY3RvckNvbmZpZywgUG9zdGdyZXNTdG9yZUNvbmZpZyB9IGZyb20gXCJAbWFzdHJhL3BnXCI7XG5cbmltcG9ydCB7IGJ1aWxkUmVuZGVyRGF0YVRvb2wgfSBmcm9tIFwiLi9jaGFydC50c1wiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXIsIHJlc29sdmVHZW5pZVNwYWNlcyB9IGZyb20gXCIuL2dlbmllLnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9tZW1vcnkudHNcIjtcbmltcG9ydCB7IGJ1aWxkTW9kZWwgfSBmcm9tIFwiLi9tb2RlbC50c1wiO1xuaW1wb3J0IHsgUmVzdWx0UHJvY2Vzc29yLCBzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy50c1wiO1xuaW1wb3J0IHsgYnVpbGRTdW1tYXJpemVUb29sIH0gZnJvbSBcIi4vc3VtbWFyaXplLnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVXb3Jrc3BhY2UgfSBmcm9tIFwiLi93b3Jrc3BhY2VzLnRzXCI7XG5cbi8qKlxuICogVG9vbCByZWNvcmQgYWNjZXB0ZWQgYnkgZXZlcnkgTWFzdHJhIGBBZ2VudC50b29sc2AgZmllbGQgYW5kIGJ5IHRoZVxuICogYHRvb2xzKHBsdWdpbnMpYCBjYWxsYmFjayBvbiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9ufS5cbiAqXG4gKiBBbGlhcyBvZiBNYXN0cmEncyBgVG9vbHNJbnB1dGAsIHNvIGl0IGFscmVhZHkgYWNjZXB0czpcbiAqXG4gKiAtIE1hc3RyYSB0b29scyBidWlsdCB3aXRoIHtAbGluayBjcmVhdGVUb29sfSAob3IgYG5ldyBUb29sKC4uLilgKVxuICogLSBNYXN0cmEgdG9vbHMgYnVpbHQgd2l0aCB0aGUgQXBwS2l0LXNoYXBlZCB7QGxpbmsgdG9vbH0gd3JhcHBlclxuICogICBiZWxvd1xuICogLSBWZXJjZWwgQUkgU0RLIHRvb2xzIChgdG9vbCh7IC4uLiB9KWAgZnJvbSBgYWlgKVxuICogLSBQcm92aWRlci1kZWZpbmVkIHRvb2xzIChlLmcuIGBvcGVuYWkudG9vbHMud2ViU2VhcmNoKC4uLilgKVxuICpcbiAqIEV4aXN0aW5nIHRvb2wgbGlicmFyaWVzIGRyb3AgaW4gYXMtaXMgLSBub3RoaW5nIGluIHRoaXMgcGFja2FnZVxuICogZm9yY2VzIGEgcmVidWlsZC5cbiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhVG9vbHMgPSBUb29sc0lucHV0O1xuXG4vKiogUmUtZXhwb3J0IG9mIE1hc3RyYSdzIG5hdGl2ZSBgY3JlYXRlVG9vbGAgZm9yIGZ1bGwtZmVhdHVyZSBhY2Nlc3MuICovXG5leHBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuXG4vKipcbiAqIEFwcEtpdC1zaGFwZWQgdG9vbCBmYWN0b3J5LiBMZXRzIHVzZXJzIG1peC1hbmQtbWF0Y2ggdG9vbHMgYWNyb3NzXG4gKiBBcHBLaXQncyBgYWdlbnRzYCBwbHVnaW4gYW5kIGBtYXN0cmFgIHdpdGggYSBzaW5nbGUgaW1wb3J0OlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyB0b29sIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuICogaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbiAqXG4gKiBnZXRfd2VhdGhlcjogdG9vbCh7XG4gKiAgIGRlc2NyaXB0aW9uOiBcIldlYXRoZXJcIixcbiAqICAgc2NoZW1hOiB6Lm9iamVjdCh7IGNpdHk6IHouc3RyaW5nKCkgfSksXG4gKiAgIGV4ZWN1dGU6IGFzeW5jICh7IGNpdHkgfSkgPT4gYFN1bm55IGluICR7Y2l0eX1gLFxuICogfSksXG4gKiBgYGBcbiAqXG4gKiBNYXBzIG9udG8gTWFzdHJhJ3MgYGNyZWF0ZVRvb2xgOlxuICpcbiAqIC0gYGRlc2NyaXB0aW9uYCAtPiBgZGVzY3JpcHRpb25gIChyZXF1aXJlZClcbiAqIC0gYHNjaGVtYWAgLT4gYGlucHV0U2NoZW1hYCAob3B0aW9uYWwpXG4gKiAtIGBleGVjdXRlKGlucHV0KWAgLT4gYGV4ZWN1dGUoaW5wdXQsIGN0eClgIC0gTWFzdHJhIGFscmVhZHkgY2FsbHNcbiAqICAgdGhlIGZpcnN0IGFyZyB3aXRoIHRoZSBwYXJzZWQgaW5wdXRzLCBzbyB0aGUgYm9keSBzaGFwZSBpc1xuICogICBpZGVudGljYWwuIFRoZSBNYXN0cmEgYGNvbnRleHRgIGFyZyBpcyBmb3J3YXJkZWQgYXMgdGhlIHNlY29uZFxuICogICBwYXJhbWV0ZXIgd2hlbiB0aGUgY2FsbGVyIGRlY2xhcmVzIGl0LlxuICogLSBgaWRgOiBvcHRpb25hbC4gRGVmYXVsdHMgdG8gYSBzdGFibGUgaWRlbnRpZmllciBkZXJpdmVkIGZyb21cbiAqICAgYGRlc2NyaXB0aW9uYCAoc2x1Z2lmaWVkLCB3aXRoIGEgc2hvcnQgaGFzaCBzdWZmaXggZm9yXG4gKiAgIHVuaXF1ZW5lc3MpLiBQYXNzIGFuIGV4cGxpY2l0IGBpZGAgd2hlbiB5b3UgbmVlZCBhIHN0YWJsZSBzdHJpbmdcbiAqICAgZm9yIHRyYWNpbmcgb3IgTUNQIGV4cG9zdXJlLlxuICpcbiAqIFJlYWNoIGZvciB7QGxpbmsgY3JlYXRlVG9vbH0gd2hlbiB5b3UgbmVlZCBNYXN0cmEtb25seSBmaWVsZHNcbiAqIChgb3V0cHV0U2NoZW1hYCwgYHN1c3BlbmRTY2hlbWFgLCBgcmVxdWlyZUFwcHJvdmFsYCwgYG1jcGAsIGV0Yy4pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9vbChvcHRzOiBBcHBLaXRUb29sT3B0aW9ucyk6IFRvb2wge1xuICBjb25zdCBpZCA9IG9wdHMuaWQgPz8gZGVyaXZlVG9vbElkKG9wdHMuZGVzY3JpcHRpb24pO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQsXG4gICAgZGVzY3JpcHRpb246IG9wdHMuZGVzY3JpcHRpb24sXG4gICAgLi4uKG9wdHMuc2NoZW1hID8geyBpbnB1dFNjaGVtYTogb3B0cy5zY2hlbWEgYXMgbmV2ZXIgfSA6IHt9KSxcbiAgICBleGVjdXRlOiBvcHRzLmV4ZWN1dGUgYXMgbmV2ZXIsXG4gIH0pO1xufVxuXG4vKipcbiAqIElucHV0IHNoYXBlIGZvciB0aGUgQXBwS2l0LXN0eWxlIHtAbGluayB0b29sfSBmYWN0b3J5LiBBIHRyaW1tZWRcbiAqIHN1YnNldCBvZiBNYXN0cmEncyBgY3JlYXRlVG9vbGAgb3B0aW9ucyB0aGF0IG1pcnJvcnMgdGhlXG4gKiBgQGRhdGFicmlja3MvYXBwa2l0L2JldGFgIGB0b29sKHsgZGVzY3JpcHRpb24sIHNjaGVtYSwgZXhlY3V0ZSB9KWBcbiAqIHNpZ25hdHVyZS5cbiAqXG4gKiBHZW5lcmljcyBhcmUgaW50ZW50aW9uYWxseSBhYnNlbnQgLSBpbmZlcmVuY2UgZmxvd3MgdGhyb3VnaCB0aGVcbiAqIGNhbGxlcidzIGBzY2hlbWFgICh0eXBpY2FsbHkgYSBab2Qgb2JqZWN0KSwgYW5kIHRoZSBgZXhlY3V0ZWAgYm9keVxuICogZGVzdHJ1Y3R1cmVzIG5hdHVyYWxseSBmcm9tIHRoYXQuIFJlYWNoIGZvciB7QGxpbmsgY3JlYXRlVG9vbH0gd2hlblxuICogeW91IG5lZWQgdGhlIGZ1bGx5LXR5cGVkIGlucHV0L291dHB1dCBzY2hlbWFzIHdpcmVkIGV4cGxpY2l0bHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwS2l0VG9vbE9wdGlvbnMge1xuICAvKiogT3B0aW9uYWwgc3RhYmxlIGlkZW50aWZpZXI7IGF1dG8tZGVyaXZlZCBmcm9tIGBkZXNjcmlwdGlvbmAgd2hlbiBvbWl0dGVkLiAqL1xuICBpZD86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIHNob3duIHRvIHRoZSBtb2RlbC4gUmVxdWlyZWQuICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBpbnB1dCBzY2hlbWEgKGFueSBTdGFuZGFyZCBTY2hlbWEgaW5zdGFuY2UsIGUuZy4gWm9kKS5cbiAgICogTWFwcyB0byBNYXN0cmEncyBgaW5wdXRTY2hlbWFgOyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgbW9kZWxcbiAgICogdmVyYmF0aW0uXG4gICAqL1xuICBzY2hlbWE/OiB1bmtub3duO1xuICAvKipcbiAgICogRXhlY3V0ZSBib2R5LiBGaXJzdCBhcmcgaXMgdGhlIHBhcnNlZCBpbnB1dCAodHlwZWQgb2ZmIGBzY2hlbWFgXG4gICAqIHdoZW4gc3VwcGxpZWQpLCBzZWNvbmQgYXJnIGlzIHRoZSBmdWxsIE1hc3RyYSBleGVjdXRpb24gY29udGV4dFxuICAgKiAocmVxdWVzdCBjb250ZXh0LCBhYm9ydCBzaWduYWwsIG1hc3RyYSBpbnN0YW5jZSkgaWYgeW91IG5lZWQgaXQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBleGVjdXRlOiAoaW5wdXQ6IGFueSwgY29udGV4dD86IHVua25vd24pID0+IHVua25vd247XG59XG5cbi8qKlxuICogQnVpbGQgYSBkZXRlcm1pbmlzdGljIE1hc3RyYSB0b29sIGlkIGZyb20gYSBkZXNjcmlwdGlvbi5cbiAqIERlbGVnYXRlcyB0byB7QGxpbmsgc3RyaW5nLnRvVW5pcXVlU2x1Z306IHNsdWcgKyBhbHdheXMtb25cbiAqIDYtY2hhciBGTlYtMWEgYmFzZS0zMiBzdWZmaXggc28gdHdvIHRvb2xzIHdpdGggdGhlIHNhbWUgbGVhZGluZ1xuICogd29yZHMgZG9uJ3QgY29sbGlkZSBpbiB0cmFjZXMuIFN0YWJsZSBhY3Jvc3MgcnVucy5cbiAqL1xuZnVuY3Rpb24gZGVyaXZlVG9vbElkKGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3RyaW5nLnRvVW5pcXVlU2x1ZyhkZXNjcmlwdGlvbiwgeyBmYWxsYmFja1ByZWZpeDogXCJ0b29sXCIgfSk7XG59XG5cbi8qKlxuICogSWRlbnRpdHkgaGVscGVyIHRoYXQgYnJhbmRzIGEgZGVmaW5pdGlvbiBhcyBhIE1hc3RyYSBhZ2VudC4gTWlycm9yc1xuICogQXBwS2l0J3MgYGNyZWF0ZUFnZW50KGRlZilgIHNvIHRoZSByZWdpc3RyYXRpb24gc2hhcGUgbWF0Y2hlczpcbiAqXG4gKiBgYGB0c1xuICogY29uc3Qgc3VwcG9ydCA9IGNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiLFxuICogICBtb2RlbDogXCJkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02XCIsXG4gKiAgIHRvb2xzKHBsdWdpbnMpIHsgcmV0dXJuIHsgLi4uIH07IH0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIFJldHVybnMgdGhlIGRlZmluaXRpb24gdW5jaGFuZ2VkIC0gdGhlIHdyYXBwZXIgZXhpc3RzIG9ubHkgdG8gYW5jaG9yXG4gKiB0eXBlIGluZmVyZW5jZSBhbmQgdG8gbWF0Y2ggdGhlIEFwcEtpdCBBUEkgc3VyZmFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFnZW50PFQgZXh0ZW5kcyBNYXN0cmFBZ2VudERlZmluaXRpb24+KGRlZjogVCk6IFQge1xuICBjb25zdCB3b3Jrc3BhY2UgPSBkZWYud29ya3NwYWNlID8/IGNyZWF0ZVdvcmtzcGFjZSgpO1xuICByZXR1cm4geyAuLi5kZWYsIHdvcmtzcGFjZSB9O1xufVxuXG4vKipcbiAqIEZpbHRlciAvIHJlbmFtZSBvcHRpb25zIGFjY2VwdGVkIGJ5IGV2ZXJ5IHBsdWdpbidzIGAudG9vbGtpdCgpYFxuICogbWV0aG9kLiBNaXJyb3JzIEFwcEtpdCdzIGBUb29sa2l0T3B0aW9uc2AgdmVyYmF0aW0gc28gb3B0aW9ucyBwYXNzXG4gKiB0aHJvdWdoIHVuY2hhbmdlZCAtIHRoZSB1bmRlcmx5aW5nIEFwcEtpdCBwbHVnaW4gZG9lcyB0aGUgZmlsdGVyaW5nXG4gKiBhbmQgd2UganVzdCBhZGFwdCB0aGUgcmVzdWx0aW5nIGVudHJpZXMgaW50byBNYXN0cmEgdG9vbHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbGtpdE9wdGlvbnMge1xuICAvKipcbiAgICogS2V5IHByZWZpeCBwcmVwZW5kZWQgdG8gZXZlcnkgdG9vbCBuYW1lLiBBcHBLaXQncyBkZWZhdWx0IGlzXG4gICAqIGAke3BsdWdpbk5hbWV9LmAgd2hlbiBvbWl0dGVkOyBwYXNzIGFuIGV4cGxpY2l0IGBcIlwiYCB0byBkcm9wIGl0LlxuICAgKi9cbiAgcHJlZml4Pzogc3RyaW5nO1xuICAvKiogQWxsb3dsaXN0IG9mIGxvY2FsIHRvb2wgbmFtZXMuICovXG4gIG9ubHk/OiBzdHJpbmdbXTtcbiAgLyoqIERlbnlsaXN0IG9mIGxvY2FsIHRvb2wgbmFtZXMuICovXG4gIGV4Y2VwdD86IHN0cmluZ1tdO1xuICAvKiogUmVtYXAgc3BlY2lmaWMgbG9jYWwgbmFtZXMgdG8gZGlmZmVyZW50IGtleXMuICovXG4gIHJlbmFtZT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogVG9vbGtpdCBwcm92aWRlciBzaGFwZSBldmVyeSBlbnRyeSBpbiB0aGUge0BsaW5rIE1hc3RyYVBsdWdpbnN9IG1hcFxuICogZXhwb3Nlcy4gSWRlbnRpY2FsIHRvIEFwcEtpdCdzIGBQbHVnaW5Ub29sa2l0UHJvdmlkZXJgIC0gYW55IEFwcEtpdFxuICogcGx1Z2luIHRoYXQgaW1wbGVtZW50cyB0aGUgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYGdldEFnZW50VG9vbHNgICsgYGV4ZWN1dGVBZ2VudFRvb2xgICsgYHRvb2xraXRgKSBpcyByZWFjaGFibGVcbiAqIHRocm91Z2ggdGhpcyBzdXJmYWNlIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHtcbiAgLyoqXG4gICAqIFJldHVybnMgYSBNYXN0cmEtc2hhcGVkIHRvb2xzIHJlY29yZCBhZGFwdGVkIGZyb20gdGhlIHBsdWdpbidzXG4gICAqIGFnZW50IHRvb2xzLiBFYWNoIHRvb2wgZGlzcGF0Y2hlcyBiYWNrIHRocm91Z2ggdGhlIHBsdWdpbidzXG4gICAqIGBleGVjdXRlQWdlbnRUb29sYCBzbyBPQk8gYXV0aCBhbmQgdGVsZW1ldHJ5IHNwYW5zIHN0YXkgaW50YWN0LlxuICAgKi9cbiAgdG9vbGtpdChvcHRzPzogVG9vbGtpdE9wdGlvbnMpOiBNYXN0cmFUb29scztcbn1cblxuLyoqXG4gKiBQbHVnaW4gbWFwIGhhbmRlZCB0byB0aGUgZnVuY3Rpb24gZm9ybSBvZlxuICoge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbi50b29sc30uIE1pcnJvcnMgQXBwS2l0J3MgYFBsdWdpbnNgXG4gKiB0eXBlIGV4YWN0bHk6IGEgc3RyaW5nLWtleWVkIHJlY29yZCB3aGVyZSBldmVyeSB2YWx1ZSBleHBvc2VzXG4gKiBgLnRvb2xraXQob3B0cylgLlxuICpcbiAqIEltcGxlbWVudGVkIGFzIGEgcnVudGltZSBQcm94eSB0aGF0IGF1dG8tZGlzY292ZXJzIGFueSByZWdpc3RlcmVkXG4gKiBBcHBLaXQgcGx1Z2luIGltcGxlbWVudGluZyB0aGUgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYGFuYWx5dGljc2AsIGBmaWxlc2AsIGBsYWtlYmFzZWAsIGBnZW5pZWAsIHBsdXMgYW55IHRoaXJkLXBhcnR5XG4gKiBwbHVnaW4gdGhhdCBkb2VzIHRoZSBzYW1lKS4gVW5rbm93biBuYW1lcyByZXNvbHZlIHRvIGB1bmRlZmluZWRgXG4gKiBhdCBydW50aW1lLCBzbyBndWFyZCB3aXRoIGA/LmAgYW5kIGA/PyB7fWAgd2hlbiBzcHJlYWRpbmcgZnJvbSBhXG4gKiBwbHVnaW4gdGhhdCBtYXkgbm90IGJlIHJlZ2lzdGVyZWQgaW4gZXZlcnkgZW52aXJvbm1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogXCIuLi5cIixcbiAqICAgdG9vbHMocGx1Z2lucykge1xuICogICAgIHJldHVybiB7XG4gKiAgICAgICAuLi5wbHVnaW5zLmFuYWx5dGljcy50b29sa2l0KCksXG4gKiAgICAgICAuLi5wbHVnaW5zLmZpbGVzLnRvb2xraXQoeyBvbmx5OiBbXCJ1cGxvYWRzLnJlYWRcIl0gfSksXG4gKiAgICAgICBnZXRfd2VhdGhlcjogdG9vbCh7XG4gKiAgICAgICAgIGRlc2NyaXB0aW9uOiBcIldlYXRoZXJcIixcbiAqICAgICAgICAgc2NoZW1hOiB6Lm9iamVjdCh7IGNpdHk6IHouc3RyaW5nKCkgfSksXG4gKiAgICAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IGNpdHkgfSkgPT4gYFN1bm55IGluICR7Y2l0eX1gLFxuICogICAgICAgfSksXG4gKiAgICAgfTtcbiAqICAgfSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVBsdWdpbnMgPSBSZWNvcmQ8c3RyaW5nLCBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXI+O1xuXG4vKiogRnVuY3Rpb24gZm9ybSBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9uLnRvb2xzfS4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVRvb2xzRm4gPSAocGx1Z2luczogTWFzdHJhUGx1Z2lucykgPT4gTWFzdHJhVG9vbHMgfCBQcm9taXNlPE1hc3RyYVRvb2xzPjtcblxuLyoqIEZ1bmN0aW9uIGZvcm0gb2Yge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbi53b3Jrc3BhY2V9LiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlciA9ICgpID0+IFdvcmtzcGFjZSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIGNvZGUtZGVmaW5lZCBNYXN0cmEgYWdlbnQuIE1pcnJvcnMgdGhlIHNoYXBlIEFwcEtpdCdzIGBhZ2VudHNgXG4gKiBwbHVnaW4gdXNlcyBmb3IgYEFnZW50RGVmaW5pdGlvbmAuIFRoZSByZWdpc3RyeSBrZXkgdW5kZXJcbiAqIGBjb25maWcuYWdlbnRzYCBpcyB0aGUgYGFnZW50SWRgIHRoZSBjbGllbnQgc3RyZWFtcyBhZ2FpbnN0OyBgbmFtZWBcbiAqIGlzIHB1cmVseSBpbmZvcm1hdGlvbmFsIChkZWZhdWx0cyB0byB0aGUga2V5KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFBZ2VudERlZmluaXRpb24ge1xuICAvKiogRGlzcGxheSBuYW1lIHVzZWQgYXMgYEFnZW50Lm5hbWVgLiBEZWZhdWx0cyB0byB0aGUgcmVnaXN0cnkga2V5LiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgbG9uZy1mb3JtIGRlc2NyaXB0aW9uOyBzdXJmYWNlZCBhcyBgQWdlbnQuZGVzY3JpcHRpb25gLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN5c3RlbSBwcm9tcHQgYm9keS4gKi9cbiAgaW5zdHJ1Y3Rpb25zOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgbW9kZWwgb3ZlcnJpZGUuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBmYWxscyBiYWNrIHRvIHRoZSB3b3Jrc3BhY2VcbiAgICogICBgL3NlcnZpbmctZW5kcG9pbnRzYCByZXNvbHZlciB0aGF0IHtAbGluayBidWlsZE1vZGVsfSBjb25maWd1cmVzXG4gICAqICAgZnJvbSB0aGUgcGVyLXJlcXVlc3QgYFdvcmtzcGFjZUNsaWVudGAuXG4gICAqIC0gYHN0cmluZ2A6IHNob3J0aGFuZCBmb3IgXCJ1c2UgdGhlIGRlZmF1bHQgcmVzb2x2ZXIgYnV0IHN3YXAgdGhlXG4gICAqICAgYG1vZGVsSWRgXCIgKGUuZy4gYFwiZGF0YWJyaWNrcy1tZXRhLWxsYW1hLTMtMy03MGItaW5zdHJ1Y3RcImApLlxuICAgKiAtIEFueSBvdGhlciBNYXN0cmEgYER5bmFtaWNBcmd1bWVudDxNYXN0cmFNb2RlbENvbmZpZz5gOiBwYXNzZWRcbiAgICogICBzdHJhaWdodCB0aHJvdWdoIHRvIGBBZ2VudC5tb2RlbGAuIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgZnVsbFxuICAgKiAgIGNvbnRyb2wgb3ZlciBhdXRoIG9yIHByb3ZpZGVySWQuXG4gICAqL1xuICBtb2RlbD86IEFnZW50Q29uZmlnW1wibW9kZWxcIl0gfCBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgdG9vbCByZWNvcmQuIEVpdGhlciBhIHBsYWluIG1hcCBvciBhIGNhbGxiYWNrIHRoYXRcbiAgICogcmVjZWl2ZXMgdGhlIHR5cGVkIHtAbGluayBNYXN0cmFQbHVnaW5zfSBzaWJsaW5nLXBsdWdpbiBpbmRleCBhbmRcbiAgICogcmV0dXJucyBhIG1hcC4gVGhlIGNhbGxiYWNrIHJ1bnMgZXhhY3RseSBvbmNlIGF0IGFnZW50IHNldHVwOyB0aGVcbiAgICogcmVzdWx0IGlzIGNhY2hlZCBmb3IgdGhlIGFnZW50J3MgbGlmZXRpbWUuXG4gICAqL1xuICB0b29scz86IE1hc3RyYVRvb2xzIHwgTWFzdHJhVG9vbHNGbjtcbiAgLyoqXG4gICAqIFBlci1hZ2VudCBzZW1hbnRpYyByZWNhbGwgKFBnVmVjdG9yKSBvdmVycmlkZS4gQ2FzY2FkZXMgZnJvbVxuICAgKiBgY29uZmlnLm1lbW9yeWA7IHRoZSBhZ2VudCB2YWx1ZSB3aW5zIHdoZW4gc2V0LlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogaW5oZXJpdCBgY29uZmlnLm1lbW9yeWAuIFdoZW4gdGhhdCdzXG4gICAqICAgZW5hYmxlZCwgdGhlIGFnZW50ICoqc2hhcmVzIHRoZSBwbHVnaW4tbGV2ZWwgc2luZ2xldG9uIGBQZ1ZlY3RvcmBcbiAgICogICBpbnN0YW5jZSoqIChjcm9zcy1hZ2VudCBzZW1hbnRpYyByZWNhbGwgYWNyb3NzIHRoZSBzYW1lIGluZGV4KS5cbiAgICogLSBgZmFsc2VgOiBkaXNhYmxlIHNlbWFudGljIHJlY2FsbCBmb3IgdGhpcyBhZ2VudCBvbmx5LlxuICAgKiAtIGB0cnVlYDogZW5hYmxlIHVzaW5nIHRoZSBzaGFyZWQgc2luZ2xldG9uIChzYW1lIGFzIGRlZmF1bHQgd2hlblxuICAgKiAgIHBsdWdpbiBtZW1vcnkgaXMgZW5hYmxlZDsgdXNlZnVsIHRvIG9wdCBpbiB3aGVuIHBsdWdpbiBkaXNhYmxlZCkuXG4gICAqIC0ge0BsaW5rIE1hc3RyYU1lbW9yeUNvbmZpZ30gb2JqZWN0OiBkZWRpY2F0ZWQgYFBnVmVjdG9yYCBmb3IgdGhpc1xuICAgKiAgIGFnZW50IChwcml2YXRlIHJlY2FsbCBpbmRleCkuIEJ5cGFzc2VzIHRoZSBzaGFyZWQgc2luZ2xldG9uLlxuICAgKi9cbiAgbWVtb3J5PzogYm9vbGVhbiB8IE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlO1xuICAvKipcbiAgICogUGVyLWFnZW50IHRocmVhZC9tZXNzYWdlIHN0b3JhZ2UgKGBQb3N0Z3Jlc1N0b3JlYCkgb3ZlcnJpZGUuXG4gICAqIENhc2NhZGVzIGZyb20gYGNvbmZpZy5zdG9yYWdlYDsgdGhlIGFnZW50IHZhbHVlIHdpbnMgd2hlbiBzZXQuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBpbmhlcml0IGBjb25maWcuc3RvcmFnZWAuIFdoZW4gdGhhdCdzXG4gICAqICAgZW5hYmxlZCwgdGhlIGFnZW50IGdldHMgaXRzICoqb3duIHBlci1hZ2VudCBgUG9zdGdyZXNTdG9yZWAqKlxuICAgKiAgIGtleWVkIGJ5IHtAbGluayBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lfSBzbyB0aHJlYWRzIGFuZFxuICAgKiAgIG1lc3NhZ2VzIHN0YXkgaXNvbGF0ZWQgYmV0d2VlbiBhZ2VudHMgaW4gdGhlIHNhbWUgZGF0YWJhc2UuXG4gICAqIC0gYGZhbHNlYDogZGlzYWJsZSBzdG9yYWdlIGZvciB0aGlzIGFnZW50IG9ubHkgKHB1cmVseSBpbi1tZW1vcnkpLlxuICAgKiAtIGB0cnVlYDogZW5hYmxlIHdpdGggdGhlIHBlci1hZ2VudCBkZWZhdWx0IHNjaGVtYS5cbiAgICogLSB7QGxpbmsgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlfSBvYmplY3Q6IGRlZGljYXRlZFxuICAgKiAgIGBQb3N0Z3Jlc1N0b3JlYCBjb25maWcgKGN1c3RvbSBzY2hlbWEsIGNvbm5lY3Rpb24sIGV0Yy4pLlxuICAgKi9cbiAgc3RvcmFnZT86IGJvb2xlYW4gfCBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGU7XG4gIC8qKlxuICAgKiBNYXN0cmEge0BsaW5rIFdvcmtzcGFjZX0gZm9yIHRoaXMgYWdlbnQgKGZpbGVzeXN0ZW0sIHNhbmRib3gsIG9yIG90aGVyXG4gICAqIHByb3ZpZGVycykuIEFzc2lzdGFudCBza2lsbHMgZnJvbSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBwYXRocyBhcmUgd2lyZWRcbiAgICogdmlhIHtAbGluayBjcmVhdGVXb3Jrc3BhY2V9LlxuICAgKi9cbiAgd29ya3NwYWNlPzogV29ya3NwYWNlIHwgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlcjtcbn1cblxuLyoqXG4gKiBEaXN0cmlidXRpdmUgYE9taXRgIHNvIHVuaW9ucyBpbiBgUG9zdGdyZXNTdG9yZUNvbmZpZ2AgL1xuICogYFBnVmVjdG9yQ29uZmlnYCBrZWVwIHRoZWlyIGRpc2NyaW1pbmFudHMgYWZ0ZXIgdGhlIG92ZXJyaWRlIHR5cGVzXG4gKiBzdHJpcCBgaWRgLiBUaGUgYnVpbHQtaW4gYE9taXRgIGNvbGxhcHNlcyB1bmlvbnMgdG8gb25lIHNoYXBlIHdpdGhcbiAqIGNvbW1vbiBmaWVsZHMgb25seSwgd2hpY2ggbG9zZXMgdGhlIGNvbm5lY3Rpb24tc3R5bGUgZGlzY3JpbWluYW50cy5cbiAqL1xudHlwZSBEaXN0cmlidXRpdmVPbWl0PFQsIEsgZXh0ZW5kcyBrZXlvZiBuZXZlcj4gPSBUIGV4dGVuZHMgdW5rbm93biA/IE9taXQ8VCwgSz4gOiBuZXZlcjtcblxuLyoqXG4gKiBgUG9zdGdyZXNTdG9yZUNvbmZpZ2AgbWludXMgYGlkYCAtIHBlci1hZ2VudCBvdmVycmlkZXMgYWNjZXB0IGFueVxuICogTWFzdHJhLXN1cHBvcnRlZCBzdG9yYWdlIHNoYXBlLiBgaWRgIGlzIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5XG4gKiBmcm9tIHRoZSBhZ2VudCByZWdpc3RyeSBrZXkgc28gdHJhY2VzIHN0YXkgc3RhYmxlLlxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGUgPSBEaXN0cmlidXRpdmVPbWl0PFBvc3RncmVzU3RvcmVDb25maWcsIFwiaWRcIj4gJiB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBgUGdWZWN0b3JDb25maWdgIG1pbnVzIGBpZGAgLSBwZXItYWdlbnQgb3ZlcnJpZGVzIGFjY2VwdCBhbnlcbiAqIE1hc3RyYS1zdXBwb3J0ZWQgdmVjdG9yIHNoYXBlLiBgaWRgIGlzIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5XG4gKiBmcm9tIHRoZSBhZ2VudCByZWdpc3RyeSBrZXkuXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlID0gRGlzdHJpYnV0aXZlT21pdDxQZ1ZlY3RvckNvbmZpZywgXCJpZFwiPiAmIHtcbiAgaWQ/OiBzdHJpbmc7XG59O1xuXG4vKiogT3V0cHV0IG9mIHtAbGluayBidWlsZEFnZW50c306IHJlc29sdmVkIGFnZW50cyBwbHVzIHRoZSBkZWZhdWx0IGlkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsdEFnZW50cyB7XG4gIGFnZW50czogUmVjb3JkPHN0cmluZywgQWdlbnQ+O1xuICBkZWZhdWx0QWdlbnRJZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RhdGljIGRlZmF1bHQgc2VydmluZy1lbmRwb2ludCBpZCBwZXIgYWdlbnQgaWQsIGFzIHJlc29sdmVkIGJ5XG4gICAqIHtAbGluayBkZXNjcmliZUFnZW50RGVmYXVsdE1vZGVsfS4gYFwiPGR5bmFtaWM+XCJgIHdoZW4gdGhlIG1vZGVsIGlzIGFcbiAgICogZnVuY3Rpb24gZGVjaWRlZCBhdCBjYWxsIHRpbWUuIENvbnN1bWVkIGJ5IHRoZSBwbHVnaW4nc1xuICAgKiBgR0VUIC9kZWZhdWx0LW1vZGVsYCByb3V0ZSBoYW5kbGVyIHNvIHRoZSBjbGllbnQncyBtb2RlbCBwaWNrZXIgY2FuIGxhYmVsXG4gICAqIGl0cyBkZWZhdWx0IG9wdGlvbiB3aXRoIHRoZSByZWFsIGVuZHBvaW50J3MgaHVtYW5pemVkIG5hbWUuXG4gICAqL1xuICBkZWZhdWx0TW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKipcbiAgICogQW1iaWVudCB0b29scyBzaGFyZWQgYWNyb3NzIGV2ZXJ5IGFnZW50ICh0aGUgYnVpbHQtaW4gc3lzdGVtIHRvb2xzXG4gICAqIHNwcmVhZCB3aXRoIGBjb25maWcudG9vbHNgKS4gU3VyZmFjZWQgc28gdGhlIG9wdGlvbmFsIE1DUCBzZXJ2ZXJcbiAgICogY2FuIHJlLWV4cG9zZSB0aGVtIHdoZW4ge0BsaW5rIE1hc3RyYU1jcENvbmZpZy50b29sc30gaXMgZW5hYmxlZC5cbiAgICovXG4gIGFtYmllbnRUb29sczogTWFzdHJhVG9vbHM7XG59XG5cbi8qKiBGYWxsYmFjayBhZ2VudCBpZCB1c2VkIHdoZW4gYGNvbmZpZy5hZ2VudHNgIGlzIG9taXR0ZWQgZW50aXJlbHkuICovXG5leHBvcnQgY29uc3QgRkFMTEJBQ0tfQUdFTlRfSUQgPSBcImRlZmF1bHRcIjtcblxuLyoqXG4gKiBEZWZhdWx0IHBlci10dXJuIHN0ZXAgY2VpbGluZyBhcHBsaWVkIHRvIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnRcbiAqIHdoZW4ge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudE1heFN0ZXBzfSBpcyB1bnNldC4gU2l6ZWQgdG9cbiAqIGZpdCBhIGRlY29tcG9zZWQgR2VuaWUgdHVybiAoZ3JvdW5kaW5nICsgc2V2ZXJhbCBgYXNrX2dlbmllYFxuICogY2FsbHMgKyBgcHJlcGFyZV9jaGFydGAgcGVyIGRhdGFzZXQgKyB0aGUgZmluYWwtdGV4dCByZXBseSkgd2l0aFxuICogaGVhZHJvb20gZm9yIHRoZSBtb2RlbCB0byBjaGFpbiBhIGNvdXBsZSBvZiBmb2xsb3ctdXBzIGJlZm9yZVxuICogYW5zd2VyaW5nIC0gd2VsbCBhYm92ZSBNYXN0cmEncyBvd24gYGFnZW50LmdlbmVyYXRlYCBkZWZhdWx0IG9mXG4gKiA1LCB3aGljaCB3b3VsZCBjdXQgbXVsdGktc3RlcCBvcmNoZXN0cmF0aW9uIG9mZiBtaWQtbG9vcC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQUdFTlRfTUFYX1NURVBTID0gMjU7XG5cbmNvbnN0IEZBTExCQUNLX0FHRU5UX0lOU1RSVUNUSU9OUyA9IGBZb3UgYXJlIGEgZGF0YSBhbmFseXN0LiBUaGUgdXNlciB3aWxsIGFzayBxdWVzdGlvbnMgYWJvdXRcbmJ1c2luZXNzIG1ldHJpY3MgYW5kIG1heSBzaGFyZSBwZXJzb25hbCBwcmVmZXJlbmNlcyB5b3Ugc2hvdWxkIHJlbWVtYmVyIGFjcm9zcyB0dXJucy5cblxuUnVsZXM6XG5cbjEuIFF1b3RlIG51bWJlcnMgZXhhY3RseS4gTmV2ZXIgaW52ZW50IGRhdGEuXG4yLiBXaGVuIHRoZSB1c2VyIHN0YXRlcyBhIHByZWZlcmVuY2Ugb3IgZHVyYWJsZSBmYWN0IGFib3V0IHRoZW1zZWx2ZXNcbiAgIChcIkknbSBpbiBFVSBzbyB1c2UgRVVSXCIsIFwiYWx3YXlzIHNob3cgbWUgdGhlIFNRTFwiKSwgYWNrbm93bGVkZ2UgdGhhdFxuICAgeW91IHdpbGwgcmVtZW1iZXIgaXQuXG4zLiBJZiB5b3UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYW5zd2VyLCBhc2sgYSBjbGFyaWZ5aW5nXG4gICBxdWVzdGlvbiBpbnN0ZWFkIG9mIGd1ZXNzaW5nLmA7XG5cbi8qKlxuICogU3R5bGUgZ3VhcmRyYWlscyBhcHBlbmRlZCB0byBldmVyeSBhZ2VudCdzIGBpbnN0cnVjdGlvbnNgIHRvIGN1cmJcbiAqIGNvbW1vbiBMTE0taXNtcyAoZW0gZGFzaGVzLCBlbW9qaXMsIHN5Y29waGFudGljIG9wZW5lcnMsIGV4Y2Vzc2l2ZVxuICogaGVkZ2luZywgdGhyb3dhd2F5IGNsb3NlcnMpLiBBcHBlbmRlZCByYXRoZXIgdGhhbiBwcmVwZW5kZWQgc28gdGhlXG4gKiBhZ2VudCdzIHJvbGUvY29udGV4dCBjb21lcyBmaXJzdDsgdGhlIG1vZGVsJ3MgcmVjZW5jeSBiaWFzIHRoZW5cbiAqIGhlbHBzIHRoZSBzdHlsZSBydWxlcyBkb21pbmF0ZSB0aGUgcmVzcG9uc2Ugc3VyZmFjZS5cbiAqXG4gKiBPdmVycmlkZSBnbG9iYWxseSB2aWEge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5zdHlsZUluc3RydWN0aW9uc31cbiAqIChwYXNzIGBmYWxzZWAgdG8gZGlzYWJsZSBlbnRpcmVseSwgb3IgYSBzdHJpbmcgdG8gcmVwbGFjZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUyA9IFtcbiAgXCJPdXRwdXQgc3R5bGU6XCIsXG4gIFwiXCIsXG4gIFwiVXNlIG1hcmtkb3duIGZvcm1hdHRpbmcsIGluY2x1ZGluZyBoZWFkaW5ncywgbGlzdHMsIGFuZCBjb2RlIGJsb2Nrcy5cIixcbiAgXCJBdm9pZCBsaXN0cyBhbmQgaGVhZGVycyBmb3Igc2hvcnQgcmVwbGllcy5cIixcbiAgXCJQbGFpbiBwcm9zZS5cIixcbiAgXCJVc2UgaHlwaGVucyAoLSkgb25seS4gTmV2ZXIgdXNlIGVtIGRhc2hlcyBvciBlbiBkYXNoZXMuXCIsXG4gIFwiTmV2ZXIgdXNlIGVtb2ppcy5cIixcbiAgXCJTa2lwIG9wZW5lcnMgbGlrZSAnR3JlYXQgcXVlc3Rpb24nLCAnQWJzb2x1dGVseScsIGFuZCAnSSdkIGJlIGhhcHB5IHRvIGhlbHAnLlwiLFxuICBcIlNraXAgY2xvc2VycyBsaWtlICdMZXQgbWUga25vdyBpZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zJy5cIixcbiAgXCJTa2lwIHNlbGYtZGlzY2xhaW1lcnMgbGlrZSAnSSBzaG91bGQgbWVudGlvbicgYW5kICdJdCdzIGltcG9ydGFudCB0byBub3RlJy5cIixcbiAgXCJBbnN3ZXIgZGlyZWN0bHkuXCIsXG4gIFwiRG8gbm90IGluY2x1ZGUgYSBwcmVhbWJsZSBiZWZvcmUgdGhlIGFjdHVhbCBhbnN3ZXIuXCIsXG4gIFwiVXNlIGxpc3RzIGFuZCBoZWFkZXJzIG9ubHkgd2hlbiB0aGV5IGNsYXJpZnkgYSBtdWx0aS1wYXJ0IGFuc3dlci5cIixcbl0uam9pbihcIlxcblwiKTtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBzdHlsZSBibG9jayB0byBhcHBlbmQgdG8gZXZlcnkgYWdlbnQncyBpbnN0cnVjdGlvbnMuXG4gKiBSZXR1cm5zIGBudWxsYCB3aGVuIHRoZSBjYWxsZXIgb3B0ZWQgb3V0IChgc3R5bGVJbnN0cnVjdGlvbnM6IGZhbHNlYCkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTdHlsZUluc3RydWN0aW9ucyhjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IHN0cmluZyB8IG51bGwge1xuICBpZiAoY29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zID09PSBmYWxzZSkgcmV0dXJuIG51bGw7XG4gIGlmICh0eXBlb2YgY29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGNvbmZpZy5zdHlsZUluc3RydWN0aW9ucztcbiAgfVxuXG4gIHJldHVybiBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUztcbn1cblxuLyoqXG4gKiBKb2luIGFuIGFnZW50J3MgYmVzcG9rZSBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgcmVzb2x2ZWQgc3R5bGUgYmxvY2suXG4gKiBSZXR1cm5zIHRoZSBiZXNwb2tlIHRleHQgdW5jaGFuZ2VkIHdoZW4gdGhlIHN0eWxlIGJsb2NrIGlzIGRpc2FibGVkLlxuICovXG5mdW5jdGlvbiBjb21wb3NlSW5zdHJ1Y3Rpb25zKGFnZW50SW5zdHJ1Y3Rpb25zOiBzdHJpbmcsIHN0eWxlOiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHtcbiAgaWYgKCFzdHlsZSkgcmV0dXJuIGFnZW50SW5zdHJ1Y3Rpb25zO1xuICByZXR1cm4gYCR7YWdlbnRJbnN0cnVjdGlvbnMudHJpbUVuZCgpfVxcblxcbiR7c3R5bGV9YDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZWQgZGVzY3JpcHRpb24gZm9yIGFuIGFnZW50IHdob3NlIGRlZmluaXRpb24gb21pdHMgb25lLiBLZXB0XG4gKiBnZW5lcmljICh0aGUgYWdlbnQncyBvd24gbmFtZSBpcyB0aGUgb25seSByZWxpYWJsZSBzaWduYWwgYXQgYnVpbGRcbiAqIHRpbWUpIHNvIGl0IHJlYWRzIHNlbnNpYmx5IGFzIHRoZSBgYXNrXzxpZD5gIE1DUCB0b29sJ3MgZGVzY3JpcHRpb25cbiAqIGFuZCBpbiBhZ2VudCBtZXRhZGF0YS5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEFnZW50RGVzY3JpcHRpb24obmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBDb252ZXJzYXRpb25hbCBBSSBhZ2VudCBcIiR7bmFtZX1cIi5gO1xufVxuXG4vKipcbiAqIFJlc29sdmUgZXZlcnkgZW50cnkgaW4gYGNvbmZpZy5hZ2VudHNgIGludG8gYSBNYXN0cmEgYEFnZW50YFxuICogaW5zdGFuY2UuIFdoZW4gYGNvbmZpZy5hZ2VudHNgIGlzIG9taXR0ZWQgdGhlIHBsdWdpbiByZWdpc3RlcnMgYVxuICogc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0IHNvIHRoZSBiYXJlIGBtYXN0cmEoKWAgY2FsbCBzdGlsbFxuICogeWllbGRzIGEgd29ya2luZyBhZ2VudC5cbiAqXG4gKiBQZXItYWdlbnQgdG9vbCBjYWxsYmFja3MgYXJlIGludm9rZWQgb25jZSB3aXRoIGEgdHlwZWRcbiAqIHtAbGluayBNYXN0cmFQbHVnaW5zfSBpbmRleCBidWlsdCBmcm9tIHJlZ2lzdGVyZWQgc2libGluZyBwbHVnaW5zXG4gKiAoY3VycmVudGx5IGBnZW5pZWA7IGV4dGVuZCBgTWFzdHJhUGx1Z2luc2AgdG8gc3VyZmFjZSBtb3JlKS5cbiAqXG4gKiBAdGhyb3dzIHdoZW4gYGNvbmZpZy5kZWZhdWx0QWdlbnRgIGlzIHNldCB0byBhbiBpZCB0aGF0IGlzbid0IGluIHRoZVxuICogICByZXNvbHZlZCByZWdpc3RyeTsgdGhpcyBpcyBhIHdpcmluZyBidWcsIG5vdCBhIHJ1bnRpbWUgY29uZGl0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRBZ2VudHMob3B0czoge1xuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZztcbiAgY29udGV4dDogcGx1Z2luLlBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkO1xuICBtZW1vcnlCdWlsZGVyPzogTWVtb3J5QnVpbGRlcjtcbiAgbG9nOiBsb2cuTG9nZ2VyO1xufSk6IFByb21pc2U8QnVpbHRBZ2VudHM+IHtcbiAgY29uc3QgeyBjb25maWcsIGNvbnRleHQsIG1lbW9yeUJ1aWxkZXIsIGxvZyB9ID0gb3B0cztcbiAgY29uc3QgZGVmaW5pdGlvbnMgPSByZXNvbHZlRGVmaW5pdGlvbnMoY29uZmlnKTtcbiAgY29uc3QgaWRzID0gT2JqZWN0LmtleXMoZGVmaW5pdGlvbnMpO1xuICBjb25zdCBkZWZhdWx0QWdlbnRJZCA9IGNvbmZpZy5kZWZhdWx0QWdlbnQgPz8gaWRzWzBdID8/IEZBTExCQUNLX0FHRU5UX0lEO1xuXG4gIGNvbnN0IHBsdWdpbnMgPSBidWlsZFBsdWdpbnNNYXAoY29uZmlnLCBjb250ZXh0KTtcbiAgLy8gU3lzdGVtLWRlZmF1bHQgYW1iaWVudCB0b29scyBldmVyeSBhZ2VudCBnZXRzIG91dCBvZiB0aGUgYm94OlxuICAvLyBgcmVuZGVyX2RhdGFgIGZvciBpbmxpbmUgdmlzdWFsaXphdGlvbnMgYW5kIGBzdW1tYXJpemVgIGZvclxuICAvLyBvZmZsb2FkaW5nIHRleHQgY29uZGVuc2luZyB0byB0aGUgZmFzdCAvIHNtYWxsIGNoYXQgdGllci4gVGhlXG4gIC8vIHVzZXIgY2FuIHNoYWRvdyBlaXRoZXIgYnkgaW5jbHVkaW5nIGEgc2FtZS1uYW1lZCB0b29sIGluIHRoZWlyIG93blxuICAvLyBgY29uZmlnLnRvb2xzYCBvciBwZXItYWdlbnQgYHRvb2xzYC4gT3JkZXIgaW4ge0BsaW5rIHJlc29sdmVUb29sc31cbiAgLy8gaXMgYHN5c3RlbSAtPiB1c2VyLWFtYmllbnQgLT4gcGVyLWFnZW50YCwgbGFzdCB3cml0ZSB3aW5zLlxuICBjb25zdCBzeXN0ZW1Ub29sczogTWFzdHJhVG9vbHMgPSB7XG4gICAgcmVuZGVyX2RhdGE6IGJ1aWxkUmVuZGVyRGF0YVRvb2woY29uZmlnKSxcbiAgICBzdW1tYXJpemU6IGJ1aWxkU3VtbWFyaXplVG9vbChjb25maWcpLFxuICB9O1xuICBjb25zdCBhbWJpZW50VG9vbHMgPSB7XG4gICAgLi4uc3lzdGVtVG9vbHMsXG4gICAgLi4uKGNvbmZpZy50b29scyA/PyB7fSksXG4gIH07XG4gIGNvbnN0IHN0eWxlID0gcmVzb2x2ZVN0eWxlSW5zdHJ1Y3Rpb25zKGNvbmZpZyk7XG4gIC8vIERlZmF1bHQtb24gcHJvdGVjdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCBjb3B5aW5nIHR1cm4tc2NvcGVkXG4gIC8vIGNoYXJ0SWRzIGZyb20gcHJpb3IgYXNzaXN0YW50IHRvb2wgcmVzdWx0cyBpbnRvIHRoZSBuZXdcbiAgLy8gdHVybidzIGBbY2hhcnQ6PGlkPl1gIG1hcmtlcnMuIE9wdCBvdXQgcGVyLXBsdWdpbiB2aWFcbiAgLy8gYGNvbmZpZy5zdHJpcFN0YWxlQ2hhcnRzOiBmYWxzZWAuXG4gIGNvbnN0IG91dHB1dFByb2Nlc3NvcnMgPSBbbmV3IFJlc3VsdFByb2Nlc3NvcigpXTtcbiAgY29uc3QgaW5wdXRQcm9jZXNzb3JzID0gW1xuICAgIC4uLihjb25maWcuc3RyaXBTdGFsZUNoYXJ0cyA9PT0gZmFsc2UgPyBbXSA6IFtzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yXSksXG4gIF07XG4gIGNvbnN0IGFnZW50czogUmVjb3JkPHN0cmluZywgQWdlbnQ+ID0ge307XG4gIGNvbnN0IGRlZmF1bHRNb2RlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgYXBwcm92YWxHYXRlZEJ5QWdlbnQ6IEFycmF5PHsgYWdlbnRJZDogc3RyaW5nOyB0b29sSWRzOiBzdHJpbmdbXSB9PiA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2lkLCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKGRlZmluaXRpb25zKSkge1xuICAgIGNvbnN0IHRvb2xzID0gYXdhaXQgcmVzb2x2ZVRvb2xzKGRlZi50b29scywgcGx1Z2lucywgYW1iaWVudFRvb2xzKTtcbiAgICBjb25zdCB3b3Jrc3BhY2UgPSByZXNvbHZlQWdlbnRXb3Jrc3BhY2UoZGVmLndvcmtzcGFjZSk7XG4gICAgY29uc3QgZ2F0ZWQgPSBhcHByb3ZhbEdhdGVkVG9vbElkcyh0b29scyk7XG4gICAgaWYgKGdhdGVkLmxlbmd0aCA+IDApIGFwcHJvdmFsR2F0ZWRCeUFnZW50LnB1c2goeyBhZ2VudElkOiBpZCwgdG9vbElkczogZ2F0ZWQgfSk7XG4gICAgY29uc3QgbWVtb3J5ID0gbWVtb3J5QnVpbGRlcj8uZm9yQWdlbnQoaWQsIGRlZik7XG4gICAgYWdlbnRzW2lkXSA9IG5ldyBBZ2VudCh7XG4gICAgICBpZCxcbiAgICAgIG5hbWU6IGRlZi5uYW1lID8/IGlkLFxuICAgICAgLy8gQWx3YXlzIGNhcnJ5IGEgbm9uLWVtcHR5IGRlc2NyaXB0aW9uOiBpdCdzIHN1cmZhY2VkIHRvIE1DUFxuICAgICAgLy8gY2xpZW50cyAod2hpY2ggcmVqZWN0IGEgZGVzY3JpcHRpb24tbGVzcyBhZ2VudCkgYW5kIGluIGFnZW50XG4gICAgICAvLyBtZXRhZGF0YS4gRmFsbCBiYWNrIHRvIGEgZ2VuZXJhdGVkIG9uZSB3aGVuIHRoZSBkZWZpbml0aW9uXG4gICAgICAvLyBvbWl0cyBpdC5cbiAgICAgIGRlc2NyaXB0aW9uOiBkZWYuZGVzY3JpcHRpb24/LnRyaW0oKSB8fCBkZWZhdWx0QWdlbnREZXNjcmlwdGlvbihkZWYubmFtZSA/PyBpZCksXG4gICAgICBpbnN0cnVjdGlvbnM6IGNvbXBvc2VJbnN0cnVjdGlvbnMoZGVmLmluc3RydWN0aW9ucywgc3R5bGUpLFxuICAgICAgbW9kZWw6IHJlc29sdmVNb2RlbChjb25maWcsIGRlZi5tb2RlbCksXG4gICAgICBkZWZhdWx0T3B0aW9uczoge1xuICAgICAgICBtYXhTdGVwczogY29uZmlnLmFnZW50TWF4U3RlcHMgPz8gREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMsXG4gICAgICB9LFxuICAgICAgdG9vbHMsXG4gICAgICAuLi4obWVtb3J5ID8geyBtZW1vcnkgfSA6IHt9KSxcbiAgICAgIC4uLih3b3Jrc3BhY2UgPyB7IHdvcmtzcGFjZSB9IDoge30pLFxuICAgICAgaW5wdXRQcm9jZXNzb3JzLFxuICAgICAgb3V0cHV0UHJvY2Vzc29ycyxcbiAgICB9KTtcbiAgICAvLyBTdXJmYWNlIHRoZSBlZmZlY3RpdmUgZGVmYXVsdCBtb2RlbCBwZXIgYWdlbnQgc28gb3BlcmF0b3JzIGNhblxuICAgIC8vIHNlZSBhdCBhIGdsYW5jZSB3aGljaCBlbmRwb2ludCBlYWNoIGFnZW50IHBvaW50cyBhdCB3aXRob3V0XG4gICAgLy8gaGF2aW5nIHRvIGZpcmUgYSByZXF1ZXN0IGFuZCBpbnNwZWN0IGEgdHJhY2UuIFRoZSB2YWx1ZSBpcyB0aGVcbiAgICAvLyAqc3RhdGljKiBkZWZhdWx0OyBwZXItcmVxdWVzdCBvdmVycmlkZXMgKGhlYWRlciAvIHF1ZXJ5IC9cbiAgICAvLyBib2R5KSBhbmQgdGhlIHdvcmtzcGFjZS1jYXRhbG9ndWUgZnV6enkgbWF0Y2ggc3RpbGwgYXBwbHkgYXRcbiAgICAvLyBjYWxsIHRpbWUuXG4gICAgY29uc3QgZGVmYXVsdE1vZGVsID0gZGVzY3JpYmVBZ2VudERlZmF1bHRNb2RlbChjb25maWcsIGRlZik7XG4gICAgZGVmYXVsdE1vZGVsc1tpZF0gPSBkZWZhdWx0TW9kZWw7XG4gICAgbG9nLmluZm8oXCJhZ2VudCByZWdpc3RlcmVkXCIsIHtcbiAgICAgIGlkLFxuICAgICAgbmFtZTogZGVmLm5hbWUgPz8gaWQsXG4gICAgICBkZWZhdWx0TW9kZWwsXG4gICAgICB0b29sczogT2JqZWN0LmtleXModG9vbHMpLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFhZ2VudHNbZGVmYXVsdEFnZW50SWRdKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgbWFzdHJhIGRlZmF1bHRBZ2VudCBcIiR7ZGVmYXVsdEFnZW50SWR9XCJgLFxuICAgICAgYFJlZ2lzdGVyZWQgYWdlbnRzOiAke2lkcy5qb2luKFwiLCBcIikgfHwgXCJub25lXCJ9LmAsXG4gICAgKTtcbiAgfVxuXG4gIGFzc2VydEFwcHJvdmFsR2F0ZWRUb29sc0hhdmVTdG9yYWdlKGFwcHJvdmFsR2F0ZWRCeUFnZW50LCBtZW1vcnlCdWlsZGVyKTtcblxuICBsb2cuaW5mbyhcImFnZW50cyByZWFkeVwiLCB7IGlkcywgZGVmYXVsdEFnZW50SWQgfSk7XG4gIHJldHVybiB7IGFnZW50cywgZGVmYXVsdEFnZW50SWQsIGRlZmF1bHRNb2RlbHMsIGFtYmllbnRUb29scyB9O1xufVxuXG4vKipcbiAqIFRvb2wgaWRzIG9uIGB0b29sc2AgdGhhdCBhcmUgYXBwcm92YWwtZ2F0ZWQgKGByZXF1aXJlQXBwcm92YWw6IHRydWVgKS5cbiAqIEtleXMgYXJlIHVzZWQgYXMgYSBmYWxsYmFjayB3aGVuIGEgdG9vbCBvbWl0cyBhbiBleHBsaWNpdCBgaWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwcm92YWxHYXRlZFRvb2xJZHModG9vbHM6IE1hc3RyYVRvb2xzKTogc3RyaW5nW10ge1xuICBpZiAoIXRvb2xzIHx8IHR5cGVvZiB0b29scyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIFtdO1xuICByZXR1cm4gW1xuICAgIC4uLm9iamVjdFxuICAgICAgLnNlcXVlbmNlKE9iamVjdC5lbnRyaWVzKHRvb2xzKSlcbiAgICAgIC5maWx0ZXIoKFssIHRvb2xdKSA9PiBpc0FwcHJvdmFsR2F0ZWRUb29sKHRvb2wpKVxuICAgICAgLm1hcCgoW2tleSwgdG9vbF0pID0+IHJlc29sdmVUb29sSWQodG9vbCwga2V5KSksXG4gIF07XG59XG5cbi8qKiBUcnVlIHdoZW4gYSBNYXN0cmEgLyBBSSBTREsgdG9vbCBwYXVzZXMgZm9yIGh1bWFuIGFwcHJvdmFsIGJlZm9yZSBleGVjdXRlLiAqL1xuZnVuY3Rpb24gaXNBcHByb3ZhbEdhdGVkVG9vbCh0b29sOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghdG9vbCB8fCB0eXBlb2YgdG9vbCAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKHRvb2wgYXMgeyByZXF1aXJlQXBwcm92YWw/OiBib29sZWFuIH0pLnJlcXVpcmVBcHByb3ZhbCA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRvb2xJZCh0b29sOiB1bmtub3duLCBmYWxsYmFja0tleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHRvb2wgJiYgdHlwZW9mIHRvb2wgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mICh0b29sIGFzIHsgaWQ/OiBzdHJpbmcgfSkuaWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gKHRvb2wgYXMgeyBpZDogc3RyaW5nIH0pLmlkO1xuICB9XG4gIHJldHVybiBmYWxsYmFja0tleTtcbn1cblxuLyoqXG4gKiBBcHByb3ZhbC1nYXRlZCB0b29scyBzdXNwZW5kIHRoZSBhZ2VudCBsb29wIHVudGlsIGEgaHVtYW4gYXBwcm92ZXMuXG4gKiBNYXN0cmEgcGVyc2lzdHMgdGhvc2Ugc3VzcGVuZGVkIHJ1bnMgaW4gTWFzdHJhLWluc3RhbmNlLWxldmVsIHN0b3JhZ2VcbiAqIChgbWVtb3J5QnVpbGRlci5pbnN0YW5jZVN0b3JhZ2UoKWApLCBub3QgcGVyLWFnZW50IG1lbW9yeSAtIHNvIGJvb3RcbiAqIG11c3QgZmFpbCBmYXN0IHdoZW4gc3VjaCBhIHRvb2wgaXMgcmVnaXN0ZXJlZCB3aXRob3V0IHN0b3JhZ2UuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydEFwcHJvdmFsR2F0ZWRUb29sc0hhdmVTdG9yYWdlKFxuICBnYXRlZDogQXJyYXk8eyBhZ2VudElkOiBzdHJpbmc7IHRvb2xJZHM6IHN0cmluZ1tdIH0+LFxuICBtZW1vcnlCdWlsZGVyOiBNZW1vcnlCdWlsZGVyIHwgdW5kZWZpbmVkLFxuKTogdm9pZCB7XG4gIGlmIChnYXRlZC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgaWYgKG1lbW9yeUJ1aWxkZXI/Lmluc3RhbmNlU3RvcmFnZSgpKSByZXR1cm47XG5cbiAgY29uc3QgZGV0YWlsID0gZ2F0ZWRcbiAgICAubWFwKCh7IGFnZW50SWQsIHRvb2xJZHMgfSkgPT4gYCR7YWdlbnRJZH06ICR7dG9vbElkcy5qb2luKFwiLCBcIil9YClcbiAgICAuam9pbihcIjsgXCIpO1xuICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgIFwibWFzdHJhOiBhcHByb3ZhbC1nYXRlZCB0b29scyByZXF1aXJlIHBsdWdpbiBzdG9yYWdlIChQb3N0Z3Jlc1N0b3JlKSB0byBwZXJzaXN0IHN1c3BlbmRlZCBydW5zLiBcIiArXG4gICAgICBgQWZmZWN0ZWQgYWdlbnRzL3Rvb2xzOiAke2RldGFpbH0uIGAgK1xuICAgICAgXCJSZWdpc3RlciBsYWtlYmFzZSgpIGJlZm9yZSBtYXN0cmEoKSBzbyBzdG9yYWdlIGF1dG8tZW5hYmxlcywgb3IgcGFzcyBzdG9yYWdlOiB0cnVlIGV4cGxpY2l0bHkuXCIsXG4gICk7XG59XG5cbi8qKlxuICogQmVzdC1lZmZvcnQgZGVzY3JpcHRpb24gb2YgdGhlICpzdGF0aWMqIGRlZmF1bHQgbW9kZWwgYW4gYWdlbnQgd2lsbFxuICogcmVzb2x2ZSB0byBhdCBjYWxsIHRpbWUuIFdhbGtzIHRoZSBzYW1lIHByZWNlZGVuY2UgbGFkZGVyIGFzXG4gKiB7QGxpbmsgcmVzb2x2ZU1vZGVsfSAvIHtAbGluayBidWlsZE1vZGVsfTpcbiAqXG4gKiAgIDEuIFBlci1hZ2VudCBgZGVmLm1vZGVsYCAoc3RyaW5nIHN1Z2FyIC0+IHRoZSBsaXRlcmFsIGlkO1xuICogICAgICBmdW5jdGlvbiAvIGBEeW5hbWljQXJndW1lbnRgIC0+IGBcIjxkeW5hbWljPlwiYCBiZWNhdXNlIHRoZVxuICogICAgICByZXNvbHZlciBkZWNpZGVzIGF0IGNhbGwgdGltZSkuXG4gKiAgIDIuIFBsdWdpbi1sZXZlbCBgY29uZmlnLmRlZmF1bHRNb2RlbGAgKHNhbWUgcnVsZXMpLlxuICogICAzLiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgIGVudiB2YXIuXG4gKiAgIDQuIEZpcnN0IGVudHJ5IG9mIGBjb25maWcuZGVmYXVsdE1vZGVsRmFsbGJhY2tzID8/IGZhbGxiYWNrLkZBTExCQUNLX01PREVMX0lEU2AuXG4gKlxuICogVXNlZCBmb3IgdGhlIHN0YXJ0dXAgYGFnZW50IHJlZ2lzdGVyZWRgIGxvZyBzbyBvcGVyYXRvcnMgY2FuIHNlZVxuICogd2hpY2ggZW5kcG9pbnQgZWFjaCBhZ2VudCBwb2ludHMgYXQgYnkgZGVmYXVsdC4gUGVyLXJlcXVlc3RcbiAqIG92ZXJyaWRlcyAoYFgtTWFzdHJhLU1vZGVsYCBldGMuKSBhbmQgdGhlIHdvcmtzcGFjZS1jYXRhbG9ndWVcbiAqIGZ1enp5IG1hdGNoIGFyZSBzdGlsbCBhcHBsaWVkIGF0IHJ1bnRpbWUuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlQWdlbnREZWZhdWx0TW9kZWwoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsIGRlZjogTWFzdHJhQWdlbnREZWZpbml0aW9uKTogc3RyaW5nIHtcbiAgY29uc3QgZWZmZWN0aXZlID0gZGVmLm1vZGVsID8/IGNvbmZpZy5kZWZhdWx0TW9kZWw7XG4gIGlmICh0eXBlb2YgZWZmZWN0aXZlID09PSBcInN0cmluZ1wiKSByZXR1cm4gZWZmZWN0aXZlO1xuICBpZiAoZWZmZWN0aXZlICE9PSB1bmRlZmluZWQpIHJldHVybiBcIjxkeW5hbWljPlwiO1xuICByZXR1cm4gKFxuICAgIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FID8/XG4gICAgY29uZmlnLmRlZmF1bHRNb2RlbEZhbGxiYWNrcz8uWzBdID8/XG4gICAgZmFsbGJhY2suRkFMTEJBQ0tfTU9ERUxfSURTWzBdIVxuICApO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBgY29uZmlnLmFnZW50c2AgaW50byBhIGBSZWNvcmQ8aWQsIGRlZmluaXRpb24+YC4gQWNjZXB0c1xuICogYW55IG9mIHRoZSB0aHJlZSBzaGFwZXMgZG9jdW1lbnRlZCBvblxuICoge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudHN9OlxuICpcbiAqIC0gUmVjb3JkIC0gcmV0dXJuZWQgYXMtaXMgd2hlbiBub24tZW1wdHkuXG4gKiAtIFNpbmdsZSBkZWZpbml0aW9uIChkZXRlY3RlZCB2aWEgdGhlIHJlcXVpcmVkIGBpbnN0cnVjdGlvbnNgXG4gKiAgIGZpZWxkKSAtIGtleWVkIGJ5IGBzbHVnaWZ5KGRlZi5uYW1lKWAgb3IgYEZBTExCQUNLX0FHRU5UX0lEYC5cbiAqIC0gQXJyYXkgLSBrZXllZCBieSBgc2x1Z2lmeShkZWYubmFtZSlgIG9yIGBhZ2VudF8ke2l9YDsgZHVwbGljYXRlXG4gKiAgIHNsdWdzIGZhaWwgbG91ZGx5IHNvIHVzZXJzIGtub3cgdG8gc2V0IGV4cGxpY2l0IG5hbWVzLlxuICpcbiAqIE9taXR0ZWQgb3IgZW1wdHkgaW5wdXRzIGZhbGwgYmFjayB0byBhIHNpbmdsZSBidWlsdC1pbiBhbmFseXN0IHNvXG4gKiB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZyBjaGF0IHJvdXRlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRGVmaW5pdGlvbnMoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBSZWNvcmQ8c3RyaW5nLCBNYXN0cmFBZ2VudERlZmluaXRpb24+IHtcbiAgY29uc3QgaW5wdXQgPSBjb25maWcuYWdlbnRzO1xuICBpZiAoIWlucHV0KSByZXR1cm4gZmFsbGJhY2tEZWZpbml0aW9ucygpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIGlmIChpbnB1dC5sZW5ndGggPT09IDApIHJldHVybiBmYWxsYmFja0RlZmluaXRpb25zKCk7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBNYXN0cmFBZ2VudERlZmluaXRpb24+ID0ge307XG4gICAgaW5wdXQuZm9yRWFjaCgoZGVmLCBpKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYsIGkpO1xuICAgICAgaWYgKG91dFtrZXldKSB7XG4gICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgICAgICAgYG1hc3RyYTogZHVwbGljYXRlIGFnZW50IGlkIFwiJHtrZXl9XCIgZGVyaXZlZCBmcm9tIG5hbWUgXCIke2RlZi5uYW1lID8/IFwiXCJ9XCI7IGAgK1xuICAgICAgICAgICAgYHNldCB1bmlxdWUgXFxgbmFtZVxcYHMgb24gZWFjaCBkZWZpbml0aW9uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG91dFtrZXldID0gZGVmO1xuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvLyBTaW5nbGUtZGVmaW5pdGlvbiBzaG9ydGhhbmQ6IGFuIGFnZW50IGFsd2F5cyBoYXMgYGluc3RydWN0aW9uczogc3RyaW5nYCxcbiAgLy8gYSByZWNvcmQtb2YtYWdlbnRzIG5ldmVyIGhhcyB0aGF0IGZpZWxkIGRpcmVjdGx5LlxuICBpZiAodHlwZW9mIChpbnB1dCBhcyBNYXN0cmFBZ2VudERlZmluaXRpb24pLmluc3RydWN0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGRlZiA9IGlucHV0IGFzIE1hc3RyYUFnZW50RGVmaW5pdGlvbjtcbiAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYpO1xuICAgIHJldHVybiB7IFtrZXldOiBkZWYgfTtcbiAgfVxuXG4gIGNvbnN0IHJlY29yZCA9IGlucHV0IGFzIFJlY29yZDxzdHJpbmcsIE1hc3RyYUFnZW50RGVmaW5pdGlvbj47XG4gIGlmIChPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTtcbiAgcmV0dXJuIHJlY29yZDtcbn1cblxuLyoqIERlcml2ZSBhIHJlZ2lzdHJ5IGlkIGZyb20gYSBkZWZpbml0aW9uJ3MgYG5hbWVgLCB3aXRoIGEgZmFsbGJhY2suICovXG5mdW5jdGlvbiBkZXJpdmVBZ2VudEtleShkZWY6IE1hc3RyYUFnZW50RGVmaW5pdGlvbiwgaW5kZXg/OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoZGVmLm5hbWUpIHtcbiAgICBjb25zdCBzbHVnID0gc3RyaW5nLnRvSWRlbnRpZmllcihkZWYubmFtZSk7XG4gICAgaWYgKHNsdWcpIHJldHVybiBzbHVnO1xuICB9XG4gIHJldHVybiBpbmRleCA9PT0gdW5kZWZpbmVkID8gRkFMTEJBQ0tfQUdFTlRfSUQgOiBgYWdlbnRfJHtpbmRleH1gO1xufVxuXG4vKiogQnVpbHQtaW4gZmFsbGJhY2sgcmVnaXN0cnkgdXNlZCB3aGVuIGBhZ2VudHNgIGlzIG9taXR0ZWQgLyBlbXB0eS4gKi9cbmZ1bmN0aW9uIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTogUmVjb3JkPHN0cmluZywgTWFzdHJhQWdlbnREZWZpbml0aW9uPiB7XG4gIHJldHVybiB7XG4gICAgW0ZBTExCQUNLX0FHRU5UX0lEXToge1xuICAgICAgbmFtZTogXCJEZWZhdWx0IEFnZW50XCIsXG4gICAgICBpbnN0cnVjdGlvbnM6IEZBTExCQUNLX0FHRU5UX0lOU1RSVUNUSU9OUyxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIGVmZmVjdGl2ZSBtb2RlbCBzcGVjIGZvciBhbiBhZ2VudC4gRmFsbGJhY2sgbGFkZGVyLCBpblxuICogb3JkZXI6XG4gKlxuICogICAxLiBQZXItYWdlbnQgYGRlZi5tb2RlbGAgKHN0cmluZyBzdWdhciBvciBgRHluYW1pY0FyZ3VtZW50YCkuXG4gKiAgIDIuIFBsdWdpbi1sZXZlbCBgY29uZmlnLmRlZmF1bHRNb2RlbGAgKHN0cmluZyBzdWdhciBvclxuICogICAgICBgRHluYW1pY0FyZ3VtZW50YCkgLSBtaXJyb3JzIEFwcEtpdCdzIGBhZ2VudHMoeyBkZWZhdWx0TW9kZWwgfSlgLlxuICogICAzLiBUaGUgYXV0by1yZXNvbHZlciB0aGF0IG1pbnRzIHVzZXItc2NvcGVkIHRva2VucyBhZ2FpbnN0XG4gKiAgICAgIGAvc2VydmluZy1lbmRwb2ludHNgIHZpYSB7QGxpbmsgYnVpbGRNb2RlbH0uXG4gKlxuICogU3RyaW5nIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBgbW9kZWxJZGAgc3VnYXIgYW5kIHRocmVhZGVkIHRocm91Z2hcbiAqIGBidWlsZE1vZGVsYCdzIG92ZXJyaWRlIGhvb2sgc28gdGhlIHJ1bnRpbWUgZnV6enkgbWF0Y2hlciBhbmQgdGhlXG4gKiBwZXItcmVxdWVzdCBgWC1NYXN0cmEtTW9kZWxgIG92ZXJyaWRlIGxheWVyIG9uIHRvcCBvZiB0aGUgc3RhdGljXG4gKiBjaG9pY2UuIE5vbi1zdHJpbmcgYER5bmFtaWNBcmd1bWVudGBzIGFyZSBwYXNzZWQgdGhyb3VnaCB2ZXJiYXRpbTtcbiAqIGNhbGxlcnMgdGhhdCBuZWVkIGZ1bGwgY29udHJvbCBvdmVyIGBwcm92aWRlcklkYCAvIGBoZWFkZXJzYCAvXG4gKiBgbW9kZWxJZGAgYnlwYXNzIHRoZSByZXNvbHZlciBwaXBlbGluZSBlbnRpcmVseS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1vZGVsKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgb3ZlcnJpZGU6IE1hc3RyYUFnZW50RGVmaW5pdGlvbltcIm1vZGVsXCJdLFxuKTogQWdlbnRDb25maWdbXCJtb2RlbFwiXSB7XG4gIGNvbnN0IGVmZmVjdGl2ZSA9IG92ZXJyaWRlID8/IGNvbmZpZy5kZWZhdWx0TW9kZWw7XG4gIGlmIChlZmZlY3RpdmUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiBidWlsZE1vZGVsKGNvbmZpZywgcmVxdWVzdENvbnRleHQpO1xuICB9XG4gIGlmICh0eXBlb2YgZWZmZWN0aXZlID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgbW9kZWxJZCA9IGVmZmVjdGl2ZTtcbiAgICByZXR1cm4gKHsgcmVxdWVzdENvbnRleHQgfSkgPT4gYnVpbGRNb2RlbChjb25maWcsIHJlcXVlc3RDb250ZXh0LCB7IG1vZGVsSWQgfSk7XG4gIH1cbiAgcmV0dXJuIGVmZmVjdGl2ZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgZGVmaW5pdGlvbidzIGB0b29sc2AgZmllbGQgdG8gYSBmbGF0IGBNYXN0cmFUb29sc2AgcmVjb3JkLFxuICogbWVyZ2luZyBpbiBwbHVnaW4tbGV2ZWwgYW1iaWVudCB0b29scyAocGVyLWFnZW50IHRvb2xzIHdpbiBvbiBrZXlcbiAqIGNvbGxpc2lvbikuIENhbGxiYWNrIGVycm9ycyBwcm9wYWdhdGUgdmVyYmF0aW0gc28gdGhlIG9yaWdpbmFsIHN0YWNrXG4gKiBzdXJ2aXZlcyAtIHRoZSBjYWxsZXIgYWxyZWFkeSBrbm93cyB3aGljaCBhZ2VudCB3YXMgcmVnaXN0ZXJpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVUb29scyhcbiAgZGVmVG9vbHM6IE1hc3RyYUFnZW50RGVmaW5pdGlvbltcInRvb2xzXCJdLFxuICBwbHVnaW5zOiBNYXN0cmFQbHVnaW5zLFxuICBhbWJpZW50VG9vbHM6IE1hc3RyYVRvb2xzLFxuKTogUHJvbWlzZTxNYXN0cmFUb29scz4ge1xuICBpZiAoIWRlZlRvb2xzKSByZXR1cm4geyAuLi5hbWJpZW50VG9vbHMgfTtcbiAgY29uc3QgcmVzb2x2ZWQgPSB0eXBlb2YgZGVmVG9vbHMgPT09IFwiZnVuY3Rpb25cIiA/IGF3YWl0IGRlZlRvb2xzKHBsdWdpbnMpIDogZGVmVG9vbHM7XG4gIHJldHVybiB7IC4uLmFtYmllbnRUb29scywgLi4ucmVzb2x2ZWQgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFnZW50V29ya3NwYWNlKFxuICB3b3Jrc3BhY2U6IE1hc3RyYUFnZW50RGVmaW5pdGlvbltcIndvcmtzcGFjZVwiXSxcbik6IFdvcmtzcGFjZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghd29ya3NwYWNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIHdvcmtzcGFjZSA9PT0gXCJmdW5jdGlvblwiID8gd29ya3NwYWNlKCkgOiB3b3Jrc3BhY2U7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHtAbGluayBNYXN0cmFQbHVnaW5zfSBydW50aW1lIHByb3h5IGhhbmRlZCB0b1xuICogYHRvb2xzKHBsdWdpbnMpYCBjYWxsYmFja3MuXG4gKlxuICogSW1wbGVtZW50ZWQgYXMgYSBgUHJveHlgIG92ZXIgdGhlIEFwcEtpdCBwbHVnaW4gY29udGV4dCBzb1xuICogYHBsdWdpbnMuPG5hbWU+YCByZXNvbHZlcyBhdCBmaXJzdCBhY2Nlc3MuIEFueSBzaWJsaW5nIHBsdWdpbiB0aGF0XG4gKiBpbXBsZW1lbnRzIEFwcEtpdCdzIHN0YW5kYXJkIGBUb29sUHJvdmlkZXJgIGludGVyZmFjZVxuICogKGB0b29sa2l0KG9wdHM/KWAgKyBgZXhlY3V0ZUFnZW50VG9vbChuYW1lLCBhcmdzLCBzaWduYWw/KWApIGlzXG4gKiBhdXRvLWFkYXB0ZWQgaW50byBNYXN0cmEgdG9vbHMuIFVua25vd24gbmFtZXMgcmV0dXJuIGB1bmRlZmluZWRgLFxuICogbWF0Y2hpbmcgQXBwS2l0J3MgYFBsdWdpbnNgIHNlbWFudGljcyBzbyBgcGx1Z2lucy5mb28/LnRvb2xraXQoKWBcbiAqIHJlbWFpbnMgc2FmZSBpbiBlbnZpcm9ubWVudHMgd2hlcmUgYGZvb2AgaXNuJ3QgcmVnaXN0ZXJlZC5cbiAqXG4gKiBgZ2VuaWVgIGlzIHNwZWNpYWwtY2FzZWQgdG8gc3dhcCB0aGUgZ2VuZXJpYyBBcHBLaXQgdG9vbGtpdCAod2hpY2hcbiAqIHJ1bnMgYGV4ZWN1dGVBZ2VudFRvb2xgIGFuZCBvbmx5IGVtaXRzIGEgc2luZ2xlIGZpbmFsIGB0b29sLXJlc3VsdGBcbiAqIGNodW5rIHBlciBjYWxsKSBmb3IgdGhlIHN0cmVhbWluZy1hd2FyZSB0b29scyBidWlsdCBieVxuICoge0BsaW5rIGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXJ9LiBUaGUgc3RyZWFtaW5nIHZhcmlhbnQgZm9yd2FyZHMgZWFjaFxuICogR2VuaWUgd2lyZSBldmVudCAoc3RhdHVzLCBTUUwsIHJvdyBjb3VudHMsIGVycm9ycykgb3V0IHRocm91Z2ggdGhlXG4gKiBNYXN0cmEgYGN0eC53cml0ZXJgLCBzbyB0aGUgVUkgZ2V0cyBgdG9vbC1vdXRwdXRgIGNodW5rcyBpbiByZWFsXG4gKiB0aW1lIGluc3RlYWQgb2Ygc3RhcmluZyBhdCBhIHNwaW5uZXIgZm9yIHRoZSBmdWxsIEdlbmllIHJvdW5kLXRyaXAuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUGx1Z2luc01hcChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGNvbnRleHQ6IHBsdWdpbi5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCxcbik6IE1hc3RyYVBsdWdpbnMge1xuICBjb25zdCBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIgfCBudWxsPigpO1xuICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIE1hc3RyYVBsdWdpbnMsIHtcbiAgICBnZXQoX3RhcmdldCwgcHJvcE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcE5hbWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FjaGUuaGFzKHByb3BOYW1lKSkgcmV0dXJuIGNhY2hlLmdldChwcm9wTmFtZSkgPz8gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcHJvdmlkZXIgPSByZXNvbHZlUHJvdmlkZXIoY29uZmlnLCBjb250ZXh0LCBwcm9wTmFtZSk7XG4gICAgICBjYWNoZS5zZXQocHJvcE5hbWUsIHByb3ZpZGVyKTtcbiAgICAgIHJldHVybiBwcm92aWRlciA/PyB1bmRlZmluZWQ7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogUGljayB0aGUgcmlnaHQge0BsaW5rIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcn0gZm9yIGEgc2libGluZ1xuICogcGx1Z2luIGxvb2t1cC4gUmV0dXJucyB0aGUgR2VuaWUgYWdlbnQtYmFja2VkIGFkYXB0ZXIgd2hlblxuICogdGhlIGNhbGxlciBhc2tzIGZvciBgZ2VuaWVgIEFORCBhdCBsZWFzdCBvbmUgc3BhY2UgaXMgcmVhY2hhYmxlXG4gKiB2aWEge0BsaW5rIHJlc29sdmVHZW5pZVNwYWNlc30gKHRoZSBleHBsaWNpdFxuICogYGNvbmZpZy5nZW5pZVNwYWNlc2AsIHRoZSByZWdpc3RlcmVkIEFwcEtpdCBgZ2VuaWUoKWAgcGx1Z2luJ3NcbiAqIGBzcGFjZXNgIGNvbmZpZywgb3IgdGhlIGBEQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEYCBlbnYgdmFyKS5cbiAqIEZhbGxzIGJhY2sgdG8gdGhlIGdlbmVyaWMgQXBwS2l0IGBUb29sUHJvdmlkZXJgIGFkYXB0ZXIgZm9yXG4gKiBldmVyeSBvdGhlciBwbHVnaW4gbmFtZS4gYGNvbmZpZ2AgaXMgdGhyZWFkZWQgdGhyb3VnaCBzbyB0aGVcbiAqIEdlbmllIGFnZW50IGluaGVyaXRzIHRoZSBzYW1lIG1vZGVsIHJlc29sdmVyIC8gZmFsbGJhY2tcbiAqIGxhZGRlciB0aGUgY2FsbGluZyBhZ2VudHMgdXNlLlxuICpcbiAqIFRoZSBHZW5pZSB0b29scyB0YWxrIHRvIEdlbmllIGRpcmVjdGx5IHRocm91Z2ggYEBkYngtdG9vbHMvZ2VuaWVgXG4gKiAoYGdlbmllRXZlbnRDaGF0YCkgYW5kIHRoZSB3b3Jrc3BhY2UgYHN0YXRlbWVudEV4ZWN1dGlvbi5nZXRTdGF0ZW1lbnRgXG4gKiBBUEk7IEFwcEtpdCdzIHN0b2NrIGBnZW5pZWAgcGx1Z2luIGNvbnRyaWJ1dGVzIG9ubHkgaXRzIHJlc291cmNlXG4gKiBtYW5pZmVzdCBhbmQgYHNwYWNlc2AgY29uZmlnLCBzbyBhbiBgYXBwLnlhbWxgIHJlc291cmNlIGJpbmRpbmcgYW5kIGFcbiAqIGBnZW5pZSh7IHNwYWNlcyB9KWAgcmVjb3JkIGhhdmUgdGhlIHNhbWUgbWVhbmluZyBoZXJlIGFzIHRoZXkgZG8gdGhlcmUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVQcm92aWRlcihcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGNvbnRleHQ6IHBsdWdpbi5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCxcbiAgcHJvcE5hbWU6IHN0cmluZyxcbik6IE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB8IG51bGwge1xuICBpZiAocHJvcE5hbWUgPT09IFwiZ2VuaWVcIikge1xuICAgIGNvbnN0IHNwYWNlcyA9IHJlc29sdmVHZW5pZVNwYWNlcyhjb25maWcsIGNvbnRleHQpO1xuICAgIGlmIChPYmplY3Qua2V5cyhzcGFjZXMpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXIoe1xuICAgICAgc3BhY2VzLFxuICAgICAgY29uZmlnLFxuICAgIH0pIGFzIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcjtcbiAgfVxuICBjb25zdCBwbHVnaW4gPSBjb250ZXh0Py5nZXRQbHVnaW5zKCkuZ2V0KHByb3BOYW1lKTtcbiAgcmV0dXJuIGFkYXB0UGx1Z2luVG9vbGtpdChwbHVnaW4pO1xufVxuXG4vKipcbiAqIEFwcEtpdCBgVG9vbFByb3ZpZGVyYCBzaGFwZSB3ZSBkdWNrLXR5cGUgYWdhaW5zdCBhbnkgcmVnaXN0ZXJlZFxuICogcGx1Z2luLiBEZWZpbmVkIHN0cnVjdHVyYWxseSB0byBhdm9pZCBjb3VwbGluZyB0byBBcHBLaXQncyBpbnRlcm5hbFxuICogdHlwZSBtb2R1bGUgbGF5b3V0LlxuICovXG5pbnRlcmZhY2UgQXBwS2l0VG9vbGtpdFByb3ZpZGVyIHtcbiAgdG9vbGtpdD86IChvcHRzPzogVG9vbGtpdE9wdGlvbnMpID0+IFJlY29yZDxzdHJpbmcsIEFwcEtpdFRvb2xraXRFbnRyeT47XG4gIGV4ZWN1dGVBZ2VudFRvb2w/OiAobmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzZTx1bmtub3duPjtcbn1cblxuLyoqIFNpbmdsZSBlbnRyeSByZXR1cm5lZCBieSBhbiBBcHBLaXQgcGx1Z2luJ3MgYC50b29sa2l0KG9wdHMpYCBjYWxsLiAqL1xuaW50ZXJmYWNlIEFwcEtpdFRvb2xraXRFbnRyeSB7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgbG9jYWxOYW1lOiBzdHJpbmc7XG4gIGRlZjoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHBhcmFtZXRlcnM6IHVua25vd247XG4gIH07XG59XG5cbi8qKlxuICogQWRhcHQgYW4gQXBwS2l0IGBUb29sUHJvdmlkZXJgIHBsdWdpbiBpbnN0YW5jZSBpbnRvIGFcbiAqIHtAbGluayBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXJ9LiBSZXR1cm5zIGBudWxsYCBmb3IgYW55IHBsdWdpblxuICogdGhhdCBkb2Vzbid0IGltcGxlbWVudCBib3RoIGB0b29sa2l0YCBhbmQgYGV4ZWN1dGVBZ2VudFRvb2xgIChlLmcuXG4gKiBgc2VydmVyYCwgYGxha2ViYXNlYCB3aGVuIHVzZWQgb25seSBhcyBhIFBvc3RncmVzIHBvb2wsIGV0Yy4pLlxuICovXG5mdW5jdGlvbiBhZGFwdFBsdWdpblRvb2xraXQocGx1Z2luOiB1bmtub3duKTogTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHwgbnVsbCB7XG4gIGlmICghcGx1Z2luIHx8IHR5cGVvZiBwbHVnaW4gIT09IFwib2JqZWN0XCIpIHJldHVybiBudWxsO1xuICBjb25zdCBwID0gcGx1Z2luIGFzIEFwcEtpdFRvb2xraXRQcm92aWRlcjtcbiAgaWYgKHR5cGVvZiBwLnRvb2xraXQgIT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgcC5leGVjdXRlQWdlbnRUb29sICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHRvb2xraXQob3B0cz86IFRvb2xraXRPcHRpb25zKTogTWFzdHJhVG9vbHMge1xuICAgICAgY29uc3QgZW50cmllcyA9IHAudG9vbGtpdCEob3B0cyk7XG4gICAgICBjb25zdCB0b29sczogTWFzdHJhVG9vbHMgPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgICAgIHRvb2xzW2tleV0gPSB0b29sa2l0RW50cnlUb01hc3RyYVRvb2woZW50cnksIHApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRvb2xzO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogV3JhcCBhIHNpbmdsZSB7QGxpbmsgQXBwS2l0VG9vbGtpdEVudHJ5fSBhcyBhIE1hc3RyYSB0b29sIHdob3NlXG4gKiBgZXhlY3V0ZWAgZGlzcGF0Y2hlcyBiYWNrIHRocm91Z2ggYHBsdWdpbi5leGVjdXRlQWdlbnRUb29sKC4uLilgIHNvXG4gKiBBcHBLaXQncyBPQk8gYXV0aCAoYGFzVXNlcmApIGFuZCB0ZWxlbWV0cnkgc3BhbnMgc3RheSBpbnRhY3QuIEpTT05cbiAqIFNjaGVtYSBwYXJhbWV0ZXJzIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQgLSBNYXN0cmEncyBgUHVibGljU2NoZW1hYFxuICogYWNjZXB0cyBgSlNPTlNjaGVtYTdgIGRpcmVjdGx5IHZpYSBgQG1hc3RyYS9zY2hlbWEtY29tcGF0YC5cbiAqL1xuZnVuY3Rpb24gdG9vbGtpdEVudHJ5VG9NYXN0cmFUb29sKGVudHJ5OiBBcHBLaXRUb29sa2l0RW50cnksIHBsdWdpbjogQXBwS2l0VG9vbGtpdFByb3ZpZGVyKTogVG9vbCB7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogYCR7ZW50cnkucGx1Z2luTmFtZX1fXyR7ZW50cnkubG9jYWxOYW1lfWAsXG4gICAgZGVzY3JpcHRpb246IGVudHJ5LmRlZi5kZXNjcmlwdGlvbixcbiAgICAuLi4oZW50cnkuZGVmLnBhcmFtZXRlcnMgPyB7IGlucHV0U2NoZW1hOiBlbnRyeS5kZWYucGFyYW1ldGVycyBhcyBuZXZlciB9IDoge30pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3Qgc2lnbmFsID0gKGNvbnRleHQgYXMgeyBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsIH0gfCB1bmRlZmluZWQpPy5hYm9ydFNpZ25hbDtcbiAgICAgIHJldHVybiBwbHVnaW4uZXhlY3V0ZUFnZW50VG9vbCEoZW50cnkubG9jYWxOYW1lLCBpbnB1dCwgc2lnbmFsKTtcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
|
package/lib/src/chart.d.ts
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
import { type Chart } from "@dbx-tools/shared-mastra";
|
|
30
30
|
import type { RequestContext } from "@mastra/core/request-context";
|
|
31
31
|
import { z } from "zod";
|
|
32
|
-
import { type MastraPluginConfig } from "./config.
|
|
32
|
+
import { type MastraPluginConfig } from "./config.ts";
|
|
33
33
|
/**
|
|
34
34
|
* Compact, model-friendly representation of an Echarts spec. The
|
|
35
35
|
* planner agent emits this; {@link planToEchartsOption} expands it
|
package/lib/src/chart.js
CHANGED
|
@@ -635,4 +635,4 @@ export function buildRenderDataTool(config) {
|
|
|
635
635
|
},
|
|
636
636
|
});
|
|
637
637
|
}
|
|
638
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFxQixNQUFNLHdCQUF3QixDQUFDO0FBQzVGLE9BQU8sRUFBRSxJQUFJLEVBQWdDLE1BQU0sMEJBQTBCLENBQUM7QUFDOUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QixPQUFPLEVBQUUsY0FBYyxFQUEyQixNQUFNLFVBQVUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXJDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7QUFFMUMsNkVBQTZFO0FBRTdFOzs7Ozs7R0FNRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUVwQyxzREFBc0Q7QUFDdEQsTUFBTSxxQkFBcUIsR0FBRyxjQUFjLENBQUM7QUFFN0MsbUVBQW1FO0FBQ25FLE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFDO0FBRXhDLHVEQUF1RDtBQUN2RCxNQUFNLHlCQUF5QixHQUFHLEdBQUcsQ0FBQztBQUV0QyxvRUFBb0U7QUFDcEUsTUFBTSxvQkFBb0IsR0FBRyx5QkFBeUIsQ0FBQztBQUV2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TSxFQUFFLEVBQUU7WUFDL0IsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEdBQUcsS0FBNEIsQ0FBQztZQUNsRSxNQUFNLEdBQUcsR0FBRyxNQUF5RCxDQUFDO1lBQ3RFLE9BQU8sWUFBWSxDQUFDO2dCQUNsQixNQUFNO2dCQUNOLE9BQU8sRUFBRSxjQUFjLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQztnQkFDNUMsS0FBSztnQkFDTCxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUNsRCxHQUFHLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDdkUsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENoYXJ0IHBsYW5uZXIgKyBjaGFydCBjYWNoZS5cbiAqXG4gKiBTZWxmLWNvbnRhaW5lZCBjaGFydCBzdWJzeXN0ZW0gd2l0aCB0d28gbGF5ZXJzOlxuICpcbiAqICAgMS4gSW5uZXIgcGxhbm5lciBhZ2VudCAocHJpdmF0ZSkuIFB1cmUgZGF0YXNldC1pbiAvXG4gKiAgICAgIGBFQ2hhcnRzT3B0aW9uYC1vdXQgYnJhaW4uIERyaXZlbiBieSB7QGxpbmsgcHJlcGFyZUNoYXJ0fTtcbiAqICAgICAgY2FsbGVycyBuZXZlciBpbnN0YW50aWF0ZSBpdCBkaXJlY3RseS5cbiAqICAgMi4ge0BsaW5rIHByZXBhcmVDaGFydH06IG9yY2hlc3RyYXRpb24gb24gdG9wIG9mIHRoZSBwbGFubmVyLlxuICogICAgICBNaW50cyBhIGBjaGFydElkYCwgY2FjaGVzIGFuIGVtcHR5IGB7IGNoYXJ0SWQgfWAgcmVjb3JkXG4gKiAgICAgIHN5bmNocm9ub3VzbHksIHRoZW4gcmVzb2x2ZXMgdGhlIGRhdGFzZXQgYW5kIHJ1bnMgdGhlXG4gKiAgICAgIHBsYW5uZXIgaW4gdGhlIGJhY2tncm91bmQuIFRoZSB0ZXJtaW5hbCBlbnRyeSBzZXR0bGVzIHdpdGhcbiAqICAgICAgZWl0aGVyIGByZXN1bHRgIChzdWNjZXNzKSBvciBgZXJyb3JgIChmYWlsdXJlKS4gQm90aFxuICogICAgICB1bmRlZmluZWQgbWVhbnMgdGhlIGVudHJ5IGlzIHN0aWxsIHByb2Nlc3NpbmcuXG4gKlxuICogVGhlIGNhY2hlIHN1cmZhY2UgKHtAbGluayBmZXRjaENoYXJ0fSkgaXMgdGhlIG9ubHkgc3RhdGUgdGhlXG4gKiBIVFRQIHJvdXRlIGFuZCB0aGUgY2hhcnQtcHJvZHVjaW5nIHRvb2xzIHNoYXJlLiBgcHJlcGFyZUNoYXJ0YFxuICogaXMgZGF0YXNldC1hZ25vc3RpYyAtIGNhbGxlcnMgc3VwcGx5IGEgYHJlc29sdmVEYXRhYCBjYWxsYmFja1xuICogdGhhdCBmZXRjaGVzIHRoZSByb3dzIGhvd2V2ZXIgdGhleSBsaWtlIChHZW5pZSBzdGF0ZW1lbnQsIGlubGluZVxuICogZGF0YXNldCwgY3VzdG9tIEFQSSkuIFRoZSBtb2R1bGUgaGFzIG5vIGtub3dsZWRnZSBvZiBHZW5pZSBvclxuICogc3RhdGVtZW50IGlkczsgdGhvc2UgY29uY2VybnMgbGl2ZSBpbiB0aGUgdG9vbHMgdGhhdCB3cmFwIGl0LlxuICpcbiAqIFdpcmUtZm9ybWF0IHNjaGVtYXMgbGl2ZSBpbiBgQGRieC10b29scy9zaGFyZWQtbWFzdHJhYCBzb1xuICogdGhlIGRlbW8gY2xpZW50IGFuZCBhbnkgb3RoZXIgVUkgY29uc3VtZXIgc2hhcmUgdGhlIGV4YWN0IHNhbWVcbiAqIHNoYXBlIHRoaXMgbW9kdWxlIHJlYWRzIGFuZCB3cml0ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IEFwcEtpdEVycm9yLCBDYWNoZU1hbmFnZXIsIEV4ZWN1dGlvbkVycm9yIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXN5bmMsIGVycm9yLCBoYXNoLCBsb2csIHN0cmluZywgdHlwZSBCcmFuZENvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgd2lyZSwgdHlwZSBDaGFydCwgdHlwZSBDaGFydFJlc3VsdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7IG1vZGVsIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHJlc29sdmVVc2VyS2V5LCB0eXBlIE1hc3RyYVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuaW1wb3J0IHsgYnVpbGRNb2RlbCB9IGZyb20gXCIuL21vZGVsXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvY2hhcnRcIik7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVFRMIGZvciBjYWNoZWQgY2hhcnQgZW50cmllcy4gT25lIGhvdXIgYmFsYW5jZXMgXCJsb25nIGVub3VnaCBmb3JcbiAqIHRoZSBob3N0IFVJIHRvIGZldGNoIHRoZSBjaGFydCB3ZWxsIGFmdGVyIHRoZSBtb2RlbCBmaW5pc2hlZFxuICogdGFsa2luZ1wiIGFnYWluc3QgXCJzaG9ydCBlbm91Z2ggdGhhdCBhYmFuZG9uZWQgY2hhcnQgaWRzIGRvbid0XG4gKiBwaW4gc3RvcmFnZVwiLiBNYXRjaGVzIHRoZSB0eXBpY2FsIERhdGFicmlja3MgT0JPIHRva2VuIGxpZmV0aW1lXG4gKiBzbyBhbnkgZGF0YSByZS1yZXNvbHV0aW9uIHN0YXlzIGluc2lkZSB0aGUgb3JpZ2luYWwgYXV0aCB3aW5kb3cuXG4gKi9cbmNvbnN0IENIQVJUX0NBQ0hFX1RUTF9TRUMgPSA2MCAqIDYwO1xuXG4vKiogQ2FjaGUgbmFtZXNwYWNlOyBrZWVwcyB0aGUgY2hhcnQga2V5c3BhY2UgdGlkeS4gKi9cbmNvbnN0IENIQVJUX0NBQ0hFX05BTUVTUEFDRSA9IFwibWFzdHJhOmNoYXJ0XCI7XG5cbi8qKiBEZWZhdWx0IHNlcnZlci1zaWRlIGxvbmctcG9sbCBidWRnZXQgZm9yIHtAbGluayBmZXRjaENoYXJ0fS4gKi9cbmNvbnN0IERFRkFVTFRfRkVUQ0hfVElNRU9VVF9NUyA9IDYwXzAwMDtcblxuLyoqIERlZmF1bHQgaW50ZXItcG9sbCBzbGVlcCBmb3Ige0BsaW5rIGZldGNoQ2hhcnR9LiAqL1xuY29uc3QgREVGQVVMVF9GRVRDSF9JTlRFUlZBTF9NUyA9IDI1MDtcblxuLyoqIFN0YWJsZSB0ZXh0IHN0b3JlZCBvbiBhIGNoYXJ0IGVudHJ5IHdob3NlIHBsYW5uZXIgcnVuIGZhaWxlZC4gKi9cbmNvbnN0IENIQVJUX0ZBSUxFRF9NRVNTQUdFID0gXCJDaGFydCBnZW5lcmF0aW9uIGZhaWxlZFwiO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNjaGVtYXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE9uZSBzZXJpZXMgZGF0YSBwb2ludC4gV2lkZSB2YXJpYW50IHNldCBzbyB0aGUgcGxhbm5lciBhZ2VudCBjYW5cbiAqIGZhaXRoZnVsbHkgcGFzcyB0aHJvdWdoIHdoYXRldmVyIHRoZSBTUUwgcm93IHNldCBjb250YWluZWRcbiAqIChudW1iZXJzLCBzdHJpbmdpZmllZCBudW1iZXJzLCBudWxscyBmb3IgbWlzc2luZyBtZWFzdXJlbWVudHMsXG4gKiBgW3gsIHldYCB0dXBsZXMgZm9yIHNjYXR0ZXIsIGB7bmFtZSwgdmFsdWV9YCBzbGljZXMgZm9yIHBpZSlcbiAqIHdpdGhvdXQgdGhlIHN0cnVjdHVyZWQtb3V0cHV0IGd1YXJkIHJlamVjdGluZyB0aGUgd2hvbGUgcGxhbi5cbiAqXG4gKiBUaHJlZSBsYXllcnMgb2YgdG9sZXJhbmNlOlxuICpcbiAqICAgMS4ge0BsaW5rIHoucHJlcHJvY2Vzc30gbm9ybWFsaXplcyB3aXJlIHNoYXBlcyBCRUZPUkUgdW5pb25cbiAqICAgICAgZGlzcGF0Y2g6IHN0cmluZ2lmaWVkIG51bWJlcnMgcGFyc2UgdG8gbnVtYmVycywgZmluaXRlXG4gKiAgICAgIGNoZWNrcyByZWplY3QgYE5hTmAgLyBgSW5maW5pdHlgLCAyLWVsZW1lbnQgYXJyYXlzIGNvZXJjZVxuICogICAgICB0dXBsZSBjb21wb25lbnRzLCBhbmQgYHt2YWx1ZX1gIG9iamVjdHMgd2l0aCBtaXNzaW5nIC9cbiAqICAgICAgc3RyaW5naWZpZWQgYHZhbHVlYCBnZXQgY29lcmNlZCBvciByZWplY3RlZCB1bmlmb3JtbHkuXG4gKiAgICAgIEFueXRoaW5nIG5vdCBoYW5kbGVhYmxlIGJlY29tZXMgYG51bGxgLlxuICogICAyLiBUaGUgdW5pb24gYWNjZXB0cyBgbnVsbGAgYXMgYSBmaXJzdC1jbGFzcyB2YXJpYW50LiBFY2hhcnRzXG4gKiAgICAgIHJlbmRlcnMgbnVsbCBhcyBhIGdhcCBvbiBiYXIgLyBsaW5lIC8gYXJlYSAod2hpY2ggaXMgdGhlXG4gKiAgICAgIHJpZ2h0IHZpc3VhbCBzaWduYWwgZm9yIFwibWlzc2luZyByZWFkaW5nXCIpLiBTY2F0dGVyIGFuZFxuICogICAgICBwaWUgZmlsdGVyIG51bGxzIGluIHtAbGluayBwbGFuVG9FY2hhcnRzT3B0aW9ufSBiZWNhdXNlXG4gKiAgICAgIEVjaGFydHMgY3Jhc2hlcyBvbiBudWxsIHR1cGxlcyAvIHNsaWNlcy5cbiAqICAgMy4ge0BsaW5rIHoudW5pb24jY2F0Y2h9IGJhY2tzdG9wcyB0aGUgd2hvbGUgdGhpbmc6IGlmXG4gKiAgICAgIHByZXByb2Nlc3Mgc29tZWhvdyBwcm9kdWNlcyBhIHNoYXBlIHRoYXQgc3RpbGwgZG9lc24ndFxuICogICAgICBtYXRjaCBhbnkgdmFyaWFudCwgdGhlIGJhZCBpdGVtIGJlY29tZXMgYG51bGxgIGluc3RlYWQgb2ZcbiAqICAgICAgdGFraW5nIGRvd24gdGhlIGVudGlyZSBjaGFydCB3aXRoIGFcbiAqICAgICAgYFN0cnVjdHVyZWQgb3V0cHV0IHZhbGlkYXRpb24gZmFpbGVkYCBlcnJvci5cbiAqL1xuY29uc3QgY2hhcnREYXRhUG9pbnRTY2hlbWEgPSB6XG4gIC5wcmVwcm9jZXNzKFxuICAgICh2KSA9PiB7XG4gICAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHYpID8gdiA6IG51bGw7XG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29uc3QgbiA9IE51bWJlcih2KTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShuKSA/IG4gOiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodikgJiYgdi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgY29uc3QgeCA9IHR5cGVvZiB2WzBdID09PSBcIm51bWJlclwiID8gdlswXSA6IE51bWJlcih2WzBdKTtcbiAgICAgICAgY29uc3QgeSA9IHR5cGVvZiB2WzFdID09PSBcIm51bWJlclwiID8gdlsxXSA6IE51bWJlcih2WzFdKTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh4KSAmJiBOdW1iZXIuaXNGaW5pdGUoeSkgPyBbeCwgeV0gOiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGwgJiYgXCJ2YWx1ZVwiIGluIHYpIHtcbiAgICAgICAgY29uc3Qgb2JqID0gdiBhcyB7IG5hbWU/OiB1bmtub3duOyB2YWx1ZTogdW5rbm93biB9O1xuICAgICAgICBjb25zdCB2YWwgPSB0eXBlb2Ygb2JqLnZhbHVlID09PSBcIm51bWJlclwiID8gb2JqLnZhbHVlIDogTnVtYmVyKG9iai52YWx1ZSk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbCkpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBDb2VyY2UgbnVtZXJpYyAvIGJvb2xlYW4gLyBudWxsaXNoIG5hbWVzIHRvIHN0cmluZ3Mgc28gYVxuICAgICAgICAvLyBwaWUgc2xpY2Uga2V5ZWQgb24gYSB5ZWFyIChgMjAyNGApIG9yIGNhdGVnb3J5IGlkIGlzXG4gICAgICAgIC8vIGFjY2VwdGVkIHdpdGhvdXQgcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgY2F0Y2ggYXJtLlxuICAgICAgICBjb25zdCByYXdOYW1lID0gb2JqLm5hbWU7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgcmF3TmFtZSA9PT0gXCJzdHJpbmdcIiA/IHJhd05hbWUgOiByYXdOYW1lID09IG51bGwgPyBcIlwiIDogU3RyaW5nKHJhd05hbWUpO1xuICAgICAgICByZXR1cm4geyBuYW1lLCB2YWx1ZTogdmFsIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIHoudW5pb24oW1xuICAgICAgei5udW1iZXIoKSxcbiAgICAgIHoubnVsbCgpLFxuICAgICAgLy8gYFt4LCB5XWAgc2NhdHRlciBwb2ludC4gTW9kZWxsZWQgYXMgYSBsZW5ndGgtY29uc3RyYWluZWRcbiAgICAgIC8vIGhvbW9nZW5lb3VzIGFycmF5IHJhdGhlciB0aGFuIGB6LnR1cGxlYDogWm9kIGVtaXRzIGEgdHVwbGUgYXNcbiAgICAgIC8vIEpTT04gU2NoZW1hIDIwMjAtMTIgYHByZWZpeEl0ZW1zYCwgYW5kIERhdGFicmlja3MnIEdlbWluaVxuICAgICAgLy8gZW5kcG9pbnRzIHJlamVjdCBhIGByZXNwb25zZV9qc29uX3NjaGVtYWAgY29udGFpbmluZyBpdFxuICAgICAgLy8gKFwibXVzdCBiZSBhIGJvb2xlYW4gb3IgYW4gb2JqZWN0XCIsIHNpbmNlIGBpdGVtc2AgaXMgYWJzZW50KS5cbiAgICAgIC8vIGB6LmFycmF5KHoubnVtYmVyKCkpLmxlbmd0aCgyKWAgZW1pdHMgYGl0ZW1zYCArIGBtaW5JdGVtc2AgL1xuICAgICAgLy8gYG1heEl0ZW1zYCwgd2hpY2ggZXZlcnkgcHJvdmlkZXIgdW5kZXJzdGFuZHMsIGFuZCB2YWxpZGF0ZXNcbiAgICAgIC8vIHRoZSBzYW1lIHR3by1udW1iZXIgc2hhcGUuXG4gICAgICB6LmFycmF5KHoubnVtYmVyKCkpLmxlbmd0aCgyKSxcbiAgICAgIHoub2JqZWN0KHsgbmFtZTogei5zdHJpbmcoKSwgdmFsdWU6IHoubnVtYmVyKCkgfSksXG4gICAgXSksXG4gIClcbiAgLmNhdGNoKG51bGwpO1xuXG4vKipcbiAqIENvbXBhY3QsIG1vZGVsLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIGFuIEVjaGFydHMgc3BlYy4gVGhlXG4gKiBwbGFubmVyIGFnZW50IGVtaXRzIHRoaXM7IHtAbGluayBwbGFuVG9FY2hhcnRzT3B0aW9ufSBleHBhbmRzIGl0XG4gKiBpbnRvIGEgcmVhbCBgRUNoYXJ0c09wdGlvbmAgSlNPTi4gVHdvIGxheWVycyBiZWNhdXNlIGxldHRpbmcgdGhlXG4gKiBtb2RlbCBmaWxsIGluIGEgZnVsbHktdHlwZWQgYEVDaGFydHNPcHRpb25gIGlzIGJyaXR0bGUgKGh1bmRyZWRzXG4gKiBvZiBvcHRpb25hbCBmaWVsZHMsIGRlZXAgdW5pb25zLCB2ZXJzaW9uLWRlcGVuZGVudCBzaGFwZXMpLiBBXG4gKiBzbWFsbCBcImNoYXJ0IHBsYW5cIiBzY2hlbWEgaXMgbXVjaCBtb3JlIHJlbGlhYmxlIGZvciBhIGZhc3QgbW9kZWxcbiAqIGFuZCBrZWVwcyBhbmltYXRpb24gLyB0b29sdGlwIC8gc3R5bGluZyBkZWZhdWx0cyBjb25zaXN0ZW50XG4gKiBhY3Jvc3MgY2hhcnRzLlxuICovXG5leHBvcnQgY29uc3QgY2hhcnRQbGFuU2NoZW1hID0gei5vYmplY3Qoe1xuICBjaGFydFR5cGU6IHdpcmUuQ2hhcnRUeXBlU2NoZW1hLFxuICB0aXRsZTogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBTaG9ydCB0aXRsZSBzaG93biBhYm92ZSB0aGUgY2hhcnQuIE9wdGlvbmFsOyBkZWZhdWx0cyB0byB0aGVcbiAgICAgICAgXFxgdGl0bGVcXGAgYXJndW1lbnQgdGhlIGNhbGxlciBwYXNzZWQgaW4uXG4gICAgICBgKSxcbiAgICApLFxuICB4QXhpc0xhYmVsOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIEF4aXMgbGFiZWwgYmVsb3cgdGhlIGNoYXJ0LiBVc2VkIGZvciBiYXIgLyBsaW5lIC8gYXJlYSAvIHNjYXR0ZXI7XG4gICAgICAgIGlnbm9yZWQgZm9yIHBpZS5cbiAgICAgIGApLFxuICAgICksXG4gIHlBeGlzTGFiZWw6IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgQXhpcyBsYWJlbCB0byB0aGUgbGVmdCBvZiB0aGUgY2hhcnQuIFVzZWQgZm9yIGJhciAvIGxpbmUgLyBhcmVhIC9cbiAgICAgICAgc2NhdHRlcjsgaWdub3JlZCBmb3IgcGllLlxuICAgICAgYCksXG4gICAgKSxcbiAgY2F0ZWdvcmllczogelxuICAgIC5hcnJheSh6LnN0cmluZygpKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBYLWF4aXMgY2F0ZWdvcnkgbGFiZWxzIGZvciBcXGBiYXJcXGAgLyBcXGBsaW5lXFxgIC8gXFxgYXJlYVxcYCBjaGFydHNcbiAgICAgICAgKG9uZSBwZXIgZGF0YSBwb2ludCBpbiBlYWNoIHNlcmllcykuIE9taXQgZm9yIFxcYHNjYXR0ZXJcXGAgKHVzZXNcbiAgICAgICAgW3gsIHldIHR1cGxlcykgYW5kIFxcYHBpZVxcYCAoZWFjaCBzbGljZSBjYXJyaWVzIGl0cyBvd24gXFxgbmFtZVxcYCkuXG4gICAgICBgKSxcbiAgICApLFxuICBzZXJpZXM6IHpcbiAgICAuYXJyYXkoXG4gICAgICB6Lm9iamVjdCh7XG4gICAgICAgIG5hbWU6IHouc3RyaW5nKCkuZGVzY3JpYmUoXG4gICAgICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICAgICAgTGVnZW5kIG5hbWUgZm9yIHRoaXMgc2VyaWVzLlxuICAgICAgICAgIGApLFxuICAgICAgICApLFxuICAgICAgICBkYXRhOiB6LmFycmF5KGNoYXJ0RGF0YVBvaW50U2NoZW1hKS5kZXNjcmliZShcbiAgICAgICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBEYXRhIHBvaW50cy4gRm9yIFxcYGJhclxcYCAvIFxcYGxpbmVcXGAgLyBcXGBhcmVhXFxgLCBhbiBhcnJheSBvZlxuICAgICAgICAgICAgbnVtYmVycyBhbGlnbmVkIHRvIFxcYGNhdGVnb3JpZXNcXGAuIEZvciBcXGBzY2F0dGVyXFxgLCBhbiBhcnJheVxuICAgICAgICAgICAgb2YgXFxgW3gsIHldXFxgIG51bWVyaWMgdHVwbGVzLiBGb3IgXFxgcGllXFxgLCBhbiBhcnJheSBvZlxuICAgICAgICAgICAgXFxge25hbWUsIHZhbHVlfVxcYCBvYmplY3RzLlxuICAgICAgICAgIGApLFxuICAgICAgICApLFxuICAgICAgfSksXG4gICAgKVxuICAgIC5taW4oMSlcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIE9uZSBvciBtb3JlIHNlcmllcyB0byBwbG90LiBQaWUgY2hhcnRzIHVzZSBleGFjdGx5IG9uZSBzZXJpZXM7XG4gICAgICAgIGJhci9saW5lL2FyZWEgY2FuIHN0YWNrIG11bHRpcGxlIHNlcmllcyBzaGFyaW5nIHRoZSBzYW1lXG4gICAgICAgIFxcYGNhdGVnb3JpZXNcXGAgYXhpcy5cbiAgICAgIGApLFxuICAgICksXG59KTtcblxudHlwZSBDaGFydFBsYW4gPSB6LmluZmVyPHR5cGVvZiBjaGFydFBsYW5TY2hlbWE+O1xuXG4vKipcbiAqIENhbm9uaWNhbCBwbGFubmVyIGlucHV0IHNoYXBlLiBUb29scyB0aGF0IHNvdXJjZSByb3dzIGZyb20gYW5cbiAqIGlubGluZSBkYXRhc2V0IChgcmVuZGVyX2RhdGFgKSB1c2UgaXQgYXMgdGhlaXIgYGlucHV0U2NoZW1hYFxuICogdmVyYmF0aW07IHRvb2xzIHRoYXQgcmVzb2x2ZSByb3dzIGZyb20gYSByZW1vdGUgKGBwcmVwYXJlX2NoYXJ0YFxuICogb3ZlciBhIEdlbmllIHN0YXRlbWVudCkgYG9taXQoeyBkYXRhIH0pYCBhbmQgYGV4dGVuZGAgd2l0aCB0aGVpclxuICogb3duIGlkZW50aWZpZXIgZmllbGQsIHNvIHRoZSBmaWVsZC1sZXZlbCBgLmRlc2NyaWJlKClgIHRleHRcbiAqIHN0YXlzIGEgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aC4gU2VydmVyLW9ubHkgLSB0aGUgVUkgbmV2ZXJcbiAqIHNlZXMgYSBwbGFubmVyIHJlcXVlc3QsIG9ubHkgdGhlIHJlc29sdmVkIHtAbGluayBDaGFydH0uXG4gKi9cbmV4cG9ydCBjb25zdCBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hID0gei5vYmplY3Qoe1xuICB0aXRsZTogei5zdHJpbmcoKS5kZXNjcmliZShcbiAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIENvbmNpc2UgdGl0bGUgc2hvd24gYWJvdmUgdGhlIGNoYXJ0IChlLmcuIFwiVG9wIDEwIFNLVXMgYnkgUmV2ZW51ZVwiKS5cbiAgICAgIGApLFxuICApLFxuICBkZXNjcmlwdGlvbjogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBPbmUtbGluZSBpbnRlbnQgdGhlIGNoYXJ0LXBsYW5uZXIgdXNlcyB3aGVuIHBpY2tpbmcgYSBjaGFydCB0eXBlXG4gICAgICAgIGFuZCBheGlzIGVuY29kaW5ncyAoZS5nLiBcImNvbXBhcmUgcXVhcnRlcmx5IHJldmVudWUgYWNyb3NzXG4gICAgICAgIHJlZ2lvbnNcIiwgXCJoaWdobGlnaHQgdGhlIHN0ZWVwIGRyb3AgYWZ0ZXIgcG9zaXRpb24gNVwiKS4gTm90IHNob3duXG4gICAgICAgIHRvIHRoZSB1c2VyLlxuICAgICAgYCksXG4gICAgKSxcbiAgZGF0YTogelxuICAgIC5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkpXG4gICAgLm5vbmVtcHR5KFwiRGF0YSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHJvd1wiKVxuICAgIC5yZWFkb25seSgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBUYWJ1bGFyIGRhdGFzZXQgdG8gY2hhcnQuIE9uZSBvYmplY3QgcGVyIHJvdywga2V5ZWQgYnkgY29sdW1uXG4gICAgICAgIG5hbWUuIFZhbHVlcyBtYXkgYmUgc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMsIG9yIG51bGwuIFRoZVxuICAgICAgICBjaGFydC1wbGFubmVyIGRlY2lkZXMgd2hpY2ggY29sdW1ucyBhcmUgY2F0ZWdvcmllcyB2cy4gbnVtZXJpY1xuICAgICAgICBzZXJpZXMuIENhcCBhdCBhIGZldyBodW5kcmVkIHJvd3MgZm9yIGxlZ2liaWxpdHk7IHNhbXBsZSAvXG4gICAgICAgIGFnZ3JlZ2F0ZSBsYXJnZXIgZGF0YXNldHMgZmlyc3QuXG4gICAgICBgKSxcbiAgICApLFxufSk7XG5cbmV4cG9ydCB0eXBlIENoYXJ0UGxhbm5lclJlcXVlc3QgPSB6LmluZmVyPHR5cGVvZiBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hPjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBsYW5uZXIgaW5zdHJ1Y3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEZvcm1hdCB7QGxpbmsgd2lyZS5DaGFydFR5cGVTY2hlbWF9J3MgdmFyaWFudHMgYXMgYSBzaW5nbGVcbiAqIGh1bWFuLWZyaWVuZGx5IHN0cmluZyBvZiBgYCBgPHZhbHVlPmAgZm9yIDxkZXNjcmlwdGlvbj4gYGBcbiAqIGNsYXVzZXMgam9pbmVkIGJ5IHNlbWljb2xvbnMsIGRyYXduIGZyb20gZWFjaCB2YXJpYW50J3Mgb3duXG4gKiBgLmRlc2NyaWJlKClgIHNvIHRoZSBwbGFubmVyIHByb21wdCBzdGF5cyBpbiBsb2NrLXN0ZXAgd2l0aFxuICogdGhlIHNjaGVtYSBieSBjb25zdHJ1Y3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdENoYXJ0VHlwZVBpY2tlcigpOiBzdHJpbmcge1xuICByZXR1cm4gd2lyZS5DaGFydFR5cGVTY2hlbWEub3B0aW9uc1xuICAgIC5tYXAoKG9wdCkgPT4gYFxcYCR7b3B0LnZhbHVlfVxcYCBmb3IgJHtvcHQuZGVzY3JpcHRpb24gPz8gXCJcIn1gKVxuICAgIC5qb2luKFwiOyBcIik7XG59XG5cbi8qKlxuICogU3lzdGVtIHByb21wdCBmb3IgdGhlIGlubmVyIGNoYXJ0LXBsYW5uaW5nIGFnZW50LiBUdW5lZCBmb3IgYVxuICogZmFzdC10aWVyIG1vZGVsIChIYWlrdSwgR1BULTUtbWluaSwgR2VtaW5pIEZsYXNoIExpdGUpLlxuICovXG5jb25zdCBDSEFSVF9QTEFOTkVSX0lOU1RSVUNUSU9OUyA9IHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgWW91IGRlc2lnbiBBcGFjaGUgRWNoYXJ0cyB2aXN1YWxpemF0aW9ucy4gVGhlIHVzZXIgZ2l2ZXMgeW91IGFcbiAgdGFidWxhciBkYXRhc2V0IChyb3dzIG9mIG9iamVjdHMpIHBsdXMgYSB0aXRsZSBhbmQgYW4gb3B0aW9uYWxcbiAgZGVzY3JpcHRpb24gb2YgdGhlIGludGVudC4gWW91IHByb2R1Y2UgYSBzbWFsbCBjaGFydCBwbGFuIChjaGFydFxuICB0eXBlLCBheGlzIGxhYmVscywgY2F0ZWdvcmllcywgc2VyaWVzKSB0aGF0IGJlc3QgY29udmV5cyB0aGUgZGF0YS5cblxuICBEZWNpc2lvbiBndWlkZS4gUGljayB0aGUgY2hhcnQgdHlwZSB3aG9zZSBkYXRhIHNoYXBlIG1hdGNoZXMgdGhlXG4gIGRhdGFzZXQgYW5kIHRoZSB1c2VyJ3MgaW50ZW50OiAke2Zvcm1hdENoYXJ0VHlwZVBpY2tlcigpfS5cblxuICBXaGVuIGluIGRvdWJ0IGJldHdlZW4gYmFyIGFuZCBsaW5lLCBwcmVmZXIgYmFyIGZvciB1bm9yZGVyZWRcbiAgY2F0ZWdvcmllcyBhbmQgbGluZSBmb3Igb3JkZXJlZCBvbmVzIChkYXRlcywgdGltZSBidWNrZXRzLCByYW5rcykuXG4gIE5ldmVyIHBpY2sgcGllIGZvciBtb3JlIHRoYW4gNyBzbGljZXMuXG5cbiAgRm9yIGJhciAvIGxpbmUgLyBhcmVhOiBwaWNrIG9uZSBjb2x1bW4gYXMgdGhlIGNhdGVnb3J5IGF4aXMgKHVzdWFsbHlcbiAgdGhlIG9ubHkgc3RyaW5nLXZhbHVlZCBjb2x1bW4pIGFuZCBvbmUgb3IgbW9yZSBudW1lcmljIGNvbHVtbnMgYXNcbiAgc2VyaWVzLiBTb3J0IGNhdGVnb3JpZXMgYnkgdGhlIHByaW1hcnkgc2VyaWVzIHZhbHVlIGRlc2NlbmRpbmcgdW5sZXNzXG4gIHRoZSBkYXRhIGlzIG5hdHVyYWxseSBvcmRlcmVkIChkYXRlcywgcmFua3MpLlxuXG4gIEZvciBwaWU6IHBpY2sgdGhlIGNhdGVnb3J5IGNvbHVtbiBmb3Igc2xpY2UgbmFtZXMgYW5kIG9uZSBudW1lcmljXG4gIGNvbHVtbiBmb3Igc2xpY2UgdmFsdWVzLiBFbWl0IGEgc2luZ2xlIHNlcmllcy5cblxuICBGb3Igc2NhdHRlcjogcGljayB0d28gbnVtZXJpYyBjb2x1bW5zIGFuZCBlbWl0IFxcYFt4LCB5XVxcYCB0dXBsZXMgaW4gYVxuICBzaW5nbGUgc2VyaWVzLlxuXG4gIEtlZXAgc2VyaWVzIG5hbWVzIGh1bWFuLXJlYWRhYmxlICh1c2UgdGhlIGNvbHVtbiBuYW1lOyB0aXRsZSBjYXNlIGl0XG4gIGxpZ2h0bHkgaWYgbmVlZGVkKS4gS2VlcCB0aXRsZXMgY29uY2lzZTsgZG8gbm90IHJlcGVhdCB0aGUgdXNlcidzXG4gIHRpdGxlIGluIHhBeGlzTGFiZWwgLyB5QXhpc0xhYmVsLlxuYCk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBsYW5uZXIgYWdlbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBPbmUgcGxhbm5lciBgQWdlbnRgIHBlciBwbHVnaW4gY29uZmlnLiBDYWNoZWQgb24gY29uZmlnIG9iamVjdFxuICogaWRlbnRpdHkgc28gY2FsbGVycyBjYW4gYHByZXBhcmVDaGFydCh7IGNvbmZpZywgLi4uIH0pYCBmcm9tIGFcbiAqIGhvdCBwYXRoIHdpdGhvdXQgcGF5aW5nIHRoZSBBZ2VudC1jb25zdHJ1Y3RvciBjb3N0IGV2ZXJ5IGNhbGwuXG4gKiBgV2Vha01hcGAgbGV0cyByZXRpcmVkIGNvbmZpZ3MgKGUuZy4gdGVzdCByZWNvbmZpZ3VyYXRpb25zKVxuICogcmVsZWFzZSB0aGVpciBhZ2VudCB3aXRob3V0IG1hbnVhbCBldmljdGlvbi5cbiAqL1xuY29uc3QgcGxhbm5lckFnZW50cyA9IG5ldyBXZWFrTWFwPE1hc3RyYVBsdWdpbkNvbmZpZywgQWdlbnQ+KCk7XG5cbmZ1bmN0aW9uIGdldFBsYW5uZXJBZ2VudChjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IEFnZW50IHtcbiAgbGV0IGFnZW50ID0gcGxhbm5lckFnZW50cy5nZXQoY29uZmlnKTtcbiAgaWYgKCFhZ2VudCkge1xuICAgIGFnZW50ID0gbmV3IEFnZW50KHtcbiAgICAgIGlkOiBcImNoYXJ0X3BsYW5uZXJcIixcbiAgICAgIG5hbWU6IFwiQ2hhcnQgUGxhbm5lclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiUGlja3MgY2hhcnQgdHlwZSBhbmQgYXhpcyBlbmNvZGluZ3MgZm9yIGEgZGF0YXNldC5cIixcbiAgICAgIGluc3RydWN0aW9uczogQ0hBUlRfUExBTk5FUl9JTlNUUlVDVElPTlMsXG4gICAgICBtb2RlbDogKHsgcmVxdWVzdENvbnRleHQgfSkgPT5cbiAgICAgICAgYnVpbGRNb2RlbChjb25maWcsIHJlcXVlc3RDb250ZXh0LCB7IG1vZGVsQ2xhc3M6IG1vZGVsLk1vZGVsQ2xhc3MuQ2hhdEZhc3QgfSksXG4gICAgfSk7XG4gICAgcGxhbm5lckFnZW50cy5zZXQoY29uZmlnLCBhZ2VudCk7XG4gIH1cbiAgcmV0dXJuIGFnZW50O1xufVxuXG4vKipcbiAqIFJ1biB0aGUgcGxhbm5lciBhZ2FpbnN0IGByZXF1ZXN0YCBhbmQgcmV0dXJuIHRoZSByZXNvbHZlZFxuICogRWNoYXJ0cyBzcGVjLiBUaHJvd3Mgb24gcGxhbm5lciBmYWlsdXJlIC0ge0BsaW5rIHByZXBhcmVDaGFydH1cbiAqIGNhdGNoZXMgYW5kIHN0YXNoZXMgdGhlIGVycm9yIGluIHRoZSBjYWNoZSBlbnRyeS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuQ2hhcnRQbGFubmVyKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgcmVxdWVzdDogQ2hhcnRQbGFubmVyUmVxdWVzdCxcbiAgb3B0aW9uczogeyByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0OyBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsIH0gPSB7fSxcbik6IFByb21pc2U8Q2hhcnRSZXN1bHQ+IHtcbiAgY29uc3QgeyB0aXRsZSwgZGVzY3JpcHRpb24sIGRhdGEgfSA9IHJlcXVlc3Q7XG4gIGNvbnN0IHsgcmVxdWVzdENvbnRleHQsIGFib3J0U2lnbmFsIH0gPSBvcHRpb25zO1xuICBjb25zdCBwcm9tcHQgPSBzdHJpbmcudG9EZXNjcmlwdGlvbih7XG4gICAgVGl0bGU6IHRpdGxlLFxuICAgIC4uLihkZXNjcmlwdGlvbiA/IHsgRGVzY3JpcHRpb246IGRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgXCJEYXRhc2V0IChKU09OLCBvbmUgcm93IHBlciBvYmplY3QpXCI6IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpLFxuICB9KTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UGxhbm5lckFnZW50KGNvbmZpZykuZ2VuZXJhdGUocHJvbXB0LCB7XG4gICAgc3RydWN0dXJlZE91dHB1dDogeyBzY2hlbWE6IGNoYXJ0UGxhblNjaGVtYSB9LFxuICAgIC4uLihyZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQgfSA6IHt9KSxcbiAgICAuLi4oYWJvcnRTaWduYWwgPyB7IGFib3J0U2lnbmFsIH0gOiB7fSksXG4gIH0pO1xuICBjb25zdCBwbGFuID0gY2hhcnRQbGFuU2NoZW1hLnBhcnNlKHJlc3VsdC5vYmplY3QpO1xuICBjb25zdCBvcHRpb24gPSBwbGFuVG9FY2hhcnRzT3B0aW9uKHBsYW4sIHRpdGxlLCBjb25maWcuYnJhbmQpO1xuICByZXR1cm4geyBjaGFydFR5cGU6IHBsYW4uY2hhcnRUeXBlLCBvcHRpb24gfTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNhY2hlIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogQnVpbGQgdGhlIGNhbm9uaWNhbCBjYWNoZSBrZXkgZm9yIGEgYGNoYXJ0SWRgIG93bmVkIGJ5IGB1c2VyS2V5YC5cbiAqXG4gKiBUaGUgaWRlbnRpdHkgaXMgcGFydCBvZiB0aGUga2V5LCBub3QgYSBmaWx0ZXIgYXBwbGllZCBhZnRlciB0aGUgcmVhZCwgc28gYVxuICogY2hhcnQgaWQgZ3Vlc3NlZCBvciBjb3BpZWQgZnJvbSBhbm90aGVyIHVzZXIncyB0cmFuc2NyaXB0IHJlc29sdmVzIHRvIGFcbiAqIGRpZmZlcmVudCBrZXkgYW5kIHNpbXBseSBtaXNzZXMuIFRoYXQgbWlzcyBpcyB3aGF0IHRoZSBIVFRQIHJvdXRlIHR1cm5zIGludG9cbiAqIGEgNDA0LCB3aGljaCBpcyBhbHNvIHRoZSBhbnN3ZXIgdGhhdCBsZWFrcyB0aGUgbGVhc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoYXJ0Q2FjaGVLZXkoY2hhcnRJZDogc3RyaW5nLCB1c2VyS2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gKGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpKS5nZW5lcmF0ZUtleShbQ0hBUlRfQ0FDSEVfTkFNRVNQQUNFLCBjaGFydElkXSwgdXNlcktleSk7XG59XG5cbi8qKlxuICogUGVyc2lzdCBhIHtAbGluayBDaGFydH0gZW50cnkgdW5kZXIgaXRzIGBjaGFydElkYCwgb3duZWQgYnkgYHVzZXJLZXlgLlxuICogUmVmcmVzaGVzIHRoZSBUVEwgb24gZXZlcnkgd3JpdGUuIENhY2hlLWxheWVyIGZhaWx1cmVzIGFyZSBsb2dnZWQgYW5kXG4gKiBzd2FsbG93ZWQgc28gYmFja2dyb3VuZCBydW5uZXJzIG5ldmVyIHRocm93IGludG8gdGhlXG4gKiB1bmhhbmRsZWQtcmVqZWN0aW9uIHN0cmVhbS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVDaGFydChlbnRyeTogQ2hhcnQsIHVzZXJLZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNoYXJ0Q2FjaGVLZXkoZW50cnkuY2hhcnRJZCwgdXNlcktleSk7XG4gICAgYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLnNldChrZXksIGVudHJ5LCB7XG4gICAgICB0dGw6IENIQVJUX0NBQ0hFX1RUTF9TRUMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwid3JpdGUtZXJyb3JcIiwge1xuICAgICAgY2hhcnRJZDogZW50cnkuY2hhcnRJZCxcbiAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIExvb2sgdXAgYSBjaGFydCBgdXNlcktleWAgb3ducy4gUmV0dXJucyBgdW5kZWZpbmVkYCBvbiBtaXNzLCBvblxuICogZXhwaXJ5LCB3aGVuIGFub3RoZXIgaWRlbnRpdHkgb3ducyB0aGUgaWQsIG9yIHdoZW4gdGhlIGNhY2hlIGxheWVyIGlzXG4gKiB1bmhlYWx0aHkgLSBuZXZlciB0aHJvd3MuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDaGFydChjaGFydElkOiBzdHJpbmcsIHVzZXJLZXk6IHN0cmluZyk6IFByb21pc2U8Q2hhcnQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBjaGFydENhY2hlS2V5KGNoYXJ0SWQsIHVzZXJLZXkpO1xuICAgIGNvbnN0IHYgPSBhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCkuZ2V0PENoYXJ0PihrZXkpO1xuICAgIHJldHVybiB2ID8/IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJyZWFkLWVycm9yXCIsIHtcbiAgICAgIGNoYXJ0SWQsXG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJlcGFyZUNoYXJ0IG9yY2hlc3RyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIElucHV0cyB0byB7QGxpbmsgcHJlcGFyZUNoYXJ0fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJlcGFyZUNoYXJ0T3B0aW9ucyB7XG4gIC8qKiBQbHVnaW4gY29uZmlnOyByZXNvbHZlcyB0aGUgcGxhbm5lciBhZ2VudCdzIG1vZGVsLiAqL1xuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZztcbiAgLyoqXG4gICAqIElkZW50aXR5IHRoYXQgb3ducyB0aGUgbWludGVkIGNoYXJ0LiBPbmx5IGEge0BsaW5rIGZldGNoQ2hhcnR9IGNhbGxcbiAgICogY2FycnlpbmcgdGhlIHNhbWUga2V5IHJlc29sdmVzIGl0LiBVc2Uge0BsaW5rIHJlc29sdmVVc2VyS2V5fS5cbiAgICovXG4gIHVzZXJLZXk6IHN0cmluZztcbiAgLyoqIERpc3BsYXkgdGl0bGUgZm9yd2FyZGVkIHRvIHRoZSBwbGFubmVyIGFnZW50LiAqL1xuICB0aXRsZT86IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGludGVudCBoaW50IGZvcndhcmRlZCB0byB0aGUgcGxhbm5lciBhZ2VudC4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcm93cyB0byBjaGFydC4gQ2FsbGVkIG9uY2UsIGluIHRoZSBiYWNrZ3JvdW5kLlxuICAgKiBBbnkgdGhyb3duIGVycm9yIGxhbmRzIGluIHRoZSBjYWNoZSBhcyB0aGUgZW50cnkncyBgZXJyb3JgXG4gICAqIGZpZWxkIChuZXZlciBwcm9wYWdhdGVkIHRvIHRoZSBjYWxsZXIgb2Yge0BsaW5rIHByZXBhcmVDaGFydH0pLlxuICAgKiBBbiBlbXB0eSBgcm93c2AgYXJyYXkgaXMgcmVqZWN0ZWQgYXMgYFwiZGF0YXNldCBoYXMgbm8gcm93cztcbiAgICogbm90aGluZyB0byBjaGFydFwiYC5cbiAgICovXG4gIHJlc29sdmVEYXRhOiAoc2lnbmFsPzogQWJvcnRTaWduYWwpID0+IFByb21pc2U8eyByb3dzOiBSZWFkb25seUFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB9PjtcbiAgLyoqXG4gICAqIFBlci1yZXF1ZXN0IGBSZXF1ZXN0Q29udGV4dGAuIEZvcndhcmRlZCB0byB0aGUgcGxhbm5lciBhZ2VudCBzb1xuICAgKiB1c2VyLXNjb3BlZCBtb2RlbCByZXNvbHV0aW9uIChPQk8pIHN0YXlzIGluIGVmZmVjdC5cbiAgICovXG4gIHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQ7XG4gIC8qKlxuICAgKiBDb29wZXJhdGl2ZSBjYW5jZWxsYXRpb24uIEZvcndhcmRlZCB0byBgcmVzb2x2ZURhdGFgIGFuZCB0aGVcbiAgICogcGxhbm5lciBhZ2VudC4gTm90ZTogdGhlIGNoYXJ0IHRhc2sgY29udGludWVzIHJ1bm5pbmcgaW4gdGhlXG4gICAqIGJhY2tncm91bmQgYWZ0ZXIgdGhlIHBhcmVudCByZXF1ZXN0IGVuZHMsIHNvIGV4dGVybmFsIGFib3J0XG4gICAqIHNpZ25hbHMgYXJlIGJlc3QtZWZmb3J0OyB0eXBpY2FsIHVzZSBpcyB0byBsZWF2ZSB0aGlzIHVuc2V0XG4gICAqIGFuZCBsZXQgdGhlIDFoIFRUTCBjYXAgc3RhbGUgZW50cmllcy5cbiAgICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKipcbiAqIE1pbnQgYSBgY2hhcnRJZGAsIGNhY2hlIGFuIGVtcHR5IGB7IGNoYXJ0SWQgfWAgcGxhY2Vob2xkZXJcbiAqIHN5bmNocm9ub3VzbHksIGFuZCBraWNrIG9mZiBhIGJhY2tncm91bmQgdGFzayB0aGF0IHJlc29sdmVzIHRoZVxuICogZGF0YXNldCBhbmQgcnVucyB0aGUgcGxhbm5lci4gUmV0dXJucyB0aGUgYGNoYXJ0SWRgIG9uY2UgdGhlXG4gKiBwbGFjZWhvbGRlciBsYW5kcyBzbyB0aGUgZmlyc3Qge0BsaW5rIGZldGNoQ2hhcnR9IGNhbGwgYWx3YXlzXG4gKiBzZWVzIGFuIGVudHJ5IChubyBzcHVyaW91cyA0MDQgcmFjZSkuXG4gKlxuICogVGhlIGJhY2tncm91bmQgdGFzayBzd2FsbG93cyBpdHMgb3duIGZhaWx1cmVzIGFuZCB3cml0ZXMgdGhlbVxuICogYXMgYGVycm9yYCBlbnRyaWVzLCBzbyBjYWxsZXJzIG5ldmVyIHNlZSBhIHJlamVjdGVkIHByb21pc2UuXG4gKiBDYWNoZSBzdGF0ZSBtYWNoaW5lOlxuICpcbiAqICAgLSBqdXN0IGFmdGVyIHRoaXMgY2FsbCByZXR1cm5zOiBgeyBjaGFydElkIH1gIChwcm9jZXNzaW5nKVxuICogICAtIG9uIHBsYW5uZXIgc3VjY2VzczogICAgICAgICAgIGB7IGNoYXJ0SWQsIHJlc3VsdCB9YFxuICogICAtIG9uIGRhdGEgLyBwbGFubmVyIGZhaWx1cmU6ICAgIGB7IGNoYXJ0SWQsIGVycm9yIH1gXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVwYXJlQ2hhcnQob3B0czogUHJlcGFyZUNoYXJ0T3B0aW9ucyk6IFByb21pc2U8eyBjaGFydElkOiBzdHJpbmcgfT4ge1xuICBjb25zdCBjaGFydElkID0gaGFzaC5pZCgpO1xuICBhd2FpdCB3cml0ZUNoYXJ0KHsgY2hhcnRJZCB9LCBvcHRzLnVzZXJLZXkpO1xuICBsb2dnZXIuZGVidWcoXCJxdWV1ZWRcIiwgeyBjaGFydElkIH0pO1xuICAvLyBGaXJlLWFuZC1mb3JnZXQuIEZhaWx1cmVzIGxhbmQgaW4gdGhlIGNhY2hlIGFzIGBlcnJvcmAgZW50cmllcztcbiAgLy8gbmV2ZXIgZXNjYXBlIGludG8gYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgdm9pZCBydW5QcmVwYXJlQ2hhcnQoY2hhcnRJZCwgb3B0cyk7XG4gIHJldHVybiB7IGNoYXJ0SWQgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUHJlcGFyZUNoYXJ0KGNoYXJ0SWQ6IHN0cmluZywgb3B0czogUHJlcGFyZUNoYXJ0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBvcHRzLnJlc29sdmVEYXRhKG9wdHMuc2lnbmFsKTtcbiAgICBpZiAoZGF0YS5yb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwiRGF0YXNldCBoYXMgbm8gcm93czsgbm90aGluZyB0byBjaGFydFwiKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuQ2hhcnRQbGFubmVyKFxuICAgICAgb3B0cy5jb25maWcsXG4gICAgICB7XG4gICAgICAgIHRpdGxlOiBvcHRzLnRpdGxlID8/IFwiQ2hhcnRcIixcbiAgICAgICAgLi4uKG9wdHMuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiBvcHRzLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIGRhdGE6IGRhdGEucm93cyBhcyBDaGFydFBsYW5uZXJSZXF1ZXN0W1wiZGF0YVwiXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC4uLihvcHRzLnJlcXVlc3RDb250ZXh0ID8geyByZXF1ZXN0Q29udGV4dDogb3B0cy5yZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgICAgICAuLi4ob3B0cy5zaWduYWwgPyB7IGFib3J0U2lnbmFsOiBvcHRzLnNpZ25hbCB9IDoge30pLFxuICAgICAgfSxcbiAgICApO1xuICAgIGF3YWl0IHdyaXRlQ2hhcnQoeyBjaGFydElkLCByZXN1bHQgfSwgb3B0cy51c2VyS2V5KTtcbiAgICBsb2dnZXIuaW5mbyhcImRvbmVcIiwge1xuICAgICAgY2hhcnRJZCxcbiAgICAgIGNoYXJ0VHlwZTogcmVzdWx0LmNoYXJ0VHlwZSxcbiAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJlcnJvclwiLCB7IGNoYXJ0SWQsIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICAvLyBUaGUgZW50cnkncyBgZXJyb3JgIGlzIHJlbmRlcmVkIGluIHRoZSBjaGF0LCBzbyBvbmx5IGFuIEFwcEtpdEVycm9yJ3NcbiAgICAvLyBvd24gbWVzc2FnZSB0cmF2ZWxzOyBhbnl0aGluZyBlbHNlIGNvdWxkIGNhcnJ5IHVwc3RyZWFtIHByb3ZpZGVyIGRldGFpbC5cbiAgICBjb25zdCBlcnJUZXh0ID0gZXJyIGluc3RhbmNlb2YgQXBwS2l0RXJyb3IgPyBlcnIubWVzc2FnZSA6IENIQVJUX0ZBSUxFRF9NRVNTQUdFO1xuICAgIGF3YWl0IHdyaXRlQ2hhcnQoeyBjaGFydElkLCBlcnJvcjogZXJyVGV4dCB9LCBvcHRzLnVzZXJLZXkpO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbG9uZy1wb2xsIGZldGNoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIElucHV0cyB0byB7QGxpbmsgZmV0Y2hDaGFydH0uICovXG5leHBvcnQgaW50ZXJmYWNlIEZldGNoQ2hhcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIElkZW50aXR5IHRoZSBjaGFydCBtdXN0IGJlbG9uZyB0by4gQSBjaGFydCBtaW50ZWQgdW5kZXIgYSBkaWZmZXJlbnQga2V5XG4gICAqIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gdW5rbm93biBpZC4gVXNlIHtAbGluayByZXNvbHZlVXNlcktleX0uXG4gICAqL1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZXJ2ZXItc2lkZSBwb2xsaW5nIGJ1ZGdldCBpbiBtcy4gV2hlbiB0aGUgZW50cnkgc3RheXMgaW5cbiAgICogdGhlIHByb2Nlc3Npbmcgc3RhdGUgcGFzdCB0aGlzIHdpbmRvdywgdGhlIGhlbHBlciByZXR1cm5zIHRoZVxuICAgKiBsYXN0IHNlZW4gdmFsdWUgKHN0aWxsIHByb2Nlc3NpbmcpIHNvIHRoZSBjbGllbnQgY2FuIHJlLXBvbGwuXG4gICAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0ZFVENIX1RJTUVPVVRfTVN9ICg2MHMpLlxuICAgKi9cbiAgdGltZW91dE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogUG9sbCBpbnRlcnZhbCBpbiBtcy4gRGVmYXVsdHMgdG9cbiAgICoge0BsaW5rIERFRkFVTFRfRkVUQ0hfSU5URVJWQUxfTVN9ICgyNTBtcykuXG4gICAqL1xuICBpbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uIGhhbmRsZSAoZS5nLiByZXF1ZXN0IGByZXEuc2lnbmFsYCkuICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKipcbiAqIExvbmctcG9sbCB0aGUgY2hhcnQgY2FjaGUgdW50aWwgdGhlIGVudHJ5IHNldHRsZXMgKGByZXN1bHRgIG9yXG4gKiBgZXJyb3JgIHNldCksIHRoZSBlbnRyeSBpcyBtaXNzaW5nLCBvciB0aGUgc2VydmVyLXNpZGUgdGltZW91dFxuICogZWxhcHNlcy5cbiAqXG4gKiBSZXR1cm5zOlxuICogICAtIHRoZSByZXNvbHZlZCB7QGxpbmsgQ2hhcnR9IHdoZW4gaXQgc2V0dGxlZCwgZXJyb3JlZCwgb3JcbiAqICAgICBzdGF5ZWQgaW4gcHJvY2Vzc2luZyBwYXN0IGB0aW1lb3V0TXNgIChzbyB0aGUgY2xpZW50IGNhblxuICogICAgIHJlLXBvbGwpO1xuICogICAtIGB1bmRlZmluZWRgIHdoZW4gdGhlIGVudHJ5IGlzIG1pc3NpbmcsIGV4cGlyZWQsIG9yIG93bmVkIGJ5XG4gKiAgICAgYW5vdGhlciBpZGVudGl0eSAodGhlIGNvbnN1bWVyIHNob3VsZCB0cmVhdCBhcyA0MDQpLlxuICpcbiAqIGBzaWduYWxgIGxldHMgdGhlIGNhbGxlciBjYW5jZWwgYWhlYWQgb2YgdGltZW91dCAoZS5nLiB0aGUgSFRUUFxuICogcmVxdWVzdCBjbG9zZWQpLiBDYW5jZWxsYXRpb24gcHJvcGFnYXRlcyB0byB0aGUgaW50ZXItcG9sbCBzbGVlcFxuICogc28gdGhlIGhlbHBlciByZXR1cm5zIGltbWVkaWF0ZWx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hDaGFydChcbiAgY2hhcnRJZDogc3RyaW5nLFxuICBvcHRpb25zOiBGZXRjaENoYXJ0T3B0aW9ucyxcbik6IFByb21pc2U8Q2hhcnQgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgdGltZW91dE1zID0gb3B0aW9ucy50aW1lb3V0TXMgPz8gREVGQVVMVF9GRVRDSF9USU1FT1VUX01TO1xuICBjb25zdCBpbnRlcnZhbE1zID0gb3B0aW9ucy5pbnRlcnZhbE1zID8/IERFRkFVTFRfRkVUQ0hfSU5URVJWQUxfTVM7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRpbWVvdXRNcztcblxuICBsZXQgbGFzdDogQ2hhcnQgfCB1bmRlZmluZWQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgb3B0aW9ucy5zaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgbGFzdCA9IGF3YWl0IHJlYWRDaGFydChjaGFydElkLCBvcHRpb25zLnVzZXJLZXkpO1xuICAgIGlmICghbGFzdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAobGFzdC5yZXN1bHQgIT09IHVuZGVmaW5lZCB8fCBsYXN0LmVycm9yICE9PSB1bmRlZmluZWQpIHJldHVybiBsYXN0O1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IGRlYWRsaW5lIC0gRGF0ZS5ub3coKTtcbiAgICBpZiAocmVtYWluaW5nIDw9IDApIHJldHVybiBsYXN0O1xuICAgIGF3YWl0IGFzeW5jLnNsZWVwKE1hdGgubWluKGludGVydmFsTXMsIHJlbWFpbmluZyksIG9wdGlvbnMuc2lnbmFsKTtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBlY2hhcnRzIHRoZW1lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVGhlIHNsaWNlIG9mIGFuIEVjaGFydHMgb3B0aW9uIHRoYXQgY2FycmllcyBicmFuZCBpZGVudGl0eTogdGhlIHNlcmllc1xuICogY29sb3IgY3ljbGUgYW5kIHRoZSBiYXNlIHRleHQgc3R5bGUgKGZvbnQgZmFtaWx5ICsgZm9yZWdyb3VuZCBjb2xvcikuXG4gKiBEZXJpdmVkIGZyb20gYSB7QGxpbmsgQnJhbmRDb250ZXh0fSBieSB7QGxpbmsgYnJhbmRDaGFydFRoZW1lfSBhbmQgbWVyZ2VkXG4gKiBpbnRvIGV2ZXJ5IHNwZWMgYnkge0BsaW5rIHBsYW5Ub0VjaGFydHNPcHRpb259LlxuICovXG5pbnRlcmZhY2UgQ2hhcnRUaGVtZSB7XG4gIGNvbG9yOiBzdHJpbmdbXTtcbiAgdGV4dFN0eWxlOiB7IGZvbnRGYW1pbHk6IHN0cmluZzsgY29sb3I6IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIEFwcEtpdCdzIGNhdGVnb3JpY2FsIGNoYXJ0IHBhbGV0dGUgKGAtLWNoYXJ0LWNhdC0xYCAuLiBgLS1jaGFydC1jYXQtOGAgZnJvbVxuICogYEBkYXRhYnJpY2tzL2FwcGtpdC11aWApLCBhcyBoZXguIFNlcnZlci1yZW5kZXJlZCBjaGFydCBzcGVjcyBjYW5ub3QgcmVhZCB0aGVcbiAqIGJyb3dzZXIncyBDU1MgY3VzdG9tIHByb3BlcnRpZXMsIHNvIHRoZSB2YWx1ZXMgYXJlIG1pcnJvcmVkIGhlcmUgdG8ga2VlcCBhXG4gKiBnZW5lcmF0ZWQgY2hhcnQgdmlzdWFsbHkgY29uc2lzdGVudCB3aXRoIHRoZSBBcHBLaXQtc3R5bGVkIFVJIGFyb3VuZCBpdC5cbiAqIEtlZXAgaW4gc3luYyB3aXRoIEFwcEtpdCdzIHN0eWxlc2hlZXQgaWYgaXQgY2hhbmdlcy5cbiAqL1xuY29uc3QgQVBQS0lUX0NIQVJUX1BBTEVUVEUgPSBbXG4gIFwiIzI0NjNFQlwiLCAvLyBibHVlXG4gIFwiIzJFQjg4QVwiLCAvLyB0ZWFsXG4gIFwiI0FCNDdCRFwiLCAvLyBwdXJwbGVcbiAgXCIjRjY5RTIzXCIsIC8vIGFtYmVyXG4gIFwiI0REMkM0RFwiLCAvLyByb3NlXG4gIFwiIzFCQTNCQlwiLCAvLyBjeWFuXG4gIFwiIzlCNjFEMVwiLCAvLyBsYXZlbmRlclxuICBcIiMzNEIyNjJcIiwgLy8gZW1lcmFsZFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBFeHBhbmQgdHdvIGJyYW5kIGhleCBjb2xvcnMgaW50byBhIGxlZ2libGUgY2F0ZWdvcmljYWwgY3ljbGUuIEVjaGFydHNcbiAqIHJlcGVhdHMgdGhlIGBjb2xvcmAgYXJyYXkgYWNyb3NzIHNlcmllcyAvIGNhdGVnb3JpZXMsIHNvIGEgZ29vZCBkZWZhdWx0XG4gKiBuZWVkcyBzZXZlcmFsIGRpc3RpbmN0IGh1ZXMsIG5vdCB0d28uIFdlIHNlZWQgd2l0aCB0aGUgYnJhbmQgcHJpbWFyeSBhbmRcbiAqIGFjY2VudCAodGhlIGlkZW50aXR5IGNvbG9ycykgYW5kIGZvbGxvdyB3aXRoIEFwcEtpdCdzIG93biBjYXRlZ29yaWNhbCBjaGFydFxuICogcGFsZXR0ZSwgc28gbXVsdGktc2VyaWVzIC8gbWFueS1zbGljZSBjaGFydHMgc3RheSByZWFkYWJsZSBhbmQgbWF0Y2ggdGhlXG4gKiBzdXJyb3VuZGluZyBBcHBLaXQgVUkgd2hpbGUgdGhlIGZpcnN0IG9uZSBvciB0d28gbWFya3MgbGFuZCBvbi1icmFuZC5cbiAqL1xuZnVuY3Rpb24gYnJhbmRDb2xvckN5Y2xlKHByaW1hcnk6IHN0cmluZywgYWNjZW50OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNwcmVhZCA9IEFQUEtJVF9DSEFSVF9QQUxFVFRFO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHJldHVybiBbcHJpbWFyeSwgYWNjZW50LCAuLi5zcHJlYWRdLmZpbHRlcigoYykgPT4ge1xuICAgIGNvbnN0IGtleSA9IGMudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgIHNlZW4uYWRkKGtleSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlcml2ZSBhbiBFY2hhcnRzIHtAbGluayBDaGFydFRoZW1lfSBmcm9tIGEgYnJhbmQgY29udGV4dDogdGhlIHByaW1hcnkgK1xuICogYWNjZW50IGNvbG9ycyBzZWVkIHRoZSBzZXJpZXMgY3ljbGUsIHRoZSBzYW5zIHN0YWNrIGJlY29tZXMgdGhlIGJhc2UgZm9udCxcbiAqIGFuZCB0aGUgYnJhbmQgZm9yZWdyb3VuZCBiZWNvbWVzIHRoZSBiYXNlIHRleHQgY29sb3IuXG4gKi9cbmZ1bmN0aW9uIGJyYW5kQ2hhcnRUaGVtZShicmFuZDogQnJhbmRDb250ZXh0KTogQ2hhcnRUaGVtZSB7XG4gIHJldHVybiB7XG4gICAgY29sb3I6IGJyYW5kQ29sb3JDeWNsZShicmFuZC5jb2xvcnMucHJpbWFyeSwgYnJhbmQuY29sb3JzLmFjY2VudCksXG4gICAgdGV4dFN0eWxlOiB7IGZvbnRGYW1pbHk6IGJyYW5kLnR5cG9ncmFwaHkuc2FucywgY29sb3I6IGJyYW5kLmNvbG9ycy5mb3JlZ3JvdW5kIH0sXG4gIH07XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVjaGFydHMgZXhwYW5zaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRXhwYW5kIGEge0BsaW5rIENoYXJ0UGxhbn0gaW50byBhIGZ1bGwgRWNoYXJ0cyBgRUNoYXJ0c09wdGlvbmBcbiAqIEpTT04uIENlbnRyYWxpemVkIGhlcmUgc28gdGhlIHBsYW5uZXIgYWdlbnQgb25seSBmaWxscyBpbiB0aGVcbiAqIGNvbXBhY3QgcGxhbiBzaGFwZTsgdG9vbHRpcCAvIGFuaW1hdGlvbiAvIGNvbG9yIC8gZ3JpZCBkZWZhdWx0c1xuICogc3RheSBjb25zaXN0ZW50IGFjcm9zcyBjaGFydHMgYW5kIGFyZSBlYXN5IHRvIHR1bmUgd2l0aG91dFxuICogcmV0cmFpbmluZyBtb2RlbCBiZWhhdmlvdXIuXG4gKlxuICogV2hlbiBgYnJhbmRgIGlzIHNldCwgdGhlIHJlc29sdmVkIHNwZWMgaXMgdGhlbWVkIHdpdGggdGhlIGJyYW5kJ3Mgc2VyaWVzXG4gKiBjb2xvciBjeWNsZSBhbmQgYmFzZSB0ZXh0IHN0eWxlIChzZWUge0BsaW5rIGJyYW5kQ2hhcnRUaGVtZX0pOyBvdGhlcndpc2VcbiAqIEVjaGFydHMnIGRlZmF1bHRzIGFwcGx5LlxuICovXG5mdW5jdGlvbiBwbGFuVG9FY2hhcnRzT3B0aW9uKFxuICBwbGFuOiBDaGFydFBsYW4sXG4gIGZhbGxiYWNrVGl0bGU6IHN0cmluZyxcbiAgYnJhbmQ/OiBCcmFuZENvbnRleHQsXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IGJhc2VUaXRsZSA9IHBsYW4udGl0bGUgPz8gZmFsbGJhY2tUaXRsZTtcbiAgY29uc3QgZ3JpZCA9IHsgbGVmdDogNDgsIHJpZ2h0OiAyNCwgdG9wOiA1NiwgYm90dG9tOiA0OCwgY29udGFpbkxhYmVsOiB0cnVlIH07XG4gIGNvbnN0IHRoZW1lID0gYnJhbmQgPyBicmFuZENoYXJ0VGhlbWUoYnJhbmQpIDogdW5kZWZpbmVkO1xuICBjb25zdCB0aGVtZWQgPSAob3B0aW9uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gICAgdGhlbWUgPyB7IC4uLnRoZW1lLCAuLi5vcHRpb24gfSA6IG9wdGlvbjtcblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwicGllXCIpIHtcbiAgICAvLyBFY2hhcnRzIGNyYXNoZXMgb24gbnVsbCBwaWUgc2xpY2VzIC0gZmlsdGVyIHRoZW0gb3V0LlxuICAgIC8vIGB7bmFtZSwgdmFsdWV9YCBzbGljZXMgYXJlIHRoZSBvbmx5IHZhbGlkIHBpZSBkYXRhIHNoYXBlLFxuICAgIC8vIHNvIGRyb3AgYmFyZSBudW1iZXJzIC8gdHVwbGVzIC8gbnVsbHMgdGhlIHBsYW5uZXIgbWF5XG4gICAgLy8gaGF2ZSBsZWFrZWQgaW50byBhIHBpZSBzZXJpZXMuXG4gICAgY29uc3Qgc2xpY2VzID0gKHBsYW4uc2VyaWVzWzBdPy5kYXRhID8/IFtdKS5maWx0ZXIoXG4gICAgICAoZCk6IGQgaXMgeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBudW1iZXIgfSA9PlxuICAgICAgICBkICE9PSBudWxsICYmIHR5cGVvZiBkID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGQpLFxuICAgICk7XG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZTogeyB0ZXh0OiBiYXNlVGl0bGUsIGxlZnQ6IFwiY2VudGVyXCIgfSxcbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJpdGVtXCIgfSxcbiAgICAgIGxlZ2VuZDogeyBib3R0b206IDAgfSxcbiAgICAgIHNlcmllczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogcGxhbi5zZXJpZXNbMF0/Lm5hbWUgPz8gYmFzZVRpdGxlLFxuICAgICAgICAgIHR5cGU6IFwicGllXCIsXG4gICAgICAgICAgcmFkaXVzOiBbXCIzNSVcIiwgXCI2NSVcIl0sXG4gICAgICAgICAgZGF0YTogc2xpY2VzLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJzY2F0dGVyXCIpIHtcbiAgICAvLyBFY2hhcnRzIGNyYXNoZXMgb24gbnVsbCBzY2F0dGVyIHBvaW50cyAtIGtlZXAgb25seSB2YWxpZFxuICAgIC8vIGBbeCwgeV1gIHR1cGxlcy4gQmFyZSBudW1iZXJzIC8gb2JqZWN0cyAvIG51bGxzIGZyb20gYVxuICAgIC8vIG1pc21hdGNoZWQgcGxhbiBnZXQgZHJvcHBlZCBzaWxlbnRseS5cbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlOiB7IHRleHQ6IGJhc2VUaXRsZSwgbGVmdDogXCJjZW50ZXJcIiB9LFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcIml0ZW1cIiB9LFxuICAgICAgbGVnZW5kOiB7IGJvdHRvbTogMCB9LFxuICAgICAgZ3JpZCxcbiAgICAgIHhBeGlzOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi54QXhpc0xhYmVsIH0sXG4gICAgICB5QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgICAgc2VyaWVzOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7XG4gICAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgICAgdHlwZTogXCJzY2F0dGVyXCIsXG4gICAgICAgIGRhdGE6IHMuZGF0YS5maWx0ZXIoKGQpOiBkIGlzIFtudW1iZXIsIG51bWJlcl0gPT4gQXJyYXkuaXNBcnJheShkKSAmJiBkLmxlbmd0aCA9PT0gMiksXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH1cblxuICAvLyBiYXIgLyBsaW5lIC8gYXJlYSBzaGFyZSB0aGUgc2FtZSBheGlzIGxheW91dC5cbiAgY29uc3QgaXNBcmVhID0gcGxhbi5jaGFydFR5cGUgPT09IFwiYXJlYVwiO1xuICBjb25zdCBzZXJpZXNUeXBlID0gcGxhbi5jaGFydFR5cGUgPT09IFwiYmFyXCIgPyBcImJhclwiIDogXCJsaW5lXCI7XG4gIHJldHVybiB0aGVtZWQoe1xuICAgIHRpdGxlOiB7IHRleHQ6IGJhc2VUaXRsZSwgbGVmdDogXCJjZW50ZXJcIiB9LFxuICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJheGlzXCIgfSxcbiAgICBsZWdlbmQ6IHsgYm90dG9tOiAwIH0sXG4gICAgZ3JpZCxcbiAgICB4QXhpczoge1xuICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgZGF0YTogcGxhbi5jYXRlZ29yaWVzID8/IFtdLFxuICAgICAgbmFtZTogcGxhbi54QXhpc0xhYmVsLFxuICAgIH0sXG4gICAgeUF4aXM6IHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnlBeGlzTGFiZWwgfSxcbiAgICBzZXJpZXM6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHtcbiAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgIHR5cGU6IHNlcmllc1R5cGUsXG4gICAgICBkYXRhOiBzLmRhdGEsXG4gICAgICBzbW9vdGg6IHNlcmllc1R5cGUgPT09IFwibGluZVwiLFxuICAgICAgLi4uKGlzQXJlYSA/IHsgYXJlYVN0eWxlOiB7fSB9IDoge30pLFxuICAgIH0pKSxcbiAgfSk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlbmRlcl9kYXRhIHRvb2wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBCdWlsZCB0aGUgYHJlbmRlcl9kYXRhYCBNYXN0cmEgdG9vbCBib3VuZCB0byB0aGUgZ2l2ZW4gcGx1Z2luXG4gKiBjb25maWcuIEF1dG8td2lyZWQgYXMgYSBzeXN0ZW0gdG9vbCBvbiBldmVyeSBhZ2VudCAoc2VlXG4gKiBgYWdlbnRzLnRzYCk7IHBlci1hZ2VudCB0b29scyBjYW4gc2hhZG93IGl0IGJ5IHJlZ2lzdGVyaW5nIGFcbiAqIHNhbWUtbmFtZWQgZW50cnkuXG4gKlxuICogVGhpbiB3cmFwcGVyIG92ZXIge0BsaW5rIHByZXBhcmVDaGFydH0gZm9yIGNhbGxlcnMgdGhhdCBhbHJlYWR5XG4gKiBoYXZlIGEgZGF0YXNldCBpbiBoYW5kLiBNaW50cyBhIGBjaGFydElkYCBzeW5jaHJvbm91c2x5LCBjYWNoZXNcbiAqIGFuIGVtcHR5IHBsYWNlaG9sZGVyLCBhbmQga2lja3Mgb2ZmIHRoZSBjaGFydC1wbGFubmVyIGluIHRoZVxuICogYmFja2dyb3VuZC4gUmV0dXJucyBqdXN0IHRoZSBgY2hhcnRJZGA7IHRoZSBob3N0IFVJIHJlc29sdmVzXG4gKiBgW2NoYXJ0OjxjaGFydElkPl1gIG1hcmtlcnMgYnkgaGl0dGluZyB0aGUgcGx1Z2luJ3NcbiAqIGAvZW1iZWQvY2hhcnQvOmlkYCByb3V0ZS5cbiAqXG4gKiBGb3IgR2VuaWUgc3RhdGVtZW50IHJlc3VsdHMsIHByZWZlciB0aGUgR2VuaWUgYWdlbnQnc1xuICogYHByZXBhcmVfY2hhcnRgIHRvb2wsIHdoaWNoIGFjY2VwdHMgYSBgc3RhdGVtZW50X2lkYCBhbmRcbiAqIHJlc29sdmVzIHRoZSByb3dzIGxhemlseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUmVuZGVyRGF0YVRvb2woY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpIHtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiBcInJlbmRlcl9kYXRhXCIsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZy50b0Rlc2NyaXB0aW9uKFtcbiAgICAgIGBcbiAgICAgICAgU3VibWl0IGEgdGFidWxhciBkYXRhc2V0IGZvciBpbmxpbmUgcmVuZGVyaW5nIGFzIGEgY2hhcnQgaW5cbiAgICAgICAgdGhlIHVzZXIncyB2aWV3LiBQYXNzIGEgdGl0bGUsIHRoZSByYXcgcm93cyAoYXJyYXkgb2Ygb2JqZWN0c1xuICAgICAgICBrZXllZCBieSBjb2x1bW4gbmFtZSksIGFuZCBhbiBvcHRpb25hbCBvbmUtbGluZSBkZXNjcmlwdGlvblxuICAgICAgICBvZiB0aGUgaW5zaWdodCB0byBoaWdobGlnaHQuIFJldHVybnMgYSBzaG9ydCBcXGBjaGFydElkXFxgO1xuICAgICAgICB0aGUgY2hhcnQgcmVuZGVycyBpbmxpbmUgYXQgdGhlIHBvc2l0aW9uIHlvdSBlbWJlZCB0aGVcbiAgICAgICAgbWF0Y2hpbmcgXFxgW2NoYXJ0OjxjaGFydElkPl1cXGAgbWFya2VyLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgUGxhY2VtZW50IGNvbnRyYWN0OiBlbWJlZCBcXGBbY2hhcnQ6PGNoYXJ0SWQ+XVxcYCBvbiBpdHMgb3duXG4gICAgICAgIGxpbmUgKGJsYW5rIGxpbmVzIGFib3ZlIGFuZCBiZWxvdykgd2hlcmV2ZXIgeW91IHdhbnQgdGhlXG4gICAgICAgIGNoYXJ0IHRvIGFwcGVhciBpbiB5b3VyIHJlcGx5LiBUaGUgY2hhcnQgcmVzb2x2ZXNcbiAgICAgICAgYXN5bmNocm9ub3VzbHkgLSB0aGUgdG9vbCByZXR1cm5zIHRoZSBpZCBpbW1lZGlhdGVseSBhbmQgdGhlXG4gICAgICAgIGhvc3QgVUkgZmV0Y2hlcyB0aGUgY2hhcnQgZnJvbSB0aGUgY2FjaGUgb25jZSB0aGUgcGxhbm5lclxuICAgICAgICBsYW5kcy4gWW91IGNhbiBjYWxsIFxcYHJlbmRlcl9kYXRhXFxgIG11bHRpcGxlIHRpbWVzIGluIHRoZVxuICAgICAgICBzYW1lIHR1cm4gKHRoZSB0b29sIGlzIHBhcmFsbGVsLXNhZmUpIGFuZCBpbnRlcmxlYXZlIHRoZVxuICAgICAgICBtYXJrZXJzIHdpdGggcHJvc2Ugc28gZWFjaCBjaGFydCBzaXRzIG5leHQgdG8gaXRzXG4gICAgICAgIGNvbW1lbnRhcnkuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBVc2Ugd2hlbmV2ZXIgYSBTUUwgcm93IHNldCwgQVBJIHJlc3BvbnNlLCBvciBoYW5kLWJ1aWx0XG4gICAgICAgIGRhdGFzZXQgd291bGQgbGFuZCBiZXR0ZXIgYXMgYSBwaWN0dXJlIHRoYW4gYXMgYSBsaXN0IG9yXG4gICAgICAgIHRhYmxlLiBDYXAgaW5wdXQgYXQgYSBmZXcgaHVuZHJlZCByb3dzOyBzYW1wbGUgb3IgYWdncmVnYXRlXG4gICAgICAgIGxhcmdlciBkYXRhc2V0cyBmaXJzdC5cbiAgICAgIGAsXG4gICAgXSksXG4gICAgaW5wdXRTY2hlbWE6IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEsXG4gICAgb3V0cHV0U2NoZW1hOiB3aXJlLkNoYXJ0U2NoZW1hLnBpY2soeyBjaGFydElkOiB0cnVlIH0pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dCwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCB7IHRpdGxlLCBkZXNjcmlwdGlvbiwgZGF0YSB9ID0gaW5wdXQgYXMgQ2hhcnRQbGFubmVyUmVxdWVzdDtcbiAgICAgIGNvbnN0IGN0eCA9IGN0eFJhdyBhcyB7IHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQgfSB8IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBwcmVwYXJlQ2hhcnQoe1xuICAgICAgICBjb25maWcsXG4gICAgICAgIHVzZXJLZXk6IHJlc29sdmVVc2VyS2V5KGN0eD8ucmVxdWVzdENvbnRleHQpLFxuICAgICAgICB0aXRsZSxcbiAgICAgICAgLi4uKGRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgICByZXNvbHZlRGF0YTogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHsgcm93czogZGF0YSB9KSxcbiAgICAgICAgLi4uKGN0eD8ucmVxdWVzdENvbnRleHQgPyB7IHJlcXVlc3RDb250ZXh0OiBjdHgucmVxdWVzdENvbnRleHQgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufVxuIl19
|
|
638
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFxQixNQUFNLHdCQUF3QixDQUFDO0FBQzVGLE9BQU8sRUFBRSxJQUFJLEVBQWdDLE1BQU0sMEJBQTBCLENBQUM7QUFDOUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QixPQUFPLEVBQUUsY0FBYyxFQUEyQixNQUFNLGFBQWEsQ0FBQztBQUN0RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXhDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7QUFFMUMsNkVBQTZFO0FBRTdFOzs7Ozs7R0FNRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUVwQyxzREFBc0Q7QUFDdEQsTUFBTSxxQkFBcUIsR0FBRyxjQUFjLENBQUM7QUFFN0MsbUVBQW1FO0FBQ25FLE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFDO0FBRXhDLHVEQUF1RDtBQUN2RCxNQUFNLHlCQUF5QixHQUFHLEdBQUcsQ0FBQztBQUV0QyxvRUFBb0U7QUFDcEUsTUFBTSxvQkFBb0IsR0FBRyx5QkFBeUIsQ0FBQztBQUV2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TSxFQUFFLEVBQUU7WUFDL0IsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEdBQUcsS0FBNEIsQ0FBQztZQUNsRSxNQUFNLEdBQUcsR0FBRyxNQUF5RCxDQUFDO1lBQ3RFLE9BQU8sWUFBWSxDQUFDO2dCQUNsQixNQUFNO2dCQUNOLE9BQU8sRUFBRSxjQUFjLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQztnQkFDNUMsS0FBSztnQkFDTCxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUNsRCxHQUFHLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDdkUsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENoYXJ0IHBsYW5uZXIgKyBjaGFydCBjYWNoZS5cbiAqXG4gKiBTZWxmLWNvbnRhaW5lZCBjaGFydCBzdWJzeXN0ZW0gd2l0aCB0d28gbGF5ZXJzOlxuICpcbiAqICAgMS4gSW5uZXIgcGxhbm5lciBhZ2VudCAocHJpdmF0ZSkuIFB1cmUgZGF0YXNldC1pbiAvXG4gKiAgICAgIGBFQ2hhcnRzT3B0aW9uYC1vdXQgYnJhaW4uIERyaXZlbiBieSB7QGxpbmsgcHJlcGFyZUNoYXJ0fTtcbiAqICAgICAgY2FsbGVycyBuZXZlciBpbnN0YW50aWF0ZSBpdCBkaXJlY3RseS5cbiAqICAgMi4ge0BsaW5rIHByZXBhcmVDaGFydH06IG9yY2hlc3RyYXRpb24gb24gdG9wIG9mIHRoZSBwbGFubmVyLlxuICogICAgICBNaW50cyBhIGBjaGFydElkYCwgY2FjaGVzIGFuIGVtcHR5IGB7IGNoYXJ0SWQgfWAgcmVjb3JkXG4gKiAgICAgIHN5bmNocm9ub3VzbHksIHRoZW4gcmVzb2x2ZXMgdGhlIGRhdGFzZXQgYW5kIHJ1bnMgdGhlXG4gKiAgICAgIHBsYW5uZXIgaW4gdGhlIGJhY2tncm91bmQuIFRoZSB0ZXJtaW5hbCBlbnRyeSBzZXR0bGVzIHdpdGhcbiAqICAgICAgZWl0aGVyIGByZXN1bHRgIChzdWNjZXNzKSBvciBgZXJyb3JgIChmYWlsdXJlKS4gQm90aFxuICogICAgICB1bmRlZmluZWQgbWVhbnMgdGhlIGVudHJ5IGlzIHN0aWxsIHByb2Nlc3NpbmcuXG4gKlxuICogVGhlIGNhY2hlIHN1cmZhY2UgKHtAbGluayBmZXRjaENoYXJ0fSkgaXMgdGhlIG9ubHkgc3RhdGUgdGhlXG4gKiBIVFRQIHJvdXRlIGFuZCB0aGUgY2hhcnQtcHJvZHVjaW5nIHRvb2xzIHNoYXJlLiBgcHJlcGFyZUNoYXJ0YFxuICogaXMgZGF0YXNldC1hZ25vc3RpYyAtIGNhbGxlcnMgc3VwcGx5IGEgYHJlc29sdmVEYXRhYCBjYWxsYmFja1xuICogdGhhdCBmZXRjaGVzIHRoZSByb3dzIGhvd2V2ZXIgdGhleSBsaWtlIChHZW5pZSBzdGF0ZW1lbnQsIGlubGluZVxuICogZGF0YXNldCwgY3VzdG9tIEFQSSkuIFRoZSBtb2R1bGUgaGFzIG5vIGtub3dsZWRnZSBvZiBHZW5pZSBvclxuICogc3RhdGVtZW50IGlkczsgdGhvc2UgY29uY2VybnMgbGl2ZSBpbiB0aGUgdG9vbHMgdGhhdCB3cmFwIGl0LlxuICpcbiAqIFdpcmUtZm9ybWF0IHNjaGVtYXMgbGl2ZSBpbiBgQGRieC10b29scy9zaGFyZWQtbWFzdHJhYCBzb1xuICogdGhlIGRlbW8gY2xpZW50IGFuZCBhbnkgb3RoZXIgVUkgY29uc3VtZXIgc2hhcmUgdGhlIGV4YWN0IHNhbWVcbiAqIHNoYXBlIHRoaXMgbW9kdWxlIHJlYWRzIGFuZCB3cml0ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IEFwcEtpdEVycm9yLCBDYWNoZU1hbmFnZXIsIEV4ZWN1dGlvbkVycm9yIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXN5bmMsIGVycm9yLCBoYXNoLCBsb2csIHN0cmluZywgdHlwZSBCcmFuZENvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgd2lyZSwgdHlwZSBDaGFydCwgdHlwZSBDaGFydFJlc3VsdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7IG1vZGVsIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHJlc29sdmVVc2VyS2V5LCB0eXBlIE1hc3RyYVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgYnVpbGRNb2RlbCB9IGZyb20gXCIuL21vZGVsLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvY2hhcnRcIik7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVFRMIGZvciBjYWNoZWQgY2hhcnQgZW50cmllcy4gT25lIGhvdXIgYmFsYW5jZXMgXCJsb25nIGVub3VnaCBmb3JcbiAqIHRoZSBob3N0IFVJIHRvIGZldGNoIHRoZSBjaGFydCB3ZWxsIGFmdGVyIHRoZSBtb2RlbCBmaW5pc2hlZFxuICogdGFsa2luZ1wiIGFnYWluc3QgXCJzaG9ydCBlbm91Z2ggdGhhdCBhYmFuZG9uZWQgY2hhcnQgaWRzIGRvbid0XG4gKiBwaW4gc3RvcmFnZVwiLiBNYXRjaGVzIHRoZSB0eXBpY2FsIERhdGFicmlja3MgT0JPIHRva2VuIGxpZmV0aW1lXG4gKiBzbyBhbnkgZGF0YSByZS1yZXNvbHV0aW9uIHN0YXlzIGluc2lkZSB0aGUgb3JpZ2luYWwgYXV0aCB3aW5kb3cuXG4gKi9cbmNvbnN0IENIQVJUX0NBQ0hFX1RUTF9TRUMgPSA2MCAqIDYwO1xuXG4vKiogQ2FjaGUgbmFtZXNwYWNlOyBrZWVwcyB0aGUgY2hhcnQga2V5c3BhY2UgdGlkeS4gKi9cbmNvbnN0IENIQVJUX0NBQ0hFX05BTUVTUEFDRSA9IFwibWFzdHJhOmNoYXJ0XCI7XG5cbi8qKiBEZWZhdWx0IHNlcnZlci1zaWRlIGxvbmctcG9sbCBidWRnZXQgZm9yIHtAbGluayBmZXRjaENoYXJ0fS4gKi9cbmNvbnN0IERFRkFVTFRfRkVUQ0hfVElNRU9VVF9NUyA9IDYwXzAwMDtcblxuLyoqIERlZmF1bHQgaW50ZXItcG9sbCBzbGVlcCBmb3Ige0BsaW5rIGZldGNoQ2hhcnR9LiAqL1xuY29uc3QgREVGQVVMVF9GRVRDSF9JTlRFUlZBTF9NUyA9IDI1MDtcblxuLyoqIFN0YWJsZSB0ZXh0IHN0b3JlZCBvbiBhIGNoYXJ0IGVudHJ5IHdob3NlIHBsYW5uZXIgcnVuIGZhaWxlZC4gKi9cbmNvbnN0IENIQVJUX0ZBSUxFRF9NRVNTQUdFID0gXCJDaGFydCBnZW5lcmF0aW9uIGZhaWxlZFwiO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNjaGVtYXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE9uZSBzZXJpZXMgZGF0YSBwb2ludC4gV2lkZSB2YXJpYW50IHNldCBzbyB0aGUgcGxhbm5lciBhZ2VudCBjYW5cbiAqIGZhaXRoZnVsbHkgcGFzcyB0aHJvdWdoIHdoYXRldmVyIHRoZSBTUUwgcm93IHNldCBjb250YWluZWRcbiAqIChudW1iZXJzLCBzdHJpbmdpZmllZCBudW1iZXJzLCBudWxscyBmb3IgbWlzc2luZyBtZWFzdXJlbWVudHMsXG4gKiBgW3gsIHldYCB0dXBsZXMgZm9yIHNjYXR0ZXIsIGB7bmFtZSwgdmFsdWV9YCBzbGljZXMgZm9yIHBpZSlcbiAqIHdpdGhvdXQgdGhlIHN0cnVjdHVyZWQtb3V0cHV0IGd1YXJkIHJlamVjdGluZyB0aGUgd2hvbGUgcGxhbi5cbiAqXG4gKiBUaHJlZSBsYXllcnMgb2YgdG9sZXJhbmNlOlxuICpcbiAqICAgMS4ge0BsaW5rIHoucHJlcHJvY2Vzc30gbm9ybWFsaXplcyB3aXJlIHNoYXBlcyBCRUZPUkUgdW5pb25cbiAqICAgICAgZGlzcGF0Y2g6IHN0cmluZ2lmaWVkIG51bWJlcnMgcGFyc2UgdG8gbnVtYmVycywgZmluaXRlXG4gKiAgICAgIGNoZWNrcyByZWplY3QgYE5hTmAgLyBgSW5maW5pdHlgLCAyLWVsZW1lbnQgYXJyYXlzIGNvZXJjZVxuICogICAgICB0dXBsZSBjb21wb25lbnRzLCBhbmQgYHt2YWx1ZX1gIG9iamVjdHMgd2l0aCBtaXNzaW5nIC9cbiAqICAgICAgc3RyaW5naWZpZWQgYHZhbHVlYCBnZXQgY29lcmNlZCBvciByZWplY3RlZCB1bmlmb3JtbHkuXG4gKiAgICAgIEFueXRoaW5nIG5vdCBoYW5kbGVhYmxlIGJlY29tZXMgYG51bGxgLlxuICogICAyLiBUaGUgdW5pb24gYWNjZXB0cyBgbnVsbGAgYXMgYSBmaXJzdC1jbGFzcyB2YXJpYW50LiBFY2hhcnRzXG4gKiAgICAgIHJlbmRlcnMgbnVsbCBhcyBhIGdhcCBvbiBiYXIgLyBsaW5lIC8gYXJlYSAod2hpY2ggaXMgdGhlXG4gKiAgICAgIHJpZ2h0IHZpc3VhbCBzaWduYWwgZm9yIFwibWlzc2luZyByZWFkaW5nXCIpLiBTY2F0dGVyIGFuZFxuICogICAgICBwaWUgZmlsdGVyIG51bGxzIGluIHtAbGluayBwbGFuVG9FY2hhcnRzT3B0aW9ufSBiZWNhdXNlXG4gKiAgICAgIEVjaGFydHMgY3Jhc2hlcyBvbiBudWxsIHR1cGxlcyAvIHNsaWNlcy5cbiAqICAgMy4ge0BsaW5rIHoudW5pb24jY2F0Y2h9IGJhY2tzdG9wcyB0aGUgd2hvbGUgdGhpbmc6IGlmXG4gKiAgICAgIHByZXByb2Nlc3Mgc29tZWhvdyBwcm9kdWNlcyBhIHNoYXBlIHRoYXQgc3RpbGwgZG9lc24ndFxuICogICAgICBtYXRjaCBhbnkgdmFyaWFudCwgdGhlIGJhZCBpdGVtIGJlY29tZXMgYG51bGxgIGluc3RlYWQgb2ZcbiAqICAgICAgdGFraW5nIGRvd24gdGhlIGVudGlyZSBjaGFydCB3aXRoIGFcbiAqICAgICAgYFN0cnVjdHVyZWQgb3V0cHV0IHZhbGlkYXRpb24gZmFpbGVkYCBlcnJvci5cbiAqL1xuY29uc3QgY2hhcnREYXRhUG9pbnRTY2hlbWEgPSB6XG4gIC5wcmVwcm9jZXNzKFxuICAgICh2KSA9PiB7XG4gICAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHYpID8gdiA6IG51bGw7XG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29uc3QgbiA9IE51bWJlcih2KTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShuKSA/IG4gOiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodikgJiYgdi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgY29uc3QgeCA9IHR5cGVvZiB2WzBdID09PSBcIm51bWJlclwiID8gdlswXSA6IE51bWJlcih2WzBdKTtcbiAgICAgICAgY29uc3QgeSA9IHR5cGVvZiB2WzFdID09PSBcIm51bWJlclwiID8gdlsxXSA6IE51bWJlcih2WzFdKTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh4KSAmJiBOdW1iZXIuaXNGaW5pdGUoeSkgPyBbeCwgeV0gOiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGwgJiYgXCJ2YWx1ZVwiIGluIHYpIHtcbiAgICAgICAgY29uc3Qgb2JqID0gdiBhcyB7IG5hbWU/OiB1bmtub3duOyB2YWx1ZTogdW5rbm93biB9O1xuICAgICAgICBjb25zdCB2YWwgPSB0eXBlb2Ygb2JqLnZhbHVlID09PSBcIm51bWJlclwiID8gb2JqLnZhbHVlIDogTnVtYmVyKG9iai52YWx1ZSk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbCkpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBDb2VyY2UgbnVtZXJpYyAvIGJvb2xlYW4gLyBudWxsaXNoIG5hbWVzIHRvIHN0cmluZ3Mgc28gYVxuICAgICAgICAvLyBwaWUgc2xpY2Uga2V5ZWQgb24gYSB5ZWFyIChgMjAyNGApIG9yIGNhdGVnb3J5IGlkIGlzXG4gICAgICAgIC8vIGFjY2VwdGVkIHdpdGhvdXQgcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgY2F0Y2ggYXJtLlxuICAgICAgICBjb25zdCByYXdOYW1lID0gb2JqLm5hbWU7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgcmF3TmFtZSA9PT0gXCJzdHJpbmdcIiA/IHJhd05hbWUgOiByYXdOYW1lID09IG51bGwgPyBcIlwiIDogU3RyaW5nKHJhd05hbWUpO1xuICAgICAgICByZXR1cm4geyBuYW1lLCB2YWx1ZTogdmFsIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIHoudW5pb24oW1xuICAgICAgei5udW1iZXIoKSxcbiAgICAgIHoubnVsbCgpLFxuICAgICAgLy8gYFt4LCB5XWAgc2NhdHRlciBwb2ludC4gTW9kZWxsZWQgYXMgYSBsZW5ndGgtY29uc3RyYWluZWRcbiAgICAgIC8vIGhvbW9nZW5lb3VzIGFycmF5IHJhdGhlciB0aGFuIGB6LnR1cGxlYDogWm9kIGVtaXRzIGEgdHVwbGUgYXNcbiAgICAgIC8vIEpTT04gU2NoZW1hIDIwMjAtMTIgYHByZWZpeEl0ZW1zYCwgYW5kIERhdGFicmlja3MnIEdlbWluaVxuICAgICAgLy8gZW5kcG9pbnRzIHJlamVjdCBhIGByZXNwb25zZV9qc29uX3NjaGVtYWAgY29udGFpbmluZyBpdFxuICAgICAgLy8gKFwibXVzdCBiZSBhIGJvb2xlYW4gb3IgYW4gb2JqZWN0XCIsIHNpbmNlIGBpdGVtc2AgaXMgYWJzZW50KS5cbiAgICAgIC8vIGB6LmFycmF5KHoubnVtYmVyKCkpLmxlbmd0aCgyKWAgZW1pdHMgYGl0ZW1zYCArIGBtaW5JdGVtc2AgL1xuICAgICAgLy8gYG1heEl0ZW1zYCwgd2hpY2ggZXZlcnkgcHJvdmlkZXIgdW5kZXJzdGFuZHMsIGFuZCB2YWxpZGF0ZXNcbiAgICAgIC8vIHRoZSBzYW1lIHR3by1udW1iZXIgc2hhcGUuXG4gICAgICB6LmFycmF5KHoubnVtYmVyKCkpLmxlbmd0aCgyKSxcbiAgICAgIHoub2JqZWN0KHsgbmFtZTogei5zdHJpbmcoKSwgdmFsdWU6IHoubnVtYmVyKCkgfSksXG4gICAgXSksXG4gIClcbiAgLmNhdGNoKG51bGwpO1xuXG4vKipcbiAqIENvbXBhY3QsIG1vZGVsLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIGFuIEVjaGFydHMgc3BlYy4gVGhlXG4gKiBwbGFubmVyIGFnZW50IGVtaXRzIHRoaXM7IHtAbGluayBwbGFuVG9FY2hhcnRzT3B0aW9ufSBleHBhbmRzIGl0XG4gKiBpbnRvIGEgcmVhbCBgRUNoYXJ0c09wdGlvbmAgSlNPTi4gVHdvIGxheWVycyBiZWNhdXNlIGxldHRpbmcgdGhlXG4gKiBtb2RlbCBmaWxsIGluIGEgZnVsbHktdHlwZWQgYEVDaGFydHNPcHRpb25gIGlzIGJyaXR0bGUgKGh1bmRyZWRzXG4gKiBvZiBvcHRpb25hbCBmaWVsZHMsIGRlZXAgdW5pb25zLCB2ZXJzaW9uLWRlcGVuZGVudCBzaGFwZXMpLiBBXG4gKiBzbWFsbCBcImNoYXJ0IHBsYW5cIiBzY2hlbWEgaXMgbXVjaCBtb3JlIHJlbGlhYmxlIGZvciBhIGZhc3QgbW9kZWxcbiAqIGFuZCBrZWVwcyBhbmltYXRpb24gLyB0b29sdGlwIC8gc3R5bGluZyBkZWZhdWx0cyBjb25zaXN0ZW50XG4gKiBhY3Jvc3MgY2hhcnRzLlxuICovXG5leHBvcnQgY29uc3QgY2hhcnRQbGFuU2NoZW1hID0gei5vYmplY3Qoe1xuICBjaGFydFR5cGU6IHdpcmUuQ2hhcnRUeXBlU2NoZW1hLFxuICB0aXRsZTogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBTaG9ydCB0aXRsZSBzaG93biBhYm92ZSB0aGUgY2hhcnQuIE9wdGlvbmFsOyBkZWZhdWx0cyB0byB0aGVcbiAgICAgICAgXFxgdGl0bGVcXGAgYXJndW1lbnQgdGhlIGNhbGxlciBwYXNzZWQgaW4uXG4gICAgICBgKSxcbiAgICApLFxuICB4QXhpc0xhYmVsOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIEF4aXMgbGFiZWwgYmVsb3cgdGhlIGNoYXJ0LiBVc2VkIGZvciBiYXIgLyBsaW5lIC8gYXJlYSAvIHNjYXR0ZXI7XG4gICAgICAgIGlnbm9yZWQgZm9yIHBpZS5cbiAgICAgIGApLFxuICAgICksXG4gIHlBeGlzTGFiZWw6IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgQXhpcyBsYWJlbCB0byB0aGUgbGVmdCBvZiB0aGUgY2hhcnQuIFVzZWQgZm9yIGJhciAvIGxpbmUgLyBhcmVhIC9cbiAgICAgICAgc2NhdHRlcjsgaWdub3JlZCBmb3IgcGllLlxuICAgICAgYCksXG4gICAgKSxcbiAgY2F0ZWdvcmllczogelxuICAgIC5hcnJheSh6LnN0cmluZygpKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBYLWF4aXMgY2F0ZWdvcnkgbGFiZWxzIGZvciBcXGBiYXJcXGAgLyBcXGBsaW5lXFxgIC8gXFxgYXJlYVxcYCBjaGFydHNcbiAgICAgICAgKG9uZSBwZXIgZGF0YSBwb2ludCBpbiBlYWNoIHNlcmllcykuIE9taXQgZm9yIFxcYHNjYXR0ZXJcXGAgKHVzZXNcbiAgICAgICAgW3gsIHldIHR1cGxlcykgYW5kIFxcYHBpZVxcYCAoZWFjaCBzbGljZSBjYXJyaWVzIGl0cyBvd24gXFxgbmFtZVxcYCkuXG4gICAgICBgKSxcbiAgICApLFxuICBzZXJpZXM6IHpcbiAgICAuYXJyYXkoXG4gICAgICB6Lm9iamVjdCh7XG4gICAgICAgIG5hbWU6IHouc3RyaW5nKCkuZGVzY3JpYmUoXG4gICAgICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICAgICAgTGVnZW5kIG5hbWUgZm9yIHRoaXMgc2VyaWVzLlxuICAgICAgICAgIGApLFxuICAgICAgICApLFxuICAgICAgICBkYXRhOiB6LmFycmF5KGNoYXJ0RGF0YVBvaW50U2NoZW1hKS5kZXNjcmliZShcbiAgICAgICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBEYXRhIHBvaW50cy4gRm9yIFxcYGJhclxcYCAvIFxcYGxpbmVcXGAgLyBcXGBhcmVhXFxgLCBhbiBhcnJheSBvZlxuICAgICAgICAgICAgbnVtYmVycyBhbGlnbmVkIHRvIFxcYGNhdGVnb3JpZXNcXGAuIEZvciBcXGBzY2F0dGVyXFxgLCBhbiBhcnJheVxuICAgICAgICAgICAgb2YgXFxgW3gsIHldXFxgIG51bWVyaWMgdHVwbGVzLiBGb3IgXFxgcGllXFxgLCBhbiBhcnJheSBvZlxuICAgICAgICAgICAgXFxge25hbWUsIHZhbHVlfVxcYCBvYmplY3RzLlxuICAgICAgICAgIGApLFxuICAgICAgICApLFxuICAgICAgfSksXG4gICAgKVxuICAgIC5taW4oMSlcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIE9uZSBvciBtb3JlIHNlcmllcyB0byBwbG90LiBQaWUgY2hhcnRzIHVzZSBleGFjdGx5IG9uZSBzZXJpZXM7XG4gICAgICAgIGJhci9saW5lL2FyZWEgY2FuIHN0YWNrIG11bHRpcGxlIHNlcmllcyBzaGFyaW5nIHRoZSBzYW1lXG4gICAgICAgIFxcYGNhdGVnb3JpZXNcXGAgYXhpcy5cbiAgICAgIGApLFxuICAgICksXG59KTtcblxudHlwZSBDaGFydFBsYW4gPSB6LmluZmVyPHR5cGVvZiBjaGFydFBsYW5TY2hlbWE+O1xuXG4vKipcbiAqIENhbm9uaWNhbCBwbGFubmVyIGlucHV0IHNoYXBlLiBUb29scyB0aGF0IHNvdXJjZSByb3dzIGZyb20gYW5cbiAqIGlubGluZSBkYXRhc2V0IChgcmVuZGVyX2RhdGFgKSB1c2UgaXQgYXMgdGhlaXIgYGlucHV0U2NoZW1hYFxuICogdmVyYmF0aW07IHRvb2xzIHRoYXQgcmVzb2x2ZSByb3dzIGZyb20gYSByZW1vdGUgKGBwcmVwYXJlX2NoYXJ0YFxuICogb3ZlciBhIEdlbmllIHN0YXRlbWVudCkgYG9taXQoeyBkYXRhIH0pYCBhbmQgYGV4dGVuZGAgd2l0aCB0aGVpclxuICogb3duIGlkZW50aWZpZXIgZmllbGQsIHNvIHRoZSBmaWVsZC1sZXZlbCBgLmRlc2NyaWJlKClgIHRleHRcbiAqIHN0YXlzIGEgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aC4gU2VydmVyLW9ubHkgLSB0aGUgVUkgbmV2ZXJcbiAqIHNlZXMgYSBwbGFubmVyIHJlcXVlc3QsIG9ubHkgdGhlIHJlc29sdmVkIHtAbGluayBDaGFydH0uXG4gKi9cbmV4cG9ydCBjb25zdCBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hID0gei5vYmplY3Qoe1xuICB0aXRsZTogei5zdHJpbmcoKS5kZXNjcmliZShcbiAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIENvbmNpc2UgdGl0bGUgc2hvd24gYWJvdmUgdGhlIGNoYXJ0IChlLmcuIFwiVG9wIDEwIFNLVXMgYnkgUmV2ZW51ZVwiKS5cbiAgICAgIGApLFxuICApLFxuICBkZXNjcmlwdGlvbjogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBPbmUtbGluZSBpbnRlbnQgdGhlIGNoYXJ0LXBsYW5uZXIgdXNlcyB3aGVuIHBpY2tpbmcgYSBjaGFydCB0eXBlXG4gICAgICAgIGFuZCBheGlzIGVuY29kaW5ncyAoZS5nLiBcImNvbXBhcmUgcXVhcnRlcmx5IHJldmVudWUgYWNyb3NzXG4gICAgICAgIHJlZ2lvbnNcIiwgXCJoaWdobGlnaHQgdGhlIHN0ZWVwIGRyb3AgYWZ0ZXIgcG9zaXRpb24gNVwiKS4gTm90IHNob3duXG4gICAgICAgIHRvIHRoZSB1c2VyLlxuICAgICAgYCksXG4gICAgKSxcbiAgZGF0YTogelxuICAgIC5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkpXG4gICAgLm5vbmVtcHR5KFwiRGF0YSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHJvd1wiKVxuICAgIC5yZWFkb25seSgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBUYWJ1bGFyIGRhdGFzZXQgdG8gY2hhcnQuIE9uZSBvYmplY3QgcGVyIHJvdywga2V5ZWQgYnkgY29sdW1uXG4gICAgICAgIG5hbWUuIFZhbHVlcyBtYXkgYmUgc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMsIG9yIG51bGwuIFRoZVxuICAgICAgICBjaGFydC1wbGFubmVyIGRlY2lkZXMgd2hpY2ggY29sdW1ucyBhcmUgY2F0ZWdvcmllcyB2cy4gbnVtZXJpY1xuICAgICAgICBzZXJpZXMuIENhcCBhdCBhIGZldyBodW5kcmVkIHJvd3MgZm9yIGxlZ2liaWxpdHk7IHNhbXBsZSAvXG4gICAgICAgIGFnZ3JlZ2F0ZSBsYXJnZXIgZGF0YXNldHMgZmlyc3QuXG4gICAgICBgKSxcbiAgICApLFxufSk7XG5cbmV4cG9ydCB0eXBlIENoYXJ0UGxhbm5lclJlcXVlc3QgPSB6LmluZmVyPHR5cGVvZiBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hPjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBsYW5uZXIgaW5zdHJ1Y3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEZvcm1hdCB7QGxpbmsgd2lyZS5DaGFydFR5cGVTY2hlbWF9J3MgdmFyaWFudHMgYXMgYSBzaW5nbGVcbiAqIGh1bWFuLWZyaWVuZGx5IHN0cmluZyBvZiBgYCBgPHZhbHVlPmAgZm9yIDxkZXNjcmlwdGlvbj4gYGBcbiAqIGNsYXVzZXMgam9pbmVkIGJ5IHNlbWljb2xvbnMsIGRyYXduIGZyb20gZWFjaCB2YXJpYW50J3Mgb3duXG4gKiBgLmRlc2NyaWJlKClgIHNvIHRoZSBwbGFubmVyIHByb21wdCBzdGF5cyBpbiBsb2NrLXN0ZXAgd2l0aFxuICogdGhlIHNjaGVtYSBieSBjb25zdHJ1Y3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdENoYXJ0VHlwZVBpY2tlcigpOiBzdHJpbmcge1xuICByZXR1cm4gd2lyZS5DaGFydFR5cGVTY2hlbWEub3B0aW9uc1xuICAgIC5tYXAoKG9wdCkgPT4gYFxcYCR7b3B0LnZhbHVlfVxcYCBmb3IgJHtvcHQuZGVzY3JpcHRpb24gPz8gXCJcIn1gKVxuICAgIC5qb2luKFwiOyBcIik7XG59XG5cbi8qKlxuICogU3lzdGVtIHByb21wdCBmb3IgdGhlIGlubmVyIGNoYXJ0LXBsYW5uaW5nIGFnZW50LiBUdW5lZCBmb3IgYVxuICogZmFzdC10aWVyIG1vZGVsIChIYWlrdSwgR1BULTUtbWluaSwgR2VtaW5pIEZsYXNoIExpdGUpLlxuICovXG5jb25zdCBDSEFSVF9QTEFOTkVSX0lOU1RSVUNUSU9OUyA9IHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgWW91IGRlc2lnbiBBcGFjaGUgRWNoYXJ0cyB2aXN1YWxpemF0aW9ucy4gVGhlIHVzZXIgZ2l2ZXMgeW91IGFcbiAgdGFidWxhciBkYXRhc2V0IChyb3dzIG9mIG9iamVjdHMpIHBsdXMgYSB0aXRsZSBhbmQgYW4gb3B0aW9uYWxcbiAgZGVzY3JpcHRpb24gb2YgdGhlIGludGVudC4gWW91IHByb2R1Y2UgYSBzbWFsbCBjaGFydCBwbGFuIChjaGFydFxuICB0eXBlLCBheGlzIGxhYmVscywgY2F0ZWdvcmllcywgc2VyaWVzKSB0aGF0IGJlc3QgY29udmV5cyB0aGUgZGF0YS5cblxuICBEZWNpc2lvbiBndWlkZS4gUGljayB0aGUgY2hhcnQgdHlwZSB3aG9zZSBkYXRhIHNoYXBlIG1hdGNoZXMgdGhlXG4gIGRhdGFzZXQgYW5kIHRoZSB1c2VyJ3MgaW50ZW50OiAke2Zvcm1hdENoYXJ0VHlwZVBpY2tlcigpfS5cblxuICBXaGVuIGluIGRvdWJ0IGJldHdlZW4gYmFyIGFuZCBsaW5lLCBwcmVmZXIgYmFyIGZvciB1bm9yZGVyZWRcbiAgY2F0ZWdvcmllcyBhbmQgbGluZSBmb3Igb3JkZXJlZCBvbmVzIChkYXRlcywgdGltZSBidWNrZXRzLCByYW5rcykuXG4gIE5ldmVyIHBpY2sgcGllIGZvciBtb3JlIHRoYW4gNyBzbGljZXMuXG5cbiAgRm9yIGJhciAvIGxpbmUgLyBhcmVhOiBwaWNrIG9uZSBjb2x1bW4gYXMgdGhlIGNhdGVnb3J5IGF4aXMgKHVzdWFsbHlcbiAgdGhlIG9ubHkgc3RyaW5nLXZhbHVlZCBjb2x1bW4pIGFuZCBvbmUgb3IgbW9yZSBudW1lcmljIGNvbHVtbnMgYXNcbiAgc2VyaWVzLiBTb3J0IGNhdGVnb3JpZXMgYnkgdGhlIHByaW1hcnkgc2VyaWVzIHZhbHVlIGRlc2NlbmRpbmcgdW5sZXNzXG4gIHRoZSBkYXRhIGlzIG5hdHVyYWxseSBvcmRlcmVkIChkYXRlcywgcmFua3MpLlxuXG4gIEZvciBwaWU6IHBpY2sgdGhlIGNhdGVnb3J5IGNvbHVtbiBmb3Igc2xpY2UgbmFtZXMgYW5kIG9uZSBudW1lcmljXG4gIGNvbHVtbiBmb3Igc2xpY2UgdmFsdWVzLiBFbWl0IGEgc2luZ2xlIHNlcmllcy5cblxuICBGb3Igc2NhdHRlcjogcGljayB0d28gbnVtZXJpYyBjb2x1bW5zIGFuZCBlbWl0IFxcYFt4LCB5XVxcYCB0dXBsZXMgaW4gYVxuICBzaW5nbGUgc2VyaWVzLlxuXG4gIEtlZXAgc2VyaWVzIG5hbWVzIGh1bWFuLXJlYWRhYmxlICh1c2UgdGhlIGNvbHVtbiBuYW1lOyB0aXRsZSBjYXNlIGl0XG4gIGxpZ2h0bHkgaWYgbmVlZGVkKS4gS2VlcCB0aXRsZXMgY29uY2lzZTsgZG8gbm90IHJlcGVhdCB0aGUgdXNlcidzXG4gIHRpdGxlIGluIHhBeGlzTGFiZWwgLyB5QXhpc0xhYmVsLlxuYCk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBsYW5uZXIgYWdlbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBPbmUgcGxhbm5lciBgQWdlbnRgIHBlciBwbHVnaW4gY29uZmlnLiBDYWNoZWQgb24gY29uZmlnIG9iamVjdFxuICogaWRlbnRpdHkgc28gY2FsbGVycyBjYW4gYHByZXBhcmVDaGFydCh7IGNvbmZpZywgLi4uIH0pYCBmcm9tIGFcbiAqIGhvdCBwYXRoIHdpdGhvdXQgcGF5aW5nIHRoZSBBZ2VudC1jb25zdHJ1Y3RvciBjb3N0IGV2ZXJ5IGNhbGwuXG4gKiBgV2Vha01hcGAgbGV0cyByZXRpcmVkIGNvbmZpZ3MgKGUuZy4gdGVzdCByZWNvbmZpZ3VyYXRpb25zKVxuICogcmVsZWFzZSB0aGVpciBhZ2VudCB3aXRob3V0IG1hbnVhbCBldmljdGlvbi5cbiAqL1xuY29uc3QgcGxhbm5lckFnZW50cyA9IG5ldyBXZWFrTWFwPE1hc3RyYVBsdWdpbkNvbmZpZywgQWdlbnQ+KCk7XG5cbmZ1bmN0aW9uIGdldFBsYW5uZXJBZ2VudChjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IEFnZW50IHtcbiAgbGV0IGFnZW50ID0gcGxhbm5lckFnZW50cy5nZXQoY29uZmlnKTtcbiAgaWYgKCFhZ2VudCkge1xuICAgIGFnZW50ID0gbmV3IEFnZW50KHtcbiAgICAgIGlkOiBcImNoYXJ0X3BsYW5uZXJcIixcbiAgICAgIG5hbWU6IFwiQ2hhcnQgUGxhbm5lclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiUGlja3MgY2hhcnQgdHlwZSBhbmQgYXhpcyBlbmNvZGluZ3MgZm9yIGEgZGF0YXNldC5cIixcbiAgICAgIGluc3RydWN0aW9uczogQ0hBUlRfUExBTk5FUl9JTlNUUlVDVElPTlMsXG4gICAgICBtb2RlbDogKHsgcmVxdWVzdENvbnRleHQgfSkgPT5cbiAgICAgICAgYnVpbGRNb2RlbChjb25maWcsIHJlcXVlc3RDb250ZXh0LCB7IG1vZGVsQ2xhc3M6IG1vZGVsLk1vZGVsQ2xhc3MuQ2hhdEZhc3QgfSksXG4gICAgfSk7XG4gICAgcGxhbm5lckFnZW50cy5zZXQoY29uZmlnLCBhZ2VudCk7XG4gIH1cbiAgcmV0dXJuIGFnZW50O1xufVxuXG4vKipcbiAqIFJ1biB0aGUgcGxhbm5lciBhZ2FpbnN0IGByZXF1ZXN0YCBhbmQgcmV0dXJuIHRoZSByZXNvbHZlZFxuICogRWNoYXJ0cyBzcGVjLiBUaHJvd3Mgb24gcGxhbm5lciBmYWlsdXJlIC0ge0BsaW5rIHByZXBhcmVDaGFydH1cbiAqIGNhdGNoZXMgYW5kIHN0YXNoZXMgdGhlIGVycm9yIGluIHRoZSBjYWNoZSBlbnRyeS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuQ2hhcnRQbGFubmVyKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgcmVxdWVzdDogQ2hhcnRQbGFubmVyUmVxdWVzdCxcbiAgb3B0aW9uczogeyByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0OyBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsIH0gPSB7fSxcbik6IFByb21pc2U8Q2hhcnRSZXN1bHQ+IHtcbiAgY29uc3QgeyB0aXRsZSwgZGVzY3JpcHRpb24sIGRhdGEgfSA9IHJlcXVlc3Q7XG4gIGNvbnN0IHsgcmVxdWVzdENvbnRleHQsIGFib3J0U2lnbmFsIH0gPSBvcHRpb25zO1xuICBjb25zdCBwcm9tcHQgPSBzdHJpbmcudG9EZXNjcmlwdGlvbih7XG4gICAgVGl0bGU6IHRpdGxlLFxuICAgIC4uLihkZXNjcmlwdGlvbiA/IHsgRGVzY3JpcHRpb246IGRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgXCJEYXRhc2V0IChKU09OLCBvbmUgcm93IHBlciBvYmplY3QpXCI6IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpLFxuICB9KTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UGxhbm5lckFnZW50KGNvbmZpZykuZ2VuZXJhdGUocHJvbXB0LCB7XG4gICAgc3RydWN0dXJlZE91dHB1dDogeyBzY2hlbWE6IGNoYXJ0UGxhblNjaGVtYSB9LFxuICAgIC4uLihyZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQgfSA6IHt9KSxcbiAgICAuLi4oYWJvcnRTaWduYWwgPyB7IGFib3J0U2lnbmFsIH0gOiB7fSksXG4gIH0pO1xuICBjb25zdCBwbGFuID0gY2hhcnRQbGFuU2NoZW1hLnBhcnNlKHJlc3VsdC5vYmplY3QpO1xuICBjb25zdCBvcHRpb24gPSBwbGFuVG9FY2hhcnRzT3B0aW9uKHBsYW4sIHRpdGxlLCBjb25maWcuYnJhbmQpO1xuICByZXR1cm4geyBjaGFydFR5cGU6IHBsYW4uY2hhcnRUeXBlLCBvcHRpb24gfTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNhY2hlIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogQnVpbGQgdGhlIGNhbm9uaWNhbCBjYWNoZSBrZXkgZm9yIGEgYGNoYXJ0SWRgIG93bmVkIGJ5IGB1c2VyS2V5YC5cbiAqXG4gKiBUaGUgaWRlbnRpdHkgaXMgcGFydCBvZiB0aGUga2V5LCBub3QgYSBmaWx0ZXIgYXBwbGllZCBhZnRlciB0aGUgcmVhZCwgc28gYVxuICogY2hhcnQgaWQgZ3Vlc3NlZCBvciBjb3BpZWQgZnJvbSBhbm90aGVyIHVzZXIncyB0cmFuc2NyaXB0IHJlc29sdmVzIHRvIGFcbiAqIGRpZmZlcmVudCBrZXkgYW5kIHNpbXBseSBtaXNzZXMuIFRoYXQgbWlzcyBpcyB3aGF0IHRoZSBIVFRQIHJvdXRlIHR1cm5zIGludG9cbiAqIGEgNDA0LCB3aGljaCBpcyBhbHNvIHRoZSBhbnN3ZXIgdGhhdCBsZWFrcyB0aGUgbGVhc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoYXJ0Q2FjaGVLZXkoY2hhcnRJZDogc3RyaW5nLCB1c2VyS2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gKGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpKS5nZW5lcmF0ZUtleShbQ0hBUlRfQ0FDSEVfTkFNRVNQQUNFLCBjaGFydElkXSwgdXNlcktleSk7XG59XG5cbi8qKlxuICogUGVyc2lzdCBhIHtAbGluayBDaGFydH0gZW50cnkgdW5kZXIgaXRzIGBjaGFydElkYCwgb3duZWQgYnkgYHVzZXJLZXlgLlxuICogUmVmcmVzaGVzIHRoZSBUVEwgb24gZXZlcnkgd3JpdGUuIENhY2hlLWxheWVyIGZhaWx1cmVzIGFyZSBsb2dnZWQgYW5kXG4gKiBzd2FsbG93ZWQgc28gYmFja2dyb3VuZCBydW5uZXJzIG5ldmVyIHRocm93IGludG8gdGhlXG4gKiB1bmhhbmRsZWQtcmVqZWN0aW9uIHN0cmVhbS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVDaGFydChlbnRyeTogQ2hhcnQsIHVzZXJLZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNoYXJ0Q2FjaGVLZXkoZW50cnkuY2hhcnRJZCwgdXNlcktleSk7XG4gICAgYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLnNldChrZXksIGVudHJ5LCB7XG4gICAgICB0dGw6IENIQVJUX0NBQ0hFX1RUTF9TRUMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwid3JpdGUtZXJyb3JcIiwge1xuICAgICAgY2hhcnRJZDogZW50cnkuY2hhcnRJZCxcbiAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIExvb2sgdXAgYSBjaGFydCBgdXNlcktleWAgb3ducy4gUmV0dXJucyBgdW5kZWZpbmVkYCBvbiBtaXNzLCBvblxuICogZXhwaXJ5LCB3aGVuIGFub3RoZXIgaWRlbnRpdHkgb3ducyB0aGUgaWQsIG9yIHdoZW4gdGhlIGNhY2hlIGxheWVyIGlzXG4gKiB1bmhlYWx0aHkgLSBuZXZlciB0aHJvd3MuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDaGFydChjaGFydElkOiBzdHJpbmcsIHVzZXJLZXk6IHN0cmluZyk6IFByb21pc2U8Q2hhcnQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBjaGFydENhY2hlS2V5KGNoYXJ0SWQsIHVzZXJLZXkpO1xuICAgIGNvbnN0IHYgPSBhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCkuZ2V0PENoYXJ0PihrZXkpO1xuICAgIHJldHVybiB2ID8/IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJyZWFkLWVycm9yXCIsIHtcbiAgICAgIGNoYXJ0SWQsXG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJlcGFyZUNoYXJ0IG9yY2hlc3RyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIElucHV0cyB0byB7QGxpbmsgcHJlcGFyZUNoYXJ0fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJlcGFyZUNoYXJ0T3B0aW9ucyB7XG4gIC8qKiBQbHVnaW4gY29uZmlnOyByZXNvbHZlcyB0aGUgcGxhbm5lciBhZ2VudCdzIG1vZGVsLiAqL1xuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZztcbiAgLyoqXG4gICAqIElkZW50aXR5IHRoYXQgb3ducyB0aGUgbWludGVkIGNoYXJ0LiBPbmx5IGEge0BsaW5rIGZldGNoQ2hhcnR9IGNhbGxcbiAgICogY2FycnlpbmcgdGhlIHNhbWUga2V5IHJlc29sdmVzIGl0LiBVc2Uge0BsaW5rIHJlc29sdmVVc2VyS2V5fS5cbiAgICovXG4gIHVzZXJLZXk6IHN0cmluZztcbiAgLyoqIERpc3BsYXkgdGl0bGUgZm9yd2FyZGVkIHRvIHRoZSBwbGFubmVyIGFnZW50LiAqL1xuICB0aXRsZT86IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGludGVudCBoaW50IGZvcndhcmRlZCB0byB0aGUgcGxhbm5lciBhZ2VudC4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcm93cyB0byBjaGFydC4gQ2FsbGVkIG9uY2UsIGluIHRoZSBiYWNrZ3JvdW5kLlxuICAgKiBBbnkgdGhyb3duIGVycm9yIGxhbmRzIGluIHRoZSBjYWNoZSBhcyB0aGUgZW50cnkncyBgZXJyb3JgXG4gICAqIGZpZWxkIChuZXZlciBwcm9wYWdhdGVkIHRvIHRoZSBjYWxsZXIgb2Yge0BsaW5rIHByZXBhcmVDaGFydH0pLlxuICAgKiBBbiBlbXB0eSBgcm93c2AgYXJyYXkgaXMgcmVqZWN0ZWQgYXMgYFwiZGF0YXNldCBoYXMgbm8gcm93cztcbiAgICogbm90aGluZyB0byBjaGFydFwiYC5cbiAgICovXG4gIHJlc29sdmVEYXRhOiAoc2lnbmFsPzogQWJvcnRTaWduYWwpID0+IFByb21pc2U8eyByb3dzOiBSZWFkb25seUFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB9PjtcbiAgLyoqXG4gICAqIFBlci1yZXF1ZXN0IGBSZXF1ZXN0Q29udGV4dGAuIEZvcndhcmRlZCB0byB0aGUgcGxhbm5lciBhZ2VudCBzb1xuICAgKiB1c2VyLXNjb3BlZCBtb2RlbCByZXNvbHV0aW9uIChPQk8pIHN0YXlzIGluIGVmZmVjdC5cbiAgICovXG4gIHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQ7XG4gIC8qKlxuICAgKiBDb29wZXJhdGl2ZSBjYW5jZWxsYXRpb24uIEZvcndhcmRlZCB0byBgcmVzb2x2ZURhdGFgIGFuZCB0aGVcbiAgICogcGxhbm5lciBhZ2VudC4gTm90ZTogdGhlIGNoYXJ0IHRhc2sgY29udGludWVzIHJ1bm5pbmcgaW4gdGhlXG4gICAqIGJhY2tncm91bmQgYWZ0ZXIgdGhlIHBhcmVudCByZXF1ZXN0IGVuZHMsIHNvIGV4dGVybmFsIGFib3J0XG4gICAqIHNpZ25hbHMgYXJlIGJlc3QtZWZmb3J0OyB0eXBpY2FsIHVzZSBpcyB0byBsZWF2ZSB0aGlzIHVuc2V0XG4gICAqIGFuZCBsZXQgdGhlIDFoIFRUTCBjYXAgc3RhbGUgZW50cmllcy5cbiAgICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKipcbiAqIE1pbnQgYSBgY2hhcnRJZGAsIGNhY2hlIGFuIGVtcHR5IGB7IGNoYXJ0SWQgfWAgcGxhY2Vob2xkZXJcbiAqIHN5bmNocm9ub3VzbHksIGFuZCBraWNrIG9mZiBhIGJhY2tncm91bmQgdGFzayB0aGF0IHJlc29sdmVzIHRoZVxuICogZGF0YXNldCBhbmQgcnVucyB0aGUgcGxhbm5lci4gUmV0dXJucyB0aGUgYGNoYXJ0SWRgIG9uY2UgdGhlXG4gKiBwbGFjZWhvbGRlciBsYW5kcyBzbyB0aGUgZmlyc3Qge0BsaW5rIGZldGNoQ2hhcnR9IGNhbGwgYWx3YXlzXG4gKiBzZWVzIGFuIGVudHJ5IChubyBzcHVyaW91cyA0MDQgcmFjZSkuXG4gKlxuICogVGhlIGJhY2tncm91bmQgdGFzayBzd2FsbG93cyBpdHMgb3duIGZhaWx1cmVzIGFuZCB3cml0ZXMgdGhlbVxuICogYXMgYGVycm9yYCBlbnRyaWVzLCBzbyBjYWxsZXJzIG5ldmVyIHNlZSBhIHJlamVjdGVkIHByb21pc2UuXG4gKiBDYWNoZSBzdGF0ZSBtYWNoaW5lOlxuICpcbiAqICAgLSBqdXN0IGFmdGVyIHRoaXMgY2FsbCByZXR1cm5zOiBgeyBjaGFydElkIH1gIChwcm9jZXNzaW5nKVxuICogICAtIG9uIHBsYW5uZXIgc3VjY2VzczogICAgICAgICAgIGB7IGNoYXJ0SWQsIHJlc3VsdCB9YFxuICogICAtIG9uIGRhdGEgLyBwbGFubmVyIGZhaWx1cmU6ICAgIGB7IGNoYXJ0SWQsIGVycm9yIH1gXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVwYXJlQ2hhcnQob3B0czogUHJlcGFyZUNoYXJ0T3B0aW9ucyk6IFByb21pc2U8eyBjaGFydElkOiBzdHJpbmcgfT4ge1xuICBjb25zdCBjaGFydElkID0gaGFzaC5pZCgpO1xuICBhd2FpdCB3cml0ZUNoYXJ0KHsgY2hhcnRJZCB9LCBvcHRzLnVzZXJLZXkpO1xuICBsb2dnZXIuZGVidWcoXCJxdWV1ZWRcIiwgeyBjaGFydElkIH0pO1xuICAvLyBGaXJlLWFuZC1mb3JnZXQuIEZhaWx1cmVzIGxhbmQgaW4gdGhlIGNhY2hlIGFzIGBlcnJvcmAgZW50cmllcztcbiAgLy8gbmV2ZXIgZXNjYXBlIGludG8gYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgdm9pZCBydW5QcmVwYXJlQ2hhcnQoY2hhcnRJZCwgb3B0cyk7XG4gIHJldHVybiB7IGNoYXJ0SWQgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUHJlcGFyZUNoYXJ0KGNoYXJ0SWQ6IHN0cmluZywgb3B0czogUHJlcGFyZUNoYXJ0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBvcHRzLnJlc29sdmVEYXRhKG9wdHMuc2lnbmFsKTtcbiAgICBpZiAoZGF0YS5yb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwiRGF0YXNldCBoYXMgbm8gcm93czsgbm90aGluZyB0byBjaGFydFwiKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuQ2hhcnRQbGFubmVyKFxuICAgICAgb3B0cy5jb25maWcsXG4gICAgICB7XG4gICAgICAgIHRpdGxlOiBvcHRzLnRpdGxlID8/IFwiQ2hhcnRcIixcbiAgICAgICAgLi4uKG9wdHMuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiBvcHRzLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIGRhdGE6IGRhdGEucm93cyBhcyBDaGFydFBsYW5uZXJSZXF1ZXN0W1wiZGF0YVwiXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC4uLihvcHRzLnJlcXVlc3RDb250ZXh0ID8geyByZXF1ZXN0Q29udGV4dDogb3B0cy5yZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgICAgICAuLi4ob3B0cy5zaWduYWwgPyB7IGFib3J0U2lnbmFsOiBvcHRzLnNpZ25hbCB9IDoge30pLFxuICAgICAgfSxcbiAgICApO1xuICAgIGF3YWl0IHdyaXRlQ2hhcnQoeyBjaGFydElkLCByZXN1bHQgfSwgb3B0cy51c2VyS2V5KTtcbiAgICBsb2dnZXIuaW5mbyhcImRvbmVcIiwge1xuICAgICAgY2hhcnRJZCxcbiAgICAgIGNoYXJ0VHlwZTogcmVzdWx0LmNoYXJ0VHlwZSxcbiAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJlcnJvclwiLCB7IGNoYXJ0SWQsIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICAvLyBUaGUgZW50cnkncyBgZXJyb3JgIGlzIHJlbmRlcmVkIGluIHRoZSBjaGF0LCBzbyBvbmx5IGFuIEFwcEtpdEVycm9yJ3NcbiAgICAvLyBvd24gbWVzc2FnZSB0cmF2ZWxzOyBhbnl0aGluZyBlbHNlIGNvdWxkIGNhcnJ5IHVwc3RyZWFtIHByb3ZpZGVyIGRldGFpbC5cbiAgICBjb25zdCBlcnJUZXh0ID0gZXJyIGluc3RhbmNlb2YgQXBwS2l0RXJyb3IgPyBlcnIubWVzc2FnZSA6IENIQVJUX0ZBSUxFRF9NRVNTQUdFO1xuICAgIGF3YWl0IHdyaXRlQ2hhcnQoeyBjaGFydElkLCBlcnJvcjogZXJyVGV4dCB9LCBvcHRzLnVzZXJLZXkpO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbG9uZy1wb2xsIGZldGNoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIElucHV0cyB0byB7QGxpbmsgZmV0Y2hDaGFydH0uICovXG5leHBvcnQgaW50ZXJmYWNlIEZldGNoQ2hhcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIElkZW50aXR5IHRoZSBjaGFydCBtdXN0IGJlbG9uZyB0by4gQSBjaGFydCBtaW50ZWQgdW5kZXIgYSBkaWZmZXJlbnQga2V5XG4gICAqIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gdW5rbm93biBpZC4gVXNlIHtAbGluayByZXNvbHZlVXNlcktleX0uXG4gICAqL1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZXJ2ZXItc2lkZSBwb2xsaW5nIGJ1ZGdldCBpbiBtcy4gV2hlbiB0aGUgZW50cnkgc3RheXMgaW5cbiAgICogdGhlIHByb2Nlc3Npbmcgc3RhdGUgcGFzdCB0aGlzIHdpbmRvdywgdGhlIGhlbHBlciByZXR1cm5zIHRoZVxuICAgKiBsYXN0IHNlZW4gdmFsdWUgKHN0aWxsIHByb2Nlc3NpbmcpIHNvIHRoZSBjbGllbnQgY2FuIHJlLXBvbGwuXG4gICAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0ZFVENIX1RJTUVPVVRfTVN9ICg2MHMpLlxuICAgKi9cbiAgdGltZW91dE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogUG9sbCBpbnRlcnZhbCBpbiBtcy4gRGVmYXVsdHMgdG9cbiAgICoge0BsaW5rIERFRkFVTFRfRkVUQ0hfSU5URVJWQUxfTVN9ICgyNTBtcykuXG4gICAqL1xuICBpbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uIGhhbmRsZSAoZS5nLiByZXF1ZXN0IGByZXEuc2lnbmFsYCkuICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKipcbiAqIExvbmctcG9sbCB0aGUgY2hhcnQgY2FjaGUgdW50aWwgdGhlIGVudHJ5IHNldHRsZXMgKGByZXN1bHRgIG9yXG4gKiBgZXJyb3JgIHNldCksIHRoZSBlbnRyeSBpcyBtaXNzaW5nLCBvciB0aGUgc2VydmVyLXNpZGUgdGltZW91dFxuICogZWxhcHNlcy5cbiAqXG4gKiBSZXR1cm5zOlxuICogICAtIHRoZSByZXNvbHZlZCB7QGxpbmsgQ2hhcnR9IHdoZW4gaXQgc2V0dGxlZCwgZXJyb3JlZCwgb3JcbiAqICAgICBzdGF5ZWQgaW4gcHJvY2Vzc2luZyBwYXN0IGB0aW1lb3V0TXNgIChzbyB0aGUgY2xpZW50IGNhblxuICogICAgIHJlLXBvbGwpO1xuICogICAtIGB1bmRlZmluZWRgIHdoZW4gdGhlIGVudHJ5IGlzIG1pc3NpbmcsIGV4cGlyZWQsIG9yIG93bmVkIGJ5XG4gKiAgICAgYW5vdGhlciBpZGVudGl0eSAodGhlIGNvbnN1bWVyIHNob3VsZCB0cmVhdCBhcyA0MDQpLlxuICpcbiAqIGBzaWduYWxgIGxldHMgdGhlIGNhbGxlciBjYW5jZWwgYWhlYWQgb2YgdGltZW91dCAoZS5nLiB0aGUgSFRUUFxuICogcmVxdWVzdCBjbG9zZWQpLiBDYW5jZWxsYXRpb24gcHJvcGFnYXRlcyB0byB0aGUgaW50ZXItcG9sbCBzbGVlcFxuICogc28gdGhlIGhlbHBlciByZXR1cm5zIGltbWVkaWF0ZWx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hDaGFydChcbiAgY2hhcnRJZDogc3RyaW5nLFxuICBvcHRpb25zOiBGZXRjaENoYXJ0T3B0aW9ucyxcbik6IFByb21pc2U8Q2hhcnQgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgdGltZW91dE1zID0gb3B0aW9ucy50aW1lb3V0TXMgPz8gREVGQVVMVF9GRVRDSF9USU1FT1VUX01TO1xuICBjb25zdCBpbnRlcnZhbE1zID0gb3B0aW9ucy5pbnRlcnZhbE1zID8/IERFRkFVTFRfRkVUQ0hfSU5URVJWQUxfTVM7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRpbWVvdXRNcztcblxuICBsZXQgbGFzdDogQ2hhcnQgfCB1bmRlZmluZWQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgb3B0aW9ucy5zaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgbGFzdCA9IGF3YWl0IHJlYWRDaGFydChjaGFydElkLCBvcHRpb25zLnVzZXJLZXkpO1xuICAgIGlmICghbGFzdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAobGFzdC5yZXN1bHQgIT09IHVuZGVmaW5lZCB8fCBsYXN0LmVycm9yICE9PSB1bmRlZmluZWQpIHJldHVybiBsYXN0O1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IGRlYWRsaW5lIC0gRGF0ZS5ub3coKTtcbiAgICBpZiAocmVtYWluaW5nIDw9IDApIHJldHVybiBsYXN0O1xuICAgIGF3YWl0IGFzeW5jLnNsZWVwKE1hdGgubWluKGludGVydmFsTXMsIHJlbWFpbmluZyksIG9wdGlvbnMuc2lnbmFsKTtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBlY2hhcnRzIHRoZW1lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVGhlIHNsaWNlIG9mIGFuIEVjaGFydHMgb3B0aW9uIHRoYXQgY2FycmllcyBicmFuZCBpZGVudGl0eTogdGhlIHNlcmllc1xuICogY29sb3IgY3ljbGUgYW5kIHRoZSBiYXNlIHRleHQgc3R5bGUgKGZvbnQgZmFtaWx5ICsgZm9yZWdyb3VuZCBjb2xvcikuXG4gKiBEZXJpdmVkIGZyb20gYSB7QGxpbmsgQnJhbmRDb250ZXh0fSBieSB7QGxpbmsgYnJhbmRDaGFydFRoZW1lfSBhbmQgbWVyZ2VkXG4gKiBpbnRvIGV2ZXJ5IHNwZWMgYnkge0BsaW5rIHBsYW5Ub0VjaGFydHNPcHRpb259LlxuICovXG5pbnRlcmZhY2UgQ2hhcnRUaGVtZSB7XG4gIGNvbG9yOiBzdHJpbmdbXTtcbiAgdGV4dFN0eWxlOiB7IGZvbnRGYW1pbHk6IHN0cmluZzsgY29sb3I6IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIEFwcEtpdCdzIGNhdGVnb3JpY2FsIGNoYXJ0IHBhbGV0dGUgKGAtLWNoYXJ0LWNhdC0xYCAuLiBgLS1jaGFydC1jYXQtOGAgZnJvbVxuICogYEBkYXRhYnJpY2tzL2FwcGtpdC11aWApLCBhcyBoZXguIFNlcnZlci1yZW5kZXJlZCBjaGFydCBzcGVjcyBjYW5ub3QgcmVhZCB0aGVcbiAqIGJyb3dzZXIncyBDU1MgY3VzdG9tIHByb3BlcnRpZXMsIHNvIHRoZSB2YWx1ZXMgYXJlIG1pcnJvcmVkIGhlcmUgdG8ga2VlcCBhXG4gKiBnZW5lcmF0ZWQgY2hhcnQgdmlzdWFsbHkgY29uc2lzdGVudCB3aXRoIHRoZSBBcHBLaXQtc3R5bGVkIFVJIGFyb3VuZCBpdC5cbiAqIEtlZXAgaW4gc3luYyB3aXRoIEFwcEtpdCdzIHN0eWxlc2hlZXQgaWYgaXQgY2hhbmdlcy5cbiAqL1xuY29uc3QgQVBQS0lUX0NIQVJUX1BBTEVUVEUgPSBbXG4gIFwiIzI0NjNFQlwiLCAvLyBibHVlXG4gIFwiIzJFQjg4QVwiLCAvLyB0ZWFsXG4gIFwiI0FCNDdCRFwiLCAvLyBwdXJwbGVcbiAgXCIjRjY5RTIzXCIsIC8vIGFtYmVyXG4gIFwiI0REMkM0RFwiLCAvLyByb3NlXG4gIFwiIzFCQTNCQlwiLCAvLyBjeWFuXG4gIFwiIzlCNjFEMVwiLCAvLyBsYXZlbmRlclxuICBcIiMzNEIyNjJcIiwgLy8gZW1lcmFsZFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBFeHBhbmQgdHdvIGJyYW5kIGhleCBjb2xvcnMgaW50byBhIGxlZ2libGUgY2F0ZWdvcmljYWwgY3ljbGUuIEVjaGFydHNcbiAqIHJlcGVhdHMgdGhlIGBjb2xvcmAgYXJyYXkgYWNyb3NzIHNlcmllcyAvIGNhdGVnb3JpZXMsIHNvIGEgZ29vZCBkZWZhdWx0XG4gKiBuZWVkcyBzZXZlcmFsIGRpc3RpbmN0IGh1ZXMsIG5vdCB0d28uIFdlIHNlZWQgd2l0aCB0aGUgYnJhbmQgcHJpbWFyeSBhbmRcbiAqIGFjY2VudCAodGhlIGlkZW50aXR5IGNvbG9ycykgYW5kIGZvbGxvdyB3aXRoIEFwcEtpdCdzIG93biBjYXRlZ29yaWNhbCBjaGFydFxuICogcGFsZXR0ZSwgc28gbXVsdGktc2VyaWVzIC8gbWFueS1zbGljZSBjaGFydHMgc3RheSByZWFkYWJsZSBhbmQgbWF0Y2ggdGhlXG4gKiBzdXJyb3VuZGluZyBBcHBLaXQgVUkgd2hpbGUgdGhlIGZpcnN0IG9uZSBvciB0d28gbWFya3MgbGFuZCBvbi1icmFuZC5cbiAqL1xuZnVuY3Rpb24gYnJhbmRDb2xvckN5Y2xlKHByaW1hcnk6IHN0cmluZywgYWNjZW50OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNwcmVhZCA9IEFQUEtJVF9DSEFSVF9QQUxFVFRFO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHJldHVybiBbcHJpbWFyeSwgYWNjZW50LCAuLi5zcHJlYWRdLmZpbHRlcigoYykgPT4ge1xuICAgIGNvbnN0IGtleSA9IGMudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgIHNlZW4uYWRkKGtleSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlcml2ZSBhbiBFY2hhcnRzIHtAbGluayBDaGFydFRoZW1lfSBmcm9tIGEgYnJhbmQgY29udGV4dDogdGhlIHByaW1hcnkgK1xuICogYWNjZW50IGNvbG9ycyBzZWVkIHRoZSBzZXJpZXMgY3ljbGUsIHRoZSBzYW5zIHN0YWNrIGJlY29tZXMgdGhlIGJhc2UgZm9udCxcbiAqIGFuZCB0aGUgYnJhbmQgZm9yZWdyb3VuZCBiZWNvbWVzIHRoZSBiYXNlIHRleHQgY29sb3IuXG4gKi9cbmZ1bmN0aW9uIGJyYW5kQ2hhcnRUaGVtZShicmFuZDogQnJhbmRDb250ZXh0KTogQ2hhcnRUaGVtZSB7XG4gIHJldHVybiB7XG4gICAgY29sb3I6IGJyYW5kQ29sb3JDeWNsZShicmFuZC5jb2xvcnMucHJpbWFyeSwgYnJhbmQuY29sb3JzLmFjY2VudCksXG4gICAgdGV4dFN0eWxlOiB7IGZvbnRGYW1pbHk6IGJyYW5kLnR5cG9ncmFwaHkuc2FucywgY29sb3I6IGJyYW5kLmNvbG9ycy5mb3JlZ3JvdW5kIH0sXG4gIH07XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVjaGFydHMgZXhwYW5zaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRXhwYW5kIGEge0BsaW5rIENoYXJ0UGxhbn0gaW50byBhIGZ1bGwgRWNoYXJ0cyBgRUNoYXJ0c09wdGlvbmBcbiAqIEpTT04uIENlbnRyYWxpemVkIGhlcmUgc28gdGhlIHBsYW5uZXIgYWdlbnQgb25seSBmaWxscyBpbiB0aGVcbiAqIGNvbXBhY3QgcGxhbiBzaGFwZTsgdG9vbHRpcCAvIGFuaW1hdGlvbiAvIGNvbG9yIC8gZ3JpZCBkZWZhdWx0c1xuICogc3RheSBjb25zaXN0ZW50IGFjcm9zcyBjaGFydHMgYW5kIGFyZSBlYXN5IHRvIHR1bmUgd2l0aG91dFxuICogcmV0cmFpbmluZyBtb2RlbCBiZWhhdmlvdXIuXG4gKlxuICogV2hlbiBgYnJhbmRgIGlzIHNldCwgdGhlIHJlc29sdmVkIHNwZWMgaXMgdGhlbWVkIHdpdGggdGhlIGJyYW5kJ3Mgc2VyaWVzXG4gKiBjb2xvciBjeWNsZSBhbmQgYmFzZSB0ZXh0IHN0eWxlIChzZWUge0BsaW5rIGJyYW5kQ2hhcnRUaGVtZX0pOyBvdGhlcndpc2VcbiAqIEVjaGFydHMnIGRlZmF1bHRzIGFwcGx5LlxuICovXG5mdW5jdGlvbiBwbGFuVG9FY2hhcnRzT3B0aW9uKFxuICBwbGFuOiBDaGFydFBsYW4sXG4gIGZhbGxiYWNrVGl0bGU6IHN0cmluZyxcbiAgYnJhbmQ/OiBCcmFuZENvbnRleHQsXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IGJhc2VUaXRsZSA9IHBsYW4udGl0bGUgPz8gZmFsbGJhY2tUaXRsZTtcbiAgY29uc3QgZ3JpZCA9IHsgbGVmdDogNDgsIHJpZ2h0OiAyNCwgdG9wOiA1NiwgYm90dG9tOiA0OCwgY29udGFpbkxhYmVsOiB0cnVlIH07XG4gIGNvbnN0IHRoZW1lID0gYnJhbmQgPyBicmFuZENoYXJ0VGhlbWUoYnJhbmQpIDogdW5kZWZpbmVkO1xuICBjb25zdCB0aGVtZWQgPSAob3B0aW9uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gICAgdGhlbWUgPyB7IC4uLnRoZW1lLCAuLi5vcHRpb24gfSA6IG9wdGlvbjtcblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwicGllXCIpIHtcbiAgICAvLyBFY2hhcnRzIGNyYXNoZXMgb24gbnVsbCBwaWUgc2xpY2VzIC0gZmlsdGVyIHRoZW0gb3V0LlxuICAgIC8vIGB7bmFtZSwgdmFsdWV9YCBzbGljZXMgYXJlIHRoZSBvbmx5IHZhbGlkIHBpZSBkYXRhIHNoYXBlLFxuICAgIC8vIHNvIGRyb3AgYmFyZSBudW1iZXJzIC8gdHVwbGVzIC8gbnVsbHMgdGhlIHBsYW5uZXIgbWF5XG4gICAgLy8gaGF2ZSBsZWFrZWQgaW50byBhIHBpZSBzZXJpZXMuXG4gICAgY29uc3Qgc2xpY2VzID0gKHBsYW4uc2VyaWVzWzBdPy5kYXRhID8/IFtdKS5maWx0ZXIoXG4gICAgICAoZCk6IGQgaXMgeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBudW1iZXIgfSA9PlxuICAgICAgICBkICE9PSBudWxsICYmIHR5cGVvZiBkID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGQpLFxuICAgICk7XG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZTogeyB0ZXh0OiBiYXNlVGl0bGUsIGxlZnQ6IFwiY2VudGVyXCIgfSxcbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJpdGVtXCIgfSxcbiAgICAgIGxlZ2VuZDogeyBib3R0b206IDAgfSxcbiAgICAgIHNlcmllczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogcGxhbi5zZXJpZXNbMF0/Lm5hbWUgPz8gYmFzZVRpdGxlLFxuICAgICAgICAgIHR5cGU6IFwicGllXCIsXG4gICAgICAgICAgcmFkaXVzOiBbXCIzNSVcIiwgXCI2NSVcIl0sXG4gICAgICAgICAgZGF0YTogc2xpY2VzLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJzY2F0dGVyXCIpIHtcbiAgICAvLyBFY2hhcnRzIGNyYXNoZXMgb24gbnVsbCBzY2F0dGVyIHBvaW50cyAtIGtlZXAgb25seSB2YWxpZFxuICAgIC8vIGBbeCwgeV1gIHR1cGxlcy4gQmFyZSBudW1iZXJzIC8gb2JqZWN0cyAvIG51bGxzIGZyb20gYVxuICAgIC8vIG1pc21hdGNoZWQgcGxhbiBnZXQgZHJvcHBlZCBzaWxlbnRseS5cbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlOiB7IHRleHQ6IGJhc2VUaXRsZSwgbGVmdDogXCJjZW50ZXJcIiB9LFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcIml0ZW1cIiB9LFxuICAgICAgbGVnZW5kOiB7IGJvdHRvbTogMCB9LFxuICAgICAgZ3JpZCxcbiAgICAgIHhBeGlzOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi54QXhpc0xhYmVsIH0sXG4gICAgICB5QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgICAgc2VyaWVzOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7XG4gICAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgICAgdHlwZTogXCJzY2F0dGVyXCIsXG4gICAgICAgIGRhdGE6IHMuZGF0YS5maWx0ZXIoKGQpOiBkIGlzIFtudW1iZXIsIG51bWJlcl0gPT4gQXJyYXkuaXNBcnJheShkKSAmJiBkLmxlbmd0aCA9PT0gMiksXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH1cblxuICAvLyBiYXIgLyBsaW5lIC8gYXJlYSBzaGFyZSB0aGUgc2FtZSBheGlzIGxheW91dC5cbiAgY29uc3QgaXNBcmVhID0gcGxhbi5jaGFydFR5cGUgPT09IFwiYXJlYVwiO1xuICBjb25zdCBzZXJpZXNUeXBlID0gcGxhbi5jaGFydFR5cGUgPT09IFwiYmFyXCIgPyBcImJhclwiIDogXCJsaW5lXCI7XG4gIHJldHVybiB0aGVtZWQoe1xuICAgIHRpdGxlOiB7IHRleHQ6IGJhc2VUaXRsZSwgbGVmdDogXCJjZW50ZXJcIiB9LFxuICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJheGlzXCIgfSxcbiAgICBsZWdlbmQ6IHsgYm90dG9tOiAwIH0sXG4gICAgZ3JpZCxcbiAgICB4QXhpczoge1xuICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgZGF0YTogcGxhbi5jYXRlZ29yaWVzID8/IFtdLFxuICAgICAgbmFtZTogcGxhbi54QXhpc0xhYmVsLFxuICAgIH0sXG4gICAgeUF4aXM6IHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnlBeGlzTGFiZWwgfSxcbiAgICBzZXJpZXM6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHtcbiAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgIHR5cGU6IHNlcmllc1R5cGUsXG4gICAgICBkYXRhOiBzLmRhdGEsXG4gICAgICBzbW9vdGg6IHNlcmllc1R5cGUgPT09IFwibGluZVwiLFxuICAgICAgLi4uKGlzQXJlYSA/IHsgYXJlYVN0eWxlOiB7fSB9IDoge30pLFxuICAgIH0pKSxcbiAgfSk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlbmRlcl9kYXRhIHRvb2wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBCdWlsZCB0aGUgYHJlbmRlcl9kYXRhYCBNYXN0cmEgdG9vbCBib3VuZCB0byB0aGUgZ2l2ZW4gcGx1Z2luXG4gKiBjb25maWcuIEF1dG8td2lyZWQgYXMgYSBzeXN0ZW0gdG9vbCBvbiBldmVyeSBhZ2VudCAoc2VlXG4gKiBgYWdlbnRzLnRzYCk7IHBlci1hZ2VudCB0b29scyBjYW4gc2hhZG93IGl0IGJ5IHJlZ2lzdGVyaW5nIGFcbiAqIHNhbWUtbmFtZWQgZW50cnkuXG4gKlxuICogVGhpbiB3cmFwcGVyIG92ZXIge0BsaW5rIHByZXBhcmVDaGFydH0gZm9yIGNhbGxlcnMgdGhhdCBhbHJlYWR5XG4gKiBoYXZlIGEgZGF0YXNldCBpbiBoYW5kLiBNaW50cyBhIGBjaGFydElkYCBzeW5jaHJvbm91c2x5LCBjYWNoZXNcbiAqIGFuIGVtcHR5IHBsYWNlaG9sZGVyLCBhbmQga2lja3Mgb2ZmIHRoZSBjaGFydC1wbGFubmVyIGluIHRoZVxuICogYmFja2dyb3VuZC4gUmV0dXJucyBqdXN0IHRoZSBgY2hhcnRJZGA7IHRoZSBob3N0IFVJIHJlc29sdmVzXG4gKiBgW2NoYXJ0OjxjaGFydElkPl1gIG1hcmtlcnMgYnkgaGl0dGluZyB0aGUgcGx1Z2luJ3NcbiAqIGAvZW1iZWQvY2hhcnQvOmlkYCByb3V0ZS5cbiAqXG4gKiBGb3IgR2VuaWUgc3RhdGVtZW50IHJlc3VsdHMsIHByZWZlciB0aGUgR2VuaWUgYWdlbnQnc1xuICogYHByZXBhcmVfY2hhcnRgIHRvb2wsIHdoaWNoIGFjY2VwdHMgYSBgc3RhdGVtZW50X2lkYCBhbmRcbiAqIHJlc29sdmVzIHRoZSByb3dzIGxhemlseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUmVuZGVyRGF0YVRvb2woY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpIHtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiBcInJlbmRlcl9kYXRhXCIsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZy50b0Rlc2NyaXB0aW9uKFtcbiAgICAgIGBcbiAgICAgICAgU3VibWl0IGEgdGFidWxhciBkYXRhc2V0IGZvciBpbmxpbmUgcmVuZGVyaW5nIGFzIGEgY2hhcnQgaW5cbiAgICAgICAgdGhlIHVzZXIncyB2aWV3LiBQYXNzIGEgdGl0bGUsIHRoZSByYXcgcm93cyAoYXJyYXkgb2Ygb2JqZWN0c1xuICAgICAgICBrZXllZCBieSBjb2x1bW4gbmFtZSksIGFuZCBhbiBvcHRpb25hbCBvbmUtbGluZSBkZXNjcmlwdGlvblxuICAgICAgICBvZiB0aGUgaW5zaWdodCB0byBoaWdobGlnaHQuIFJldHVybnMgYSBzaG9ydCBcXGBjaGFydElkXFxgO1xuICAgICAgICB0aGUgY2hhcnQgcmVuZGVycyBpbmxpbmUgYXQgdGhlIHBvc2l0aW9uIHlvdSBlbWJlZCB0aGVcbiAgICAgICAgbWF0Y2hpbmcgXFxgW2NoYXJ0OjxjaGFydElkPl1cXGAgbWFya2VyLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgUGxhY2VtZW50IGNvbnRyYWN0OiBlbWJlZCBcXGBbY2hhcnQ6PGNoYXJ0SWQ+XVxcYCBvbiBpdHMgb3duXG4gICAgICAgIGxpbmUgKGJsYW5rIGxpbmVzIGFib3ZlIGFuZCBiZWxvdykgd2hlcmV2ZXIgeW91IHdhbnQgdGhlXG4gICAgICAgIGNoYXJ0IHRvIGFwcGVhciBpbiB5b3VyIHJlcGx5LiBUaGUgY2hhcnQgcmVzb2x2ZXNcbiAgICAgICAgYXN5bmNocm9ub3VzbHkgLSB0aGUgdG9vbCByZXR1cm5zIHRoZSBpZCBpbW1lZGlhdGVseSBhbmQgdGhlXG4gICAgICAgIGhvc3QgVUkgZmV0Y2hlcyB0aGUgY2hhcnQgZnJvbSB0aGUgY2FjaGUgb25jZSB0aGUgcGxhbm5lclxuICAgICAgICBsYW5kcy4gWW91IGNhbiBjYWxsIFxcYHJlbmRlcl9kYXRhXFxgIG11bHRpcGxlIHRpbWVzIGluIHRoZVxuICAgICAgICBzYW1lIHR1cm4gKHRoZSB0b29sIGlzIHBhcmFsbGVsLXNhZmUpIGFuZCBpbnRlcmxlYXZlIHRoZVxuICAgICAgICBtYXJrZXJzIHdpdGggcHJvc2Ugc28gZWFjaCBjaGFydCBzaXRzIG5leHQgdG8gaXRzXG4gICAgICAgIGNvbW1lbnRhcnkuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBVc2Ugd2hlbmV2ZXIgYSBTUUwgcm93IHNldCwgQVBJIHJlc3BvbnNlLCBvciBoYW5kLWJ1aWx0XG4gICAgICAgIGRhdGFzZXQgd291bGQgbGFuZCBiZXR0ZXIgYXMgYSBwaWN0dXJlIHRoYW4gYXMgYSBsaXN0IG9yXG4gICAgICAgIHRhYmxlLiBDYXAgaW5wdXQgYXQgYSBmZXcgaHVuZHJlZCByb3dzOyBzYW1wbGUgb3IgYWdncmVnYXRlXG4gICAgICAgIGxhcmdlciBkYXRhc2V0cyBmaXJzdC5cbiAgICAgIGAsXG4gICAgXSksXG4gICAgaW5wdXRTY2hlbWE6IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEsXG4gICAgb3V0cHV0U2NoZW1hOiB3aXJlLkNoYXJ0U2NoZW1hLnBpY2soeyBjaGFydElkOiB0cnVlIH0pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dCwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCB7IHRpdGxlLCBkZXNjcmlwdGlvbiwgZGF0YSB9ID0gaW5wdXQgYXMgQ2hhcnRQbGFubmVyUmVxdWVzdDtcbiAgICAgIGNvbnN0IGN0eCA9IGN0eFJhdyBhcyB7IHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQgfSB8IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBwcmVwYXJlQ2hhcnQoe1xuICAgICAgICBjb25maWcsXG4gICAgICAgIHVzZXJLZXk6IHJlc29sdmVVc2VyS2V5KGN0eD8ucmVxdWVzdENvbnRleHQpLFxuICAgICAgICB0aXRsZSxcbiAgICAgICAgLi4uKGRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgICByZXNvbHZlRGF0YTogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHsgcm93czogZGF0YSB9KSxcbiAgICAgICAgLi4uKGN0eD8ucmVxdWVzdENvbnRleHQgPyB7IHJlcXVlc3RDb250ZXh0OiBjdHgucmVxdWVzdENvbnRleHQgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufVxuIl19
|
package/lib/src/config.d.ts
CHANGED
|
@@ -19,8 +19,8 @@ import type { BrandContext } from "@dbx-tools/shared-core";
|
|
|
19
19
|
import type { AgentConfig } from "@mastra/core/agent";
|
|
20
20
|
import type { RequestContext } from "@mastra/core/request-context";
|
|
21
21
|
import type { PgVectorConfig, PostgresStoreConfig } from "@mastra/pg";
|
|
22
|
-
import type { MastraAgentDefinition, MastraTools } from "./agents.
|
|
23
|
-
import type { GenieSpacesConfig } from "./genie.
|
|
22
|
+
import type { MastraAgentDefinition, MastraTools } from "./agents.ts";
|
|
23
|
+
import type { GenieSpacesConfig } from "./genie.ts";
|
|
24
24
|
/**
|
|
25
25
|
* `RequestContext` key under which {@link MastraServer} stores the
|
|
26
26
|
* resolved AppKit user. `model.ts` reads it to mint user-scoped
|