@dbx-tools/appkit-mastra 0.6.216 → 0.6.217

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/src/agents.js CHANGED
@@ -90,8 +90,9 @@ function deriveToolId(description) {
90
90
  * });
91
91
  * ```
92
92
  *
93
- * Returns the definition unchanged - the wrapper exists only to anchor
94
- * type inference and to match the AppKit API surface.
93
+ * Adds the package's default workspace when the definition omits one. That
94
+ * workspace carries Databricks skill mounts and Databricks Sandbox command
95
+ * execution. An explicit workspace remains the caller's complete override.
95
96
  */
96
97
  export function createAgent(def) {
97
98
  if (def.workspace)
@@ -239,8 +240,12 @@ export async function buildAgents(opts) {
239
240
  for (const [id, def] of Object.entries(definitions)) {
240
241
  const tools = await resolveTools(def.tools, plugins, ambientTools);
241
242
  let workspace = resolveAgentWorkspace(def.workspace);
242
- if (extraSkillPaths?.length && isDefaultWorkspace(workspace)) {
243
- workspace = createWorkspace({ extraSkillPaths });
243
+ if ((def.workspace === undefined && !workspace) ||
244
+ ((extraSkillPaths?.length || config.sandbox !== undefined) && isDefaultWorkspace(workspace))) {
245
+ workspace = createWorkspace({
246
+ extraSkillPaths,
247
+ sandbox: config.sandbox === undefined || config.sandbox === true ? "databricks" : config.sandbox,
248
+ });
244
249
  markDefaultWorkspace(workspace);
245
250
  }
246
251
  const gated = approvalGatedToolIds(tools);
@@ -576,4 +581,4 @@ function toolkitEntryToMastraTool(entry, plugin) {
576
581
  },
577
582
  });
578
583
  }
579
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFPLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU3RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFdEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSWhELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVqRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFM0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFtQmxELHlFQUF5RTtBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFaEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCRztBQUNILE1BQU0sVUFBVSxJQUFJLENBQUMsSUFBdUI7SUFDMUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JELE9BQU8sVUFBVSxDQUFDO1FBQ2hCLEVBQUU7UUFDRixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7UUFDN0IsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdELE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBZ0I7S0FDL0IsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQWlDRDs7Ozs7R0FLRztBQUNILFNBQVMsWUFBWSxDQUFDLFdBQW1CO0lBQ3ZDLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFrQyxHQUFNO0lBQ2pFLElBQUksR0FBRyxDQUFDLFNBQVM7UUFBRSxPQUFPLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNyQyxNQUFNLFNBQVMsR0FBRyxlQUFlLEVBQUUsQ0FBQztJQUNwQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoQyxPQUFPLEVBQUUsR0FBRyxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsMkNBQTJDLENBQUMsQ0FBQztBQUVsRixxREFBcUQ7QUFDckQsU0FBUyxvQkFBb0IsQ0FBQyxTQUFvQjtJQUMvQyxTQUFnRCxDQUFDLGlCQUFpQixDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzlFLENBQUM7QUFFRCxtRUFBbUU7QUFDbkUsU0FBUyxrQkFBa0IsQ0FBQyxTQUFnQztJQUMxRCxPQUFPLE9BQU8sQ0FBQyxTQUFTLElBQUssU0FBZ0QsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7QUFDcEcsQ0FBQztBQWdNRCx1RUFBdUU7QUFDdkUsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDO0FBRTNDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0FBRTFDLE1BQU0sMkJBQTJCLEdBQUc7Ozs7Ozs7Ozs7aUNBVUgsQ0FBQztBQUVsQzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRztJQUN4QyxlQUFlO0lBQ2YsRUFBRTtJQUNGLHNFQUFzRTtJQUN0RSw0Q0FBNEM7SUFDNUMsY0FBYztJQUNkLGVBQWU7SUFDZiwrRUFBK0U7SUFDL0UsNERBQTREO0lBQzVELDZFQUE2RTtJQUM3RSxrQkFBa0I7SUFDbEIscURBQXFEO0lBQ3JELG1FQUFtRTtDQUNwRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUViOzs7R0FHRztBQUNILFNBQVMsd0JBQXdCLENBQUMsTUFBMEI7SUFDMUQsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEtBQUssS0FBSztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3BELElBQUksT0FBTyxNQUFNLENBQUMsaUJBQWlCLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDakQsT0FBTyxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDbEMsQ0FBQztJQUVELE9BQU8sMEJBQTBCLENBQUM7QUFDcEMsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsbUJBQW1CLENBQUMsaUJBQXlCLEVBQUUsS0FBb0I7SUFDMUUsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLGlCQUFpQixDQUFDO0lBQ3JDLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxLQUFLLEVBQUUsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLHVCQUF1QixDQUFDLElBQVk7SUFDM0MsT0FBTyw0QkFBNEIsSUFBSSxJQUFJLENBQUM7QUFDOUMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUFDLElBV2pDO0lBQ0MsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDdEUsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxpQkFBaUIsQ0FBQztJQUUxRSxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELGdFQUFnRTtJQUNoRSw4REFBOEQ7SUFDOUQsZ0VBQWdFO0lBQ2hFLHFFQUFxRTtJQUNyRSxxRUFBcUU7SUFDckUsNkRBQTZEO0lBQzdELE1BQU0sV0FBVyxHQUFnQjtRQUMvQixXQUFXLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxDQUFDO1FBQ3hDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7S0FDdEMsQ0FBQztJQUNGLE1BQU0sWUFBWSxHQUFHO1FBQ25CLEdBQUcsV0FBVztRQUNkLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztLQUN4QixDQUFDO0lBQ0YsTUFBTSxLQUFLLEdBQUcsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0MsOERBQThEO0lBQzlELDBEQUEwRDtJQUMxRCx3REFBd0Q7SUFDeEQsb0NBQW9DO0lBQ3BDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxJQUFJLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDakQsTUFBTSxlQUFlLEdBQUc7UUFDdEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0tBQzFFLENBQUM7SUFDRixNQUFNLE1BQU0sR0FBMEIsRUFBRSxDQUFDO0lBQ3pDLE1BQU0sYUFBYSxHQUEyQixFQUFFLENBQUM7SUFDakQsTUFBTSxvQkFBb0IsR0FBa0QsRUFBRSxDQUFDO0lBRS9FLEtBQUssTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDcEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDbkUsSUFBSSxTQUFTLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELElBQUksZUFBZSxFQUFFLE1BQU0sSUFBSSxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzdELFNBQVMsR0FBRyxlQUFlLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDakYsTUFBTSxNQUFNLEdBQUcsYUFBYSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDO1lBQ3JCLEVBQUU7WUFDRixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ3BCLDZEQUE2RDtZQUM3RCwrREFBK0Q7WUFDL0QsNkRBQTZEO1lBQzdELFlBQVk7WUFDWixXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMvRSxZQUFZLEVBQUUsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUM7WUFDMUQsS0FBSyxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUN0QyxjQUFjLEVBQUU7Z0JBQ2QsUUFBUSxFQUFFLE1BQU0sQ0FBQyxhQUFhLElBQUksdUJBQXVCO2FBQzFEO1lBQ0QsS0FBSztZQUNMLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM3QixHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbkMsZUFBZTtZQUNmLGdCQUFnQjtTQUNqQixDQUFDLENBQUM7UUFDSCxpRUFBaUU7UUFDakUsOERBQThEO1FBQzlELGlFQUFpRTtRQUNqRSw0REFBNEQ7UUFDNUQsK0RBQStEO1FBQy9ELGFBQWE7UUFDYixNQUFNLFlBQVksR0FBRyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUQsYUFBYSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQztRQUNqQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzNCLEVBQUU7WUFDRixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ3BCLFlBQVk7WUFDWixLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDMUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUM1QixNQUFNLGtCQUFrQixDQUFDLGdCQUFnQixDQUN2Qyx3QkFBd0IsY0FBYyxHQUFHLEVBQ3pDLHNCQUFzQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUNsRCxDQUFDO0lBQ0osQ0FBQztJQUVELG1DQUFtQyxDQUFDLG9CQUFvQixFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRXpFLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxDQUFDO0FBQ2pFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsS0FBa0I7SUFDckQsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDbkQsT0FBTztRQUNMLEdBQUcsTUFBTTthQUNOLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQy9CLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDbEQsQ0FBQztBQUNKLENBQUM7QUFFRCxpRkFBaUY7QUFDakYsU0FBUyxtQkFBbUIsQ0FBQyxJQUFhO0lBQ3hDLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3BELE9BQVEsSUFBc0MsQ0FBQyxlQUFlLEtBQUssSUFBSSxDQUFDO0FBQzFFLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxJQUFhLEVBQUUsV0FBbUI7SUFDdkQsSUFBSSxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQVEsSUFBd0IsQ0FBQyxFQUFFLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDekYsT0FBUSxJQUF1QixDQUFDLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxtQ0FBbUMsQ0FDMUMsS0FBb0QsRUFDcEQsYUFBd0M7SUFFeEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPO0lBQy9CLElBQUksYUFBYSxFQUFFLGVBQWUsRUFBRTtRQUFFLE9BQU87SUFFN0MsTUFBTSxNQUFNLEdBQUcsS0FBSztTQUNqQixHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxPQUFPLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1NBQ2xFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNkLE1BQU0sSUFBSSxrQkFBa0IsQ0FDMUIsaUdBQWlHO1FBQy9GLDBCQUEwQixNQUFNLElBQUk7UUFDcEMsZ0dBQWdHLENBQ25HLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxTQUFTLHlCQUF5QixDQUFDLE1BQTBCLEVBQUUsR0FBMEI7SUFDdkYsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDO0lBQ25ELElBQUksT0FBTyxTQUFTLEtBQUssUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3BELElBQUksU0FBUyxLQUFLLFNBQVM7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUNoRCxPQUFPLENBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0M7UUFDNUMsTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUUsQ0FDaEMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxNQUEwQjtJQUNwRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzVCLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxtQkFBbUIsRUFBRSxDQUFDO0lBRXpDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3JELE1BQU0sR0FBRyxHQUEwQyxFQUFFLENBQUM7UUFDdEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN2QixNQUFNLEdBQUcsR0FBRyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25DLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxJQUFJLGtCQUFrQixDQUMxQiwrQkFBK0IsR0FBRyx3QkFBd0IsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLEtBQUs7b0JBQzNFLHlDQUF5QyxDQUM1QyxDQUFDO1lBQ0osQ0FBQztZQUNELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCwyRUFBMkU7SUFDM0Usb0RBQW9EO0lBQ3BELElBQUksT0FBUSxLQUErQixDQUFDLFlBQVksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN0RSxNQUFNLEdBQUcsR0FBRyxLQUE4QixDQUFDO1FBQzNDLE1BQU0sR0FBRyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsS0FBOEMsQ0FBQztJQUM5RCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLG1CQUFtQixFQUFFLENBQUM7SUFDbkUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELHdFQUF3RTtBQUN4RSxTQUFTLGNBQWMsQ0FBQyxHQUEwQixFQUFFLEtBQWM7SUFDaEUsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDYixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztJQUN4QixDQUFDO0lBQ0QsT0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLEVBQUUsQ0FBQztBQUNwRSxDQUFDO0FBRUQsd0VBQXdFO0FBQ3hFLFNBQVMsbUJBQW1CO0lBQzFCLE9BQU87UUFDTCxDQUFDLGlCQUFpQixDQUFDLEVBQUU7WUFDbkIsSUFBSSxFQUFFLGVBQWU7WUFDckIsWUFBWSxFQUFFLDJCQUEyQjtTQUMxQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxTQUFTLFlBQVksQ0FDbkIsTUFBMEIsRUFDMUIsUUFBd0M7SUFFeEMsTUFBTSxTQUFTLEdBQUcsUUFBUSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFDbEQsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDNUIsT0FBTyxDQUFDLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUNELElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbEMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDO1FBQzFCLE9BQU8sQ0FBQyxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILEtBQUssVUFBVSxZQUFZLENBQ3pCLFFBQXdDLEVBQ3hDLE9BQXNCLEVBQ3RCLFlBQXlCO0lBRXpCLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxFQUFFLEdBQUcsWUFBWSxFQUFFLENBQUM7SUFDMUMsTUFBTSxRQUFRLEdBQUcsT0FBTyxRQUFRLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3JGLE9BQU8sRUFBRSxHQUFHLFlBQVksRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFDO0FBQzFDLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUM1QixTQUE2QztJQUU3QyxJQUFJLENBQUMsU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2pDLE9BQU8sT0FBTyxTQUFTLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ25FLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILFNBQVMsZUFBZSxDQUN0QixNQUEwQixFQUMxQixPQUE2QztJQUU3QyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBOEMsQ0FBQztJQUNwRSxPQUFPLElBQUksS0FBSyxDQUFDLEVBQW1CLEVBQUU7UUFDcEMsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRO1lBQ25CLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUTtnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUNuRCxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxTQUFTLENBQUM7WUFDakUsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDNUQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDOUIsT0FBTyxRQUFRLElBQUksU0FBUyxDQUFDO1FBQy9CLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsU0FBUyxlQUFlLENBQ3RCLE1BQTBCLEVBQzFCLE9BQTZDLEVBQzdDLFFBQWdCO0lBRWhCLElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNsRCxPQUFPLHlCQUF5QixDQUFDO1lBQy9CLE1BQU07WUFDTixNQUFNO1NBQ1AsQ0FBZ0MsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuRCxPQUFPLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFpQ0Q7Ozs7O0dBS0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLE1BQWU7SUFDekMsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdkQsTUFBTSxDQUFDLEdBQUcsTUFBK0IsQ0FBQztJQUMxQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sS0FBSyxVQUFVLElBQUksT0FBTyxDQUFDLENBQUMsZ0JBQWdCLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDaEYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTztRQUNMLE9BQU8sQ0FBQyxJQUFxQjtZQUMzQixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sS0FBSyxHQUFnQixFQUFFLENBQUM7WUFDOUIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLHdCQUF3QixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHdCQUF3QixDQUFDLEtBQXlCLEVBQUUsTUFBNkI7SUFDeEYsT0FBTyxVQUFVLENBQUM7UUFDaEIsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLFVBQVUsS0FBSyxLQUFLLENBQUMsU0FBUyxFQUFFO1FBQzdDLFdBQVcsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVc7UUFDbEMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9FLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBYyxFQUFFLE9BQWdCLEVBQUUsRUFBRTtZQUNsRCxNQUFNLFNBQVMsR0FBRyxPQUtMLENBQUM7WUFDZCxNQUFNLFVBQVUsR0FBRyxTQUFTLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQzFFLE9BQU8sTUFBTSxDQUFDLGdCQUFpQixDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUU7Z0JBQzlFLEdBQUcsQ0FBQyxPQUFPLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUMxRCxDQUFDLENBQUM7UUFDTCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWdlbnQgcmVnaXN0cmF0aW9uIGZvciB0aGUgTWFzdHJhIEFwcEtpdCBwbHVnaW4uXG4gKlxuICogTWlycm9ycyB0aGUgc2hhcGUgb2YgdGhlIEFwcEtpdCBgYWdlbnRzYCBwbHVnaW4gKGBjb25maWcuYWdlbnRzYCBtYXBcbiAqIG9mIHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb259LCBkdWFsLWZvcm0gYHRvb2xzYCBhY2NlcHRpbmcgYSBwbGFpblxuICogcmVjb3JkIG9yIGEgYChwbHVnaW5zKSA9PiB0b29sc2AgY2FsbGJhY2spLiBSZXNvbHZlcyBlYWNoIGRlZmluaXRpb25cbiAqIGludG8gYSBNYXN0cmEgYEFnZW50YCBpbnN0YW5jZSBkdXJpbmcgcGx1Z2luIHNldHVwOyB1c2VyLXN1cHBsaWVkXG4gKiB0b29sIGNhbGxiYWNrcyBhcmUgaW52b2tlZCBleGFjdGx5IG9uY2Ugd2l0aCBhIHR5cGVkXG4gKiB7QGxpbmsgTWFzdHJhUGx1Z2luc30gbWFwIGJ1aWx0IGZyb20gcmVnaXN0ZXJlZCBzaWJsaW5nIHBsdWdpbnMuXG4gKlxuICogV2hlbiBubyBhZ2VudHMgYXJlIHJlZ2lzdGVyZWQgdGhlIHBsdWdpbiBmYWxscyBiYWNrIHRvIGEgc2luZ2xlXG4gKiBidWlsdC1pbiBhbmFseXN0IHNvIHRoZSBiYXJlIGBtYXN0cmEoKWAgY2FsbCBzdGlsbCBtb3VudHMgYSB3b3JraW5nXG4gKiBzdHJlYW1hYmxlIGFnZW50IGZvciBkZW1vcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgcGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBmYWxsYmFjayB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBsb2csIG9iamVjdCwgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRDb25maWcsIFRvb2xzSW5wdXQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB7IE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlIH0gZnJvbSBcIkBtYXN0cmEvY29yZS93b3Jrc3BhY2VcIjtcbmltcG9ydCB0eXBlIHsgUGdWZWN0b3JDb25maWcsIFBvc3RncmVzU3RvcmVDb25maWcgfSBmcm9tIFwiQG1hc3RyYS9wZ1wiO1xuXG5pbXBvcnQgeyBidWlsZFJlbmRlckRhdGFUb29sIH0gZnJvbSBcIi4vY2hhcnQudHNcIjtcbmltcG9ydCB0eXBlIHsgTWFzdHJhUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBidWlsZEdlbmllVG9vbGtpdFByb3ZpZGVyLCByZXNvbHZlR2VuaWVTcGFjZXMgfSBmcm9tIFwiLi9nZW5pZS50c1wiO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlCdWlsZGVyIH0gZnJvbSBcIi4vbWVtb3J5LnRzXCI7XG5pbXBvcnQgeyBidWlsZE1vZGVsIH0gZnJvbSBcIi4vbW9kZWwudHNcIjtcbmltcG9ydCB7IFJlc3VsdFByb2Nlc3Nvciwgc3RyaXBTdGFsZUNoYXJ0c1Byb2Nlc3NvciB9IGZyb20gXCIuL3Byb2Nlc3NvcnMudHNcIjtcbmltcG9ydCB7IFRZUE9HUkFQSFlfUlVMRSB9IGZyb20gXCIuL3N0eWxlLnRzXCI7XG5pbXBvcnQgeyBidWlsZFN1bW1hcml6ZVRvb2wgfSBmcm9tIFwiLi9zdW1tYXJpemUudHNcIjtcbmltcG9ydCB7IGNyZWF0ZVdvcmtzcGFjZSB9IGZyb20gXCIuL3dvcmtzcGFjZXMudHNcIjtcblxuLyoqXG4gKiBUb29sIHJlY29yZCBhY2NlcHRlZCBieSBldmVyeSBNYXN0cmEgYEFnZW50LnRvb2xzYCBmaWVsZCBhbmQgYnkgdGhlXG4gKiBgdG9vbHMocGx1Z2lucylgIGNhbGxiYWNrIG9uIHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb259LlxuICpcbiAqIEFsaWFzIG9mIE1hc3RyYSdzIGBUb29sc0lucHV0YCwgc28gaXQgYWxyZWFkeSBhY2NlcHRzOlxuICpcbiAqIC0gTWFzdHJhIHRvb2xzIGJ1aWx0IHdpdGgge0BsaW5rIGNyZWF0ZVRvb2x9IChvciBgbmV3IFRvb2woLi4uKWApXG4gKiAtIE1hc3RyYSB0b29scyBidWlsdCB3aXRoIHRoZSBBcHBLaXQtc2hhcGVkIHtAbGluayB0b29sfSB3cmFwcGVyXG4gKiAgIGJlbG93XG4gKiAtIFZlcmNlbCBBSSBTREsgdG9vbHMgKGB0b29sKHsgLi4uIH0pYCBmcm9tIGBhaWApXG4gKiAtIFByb3ZpZGVyLWRlZmluZWQgdG9vbHMgKGUuZy4gYG9wZW5haS50b29scy53ZWJTZWFyY2goLi4uKWApXG4gKlxuICogRXhpc3RpbmcgdG9vbCBsaWJyYXJpZXMgZHJvcCBpbiBhcy1pcyAtIG5vdGhpbmcgaW4gdGhpcyBwYWNrYWdlXG4gKiBmb3JjZXMgYSByZWJ1aWxkLlxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFUb29scyA9IFRvb2xzSW5wdXQ7XG5cbi8qKiBSZS1leHBvcnQgb2YgTWFzdHJhJ3MgbmF0aXZlIGBjcmVhdGVUb29sYCBmb3IgZnVsbC1mZWF0dXJlIGFjY2Vzcy4gKi9cbmV4cG9ydCB7IGNyZWF0ZVRvb2wgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5cbi8qKlxuICogQXBwS2l0LXNoYXBlZCB0b29sIGZhY3RvcnkuIExldHMgdXNlcnMgbWl4LWFuZC1tYXRjaCB0b29scyBhY3Jvc3NcbiAqIEFwcEtpdCdzIGBhZ2VudHNgIHBsdWdpbiBhbmQgYG1hc3RyYWAgd2l0aCBhIHNpbmdsZSBpbXBvcnQ6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHRvb2wgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKiBpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuICpcbiAqIGdldF93ZWF0aGVyOiB0b29sKHtcbiAqICAgZGVzY3JpcHRpb246IFwiV2VhdGhlclwiLFxuICogICBzY2hlbWE6IHoub2JqZWN0KHsgY2l0eTogei5zdHJpbmcoKSB9KSxcbiAqICAgZXhlY3V0ZTogYXN5bmMgKHsgY2l0eSB9KSA9PiBgU3VubnkgaW4gJHtjaXR5fWAsXG4gKiB9KSxcbiAqIGBgYFxuICpcbiAqIE1hcHMgb250byBNYXN0cmEncyBgY3JlYXRlVG9vbGA6XG4gKlxuICogLSBgZGVzY3JpcHRpb25gIC0+IGBkZXNjcmlwdGlvbmAgKHJlcXVpcmVkKVxuICogLSBgc2NoZW1hYCAtPiBgaW5wdXRTY2hlbWFgIChvcHRpb25hbClcbiAqIC0gYGV4ZWN1dGUoaW5wdXQpYCAtPiBgZXhlY3V0ZShpbnB1dCwgY3R4KWAgLSBNYXN0cmEgYWxyZWFkeSBjYWxsc1xuICogICB0aGUgZmlyc3QgYXJnIHdpdGggdGhlIHBhcnNlZCBpbnB1dHMsIHNvIHRoZSBib2R5IHNoYXBlIGlzXG4gKiAgIGlkZW50aWNhbC4gVGhlIE1hc3RyYSBgY29udGV4dGAgYXJnIGlzIGZvcndhcmRlZCBhcyB0aGUgc2Vjb25kXG4gKiAgIHBhcmFtZXRlciB3aGVuIHRoZSBjYWxsZXIgZGVjbGFyZXMgaXQuXG4gKiAtIGBpZGA6IG9wdGlvbmFsLiBEZWZhdWx0cyB0byBhIHN0YWJsZSBpZGVudGlmaWVyIGRlcml2ZWQgZnJvbVxuICogICBgZGVzY3JpcHRpb25gIChzbHVnaWZpZWQsIHdpdGggYSBzaG9ydCBoYXNoIHN1ZmZpeCBmb3JcbiAqICAgdW5pcXVlbmVzcykuIFBhc3MgYW4gZXhwbGljaXQgYGlkYCB3aGVuIHlvdSBuZWVkIGEgc3RhYmxlIHN0cmluZ1xuICogICBmb3IgdHJhY2luZyBvciBNQ1AgZXhwb3N1cmUuXG4gKlxuICogUmVhY2ggZm9yIHtAbGluayBjcmVhdGVUb29sfSB3aGVuIHlvdSBuZWVkIE1hc3RyYS1vbmx5IGZpZWxkc1xuICogKGBvdXRwdXRTY2hlbWFgLCBgc3VzcGVuZFNjaGVtYWAsIGByZXF1aXJlQXBwcm92YWxgLCBgbWNwYCwgZXRjLikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b29sKG9wdHM6IEFwcEtpdFRvb2xPcHRpb25zKTogVG9vbCB7XG4gIGNvbnN0IGlkID0gb3B0cy5pZCA/PyBkZXJpdmVUb29sSWQob3B0cy5kZXNjcmlwdGlvbik7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZCxcbiAgICBkZXNjcmlwdGlvbjogb3B0cy5kZXNjcmlwdGlvbixcbiAgICAuLi4ob3B0cy5zY2hlbWEgPyB7IGlucHV0U2NoZW1hOiBvcHRzLnNjaGVtYSBhcyBuZXZlciB9IDoge30pLFxuICAgIGV4ZWN1dGU6IG9wdHMuZXhlY3V0ZSBhcyBuZXZlcixcbiAgfSk7XG59XG5cbi8qKlxuICogSW5wdXQgc2hhcGUgZm9yIHRoZSBBcHBLaXQtc3R5bGUge0BsaW5rIHRvb2x9IGZhY3RvcnkuIEEgdHJpbW1lZFxuICogc3Vic2V0IG9mIE1hc3RyYSdzIGBjcmVhdGVUb29sYCBvcHRpb25zIHRoYXQgbWlycm9ycyB0aGVcbiAqIGBAZGF0YWJyaWNrcy9hcHBraXQvYmV0YWAgYHRvb2woeyBkZXNjcmlwdGlvbiwgc2NoZW1hLCBleGVjdXRlIH0pYFxuICogc2lnbmF0dXJlLlxuICpcbiAqIEdlbmVyaWNzIGFyZSBpbnRlbnRpb25hbGx5IGFic2VudCAtIGluZmVyZW5jZSBmbG93cyB0aHJvdWdoIHRoZVxuICogY2FsbGVyJ3MgYHNjaGVtYWAgKHR5cGljYWxseSBhIFpvZCBvYmplY3QpLCBhbmQgdGhlIGBleGVjdXRlYCBib2R5XG4gKiBkZXN0cnVjdHVyZXMgbmF0dXJhbGx5IGZyb20gdGhhdC4gUmVhY2ggZm9yIHtAbGluayBjcmVhdGVUb29sfSB3aGVuXG4gKiB5b3UgbmVlZCB0aGUgZnVsbHktdHlwZWQgaW5wdXQvb3V0cHV0IHNjaGVtYXMgd2lyZWQgZXhwbGljaXRseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBLaXRUb29sT3B0aW9ucyB7XG4gIC8qKiBPcHRpb25hbCBzdGFibGUgaWRlbnRpZmllcjsgYXV0by1kZXJpdmVkIGZyb20gYGRlc2NyaXB0aW9uYCB3aGVuIG9taXR0ZWQuICovXG4gIGlkPzogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gc2hvd24gdG8gdGhlIG1vZGVsLiBSZXF1aXJlZC4gKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGlucHV0IHNjaGVtYSAoYW55IFN0YW5kYXJkIFNjaGVtYSBpbnN0YW5jZSwgZS5nLiBab2QpLlxuICAgKiBNYXBzIHRvIE1hc3RyYSdzIGBpbnB1dFNjaGVtYWA7IHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBtb2RlbFxuICAgKiB2ZXJiYXRpbS5cbiAgICovXG4gIHNjaGVtYT86IHVua25vd247XG4gIC8qKlxuICAgKiBFeGVjdXRlIGJvZHkuIEZpcnN0IGFyZyBpcyB0aGUgcGFyc2VkIGlucHV0ICh0eXBlZCBvZmYgYHNjaGVtYWBcbiAgICogd2hlbiBzdXBwbGllZCksIHNlY29uZCBhcmcgaXMgdGhlIGZ1bGwgTWFzdHJhIGV4ZWN1dGlvbiBjb250ZXh0XG4gICAqIChyZXF1ZXN0IGNvbnRleHQsIGFib3J0IHNpZ25hbCwgbWFzdHJhIGluc3RhbmNlKSBpZiB5b3UgbmVlZCBpdC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGV4ZWN1dGU6IChpbnB1dDogYW55LCBjb250ZXh0PzogdW5rbm93bikgPT4gdW5rbm93bjtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGRldGVybWluaXN0aWMgTWFzdHJhIHRvb2wgaWQgZnJvbSBhIGRlc2NyaXB0aW9uLlxuICogRGVsZWdhdGVzIHRvIHtAbGluayBzdHJpbmcudG9VbmlxdWVTbHVnfTogc2x1ZyArIGFsd2F5cy1vblxuICogNi1jaGFyIEZOVi0xYSBiYXNlLTMyIHN1ZmZpeCBzbyB0d28gdG9vbHMgd2l0aCB0aGUgc2FtZSBsZWFkaW5nXG4gKiB3b3JkcyBkb24ndCBjb2xsaWRlIGluIHRyYWNlcy4gU3RhYmxlIGFjcm9zcyBydW5zLlxuICovXG5mdW5jdGlvbiBkZXJpdmVUb29sSWQoZGVzY3JpcHRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzdHJpbmcudG9VbmlxdWVTbHVnKGRlc2NyaXB0aW9uLCB7IGZhbGxiYWNrUHJlZml4OiBcInRvb2xcIiB9KTtcbn1cblxuLyoqXG4gKiBJZGVudGl0eSBoZWxwZXIgdGhhdCBicmFuZHMgYSBkZWZpbml0aW9uIGFzIGEgTWFzdHJhIGFnZW50LiBNaXJyb3JzXG4gKiBBcHBLaXQncyBgY3JlYXRlQWdlbnQoZGVmKWAgc28gdGhlIHJlZ2lzdHJhdGlvbiBzaGFwZSBtYXRjaGVzOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBzdXBwb3J0ID0gY3JlYXRlQWdlbnQoe1xuICogICBpbnN0cnVjdGlvbnM6IFwiLi4uXCIsXG4gKiAgIG1vZGVsOiBcImRhdGFicmlja3MtY2xhdWRlLXNvbm5ldC00LTZcIixcbiAqICAgdG9vbHMocGx1Z2lucykgeyByZXR1cm4geyAuLi4gfTsgfSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogUmV0dXJucyB0aGUgZGVmaW5pdGlvbiB1bmNoYW5nZWQgLSB0aGUgd3JhcHBlciBleGlzdHMgb25seSB0byBhbmNob3JcbiAqIHR5cGUgaW5mZXJlbmNlIGFuZCB0byBtYXRjaCB0aGUgQXBwS2l0IEFQSSBzdXJmYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQWdlbnQ8VCBleHRlbmRzIE1hc3RyYUFnZW50RGVmaW5pdGlvbj4oZGVmOiBUKTogVCB7XG4gIGlmIChkZWYud29ya3NwYWNlKSByZXR1cm4geyAuLi5kZWYgfTtcbiAgY29uc3Qgd29ya3NwYWNlID0gY3JlYXRlV29ya3NwYWNlKCk7XG4gIG1hcmtEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZSk7XG4gIHJldHVybiB7IC4uLmRlZiwgd29ya3NwYWNlIH07XG59XG5cbi8qKlxuICogQnJhbmQgZm9yIGEge0BsaW5rIFdvcmtzcGFjZX0gdGhhdCBgY3JlYXRlQWdlbnRgIGJ1aWx0IHdpdGggbm8gY2FsbGVyXG4gKiBvcHRpb25zLCBzbyB7QGxpbmsgYnVpbGRBZ2VudHN9IG1heSByZWJ1aWxkIGl0IHdpdGggc3RhcnR1cC1wcm92aXNpb25lZFxuICogYGV4dHJhU2tpbGxQYXRoc2AgKGEgY2FsbGVyLXN1cHBsaWVkIHdvcmtzcGFjZSBpcyBuZXZlciB0b3VjaGVkKS5cbiAqL1xuY29uc3QgREVGQVVMVF9XT1JLU1BBQ0UgPSBTeW1ib2wuZm9yKFwiZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmEvZGVmYXVsdC13b3Jrc3BhY2VcIik7XG5cbi8qKiBCcmFuZCBgd29ya3NwYWNlYCBhcyB0aGUgYXV0by1jcmVhdGVkIGRlZmF1bHQuICovXG5mdW5jdGlvbiBtYXJrRGVmYXVsdFdvcmtzcGFjZSh3b3Jrc3BhY2U6IFdvcmtzcGFjZSk6IHZvaWQge1xuICAod29ya3NwYWNlIGFzIHVua25vd24gYXMgUmVjb3JkPHN5bWJvbCwgYm9vbGVhbj4pW0RFRkFVTFRfV09SS1NQQUNFXSA9IHRydWU7XG59XG5cbi8qKiBXaGV0aGVyIGB3b3Jrc3BhY2VgIHdhcyBhdXRvLWNyZWF0ZWQgYnkge0BsaW5rIGNyZWF0ZUFnZW50fS4gKi9cbmZ1bmN0aW9uIGlzRGVmYXVsdFdvcmtzcGFjZSh3b3Jrc3BhY2U6IFdvcmtzcGFjZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gQm9vbGVhbih3b3Jrc3BhY2UgJiYgKHdvcmtzcGFjZSBhcyB1bmtub3duIGFzIFJlY29yZDxzeW1ib2wsIGJvb2xlYW4+KVtERUZBVUxUX1dPUktTUEFDRV0pO1xufVxuXG4vKipcbiAqIEZpbHRlciAvIHJlbmFtZSBvcHRpb25zIGFjY2VwdGVkIGJ5IGV2ZXJ5IHBsdWdpbidzIGAudG9vbGtpdCgpYFxuICogbWV0aG9kLiBNaXJyb3JzIEFwcEtpdCdzIGBUb29sa2l0T3B0aW9uc2AgdmVyYmF0aW0gc28gb3B0aW9ucyBwYXNzXG4gKiB0aHJvdWdoIHVuY2hhbmdlZCAtIHRoZSB1bmRlcmx5aW5nIEFwcEtpdCBwbHVnaW4gZG9lcyB0aGUgZmlsdGVyaW5nXG4gKiBhbmQgd2UganVzdCBhZGFwdCB0aGUgcmVzdWx0aW5nIGVudHJpZXMgaW50byBNYXN0cmEgdG9vbHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbGtpdE9wdGlvbnMge1xuICAvKipcbiAgICogS2V5IHByZWZpeCBwcmVwZW5kZWQgdG8gZXZlcnkgdG9vbCBuYW1lLiBBcHBLaXQncyBkZWZhdWx0IGlzXG4gICAqIGAke3BsdWdpbk5hbWV9LmAgd2hlbiBvbWl0dGVkOyBwYXNzIGFuIGV4cGxpY2l0IGBcIlwiYCB0byBkcm9wIGl0LlxuICAgKi9cbiAgcHJlZml4Pzogc3RyaW5nO1xuICAvKiogQWxsb3dsaXN0IG9mIGxvY2FsIHRvb2wgbmFtZXMuICovXG4gIG9ubHk/OiBzdHJpbmdbXTtcbiAgLyoqIERlbnlsaXN0IG9mIGxvY2FsIHRvb2wgbmFtZXMuICovXG4gIGV4Y2VwdD86IHN0cmluZ1tdO1xuICAvKiogUmVtYXAgc3BlY2lmaWMgbG9jYWwgbmFtZXMgdG8gZGlmZmVyZW50IGtleXMuICovXG4gIHJlbmFtZT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogVG9vbGtpdCBwcm92aWRlciBzaGFwZSBldmVyeSBlbnRyeSBpbiB0aGUge0BsaW5rIE1hc3RyYVBsdWdpbnN9IG1hcFxuICogZXhwb3Nlcy4gSWRlbnRpY2FsIHRvIEFwcEtpdCdzIGBQbHVnaW5Ub29sa2l0UHJvdmlkZXJgIC0gYW55IEFwcEtpdFxuICogcGx1Z2luIHRoYXQgaW1wbGVtZW50cyB0aGUgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYGdldEFnZW50VG9vbHNgICsgYGV4ZWN1dGVBZ2VudFRvb2xgICsgYHRvb2xraXRgKSBpcyByZWFjaGFibGVcbiAqIHRocm91Z2ggdGhpcyBzdXJmYWNlIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHtcbiAgLyoqXG4gICAqIFJldHVybnMgYSBNYXN0cmEtc2hhcGVkIHRvb2xzIHJlY29yZCBhZGFwdGVkIGZyb20gdGhlIHBsdWdpbidzXG4gICAqIGFnZW50IHRvb2xzLiBFYWNoIHRvb2wgZGlzcGF0Y2hlcyBiYWNrIHRocm91Z2ggdGhlIHBsdWdpbidzXG4gICAqIGBleGVjdXRlQWdlbnRUb29sYCBzbyBPQk8gYXV0aCBhbmQgdGVsZW1ldHJ5IHNwYW5zIHN0YXkgaW50YWN0LlxuICAgKi9cbiAgdG9vbGtpdChvcHRzPzogVG9vbGtpdE9wdGlvbnMpOiBNYXN0cmFUb29scztcbn1cblxuLyoqXG4gKiBQbHVnaW4gbWFwIGhhbmRlZCB0byB0aGUgZnVuY3Rpb24gZm9ybSBvZlxuICoge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbi50b29sc30uIE1pcnJvcnMgQXBwS2l0J3MgYFBsdWdpbnNgXG4gKiB0eXBlIGV4YWN0bHk6IGEgc3RyaW5nLWtleWVkIHJlY29yZCB3aGVyZSBldmVyeSB2YWx1ZSBleHBvc2VzXG4gKiBgLnRvb2xraXQob3B0cylgLlxuICpcbiAqIEltcGxlbWVudGVkIGFzIGEgcnVudGltZSBQcm94eSB0aGF0IGF1dG8tZGlzY292ZXJzIGFueSByZWdpc3RlcmVkXG4gKiBBcHBLaXQgcGx1Z2luIGltcGxlbWVudGluZyB0aGUgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYGFuYWx5dGljc2AsIGBmaWxlc2AsIGBsYWtlYmFzZWAsIGBnZW5pZWAsIHBsdXMgYW55IHRoaXJkLXBhcnR5XG4gKiBwbHVnaW4gdGhhdCBkb2VzIHRoZSBzYW1lKS4gVW5rbm93biBuYW1lcyByZXNvbHZlIHRvIGB1bmRlZmluZWRgXG4gKiBhdCBydW50aW1lLCBzbyBndWFyZCB3aXRoIGA/LmAgYW5kIGA/PyB7fWAgd2hlbiBzcHJlYWRpbmcgZnJvbSBhXG4gKiBwbHVnaW4gdGhhdCBtYXkgbm90IGJlIHJlZ2lzdGVyZWQgaW4gZXZlcnkgZW52aXJvbm1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogXCIuLi5cIixcbiAqICAgdG9vbHMocGx1Z2lucykge1xuICogICAgIHJldHVybiB7XG4gKiAgICAgICAuLi5wbHVnaW5zLmFuYWx5dGljcy50b29sa2l0KCksXG4gKiAgICAgICAuLi5wbHVnaW5zLmZpbGVzLnRvb2xraXQoeyBvbmx5OiBbXCJ1cGxvYWRzLnJlYWRcIl0gfSksXG4gKiAgICAgICBnZXRfd2VhdGhlcjogdG9vbCh7XG4gKiAgICAgICAgIGRlc2NyaXB0aW9uOiBcIldlYXRoZXJcIixcbiAqICAgICAgICAgc2NoZW1hOiB6Lm9iamVjdCh7IGNpdHk6IHouc3RyaW5nKCkgfSksXG4gKiAgICAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IGNpdHkgfSkgPT4gYFN1bm55IGluICR7Y2l0eX1gLFxuICogICAgICAgfSksXG4gKiAgICAgfTtcbiAqICAgfSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVBsdWdpbnMgPSBSZWNvcmQ8c3RyaW5nLCBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXI+O1xuXG4vKiogRnVuY3Rpb24gZm9ybSBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9uLnRvb2xzfS4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVRvb2xzRm4gPSAocGx1Z2luczogTWFzdHJhUGx1Z2lucykgPT4gTWFzdHJhVG9vbHMgfCBQcm9taXNlPE1hc3RyYVRvb2xzPjtcblxuLyoqIEZ1bmN0aW9uIGZvcm0gb2Yge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbi53b3Jrc3BhY2V9LiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlciA9ICgpID0+IFdvcmtzcGFjZSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIGNvZGUtZGVmaW5lZCBNYXN0cmEgYWdlbnQuIE1pcnJvcnMgdGhlIHNoYXBlIEFwcEtpdCdzIGBhZ2VudHNgXG4gKiBwbHVnaW4gdXNlcyBmb3IgYEFnZW50RGVmaW5pdGlvbmAuIFRoZSByZWdpc3RyeSBrZXkgdW5kZXJcbiAqIGBjb25maWcuYWdlbnRzYCBpcyB0aGUgYGFnZW50SWRgIHRoZSBjbGllbnQgc3RyZWFtcyBhZ2FpbnN0OyBgbmFtZWBcbiAqIGlzIHB1cmVseSBpbmZvcm1hdGlvbmFsIChkZWZhdWx0cyB0byB0aGUga2V5KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFBZ2VudERlZmluaXRpb24ge1xuICAvKiogRGlzcGxheSBuYW1lIHVzZWQgYXMgYEFnZW50Lm5hbWVgLiBEZWZhdWx0cyB0byB0aGUgcmVnaXN0cnkga2V5LiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgbG9uZy1mb3JtIGRlc2NyaXB0aW9uOyBzdXJmYWNlZCBhcyBgQWdlbnQuZGVzY3JpcHRpb25gLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN5c3RlbSBwcm9tcHQgYm9keS4gKi9cbiAgaW5zdHJ1Y3Rpb25zOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgbW9kZWwgb3ZlcnJpZGUuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBmYWxscyBiYWNrIHRvIHRoZSB3b3Jrc3BhY2VcbiAgICogICBgL3NlcnZpbmctZW5kcG9pbnRzYCByZXNvbHZlciB0aGF0IHtAbGluayBidWlsZE1vZGVsfSBjb25maWd1cmVzXG4gICAqICAgZnJvbSB0aGUgcGVyLXJlcXVlc3QgYFdvcmtzcGFjZUNsaWVudGAuXG4gICAqIC0gYHN0cmluZ2A6IHNob3J0aGFuZCBmb3IgXCJ1c2UgdGhlIGRlZmF1bHQgcmVzb2x2ZXIgYnV0IHN3YXAgdGhlXG4gICAqICAgYG1vZGVsSWRgXCIgKGUuZy4gYFwiZGF0YWJyaWNrcy1tZXRhLWxsYW1hLTMtMy03MGItaW5zdHJ1Y3RcImApLlxuICAgKiAtIEFueSBvdGhlciBNYXN0cmEgYER5bmFtaWNBcmd1bWVudDxNYXN0cmFNb2RlbENvbmZpZz5gOiBwYXNzZWRcbiAgICogICBzdHJhaWdodCB0aHJvdWdoIHRvIGBBZ2VudC5tb2RlbGAuIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgZnVsbFxuICAgKiAgIGNvbnRyb2wgb3ZlciBhdXRoIG9yIHByb3ZpZGVySWQuXG4gICAqL1xuICBtb2RlbD86IEFnZW50Q29uZmlnW1wibW9kZWxcIl0gfCBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgdG9vbCByZWNvcmQuIEVpdGhlciBhIHBsYWluIG1hcCBvciBhIGNhbGxiYWNrIHRoYXRcbiAgICogcmVjZWl2ZXMgdGhlIHR5cGVkIHtAbGluayBNYXN0cmFQbHVnaW5zfSBzaWJsaW5nLXBsdWdpbiBpbmRleCBhbmRcbiAgICogcmV0dXJucyBhIG1hcC4gVGhlIGNhbGxiYWNrIHJ1bnMgZXhhY3RseSBvbmNlIGF0IGFnZW50IHNldHVwOyB0aGVcbiAgICogcmVzdWx0IGlzIGNhY2hlZCBmb3IgdGhlIGFnZW50J3MgbGlmZXRpbWUuXG4gICAqL1xuICB0b29scz86IE1hc3RyYVRvb2xzIHwgTWFzdHJhVG9vbHNGbjtcbiAgLyoqXG4gICAqIFBlci1hZ2VudCBzZW1hbnRpYyByZWNhbGwgKFBnVmVjdG9yKSBvdmVycmlkZS4gQ2FzY2FkZXMgZnJvbVxuICAgKiBgY29uZmlnLm1lbW9yeWA7IHRoZSBhZ2VudCB2YWx1ZSB3aW5zIHdoZW4gc2V0LlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogaW5oZXJpdCBgY29uZmlnLm1lbW9yeWAuIFdoZW4gdGhhdCdzXG4gICAqICAgZW5hYmxlZCwgdGhlIGFnZW50ICoqc2hhcmVzIHRoZSBwbHVnaW4tbGV2ZWwgc2luZ2xldG9uIGBQZ1ZlY3RvcmBcbiAgICogICBpbnN0YW5jZSoqIChjcm9zcy1hZ2VudCBzZW1hbnRpYyByZWNhbGwgYWNyb3NzIHRoZSBzYW1lIGluZGV4KS5cbiAgICogLSBgZmFsc2VgOiBkaXNhYmxlIHNlbWFudGljIHJlY2FsbCBmb3IgdGhpcyBhZ2VudCBvbmx5LlxuICAgKiAtIGB0cnVlYDogZW5hYmxlIHVzaW5nIHRoZSBzaGFyZWQgc2luZ2xldG9uIChzYW1lIGFzIGRlZmF1bHQgd2hlblxuICAgKiAgIHBsdWdpbiBtZW1vcnkgaXMgZW5hYmxlZDsgdXNlZnVsIHRvIG9wdCBpbiB3aGVuIHBsdWdpbiBkaXNhYmxlZCkuXG4gICAqIC0ge0BsaW5rIE1hc3RyYU1lbW9yeUNvbmZpZ30gb2JqZWN0OiBkZWRpY2F0ZWQgYFBnVmVjdG9yYCBmb3IgdGhpc1xuICAgKiAgIGFnZW50IChwcml2YXRlIHJlY2FsbCBpbmRleCkuIEJ5cGFzc2VzIHRoZSBzaGFyZWQgc2luZ2xldG9uLlxuICAgKi9cbiAgbWVtb3J5PzogYm9vbGVhbiB8IE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlO1xuICAvKipcbiAgICogUGVyLWFnZW50IHRocmVhZC9tZXNzYWdlIHN0b3JhZ2UgKGBQb3N0Z3Jlc1N0b3JlYCkgb3ZlcnJpZGUuXG4gICAqIENhc2NhZGVzIGZyb20gYGNvbmZpZy5zdG9yYWdlYDsgdGhlIGFnZW50IHZhbHVlIHdpbnMgd2hlbiBzZXQuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBpbmhlcml0IGBjb25maWcuc3RvcmFnZWAuIFdoZW4gdGhhdCdzXG4gICAqICAgZW5hYmxlZCwgdGhlIGFnZW50IGdldHMgaXRzICoqb3duIHBlci1hZ2VudCBgUG9zdGdyZXNTdG9yZWAqKlxuICAgKiAgIGtleWVkIGJ5IHtAbGluayBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lfSBzbyB0aHJlYWRzIGFuZFxuICAgKiAgIG1lc3NhZ2VzIHN0YXkgaXNvbGF0ZWQgYmV0d2VlbiBhZ2VudHMgaW4gdGhlIHNhbWUgZGF0YWJhc2UuXG4gICAqIC0gYGZhbHNlYDogZGlzYWJsZSBzdG9yYWdlIGZvciB0aGlzIGFnZW50IG9ubHkgKHB1cmVseSBpbi1tZW1vcnkpLlxuICAgKiAtIGB0cnVlYDogZW5hYmxlIHdpdGggdGhlIHBlci1hZ2VudCBkZWZhdWx0IHNjaGVtYS5cbiAgICogLSB7QGxpbmsgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlfSBvYmplY3Q6IGRlZGljYXRlZFxuICAgKiAgIGBQb3N0Z3Jlc1N0b3JlYCBjb25maWcgKGN1c3RvbSBzY2hlbWEsIGNvbm5lY3Rpb24sIGV0Yy4pLlxuICAgKi9cbiAgc3RvcmFnZT86IGJvb2xlYW4gfCBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGU7XG4gIC8qKlxuICAgKiBNYXN0cmEge0BsaW5rIFdvcmtzcGFjZX0gZm9yIHRoaXMgYWdlbnQgKGZpbGVzeXN0ZW0sIHNhbmRib3gsIG9yIG90aGVyXG4gICAqIHByb3ZpZGVycykuIEFzc2lzdGFudCBza2lsbHMgZnJvbSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBwYXRocyBhcmUgd2lyZWRcbiAgICogdmlhIHtAbGluayBjcmVhdGVXb3Jrc3BhY2V9LlxuICAgKi9cbiAgd29ya3NwYWNlPzogV29ya3NwYWNlIHwgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlcjtcbn1cblxuLyoqXG4gKiBEaXN0cmlidXRpdmUgYE9taXRgIHNvIHVuaW9ucyBpbiBgUG9zdGdyZXNTdG9yZUNvbmZpZ2AgL1xuICogYFBnVmVjdG9yQ29uZmlnYCBrZWVwIHRoZWlyIGRpc2NyaW1pbmFudHMgYWZ0ZXIgdGhlIG92ZXJyaWRlIHR5cGVzXG4gKiBzdHJpcCBgaWRgLiBUaGUgYnVpbHQtaW4gYE9taXRgIGNvbGxhcHNlcyB1bmlvbnMgdG8gb25lIHNoYXBlIHdpdGhcbiAqIGNvbW1vbiBmaWVsZHMgb25seSwgd2hpY2ggbG9zZXMgdGhlIGNvbm5lY3Rpb24tc3R5bGUgZGlzY3JpbWluYW50cy5cbiAqL1xudHlwZSBEaXN0cmlidXRpdmVPbWl0PFQsIEsgZXh0ZW5kcyBrZXlvZiBuZXZlcj4gPSBUIGV4dGVuZHMgdW5rbm93biA/IE9taXQ8VCwgSz4gOiBuZXZlcjtcblxuLyoqXG4gKiBgUG9zdGdyZXNTdG9yZUNvbmZpZ2AgbWludXMgYGlkYCAtIHBlci1hZ2VudCBvdmVycmlkZXMgYWNjZXB0IGFueVxuICogTWFzdHJhLXN1cHBvcnRlZCBzdG9yYWdlIHNoYXBlLiBgaWRgIGlzIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5XG4gKiBmcm9tIHRoZSBhZ2VudCByZWdpc3RyeSBrZXkgc28gdHJhY2VzIHN0YXkgc3RhYmxlLlxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGUgPSBEaXN0cmlidXRpdmVPbWl0PFBvc3RncmVzU3RvcmVDb25maWcsIFwiaWRcIj4gJiB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBgUGdWZWN0b3JDb25maWdgIG1pbnVzIGBpZGAgLSBwZXItYWdlbnQgb3ZlcnJpZGVzIGFjY2VwdCBhbnlcbiAqIE1hc3RyYS1zdXBwb3J0ZWQgdmVjdG9yIHNoYXBlLiBgaWRgIGlzIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5XG4gKiBmcm9tIHRoZSBhZ2VudCByZWdpc3RyeSBrZXkuXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlID0gRGlzdHJpYnV0aXZlT21pdDxQZ1ZlY3RvckNvbmZpZywgXCJpZFwiPiAmIHtcbiAgaWQ/OiBzdHJpbmc7XG59O1xuXG4vKiogT3V0cHV0IG9mIHtAbGluayBidWlsZEFnZW50c306IHJlc29sdmVkIGFnZW50cyBwbHVzIHRoZSBkZWZhdWx0IGlkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsdEFnZW50cyB7XG4gIGFnZW50czogUmVjb3JkPHN0cmluZywgQWdlbnQ+O1xuICBkZWZhdWx0QWdlbnRJZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RhdGljIGRlZmF1bHQgc2VydmluZy1lbmRwb2ludCBpZCBwZXIgYWdlbnQgaWQsIGFzIHJlc29sdmVkIGJ5XG4gICAqIHtAbGluayBkZXNjcmliZUFnZW50RGVmYXVsdE1vZGVsfS4gYFwiPGR5bmFtaWM+XCJgIHdoZW4gdGhlIG1vZGVsIGlzIGFcbiAgICogZnVuY3Rpb24gZGVjaWRlZCBhdCBjYWxsIHRpbWUuIENvbnN1bWVkIGJ5IHRoZSBwbHVnaW4nc1xuICAgKiBgR0VUIC9kZWZhdWx0LW1vZGVsYCByb3V0ZSBoYW5kbGVyIHNvIHRoZSBjbGllbnQncyBtb2RlbCBwaWNrZXIgY2FuIGxhYmVsXG4gICAqIGl0cyBkZWZhdWx0IG9wdGlvbiB3aXRoIHRoZSByZWFsIGVuZHBvaW50J3MgaHVtYW5pemVkIG5hbWUuXG4gICAqL1xuICBkZWZhdWx0TW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKipcbiAgICogQW1iaWVudCB0b29scyBzaGFyZWQgYWNyb3NzIGV2ZXJ5IGFnZW50ICh0aGUgYnVpbHQtaW4gc3lzdGVtIHRvb2xzXG4gICAqIHNwcmVhZCB3aXRoIGBjb25maWcudG9vbHNgKS4gU3VyZmFjZWQgc28gdGhlIG9wdGlvbmFsIE1DUCBzZXJ2ZXJcbiAgICogY2FuIHJlLWV4cG9zZSB0aGVtIHdoZW4ge0BsaW5rIE1hc3RyYU1jcENvbmZpZy50b29sc30gaXMgZW5hYmxlZC5cbiAgICovXG4gIGFtYmllbnRUb29sczogTWFzdHJhVG9vbHM7XG59XG5cbi8qKiBGYWxsYmFjayBhZ2VudCBpZCB1c2VkIHdoZW4gYGNvbmZpZy5hZ2VudHNgIGlzIG9taXR0ZWQgZW50aXJlbHkuICovXG5leHBvcnQgY29uc3QgRkFMTEJBQ0tfQUdFTlRfSUQgPSBcImRlZmF1bHRcIjtcblxuLyoqXG4gKiBEZWZhdWx0IHBlci10dXJuIHN0ZXAgY2VpbGluZyBhcHBsaWVkIHRvIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnRcbiAqIHdoZW4ge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudE1heFN0ZXBzfSBpcyB1bnNldC4gU2l6ZWQgdG9cbiAqIGZpdCBhIGRlY29tcG9zZWQgR2VuaWUgdHVybiAoZ3JvdW5kaW5nICsgc2V2ZXJhbCBgYXNrX2dlbmllYFxuICogY2FsbHMgKyBgcHJlcGFyZV9jaGFydGAgcGVyIGRhdGFzZXQgKyB0aGUgZmluYWwtdGV4dCByZXBseSkgd2l0aFxuICogaGVhZHJvb20gZm9yIHRoZSBtb2RlbCB0byBjaGFpbiBhIGNvdXBsZSBvZiBmb2xsb3ctdXBzIGJlZm9yZVxuICogYW5zd2VyaW5nIC0gd2VsbCBhYm92ZSBNYXN0cmEncyBvd24gYGFnZW50LmdlbmVyYXRlYCBkZWZhdWx0IG9mXG4gKiA1LCB3aGljaCB3b3VsZCBjdXQgbXVsdGktc3RlcCBvcmNoZXN0cmF0aW9uIG9mZiBtaWQtbG9vcC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQUdFTlRfTUFYX1NURVBTID0gMjU7XG5cbmNvbnN0IEZBTExCQUNLX0FHRU5UX0lOU1RSVUNUSU9OUyA9IGBZb3UgYXJlIGEgZGF0YSBhbmFseXN0LiBUaGUgdXNlciB3aWxsIGFzayBxdWVzdGlvbnMgYWJvdXRcbmJ1c2luZXNzIG1ldHJpY3MgYW5kIG1heSBzaGFyZSBwZXJzb25hbCBwcmVmZXJlbmNlcyB5b3Ugc2hvdWxkIHJlbWVtYmVyIGFjcm9zcyB0dXJucy5cblxuUnVsZXM6XG5cbjEuIFF1b3RlIG51bWJlcnMgZXhhY3RseS4gTmV2ZXIgaW52ZW50IGRhdGEuXG4yLiBXaGVuIHRoZSB1c2VyIHN0YXRlcyBhIHByZWZlcmVuY2Ugb3IgZHVyYWJsZSBmYWN0IGFib3V0IHRoZW1zZWx2ZXNcbiAgIChcIkknbSBpbiBFVSBzbyB1c2UgRVVSXCIsIFwiYWx3YXlzIHNob3cgbWUgdGhlIFNRTFwiKSwgYWNrbm93bGVkZ2UgdGhhdFxuICAgeW91IHdpbGwgcmVtZW1iZXIgaXQuXG4zLiBJZiB5b3UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYW5zd2VyLCBhc2sgYSBjbGFyaWZ5aW5nXG4gICBxdWVzdGlvbiBpbnN0ZWFkIG9mIGd1ZXNzaW5nLmA7XG5cbi8qKlxuICogU3R5bGUgZ3VhcmRyYWlscyBhcHBlbmRlZCB0byBldmVyeSBhZ2VudCdzIGBpbnN0cnVjdGlvbnNgIHRvIGN1cmJcbiAqIGNvbW1vbiBMTE0taXNtcyAoZW0gZGFzaGVzLCBlbW9qaXMsIHN5Y29waGFudGljIG9wZW5lcnMsIGV4Y2Vzc2l2ZVxuICogaGVkZ2luZywgdGhyb3dhd2F5IGNsb3NlcnMpLiBBcHBlbmRlZCByYXRoZXIgdGhhbiBwcmVwZW5kZWQgc28gdGhlXG4gKiBhZ2VudCdzIHJvbGUvY29udGV4dCBjb21lcyBmaXJzdDsgdGhlIG1vZGVsJ3MgcmVjZW5jeSBiaWFzIHRoZW5cbiAqIGhlbHBzIHRoZSBzdHlsZSBydWxlcyBkb21pbmF0ZSB0aGUgcmVzcG9uc2Ugc3VyZmFjZS5cbiAqXG4gKiBPdmVycmlkZSBnbG9iYWxseSB2aWEge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5zdHlsZUluc3RydWN0aW9uc31cbiAqIChwYXNzIGBmYWxzZWAgdG8gZGlzYWJsZSBlbnRpcmVseSwgb3IgYSBzdHJpbmcgdG8gcmVwbGFjZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUyA9IFtcbiAgXCJPdXRwdXQgc3R5bGU6XCIsXG4gIFwiXCIsXG4gIFwiVXNlIG1hcmtkb3duIGZvcm1hdHRpbmcsIGluY2x1ZGluZyBoZWFkaW5ncywgbGlzdHMsIGFuZCBjb2RlIGJsb2Nrcy5cIixcbiAgXCJBdm9pZCBsaXN0cyBhbmQgaGVhZGVycyBmb3Igc2hvcnQgcmVwbGllcy5cIixcbiAgXCJQbGFpbiBwcm9zZS5cIixcbiAgVFlQT0dSQVBIWV9SVUxFLFxuICBcIlNraXAgb3BlbmVycyBsaWtlICdHcmVhdCBxdWVzdGlvbicsICdBYnNvbHV0ZWx5JywgYW5kICdJJ2QgYmUgaGFwcHkgdG8gaGVscCcuXCIsXG4gIFwiU2tpcCBjbG9zZXJzIGxpa2UgJ0xldCBtZSBrbm93IGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMnLlwiLFxuICBcIlNraXAgc2VsZi1kaXNjbGFpbWVycyBsaWtlICdJIHNob3VsZCBtZW50aW9uJyBhbmQgJ0l0J3MgaW1wb3J0YW50IHRvIG5vdGUnLlwiLFxuICBcIkFuc3dlciBkaXJlY3RseS5cIixcbiAgXCJEbyBub3QgaW5jbHVkZSBhIHByZWFtYmxlIGJlZm9yZSB0aGUgYWN0dWFsIGFuc3dlci5cIixcbiAgXCJVc2UgbGlzdHMgYW5kIGhlYWRlcnMgb25seSB3aGVuIHRoZXkgY2xhcmlmeSBhIG11bHRpLXBhcnQgYW5zd2VyLlwiLFxuXS5qb2luKFwiXFxuXCIpO1xuXG4vKipcbiAqIFJlc29sdmUgdGhlIHN0eWxlIGJsb2NrIHRvIGFwcGVuZCB0byBldmVyeSBhZ2VudCdzIGluc3RydWN0aW9ucy5cbiAqIFJldHVybnMgYG51bGxgIHdoZW4gdGhlIGNhbGxlciBvcHRlZCBvdXQgKGBzdHlsZUluc3RydWN0aW9uczogZmFsc2VgKS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVN0eWxlSW5zdHJ1Y3Rpb25zKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChjb25maWcuc3R5bGVJbnN0cnVjdGlvbnMgPT09IGZhbHNlKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiBjb25maWcuc3R5bGVJbnN0cnVjdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gY29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zO1xuICB9XG5cbiAgcmV0dXJuIERFRkFVTFRfU1RZTEVfSU5TVFJVQ1RJT05TO1xufVxuXG4vKipcbiAqIEpvaW4gYW4gYWdlbnQncyBiZXNwb2tlIGluc3RydWN0aW9ucyB3aXRoIHRoZSByZXNvbHZlZCBzdHlsZSBibG9jay5cbiAqIFJldHVybnMgdGhlIGJlc3Bva2UgdGV4dCB1bmNoYW5nZWQgd2hlbiB0aGUgc3R5bGUgYmxvY2sgaXMgZGlzYWJsZWQuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VJbnN0cnVjdGlvbnMoYWdlbnRJbnN0cnVjdGlvbnM6IHN0cmluZywgc3R5bGU6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICBpZiAoIXN0eWxlKSByZXR1cm4gYWdlbnRJbnN0cnVjdGlvbnM7XG4gIHJldHVybiBgJHthZ2VudEluc3RydWN0aW9ucy50cmltRW5kKCl9XFxuXFxuJHtzdHlsZX1gO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlZCBkZXNjcmlwdGlvbiBmb3IgYW4gYWdlbnQgd2hvc2UgZGVmaW5pdGlvbiBvbWl0cyBvbmUuIEtlcHRcbiAqIGdlbmVyaWMgKHRoZSBhZ2VudCdzIG93biBuYW1lIGlzIHRoZSBvbmx5IHJlbGlhYmxlIHNpZ25hbCBhdCBidWlsZFxuICogdGltZSkgc28gaXQgcmVhZHMgc2Vuc2libHkgYXMgdGhlIGBhc2tfPGlkPmAgTUNQIHRvb2wncyBkZXNjcmlwdGlvblxuICogYW5kIGluIGFnZW50IG1ldGFkYXRhLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0QWdlbnREZXNjcmlwdGlvbihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYENvbnZlcnNhdGlvbmFsIEFJIGFnZW50IFwiJHtuYW1lfVwiLmA7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBldmVyeSBlbnRyeSBpbiBgY29uZmlnLmFnZW50c2AgaW50byBhIE1hc3RyYSBgQWdlbnRgXG4gKiBpbnN0YW5jZS4gV2hlbiBgY29uZmlnLmFnZW50c2AgaXMgb21pdHRlZCB0aGUgcGx1Z2luIHJlZ2lzdGVycyBhXG4gKiBzaW5nbGUgYnVpbHQtaW4gYGRlZmF1bHRgIGFuYWx5c3Qgc28gdGhlIGJhcmUgYG1hc3RyYSgpYCBjYWxsIHN0aWxsXG4gKiB5aWVsZHMgYSB3b3JraW5nIGFnZW50LlxuICpcbiAqIFBlci1hZ2VudCB0b29sIGNhbGxiYWNrcyBhcmUgaW52b2tlZCBvbmNlIHdpdGggYSB0eXBlZFxuICoge0BsaW5rIE1hc3RyYVBsdWdpbnN9IGluZGV4IGJ1aWx0IGZyb20gcmVnaXN0ZXJlZCBzaWJsaW5nIHBsdWdpbnNcbiAqIChjdXJyZW50bHkgYGdlbmllYDsgZXh0ZW5kIGBNYXN0cmFQbHVnaW5zYCB0byBzdXJmYWNlIG1vcmUpLlxuICpcbiAqIEB0aHJvd3Mgd2hlbiBgY29uZmlnLmRlZmF1bHRBZ2VudGAgaXMgc2V0IHRvIGFuIGlkIHRoYXQgaXNuJ3QgaW4gdGhlXG4gKiAgIHJlc29sdmVkIHJlZ2lzdHJ5OyB0aGlzIGlzIGEgd2lyaW5nIGJ1Zywgbm90IGEgcnVudGltZSBjb25kaXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZEFnZW50cyhvcHRzOiB7XG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xuICBjb250ZXh0OiBwbHVnaW4uUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQ7XG4gIG1lbW9yeUJ1aWxkZXI/OiBNZW1vcnlCdWlsZGVyO1xuICBsb2c6IGxvZy5Mb2dnZXI7XG4gIC8qKlxuICAgKiBMb2NhbCBza2lsbCBzY2FuIHBhdGhzIChyZW1vdGUgc2tpbGxzIHByb3Zpc2lvbmVkIHRvIGEgdGVtcCBkaXIgYXRcbiAgICogc3RhcnR1cCkgZm9sZGVkIGludG8gZXZlcnkgYWdlbnQgdGhhdCB1c2VzIHRoZSBhdXRvLWNyZWF0ZWQgZGVmYXVsdFxuICAgKiB3b3Jrc3BhY2UuXG4gICAqL1xuICBleHRyYVNraWxsUGF0aHM/OiBzdHJpbmdbXTtcbn0pOiBQcm9taXNlPEJ1aWx0QWdlbnRzPiB7XG4gIGNvbnN0IHsgY29uZmlnLCBjb250ZXh0LCBtZW1vcnlCdWlsZGVyLCBsb2csIGV4dHJhU2tpbGxQYXRocyB9ID0gb3B0cztcbiAgY29uc3QgZGVmaW5pdGlvbnMgPSByZXNvbHZlRGVmaW5pdGlvbnMoY29uZmlnKTtcbiAgY29uc3QgaWRzID0gT2JqZWN0LmtleXMoZGVmaW5pdGlvbnMpO1xuICBjb25zdCBkZWZhdWx0QWdlbnRJZCA9IGNvbmZpZy5kZWZhdWx0QWdlbnQgPz8gaWRzWzBdID8/IEZBTExCQUNLX0FHRU5UX0lEO1xuXG4gIGNvbnN0IHBsdWdpbnMgPSBidWlsZFBsdWdpbnNNYXAoY29uZmlnLCBjb250ZXh0KTtcbiAgLy8gU3lzdGVtLWRlZmF1bHQgYW1iaWVudCB0b29scyBldmVyeSBhZ2VudCBnZXRzIG91dCBvZiB0aGUgYm94OlxuICAvLyBgcmVuZGVyX2RhdGFgIGZvciBpbmxpbmUgdmlzdWFsaXphdGlvbnMgYW5kIGBzdW1tYXJpemVgIGZvclxuICAvLyBvZmZsb2FkaW5nIHRleHQgY29uZGVuc2luZyB0byB0aGUgZmFzdCAvIHNtYWxsIGNoYXQgdGllci4gVGhlXG4gIC8vIHVzZXIgY2FuIHNoYWRvdyBlaXRoZXIgYnkgaW5jbHVkaW5nIGEgc2FtZS1uYW1lZCB0b29sIGluIHRoZWlyIG93blxuICAvLyBgY29uZmlnLnRvb2xzYCBvciBwZXItYWdlbnQgYHRvb2xzYC4gT3JkZXIgaW4ge0BsaW5rIHJlc29sdmVUb29sc31cbiAgLy8gaXMgYHN5c3RlbSAtPiB1c2VyLWFtYmllbnQgLT4gcGVyLWFnZW50YCwgbGFzdCB3cml0ZSB3aW5zLlxuICBjb25zdCBzeXN0ZW1Ub29sczogTWFzdHJhVG9vbHMgPSB7XG4gICAgcmVuZGVyX2RhdGE6IGJ1aWxkUmVuZGVyRGF0YVRvb2woY29uZmlnKSxcbiAgICBzdW1tYXJpemU6IGJ1aWxkU3VtbWFyaXplVG9vbChjb25maWcpLFxuICB9O1xuICBjb25zdCBhbWJpZW50VG9vbHMgPSB7XG4gICAgLi4uc3lzdGVtVG9vbHMsXG4gICAgLi4uKGNvbmZpZy50b29scyA/PyB7fSksXG4gIH07XG4gIGNvbnN0IHN0eWxlID0gcmVzb2x2ZVN0eWxlSW5zdHJ1Y3Rpb25zKGNvbmZpZyk7XG4gIC8vIERlZmF1bHQtb24gcHJvdGVjdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCBjb3B5aW5nIHR1cm4tc2NvcGVkXG4gIC8vIGNoYXJ0SWRzIGZyb20gcHJpb3IgYXNzaXN0YW50IHRvb2wgcmVzdWx0cyBpbnRvIHRoZSBuZXdcbiAgLy8gdHVybidzIGBbY2hhcnQ6PGlkPl1gIG1hcmtlcnMuIE9wdCBvdXQgcGVyLXBsdWdpbiB2aWFcbiAgLy8gYGNvbmZpZy5zdHJpcFN0YWxlQ2hhcnRzOiBmYWxzZWAuXG4gIGNvbnN0IG91dHB1dFByb2Nlc3NvcnMgPSBbbmV3IFJlc3VsdFByb2Nlc3NvcigpXTtcbiAgY29uc3QgaW5wdXRQcm9jZXNzb3JzID0gW1xuICAgIC4uLihjb25maWcuc3RyaXBTdGFsZUNoYXJ0cyA9PT0gZmFsc2UgPyBbXSA6IFtzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yXSksXG4gIF07XG4gIGNvbnN0IGFnZW50czogUmVjb3JkPHN0cmluZywgQWdlbnQ+ID0ge307XG4gIGNvbnN0IGRlZmF1bHRNb2RlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgYXBwcm92YWxHYXRlZEJ5QWdlbnQ6IEFycmF5PHsgYWdlbnRJZDogc3RyaW5nOyB0b29sSWRzOiBzdHJpbmdbXSB9PiA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2lkLCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKGRlZmluaXRpb25zKSkge1xuICAgIGNvbnN0IHRvb2xzID0gYXdhaXQgcmVzb2x2ZVRvb2xzKGRlZi50b29scywgcGx1Z2lucywgYW1iaWVudFRvb2xzKTtcbiAgICBsZXQgd29ya3NwYWNlID0gcmVzb2x2ZUFnZW50V29ya3NwYWNlKGRlZi53b3Jrc3BhY2UpO1xuICAgIGlmIChleHRyYVNraWxsUGF0aHM/Lmxlbmd0aCAmJiBpc0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlKSkge1xuICAgICAgd29ya3NwYWNlID0gY3JlYXRlV29ya3NwYWNlKHsgZXh0cmFTa2lsbFBhdGhzIH0pO1xuICAgICAgbWFya0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlKTtcbiAgICB9XG4gICAgY29uc3QgZ2F0ZWQgPSBhcHByb3ZhbEdhdGVkVG9vbElkcyh0b29scyk7XG4gICAgaWYgKGdhdGVkLmxlbmd0aCA+IDApIGFwcHJvdmFsR2F0ZWRCeUFnZW50LnB1c2goeyBhZ2VudElkOiBpZCwgdG9vbElkczogZ2F0ZWQgfSk7XG4gICAgY29uc3QgbWVtb3J5ID0gbWVtb3J5QnVpbGRlcj8uZm9yQWdlbnQoaWQsIGRlZik7XG4gICAgYWdlbnRzW2lkXSA9IG5ldyBBZ2VudCh7XG4gICAgICBpZCxcbiAgICAgIG5hbWU6IGRlZi5uYW1lID8/IGlkLFxuICAgICAgLy8gQWx3YXlzIGNhcnJ5IGEgbm9uLWVtcHR5IGRlc2NyaXB0aW9uOiBpdCdzIHN1cmZhY2VkIHRvIE1DUFxuICAgICAgLy8gY2xpZW50cyAod2hpY2ggcmVqZWN0IGEgZGVzY3JpcHRpb24tbGVzcyBhZ2VudCkgYW5kIGluIGFnZW50XG4gICAgICAvLyBtZXRhZGF0YS4gRmFsbCBiYWNrIHRvIGEgZ2VuZXJhdGVkIG9uZSB3aGVuIHRoZSBkZWZpbml0aW9uXG4gICAgICAvLyBvbWl0cyBpdC5cbiAgICAgIGRlc2NyaXB0aW9uOiBkZWYuZGVzY3JpcHRpb24/LnRyaW0oKSB8fCBkZWZhdWx0QWdlbnREZXNjcmlwdGlvbihkZWYubmFtZSA/PyBpZCksXG4gICAgICBpbnN0cnVjdGlvbnM6IGNvbXBvc2VJbnN0cnVjdGlvbnMoZGVmLmluc3RydWN0aW9ucywgc3R5bGUpLFxuICAgICAgbW9kZWw6IHJlc29sdmVNb2RlbChjb25maWcsIGRlZi5tb2RlbCksXG4gICAgICBkZWZhdWx0T3B0aW9uczoge1xuICAgICAgICBtYXhTdGVwczogY29uZmlnLmFnZW50TWF4U3RlcHMgPz8gREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMsXG4gICAgICB9LFxuICAgICAgdG9vbHMsXG4gICAgICAuLi4obWVtb3J5ID8geyBtZW1vcnkgfSA6IHt9KSxcbiAgICAgIC4uLih3b3Jrc3BhY2UgPyB7IHdvcmtzcGFjZSB9IDoge30pLFxuICAgICAgaW5wdXRQcm9jZXNzb3JzLFxuICAgICAgb3V0cHV0UHJvY2Vzc29ycyxcbiAgICB9KTtcbiAgICAvLyBTdXJmYWNlIHRoZSBlZmZlY3RpdmUgZGVmYXVsdCBtb2RlbCBwZXIgYWdlbnQgc28gb3BlcmF0b3JzIGNhblxuICAgIC8vIHNlZSBhdCBhIGdsYW5jZSB3aGljaCBlbmRwb2ludCBlYWNoIGFnZW50IHBvaW50cyBhdCB3aXRob3V0XG4gICAgLy8gaGF2aW5nIHRvIGZpcmUgYSByZXF1ZXN0IGFuZCBpbnNwZWN0IGEgdHJhY2UuIFRoZSB2YWx1ZSBpcyB0aGVcbiAgICAvLyAqc3RhdGljKiBkZWZhdWx0OyBwZXItcmVxdWVzdCBvdmVycmlkZXMgKGhlYWRlciAvIHF1ZXJ5IC9cbiAgICAvLyBib2R5KSBhbmQgdGhlIHdvcmtzcGFjZS1jYXRhbG9ndWUgZnV6enkgbWF0Y2ggc3RpbGwgYXBwbHkgYXRcbiAgICAvLyBjYWxsIHRpbWUuXG4gICAgY29uc3QgZGVmYXVsdE1vZGVsID0gZGVzY3JpYmVBZ2VudERlZmF1bHRNb2RlbChjb25maWcsIGRlZik7XG4gICAgZGVmYXVsdE1vZGVsc1tpZF0gPSBkZWZhdWx0TW9kZWw7XG4gICAgbG9nLmluZm8oXCJhZ2VudCByZWdpc3RlcmVkXCIsIHtcbiAgICAgIGlkLFxuICAgICAgbmFtZTogZGVmLm5hbWUgPz8gaWQsXG4gICAgICBkZWZhdWx0TW9kZWwsXG4gICAgICB0b29sczogT2JqZWN0LmtleXModG9vbHMpLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFhZ2VudHNbZGVmYXVsdEFnZW50SWRdKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgbWFzdHJhIGRlZmF1bHRBZ2VudCBcIiR7ZGVmYXVsdEFnZW50SWR9XCJgLFxuICAgICAgYFJlZ2lzdGVyZWQgYWdlbnRzOiAke2lkcy5qb2luKFwiLCBcIikgfHwgXCJub25lXCJ9LmAsXG4gICAgKTtcbiAgfVxuXG4gIGFzc2VydEFwcHJvdmFsR2F0ZWRUb29sc0hhdmVTdG9yYWdlKGFwcHJvdmFsR2F0ZWRCeUFnZW50LCBtZW1vcnlCdWlsZGVyKTtcblxuICBsb2cuaW5mbyhcImFnZW50cyByZWFkeVwiLCB7IGlkcywgZGVmYXVsdEFnZW50SWQgfSk7XG4gIHJldHVybiB7IGFnZW50cywgZGVmYXVsdEFnZW50SWQsIGRlZmF1bHRNb2RlbHMsIGFtYmllbnRUb29scyB9O1xufVxuXG4vKipcbiAqIFRvb2wgaWRzIG9uIGB0b29sc2AgdGhhdCBhcmUgYXBwcm92YWwtZ2F0ZWQgKGByZXF1aXJlQXBwcm92YWw6IHRydWVgKS5cbiAqIEtleXMgYXJlIHVzZWQgYXMgYSBmYWxsYmFjayB3aGVuIGEgdG9vbCBvbWl0cyBhbiBleHBsaWNpdCBgaWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwcm92YWxHYXRlZFRvb2xJZHModG9vbHM6IE1hc3RyYVRvb2xzKTogc3RyaW5nW10ge1xuICBpZiAoIXRvb2xzIHx8IHR5cGVvZiB0b29scyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIFtdO1xuICByZXR1cm4gW1xuICAgIC4uLm9iamVjdFxuICAgICAgLnNlcXVlbmNlKE9iamVjdC5lbnRyaWVzKHRvb2xzKSlcbiAgICAgIC5maWx0ZXIoKFssIHRvb2xdKSA9PiBpc0FwcHJvdmFsR2F0ZWRUb29sKHRvb2wpKVxuICAgICAgLm1hcCgoW2tleSwgdG9vbF0pID0+IHJlc29sdmVUb29sSWQodG9vbCwga2V5KSksXG4gIF07XG59XG5cbi8qKiBUcnVlIHdoZW4gYSBNYXN0cmEgLyBBSSBTREsgdG9vbCBwYXVzZXMgZm9yIGh1bWFuIGFwcHJvdmFsIGJlZm9yZSBleGVjdXRlLiAqL1xuZnVuY3Rpb24gaXNBcHByb3ZhbEdhdGVkVG9vbCh0b29sOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghdG9vbCB8fCB0eXBlb2YgdG9vbCAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKHRvb2wgYXMgeyByZXF1aXJlQXBwcm92YWw/OiBib29sZWFuIH0pLnJlcXVpcmVBcHByb3ZhbCA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRvb2xJZCh0b29sOiB1bmtub3duLCBmYWxsYmFja0tleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHRvb2wgJiYgdHlwZW9mIHRvb2wgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mICh0b29sIGFzIHsgaWQ/OiBzdHJpbmcgfSkuaWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gKHRvb2wgYXMgeyBpZDogc3RyaW5nIH0pLmlkO1xuICB9XG4gIHJldHVybiBmYWxsYmFja0tleTtcbn1cblxuLyoqXG4gKiBBcHByb3ZhbC1nYXRlZCB0b29scyBzdXNwZW5kIHRoZSBhZ2VudCBsb29wIHVudGlsIGEgaHVtYW4gYXBwcm92ZXMuXG4gKiBNYXN0cmEgcGVyc2lzdHMgdGhvc2Ugc3VzcGVuZGVkIHJ1bnMgaW4gTWFzdHJhLWluc3RhbmNlLWxldmVsIHN0b3JhZ2VcbiAqIChgbWVtb3J5QnVpbGRlci5pbnN0YW5jZVN0b3JhZ2UoKWApLCBub3QgcGVyLWFnZW50IG1lbW9yeSAtIHNvIGJvb3RcbiAqIG11c3QgZmFpbCBmYXN0IHdoZW4gc3VjaCBhIHRvb2wgaXMgcmVnaXN0ZXJlZCB3aXRob3V0IHN0b3JhZ2UuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydEFwcHJvdmFsR2F0ZWRUb29sc0hhdmVTdG9yYWdlKFxuICBnYXRlZDogQXJyYXk8eyBhZ2VudElkOiBzdHJpbmc7IHRvb2xJZHM6IHN0cmluZ1tdIH0+LFxuICBtZW1vcnlCdWlsZGVyOiBNZW1vcnlCdWlsZGVyIHwgdW5kZWZpbmVkLFxuKTogdm9pZCB7XG4gIGlmIChnYXRlZC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgaWYgKG1lbW9yeUJ1aWxkZXI/Lmluc3RhbmNlU3RvcmFnZSgpKSByZXR1cm47XG5cbiAgY29uc3QgZGV0YWlsID0gZ2F0ZWRcbiAgICAubWFwKCh7IGFnZW50SWQsIHRvb2xJZHMgfSkgPT4gYCR7YWdlbnRJZH06ICR7dG9vbElkcy5qb2luKFwiLCBcIil9YClcbiAgICAuam9pbihcIjsgXCIpO1xuICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgIFwibWFzdHJhOiBhcHByb3ZhbC1nYXRlZCB0b29scyByZXF1aXJlIHBsdWdpbiBzdG9yYWdlIChQb3N0Z3Jlc1N0b3JlKSB0byBwZXJzaXN0IHN1c3BlbmRlZCBydW5zLiBcIiArXG4gICAgICBgQWZmZWN0ZWQgYWdlbnRzL3Rvb2xzOiAke2RldGFpbH0uIGAgK1xuICAgICAgXCJSZWdpc3RlciBsYWtlYmFzZSgpIGJlZm9yZSBtYXN0cmEoKSBzbyBzdG9yYWdlIGF1dG8tZW5hYmxlcywgb3IgcGFzcyBzdG9yYWdlOiB0cnVlIGV4cGxpY2l0bHkuXCIsXG4gICk7XG59XG5cbi8qKlxuICogQmVzdC1lZmZvcnQgZGVzY3JpcHRpb24gb2YgdGhlICpzdGF0aWMqIGRlZmF1bHQgbW9kZWwgYW4gYWdlbnQgd2lsbFxuICogcmVzb2x2ZSB0byBhdCBjYWxsIHRpbWUuIFdhbGtzIHRoZSBzYW1lIHByZWNlZGVuY2UgbGFkZGVyIGFzXG4gKiB7QGxpbmsgcmVzb2x2ZU1vZGVsfSAvIHtAbGluayBidWlsZE1vZGVsfTpcbiAqXG4gKiAgIDEuIFBlci1hZ2VudCBgZGVmLm1vZGVsYCAoc3RyaW5nIHN1Z2FyIC0+IHRoZSBsaXRlcmFsIGlkO1xuICogICAgICBmdW5jdGlvbiAvIGBEeW5hbWljQXJndW1lbnRgIC0+IGBcIjxkeW5hbWljPlwiYCBiZWNhdXNlIHRoZVxuICogICAgICByZXNvbHZlciBkZWNpZGVzIGF0IGNhbGwgdGltZSkuXG4gKiAgIDIuIFBsdWdpbi1sZXZlbCBgY29uZmlnLmRlZmF1bHRNb2RlbGAgKHNhbWUgcnVsZXMpLlxuICogICAzLiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgIGVudiB2YXIuXG4gKiAgIDQuIEZpcnN0IGVudHJ5IG9mIGBjb25maWcuZGVmYXVsdE1vZGVsRmFsbGJhY2tzID8/IGZhbGxiYWNrLkZBTExCQUNLX01PREVMX0lEU2AuXG4gKlxuICogVXNlZCBmb3IgdGhlIHN0YXJ0dXAgYGFnZW50IHJlZ2lzdGVyZWRgIGxvZyBzbyBvcGVyYXRvcnMgY2FuIHNlZVxuICogd2hpY2ggZW5kcG9pbnQgZWFjaCBhZ2VudCBwb2ludHMgYXQgYnkgZGVmYXVsdC4gUGVyLXJlcXVlc3RcbiAqIG92ZXJyaWRlcyAoYFgtTWFzdHJhLU1vZGVsYCBldGMuKSBhbmQgdGhlIHdvcmtzcGFjZS1jYXRhbG9ndWVcbiAqIGZ1enp5IG1hdGNoIGFyZSBzdGlsbCBhcHBsaWVkIGF0IHJ1bnRpbWUuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlQWdlbnREZWZhdWx0TW9kZWwoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsIGRlZjogTWFzdHJhQWdlbnREZWZpbml0aW9uKTogc3RyaW5nIHtcbiAgY29uc3QgZWZmZWN0aXZlID0gZGVmLm1vZGVsID8/IGNvbmZpZy5kZWZhdWx0TW9kZWw7XG4gIGlmICh0eXBlb2YgZWZmZWN0aXZlID09PSBcInN0cmluZ1wiKSByZXR1cm4gZWZmZWN0aXZlO1xuICBpZiAoZWZmZWN0aXZlICE9PSB1bmRlZmluZWQpIHJldHVybiBcIjxkeW5hbWljPlwiO1xuICByZXR1cm4gKFxuICAgIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FID8/XG4gICAgY29uZmlnLmRlZmF1bHRNb2RlbEZhbGxiYWNrcz8uWzBdID8/XG4gICAgZmFsbGJhY2suRkFMTEJBQ0tfTU9ERUxfSURTWzBdIVxuICApO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBgY29uZmlnLmFnZW50c2AgaW50byBhIGBSZWNvcmQ8aWQsIGRlZmluaXRpb24+YC4gQWNjZXB0c1xuICogYW55IG9mIHRoZSB0aHJlZSBzaGFwZXMgZG9jdW1lbnRlZCBvblxuICoge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudHN9OlxuICpcbiAqIC0gUmVjb3JkIC0gcmV0dXJuZWQgYXMtaXMgd2hlbiBub24tZW1wdHkuXG4gKiAtIFNpbmdsZSBkZWZpbml0aW9uIChkZXRlY3RlZCB2aWEgdGhlIHJlcXVpcmVkIGBpbnN0cnVjdGlvbnNgXG4gKiAgIGZpZWxkKSAtIGtleWVkIGJ5IGBzbHVnaWZ5KGRlZi5uYW1lKWAgb3IgYEZBTExCQUNLX0FHRU5UX0lEYC5cbiAqIC0gQXJyYXkgLSBrZXllZCBieSBgc2x1Z2lmeShkZWYubmFtZSlgIG9yIGBhZ2VudF8ke2l9YDsgZHVwbGljYXRlXG4gKiAgIHNsdWdzIGZhaWwgbG91ZGx5IHNvIHVzZXJzIGtub3cgdG8gc2V0IGV4cGxpY2l0IG5hbWVzLlxuICpcbiAqIE9taXR0ZWQgb3IgZW1wdHkgaW5wdXRzIGZhbGwgYmFjayB0byBhIHNpbmdsZSBidWlsdC1pbiBhbmFseXN0IHNvXG4gKiB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZyBjaGF0IHJvdXRlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRGVmaW5pdGlvbnMoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBSZWNvcmQ8c3RyaW5nLCBNYXN0cmFBZ2VudERlZmluaXRpb24+IHtcbiAgY29uc3QgaW5wdXQgPSBjb25maWcuYWdlbnRzO1xuICBpZiAoIWlucHV0KSByZXR1cm4gZmFsbGJhY2tEZWZpbml0aW9ucygpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIGlmIChpbnB1dC5sZW5ndGggPT09IDApIHJldHVybiBmYWxsYmFja0RlZmluaXRpb25zKCk7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBNYXN0cmFBZ2VudERlZmluaXRpb24+ID0ge307XG4gICAgaW5wdXQuZm9yRWFjaCgoZGVmLCBpKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYsIGkpO1xuICAgICAgaWYgKG91dFtrZXldKSB7XG4gICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgICAgICAgYG1hc3RyYTogZHVwbGljYXRlIGFnZW50IGlkIFwiJHtrZXl9XCIgZGVyaXZlZCBmcm9tIG5hbWUgXCIke2RlZi5uYW1lID8/IFwiXCJ9XCI7IGAgK1xuICAgICAgICAgICAgYHNldCB1bmlxdWUgXFxgbmFtZVxcYHMgb24gZWFjaCBkZWZpbml0aW9uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG91dFtrZXldID0gZGVmO1xuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvLyBTaW5nbGUtZGVmaW5pdGlvbiBzaG9ydGhhbmQ6IGFuIGFnZW50IGFsd2F5cyBoYXMgYGluc3RydWN0aW9uczogc3RyaW5nYCxcbiAgLy8gYSByZWNvcmQtb2YtYWdlbnRzIG5ldmVyIGhhcyB0aGF0IGZpZWxkIGRpcmVjdGx5LlxuICBpZiAodHlwZW9mIChpbnB1dCBhcyBNYXN0cmFBZ2VudERlZmluaXRpb24pLmluc3RydWN0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGRlZiA9IGlucHV0IGFzIE1hc3RyYUFnZW50RGVmaW5pdGlvbjtcbiAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYpO1xuICAgIHJldHVybiB7IFtrZXldOiBkZWYgfTtcbiAgfVxuXG4gIGNvbnN0IHJlY29yZCA9IGlucHV0IGFzIFJlY29yZDxzdHJpbmcsIE1hc3RyYUFnZW50RGVmaW5pdGlvbj47XG4gIGlmIChPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTtcbiAgcmV0dXJuIHJlY29yZDtcbn1cblxuLyoqIERlcml2ZSBhIHJlZ2lzdHJ5IGlkIGZyb20gYSBkZWZpbml0aW9uJ3MgYG5hbWVgLCB3aXRoIGEgZmFsbGJhY2suICovXG5mdW5jdGlvbiBkZXJpdmVBZ2VudEtleShkZWY6IE1hc3RyYUFnZW50RGVmaW5pdGlvbiwgaW5kZXg/OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoZGVmLm5hbWUpIHtcbiAgICBjb25zdCBzbHVnID0gc3RyaW5nLnRvSWRlbnRpZmllcihkZWYubmFtZSk7XG4gICAgaWYgKHNsdWcpIHJldHVybiBzbHVnO1xuICB9XG4gIHJldHVybiBpbmRleCA9PT0gdW5kZWZpbmVkID8gRkFMTEJBQ0tfQUdFTlRfSUQgOiBgYWdlbnRfJHtpbmRleH1gO1xufVxuXG4vKiogQnVpbHQtaW4gZmFsbGJhY2sgcmVnaXN0cnkgdXNlZCB3aGVuIGBhZ2VudHNgIGlzIG9taXR0ZWQgLyBlbXB0eS4gKi9cbmZ1bmN0aW9uIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTogUmVjb3JkPHN0cmluZywgTWFzdHJhQWdlbnREZWZpbml0aW9uPiB7XG4gIHJldHVybiB7XG4gICAgW0ZBTExCQUNLX0FHRU5UX0lEXToge1xuICAgICAgbmFtZTogXCJEZWZhdWx0IEFnZW50XCIsXG4gICAgICBpbnN0cnVjdGlvbnM6IEZBTExCQUNLX0FHRU5UX0lOU1RSVUNUSU9OUyxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIGVmZmVjdGl2ZSBtb2RlbCBzcGVjIGZvciBhbiBhZ2VudC4gRmFsbGJhY2sgbGFkZGVyLCBpblxuICogb3JkZXI6XG4gKlxuICogICAxLiBQZXItYWdlbnQgYGRlZi5tb2RlbGAgKHN0cmluZyBzdWdhciBvciBgRHluYW1pY0FyZ3VtZW50YCkuXG4gKiAgIDIuIFBsdWdpbi1sZXZlbCBgY29uZmlnLmRlZmF1bHRNb2RlbGAgKHN0cmluZyBzdWdhciBvclxuICogICAgICBgRHluYW1pY0FyZ3VtZW50YCkgLSBtaXJyb3JzIEFwcEtpdCdzIGBhZ2VudHMoeyBkZWZhdWx0TW9kZWwgfSlgLlxuICogICAzLiBUaGUgYXV0by1yZXNvbHZlciB0aGF0IG1pbnRzIHVzZXItc2NvcGVkIHRva2VucyBhZ2FpbnN0XG4gKiAgICAgIGAvc2VydmluZy1lbmRwb2ludHNgIHZpYSB7QGxpbmsgYnVpbGRNb2RlbH0uXG4gKlxuICogU3RyaW5nIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBgbW9kZWxJZGAgc3VnYXIgYW5kIHRocmVhZGVkIHRocm91Z2hcbiAqIGBidWlsZE1vZGVsYCdzIG92ZXJyaWRlIGhvb2sgc28gdGhlIHJ1bnRpbWUgZnV6enkgbWF0Y2hlciBhbmQgdGhlXG4gKiBwZXItcmVxdWVzdCBgWC1NYXN0cmEtTW9kZWxgIG92ZXJyaWRlIGxheWVyIG9uIHRvcCBvZiB0aGUgc3RhdGljXG4gKiBjaG9pY2UuIE5vbi1zdHJpbmcgYER5bmFtaWNBcmd1bWVudGBzIGFyZSBwYXNzZWQgdGhyb3VnaCB2ZXJiYXRpbTtcbiAqIGNhbGxlcnMgdGhhdCBuZWVkIGZ1bGwgY29udHJvbCBvdmVyIGBwcm92aWRlcklkYCAvIGBoZWFkZXJzYCAvXG4gKiBgbW9kZWxJZGAgYnlwYXNzIHRoZSByZXNvbHZlciBwaXBlbGluZSBlbnRpcmVseS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1vZGVsKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgb3ZlcnJpZGU6IE1hc3RyYUFnZW50RGVmaW5pdGlvbltcIm1vZGVsXCJdLFxuKTogQWdlbnRDb25maWdbXCJtb2RlbFwiXSB7XG4gIGNvbnN0IGVmZmVjdGl2ZSA9IG92ZXJyaWRlID8/IGNvbmZpZy5kZWZhdWx0TW9kZWw7XG4gIGlmIChlZmZlY3RpdmUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiBidWlsZE1vZGVsKGNvbmZpZywgcmVxdWVzdENvbnRleHQpO1xuICB9XG4gIGlmICh0eXBlb2YgZWZmZWN0aXZlID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgbW9kZWxJZCA9IGVmZmVjdGl2ZTtcbiAgICByZXR1cm4gKHsgcmVxdWVzdENvbnRleHQgfSkgPT4gYnVpbGRNb2RlbChjb25maWcsIHJlcXVlc3RDb250ZXh0LCB7IG1vZGVsSWQgfSk7XG4gIH1cbiAgcmV0dXJuIGVmZmVjdGl2ZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgZGVmaW5pdGlvbidzIGB0b29sc2AgZmllbGQgdG8gYSBmbGF0IGBNYXN0cmFUb29sc2AgcmVjb3JkLFxuICogbWVyZ2luZyBpbiBwbHVnaW4tbGV2ZWwgYW1iaWVudCB0b29scyAocGVyLWFnZW50IHRvb2xzIHdpbiBvbiBrZXlcbiAqIGNvbGxpc2lvbikuIENhbGxiYWNrIGVycm9ycyBwcm9wYWdhdGUgdmVyYmF0aW0gc28gdGhlIG9yaWdpbmFsIHN0YWNrXG4gKiBzdXJ2aXZlcyAtIHRoZSBjYWxsZXIgYWxyZWFkeSBrbm93cyB3aGljaCBhZ2VudCB3YXMgcmVnaXN0ZXJpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVUb29scyhcbiAgZGVmVG9vbHM6IE1hc3RyYUFnZW50RGVmaW5pdGlvbltcInRvb2xzXCJdLFxuICBwbHVnaW5zOiBNYXN0cmFQbHVnaW5zLFxuICBhbWJpZW50VG9vbHM6IE1hc3RyYVRvb2xzLFxuKTogUHJvbWlzZTxNYXN0cmFUb29scz4ge1xuICBpZiAoIWRlZlRvb2xzKSByZXR1cm4geyAuLi5hbWJpZW50VG9vbHMgfTtcbiAgY29uc3QgcmVzb2x2ZWQgPSB0eXBlb2YgZGVmVG9vbHMgPT09IFwiZnVuY3Rpb25cIiA/IGF3YWl0IGRlZlRvb2xzKHBsdWdpbnMpIDogZGVmVG9vbHM7XG4gIHJldHVybiB7IC4uLmFtYmllbnRUb29scywgLi4ucmVzb2x2ZWQgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFnZW50V29ya3NwYWNlKFxuICB3b3Jrc3BhY2U6IE1hc3RyYUFnZW50RGVmaW5pdGlvbltcIndvcmtzcGFjZVwiXSxcbik6IFdvcmtzcGFjZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghd29ya3NwYWNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIHdvcmtzcGFjZSA9PT0gXCJmdW5jdGlvblwiID8gd29ya3NwYWNlKCkgOiB3b3Jrc3BhY2U7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHtAbGluayBNYXN0cmFQbHVnaW5zfSBydW50aW1lIHByb3h5IGhhbmRlZCB0b1xuICogYHRvb2xzKHBsdWdpbnMpYCBjYWxsYmFja3MuXG4gKlxuICogSW1wbGVtZW50ZWQgYXMgYSBgUHJveHlgIG92ZXIgdGhlIEFwcEtpdCBwbHVnaW4gY29udGV4dCBzb1xuICogYHBsdWdpbnMuPG5hbWU+YCByZXNvbHZlcyBhdCBmaXJzdCBhY2Nlc3MuIEFueSBzaWJsaW5nIHBsdWdpbiB0aGF0XG4gKiBpbXBsZW1lbnRzIEFwcEtpdCdzIHN0YW5kYXJkIGBUb29sUHJvdmlkZXJgIGludGVyZmFjZVxuICogKGB0b29sa2l0KG9wdHM/KWAgKyBgZXhlY3V0ZUFnZW50VG9vbChuYW1lLCBhcmdzLCBzaWduYWw/LCBjb250ZXh0PylgKSBpc1xuICogYXV0by1hZGFwdGVkIGludG8gTWFzdHJhIHRvb2xzLiBVbmtub3duIG5hbWVzIHJldHVybiBgdW5kZWZpbmVkYCxcbiAqIG1hdGNoaW5nIEFwcEtpdCdzIGBQbHVnaW5zYCBzZW1hbnRpY3Mgc28gYHBsdWdpbnMuZm9vPy50b29sa2l0KClgXG4gKiByZW1haW5zIHNhZmUgaW4gZW52aXJvbm1lbnRzIHdoZXJlIGBmb29gIGlzbid0IHJlZ2lzdGVyZWQuXG4gKlxuICogYGdlbmllYCBpcyBzcGVjaWFsLWNhc2VkIHRvIHN3YXAgdGhlIGdlbmVyaWMgQXBwS2l0IHRvb2xraXQgKHdoaWNoXG4gKiBydW5zIGBleGVjdXRlQWdlbnRUb29sYCBhbmQgb25seSBlbWl0cyBhIHNpbmdsZSBmaW5hbCBgdG9vbC1yZXN1bHRgXG4gKiBjaHVuayBwZXIgY2FsbCkgZm9yIHRoZSBzdHJlYW1pbmctYXdhcmUgdG9vbHMgYnVpbHQgYnlcbiAqIHtAbGluayBidWlsZEdlbmllVG9vbGtpdFByb3ZpZGVyfS4gVGhlIHN0cmVhbWluZyB2YXJpYW50IGZvcndhcmRzIGVhY2hcbiAqIEdlbmllIHdpcmUgZXZlbnQgKHN0YXR1cywgU1FMLCByb3cgY291bnRzLCBlcnJvcnMpIG91dCB0aHJvdWdoIHRoZVxuICogTWFzdHJhIGBjdHgud3JpdGVyYCwgc28gdGhlIFVJIGdldHMgYHRvb2wtb3V0cHV0YCBjaHVua3MgaW4gcmVhbFxuICogdGltZSBpbnN0ZWFkIG9mIHN0YXJpbmcgYXQgYSBzcGlubmVyIGZvciB0aGUgZnVsbCBHZW5pZSByb3VuZC10cmlwLlxuICovXG5mdW5jdGlvbiBidWlsZFBsdWdpbnNNYXAoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBjb250ZXh0OiBwbHVnaW4uUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQsXG4pOiBNYXN0cmFQbHVnaW5zIHtcbiAgY29uc3QgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHwgbnVsbD4oKTtcbiAgcmV0dXJuIG5ldyBQcm94eSh7fSBhcyBNYXN0cmFQbHVnaW5zLCB7XG4gICAgZ2V0KF90YXJnZXQsIHByb3BOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BOYW1lICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgaWYgKGNhY2hlLmhhcyhwcm9wTmFtZSkpIHJldHVybiBjYWNoZS5nZXQocHJvcE5hbWUpID8/IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHByb3ZpZGVyID0gcmVzb2x2ZVByb3ZpZGVyKGNvbmZpZywgY29udGV4dCwgcHJvcE5hbWUpO1xuICAgICAgY2FjaGUuc2V0KHByb3BOYW1lLCBwcm92aWRlcik7XG4gICAgICByZXR1cm4gcHJvdmlkZXIgPz8gdW5kZWZpbmVkO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIHJpZ2h0IHtAbGluayBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXJ9IGZvciBhIHNpYmxpbmdcbiAqIHBsdWdpbiBsb29rdXAuIFJldHVybnMgdGhlIEdlbmllIGFnZW50LWJhY2tlZCBhZGFwdGVyIHdoZW5cbiAqIHRoZSBjYWxsZXIgYXNrcyBmb3IgYGdlbmllYCBBTkQgYXQgbGVhc3Qgb25lIHNwYWNlIGlzIHJlYWNoYWJsZVxuICogdmlhIHtAbGluayByZXNvbHZlR2VuaWVTcGFjZXN9ICh0aGUgZXhwbGljaXRcbiAqIGBjb25maWcuZ2VuaWVTcGFjZXNgLCB0aGUgcmVnaXN0ZXJlZCBBcHBLaXQgYGdlbmllKClgIHBsdWdpbidzXG4gKiBgc3BhY2VzYCBjb25maWcsIG9yIHRoZSBgREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRGAgZW52IHZhcikuXG4gKiBGYWxscyBiYWNrIHRvIHRoZSBnZW5lcmljIEFwcEtpdCBgVG9vbFByb3ZpZGVyYCBhZGFwdGVyIGZvclxuICogZXZlcnkgb3RoZXIgcGx1Z2luIG5hbWUuIGBjb25maWdgIGlzIHRocmVhZGVkIHRocm91Z2ggc28gdGhlXG4gKiBHZW5pZSBhZ2VudCBpbmhlcml0cyB0aGUgc2FtZSBtb2RlbCByZXNvbHZlciAvIGZhbGxiYWNrXG4gKiBsYWRkZXIgdGhlIGNhbGxpbmcgYWdlbnRzIHVzZS5cbiAqXG4gKiBUaGUgR2VuaWUgdG9vbHMgdGFsayB0byBHZW5pZSBkaXJlY3RseSB0aHJvdWdoIGBAZGJ4LXRvb2xzL2dlbmllYFxuICogKGBnZW5pZUV2ZW50Q2hhdGApIGFuZCB0aGUgd29ya3NwYWNlIGBzdGF0ZW1lbnRFeGVjdXRpb24uZ2V0U3RhdGVtZW50YFxuICogQVBJOyBBcHBLaXQncyBzdG9jayBgZ2VuaWVgIHBsdWdpbiBjb250cmlidXRlcyBvbmx5IGl0cyByZXNvdXJjZVxuICogbWFuaWZlc3QgYW5kIGBzcGFjZXNgIGNvbmZpZywgc28gYW4gYGFwcC55YW1sYCByZXNvdXJjZSBiaW5kaW5nIGFuZCBhXG4gKiBgZ2VuaWUoeyBzcGFjZXMgfSlgIHJlY29yZCBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgaGVyZSBhcyB0aGV5IGRvIHRoZXJlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlUHJvdmlkZXIoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBjb250ZXh0OiBwbHVnaW4uUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQsXG4gIHByb3BOYW1lOiBzdHJpbmcsXG4pOiBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIgfCBudWxsIHtcbiAgaWYgKHByb3BOYW1lID09PSBcImdlbmllXCIpIHtcbiAgICBjb25zdCBzcGFjZXMgPSByZXNvbHZlR2VuaWVTcGFjZXMoY29uZmlnLCBjb250ZXh0KTtcbiAgICBpZiAoT2JqZWN0LmtleXMoc3BhY2VzKS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIHJldHVybiBidWlsZEdlbmllVG9vbGtpdFByb3ZpZGVyKHtcbiAgICAgIHNwYWNlcyxcbiAgICAgIGNvbmZpZyxcbiAgICB9KSBhcyBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXI7XG4gIH1cbiAgY29uc3QgcGx1Z2luID0gY29udGV4dD8uZ2V0UGx1Z2lucygpLmdldChwcm9wTmFtZSk7XG4gIHJldHVybiBhZGFwdFBsdWdpblRvb2xraXQocGx1Z2luKTtcbn1cblxuLyoqXG4gKiBBcHBLaXQgYFRvb2xQcm92aWRlcmAgc2hhcGUgd2UgZHVjay10eXBlIGFnYWluc3QgYW55IHJlZ2lzdGVyZWRcbiAqIHBsdWdpbi4gRGVmaW5lZCBzdHJ1Y3R1cmFsbHkgdG8gYXZvaWQgY291cGxpbmcgdG8gQXBwS2l0J3MgaW50ZXJuYWxcbiAqIHR5cGUgbW9kdWxlIGxheW91dC5cbiAqL1xuaW50ZXJmYWNlIEFwcEtpdFRvb2xraXRQcm92aWRlciB7XG4gIHRvb2xraXQ/OiAob3B0cz86IFRvb2xraXRPcHRpb25zKSA9PiBSZWNvcmQ8c3RyaW5nLCBBcHBLaXRUb29sa2l0RW50cnk+O1xuICBleGVjdXRlQWdlbnRUb29sPzogKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBhcmdzOiB1bmtub3duLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICAgIGNvbnRleHQ/OiB7IHJlc291cmNlSWQ/OiBzdHJpbmcgfSxcbiAgKSA9PiBQcm9taXNlPHVua25vd24+O1xufVxuXG4vKiogU2luZ2xlIGVudHJ5IHJldHVybmVkIGJ5IGFuIEFwcEtpdCBwbHVnaW4ncyBgLnRvb2xraXQob3B0cylgIGNhbGwuICovXG5pbnRlcmZhY2UgQXBwS2l0VG9vbGtpdEVudHJ5IHtcbiAgcmVhZG9ubHkgX190b29sa2l0UmVmPzogdHJ1ZTtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBsb2NhbE5hbWU6IHN0cmluZztcbiAgZGVmOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcGFyYW1ldGVyczogdW5rbm93bjtcbiAgfTtcbiAgYW5ub3RhdGlvbnM/OiB7XG4gICAgZWZmZWN0PzogXCJyZWFkXCIgfCBcIndyaXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cnVjdGl2ZVwiO1xuICAgIHJlcXVpcmVzVXNlckNvbnRleHQ/OiBib29sZWFuO1xuICB9O1xufVxuXG4vKipcbiAqIEFkYXB0IGFuIEFwcEtpdCBgVG9vbFByb3ZpZGVyYCBwbHVnaW4gaW5zdGFuY2UgaW50byBhXG4gKiB7QGxpbmsgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyfS4gUmV0dXJucyBgbnVsbGAgZm9yIGFueSBwbHVnaW5cbiAqIHRoYXQgZG9lc24ndCBpbXBsZW1lbnQgYm90aCBgdG9vbGtpdGAgYW5kIGBleGVjdXRlQWdlbnRUb29sYCAoZS5nLlxuICogYHNlcnZlcmAsIGBsYWtlYmFzZWAgd2hlbiB1c2VkIG9ubHkgYXMgYSBQb3N0Z3JlcyBwb29sLCBldGMuKS5cbiAqL1xuZnVuY3Rpb24gYWRhcHRQbHVnaW5Ub29sa2l0KHBsdWdpbjogdW5rbm93bik6IE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB8IG51bGwge1xuICBpZiAoIXBsdWdpbiB8fCB0eXBlb2YgcGx1Z2luICE9PSBcIm9iamVjdFwiKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcCA9IHBsdWdpbiBhcyBBcHBLaXRUb29sa2l0UHJvdmlkZXI7XG4gIGlmICh0eXBlb2YgcC50b29sa2l0ICE9PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHAuZXhlY3V0ZUFnZW50VG9vbCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0b29sa2l0KG9wdHM/OiBUb29sa2l0T3B0aW9ucyk6IE1hc3RyYVRvb2xzIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBwLnRvb2xraXQhKG9wdHMpO1xuICAgICAgY29uc3QgdG9vbHM6IE1hc3RyYVRvb2xzID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhlbnRyaWVzKSkge1xuICAgICAgICB0b29sc1trZXldID0gdG9vbGtpdEVudHJ5VG9NYXN0cmFUb29sKGVudHJ5LCBwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0b29scztcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFdyYXAgYSBzaW5nbGUge0BsaW5rIEFwcEtpdFRvb2xraXRFbnRyeX0gYXMgYSBNYXN0cmEgdG9vbCB3aG9zZVxuICogYGV4ZWN1dGVgIGRpc3BhdGNoZXMgYmFjayB0aHJvdWdoIGBwbHVnaW4uZXhlY3V0ZUFnZW50VG9vbCguLi4pYCBzb1xuICogQXBwS2l0J3MgT0JPIGF1dGggKGBhc1VzZXJgKSwgdGVsZW1ldHJ5IHNwYW5zLCBhbmQgdGhlIE1hc3RyYSBtZW1vcnkgcmVzb3VyY2VcbiAqIGlkIHN0YXkgaW50YWN0LiBKU09OIFNjaGVtYSBwYXJhbWV0ZXJzIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQgLSBNYXN0cmEnc1xuICogYFB1YmxpY1NjaGVtYWAgYWNjZXB0cyBgSlNPTlNjaGVtYTdgIGRpcmVjdGx5IHZpYSBgQG1hc3RyYS9zY2hlbWEtY29tcGF0YC5cbiAqL1xuZnVuY3Rpb24gdG9vbGtpdEVudHJ5VG9NYXN0cmFUb29sKGVudHJ5OiBBcHBLaXRUb29sa2l0RW50cnksIHBsdWdpbjogQXBwS2l0VG9vbGtpdFByb3ZpZGVyKTogVG9vbCB7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogYCR7ZW50cnkucGx1Z2luTmFtZX1fXyR7ZW50cnkubG9jYWxOYW1lfWAsXG4gICAgZGVzY3JpcHRpb246IGVudHJ5LmRlZi5kZXNjcmlwdGlvbixcbiAgICAuLi4oZW50cnkuZGVmLnBhcmFtZXRlcnMgPyB7IGlucHV0U2NoZW1hOiBlbnRyeS5kZWYucGFyYW1ldGVycyBhcyBuZXZlciB9IDoge30pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uID0gY29udGV4dCBhc1xuICAgICAgICB8IHtcbiAgICAgICAgICAgIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG4gICAgICAgICAgICByZXF1ZXN0Q29udGV4dD86IHsgZ2V0KGtleTogc3RyaW5nKTogdW5rbm93biB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXNvdXJjZUlkID0gZXhlY3V0aW9uPy5yZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkpO1xuICAgICAgcmV0dXJuIHBsdWdpbi5leGVjdXRlQWdlbnRUb29sIShlbnRyeS5sb2NhbE5hbWUsIGlucHV0LCBleGVjdXRpb24/LmFib3J0U2lnbmFsLCB7XG4gICAgICAgIC4uLih0eXBlb2YgcmVzb3VyY2VJZCA9PT0gXCJzdHJpbmdcIiA/IHsgcmVzb3VyY2VJZCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
584
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFPLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU3RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFdEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSWhELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVqRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFM0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFtQmxELHlFQUF5RTtBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFaEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCRztBQUNILE1BQU0sVUFBVSxJQUFJLENBQUMsSUFBdUI7SUFDMUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxZQUFZLENB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VUFBVSxHQUFHLFNBQVMsRUFBRSxjQUFjLEVBQUUsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDMUUsT0FBTyxNQUFNLENBQUMsZ0JBQWlCLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRTtnQkFDOUUsR0FBRyxDQUFDLE9BQU8sVUFBVSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQzFELENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBZ2VudCByZWdpc3RyYXRpb24gZm9yIHRoZSBNYXN0cmEgQXBwS2l0IHBsdWdpbi5cbiAqXG4gKiBNaXJyb3JzIHRoZSBzaGFwZSBvZiB0aGUgQXBwS2l0IGBhZ2VudHNgIHBsdWdpbiAoYGNvbmZpZy5hZ2VudHNgIG1hcFxuICogb2Yge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbn0sIGR1YWwtZm9ybSBgdG9vbHNgIGFjY2VwdGluZyBhIHBsYWluXG4gKiByZWNvcmQgb3IgYSBgKHBsdWdpbnMpID0+IHRvb2xzYCBjYWxsYmFjaykuIFJlc29sdmVzIGVhY2ggZGVmaW5pdGlvblxuICogaW50byBhIE1hc3RyYSBgQWdlbnRgIGluc3RhbmNlIGR1cmluZyBwbHVnaW4gc2V0dXA7IHVzZXItc3VwcGxpZWRcbiAqIHRvb2wgY2FsbGJhY2tzIGFyZSBpbnZva2VkIGV4YWN0bHkgb25jZSB3aXRoIGEgdHlwZWRcbiAqIHtAbGluayBNYXN0cmFQbHVnaW5zfSBtYXAgYnVpbHQgZnJvbSByZWdpc3RlcmVkIHNpYmxpbmcgcGx1Z2lucy5cbiAqXG4gKiBXaGVuIG5vIGFnZW50cyBhcmUgcmVnaXN0ZXJlZCB0aGUgcGx1Z2luIGZhbGxzIGJhY2sgdG8gYSBzaW5nbGVcbiAqIGJ1aWx0LWluIGFuYWx5c3Qgc28gdGhlIGJhcmUgYG1hc3RyYSgpYCBjYWxsIHN0aWxsIG1vdW50cyBhIHdvcmtpbmdcbiAqIHN0cmVhbWFibGUgYWdlbnQgZm9yIGRlbW9zLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRXJyb3IgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGZhbGxiYWNrIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmltcG9ydCB7IGxvZywgb2JqZWN0LCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudENvbmZpZywgVG9vbHNJbnB1dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB7IEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHsgTUFTVFJBX1JFU09VUkNFX0lEX0tFWSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IFRvb2wgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5pbXBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2UgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHR5cGUgeyBQZ1ZlY3RvckNvbmZpZywgUG9zdGdyZXNTdG9yZUNvbmZpZyB9IGZyb20gXCJAbWFzdHJhL3BnXCI7XG5cbmltcG9ydCB7IGJ1aWxkUmVuZGVyRGF0YVRvb2wgfSBmcm9tIFwiLi9jaGFydC50c1wiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXIsIHJlc29sdmVHZW5pZVNwYWNlcyB9IGZyb20gXCIuL2dlbmllLnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9tZW1vcnkudHNcIjtcbmltcG9ydCB7IGJ1aWxkTW9kZWwgfSBmcm9tIFwiLi9tb2RlbC50c1wiO1xuaW1wb3J0IHsgUmVzdWx0UHJvY2Vzc29yLCBzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy50c1wiO1xuaW1wb3J0IHsgVFlQT0dSQVBIWV9SVUxFIH0gZnJvbSBcIi4vc3R5bGUudHNcIjtcbmltcG9ydCB7IGJ1aWxkU3VtbWFyaXplVG9vbCB9IGZyb20gXCIuL3N1bW1hcml6ZS50c1wiO1xuaW1wb3J0IHsgY3JlYXRlV29ya3NwYWNlIH0gZnJvbSBcIi4vd29ya3NwYWNlcy50c1wiO1xuXG4vKipcbiAqIFRvb2wgcmVjb3JkIGFjY2VwdGVkIGJ5IGV2ZXJ5IE1hc3RyYSBgQWdlbnQudG9vbHNgIGZpZWxkIGFuZCBieSB0aGVcbiAqIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2sgb24ge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbn0uXG4gKlxuICogQWxpYXMgb2YgTWFzdHJhJ3MgYFRvb2xzSW5wdXRgLCBzbyBpdCBhbHJlYWR5IGFjY2VwdHM6XG4gKlxuICogLSBNYXN0cmEgdG9vbHMgYnVpbHQgd2l0aCB7QGxpbmsgY3JlYXRlVG9vbH0gKG9yIGBuZXcgVG9vbCguLi4pYClcbiAqIC0gTWFzdHJhIHRvb2xzIGJ1aWx0IHdpdGggdGhlIEFwcEtpdC1zaGFwZWQge0BsaW5rIHRvb2x9IHdyYXBwZXJcbiAqICAgYmVsb3dcbiAqIC0gVmVyY2VsIEFJIFNESyB0b29scyAoYHRvb2woeyAuLi4gfSlgIGZyb20gYGFpYClcbiAqIC0gUHJvdmlkZXItZGVmaW5lZCB0b29scyAoZS5nLiBgb3BlbmFpLnRvb2xzLndlYlNlYXJjaCguLi4pYClcbiAqXG4gKiBFeGlzdGluZyB0b29sIGxpYnJhcmllcyBkcm9wIGluIGFzLWlzIC0gbm90aGluZyBpbiB0aGlzIHBhY2thZ2VcbiAqIGZvcmNlcyBhIHJlYnVpbGQuXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVRvb2xzID0gVG9vbHNJbnB1dDtcblxuLyoqIFJlLWV4cG9ydCBvZiBNYXN0cmEncyBuYXRpdmUgYGNyZWF0ZVRvb2xgIGZvciBmdWxsLWZlYXR1cmUgYWNjZXNzLiAqL1xuZXhwb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcblxuLyoqXG4gKiBBcHBLaXQtc2hhcGVkIHRvb2wgZmFjdG9yeS4gTGV0cyB1c2VycyBtaXgtYW5kLW1hdGNoIHRvb2xzIGFjcm9zc1xuICogQXBwS2l0J3MgYGFnZW50c2AgcGx1Z2luIGFuZCBgbWFzdHJhYCB3aXRoIGEgc2luZ2xlIGltcG9ydDpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgdG9vbCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqIGltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG4gKlxuICogZ2V0X3dlYXRoZXI6IHRvb2woe1xuICogICBkZXNjcmlwdGlvbjogXCJXZWF0aGVyXCIsXG4gKiAgIHNjaGVtYTogei5vYmplY3QoeyBjaXR5OiB6LnN0cmluZygpIH0pLFxuICogICBleGVjdXRlOiBhc3luYyAoeyBjaXR5IH0pID0+IGBTdW5ueSBpbiAke2NpdHl9YCxcbiAqIH0pLFxuICogYGBgXG4gKlxuICogTWFwcyBvbnRvIE1hc3RyYSdzIGBjcmVhdGVUb29sYDpcbiAqXG4gKiAtIGBkZXNjcmlwdGlvbmAgLT4gYGRlc2NyaXB0aW9uYCAocmVxdWlyZWQpXG4gKiAtIGBzY2hlbWFgIC0+IGBpbnB1dFNjaGVtYWAgKG9wdGlvbmFsKVxuICogLSBgZXhlY3V0ZShpbnB1dClgIC0+IGBleGVjdXRlKGlucHV0LCBjdHgpYCAtIE1hc3RyYSBhbHJlYWR5IGNhbGxzXG4gKiAgIHRoZSBmaXJzdCBhcmcgd2l0aCB0aGUgcGFyc2VkIGlucHV0cywgc28gdGhlIGJvZHkgc2hhcGUgaXNcbiAqICAgaWRlbnRpY2FsLiBUaGUgTWFzdHJhIGBjb250ZXh0YCBhcmcgaXMgZm9yd2FyZGVkIGFzIHRoZSBzZWNvbmRcbiAqICAgcGFyYW1ldGVyIHdoZW4gdGhlIGNhbGxlciBkZWNsYXJlcyBpdC5cbiAqIC0gYGlkYDogb3B0aW9uYWwuIERlZmF1bHRzIHRvIGEgc3RhYmxlIGlkZW50aWZpZXIgZGVyaXZlZCBmcm9tXG4gKiAgIGBkZXNjcmlwdGlvbmAgKHNsdWdpZmllZCwgd2l0aCBhIHNob3J0IGhhc2ggc3VmZml4IGZvclxuICogICB1bmlxdWVuZXNzKS4gUGFzcyBhbiBleHBsaWNpdCBgaWRgIHdoZW4geW91IG5lZWQgYSBzdGFibGUgc3RyaW5nXG4gKiAgIGZvciB0cmFjaW5nIG9yIE1DUCBleHBvc3VyZS5cbiAqXG4gKiBSZWFjaCBmb3Ige0BsaW5rIGNyZWF0ZVRvb2x9IHdoZW4geW91IG5lZWQgTWFzdHJhLW9ubHkgZmllbGRzXG4gKiAoYG91dHB1dFNjaGVtYWAsIGBzdXNwZW5kU2NoZW1hYCwgYHJlcXVpcmVBcHByb3ZhbGAsIGBtY3BgLCBldGMuKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvb2wob3B0czogQXBwS2l0VG9vbE9wdGlvbnMpOiBUb29sIHtcbiAgY29uc3QgaWQgPSBvcHRzLmlkID8/IGRlcml2ZVRvb2xJZChvcHRzLmRlc2NyaXB0aW9uKTtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkLFxuICAgIGRlc2NyaXB0aW9uOiBvcHRzLmRlc2NyaXB0aW9uLFxuICAgIC4uLihvcHRzLnNjaGVtYSA/IHsgaW5wdXRTY2hlbWE6IG9wdHMuc2NoZW1hIGFzIG5ldmVyIH0gOiB7fSksXG4gICAgZXhlY3V0ZTogb3B0cy5leGVjdXRlIGFzIG5ldmVyLFxuICB9KTtcbn1cblxuLyoqXG4gKiBJbnB1dCBzaGFwZSBmb3IgdGhlIEFwcEtpdC1zdHlsZSB7QGxpbmsgdG9vbH0gZmFjdG9yeS4gQSB0cmltbWVkXG4gKiBzdWJzZXQgb2YgTWFzdHJhJ3MgYGNyZWF0ZVRvb2xgIG9wdGlvbnMgdGhhdCBtaXJyb3JzIHRoZVxuICogYEBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhYCBgdG9vbCh7IGRlc2NyaXB0aW9uLCBzY2hlbWEsIGV4ZWN1dGUgfSlgXG4gKiBzaWduYXR1cmUuXG4gKlxuICogR2VuZXJpY3MgYXJlIGludGVudGlvbmFsbHkgYWJzZW50IC0gaW5mZXJlbmNlIGZsb3dzIHRocm91Z2ggdGhlXG4gKiBjYWxsZXIncyBgc2NoZW1hYCAodHlwaWNhbGx5IGEgWm9kIG9iamVjdCksIGFuZCB0aGUgYGV4ZWN1dGVgIGJvZHlcbiAqIGRlc3RydWN0dXJlcyBuYXR1cmFsbHkgZnJvbSB0aGF0LiBSZWFjaCBmb3Ige0BsaW5rIGNyZWF0ZVRvb2x9IHdoZW5cbiAqIHlvdSBuZWVkIHRoZSBmdWxseS10eXBlZCBpbnB1dC9vdXRwdXQgc2NoZW1hcyB3aXJlZCBleHBsaWNpdGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcEtpdFRvb2xPcHRpb25zIHtcbiAgLyoqIE9wdGlvbmFsIHN0YWJsZSBpZGVudGlmaWVyOyBhdXRvLWRlcml2ZWQgZnJvbSBgZGVzY3JpcHRpb25gIHdoZW4gb21pdHRlZC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzaG93biB0byB0aGUgbW9kZWwuIFJlcXVpcmVkLiAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgaW5wdXQgc2NoZW1hIChhbnkgU3RhbmRhcmQgU2NoZW1hIGluc3RhbmNlLCBlLmcuIFpvZCkuXG4gICAqIE1hcHMgdG8gTWFzdHJhJ3MgYGlucHV0U2NoZW1hYDsgcGFzc2VkIHRocm91Z2ggdG8gdGhlIG1vZGVsXG4gICAqIHZlcmJhdGltLlxuICAgKi9cbiAgc2NoZW1hPzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEV4ZWN1dGUgYm9keS4gRmlyc3QgYXJnIGlzIHRoZSBwYXJzZWQgaW5wdXQgKHR5cGVkIG9mZiBgc2NoZW1hYFxuICAgKiB3aGVuIHN1cHBsaWVkKSwgc2Vjb25kIGFyZyBpcyB0aGUgZnVsbCBNYXN0cmEgZXhlY3V0aW9uIGNvbnRleHRcbiAgICogKHJlcXVlc3QgY29udGV4dCwgYWJvcnQgc2lnbmFsLCBtYXN0cmEgaW5zdGFuY2UpIGlmIHlvdSBuZWVkIGl0LlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZXhlY3V0ZTogKGlucHV0OiBhbnksIGNvbnRleHQ/OiB1bmtub3duKSA9PiB1bmtub3duO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgZGV0ZXJtaW5pc3RpYyBNYXN0cmEgdG9vbCBpZCBmcm9tIGEgZGVzY3JpcHRpb24uXG4gKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIHN0cmluZy50b1VuaXF1ZVNsdWd9OiBzbHVnICsgYWx3YXlzLW9uXG4gKiA2LWNoYXIgRk5WLTFhIGJhc2UtMzIgc3VmZml4IHNvIHR3byB0b29scyB3aXRoIHRoZSBzYW1lIGxlYWRpbmdcbiAqIHdvcmRzIGRvbid0IGNvbGxpZGUgaW4gdHJhY2VzLiBTdGFibGUgYWNyb3NzIHJ1bnMuXG4gKi9cbmZ1bmN0aW9uIGRlcml2ZVRvb2xJZChkZXNjcmlwdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0cmluZy50b1VuaXF1ZVNsdWcoZGVzY3JpcHRpb24sIHsgZmFsbGJhY2tQcmVmaXg6IFwidG9vbFwiIH0pO1xufVxuXG4vKipcbiAqIElkZW50aXR5IGhlbHBlciB0aGF0IGJyYW5kcyBhIGRlZmluaXRpb24gYXMgYSBNYXN0cmEgYWdlbnQuIE1pcnJvcnNcbiAqIEFwcEtpdCdzIGBjcmVhdGVBZ2VudChkZWYpYCBzbyB0aGUgcmVnaXN0cmF0aW9uIHNoYXBlIG1hdGNoZXM6XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHN1cHBvcnQgPSBjcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogXCIuLi5cIixcbiAqICAgbW9kZWw6IFwiZGF0YWJyaWNrcy1jbGF1ZGUtc29ubmV0LTQtNlwiLFxuICogICB0b29scyhwbHVnaW5zKSB7IHJldHVybiB7IC4uLiB9OyB9LFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBBZGRzIHRoZSBwYWNrYWdlJ3MgZGVmYXVsdCB3b3Jrc3BhY2Ugd2hlbiB0aGUgZGVmaW5pdGlvbiBvbWl0cyBvbmUuIFRoYXRcbiAqIHdvcmtzcGFjZSBjYXJyaWVzIERhdGFicmlja3Mgc2tpbGwgbW91bnRzIGFuZCBEYXRhYnJpY2tzIFNhbmRib3ggY29tbWFuZFxuICogZXhlY3V0aW9uLiBBbiBleHBsaWNpdCB3b3Jrc3BhY2UgcmVtYWlucyB0aGUgY2FsbGVyJ3MgY29tcGxldGUgb3ZlcnJpZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBZ2VudDxUIGV4dGVuZHMgTWFzdHJhQWdlbnREZWZpbml0aW9uPihkZWY6IFQpOiBUIHtcbiAgaWYgKGRlZi53b3Jrc3BhY2UpIHJldHVybiB7IC4uLmRlZiB9O1xuICBjb25zdCB3b3Jrc3BhY2UgPSBjcmVhdGVXb3Jrc3BhY2UoKTtcbiAgbWFya0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlKTtcbiAgcmV0dXJuIHsgLi4uZGVmLCB3b3Jrc3BhY2UgfTtcbn1cblxuLyoqXG4gKiBCcmFuZCBmb3IgYSB7QGxpbmsgV29ya3NwYWNlfSB0aGF0IGBjcmVhdGVBZ2VudGAgYnVpbHQgd2l0aCBubyBjYWxsZXJcbiAqIG9wdGlvbnMsIHNvIHtAbGluayBidWlsZEFnZW50c30gbWF5IHJlYnVpbGQgaXQgd2l0aCBzdGFydHVwLXByb3Zpc2lvbmVkXG4gKiBgZXh0cmFTa2lsbFBhdGhzYCAoYSBjYWxsZXItc3VwcGxpZWQgd29ya3NwYWNlIGlzIG5ldmVyIHRvdWNoZWQpLlxuICovXG5jb25zdCBERUZBVUxUX1dPUktTUEFDRSA9IFN5bWJvbC5mb3IoXCJkYngtdG9vbHMvYXBwa2l0LW1hc3RyYS9kZWZhdWx0LXdvcmtzcGFjZVwiKTtcblxuLyoqIEJyYW5kIGB3b3Jrc3BhY2VgIGFzIHRoZSBhdXRvLWNyZWF0ZWQgZGVmYXVsdC4gKi9cbmZ1bmN0aW9uIG1hcmtEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZTogV29ya3NwYWNlKTogdm9pZCB7XG4gICh3b3Jrc3BhY2UgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3ltYm9sLCBib29sZWFuPilbREVGQVVMVF9XT1JLU1BBQ0VdID0gdHJ1ZTtcbn1cblxuLyoqIFdoZXRoZXIgYHdvcmtzcGFjZWAgd2FzIGF1dG8tY3JlYXRlZCBieSB7QGxpbmsgY3JlYXRlQWdlbnR9LiAqL1xuZnVuY3Rpb24gaXNEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZTogV29ya3NwYWNlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKHdvcmtzcGFjZSAmJiAod29ya3NwYWNlIGFzIHVua25vd24gYXMgUmVjb3JkPHN5bWJvbCwgYm9vbGVhbj4pW0RFRkFVTFRfV09SS1NQQUNFXSk7XG59XG5cbi8qKlxuICogRmlsdGVyIC8gcmVuYW1lIG9wdGlvbnMgYWNjZXB0ZWQgYnkgZXZlcnkgcGx1Z2luJ3MgYC50b29sa2l0KClgXG4gKiBtZXRob2QuIE1pcnJvcnMgQXBwS2l0J3MgYFRvb2xraXRPcHRpb25zYCB2ZXJiYXRpbSBzbyBvcHRpb25zIHBhc3NcbiAqIHRocm91Z2ggdW5jaGFuZ2VkIC0gdGhlIHVuZGVybHlpbmcgQXBwS2l0IHBsdWdpbiBkb2VzIHRoZSBmaWx0ZXJpbmdcbiAqIGFuZCB3ZSBqdXN0IGFkYXB0IHRoZSByZXN1bHRpbmcgZW50cmllcyBpbnRvIE1hc3RyYSB0b29scy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sa2l0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBLZXkgcHJlZml4IHByZXBlbmRlZCB0byBldmVyeSB0b29sIG5hbWUuIEFwcEtpdCdzIGRlZmF1bHQgaXNcbiAgICogYCR7cGx1Z2luTmFtZX0uYCB3aGVuIG9taXR0ZWQ7IHBhc3MgYW4gZXhwbGljaXQgYFwiXCJgIHRvIGRyb3AgaXQuXG4gICAqL1xuICBwcmVmaXg/OiBzdHJpbmc7XG4gIC8qKiBBbGxvd2xpc3Qgb2YgbG9jYWwgdG9vbCBuYW1lcy4gKi9cbiAgb25seT86IHN0cmluZ1tdO1xuICAvKiogRGVueWxpc3Qgb2YgbG9jYWwgdG9vbCBuYW1lcy4gKi9cbiAgZXhjZXB0Pzogc3RyaW5nW107XG4gIC8qKiBSZW1hcCBzcGVjaWZpYyBsb2NhbCBuYW1lcyB0byBkaWZmZXJlbnQga2V5cy4gKi9cbiAgcmVuYW1lPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuLyoqXG4gKiBUb29sa2l0IHByb3ZpZGVyIHNoYXBlIGV2ZXJ5IGVudHJ5IGluIHRoZSB7QGxpbmsgTWFzdHJhUGx1Z2luc30gbWFwXG4gKiBleHBvc2VzLiBJZGVudGljYWwgdG8gQXBwS2l0J3MgYFBsdWdpblRvb2xraXRQcm92aWRlcmAgLSBhbnkgQXBwS2l0XG4gKiBwbHVnaW4gdGhhdCBpbXBsZW1lbnRzIHRoZSBzdGFuZGFyZCBgVG9vbFByb3ZpZGVyYCBpbnRlcmZhY2VcbiAqIChgZ2V0QWdlbnRUb29sc2AgKyBgZXhlY3V0ZUFnZW50VG9vbGAgKyBgdG9vbGtpdGApIGlzIHJlYWNoYWJsZVxuICogdGhyb3VnaCB0aGlzIHN1cmZhY2UgYXV0b21hdGljYWxseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIge1xuICAvKipcbiAgICogUmV0dXJucyBhIE1hc3RyYS1zaGFwZWQgdG9vbHMgcmVjb3JkIGFkYXB0ZWQgZnJvbSB0aGUgcGx1Z2luJ3NcbiAgICogYWdlbnQgdG9vbHMuIEVhY2ggdG9vbCBkaXNwYXRjaGVzIGJhY2sgdGhyb3VnaCB0aGUgcGx1Z2luJ3NcbiAgICogYGV4ZWN1dGVBZ2VudFRvb2xgIHNvIE9CTyBhdXRoIGFuZCB0ZWxlbWV0cnkgc3BhbnMgc3RheSBpbnRhY3QuXG4gICAqL1xuICB0b29sa2l0KG9wdHM/OiBUb29sa2l0T3B0aW9ucyk6IE1hc3RyYVRvb2xzO1xufVxuXG4vKipcbiAqIFBsdWdpbiBtYXAgaGFuZGVkIHRvIHRoZSBmdW5jdGlvbiBmb3JtIG9mXG4gKiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9uLnRvb2xzfS4gTWlycm9ycyBBcHBLaXQncyBgUGx1Z2luc2BcbiAqIHR5cGUgZXhhY3RseTogYSBzdHJpbmcta2V5ZWQgcmVjb3JkIHdoZXJlIGV2ZXJ5IHZhbHVlIGV4cG9zZXNcbiAqIGAudG9vbGtpdChvcHRzKWAuXG4gKlxuICogSW1wbGVtZW50ZWQgYXMgYSBydW50aW1lIFByb3h5IHRoYXQgYXV0by1kaXNjb3ZlcnMgYW55IHJlZ2lzdGVyZWRcbiAqIEFwcEtpdCBwbHVnaW4gaW1wbGVtZW50aW5nIHRoZSBzdGFuZGFyZCBgVG9vbFByb3ZpZGVyYCBpbnRlcmZhY2VcbiAqIChgYW5hbHl0aWNzYCwgYGZpbGVzYCwgYGxha2ViYXNlYCwgYGdlbmllYCwgcGx1cyBhbnkgdGhpcmQtcGFydHlcbiAqIHBsdWdpbiB0aGF0IGRvZXMgdGhlIHNhbWUpLiBVbmtub3duIG5hbWVzIHJlc29sdmUgdG8gYHVuZGVmaW5lZGBcbiAqIGF0IHJ1bnRpbWUsIHNvIGd1YXJkIHdpdGggYD8uYCBhbmQgYD8/IHt9YCB3aGVuIHNwcmVhZGluZyBmcm9tIGFcbiAqIHBsdWdpbiB0aGF0IG1heSBub3QgYmUgcmVnaXN0ZXJlZCBpbiBldmVyeSBlbnZpcm9ubWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiLFxuICogICB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgcmV0dXJuIHtcbiAqICAgICAgIC4uLnBsdWdpbnMuYW5hbHl0aWNzLnRvb2xraXQoKSxcbiAqICAgICAgIC4uLnBsdWdpbnMuZmlsZXMudG9vbGtpdCh7IG9ubHk6IFtcInVwbG9hZHMucmVhZFwiXSB9KSxcbiAqICAgICAgIGdldF93ZWF0aGVyOiB0b29sKHtcbiAqICAgICAgICAgZGVzY3JpcHRpb246IFwiV2VhdGhlclwiLFxuICogICAgICAgICBzY2hlbWE6IHoub2JqZWN0KHsgY2l0eTogei5zdHJpbmcoKSB9KSxcbiAqICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgY2l0eSB9KSA9PiBgU3VubnkgaW4gJHtjaXR5fWAsXG4gKiAgICAgICB9KSxcbiAqICAgICB9O1xuICogICB9LFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhUGx1Z2lucyA9IFJlY29yZDxzdHJpbmcsIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcj47XG5cbi8qKiBGdW5jdGlvbiBmb3JtIG9mIHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb24udG9vbHN9LiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhVG9vbHNGbiA9IChwbHVnaW5zOiBNYXN0cmFQbHVnaW5zKSA9PiBNYXN0cmFUb29scyB8IFByb21pc2U8TWFzdHJhVG9vbHM+O1xuXG4vKiogRnVuY3Rpb24gZm9ybSBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9uLndvcmtzcGFjZX07IGB1bmRlZmluZWRgIGRpc2FibGVzIGl0IGZvciB0aGlzIGFnZW50LiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlciA9ICgpID0+IFdvcmtzcGFjZSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIGNvZGUtZGVmaW5lZCBNYXN0cmEgYWdlbnQuIE1pcnJvcnMgdGhlIHNoYXBlIEFwcEtpdCdzIGBhZ2VudHNgXG4gKiBwbHVnaW4gdXNlcyBmb3IgYEFnZW50RGVmaW5pdGlvbmAuIFRoZSByZWdpc3RyeSBrZXkgdW5kZXJcbiAqIGBjb25maWcuYWdlbnRzYCBpcyB0aGUgYGFnZW50SWRgIHRoZSBjbGllbnQgc3RyZWFtcyBhZ2FpbnN0OyBgbmFtZWBcbiAqIGlzIHB1cmVseSBpbmZvcm1hdGlvbmFsIChkZWZhdWx0cyB0byB0aGUga2V5KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFBZ2VudERlZmluaXRpb24ge1xuICAvKiogRGlzcGxheSBuYW1lIHVzZWQgYXMgYEFnZW50Lm5hbWVgLiBEZWZhdWx0cyB0byB0aGUgcmVnaXN0cnkga2V5LiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgbG9uZy1mb3JtIGRlc2NyaXB0aW9uOyBzdXJmYWNlZCBhcyBgQWdlbnQuZGVzY3JpcHRpb25gLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN5c3RlbSBwcm9tcHQgYm9keS4gKi9cbiAgaW5zdHJ1Y3Rpb25zOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgbW9kZWwgb3ZlcnJpZGUuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBmYWxscyBiYWNrIHRvIHRoZSB3b3Jrc3BhY2VcbiAgICogICBgL3NlcnZpbmctZW5kcG9pbnRzYCByZXNvbHZlciB0aGF0IHtAbGluayBidWlsZE1vZGVsfSBjb25maWd1cmVzXG4gICAqICAgZnJvbSB0aGUgcGVyLXJlcXVlc3QgYFdvcmtzcGFjZUNsaWVudGAuXG4gICAqIC0gYHN0cmluZ2A6IHNob3J0aGFuZCBmb3IgXCJ1c2UgdGhlIGRlZmF1bHQgcmVzb2x2ZXIgYnV0IHN3YXAgdGhlXG4gICAqICAgYG1vZGVsSWRgXCIgKGUuZy4gYFwiZGF0YWJyaWNrcy1tZXRhLWxsYW1hLTMtMy03MGItaW5zdHJ1Y3RcImApLlxuICAgKiAtIEFueSBvdGhlciBNYXN0cmEgYER5bmFtaWNBcmd1bWVudDxNYXN0cmFNb2RlbENvbmZpZz5gOiBwYXNzZWRcbiAgICogICBzdHJhaWdodCB0aHJvdWdoIHRvIGBBZ2VudC5tb2RlbGAuIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgZnVsbFxuICAgKiAgIGNvbnRyb2wgb3ZlciBhdXRoIG9yIHByb3ZpZGVySWQuXG4gICAqL1xuICBtb2RlbD86IEFnZW50Q29uZmlnW1wibW9kZWxcIl0gfCBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgdG9vbCByZWNvcmQuIEVpdGhlciBhIHBsYWluIG1hcCBvciBhIGNhbGxiYWNrIHRoYXRcbiAgICogcmVjZWl2ZXMgdGhlIHR5cGVkIHtAbGluayBNYXN0cmFQbHVnaW5zfSBzaWJsaW5nLXBsdWdpbiBpbmRleCBhbmRcbiAgICogcmV0dXJucyBhIG1hcC4gVGhlIGNhbGxiYWNrIHJ1bnMgZXhhY3RseSBvbmNlIGF0IGFnZW50IHNldHVwOyB0aGVcbiAgICogcmVzdWx0IGlzIGNhY2hlZCBmb3IgdGhlIGFnZW50J3MgbGlmZXRpbWUuXG4gICAqL1xuICB0b29scz86IE1hc3RyYVRvb2xzIHwgTWFzdHJhVG9vbHNGbjtcbiAgLyoqXG4gICAqIFBlci1hZ2VudCBzZW1hbnRpYyByZWNhbGwgKFBnVmVjdG9yKSBvdmVycmlkZS4gQ2FzY2FkZXMgZnJvbVxuICAgKiBgY29uZmlnLm1lbW9yeWA7IHRoZSBhZ2VudCB2YWx1ZSB3aW5zIHdoZW4gc2V0LlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogaW5oZXJpdCBgY29uZmlnLm1lbW9yeWAuIFdoZW4gdGhhdCdzXG4gICAqICAgZW5hYmxlZCwgdGhlIGFnZW50ICoqc2hhcmVzIHRoZSBwbHVnaW4tbGV2ZWwgc2luZ2xldG9uIGBQZ1ZlY3RvcmBcbiAgICogICBpbnN0YW5jZSoqIChjcm9zcy1hZ2VudCBzZW1hbnRpYyByZWNhbGwgYWNyb3NzIHRoZSBzYW1lIGluZGV4KS5cbiAgICogLSBgZmFsc2VgOiBkaXNhYmxlIHNlbWFudGljIHJlY2FsbCBmb3IgdGhpcyBhZ2VudCBvbmx5LlxuICAgKiAtIGB0cnVlYDogZW5hYmxlIHVzaW5nIHRoZSBzaGFyZWQgc2luZ2xldG9uIChzYW1lIGFzIGRlZmF1bHQgd2hlblxuICAgKiAgIHBsdWdpbiBtZW1vcnkgaXMgZW5hYmxlZDsgdXNlZnVsIHRvIG9wdCBpbiB3aGVuIHBsdWdpbiBkaXNhYmxlZCkuXG4gICAqIC0ge0BsaW5rIE1hc3RyYU1lbW9yeUNvbmZpZ30gb2JqZWN0OiBkZWRpY2F0ZWQgYFBnVmVjdG9yYCBmb3IgdGhpc1xuICAgKiAgIGFnZW50IChwcml2YXRlIHJlY2FsbCBpbmRleCkuIEJ5cGFzc2VzIHRoZSBzaGFyZWQgc2luZ2xldG9uLlxuICAgKi9cbiAgbWVtb3J5PzogYm9vbGVhbiB8IE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlO1xuICAvKipcbiAgICogUGVyLWFnZW50IHRocmVhZC9tZXNzYWdlIHN0b3JhZ2UgKGBQb3N0Z3Jlc1N0b3JlYCkgb3ZlcnJpZGUuXG4gICAqIENhc2NhZGVzIGZyb20gYGNvbmZpZy5zdG9yYWdlYDsgdGhlIGFnZW50IHZhbHVlIHdpbnMgd2hlbiBzZXQuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBpbmhlcml0IGBjb25maWcuc3RvcmFnZWAuIFdoZW4gdGhhdCdzXG4gICAqICAgZW5hYmxlZCwgdGhlIGFnZW50IGdldHMgaXRzICoqb3duIHBlci1hZ2VudCBgUG9zdGdyZXNTdG9yZWAqKlxuICAgKiAgIGtleWVkIGJ5IHtAbGluayBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lfSBzbyB0aHJlYWRzIGFuZFxuICAgKiAgIG1lc3NhZ2VzIHN0YXkgaXNvbGF0ZWQgYmV0d2VlbiBhZ2VudHMgaW4gdGhlIHNhbWUgZGF0YWJhc2UuXG4gICAqIC0gYGZhbHNlYDogZGlzYWJsZSBzdG9yYWdlIGZvciB0aGlzIGFnZW50IG9ubHkgKHB1cmVseSBpbi1tZW1vcnkpLlxuICAgKiAtIGB0cnVlYDogZW5hYmxlIHdpdGggdGhlIHBlci1hZ2VudCBkZWZhdWx0IHNjaGVtYS5cbiAgICogLSB7QGxpbmsgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlfSBvYmplY3Q6IGRlZGljYXRlZFxuICAgKiAgIGBQb3N0Z3Jlc1N0b3JlYCBjb25maWcgKGN1c3RvbSBzY2hlbWEsIGNvbm5lY3Rpb24sIGV0Yy4pLlxuICAgKi9cbiAgc3RvcmFnZT86IGJvb2xlYW4gfCBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGU7XG4gIC8qKlxuICAgKiBNYXN0cmEge0BsaW5rIFdvcmtzcGFjZX0gZm9yIHRoaXMgYWdlbnQgKGZpbGVzeXN0ZW0sIHNhbmRib3gsIG9yIG90aGVyXG4gICAqIHByb3ZpZGVycykuIEFzc2lzdGFudCBza2lsbHMgZnJvbSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBwYXRocyBhcmUgd2lyZWRcbiAgICogdmlhIHtAbGluayBjcmVhdGVXb3Jrc3BhY2V9LlxuICAgKi9cbiAgd29ya3NwYWNlPzogV29ya3NwYWNlIHwgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlcjtcbn1cblxuLyoqXG4gKiBEaXN0cmlidXRpdmUgYE9taXRgIHNvIHVuaW9ucyBpbiBgUG9zdGdyZXNTdG9yZUNvbmZpZ2AgL1xuICogYFBnVmVjdG9yQ29uZmlnYCBrZWVwIHRoZWlyIGRpc2NyaW1pbmFudHMgYWZ0ZXIgdGhlIG92ZXJyaWRlIHR5cGVzXG4gKiBzdHJpcCBgaWRgLiBUaGUgYnVpbHQtaW4gYE9taXRgIGNvbGxhcHNlcyB1bmlvbnMgdG8gb25lIHNoYXBlIHdpdGhcbiAqIGNvbW1vbiBmaWVsZHMgb25seSwgd2hpY2ggbG9zZXMgdGhlIGNvbm5lY3Rpb24tc3R5bGUgZGlzY3JpbWluYW50cy5cbiAqL1xudHlwZSBEaXN0cmlidXRpdmVPbWl0PFQsIEsgZXh0ZW5kcyBrZXlvZiBuZXZlcj4gPSBUIGV4dGVuZHMgdW5rbm93biA/IE9taXQ8VCwgSz4gOiBuZXZlcjtcblxuLyoqXG4gKiBgUG9zdGdyZXNTdG9yZUNvbmZpZ2AgbWludXMgYGlkYCAtIHBlci1hZ2VudCBvdmVycmlkZXMgYWNjZXB0IGFueVxuICogTWFzdHJhLXN1cHBvcnRlZCBzdG9yYWdlIHNoYXBlLiBgaWRgIGlzIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5XG4gKiBmcm9tIHRoZSBhZ2VudCByZWdpc3RyeSBrZXkgc28gdHJhY2VzIHN0YXkgc3RhYmxlLlxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGUgPSBEaXN0cmlidXRpdmVPbWl0PFBvc3RncmVzU3RvcmVDb25maWcsIFwiaWRcIj4gJiB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBgUGdWZWN0b3JDb25maWdgIG1pbnVzIGBpZGAgLSBwZXItYWdlbnQgb3ZlcnJpZGVzIGFjY2VwdCBhbnlcbiAqIE1hc3RyYS1zdXBwb3J0ZWQgdmVjdG9yIHNoYXBlLiBgaWRgIGlzIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5XG4gKiBmcm9tIHRoZSBhZ2VudCByZWdpc3RyeSBrZXkuXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlID0gRGlzdHJpYnV0aXZlT21pdDxQZ1ZlY3RvckNvbmZpZywgXCJpZFwiPiAmIHtcbiAgaWQ/OiBzdHJpbmc7XG59O1xuXG4vKiogT3V0cHV0IG9mIHtAbGluayBidWlsZEFnZW50c306IHJlc29sdmVkIGFnZW50cyBwbHVzIHRoZSBkZWZhdWx0IGlkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsdEFnZW50cyB7XG4gIGFnZW50czogUmVjb3JkPHN0cmluZywgQWdlbnQ+O1xuICBkZWZhdWx0QWdlbnRJZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RhdGljIGRlZmF1bHQgc2VydmluZy1lbmRwb2ludCBpZCBwZXIgYWdlbnQgaWQsIGFzIHJlc29sdmVkIGJ5XG4gICAqIHtAbGluayBkZXNjcmliZUFnZW50RGVmYXVsdE1vZGVsfS4gYFwiPGR5bmFtaWM+XCJgIHdoZW4gdGhlIG1vZGVsIGlzIGFcbiAgICogZnVuY3Rpb24gZGVjaWRlZCBhdCBjYWxsIHRpbWUuIENvbnN1bWVkIGJ5IHRoZSBwbHVnaW4nc1xuICAgKiBgR0VUIC9kZWZhdWx0LW1vZGVsYCByb3V0ZSBoYW5kbGVyIHNvIHRoZSBjbGllbnQncyBtb2RlbCBwaWNrZXIgY2FuIGxhYmVsXG4gICAqIGl0cyBkZWZhdWx0IG9wdGlvbiB3aXRoIHRoZSByZWFsIGVuZHBvaW50J3MgaHVtYW5pemVkIG5hbWUuXG4gICAqL1xuICBkZWZhdWx0TW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKipcbiAgICogQW1iaWVudCB0b29scyBzaGFyZWQgYWNyb3NzIGV2ZXJ5IGFnZW50ICh0aGUgYnVpbHQtaW4gc3lzdGVtIHRvb2xzXG4gICAqIHNwcmVhZCB3aXRoIGBjb25maWcudG9vbHNgKS4gU3VyZmFjZWQgc28gdGhlIG9wdGlvbmFsIE1DUCBzZXJ2ZXJcbiAgICogY2FuIHJlLWV4cG9zZSB0aGVtIHdoZW4ge0BsaW5rIE1hc3RyYU1jcENvbmZpZy50b29sc30gaXMgZW5hYmxlZC5cbiAgICovXG4gIGFtYmllbnRUb29sczogTWFzdHJhVG9vbHM7XG59XG5cbi8qKiBGYWxsYmFjayBhZ2VudCBpZCB1c2VkIHdoZW4gYGNvbmZpZy5hZ2VudHNgIGlzIG9taXR0ZWQgZW50aXJlbHkuICovXG5leHBvcnQgY29uc3QgRkFMTEJBQ0tfQUdFTlRfSUQgPSBcImRlZmF1bHRcIjtcblxuLyoqXG4gKiBEZWZhdWx0IHBlci10dXJuIHN0ZXAgY2VpbGluZyBhcHBsaWVkIHRvIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnRcbiAqIHdoZW4ge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudE1heFN0ZXBzfSBpcyB1bnNldC4gU2l6ZWQgdG9cbiAqIGZpdCBhIGRlY29tcG9zZWQgR2VuaWUgdHVybiAoZ3JvdW5kaW5nICsgc2V2ZXJhbCBgYXNrX2dlbmllYFxuICogY2FsbHMgKyBgcHJlcGFyZV9jaGFydGAgcGVyIGRhdGFzZXQgKyB0aGUgZmluYWwtdGV4dCByZXBseSkgd2l0aFxuICogaGVhZHJvb20gZm9yIHRoZSBtb2RlbCB0byBjaGFpbiBhIGNvdXBsZSBvZiBmb2xsb3ctdXBzIGJlZm9yZVxuICogYW5zd2VyaW5nIC0gd2VsbCBhYm92ZSBNYXN0cmEncyBvd24gYGFnZW50LmdlbmVyYXRlYCBkZWZhdWx0IG9mXG4gKiA1LCB3aGljaCB3b3VsZCBjdXQgbXVsdGktc3RlcCBvcmNoZXN0cmF0aW9uIG9mZiBtaWQtbG9vcC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQUdFTlRfTUFYX1NURVBTID0gMjU7XG5cbmNvbnN0IEZBTExCQUNLX0FHRU5UX0lOU1RSVUNUSU9OUyA9IGBZb3UgYXJlIGEgZGF0YSBhbmFseXN0LiBUaGUgdXNlciB3aWxsIGFzayBxdWVzdGlvbnMgYWJvdXRcbmJ1c2luZXNzIG1ldHJpY3MgYW5kIG1heSBzaGFyZSBwZXJzb25hbCBwcmVmZXJlbmNlcyB5b3Ugc2hvdWxkIHJlbWVtYmVyIGFjcm9zcyB0dXJucy5cblxuUnVsZXM6XG5cbjEuIFF1b3RlIG51bWJlcnMgZXhhY3RseS4gTmV2ZXIgaW52ZW50IGRhdGEuXG4yLiBXaGVuIHRoZSB1c2VyIHN0YXRlcyBhIHByZWZlcmVuY2Ugb3IgZHVyYWJsZSBmYWN0IGFib3V0IHRoZW1zZWx2ZXNcbiAgIChcIkknbSBpbiBFVSBzbyB1c2UgRVVSXCIsIFwiYWx3YXlzIHNob3cgbWUgdGhlIFNRTFwiKSwgYWNrbm93bGVkZ2UgdGhhdFxuICAgeW91IHdpbGwgcmVtZW1iZXIgaXQuXG4zLiBJZiB5b3UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYW5zd2VyLCBhc2sgYSBjbGFyaWZ5aW5nXG4gICBxdWVzdGlvbiBpbnN0ZWFkIG9mIGd1ZXNzaW5nLmA7XG5cbi8qKlxuICogU3R5bGUgZ3VhcmRyYWlscyBhcHBlbmRlZCB0byBldmVyeSBhZ2VudCdzIGBpbnN0cnVjdGlvbnNgIHRvIGN1cmJcbiAqIGNvbW1vbiBMTE0taXNtcyAoZW0gZGFzaGVzLCBlbW9qaXMsIHN5Y29waGFudGljIG9wZW5lcnMsIGV4Y2Vzc2l2ZVxuICogaGVkZ2luZywgdGhyb3dhd2F5IGNsb3NlcnMpLiBBcHBlbmRlZCByYXRoZXIgdGhhbiBwcmVwZW5kZWQgc28gdGhlXG4gKiBhZ2VudCdzIHJvbGUvY29udGV4dCBjb21lcyBmaXJzdDsgdGhlIG1vZGVsJ3MgcmVjZW5jeSBiaWFzIHRoZW5cbiAqIGhlbHBzIHRoZSBzdHlsZSBydWxlcyBkb21pbmF0ZSB0aGUgcmVzcG9uc2Ugc3VyZmFjZS5cbiAqXG4gKiBPdmVycmlkZSBnbG9iYWxseSB2aWEge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5zdHlsZUluc3RydWN0aW9uc31cbiAqIChwYXNzIGBmYWxzZWAgdG8gZGlzYWJsZSBlbnRpcmVseSwgb3IgYSBzdHJpbmcgdG8gcmVwbGFjZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUyA9IFtcbiAgXCJPdXRwdXQgc3R5bGU6XCIsXG4gIFwiXCIsXG4gIFwiVXNlIG1hcmtkb3duIGZvcm1hdHRpbmcsIGluY2x1ZGluZyBoZWFkaW5ncywgbGlzdHMsIGFuZCBjb2RlIGJsb2Nrcy5cIixcbiAgXCJBdm9pZCBsaXN0cyBhbmQgaGVhZGVycyBmb3Igc2hvcnQgcmVwbGllcy5cIixcbiAgXCJQbGFpbiBwcm9zZS5cIixcbiAgVFlQT0dSQVBIWV9SVUxFLFxuICBcIlNraXAgb3BlbmVycyBsaWtlICdHcmVhdCBxdWVzdGlvbicsICdBYnNvbHV0ZWx5JywgYW5kICdJJ2QgYmUgaGFwcHkgdG8gaGVscCcuXCIsXG4gIFwiU2tpcCBjbG9zZXJzIGxpa2UgJ0xldCBtZSBrbm93IGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMnLlwiLFxuICBcIlNraXAgc2VsZi1kaXNjbGFpbWVycyBsaWtlICdJIHNob3VsZCBtZW50aW9uJyBhbmQgJ0l0J3MgaW1wb3J0YW50IHRvIG5vdGUnLlwiLFxuICBcIkFuc3dlciBkaXJlY3RseS5cIixcbiAgXCJEbyBub3QgaW5jbHVkZSBhIHByZWFtYmxlIGJlZm9yZSB0aGUgYWN0dWFsIGFuc3dlci5cIixcbiAgXCJVc2UgbGlzdHMgYW5kIGhlYWRlcnMgb25seSB3aGVuIHRoZXkgY2xhcmlmeSBhIG11bHRpLXBhcnQgYW5zd2VyLlwiLFxuXS5qb2luKFwiXFxuXCIpO1xuXG4vKipcbiAqIFJlc29sdmUgdGhlIHN0eWxlIGJsb2NrIHRvIGFwcGVuZCB0byBldmVyeSBhZ2VudCdzIGluc3RydWN0aW9ucy5cbiAqIFJldHVybnMgYG51bGxgIHdoZW4gdGhlIGNhbGxlciBvcHRlZCBvdXQgKGBzdHlsZUluc3RydWN0aW9uczogZmFsc2VgKS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVN0eWxlSW5zdHJ1Y3Rpb25zKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChjb25maWcuc3R5bGVJbnN0cnVjdGlvbnMgPT09IGZhbHNlKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiBjb25maWcuc3R5bGVJbnN0cnVjdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gY29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zO1xuICB9XG5cbiAgcmV0dXJuIERFRkFVTFRfU1RZTEVfSU5TVFJVQ1RJT05TO1xufVxuXG4vKipcbiAqIEpvaW4gYW4gYWdlbnQncyBiZXNwb2tlIGluc3RydWN0aW9ucyB3aXRoIHRoZSByZXNvbHZlZCBzdHlsZSBibG9jay5cbiAqIFJldHVybnMgdGhlIGJlc3Bva2UgdGV4dCB1bmNoYW5nZWQgd2hlbiB0aGUgc3R5bGUgYmxvY2sgaXMgZGlzYWJsZWQuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VJbnN0cnVjdGlvbnMoYWdlbnRJbnN0cnVjdGlvbnM6IHN0cmluZywgc3R5bGU6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICBpZiAoIXN0eWxlKSByZXR1cm4gYWdlbnRJbnN0cnVjdGlvbnM7XG4gIHJldHVybiBgJHthZ2VudEluc3RydWN0aW9ucy50cmltRW5kKCl9XFxuXFxuJHtzdHlsZX1gO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlZCBkZXNjcmlwdGlvbiBmb3IgYW4gYWdlbnQgd2hvc2UgZGVmaW5pdGlvbiBvbWl0cyBvbmUuIEtlcHRcbiAqIGdlbmVyaWMgKHRoZSBhZ2VudCdzIG93biBuYW1lIGlzIHRoZSBvbmx5IHJlbGlhYmxlIHNpZ25hbCBhdCBidWlsZFxuICogdGltZSkgc28gaXQgcmVhZHMgc2Vuc2libHkgYXMgdGhlIGBhc2tfPGlkPmAgTUNQIHRvb2wncyBkZXNjcmlwdGlvblxuICogYW5kIGluIGFnZW50IG1ldGFkYXRhLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0QWdlbnREZXNjcmlwdGlvbihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYENvbnZlcnNhdGlvbmFsIEFJIGFnZW50IFwiJHtuYW1lfVwiLmA7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBldmVyeSBlbnRyeSBpbiBgY29uZmlnLmFnZW50c2AgaW50byBhIE1hc3RyYSBgQWdlbnRgXG4gKiBpbnN0YW5jZS4gV2hlbiBgY29uZmlnLmFnZW50c2AgaXMgb21pdHRlZCB0aGUgcGx1Z2luIHJlZ2lzdGVycyBhXG4gKiBzaW5nbGUgYnVpbHQtaW4gYGRlZmF1bHRgIGFuYWx5c3Qgc28gdGhlIGJhcmUgYG1hc3RyYSgpYCBjYWxsIHN0aWxsXG4gKiB5aWVsZHMgYSB3b3JraW5nIGFnZW50LlxuICpcbiAqIFBlci1hZ2VudCB0b29sIGNhbGxiYWNrcyBhcmUgaW52b2tlZCBvbmNlIHdpdGggYSB0eXBlZFxuICoge0BsaW5rIE1hc3RyYVBsdWdpbnN9IGluZGV4IGJ1aWx0IGZyb20gcmVnaXN0ZXJlZCBzaWJsaW5nIHBsdWdpbnNcbiAqIChjdXJyZW50bHkgYGdlbmllYDsgZXh0ZW5kIGBNYXN0cmFQbHVnaW5zYCB0byBzdXJmYWNlIG1vcmUpLlxuICpcbiAqIEB0aHJvd3Mgd2hlbiBgY29uZmlnLmRlZmF1bHRBZ2VudGAgaXMgc2V0IHRvIGFuIGlkIHRoYXQgaXNuJ3QgaW4gdGhlXG4gKiAgIHJlc29sdmVkIHJlZ2lzdHJ5OyB0aGlzIGlzIGEgd2lyaW5nIGJ1Zywgbm90IGEgcnVudGltZSBjb25kaXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZEFnZW50cyhvcHRzOiB7XG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xuICBjb250ZXh0OiBwbHVnaW4uUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQ7XG4gIG1lbW9yeUJ1aWxkZXI/OiBNZW1vcnlCdWlsZGVyO1xuICBsb2c6IGxvZy5Mb2dnZXI7XG4gIC8qKlxuICAgKiBMb2NhbCBza2lsbCBzY2FuIHBhdGhzIChyZW1vdGUgc2tpbGxzIHByb3Zpc2lvbmVkIHRvIGEgdGVtcCBkaXIgYXRcbiAgICogc3RhcnR1cCkgZm9sZGVkIGludG8gZXZlcnkgYWdlbnQgdGhhdCB1c2VzIHRoZSBhdXRvLWNyZWF0ZWQgZGVmYXVsdFxuICAgKiB3b3Jrc3BhY2UuXG4gICAqL1xuICBleHRyYVNraWxsUGF0aHM/OiBzdHJpbmdbXTtcbn0pOiBQcm9taXNlPEJ1aWx0QWdlbnRzPiB7XG4gIGNvbnN0IHsgY29uZmlnLCBjb250ZXh0LCBtZW1vcnlCdWlsZGVyLCBsb2csIGV4dHJhU2tpbGxQYXRocyB9ID0gb3B0cztcbiAgY29uc3QgZGVmaW5pdGlvbnMgPSByZXNvbHZlRGVmaW5pdGlvbnMoY29uZmlnKTtcbiAgY29uc3QgaWRzID0gT2JqZWN0LmtleXMoZGVmaW5pdGlvbnMpO1xuICBjb25zdCBkZWZhdWx0QWdlbnRJZCA9IGNvbmZpZy5kZWZhdWx0QWdlbnQgPz8gaWRzWzBdID8/IEZBTExCQUNLX0FHRU5UX0lEO1xuXG4gIGNvbnN0IHBsdWdpbnMgPSBidWlsZFBsdWdpbnNNYXAoY29uZmlnLCBjb250ZXh0KTtcbiAgLy8gU3lzdGVtLWRlZmF1bHQgYW1iaWVudCB0b29scyBldmVyeSBhZ2VudCBnZXRzIG91dCBvZiB0aGUgYm94OlxuICAvLyBgcmVuZGVyX2RhdGFgIGZvciBpbmxpbmUgdmlzdWFsaXphdGlvbnMgYW5kIGBzdW1tYXJpemVgIGZvclxuICAvLyBvZmZsb2FkaW5nIHRleHQgY29uZGVuc2luZyB0byB0aGUgZmFzdCAvIHNtYWxsIGNoYXQgdGllci4gVGhlXG4gIC8vIHVzZXIgY2FuIHNoYWRvdyBlaXRoZXIgYnkgaW5jbHVkaW5nIGEgc2FtZS1uYW1lZCB0b29sIGluIHRoZWlyIG93blxuICAvLyBgY29uZmlnLnRvb2xzYCBvciBwZXItYWdlbnQgYHRvb2xzYC4gT3JkZXIgaW4ge0BsaW5rIHJlc29sdmVUb29sc31cbiAgLy8gaXMgYHN5c3RlbSAtPiB1c2VyLWFtYmllbnQgLT4gcGVyLWFnZW50YCwgbGFzdCB3cml0ZSB3aW5zLlxuICBjb25zdCBzeXN0ZW1Ub29sczogTWFzdHJhVG9vbHMgPSB7XG4gICAgcmVuZGVyX2RhdGE6IGJ1aWxkUmVuZGVyRGF0YVRvb2woY29uZmlnKSxcbiAgICBzdW1tYXJpemU6IGJ1aWxkU3VtbWFyaXplVG9vbChjb25maWcpLFxuICB9O1xuICBjb25zdCBhbWJpZW50VG9vbHMgPSB7XG4gICAgLi4uc3lzdGVtVG9vbHMsXG4gICAgLi4uKGNvbmZpZy50b29scyA/PyB7fSksXG4gIH07XG4gIGNvbnN0IHN0eWxlID0gcmVzb2x2ZVN0eWxlSW5zdHJ1Y3Rpb25zKGNvbmZpZyk7XG4gIC8vIERlZmF1bHQtb24gcHJvdGVjdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCBjb3B5aW5nIHR1cm4tc2NvcGVkXG4gIC8vIGNoYXJ0SWRzIGZyb20gcHJpb3IgYXNzaXN0YW50IHRvb2wgcmVzdWx0cyBpbnRvIHRoZSBuZXdcbiAgLy8gdHVybidzIGBbY2hhcnQ6PGlkPl1gIG1hcmtlcnMuIE9wdCBvdXQgcGVyLXBsdWdpbiB2aWFcbiAgLy8gYGNvbmZpZy5zdHJpcFN0YWxlQ2hhcnRzOiBmYWxzZWAuXG4gIGNvbnN0IG91dHB1dFByb2Nlc3NvcnMgPSBbbmV3IFJlc3VsdFByb2Nlc3NvcigpXTtcbiAgY29uc3QgaW5wdXRQcm9jZXNzb3JzID0gW1xuICAgIC4uLihjb25maWcuc3RyaXBTdGFsZUNoYXJ0cyA9PT0gZmFsc2UgPyBbXSA6IFtzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yXSksXG4gIF07XG4gIGNvbnN0IGFnZW50czogUmVjb3JkPHN0cmluZywgQWdlbnQ+ID0ge307XG4gIGNvbnN0IGRlZmF1bHRNb2RlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgYXBwcm92YWxHYXRlZEJ5QWdlbnQ6IEFycmF5PHsgYWdlbnRJZDogc3RyaW5nOyB0b29sSWRzOiBzdHJpbmdbXSB9PiA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2lkLCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKGRlZmluaXRpb25zKSkge1xuICAgIGNvbnN0IHRvb2xzID0gYXdhaXQgcmVzb2x2ZVRvb2xzKGRlZi50b29scywgcGx1Z2lucywgYW1iaWVudFRvb2xzKTtcbiAgICBsZXQgd29ya3NwYWNlID0gcmVzb2x2ZUFnZW50V29ya3NwYWNlKGRlZi53b3Jrc3BhY2UpO1xuICAgIGlmIChcbiAgICAgIChkZWYud29ya3NwYWNlID09PSB1bmRlZmluZWQgJiYgIXdvcmtzcGFjZSkgfHxcbiAgICAgICgoZXh0cmFTa2lsbFBhdGhzPy5sZW5ndGggfHwgY29uZmlnLnNhbmRib3ggIT09IHVuZGVmaW5lZCkgJiYgaXNEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZSkpXG4gICAgKSB7XG4gICAgICB3b3Jrc3BhY2UgPSBjcmVhdGVXb3Jrc3BhY2Uoe1xuICAgICAgICBleHRyYVNraWxsUGF0aHMsXG4gICAgICAgIHNhbmRib3g6XG4gICAgICAgICAgY29uZmlnLnNhbmRib3ggPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc2FuZGJveCA9PT0gdHJ1ZSA/IFwiZGF0YWJyaWNrc1wiIDogY29uZmlnLnNhbmRib3gsXG4gICAgICB9KTtcbiAgICAgIG1hcmtEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZSk7XG4gICAgfVxuICAgIGNvbnN0IGdhdGVkID0gYXBwcm92YWxHYXRlZFRvb2xJZHModG9vbHMpO1xuICAgIGlmIChnYXRlZC5sZW5ndGggPiAwKSBhcHByb3ZhbEdhdGVkQnlBZ2VudC5wdXNoKHsgYWdlbnRJZDogaWQsIHRvb2xJZHM6IGdhdGVkIH0pO1xuICAgIGNvbnN0IG1lbW9yeSA9IG1lbW9yeUJ1aWxkZXI/LmZvckFnZW50KGlkLCBkZWYpO1xuICAgIGFnZW50c1tpZF0gPSBuZXcgQWdlbnQoe1xuICAgICAgaWQsXG4gICAgICBuYW1lOiBkZWYubmFtZSA/PyBpZCxcbiAgICAgIC8vIEFsd2F5cyBjYXJyeSBhIG5vbi1lbXB0eSBkZXNjcmlwdGlvbjogaXQncyBzdXJmYWNlZCB0byBNQ1BcbiAgICAgIC8vIGNsaWVudHMgKHdoaWNoIHJlamVjdCBhIGRlc2NyaXB0aW9uLWxlc3MgYWdlbnQpIGFuZCBpbiBhZ2VudFxuICAgICAgLy8gbWV0YWRhdGEuIEZhbGwgYmFjayB0byBhIGdlbmVyYXRlZCBvbmUgd2hlbiB0aGUgZGVmaW5pdGlvblxuICAgICAgLy8gb21pdHMgaXQuXG4gICAgICBkZXNjcmlwdGlvbjogZGVmLmRlc2NyaXB0aW9uPy50cmltKCkgfHwgZGVmYXVsdEFnZW50RGVzY3JpcHRpb24oZGVmLm5hbWUgPz8gaWQpLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBjb21wb3NlSW5zdHJ1Y3Rpb25zKGRlZi5pbnN0cnVjdGlvbnMsIHN0eWxlKSxcbiAgICAgIG1vZGVsOiByZXNvbHZlTW9kZWwoY29uZmlnLCBkZWYubW9kZWwpLFxuICAgICAgZGVmYXVsdE9wdGlvbnM6IHtcbiAgICAgICAgbWF4U3RlcHM6IGNvbmZpZy5hZ2VudE1heFN0ZXBzID8/IERFRkFVTFRfQUdFTlRfTUFYX1NURVBTLFxuICAgICAgfSxcbiAgICAgIHRvb2xzLFxuICAgICAgLi4uKG1lbW9yeSA/IHsgbWVtb3J5IH0gOiB7fSksXG4gICAgICAuLi4od29ya3NwYWNlID8geyB3b3Jrc3BhY2UgfSA6IHt9KSxcbiAgICAgIGlucHV0UHJvY2Vzc29ycyxcbiAgICAgIG91dHB1dFByb2Nlc3NvcnMsXG4gICAgfSk7XG4gICAgLy8gU3VyZmFjZSB0aGUgZWZmZWN0aXZlIGRlZmF1bHQgbW9kZWwgcGVyIGFnZW50IHNvIG9wZXJhdG9ycyBjYW5cbiAgICAvLyBzZWUgYXQgYSBnbGFuY2Ugd2hpY2ggZW5kcG9pbnQgZWFjaCBhZ2VudCBwb2ludHMgYXQgd2l0aG91dFxuICAgIC8vIGhhdmluZyB0byBmaXJlIGEgcmVxdWVzdCBhbmQgaW5zcGVjdCBhIHRyYWNlLiBUaGUgdmFsdWUgaXMgdGhlXG4gICAgLy8gKnN0YXRpYyogZGVmYXVsdDsgcGVyLXJlcXVlc3Qgb3ZlcnJpZGVzIChoZWFkZXIgLyBxdWVyeSAvXG4gICAgLy8gYm9keSkgYW5kIHRoZSB3b3Jrc3BhY2UtY2F0YWxvZ3VlIGZ1enp5IG1hdGNoIHN0aWxsIGFwcGx5IGF0XG4gICAgLy8gY2FsbCB0aW1lLlxuICAgIGNvbnN0IGRlZmF1bHRNb2RlbCA9IGRlc2NyaWJlQWdlbnREZWZhdWx0TW9kZWwoY29uZmlnLCBkZWYpO1xuICAgIGRlZmF1bHRNb2RlbHNbaWRdID0gZGVmYXVsdE1vZGVsO1xuICAgIGxvZy5pbmZvKFwiYWdlbnQgcmVnaXN0ZXJlZFwiLCB7XG4gICAgICBpZCxcbiAgICAgIG5hbWU6IGRlZi5uYW1lID8/IGlkLFxuICAgICAgZGVmYXVsdE1vZGVsLFxuICAgICAgdG9vbHM6IE9iamVjdC5rZXlzKHRvb2xzKSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmICghYWdlbnRzW2RlZmF1bHRBZ2VudElkXSkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYG1hc3RyYSBkZWZhdWx0QWdlbnQgXCIke2RlZmF1bHRBZ2VudElkfVwiYCxcbiAgICAgIGBSZWdpc3RlcmVkIGFnZW50czogJHtpZHMuam9pbihcIiwgXCIpIHx8IFwibm9uZVwifS5gLFxuICAgICk7XG4gIH1cblxuICBhc3NlcnRBcHByb3ZhbEdhdGVkVG9vbHNIYXZlU3RvcmFnZShhcHByb3ZhbEdhdGVkQnlBZ2VudCwgbWVtb3J5QnVpbGRlcik7XG5cbiAgbG9nLmluZm8oXCJhZ2VudHMgcmVhZHlcIiwgeyBpZHMsIGRlZmF1bHRBZ2VudElkIH0pO1xuICByZXR1cm4geyBhZ2VudHMsIGRlZmF1bHRBZ2VudElkLCBkZWZhdWx0TW9kZWxzLCBhbWJpZW50VG9vbHMgfTtcbn1cblxuLyoqXG4gKiBUb29sIGlkcyBvbiBgdG9vbHNgIHRoYXQgYXJlIGFwcHJvdmFsLWdhdGVkIChgcmVxdWlyZUFwcHJvdmFsOiB0cnVlYCkuXG4gKiBLZXlzIGFyZSB1c2VkIGFzIGEgZmFsbGJhY2sgd2hlbiBhIHRvb2wgb21pdHMgYW4gZXhwbGljaXQgYGlkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcHJvdmFsR2F0ZWRUb29sSWRzKHRvb2xzOiBNYXN0cmFUb29scyk6IHN0cmluZ1tdIHtcbiAgaWYgKCF0b29scyB8fCB0eXBlb2YgdG9vbHMgIT09IFwib2JqZWN0XCIpIHJldHVybiBbXTtcbiAgcmV0dXJuIFtcbiAgICAuLi5vYmplY3RcbiAgICAgIC5zZXF1ZW5jZShPYmplY3QuZW50cmllcyh0b29scykpXG4gICAgICAuZmlsdGVyKChbLCB0b29sXSkgPT4gaXNBcHByb3ZhbEdhdGVkVG9vbCh0b29sKSlcbiAgICAgIC5tYXAoKFtrZXksIHRvb2xdKSA9PiByZXNvbHZlVG9vbElkKHRvb2wsIGtleSkpLFxuICBdO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGEgTWFzdHJhIC8gQUkgU0RLIHRvb2wgcGF1c2VzIGZvciBodW1hbiBhcHByb3ZhbCBiZWZvcmUgZXhlY3V0ZS4gKi9cbmZ1bmN0aW9uIGlzQXBwcm92YWxHYXRlZFRvb2wodG9vbDogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIXRvb2wgfHwgdHlwZW9mIHRvb2wgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuICh0b29sIGFzIHsgcmVxdWlyZUFwcHJvdmFsPzogYm9vbGVhbiB9KS5yZXF1aXJlQXBwcm92YWwgPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUb29sSWQodG9vbDogdW5rbm93biwgZmFsbGJhY2tLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICh0b29sICYmIHR5cGVvZiB0b29sID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiAodG9vbCBhcyB7IGlkPzogc3RyaW5nIH0pLmlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuICh0b29sIGFzIHsgaWQ6IHN0cmluZyB9KS5pZDtcbiAgfVxuICByZXR1cm4gZmFsbGJhY2tLZXk7XG59XG5cbi8qKlxuICogQXBwcm92YWwtZ2F0ZWQgdG9vbHMgc3VzcGVuZCB0aGUgYWdlbnQgbG9vcCB1bnRpbCBhIGh1bWFuIGFwcHJvdmVzLlxuICogTWFzdHJhIHBlcnNpc3RzIHRob3NlIHN1c3BlbmRlZCBydW5zIGluIE1hc3RyYS1pbnN0YW5jZS1sZXZlbCBzdG9yYWdlXG4gKiAoYG1lbW9yeUJ1aWxkZXIuaW5zdGFuY2VTdG9yYWdlKClgKSwgbm90IHBlci1hZ2VudCBtZW1vcnkgLSBzbyBib290XG4gKiBtdXN0IGZhaWwgZmFzdCB3aGVuIHN1Y2ggYSB0b29sIGlzIHJlZ2lzdGVyZWQgd2l0aG91dCBzdG9yYWdlLlxuICovXG5mdW5jdGlvbiBhc3NlcnRBcHByb3ZhbEdhdGVkVG9vbHNIYXZlU3RvcmFnZShcbiAgZ2F0ZWQ6IEFycmF5PHsgYWdlbnRJZDogc3RyaW5nOyB0b29sSWRzOiBzdHJpbmdbXSB9PixcbiAgbWVtb3J5QnVpbGRlcjogTWVtb3J5QnVpbGRlciB8IHVuZGVmaW5lZCxcbik6IHZvaWQge1xuICBpZiAoZ2F0ZWQubGVuZ3RoID09PSAwKSByZXR1cm47XG4gIGlmIChtZW1vcnlCdWlsZGVyPy5pbnN0YW5jZVN0b3JhZ2UoKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGRldGFpbCA9IGdhdGVkXG4gICAgLm1hcCgoeyBhZ2VudElkLCB0b29sSWRzIH0pID0+IGAke2FnZW50SWR9OiAke3Rvb2xJZHMuam9pbihcIiwgXCIpfWApXG4gICAgLmpvaW4oXCI7IFwiKTtcbiAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICBcIm1hc3RyYTogYXBwcm92YWwtZ2F0ZWQgdG9vbHMgcmVxdWlyZSBwbHVnaW4gc3RvcmFnZSAoUG9zdGdyZXNTdG9yZSkgdG8gcGVyc2lzdCBzdXNwZW5kZWQgcnVucy4gXCIgK1xuICAgICAgYEFmZmVjdGVkIGFnZW50cy90b29sczogJHtkZXRhaWx9LiBgICtcbiAgICAgIFwiUmVnaXN0ZXIgbGFrZWJhc2UoKSBiZWZvcmUgbWFzdHJhKCkgc28gc3RvcmFnZSBhdXRvLWVuYWJsZXMsIG9yIHBhc3Mgc3RvcmFnZTogdHJ1ZSBleHBsaWNpdGx5LlwiLFxuICApO1xufVxuXG4vKipcbiAqIEJlc3QtZWZmb3J0IGRlc2NyaXB0aW9uIG9mIHRoZSAqc3RhdGljKiBkZWZhdWx0IG1vZGVsIGFuIGFnZW50IHdpbGxcbiAqIHJlc29sdmUgdG8gYXQgY2FsbCB0aW1lLiBXYWxrcyB0aGUgc2FtZSBwcmVjZWRlbmNlIGxhZGRlciBhc1xuICoge0BsaW5rIHJlc29sdmVNb2RlbH0gLyB7QGxpbmsgYnVpbGRNb2RlbH06XG4gKlxuICogICAxLiBQZXItYWdlbnQgYGRlZi5tb2RlbGAgKHN0cmluZyBzdWdhciAtPiB0aGUgbGl0ZXJhbCBpZDtcbiAqICAgICAgZnVuY3Rpb24gLyBgRHluYW1pY0FyZ3VtZW50YCAtPiBgXCI8ZHluYW1pYz5cImAgYmVjYXVzZSB0aGVcbiAqICAgICAgcmVzb2x2ZXIgZGVjaWRlcyBhdCBjYWxsIHRpbWUpLlxuICogICAyLiBQbHVnaW4tbGV2ZWwgYGNvbmZpZy5kZWZhdWx0TW9kZWxgIChzYW1lIHJ1bGVzKS5cbiAqICAgMy4gYERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FYCBlbnYgdmFyLlxuICogICA0LiBGaXJzdCBlbnRyeSBvZiBgY29uZmlnLmRlZmF1bHRNb2RlbEZhbGxiYWNrcyA/PyBmYWxsYmFjay5GQUxMQkFDS19NT0RFTF9JRFNgLlxuICpcbiAqIFVzZWQgZm9yIHRoZSBzdGFydHVwIGBhZ2VudCByZWdpc3RlcmVkYCBsb2cgc28gb3BlcmF0b3JzIGNhbiBzZWVcbiAqIHdoaWNoIGVuZHBvaW50IGVhY2ggYWdlbnQgcG9pbnRzIGF0IGJ5IGRlZmF1bHQuIFBlci1yZXF1ZXN0XG4gKiBvdmVycmlkZXMgKGBYLU1hc3RyYS1Nb2RlbGAgZXRjLikgYW5kIHRoZSB3b3Jrc3BhY2UtY2F0YWxvZ3VlXG4gKiBmdXp6eSBtYXRjaCBhcmUgc3RpbGwgYXBwbGllZCBhdCBydW50aW1lLlxuICovXG5mdW5jdGlvbiBkZXNjcmliZUFnZW50RGVmYXVsdE1vZGVsKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLCBkZWY6IE1hc3RyYUFnZW50RGVmaW5pdGlvbik6IHN0cmluZyB7XG4gIGNvbnN0IGVmZmVjdGl2ZSA9IGRlZi5tb2RlbCA/PyBjb25maWcuZGVmYXVsdE1vZGVsO1xuICBpZiAodHlwZW9mIGVmZmVjdGl2ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGVmZmVjdGl2ZTtcbiAgaWYgKGVmZmVjdGl2ZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gXCI8ZHluYW1pYz5cIjtcbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRSA/P1xuICAgIGNvbmZpZy5kZWZhdWx0TW9kZWxGYWxsYmFja3M/LlswXSA/P1xuICAgIGZhbGxiYWNrLkZBTExCQUNLX01PREVMX0lEU1swXSFcbiAgKTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYGNvbmZpZy5hZ2VudHNgIGludG8gYSBgUmVjb3JkPGlkLCBkZWZpbml0aW9uPmAuIEFjY2VwdHNcbiAqIGFueSBvZiB0aGUgdGhyZWUgc2hhcGVzIGRvY3VtZW50ZWQgb25cbiAqIHtAbGluayBNYXN0cmFQbHVnaW5Db25maWcuYWdlbnRzfTpcbiAqXG4gKiAtIFJlY29yZCAtIHJldHVybmVkIGFzLWlzIHdoZW4gbm9uLWVtcHR5LlxuICogLSBTaW5nbGUgZGVmaW5pdGlvbiAoZGV0ZWN0ZWQgdmlhIHRoZSByZXF1aXJlZCBgaW5zdHJ1Y3Rpb25zYFxuICogICBmaWVsZCkgLSBrZXllZCBieSBgc2x1Z2lmeShkZWYubmFtZSlgIG9yIGBGQUxMQkFDS19BR0VOVF9JRGAuXG4gKiAtIEFycmF5IC0ga2V5ZWQgYnkgYHNsdWdpZnkoZGVmLm5hbWUpYCBvciBgYWdlbnRfJHtpfWA7IGR1cGxpY2F0ZVxuICogICBzbHVncyBmYWlsIGxvdWRseSBzbyB1c2VycyBrbm93IHRvIHNldCBleHBsaWNpdCBuYW1lcy5cbiAqXG4gKiBPbWl0dGVkIG9yIGVtcHR5IGlucHV0cyBmYWxsIGJhY2sgdG8gYSBzaW5nbGUgYnVpbHQtaW4gYW5hbHlzdCBzb1xuICogdGhlIGJhcmUgYG1hc3RyYSgpYCBjYWxsIHN0aWxsIG1vdW50cyBhIHdvcmtpbmcgY2hhdCByb3V0ZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZURlZmluaXRpb25zKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogUmVjb3JkPHN0cmluZywgTWFzdHJhQWdlbnREZWZpbml0aW9uPiB7XG4gIGNvbnN0IGlucHV0ID0gY29uZmlnLmFnZW50cztcbiAgaWYgKCFpbnB1dCkgcmV0dXJuIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICBpZiAoaW5wdXQubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsbGJhY2tEZWZpbml0aW9ucygpO1xuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgTWFzdHJhQWdlbnREZWZpbml0aW9uPiA9IHt9O1xuICAgIGlucHV0LmZvckVhY2goKGRlZiwgaSkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZGVyaXZlQWdlbnRLZXkoZGVmLCBpKTtcbiAgICAgIGlmIChvdXRba2V5XSkge1xuICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgICAgICAgIGBtYXN0cmE6IGR1cGxpY2F0ZSBhZ2VudCBpZCBcIiR7a2V5fVwiIGRlcml2ZWQgZnJvbSBuYW1lIFwiJHtkZWYubmFtZSA/PyBcIlwifVwiOyBgICtcbiAgICAgICAgICAgIGBzZXQgdW5pcXVlIFxcYG5hbWVcXGBzIG9uIGVhY2ggZGVmaW5pdGlvbmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBvdXRba2V5XSA9IGRlZjtcbiAgICB9KTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLy8gU2luZ2xlLWRlZmluaXRpb24gc2hvcnRoYW5kOiBhbiBhZ2VudCBhbHdheXMgaGFzIGBpbnN0cnVjdGlvbnM6IHN0cmluZ2AsXG4gIC8vIGEgcmVjb3JkLW9mLWFnZW50cyBuZXZlciBoYXMgdGhhdCBmaWVsZCBkaXJlY3RseS5cbiAgaWYgKHR5cGVvZiAoaW5wdXQgYXMgTWFzdHJhQWdlbnREZWZpbml0aW9uKS5pbnN0cnVjdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBkZWYgPSBpbnB1dCBhcyBNYXN0cmFBZ2VudERlZmluaXRpb247XG4gICAgY29uc3Qga2V5ID0gZGVyaXZlQWdlbnRLZXkoZGVmKTtcbiAgICByZXR1cm4geyBba2V5XTogZGVmIH07XG4gIH1cblxuICBjb25zdCByZWNvcmQgPSBpbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCBNYXN0cmFBZ2VudERlZmluaXRpb24+O1xuICBpZiAoT2JqZWN0LmtleXMocmVjb3JkKS5sZW5ndGggPT09IDApIHJldHVybiBmYWxsYmFja0RlZmluaXRpb25zKCk7XG4gIHJldHVybiByZWNvcmQ7XG59XG5cbi8qKiBEZXJpdmUgYSByZWdpc3RyeSBpZCBmcm9tIGEgZGVmaW5pdGlvbidzIGBuYW1lYCwgd2l0aCBhIGZhbGxiYWNrLiAqL1xuZnVuY3Rpb24gZGVyaXZlQWdlbnRLZXkoZGVmOiBNYXN0cmFBZ2VudERlZmluaXRpb24sIGluZGV4PzogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGRlZi5uYW1lKSB7XG4gICAgY29uc3Qgc2x1ZyA9IHN0cmluZy50b0lkZW50aWZpZXIoZGVmLm5hbWUpO1xuICAgIGlmIChzbHVnKSByZXR1cm4gc2x1ZztcbiAgfVxuICByZXR1cm4gaW5kZXggPT09IHVuZGVmaW5lZCA/IEZBTExCQUNLX0FHRU5UX0lEIDogYGFnZW50XyR7aW5kZXh9YDtcbn1cblxuLyoqIEJ1aWx0LWluIGZhbGxiYWNrIHJlZ2lzdHJ5IHVzZWQgd2hlbiBgYWdlbnRzYCBpcyBvbWl0dGVkIC8gZW1wdHkuICovXG5mdW5jdGlvbiBmYWxsYmFja0RlZmluaXRpb25zKCk6IFJlY29yZDxzdHJpbmcsIE1hc3RyYUFnZW50RGVmaW5pdGlvbj4ge1xuICByZXR1cm4ge1xuICAgIFtGQUxMQkFDS19BR0VOVF9JRF06IHtcbiAgICAgIG5hbWU6IFwiRGVmYXVsdCBBZ2VudFwiLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBGQUxMQkFDS19BR0VOVF9JTlNUUlVDVElPTlMsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBlZmZlY3RpdmUgbW9kZWwgc3BlYyBmb3IgYW4gYWdlbnQuIEZhbGxiYWNrIGxhZGRlciwgaW5cbiAqIG9yZGVyOlxuICpcbiAqICAgMS4gUGVyLWFnZW50IGBkZWYubW9kZWxgIChzdHJpbmcgc3VnYXIgb3IgYER5bmFtaWNBcmd1bWVudGApLlxuICogICAyLiBQbHVnaW4tbGV2ZWwgYGNvbmZpZy5kZWZhdWx0TW9kZWxgIChzdHJpbmcgc3VnYXIgb3JcbiAqICAgICAgYER5bmFtaWNBcmd1bWVudGApIC0gbWlycm9ycyBBcHBLaXQncyBgYWdlbnRzKHsgZGVmYXVsdE1vZGVsIH0pYC5cbiAqICAgMy4gVGhlIGF1dG8tcmVzb2x2ZXIgdGhhdCBtaW50cyB1c2VyLXNjb3BlZCB0b2tlbnMgYWdhaW5zdFxuICogICAgICBgL3NlcnZpbmctZW5kcG9pbnRzYCB2aWEge0BsaW5rIGJ1aWxkTW9kZWx9LlxuICpcbiAqIFN0cmluZyB2YWx1ZXMgYXJlIHRyZWF0ZWQgYXMgYG1vZGVsSWRgIHN1Z2FyIGFuZCB0aHJlYWRlZCB0aHJvdWdoXG4gKiBgYnVpbGRNb2RlbGAncyBvdmVycmlkZSBob29rIHNvIHRoZSBydW50aW1lIGZ1enp5IG1hdGNoZXIgYW5kIHRoZVxuICogcGVyLXJlcXVlc3QgYFgtTWFzdHJhLU1vZGVsYCBvdmVycmlkZSBsYXllciBvbiB0b3Agb2YgdGhlIHN0YXRpY1xuICogY2hvaWNlLiBOb24tc3RyaW5nIGBEeW5hbWljQXJndW1lbnRgcyBhcmUgcGFzc2VkIHRocm91Z2ggdmVyYmF0aW07XG4gKiBjYWxsZXJzIHRoYXQgbmVlZCBmdWxsIGNvbnRyb2wgb3ZlciBgcHJvdmlkZXJJZGAgLyBgaGVhZGVyc2AgL1xuICogYG1vZGVsSWRgIGJ5cGFzcyB0aGUgcmVzb2x2ZXIgcGlwZWxpbmUgZW50aXJlbHkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVNb2RlbChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIG92ZXJyaWRlOiBNYXN0cmFBZ2VudERlZmluaXRpb25bXCJtb2RlbFwiXSxcbik6IEFnZW50Q29uZmlnW1wibW9kZWxcIl0ge1xuICBjb25zdCBlZmZlY3RpdmUgPSBvdmVycmlkZSA/PyBjb25maWcuZGVmYXVsdE1vZGVsO1xuICBpZiAoZWZmZWN0aXZlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gKHsgcmVxdWVzdENvbnRleHQgfSkgPT4gYnVpbGRNb2RlbChjb25maWcsIHJlcXVlc3RDb250ZXh0KTtcbiAgfVxuICBpZiAodHlwZW9mIGVmZmVjdGl2ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IG1vZGVsSWQgPSBlZmZlY3RpdmU7XG4gICAgcmV0dXJuICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IGJ1aWxkTW9kZWwoY29uZmlnLCByZXF1ZXN0Q29udGV4dCwgeyBtb2RlbElkIH0pO1xuICB9XG4gIHJldHVybiBlZmZlY3RpdmU7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGRlZmluaXRpb24ncyBgdG9vbHNgIGZpZWxkIHRvIGEgZmxhdCBgTWFzdHJhVG9vbHNgIHJlY29yZCxcbiAqIG1lcmdpbmcgaW4gcGx1Z2luLWxldmVsIGFtYmllbnQgdG9vbHMgKHBlci1hZ2VudCB0b29scyB3aW4gb24ga2V5XG4gKiBjb2xsaXNpb24pLiBDYWxsYmFjayBlcnJvcnMgcHJvcGFnYXRlIHZlcmJhdGltIHNvIHRoZSBvcmlnaW5hbCBzdGFja1xuICogc3Vydml2ZXMgLSB0aGUgY2FsbGVyIGFscmVhZHkga25vd3Mgd2hpY2ggYWdlbnQgd2FzIHJlZ2lzdGVyaW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlVG9vbHMoXG4gIGRlZlRvb2xzOiBNYXN0cmFBZ2VudERlZmluaXRpb25bXCJ0b29sc1wiXSxcbiAgcGx1Z2luczogTWFzdHJhUGx1Z2lucyxcbiAgYW1iaWVudFRvb2xzOiBNYXN0cmFUb29scyxcbik6IFByb21pc2U8TWFzdHJhVG9vbHM+IHtcbiAgaWYgKCFkZWZUb29scykgcmV0dXJuIHsgLi4uYW1iaWVudFRvb2xzIH07XG4gIGNvbnN0IHJlc29sdmVkID0gdHlwZW9mIGRlZlRvb2xzID09PSBcImZ1bmN0aW9uXCIgPyBhd2FpdCBkZWZUb29scyhwbHVnaW5zKSA6IGRlZlRvb2xzO1xuICByZXR1cm4geyAuLi5hbWJpZW50VG9vbHMsIC4uLnJlc29sdmVkIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVBZ2VudFdvcmtzcGFjZShcbiAgd29ya3NwYWNlOiBNYXN0cmFBZ2VudERlZmluaXRpb25bXCJ3b3Jrc3BhY2VcIl0sXG4pOiBXb3Jrc3BhY2UgfCB1bmRlZmluZWQge1xuICBpZiAoIXdvcmtzcGFjZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiB3b3Jrc3BhY2UgPT09IFwiZnVuY3Rpb25cIiA/IHdvcmtzcGFjZSgpIDogd29ya3NwYWNlO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSB7QGxpbmsgTWFzdHJhUGx1Z2luc30gcnVudGltZSBwcm94eSBoYW5kZWQgdG9cbiAqIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2tzLlxuICpcbiAqIEltcGxlbWVudGVkIGFzIGEgYFByb3h5YCBvdmVyIHRoZSBBcHBLaXQgcGx1Z2luIGNvbnRleHQgc29cbiAqIGBwbHVnaW5zLjxuYW1lPmAgcmVzb2x2ZXMgYXQgZmlyc3QgYWNjZXNzLiBBbnkgc2libGluZyBwbHVnaW4gdGhhdFxuICogaW1wbGVtZW50cyBBcHBLaXQncyBzdGFuZGFyZCBgVG9vbFByb3ZpZGVyYCBpbnRlcmZhY2VcbiAqIChgdG9vbGtpdChvcHRzPylgICsgYGV4ZWN1dGVBZ2VudFRvb2wobmFtZSwgYXJncywgc2lnbmFsPywgY29udGV4dD8pYCkgaXNcbiAqIGF1dG8tYWRhcHRlZCBpbnRvIE1hc3RyYSB0b29scy4gVW5rbm93biBuYW1lcyByZXR1cm4gYHVuZGVmaW5lZGAsXG4gKiBtYXRjaGluZyBBcHBLaXQncyBgUGx1Z2luc2Agc2VtYW50aWNzIHNvIGBwbHVnaW5zLmZvbz8udG9vbGtpdCgpYFxuICogcmVtYWlucyBzYWZlIGluIGVudmlyb25tZW50cyB3aGVyZSBgZm9vYCBpc24ndCByZWdpc3RlcmVkLlxuICpcbiAqIGBnZW5pZWAgaXMgc3BlY2lhbC1jYXNlZCB0byBzd2FwIHRoZSBnZW5lcmljIEFwcEtpdCB0b29sa2l0ICh3aGljaFxuICogcnVucyBgZXhlY3V0ZUFnZW50VG9vbGAgYW5kIG9ubHkgZW1pdHMgYSBzaW5nbGUgZmluYWwgYHRvb2wtcmVzdWx0YFxuICogY2h1bmsgcGVyIGNhbGwpIGZvciB0aGUgc3RyZWFtaW5nLWF3YXJlIHRvb2xzIGJ1aWx0IGJ5XG4gKiB7QGxpbmsgYnVpbGRHZW5pZVRvb2xraXRQcm92aWRlcn0uIFRoZSBzdHJlYW1pbmcgdmFyaWFudCBmb3J3YXJkcyBlYWNoXG4gKiBHZW5pZSB3aXJlIGV2ZW50IChzdGF0dXMsIFNRTCwgcm93IGNvdW50cywgZXJyb3JzKSBvdXQgdGhyb3VnaCB0aGVcbiAqIE1hc3RyYSBgY3R4LndyaXRlcmAsIHNvIHRoZSBVSSBnZXRzIGB0b29sLW91dHB1dGAgY2h1bmtzIGluIHJlYWxcbiAqIHRpbWUgaW5zdGVhZCBvZiBzdGFyaW5nIGF0IGEgc3Bpbm5lciBmb3IgdGhlIGZ1bGwgR2VuaWUgcm91bmQtdHJpcC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRQbHVnaW5zTWFwKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgY29udGV4dDogcGx1Z2luLlBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkLFxuKTogTWFzdHJhUGx1Z2lucyB7XG4gIGNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB8IG51bGw+KCk7XG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgTWFzdHJhUGx1Z2lucywge1xuICAgIGdldChfdGFyZ2V0LCBwcm9wTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wTmFtZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGlmIChjYWNoZS5oYXMocHJvcE5hbWUpKSByZXR1cm4gY2FjaGUuZ2V0KHByb3BOYW1lKSA/PyB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBwcm92aWRlciA9IHJlc29sdmVQcm92aWRlcihjb25maWcsIGNvbnRleHQsIHByb3BOYW1lKTtcbiAgICAgIGNhY2hlLnNldChwcm9wTmFtZSwgcHJvdmlkZXIpO1xuICAgICAgcmV0dXJuIHByb3ZpZGVyID8/IHVuZGVmaW5lZDtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSByaWdodCB7QGxpbmsgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyfSBmb3IgYSBzaWJsaW5nXG4gKiBwbHVnaW4gbG9va3VwLiBSZXR1cm5zIHRoZSBHZW5pZSBhZ2VudC1iYWNrZWQgYWRhcHRlciB3aGVuXG4gKiB0aGUgY2FsbGVyIGFza3MgZm9yIGBnZW5pZWAgQU5EIGF0IGxlYXN0IG9uZSBzcGFjZSBpcyByZWFjaGFibGVcbiAqIHZpYSB7QGxpbmsgcmVzb2x2ZUdlbmllU3BhY2VzfSAodGhlIGV4cGxpY2l0XG4gKiBgY29uZmlnLmdlbmllU3BhY2VzYCwgdGhlIHJlZ2lzdGVyZWQgQXBwS2l0IGBnZW5pZSgpYCBwbHVnaW4nc1xuICogYHNwYWNlc2AgY29uZmlnLCBvciB0aGUgYERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSURgIGVudiB2YXIpLlxuICogRmFsbHMgYmFjayB0byB0aGUgZ2VuZXJpYyBBcHBLaXQgYFRvb2xQcm92aWRlcmAgYWRhcHRlciBmb3JcbiAqIGV2ZXJ5IG90aGVyIHBsdWdpbiBuYW1lLiBgY29uZmlnYCBpcyB0aHJlYWRlZCB0aHJvdWdoIHNvIHRoZVxuICogR2VuaWUgYWdlbnQgaW5oZXJpdHMgdGhlIHNhbWUgbW9kZWwgcmVzb2x2ZXIgLyBmYWxsYmFja1xuICogbGFkZGVyIHRoZSBjYWxsaW5nIGFnZW50cyB1c2UuXG4gKlxuICogVGhlIEdlbmllIHRvb2xzIHRhbGsgdG8gR2VuaWUgZGlyZWN0bHkgdGhyb3VnaCBgQGRieC10b29scy9nZW5pZWBcbiAqIChgZ2VuaWVFdmVudENoYXRgKSBhbmQgdGhlIHdvcmtzcGFjZSBgc3RhdGVtZW50RXhlY3V0aW9uLmdldFN0YXRlbWVudGBcbiAqIEFQSTsgQXBwS2l0J3Mgc3RvY2sgYGdlbmllYCBwbHVnaW4gY29udHJpYnV0ZXMgb25seSBpdHMgcmVzb3VyY2VcbiAqIG1hbmlmZXN0IGFuZCBgc3BhY2VzYCBjb25maWcsIHNvIGFuIGBhcHAueWFtbGAgcmVzb3VyY2UgYmluZGluZyBhbmQgYVxuICogYGdlbmllKHsgc3BhY2VzIH0pYCByZWNvcmQgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGhlcmUgYXMgdGhleSBkbyB0aGVyZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVByb3ZpZGVyKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgY29udGV4dDogcGx1Z2luLlBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkLFxuICBwcm9wTmFtZTogc3RyaW5nLFxuKTogTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHwgbnVsbCB7XG4gIGlmIChwcm9wTmFtZSA9PT0gXCJnZW5pZVwiKSB7XG4gICAgY29uc3Qgc3BhY2VzID0gcmVzb2x2ZUdlbmllU3BhY2VzKGNvbmZpZywgY29udGV4dCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNwYWNlcykubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYnVpbGRHZW5pZVRvb2xraXRQcm92aWRlcih7XG4gICAgICBzcGFjZXMsXG4gICAgICBjb25maWcsXG4gICAgfSkgYXMgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyO1xuICB9XG4gIGNvbnN0IHBsdWdpbiA9IGNvbnRleHQ/LmdldFBsdWdpbnMoKS5nZXQocHJvcE5hbWUpO1xuICByZXR1cm4gYWRhcHRQbHVnaW5Ub29sa2l0KHBsdWdpbik7XG59XG5cbi8qKlxuICogQXBwS2l0IGBUb29sUHJvdmlkZXJgIHNoYXBlIHdlIGR1Y2stdHlwZSBhZ2FpbnN0IGFueSByZWdpc3RlcmVkXG4gKiBwbHVnaW4uIERlZmluZWQgc3RydWN0dXJhbGx5IHRvIGF2b2lkIGNvdXBsaW5nIHRvIEFwcEtpdCdzIGludGVybmFsXG4gKiB0eXBlIG1vZHVsZSBsYXlvdXQuXG4gKi9cbmludGVyZmFjZSBBcHBLaXRUb29sa2l0UHJvdmlkZXIge1xuICB0b29sa2l0PzogKG9wdHM/OiBUb29sa2l0T3B0aW9ucykgPT4gUmVjb3JkPHN0cmluZywgQXBwS2l0VG9vbGtpdEVudHJ5PjtcbiAgZXhlY3V0ZUFnZW50VG9vbD86IChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgYXJnczogdW5rbm93bixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICBjb250ZXh0PzogeyByZXNvdXJjZUlkPzogc3RyaW5nIH0sXG4gICkgPT4gUHJvbWlzZTx1bmtub3duPjtcbn1cblxuLyoqIFNpbmdsZSBlbnRyeSByZXR1cm5lZCBieSBhbiBBcHBLaXQgcGx1Z2luJ3MgYC50b29sa2l0KG9wdHMpYCBjYWxsLiAqL1xuaW50ZXJmYWNlIEFwcEtpdFRvb2xraXRFbnRyeSB7XG4gIHJlYWRvbmx5IF9fdG9vbGtpdFJlZj86IHRydWU7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgbG9jYWxOYW1lOiBzdHJpbmc7XG4gIGRlZjoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHBhcmFtZXRlcnM6IHVua25vd247XG4gIH07XG4gIGFubm90YXRpb25zPzoge1xuICAgIGVmZmVjdD86IFwicmVhZFwiIHwgXCJ3cml0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJ1Y3RpdmVcIjtcbiAgICByZXF1aXJlc1VzZXJDb250ZXh0PzogYm9vbGVhbjtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGFwdCBhbiBBcHBLaXQgYFRvb2xQcm92aWRlcmAgcGx1Z2luIGluc3RhbmNlIGludG8gYVxuICoge0BsaW5rIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcn0uIFJldHVybnMgYG51bGxgIGZvciBhbnkgcGx1Z2luXG4gKiB0aGF0IGRvZXNuJ3QgaW1wbGVtZW50IGJvdGggYHRvb2xraXRgIGFuZCBgZXhlY3V0ZUFnZW50VG9vbGAgKGUuZy5cbiAqIGBzZXJ2ZXJgLCBgbGFrZWJhc2VgIHdoZW4gdXNlZCBvbmx5IGFzIGEgUG9zdGdyZXMgcG9vbCwgZXRjLikuXG4gKi9cbmZ1bmN0aW9uIGFkYXB0UGx1Z2luVG9vbGtpdChwbHVnaW46IHVua25vd24pOiBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIgfCBudWxsIHtcbiAgaWYgKCFwbHVnaW4gfHwgdHlwZW9mIHBsdWdpbiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHAgPSBwbHVnaW4gYXMgQXBwS2l0VG9vbGtpdFByb3ZpZGVyO1xuICBpZiAodHlwZW9mIHAudG9vbGtpdCAhPT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiBwLmV4ZWN1dGVBZ2VudFRvb2wgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB7XG4gICAgdG9vbGtpdChvcHRzPzogVG9vbGtpdE9wdGlvbnMpOiBNYXN0cmFUb29scyB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gcC50b29sa2l0IShvcHRzKTtcbiAgICAgIGNvbnN0IHRvb2xzOiBNYXN0cmFUb29scyA9IHt9O1xuICAgICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cmllcykpIHtcbiAgICAgICAgdG9vbHNba2V5XSA9IHRvb2xraXRFbnRyeVRvTWFzdHJhVG9vbChlbnRyeSwgcCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdG9vbHM7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBXcmFwIGEgc2luZ2xlIHtAbGluayBBcHBLaXRUb29sa2l0RW50cnl9IGFzIGEgTWFzdHJhIHRvb2wgd2hvc2VcbiAqIGBleGVjdXRlYCBkaXNwYXRjaGVzIGJhY2sgdGhyb3VnaCBgcGx1Z2luLmV4ZWN1dGVBZ2VudFRvb2woLi4uKWAgc29cbiAqIEFwcEtpdCdzIE9CTyBhdXRoIChgYXNVc2VyYCksIHRlbGVtZXRyeSBzcGFucywgYW5kIHRoZSBNYXN0cmEgbWVtb3J5IHJlc291cmNlXG4gKiBpZCBzdGF5IGludGFjdC4gSlNPTiBTY2hlbWEgcGFyYW1ldGVycyBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkIC0gTWFzdHJhJ3NcbiAqIGBQdWJsaWNTY2hlbWFgIGFjY2VwdHMgYEpTT05TY2hlbWE3YCBkaXJlY3RseSB2aWEgYEBtYXN0cmEvc2NoZW1hLWNvbXBhdGAuXG4gKi9cbmZ1bmN0aW9uIHRvb2xraXRFbnRyeVRvTWFzdHJhVG9vbChlbnRyeTogQXBwS2l0VG9vbGtpdEVudHJ5LCBwbHVnaW46IEFwcEtpdFRvb2xraXRQcm92aWRlcik6IFRvb2wge1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IGAke2VudHJ5LnBsdWdpbk5hbWV9X18ke2VudHJ5LmxvY2FsTmFtZX1gLFxuICAgIGRlc2NyaXB0aW9uOiBlbnRyeS5kZWYuZGVzY3JpcHRpb24sXG4gICAgLi4uKGVudHJ5LmRlZi5wYXJhbWV0ZXJzID8geyBpbnB1dFNjaGVtYTogZW50cnkuZGVmLnBhcmFtZXRlcnMgYXMgbmV2ZXIgfSA6IHt9KSxcbiAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbiA9IGNvbnRleHQgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAgICAgICAgICAgcmVxdWVzdENvbnRleHQ/OiB7IGdldChrZXk6IHN0cmluZyk6IHVua25vd24gfTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcmVzb3VyY2VJZCA9IGV4ZWN1dGlvbj8ucmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKTtcbiAgICAgIHJldHVybiBwbHVnaW4uZXhlY3V0ZUFnZW50VG9vbCEoZW50cnkubG9jYWxOYW1lLCBpbnB1dCwgZXhlY3V0aW9uPy5hYm9ydFNpZ25hbCwge1xuICAgICAgICAuLi4odHlwZW9mIHJlc291cmNlSWQgPT09IFwic3RyaW5nXCIgPyB7IHJlc291cmNlSWQgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufVxuIl19
@@ -23,6 +23,7 @@ import type { MastraAgentDefinition, MastraTools } from "./agents.ts";
23
23
  import type { GenieSpacesConfig } from "./genie.ts";
24
24
  import { type MastraIdentityMode } from "./identity.ts";
25
25
  import type { RemoteSkillsOption } from "./remote-skills.ts";
26
+ import type { DatabricksWorkspaceSandboxOptions } from "./sandbox.ts";
26
27
  /**
27
28
  * `RequestContext` key under which {@link MastraServer} stores the
28
29
  * resolved AppKit user. `model.ts` reads it to mint user-scoped
@@ -163,6 +164,13 @@ export interface MastraPluginConfig extends BasePluginConfig {
163
164
  * `lakebase` plugin's pool; an object opens a dedicated store.
164
165
  */
165
166
  memory?: boolean | MastraMemoryConfig;
167
+ /**
168
+ * Sandbox for auto-created agent workspaces. Defaults to Databricks Sandbox.
169
+ * `true` selects Databricks with defaults, an object configures its lifecycle,
170
+ * and `false` disables workspace command execution. An agent with an explicit
171
+ * custom `workspace` keeps that workspace and its sandbox.
172
+ */
173
+ sandbox?: boolean | "databricks" | "monty" | DatabricksWorkspaceSandboxOptions;
166
174
  /**
167
175
  * Code-defined agents. Accepts three shapes for convenience:
168
176
  *