obsidian-dev-utils 70.2.0 → 70.2.1

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.
Files changed (37) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/dev/main.js +3 -7
  3. package/dist/dprint.json +1 -1
  4. package/dist/lib/cjs/library.cjs +1 -1
  5. package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +1 -1
  6. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +1 -1
  7. package/dist/lib/cjs/obsidian/link.cjs +2 -4
  8. package/dist/lib/cjs/obsidian/markdown-code-block-processor.cjs +2 -4
  9. package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.cjs +1 -1
  10. package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.cjs +1 -1
  11. package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.cjs +1 -1
  12. package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.cjs +1 -1
  13. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +1 -1
  14. package/dist/lib/cjs/script-utils/check-project-types.cjs +2 -4
  15. package/dist/lib/cjs/script-utils/exec.cjs +1 -1
  16. package/dist/lib/cjs/script-utils/linters/eslint-no-restricted-syntax.cjs +1 -1
  17. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.cjs +1 -1
  18. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.cjs +1 -1
  19. package/dist/lib/cjs/type.cjs +1 -1
  20. package/dist/lib/esm/library.mjs +1 -1
  21. package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +1 -1
  22. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +1 -1
  23. package/dist/lib/esm/obsidian/link.mjs +2 -4
  24. package/dist/lib/esm/obsidian/markdown-code-block-processor.mjs +2 -4
  25. package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.mjs +1 -1
  26. package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.mjs +1 -1
  27. package/dist/lib/esm/obsidian/setting-components/multiple-text-component.mjs +1 -1
  28. package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.mjs +1 -1
  29. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +1 -1
  30. package/dist/lib/esm/script-utils/check-project-types.mjs +2 -4
  31. package/dist/lib/esm/script-utils/exec.mjs +1 -1
  32. package/dist/lib/esm/script-utils/linters/eslint-no-restricted-syntax.mjs +1 -1
  33. package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.mjs +1 -1
  34. package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.mjs +1 -1
  35. package/dist/lib/esm/type.mjs +1 -1
  36. package/package.json +2 -4
  37. package/scripts/postinstall.mjs +0 -29
@@ -848,9 +848,7 @@ function shouldEscapeWikilinkDivider(fileChange, tablePositions) {
848
848
  if (!UNESCAPED_WIKILINK_DIVIDER_REGEXP.test(fileChange.newContent)) {
849
849
  return false;
850
850
  }
851
- return tablePositions.some(
852
- (tablePosition) => tablePosition.start <= fileChange.reference.position.start.offset && fileChange.reference.position.end.offset <= tablePosition.end
853
- );
851
+ return tablePositions.some((tablePosition) => tablePosition.start <= fileChange.reference.position.start.offset && fileChange.reference.position.end.offset <= tablePosition.end);
854
852
  }
855
853
  function shouldUseWikilinkStyle(app, originalLink, linkStyle) {
856
854
  const resolvedStyle = linkStyle ?? "PreserveExisting" /* PreserveExisting */;
@@ -896,4 +894,4 @@ function shouldUseWikilinkStyle(app, originalLink, linkStyle) {
896
894
  updateLinksInContent,
897
895
  updateLinksInFile
898
896
  });
899
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGhhbmRsaW5nIGFuZCB1cGRhdGluZyBsaW5rcyB3aXRoaW4gT2JzaWRpYW4gdmF1bHRzLiBJdCBpbmNsdWRlc1xuICogZnVuY3Rpb25zIHRvIHNwbGl0IHBhdGhzLCB1cGRhdGUgbGlua3MgaW4gZmlsZXMsIGFuZCBnZW5lcmF0ZSBtYXJrZG93biBsaW5rcyB3aXRoIHZhcmlvdXMgb3B0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExpbmsgfSBmcm9tICdtZGFzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFBsdWdpbixcbiAgUmVmZXJlbmNlLFxuICBURmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBOb2RlIH0gZnJvbSAndW5pc3QnO1xuXG5pbXBvcnQgeyBJbnRlcm5hbFBsdWdpbk5hbWUgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVQYXRoLFxuICBwYXJzZUxpbmt0ZXh0LFxuICByZXF1aXJlQXBpVmVyc2lvblxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyByZW1hcmsgfSBmcm9tICdyZW1hcmsnO1xuaW1wb3J0IHJlbWFya1BhcnNlIGZyb20gJ3JlbWFyay1wYXJzZSc7XG5pbXBvcnQgeyB3aWtpTGlua1BsdWdpbiB9IGZyb20gJ3JlbWFyay13aWtpLWxpbmsnO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tICd1bmlzdC11dGlsLXZpc2l0JztcblxuaW1wb3J0IHR5cGUgeyBHZW5lcmljT2JqZWN0IH0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXliZVJldHVybiB9IGZyb20gJy4uL3R5cGUudHMnO1xuaW1wb3J0IHR5cGUgeyBGaWxlQ2hhbmdlIH0gZnJvbSAnLi9maWxlLWNoYW5nZS50cyc7XG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgUHJvY2Vzc09wdGlvbnMgfSBmcm9tICcuL3ZhdWx0LnRzJztcblxuaW1wb3J0IHsgYWJvcnRTaWduYWxOZXZlciB9IGZyb20gJy4uL2Fib3J0LWNvbnRyb2xsZXIudHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZSxcbiAgcmVwbGFjZUFsbCxcbiAgdHJpbUVuZFxufSBmcm9tICcuLi9zdHJpbmcudHMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0TmV2ZXIsXG4gIGFzc2VydE5vbk51bGxhYmxlLFxuICBlbnN1cmVOb25OdWxsYWJsZVxufSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgeyBpc1VybCB9IGZyb20gJy4uL3VybC50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuL2FwcC50cyc7XG5pbXBvcnQge1xuICBhcHBseUNvbnRlbnRDaGFuZ2VzLFxuICBhcHBseUZpbGVDaGFuZ2VzLFxuICBpc0NhbnZhc0NoYW5nZSxcbiAgaXNDb250ZW50Q2hhbmdlXG59IGZyb20gJy4vZmlsZS1jaGFuZ2UudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0UGF0aCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc01hcmtkb3duRmlsZSxcbiAgTUFSS0RPV05fRklMRV9FWFRFTlNJT05cbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBnZXRBbGxMaW5rcyxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUsXG4gIGdldENhY2hlU2FmZSxcbiAgcGFyc2VNZXRhZGF0YSxcbiAgdGVtcFJlZ2lzdGVyRmlsZXNBbmRSdW5cbn0gZnJvbSAnLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQge1xuICBnZXROZXdMaW5rRm9ybWF0LFxuICBzaG91bGRVc2VXaWtpbGlua3Ncbn0gZnJvbSAnLi9vYnNpZGlhbi1zZXR0aW5ncy50cyc7XG5pbXBvcnQge1xuICBpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlLFxuICByZWZlcmVuY2VUb0ZpbGVDaGFuZ2Vcbn0gZnJvbSAnLi9yZWZlcmVuY2UudHMnO1xuXG5jb25zdCBFU0NBUEVEX1dJS0lMSU5LX0RJVklERVIgPSAnXFxcXHwnO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc3BlY2lhbCBsaW5rIHN5bWJvbHMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4IC0tIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgd3JpdHRlbiB0byBjYXB0dXJlIGNvbnRyb2wgY2hhcmFjdGVycy5cbmNvbnN0IFNQRUNJQUxfTElOS19TWU1CT0xTX1JFR0VYUCA9IC9bXFxcXFxceDAwXFx4MDhcXHgwQlxceDBDXFx4MEUtXFx4MUYgXS9nO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc3BlY2lhbCBtYXJrZG93biBsaW5rIHN5bWJvbHMuXG4gKi9cbmNvbnN0IFNQRUNJQUxfTUFSS0RPV05fTElOS19TWU1CT0xTX1JFR0VYID0gL1tcXFxcW1xcXTw+Xyp+PWAkXS9nO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgdW5lc2NhcGVkIHBpcGVzLlxuICovXG5jb25zdCBVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAgPSAvKD88IVxcXFwpXFx8L2c7XG5cbmNvbnN0IFdJS0lMSU5LX0RJVklERVIgPSAnfCc7XG5cbi8qKlxuICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICovXG5leHBvcnQgZW51bSBMaW5rUGF0aFN0eWxlIHtcbiAgLyoqXG4gICAqIFVzZSB0aGUgYWJzb2x1dGUgcGF0aCBpbiB0aGUgdmF1bHQuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW3BhdGgvZnJvbS90aGUvdmF1bHQvcm9vdC90YXJnZXRdXWBcbiAgICovXG4gIEFic29sdXRlUGF0aEluVmF1bHQgPSAnQWJzb2x1dGVQYXRoSW5WYXVsdCcsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZGVmYXVsdCBsaW5rIHBhdGggc3R5bGUgZGVmaW5lZCBpbiBPYnNpZGlhbiBzZXR0aW5ncy5cbiAgICovXG4gIE9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0ID0gJ09ic2lkaWFuU2V0dGluZ3NEZWZhdWx0JyxcblxuICAvKipcbiAgICogVXNlIHRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBzb3VyY2UuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbWy4uLy4uL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqL1xuICBSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZSA9ICdSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZScsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgc2hvcnRlc3QgcGF0aCB3aGVuIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1tzaG9ydGVzdC1wYXRoLXRvLXRhcmdldF1dYFxuICAgKi9cbiAgU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlID0gJ1Nob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSdcbn1cblxuLyoqXG4gKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICovXG5leHBvcnQgZW51bSBMaW5rU3R5bGUge1xuICAvKipcbiAgICogRm9yY2UgdGhlIGxpbmsgdG8gYmUgaW4gbWFya2Rvd24gZm9ybWF0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW2FsaWFzXShwYXRoL3RvL3RhcmdldC5tZClgXG4gICAqL1xuICBNYXJrZG93biA9ICdNYXJrZG93bicsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZGVmYXVsdCBsaW5rIHN0eWxlIGRlZmluZWQgaW4gT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBPYnNpZGlhblNldHRpbmdzRGVmYXVsdCA9ICdPYnNpZGlhblNldHRpbmdzRGVmYXVsdCcsXG5cbiAgLyoqXG4gICAqIFByZXNlcnZlIHRoZSBleGlzdGluZyBsaW5rIHN0eWxlLlxuICAgKi9cbiAgUHJlc2VydmVFeGlzdGluZyA9ICdQcmVzZXJ2ZUV4aXN0aW5nJyxcblxuICAvKipcbiAgICogRm9yY2UgdGhlIGxpbmsgdG8gYmUgaW4gd2lraWxpbmsgZm9ybWF0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1twYXRoL3RvL3RhcmdldF1dYFxuICAgKiBAZXhhbXBsZSBgW1twYXRoL3RvL3RhcmdldHxhbGlhc11dYFxuICAgKi9cbiAgV2lraWxpbmsgPSAnV2lraWxpbmsnXG59XG5cbmVudW0gRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgQWJzb2x1dGVQYXRoSW5WYXVsdCA9ICdBYnNvbHV0ZVBhdGhJblZhdWx0JyxcbiAgUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UgPSAnUmVsYXRpdmVQYXRoVG9UaGVOb3RlJyxcbiAgU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlID0gJ1Nob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSdcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgY29udmVydExpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnRMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdlbmVyYXRlTWFya2Rvd25MaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBmb3IgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW2FsaWFzfGxpbmtdXWBcbiAgICogQGV4YW1wbGUgYFthbGlhc10obGluay5tZClgXG4gICAqL1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgYmUgZW1iZWRkZWQuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZSBpbmZlcnJlZCBiYXNlZCBvbiB0aGUgZmlsZSB0eXBlLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW1t0YXJnZXRdXWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3RhcmdldF1dYC5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGFuIGVtcHR5IGFsaWFzIGZvciBlbWJlZHMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtdKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYCFbZm9vXShmb28ucG5nKWAuXG4gICAqL1xuICByZWFkb25seSBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IG5vbi1leGlzdGluZyBmaWxlcy4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYCBhbmQge0BsaW5rIHRhcmdldFBhdGhPckZpbGV9IGlzIGEgbm9uLWV4aXN0aW5nIGZpbGUsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhIHNpbmdsZSBzdWJwYXRoLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgdGFyZ2V0UGF0aE9yRmlsZX0gYW5kIHtAbGluayBzb3VyY2VQYXRoT3JGaWxlfSBhcmUgdGhlIHNhbWUgZmlsZS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1sjc3VicGF0aF1dYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbc291cmNlI3N1YnBhdGhdXWBcbiAgICovXG4gIHJlYWRvbmx5IGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZTtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQW4gb3JpZ2luYWwgbGluayB0ZXh0LlxuICAgKlxuICAgKiBJZiBwcm92aWRlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGluZmVyIHRoZSB2YWx1ZXMgb2ZcbiAgICpcbiAgICogLSB7QGxpbmsgaXNFbWJlZH1cbiAgICogLSB7QGxpbmsgbGlua1N0eWxlfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VBbmdsZUJyYWNrZXRzfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoc31cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc31cbiAgICpcbiAgICogVGhlc2UgaW5mZXJyZWQgdmFsdWVzIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBjb3JyZXNwb25kaW5nIHNldHRpbmdzIGlmIHNwZWNpZmllZC5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbmFsTGluaz86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBhdHRhY2htZW50IGV4dGVuc2lvbiBpbiB0aGUgZW1iZWQgYWxpYXMuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbZm9vLnBuZ10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2Zvb10oZm9vLnBuZylgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBkb3QuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9Tb3VyY2V9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy4vcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIHNsYXNoLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHR9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy9hYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1thYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHN1YnBhdGggb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIFNob3VsZCBiZSBlbXB0eSBvciBzdGFydCB3aXRoIGAjYC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRoLWVtcHR5LXN1YnBhdGhdXWBcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRoLXN1YnBhdGgjc3VicGF0aF1dYFxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtc3VicGF0aCNzdWJwYXRoI25lc3RlZC1zdWJwYXRoXV1gXG4gICAqL1xuICByZWFkb25seSBzdWJwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZVJhd01hcmtkb3duTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVSYXdNYXJrZG93bkxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWxpYXMgb2YgdGhlIGxpbmsuIERlZmF1bHRzIHRvIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGFuIGVtYmVkIGxpbmsuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICByZWFkb25seSBpc0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYSB3aWtpbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzV2lraWxpbms6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy4gQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc1dpa2lsaW5rfSBpcyBgZmFsc2VgLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVzZSBhbmdsZSBicmFja2V0cy4gQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc1dpa2lsaW5rfSBpcyBgZmFsc2VgLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgdGl0bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gVVJMIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSByZXN1bHQgb2YgcGFyc2luZyBhIGxpbmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VMaW5rUmVzdWx0IHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW1xcKmFsaWFzXFwqXShsaW5rLm1kKSAtPiBcXCphbGlhc1xcKlxuICAgKiBgYGBcbiAgICovXG4gIGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmNvZGVkIFVSTCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oPGxpbmsgd2l0aCBzcGFjZS5tZD4pIC0+IGxpbmslMjB3aXRoJTIwc3BhY2UubWRcbiAgICogYGBgXG4gICAqL1xuICBlbmNvZGVkVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBvcmlnaW5hbCB0ZXh0LlxuICAgKi9cbiAgZW5kT2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBoYXMgYW5nbGUgYnJhY2tldHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKDxsaW5rLm1kPikgLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGxpbmsubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgaGFzQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhbiBlbWJlZCBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogIVtbYWxpYXNdXSAtPiB0cnVlXG4gICAqIFtbYWxpYXNdXSAtPiBmYWxzZVxuICAgKiBgYGBcbiAgICovXG4gIGlzRW1iZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBleHRlcm5hbC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oaHR0cHM6Ly9leGFtcGxlLmNvbSkgLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGZpbGUubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgaXNFeHRlcm5hbDogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGEgd2lraWxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbW2FsaWFzXV0gLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGxpbmsubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgaXNXaWtpbGluazogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSByYXcgbGluayB0ZXh0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXShsaW5rLm1kKSAtPiBbYWxpYXNdKGxpbmsubWQpXG4gICAqIGBgYFxuICAgKi9cbiAgcmF3OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RhcnQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBvcmlnaW5hbCB0ZXh0LlxuICAgKi9cbiAgc3RhcnRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQSB0aXRsZSBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10obGluay5tZCBcInRpdGxlXCIpIC0+IHRpdGxlXG4gICAqIGBgYFxuICAgKi9cbiAgdGl0bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIHVuZXNjYXBlZCBhbGlhcyBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFtcXCphbGlhc1xcKl0obGluay5tZCkgLT4gKmFsaWFzKlxuICAgKiBgYGBcbiAgICovXG4gIHVuZXNjYXBlZEFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBVUkwgb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKGxpbmslMjB3aXRoJTIwc3BhY2UubWQpIC0+IGxpbmsgd2l0aCBzcGFjZS5tZFxuICAgKiBgYGBcbiAgICovXG4gIHVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBzaG91bGRSZXNldEFsaWFzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaG91bGRSZXNldEFsaWFzUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGRpc3BsYXkgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhIHdpa2lsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNXaWtpbGluaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgdGFyZ2V0IHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRUYXJnZXRQYXRoOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIC8qKlxuICAgKiBBIGxpbmsgcGF0aC5cbiAgICovXG4gIGxpbmtQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aC5cbiAgICovXG4gIHN1YnBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdXBkYXRlTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIG1hcmtkb3duIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3VGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRUYXJnZXRQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdXBkYXRlTGlua3NJbkZpbGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zIGV4dGVuZHMgUHJvY2Vzc09wdGlvbnMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgZmlsZSB0byB1cGRhdGUgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgb25seSBlbWJlZGRlZCBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIExpbmtDb25maWcge1xuICByZWFkb25seSBpc0VtYmVkOiBib29sZWFuO1xuICByZWFkb25seSBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBib29sZWFuO1xuICByZWFkb25seSBpc1dpa2lsaW5rOiBib29sZWFuO1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlOiBGaW5hbExpbmtQYXRoU3R5bGU7XG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzOiBib29sZWFuO1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVGFibGVQb3NpdGlvbiB7XG4gIGVuZDogbnVtYmVyO1xuICBzdGFydDogbnVtYmVyO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB1cGRhdGVMaW5rc0luQ29udGVudH0uXG4gKi9cbmludGVyZmFjZSBVcGRhdGVMaW5rc0luQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBjb250ZW50IHRvIHVwZGF0ZSB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgbmV3IHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBvbmx5IGVtYmVkZGVkIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFdpa2lMaW5rTm9kZSBleHRlbmRzIE5vZGUge1xuICBkYXRhOiBXaWtpTGlua05vZGVEYXRhO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgV2lraUxpbmtOb2RlRGF0YSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgYWxpYXM6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGxpbmsgdG8gYSBuZXcgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGNvbnZlcnRpbmcgdGhlIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0TGluayhwYXJhbXM6IENvbnZlcnRMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGV4dHJhY3RMaW5rRmlsZShwYXJhbXMuYXBwLCBwYXJhbXMubGluaywgcGFyYW1zLm9sZFNvdXJjZVBhdGhPckZpbGUgPz8gcGFyYW1zLm5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBpZiAoIXRhcmdldEZpbGUpIHtcbiAgICByZXR1cm4gcGFyYW1zLmxpbmsub3JpZ2luYWw7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua1BhcmFtcz4oe1xuICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICBsaW5rOiBwYXJhbXMubGluayxcbiAgICBsaW5rU3R5bGU6IHBhcmFtcy5saW5rU3R5bGUsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogdGFyZ2V0RmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlOiBwYXJhbXMub2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBwYXJhbXMuc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9KSk7XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGJhY2tsaW5rcyBmb3IgYSBmaWxlIG9yIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBlZGl0IHRoZSBiYWNrbGlua3MgZm9yLlxuICogQHBhcmFtIGxpbmtDb252ZXJ0ZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gcHJvY2Vzc09wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIGZvciByZXRyeWluZyB0aGUgb3BlcmF0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYWNrbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRCYWNrbGlua3MoXG4gIGFwcDogQXBwLFxuICBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLFxuICBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+LFxuICBwcm9jZXNzT3B0aW9uczogUHJvY2Vzc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKGFwcCwgcGF0aE9yRmlsZSwgcHJvY2Vzc09wdGlvbnMpO1xuICBmb3IgKGNvbnN0IGJhY2tsaW5rTm90ZVBhdGggb2YgYmFja2xpbmtzLmtleXMoKSkge1xuICAgIGNvbnN0IGN1cnJlbnRMaW5rcyA9IGVuc3VyZU5vbk51bGxhYmxlKGJhY2tsaW5rcy5nZXQoYmFja2xpbmtOb3RlUGF0aCkpO1xuICAgIGNvbnN0IGxpbmtKc29ucyA9IG5ldyBTZXQ8c3RyaW5nPihjdXJyZW50TGlua3MubWFwKChsaW5rKSA9PiBKU09OLnN0cmluZ2lmeShsaW5rKSkpO1xuICAgIGF3YWl0IGVkaXRMaW5rcyhhcHAsIGJhY2tsaW5rTm90ZVBhdGgsIChsaW5rKSA9PiB7XG4gICAgICBjb25zdCBsaW5rSnNvbiA9IEpTT04uc3RyaW5naWZ5KGxpbmspO1xuICAgICAgaWYgKCFsaW5rSnNvbnMuaGFzKGxpbmtKc29uKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaW5rQ29udmVydGVyKGxpbmspO1xuICAgIH0sIHByb2Nlc3NPcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gZWRpdCB0aGUgYmFja2xpbmtzIGZvci5cbiAqIEBwYXJhbSBsaW5rQ29udmVydGVyIC0gVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICogQHBhcmFtIHByb2Nlc3NPcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyBmb3IgcmV0cnlpbmcgdGhlIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYmFja2xpbmtzIGhhdmUgYmVlbiBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3MoXG4gIGFwcDogQXBwLFxuICBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLFxuICBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+LFxuICBwcm9jZXNzT3B0aW9uczogUHJvY2Vzc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFwcGx5RmlsZUNoYW5nZXMoYXBwLCBwYXRoT3JGaWxlLCBhc3luYyAoeyBhYm9ydFNpZ25hbCwgY29udGVudCB9KSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGNvbnN0IGZpbGUgPSBnZXRGaWxlKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgY29uc3QgY2FjaGVkQ29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xuICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgaWYgKGNvbnRlbnQgIT09IGNhY2hlZENvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBnZXRGaWxlQ2hhbmdlcyhjYWNoZSwgaXNDYW52YXNGaWxlKGFwcCwgcGF0aE9yRmlsZSksIGxpbmtDb252ZXJ0ZXIsIGFib3J0U2lnbmFsKTtcbiAgfSwgcHJvY2Vzc09wdGlvbnMpO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gY29udGVudCAtIFRoZSBjb250ZW50IHRvIGVkaXQgdGhlIGxpbmtzIGluLlxuICogQHBhcmFtIGxpbmtDb252ZXJ0ZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3NJbkNvbnRlbnQoXG4gIGFwcDogQXBwLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj4sXG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IGFwcGx5Q29udGVudENoYW5nZXMoYWJvcnRTaWduYWwsIGNvbnRlbnQsICcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBwYXJzZU1ldGFkYXRhKGFwcCwgY29udGVudCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBjaGFuZ2VzID0gYXdhaXQgZ2V0RmlsZUNoYW5nZXMoY2FjaGUsIGZhbHNlLCBsaW5rQ29udmVydGVyLCBhYm9ydFNpZ25hbCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfSk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgYXNzZXJ0Tm9uTnVsbGFibGUobmV3Q29udGVudCwgJ0ZhaWxlZCB0byB1cGRhdGUgbGlua3MgaW4gY29udGVudCcpO1xuXG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuXG4vKipcbiAqIEVuY29kZXMgYSBVUkwuXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBVUkwgdG8gZW5jb2RlLlxuICogQHJldHVybnMgVGhlIGVuY29kZWQgVVJMLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlcGxhY2VBbGwodXJsLCBTUEVDSUFMX0xJTktfU1lNQk9MU19SRUdFWFAsICh7IHN1YnN0cmluZzogc3BlY2lhbExpbmtTeW1ib2wgfSkgPT4gZW5jb2RlVVJJQ29tcG9uZW50KHNwZWNpYWxMaW5rU3ltYm9sKSk7XG59XG5cbi8qKlxuICogRXNjYXBlcyB0aGUgYWxpYXMgb2YgYSBtYXJrZG93biBsaW5rLlxuICpcbiAqIEBwYXJhbSBhbGlhcyAtIEFuIGFsaWFzIG9mIGEgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIEFuIGVzY2FwZWQgYWxpYXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBlc2NhcGVBbGlhcygnKiphbGlhcyoqJykgLy8gJ1xcXFwqXFxcXCphbGlhc1xcXFwqXFxcXConXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUFsaWFzKGFsaWFzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZUFsbChhbGlhcywgU1BFQ0lBTF9NQVJLRE9XTl9MSU5LX1NZTUJPTFNfUkVHRVgsICdcXFxcJCYnKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBsaW5rLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gbGluayAtIFRoZSByZWZlcmVuY2UgY2FjaGUgZm9yIHRoZSBsaW5rLlxuICogQHBhcmFtIHNvdXJjZVBhdGhPckZpbGUgLSBUaGUgc291cmNlIHBhdGggb3IgZmlsZS5cbiAqIEBwYXJhbSBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSAtIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogQHJldHVybnMgVGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBvciBgbnVsbGAgaWYgbm90IGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdExpbmtGaWxlKGFwcDogQXBwLCBsaW5rOiBSZWZlcmVuY2UsIHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlID0gZmFsc2UpOiBudWxsIHwgVEZpbGUge1xuICBjb25zdCB7IGxpbmtQYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcbiAgY29uc3Qgc291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBzb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3QgZmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGxpbmtQYXRoLCBzb3VyY2VQYXRoKTtcbiAgaWYgKGZpbGUpIHtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuXG4gIGlmICghc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChsaW5rUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICByZXR1cm4gZ2V0RmlsZShhcHAsIGxpbmtQYXRoLCB0cnVlKTtcbiAgfVxuXG4gIGNvbnN0IGZ1bGxMaW5rUGF0aCA9IGpvaW4oZGlybmFtZShzb3VyY2VQYXRoKSwgYC4vJHtsaW5rUGF0aH1gKTtcblxuICBpZiAoZnVsbExpbmtQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZ2V0RmlsZShhcHAsIGZ1bGxMaW5rUGF0aCwgdHJ1ZSk7XG59XG5cbi8qKlxuICogRml4ZXMgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIGluIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gY2FjaGUgLSBUaGUgbWV0YWRhdGEgY2FjaGUgdG8gZml4IHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyBpbi5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIHdlcmUgZml4ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3MoY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3NJbXBsKGNhY2hlLmZyb250bWF0dGVyLCAnJywgY2FjaGUpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG1hcmtkb3duIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBnZW5lcmF0aW5nIHRoZSBtYXJrZG93biBsaW5rLlxuICogQHJldHVybnMgVGhlIGdlbmVyYXRlZCBtYXJrZG93biBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93bkxpbmsocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgREVGQVVMVF9PUFRJT05TOiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPiA9IHtcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ6IHRydWVcbiAgfTtcblxuICBjb25zdCBjdXN0b21EZWZhdWx0T3B0aW9ucyA9IGdldEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdE9wdGlvbnNGbnMoYXBwKS5tYXAoKGRlZmF1bHRPcHRpb25zRm4pID0+IGRlZmF1bHRPcHRpb25zRm4oKSk7XG4gIHBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUywgLi4uY3VzdG9tRGVmYXVsdE9wdGlvbnMsIHBhcmFtcyk7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKGFwcCwgcGFyYW1zLnRhcmdldFBhdGhPckZpbGUsIHBhcmFtcy5pc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQpO1xuXG4gIHJldHVybiB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1bihhcHAsIFt0YXJnZXRGaWxlXSwgKCkgPT4gZ2VuZXJhdGVNYXJrZG93bkxpbmtJbXBsKHBhcmFtcykpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhdyBtYXJrZG93biBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZ2VuZXJhdGluZyBhIHJhdyBtYXJrZG93biBsaW5rLlxuICogQHJldHVybnMgQSByYXcgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHBhcmFtczogR2VuZXJhdGVSYXdNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBlbWJlZFByZWZpeCA9IHBhcmFtcy5pc0VtYmVkID8gJyEnIDogJyc7XG5cbiAgaWYgKHBhcmFtcy5pc1dpa2lsaW5rKSB7XG4gICAgY29uc3QgYWxpYXNQYXJ0ID0gcGFyYW1zLmFsaWFzID8gYHwke3BhcmFtcy5hbGlhc31gIDogJyc7XG4gICAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVtbJHtwYXJhbXMudXJsfSR7YWxpYXNQYXJ0fV1dYDtcbiAgfVxuXG4gIGNvbnN0IGFsaWFzID0gcGFyYW1zLmFsaWFzID8/ICcnO1xuICBjb25zdCBzaG91bGRFc2NhcGVBbGlhcyA9IHBhcmFtcy5zaG91bGRFc2NhcGVBbGlhcyA/PyBmYWxzZTtcbiAgY29uc3QgZXNjYXBlZEFsaWFzID0gc2hvdWxkRXNjYXBlQWxpYXMgPyBlc2NhcGVBbGlhcyhhbGlhcykgOiBhbGlhcztcblxuICBjb25zdCB1cmwgPSBwYXJhbXMuc2hvdWxkVXNlQW5nbGVCcmFja2V0c1xuICAgID8gYDwke3BhcmFtcy51cmx9PmBcbiAgICA6IGVuY29kZVVybChwYXJhbXMudXJsKTtcblxuICBjb25zdCB0aXRsZVBhcnQgPSBwYXJhbXMudGl0bGUgPyBgICR7SlNPTi5zdHJpbmdpZnkocGFyYW1zLnRpdGxlKX1gIDogJyc7XG5cbiAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVske2VzY2FwZWRBbGlhc31dKCR7dXJsfSR7dGl0bGVQYXJ0fSlgO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIGxpbmsgaW50byBpdHMgY29tcG9uZW50cy5cbiAqXG4gKiBAcGFyYW0gc3RyIC0gVGhlIGxpbmsgdG8gcGFyc2UuXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpbmsoc3RyOiBzdHJpbmcpOiBudWxsIHwgUGFyc2VMaW5rUmVzdWx0IHtcbiAgY29uc3QgbGlua3MgPSBwYXJzZUxpbmtzKHN0cik7XG4gIHJldHVybiBsaW5rc1swXT8ucmF3ID09PSBzdHIgPyBsaW5rc1swXSA6IG51bGw7XG59XG5cbi8qKlxuICogUGFyc2VzIGFsbCBsaW5rcyBpbiBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gc3RyIC0gVGhlIHN0cmluZyB0byBwYXJzZSB0aGUgbGlua3MgaW4uXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIGxpbmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaW5rcyhzdHI6IHN0cmluZyk6IFBhcnNlTGlua1Jlc3VsdFtdIHtcbiAgY29uc3QgZW1iZWRTeW1ib2xPZmZzZXRzID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgY29uc3QgRU1CRURfTElOS19QUkVGSVggPSAnIVsnO1xuICBjb25zdCBOT19FTUJFRF9MSU5LX1BSRUZJWCA9ICdAWyc7XG4gIGNvbnN0IERVTU1ZX0NIQVJBQ1RFUiA9ICdAJztcblxuICBjb25zdCBFTUJFRF9JTlNJREVfTElOS19SRUdfRVhQID0gL1xcWyg/PExpbmtBbGlhcz4hXFxbLio/XFxdXFwoLis/XFwpKVxcXVxcKCg/PExpbms+Lis/KVxcKS9nO1xuICBjb25zdCBub0luc2lkZUVtYmVkc0xpbmtzU3RyID0gcmVwbGFjZUFsbChzdHIsIEVNQkVEX0lOU0lERV9MSU5LX1JFR19FWFAsICh7IGNhcHR1cmVkR3JvdXBBcmdzOiBbbGlua0FsaWFzID0gJycsIGxpbmsgPSAnJ10gfSkgPT4ge1xuICAgIGNvbnN0IGR1bW15QWxpYXMgPSBEVU1NWV9DSEFSQUNURVIucmVwZWF0KGxpbmtBbGlhcy5sZW5ndGgpO1xuICAgIHJldHVybiBgWyR7ZHVtbXlBbGlhc31dKCR7bGlua30pYDtcbiAgfSk7XG5cbiAgY29uc3Qgbm9FbWJlZFN0ciA9IHJlcGxhY2VBbGwobm9JbnNpZGVFbWJlZHNMaW5rc1N0ciwgRU1CRURfTElOS19QUkVGSVgsIChhcmdzKSA9PiB7XG4gICAgZW1iZWRTeW1ib2xPZmZzZXRzLmFkZChhcmdzLm9mZnNldCk7XG4gICAgcmV0dXJuIE5PX0VNQkVEX0xJTktfUFJFRklYO1xuICB9KTtcblxuICBjb25zdCBwcm9jZXNzb3IgPSByZW1hcmsoKS51c2UocmVtYXJrUGFyc2UpLnVzZSh3aWtpTGlua1BsdWdpbiwgeyBhbGlhc0RpdmlkZXI6IFdJS0lMSU5LX0RJVklERVIgfSk7XG4gIGNvbnN0IHJvb3QgPSBwcm9jZXNzb3IucGFyc2Uobm9FbWJlZFN0cik7XG5cbiAgY29uc3QgbGlua3M6IFBhcnNlTGlua1Jlc3VsdFtdID0gW107XG4gIGNvbnN0IHRleHRMaW5rczogUGFyc2VMaW5rUmVzdWx0W10gPSBbXTtcblxuICB2aXNpdChyb290LCAobm9kZTogTm9kZSkgPT4ge1xuICAgIGxldCBsaW5rOiBQYXJzZUxpbmtSZXN1bHQ7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgICBsaW5rID0gcGFyc2VMaW5rTm9kZShub2RlIGFzIExpbmssIHN0cik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2lraUxpbmsnOlxuICAgICAgICBsaW5rID0gcGFyc2VXaWtpbGlua05vZGUobm9kZSBhcyBXaWtpTGlua05vZGUsIHN0cik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChlbWJlZFN5bWJvbE9mZnNldHMuaGFzKGxpbmsuc3RhcnRPZmZzZXQgLSAxKSkge1xuICAgICAgbGluay5pc0VtYmVkID0gdHJ1ZTtcbiAgICAgIGxpbmsuc3RhcnRPZmZzZXQtLTtcbiAgICAgIGxpbmsucmF3ID0gYCEke2xpbmsucmF3fWA7XG4gICAgfVxuICAgIGxpbmtzLnB1c2gobGluayk7XG4gIH0pO1xuXG4gIGxpbmtzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnRPZmZzZXQgLSBiLnN0YXJ0T2Zmc2V0KTtcblxuICBsZXQgdGV4dFN0YXJ0T2Zmc2V0ID0gMDtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcbiAgICBleHRyYWN0VGV4dExpbmtzKHN0ciwgdGV4dFN0YXJ0T2Zmc2V0LCBsaW5rLnN0YXJ0T2Zmc2V0IC0gMSwgdGV4dExpbmtzKTtcbiAgICB0ZXh0U3RhcnRPZmZzZXQgPSBsaW5rLmVuZE9mZnNldCArIDE7XG4gIH1cblxuICBleHRyYWN0VGV4dExpbmtzKHN0ciwgdGV4dFN0YXJ0T2Zmc2V0LCBzdHIubGVuZ3RoIC0gMSwgdGV4dExpbmtzKTtcblxuICBsaW5rcy5wdXNoKC4uLnRleHRMaW5rcyk7XG4gIGxpbmtzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnRPZmZzZXQgLSBiLnN0YXJ0T2Zmc2V0KTtcblxuICByZXR1cm4gbGlua3M7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGRlZmF1bHQgb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyBhIG1hcmtkb3duIGxpbmsuXG4gKlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gaW5zdGFuY2UuXG4gKiBAcGFyYW0gZm4gLSBUaGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBkZWZhdWx0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdE9wdGlvbnNGbihwbHVnaW46IFBsdWdpbiwgZm46ICgpID0+IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KTogdm9pZCB7XG4gIGNvbnN0IGdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdE9wdGlvbnNGbnMgPSBnZXRHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRPcHRpb25zRm5zKHBsdWdpbi5hcHApO1xuICBnZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRPcHRpb25zRm5zLnB1c2goZm4pO1xuICBwbHVnaW4ucmVnaXN0ZXIoKCkgPT4ge1xuICAgIGdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdE9wdGlvbnNGbnMucmVtb3ZlKGZuKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgYWxpYXMgb2YgYSBsaW5rIHNob3VsZCBiZSByZXNldC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGRldGVybWluaW5nIGlmIHRoZSBhbGlhcyBzaG91bGQgYmUgcmVzZXQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhbGlhcyBzaG91bGQgYmUgcmVzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRSZXNldEFsaWFzKHBhcmFtczogU2hvdWxkUmVzZXRBbGlhc1BhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGRpc3BsYXlUZXh0LFxuICAgIGlzV2lraWxpbmssXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGgsXG4gICAgdGFyZ2V0UGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBpZiAoaXNXaWtpbGluayA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWRpc3BsYXlUZXh0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZShhcHAsIHRhcmdldFBhdGhPckZpbGUsIHRydWUpO1xuICBjb25zdCBuZXdTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBvbGRTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFNvdXJjZVBhdGhPckZpbGUgPz8gbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG5ld1NvdXJjZUZvbGRlciA9IGRpcm5hbWUobmV3U291cmNlUGF0aCk7XG4gIGNvbnN0IG9sZFNvdXJjZUZvbGRlciA9IGRpcm5hbWUob2xkU291cmNlUGF0aCk7XG4gIGNvbnN0IGFsaWFzZXNUb1Jlc2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBwYXRoT3JGaWxlIG9mIFt0YXJnZXRGaWxlLnBhdGgsIG9sZFRhcmdldFBhdGhdKSB7XG4gICAgaWYgKCFwYXRoT3JGaWxlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChwYXRoKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQoYmFzZW5hbWUocGF0aCkpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChyZWxhdGl2ZShuZXdTb3VyY2VGb2xkZXIsIHBhdGgpKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocmVsYXRpdmUob2xkU291cmNlRm9sZGVyLCBwYXRoKSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHNvdXJjZVBhdGggb2YgW29sZFNvdXJjZVBhdGgsIG5ld1NvdXJjZVBhdGhdKSB7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVUb0xpbmt0ZXh0KHRhcmdldEZpbGUsIHNvdXJjZVBhdGgsIGZhbHNlKSk7XG4gIH1cblxuICBjb25zdCBjbGVhbkRpc3BsYXlUZXh0ID0gcmVwbGFjZUFsbChub3JtYWxpemVQYXRoKGVuc3VyZU5vbk51bGxhYmxlKGRpc3BsYXlUZXh0LnNwbGl0KCcgPiAnKVswXSkpLCAvXlxcLlxcLy9nLCAnJykudG9Mb3dlckNhc2UoKTtcblxuICBmb3IgKGNvbnN0IGFsaWFzIG9mIGFsaWFzZXNUb1Jlc2V0KSB7XG4gICAgaWYgKGFsaWFzLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGRpcm5hbWUoYWxpYXMpO1xuICAgIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShhbGlhcywgZXh0bmFtZShhbGlhcykpO1xuICAgIGlmIChqb2luKGZvbGRlciwgYmFzZSkudG9Mb3dlckNhc2UoKSA9PT0gY2xlYW5EaXNwbGF5VGV4dCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gVGhlIGxpbmsgdG8gc3BsaXQuXG4gKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRTdWJwYXRoKGxpbms6IHN0cmluZyk6IFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlTGlua3RleHQobm9ybWFsaXplKGxpbmspKTtcbiAgcmV0dXJuIHtcbiAgICBsaW5rUGF0aDogcGFyc2VkLnBhdGgsXG4gICAgc3VicGF0aDogcGFyc2VkLnN1YnBhdGhcbiAgfTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayB1c2VzIGFuZ2xlIGJyYWNrZXRzLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbdGl0bGVdKDxsaW5rPilgLCBgIVt0aXRsZV0oPGxpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgdXNlcyBhbmdsZSBicmFja2V0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdEFuZ2xlQnJhY2tldHMobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8uaGFzQW5nbGVCcmFja2V0cyA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBpcyBhbiBlbWJlZCBsaW5rOlxuICogYCFbW2xpbmtdXWAsIGAhW3RpdGxlXShsaW5rKWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaXMgYW4gZW1iZWQgbGlua1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdEVtYmVkKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LmlzRW1iZWQgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaGFzIGEgbGVhZGluZyBkb3QsIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbLi9saW5rXV1gLCBgW3RpdGxlXSguL2xpbmspYCwgYFt0aXRsZV0oPC4vbGluaz4pYCxcbiAqIGAhW1suL2xpbmtdXWAsIGAhW3RpdGxlXSguL2xpbmspYCwgYCFbdGl0bGVdKDwuL2xpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaGFzIGEgbGVhZGluZyBkb3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RMZWFkaW5nRG90KGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LnVybC5zdGFydHNXaXRoKCcuLycpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGhhcyBhIGxlYWRpbmcgc2xhc2gsIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbL2xpbmtdXWAsIGBbdGl0bGVdKC9saW5rKWAsIGBbdGl0bGVdKDwvbGluaz4pYCxcbiAqIGAhW1svbGlua11dYCwgYCFbdGl0bGVdKC9saW5rKWAsIGAhW3RpdGxlXSg8L2xpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaGFzIGEgbGVhZGluZyBzbGFzaFxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdExlYWRpbmdTbGFzaChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py51cmwuc3RhcnRzV2l0aCgnLycpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGlzIGEgd2lraWxpbmssIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbbGlua11dYCwgYCFbW2xpbmtdXWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaXMgYSB3aWtpbGlua1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdFdpa2lsaW5rKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LmlzV2lraWxpbmsgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVW5lc2NhcGVzIHRoZSBhbGlhcyBvZiBhIG1hcmtkb3duIGxpbmsuXG4gKlxuICogQHBhcmFtIGVzY2FwZWRBbGlhcyAtIEFuIGVzY2FwZWQgYWxpYXMuXG4gKiBAcmV0dXJucyBBbiB1bmVzY2FwZWQgYWxpYXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiB1bmVzY2FwZUFsaWFzKCdcXFxcKlxcXFwqYWxpYXNcXFxcKlxcXFwqJykgLy8gJyoqYWxpYXMqKidcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5lc2NhcGVBbGlhcyhlc2NhcGVkQWxpYXM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiByZXBsYWNlQWxsKFxuICAgIGVzY2FwZWRBbGlhcyxcbiAgICAvKD88QmFja3NsYXNoZXM+XFxcXCspKD88U3BlY2lhbENoYXJhY3Rlcj5bIVwiIyQlJicoKSorLC0uLzo7PD0+P0BbXFxcXFxcXV5fYHt8fX5dKS9nLFxuICAgICh7IGNhcHR1cmVkR3JvdXBBcmdzOiBbYmFja3NsYXNoZXMgPSAnJywgc3BlY2lhbENoYXIgPSAnJ10gfSkgPT4ge1xuICAgICAgY29uc3QgRVNDQVBFRF9CQUNLU0xBU0hfTEVOR1RIID0gMjtcbiAgICAgIGNvbnN0IGJhY2tzbGFzaENvdW50ID0gYmFja3NsYXNoZXMubGVuZ3RoO1xuICAgICAgY29uc3Qga2VlcENvdW50ID0gTWF0aC5mbG9vcihiYWNrc2xhc2hDb3VudCAvIEVTQ0FQRURfQkFDS1NMQVNIX0xFTkdUSCk7XG4gICAgICByZXR1cm4gJ1xcXFwnLnJlcGVhdChrZWVwQ291bnQpICsgc3BlY2lhbENoYXI7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYSBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdXBkYXRpbmcgdGhlIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTGluayhwYXJhbXM6IFVwZGF0ZUxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmssXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgbmV3VGFyZ2V0UGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9ID0gcGFyYW1zO1xuICBpZiAoIW5ld1RhcmdldFBhdGhPckZpbGUpIHtcbiAgICByZXR1cm4gbGluay5vcmlnaW5hbDtcbiAgfVxuICBjb25zdCBuZXdUYXJnZXRGaWxlID0gZ2V0RmlsZShhcHAsIG5ld1RhcmdldFBhdGhPckZpbGUsIHRydWUpO1xuICBjb25zdCBvbGRTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFNvdXJjZVBhdGhPckZpbGUgPz8gbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG9sZFRhcmdldFBhdGggPSBnZXRQYXRoKGFwcCwgb2xkVGFyZ2V0UGF0aE9yRmlsZSA/PyBuZXdUYXJnZXRQYXRoT3JGaWxlKTtcbiAgY29uc3QgaXNXaWtpbGluayA9IHNob3VsZFVzZVdpa2lsaW5rU3R5bGUoYXBwLCBsaW5rLm9yaWdpbmFsLCBsaW5rU3R5bGUpO1xuXG4gIGNvbnN0IHsgc3VicGF0aCB9ID0gc3BsaXRTdWJwYXRoKGxpbmsubGluayk7XG4gIGxldCBzaG91bGRLZWVwQWxpYXMgPSAhc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcztcblxuICBpZiAoaXNDYW52YXNGaWxlKGFwcCwgbmV3U291cmNlUGF0aE9yRmlsZSkpIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQ2FudmFzIGZpbGUgbm9kZSByZWZlcmVuY2UgYnJhbmNoIGlzIGhhcmQgdG8gcmVwcm9kdWNlIGluIHVuaXQgdGVzdHMuICovXG4gICAgaWYgKGlzQ2FudmFzRmlsZU5vZGVSZWZlcmVuY2UobGluaykpIHtcbiAgICAgIHJldHVybiBuZXdUYXJnZXRGaWxlLnBhdGggKyBzdWJwYXRoO1xuICAgIH1cbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICB9XG5cbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmsub3JpZ2luYWwpO1xuICBsZXQgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoaXNXaWtpbGluayAmJiBwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzKSB7XG4gICAgYWxpYXMgPSBwYXJzZUxpbmtSZXN1bHQuYWxpYXM7XG4gICAgc2hvdWxkS2VlcEFsaWFzID0gdHJ1ZTtcbiAgfVxuXG4gIGFsaWFzID8/PSBzaG91bGRSZXNldEFsaWFzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTaG91bGRSZXNldEFsaWFzUGFyYW1zPih7XG4gICAgICBhcHAsXG4gICAgICBkaXNwbGF5VGV4dDogbGluay5kaXNwbGF5VGV4dCxcbiAgICAgIGlzV2lraWxpbmssXG4gICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFRhcmdldFBhdGgsXG4gICAgICB0YXJnZXRQYXRoT3JGaWxlOiBuZXdUYXJnZXRGaWxlXG4gICAgfSkpXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHBhcnNlTGlua1Jlc3VsdD8uYWxpYXM7XG5cbiAgaWYgKCFzaG91bGRLZWVwQWxpYXMpIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxpYXMgbWF0Y2hpbmcgYnJhbmNoZXMgYXJlIGhhcmQgdG8gcmVwcm9kdWNlIGluIHVuaXQgdGVzdHMuICovXG4gICAgaWYgKGFsaWFzID09PSBiYXNlbmFtZShvbGRUYXJnZXRQYXRoLCBleHRuYW1lKG9sZFRhcmdldFBhdGgpKSkge1xuICAgICAgYWxpYXMgPSBuZXdUYXJnZXRGaWxlLmJhc2VuYW1lO1xuICAgIH0gZWxzZSBpZiAoYWxpYXMgPT09IGJhc2VuYW1lKG9sZFRhcmdldFBhdGgpKSB7XG4gICAgICBhbGlhcyA9IG5ld1RhcmdldEZpbGUubmFtZTtcbiAgICB9XG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxuXG4gIGNvbnN0IG5ld0xpbmsgPSBnZW5lcmF0ZU1hcmtkb3duTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KHtcbiAgICBhbGlhcyxcbiAgICBhcHAsXG4gICAgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZDogb2xkU291cmNlUGF0aCA9PT0gb2xkVGFyZ2V0UGF0aCAmJiAhIXBhcnNlTGlua1Jlc3VsdD8uYWxpYXMsXG4gICAgbGlua1N0eWxlLFxuICAgIG9yaWdpbmFsTGluazogbGluay5vcmlnaW5hbCxcbiAgICBzb3VyY2VQYXRoT3JGaWxlOiBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHN1YnBhdGgsXG4gICAgdGFyZ2V0UGF0aE9yRmlsZTogbmV3VGFyZ2V0RmlsZVxuICB9KSk7XG4gIHJldHVybiBuZXdMaW5rO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGxpbmtzIGluIGEgY29udGVudCBzdHJpbmcgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZW50IHdpdGggdXBkYXRlZCBsaW5rcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUxpbmtzSW5Db250ZW50KHBhcmFtczogVXBkYXRlTGlua3NJbkNvbnRlbnRQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGNvbnRlbnQsXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gIH0gPSBwYXJhbXM7XG5cbiAgcmV0dXJuIGF3YWl0IGVkaXRMaW5rc0luQ29udGVudChhcHAsIGNvbnRlbnQsIChsaW5rKSA9PiB7XG4gICAgY29uc3QgaXNFbWJlZExpbmsgPSB0ZXN0RW1iZWQobGluay5vcmlnaW5hbCk7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSB1bmRlZmluZWQgJiYgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IGlzRW1iZWRMaW5rKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBjb252ZXJ0TGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8Q29udmVydExpbmtQYXJhbXM+KHtcbiAgICAgIGFwcCxcbiAgICAgIGxpbmssXG4gICAgICBsaW5rU3R5bGUsXG4gICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGxpbmtzIGluIGEgZmlsZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbGlua3MgYXJlIHVwZGF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVMaW5rc0luRmlsZShwYXJhbXM6IFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gIH0gPSBwYXJhbXM7XG5cbiAgaWYgKGlzQ2FudmFzRmlsZShhcHAsIG5ld1NvdXJjZVBhdGhPckZpbGUpICYmICFhcHAuaW50ZXJuYWxQbHVnaW5zLmdldEVuYWJsZWRQbHVnaW5CeUlkKEludGVybmFsUGx1Z2luTmFtZS5DYW52YXMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgZWRpdExpbmtzKGFwcCwgbmV3U291cmNlUGF0aE9yRmlsZSwgKGxpbmspID0+IHtcbiAgICBjb25zdCBpc0VtYmVkTGluayA9IHRlc3RFbWJlZChsaW5rLm9yaWdpbmFsKTtcbiAgICBpZiAoc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IHVuZGVmaW5lZCAmJiBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gaXNFbWJlZExpbmspIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnZlcnRMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxDb252ZXJ0TGlua1BhcmFtcz4oe1xuICAgICAgYXBwLFxuICAgICAgbGluayxcbiAgICAgIGxpbmtTdHlsZSxcbiAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICAgIH0pKTtcbiAgfSwgcGFyYW1zKTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlVXJsU2FmZWx5KHVybDogc3RyaW5nLCBpc0V4dGVybmFsOiBib29sZWFuLCBoYXNBbmdsZUJyYWNrZXRzOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGlzRXh0ZXJuYWwgfHwgaGFzQW5nbGVCcmFja2V0cykge1xuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodXJsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZGVjb2RlIFVSTCAke3VybH1gLCBlcnJvcik7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0QWxpYXMoc3RyOiBzdHJpbmcsIGFsaWFzU3RhcnRPZmZzZXQ6IG51bWJlciwgYWxpYXNFbmRPZmZzZXQ6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBhbGlhc1N0YXJ0T2Zmc2V0IDwgYWxpYXNFbmRPZmZzZXRcbiAgICA/IHN0ci5zbGljZShhbGlhc1N0YXJ0T2Zmc2V0LCBhbGlhc0VuZE9mZnNldClcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFRleHRMaW5rcyhzdHI6IHN0cmluZywgc3RhcnRPZmZzZXQ6IG51bWJlciwgZW5kT2Zmc2V0OiBudW1iZXIsIHRleHRMaW5rczogUGFyc2VMaW5rUmVzdWx0W10pOiB2b2lkIHtcbiAgaWYgKHN0YXJ0T2Zmc2V0ID4gZW5kT2Zmc2V0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdGV4dFBhcnQgPSBzdHIuc2xpY2Uoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCArIDEpO1xuICByZXBsYWNlQWxsKHRleHRQYXJ0LCAvKD88VXJsPlxcUyspL2csICh7IGNhcHR1cmVkR3JvdXBBcmdzOiBbdXJsID0gJyddLCBvZmZzZXQgfSkgPT4ge1xuICAgIGlmICghaXNVcmwodXJsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRleHRMaW5rcy5wdXNoKHtcbiAgICAgIGVuY29kZWRVcmw6IGVuY29kZVVybCh1cmwpLFxuICAgICAgZW5kT2Zmc2V0OiBzdGFydE9mZnNldCArIG9mZnNldCArIHVybC5sZW5ndGgsXG4gICAgICBoYXNBbmdsZUJyYWNrZXRzOiBmYWxzZSxcbiAgICAgIGlzRW1iZWQ6IGZhbHNlLFxuICAgICAgaXNFeHRlcm5hbDogdHJ1ZSxcbiAgICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgICAgcmF3OiB1cmwsXG4gICAgICBzdGFydE9mZnNldDogc3RhcnRPZmZzZXQgKyBvZmZzZXQsXG4gICAgICB1cmxcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGwodmFsdWU6IHVua25vd24sIGtleTogc3RyaW5nLCBjYWNoZTogQ2FjaGVkTWV0YWRhdGEpOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsodmFsdWUpO1xuICAgIGlmICghcGFyc2VMaW5rUmVzdWx0IHx8IHBhcnNlTGlua1Jlc3VsdC5pc1dpa2lsaW5rIHx8IHBhcnNlTGlua1Jlc3VsdC5pc0V4dGVybmFsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY2FjaGUuZnJvbnRtYXR0ZXJMaW5rcyA/Pz0gW107XG4gICAgbGV0IGxpbmsgPSBjYWNoZS5mcm9udG1hdHRlckxpbmtzLmZpbmQoKGZyb250bWF0dGVyTGluaykgPT4gZnJvbnRtYXR0ZXJMaW5rLmtleSA9PT0ga2V5KTtcblxuICAgIGlmICghbGluaykge1xuICAgICAgbGluayA9IHtcbiAgICAgICAga2V5LFxuICAgICAgICBsaW5rOiAnJyxcbiAgICAgICAgb3JpZ2luYWw6ICcnXG4gICAgICB9O1xuICAgICAgY2FjaGUuZnJvbnRtYXR0ZXJMaW5rcy5wdXNoKGxpbmspO1xuICAgIH1cblxuICAgIGxpbmsubGluayA9IHBhcnNlTGlua1Jlc3VsdC51cmw7XG4gICAgbGluay5vcmlnaW5hbCA9IHZhbHVlO1xuICAgIGlmIChwYXJzZUxpbmtSZXN1bHQuYWxpYXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbGluay5kaXNwbGF5VGV4dCA9IHBhcnNlTGlua1Jlc3VsdC5hbGlhcztcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGhhc0Zyb250bWF0dGVyTGlua3MgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IFtjaGlsZEtleSwgY2hpbGRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUgYXMgR2VuZXJpY09iamVjdCkpIHtcbiAgICBjb25zdCBoYXNDaGlsZEZyb250bWF0dGVyTGlua3MgPSBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3NJbXBsKGNoaWxkVmFsdWUsIGtleSA/IGAke2tleX0uJHtjaGlsZEtleX1gIDogY2hpbGRLZXksIGNhY2hlKTtcbiAgICBoYXNGcm9udG1hdHRlckxpbmtzIHx8PSBoYXNDaGlsZEZyb250bWF0dGVyTGlua3M7XG4gIH1cblxuICByZXR1cm4gaGFzRnJvbnRtYXR0ZXJMaW5rcztcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVMaW5rVGV4dChhcHA6IEFwcCwgdGFyZ2V0RmlsZTogVEZpbGUsIHNvdXJjZVBhdGg6IHN0cmluZywgc3VicGF0aDogc3RyaW5nLCBjb25maWc6IExpbmtDb25maWcpOiBzdHJpbmcge1xuICBpZiAoc291cmNlUGF0aCA9PT0gJy8nKSB7XG4gICAgc291cmNlUGF0aCA9ICcnO1xuICB9XG5cbiAgbGV0IGxpbmtUZXh0OiBzdHJpbmc7XG5cbiAgaWYgKHRhcmdldEZpbGUucGF0aCA9PT0gc291cmNlUGF0aCAmJiBzdWJwYXRoICYmIGNvbmZpZy5pc1NpbmdsZVN1YnBhdGhBbGxvd2VkKSB7XG4gICAgbGlua1RleHQgPSAnJztcbiAgfSBlbHNlIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxsIGJyYW5jaGVzIGNvdmVyZWQgYnV0IHY4IHJlcG9ydHMgc3dpdGNoIGFzIHBhcnRpYWwuICovXG4gICAgc3dpdGNoIChjb25maWcubGlua1BhdGhTdHlsZSkge1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIGNhc2UgRmluYWxMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHQ6XG4gICAgICAgIGxpbmtUZXh0ID0gdGFyZ2V0RmlsZS5wYXRoO1xuICAgICAgICBpZiAoY29uZmlnLnNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHMgJiYgIWxpbmtUZXh0LnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgIGxpbmtUZXh0ID0gYC8ke2xpbmtUZXh0fWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZTpcbiAgICAgICAgbGlua1RleHQgPSByZWxhdGl2ZShkaXJuYW1lKHNvdXJjZVBhdGgpLCB0YXJnZXRGaWxlLnBhdGgpO1xuICAgICAgICBpZiAoY29uZmlnLnNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgICBsaW5rVGV4dCA9IGAuLyR7bGlua1RleHR9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZToge1xuICAgICAgICBjb25zdCBzaG9ydGVzdE5hbWUgPSBpc01hcmtkb3duRmlsZShhcHAsIHRhcmdldEZpbGUpID8gdGFyZ2V0RmlsZS5iYXNlbmFtZSA6IHRhcmdldEZpbGUubmFtZTtcbiAgICAgICAgY29uc3QgbWF0Y2hlZEZpbGVzID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0TGlua3BhdGhEZXN0KHNob3J0ZXN0TmFtZSwgc291cmNlUGF0aCk7XG4gICAgICAgIGxpbmtUZXh0ID0gbWF0Y2hlZEZpbGVzLmxlbmd0aCA9PT0gMSAmJiBtYXRjaGVkRmlsZXNbMF0gPT09IHRhcmdldEZpbGUgPyB0YXJnZXRGaWxlLm5hbWUgOiB0YXJnZXRGaWxlLnBhdGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsbCB2YWxpZCBGaW5hbExpbmtQYXRoU3R5bGUgdmFsdWVzIGFyZSBoYW5kbGVkIGFib3ZlLiAqL1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXNzZXJ0TmV2ZXIoY29uZmlnLmxpbmtQYXRoU3R5bGUpO1xuICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIH1cbiAgfVxuXG4gIGxpbmtUZXh0ID0gY29uZmlnLmlzV2lraWxpbmsgPyB0cmltRW5kKGxpbmtUZXh0LCBgLiR7TUFSS0RPV05fRklMRV9FWFRFTlNJT059YCkgOiBsaW5rVGV4dDtcbiAgbGlua1RleHQgKz0gc3VicGF0aDtcblxuICByZXR1cm4gbGlua1RleHQ7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25MaW5rSW1wbChwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoYXBwLCBwYXJhbXMudGFyZ2V0UGF0aE9yRmlsZSwgcGFyYW1zLmlzTm9uRXhpc3RpbmdGaWxlQWxsb3dlZCk7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgcGFyYW1zLnNvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBzdWJwYXRoID0gcGFyYW1zLnN1YnBhdGggPz8gJyc7XG5cbiAgY29uc3QgbGlua0NvbmZpZyA9IGdldExpbmtDb25maWcocGFyYW1zLCB0YXJnZXRGaWxlKTtcbiAgY29uc3QgbGlua1RleHQgPSBnZW5lcmF0ZUxpbmtUZXh0KGFwcCwgdGFyZ2V0RmlsZSwgc291cmNlUGF0aCwgc3VicGF0aCwgbGlua0NvbmZpZyk7XG5cbiAgcmV0dXJuIGxpbmtDb25maWcuaXNXaWtpbGlua1xuICAgID8gZ2VuZXJhdGVXaWtpTGluayhsaW5rVGV4dCwgcGFyYW1zLmFsaWFzLCBsaW5rQ29uZmlnLmlzRW1iZWQpXG4gICAgOiBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rKGxpbmtUZXh0LCB0YXJnZXRGaWxlLCBwYXJhbXMsIGxpbmtDb25maWcpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rKGxpbmtUZXh0OiBzdHJpbmcsIHRhcmdldEZpbGU6IFRGaWxlLCBwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zLCBjb25maWc6IExpbmtDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuXG4gIGxldCBhbGlhcyA9IHBhcmFtcy5hbGlhcyA/PyAnJztcbiAgbGV0IHNob3VsZEVzY2FwZUFsaWFzID0gcGFyYW1zLnNob3VsZEVzY2FwZUFsaWFzID8/IGZhbHNlO1xuICBpZiAoIWFsaWFzICYmIChpc01hcmtkb3duRmlsZShhcHAsIHRhcmdldEZpbGUpIHx8ICFwYXJhbXMuaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkKSkge1xuICAgIGFsaWFzID0gIXBhcmFtcy5zaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyB8fCBpc01hcmtkb3duRmlsZShhcHAsIHRhcmdldEZpbGUpXG4gICAgICA/IHRhcmdldEZpbGUuYmFzZW5hbWVcbiAgICAgIDogdGFyZ2V0RmlsZS5uYW1lO1xuICAgIHNob3VsZEVzY2FwZUFsaWFzID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayh7XG4gICAgYWxpYXMsXG4gICAgaXNFbWJlZDogY29uZmlnLmlzRW1iZWQsXG4gICAgaXNXaWtpbGluazogZmFsc2UsXG4gICAgc2hvdWxkRXNjYXBlQWxpYXMsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogY29uZmlnLnNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgdXJsOiBsaW5rVGV4dFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVXaWtpTGluayhsaW5rVGV4dDogc3RyaW5nLCBhbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkLCBpc0VtYmVkOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGFsaWFzPy50b0xvd2VyQ2FzZSgpID09PSBsaW5rVGV4dC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHtcbiAgICAgIGlzRW1iZWQsXG4gICAgICBpc1dpa2lsaW5rOiB0cnVlLFxuICAgICAgdXJsOiBhbGlhc1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHtcbiAgICBhbGlhcyxcbiAgICBpc0VtYmVkLFxuICAgIGlzV2lraWxpbms6IHRydWUsXG4gICAgdXJsOiBsaW5rVGV4dFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RmlsZUNoYW5nZXMoXG4gIGNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwsXG4gIGlzQ2FudmFzRmlsZUNhY2hlOiBib29sZWFuLFxuICBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlLCBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj4sXG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWxcbik6IFByb21pc2U8RmlsZUNoYW5nZVtdPiB7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGNoYW5nZXM6IEZpbGVDaGFuZ2VbXSA9IFtdO1xuXG4gIGNvbnN0IHRhYmxlUG9zaXRpb25zOiBUYWJsZVBvc2l0aW9uW10gPSAoY2FjaGUuc2VjdGlvbnMgPz8gW10pLmZpbHRlcigoc2VjdGlvbikgPT4gc2VjdGlvbi50eXBlID09PSAndGFibGUnKS5tYXAoKHNlY3Rpb24pID0+ICh7XG4gICAgZW5kOiBzZWN0aW9uLnBvc2l0aW9uLmVuZC5vZmZzZXQsXG4gICAgc3RhcnQ6IHNlY3Rpb24ucG9zaXRpb24uc3RhcnQub2Zmc2V0XG4gIH0pKTtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2YgZ2V0QWxsTGlua3MoY2FjaGUpKSB7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgbGlua0NvbnZlcnRlcihsaW5rLCBhYm9ydFNpZ25hbCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBpZiAobmV3Q29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlQ2hhbmdlID0gcmVmZXJlbmNlVG9GaWxlQ2hhbmdlKGxpbmssIG5ld0NvbnRlbnQpO1xuXG4gICAgaWYgKGlzQ2FudmFzRmlsZUNhY2hlKSB7XG4gICAgICBpZiAoaXNDYW52YXNDaGFuZ2UoZmlsZUNoYW5nZSkpIHtcbiAgICAgICAgY2hhbmdlcy5wdXNoKGZpbGVDaGFuZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5zdXBwb3J0ZWQgZmlsZSBjaGFuZ2UnLCBmaWxlQ2hhbmdlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzaG91bGRFc2NhcGVXaWtpbGlua0RpdmlkZXIoZmlsZUNoYW5nZSwgdGFibGVQb3NpdGlvbnMpKSB7XG4gICAgICAgIGZpbGVDaGFuZ2UubmV3Q29udGVudCA9IGZpbGVDaGFuZ2UubmV3Q29udGVudC5yZXBsYWNlQWxsKFVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUCwgRVNDQVBFRF9XSUtJTElOS19ESVZJREVSKTtcbiAgICAgIH1cblxuICAgICAgY2hhbmdlcy5wdXNoKGZpbGVDaGFuZ2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hhbmdlcztcbn1cblxuZnVuY3Rpb24gZ2V0RmluYWxMaW5rUGF0aFN0eWxlKGFwcDogQXBwLCBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZSk6IEZpbmFsTGlua1BhdGhTdHlsZSB7XG4gIGNvbnN0IHJlc29sdmVkU3R5bGUgPSBsaW5rUGF0aFN0eWxlID8/IExpbmtQYXRoU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ7XG4gIHN3aXRjaCAocmVzb2x2ZWRTdHlsZSkge1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0OlxuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0O1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDpcbiAgICAgIHJldHVybiByZXNvbHZlRmluYWxMaW5rUGF0aFN0eWxlRnJvbU9ic2lkaWFuU2V0dGluZ3MoYXBwKTtcbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlO1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZTtcbiAgICBkZWZhdWx0OlxuICAgICAgYXNzZXJ0TmV2ZXIocmVzb2x2ZWRTdHlsZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0T3B0aW9uc0ZucyhhcHA6IEFwcCk6ICgoKSA9PiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPilbXSB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGU8KCgpID0+IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KVtdPihhcHAsICdnZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRPcHRpb25zRm5zJywgW10pLnZhbHVlO1xufVxuXG5mdW5jdGlvbiBnZXRMaW5rQ29uZmlnKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMsIHRhcmdldEZpbGU6IFRGaWxlKTogTGlua0NvbmZpZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIHJlcXVpcmVBcGlWZXJzaW9uIGZhbGxiYWNrIGlzIG9ubHkgcmVhY2hlZCBpbiBvbGRlciBPYnNpZGlhbiB2ZXJzaW9ucy4gKi9cbiAgICBpc0VtYmVkOiBwYXJhbXMuaXNFbWJlZCA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IHRlc3RFbWJlZChwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZClcbiAgICAgID8/ICghcmVxdWlyZUFwaVZlcnNpb24oJzEuMTAuMCcpICYmICFpc01hcmtkb3duRmlsZShhcHAsIHRhcmdldEZpbGUpKSxcbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ6IHBhcmFtcy5pc1NpbmdsZVN1YnBhdGhBbGxvd2VkID8/IHRydWUsXG4gICAgaXNXaWtpbGluazogc2hvdWxkVXNlV2lraWxpbmtTdHlsZShhcHAsIHBhcmFtcy5vcmlnaW5hbExpbmssIHBhcmFtcy5saW5rU3R5bGUpLFxuICAgIGxpbmtQYXRoU3R5bGU6IGdldEZpbmFsTGlua1BhdGhTdHlsZShhcHAsIHBhcmFtcy5saW5rUGF0aFN0eWxlKSxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBwYXJhbXMuc2hvdWxkVXNlQW5nbGVCcmFja2V0cyA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IHRlc3RBbmdsZUJyYWNrZXRzKHBhcmFtcy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZSxcbiAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoczogcGFyYW1zLnNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzXG4gICAgICA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IHRlc3RMZWFkaW5nRG90KHBhcmFtcy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZSxcbiAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzOiBwYXJhbXMuc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc1xuICAgICAgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyB0ZXN0TGVhZGluZ1NsYXNoKHBhcmFtcy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRSYXdMaW5rKG5vZGU6IE5vZGUsIHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcG9zID0gZW5zdXJlTm9uTnVsbGFibGUobm9kZS5wb3NpdGlvbik7XG4gIHJldHVybiBzdHIuc2xpY2UocG9zLnN0YXJ0Lm9mZnNldCwgcG9zLmVuZC5vZmZzZXQpO1xufVxuXG5mdW5jdGlvbiBoYXNBbmdsZUJyYWNrZXRzSW5MaW5rKHJhdzogc3RyaW5nLCByYXdVcmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBPUEVOX0FOR0xFX0JSQUNLRVQgPSAnPCc7XG4gIHJldHVybiByYXcuc3RhcnRzV2l0aChPUEVOX0FOR0xFX0JSQUNLRVQpIHx8IHJhd1VybC5zdGFydHNXaXRoKE9QRU5fQU5HTEVfQlJBQ0tFVCk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTGlua05vZGUobm9kZTogTGluaywgc3RyOiBzdHJpbmcpOiBQYXJzZUxpbmtSZXN1bHQge1xuICBjb25zdCBMSU5LX0FMSUFTX1NVRkZJWCA9ICddKCc7XG4gIGNvbnN0IExJTktfU1VGRklYID0gJyknO1xuICBjb25zdCByYXcgPSBnZXRSYXdMaW5rKG5vZGUsIHN0cik7XG4gIGNvbnN0IGFsaWFzTm9kZVN0YXJ0T2Zmc2V0ID0gbm9kZS5jaGlsZHJlblswXT8ucG9zaXRpb24/LnN0YXJ0Lm9mZnNldCA/PyAxO1xuICBjb25zdCBhbGlhc05vZGVFbmRPZmZzZXQgPSBub2RlLmNoaWxkcmVuLmF0KC0xKT8ucG9zaXRpb24/LmVuZC5vZmZzZXQgPz8gMTtcbiAgY29uc3QgcG9zaXRpb24gPSBlbnN1cmVOb25OdWxsYWJsZShub2RlLnBvc2l0aW9uKTtcbiAgY29uc3Qgbm9kZUVuZE9mZnNldCA9IGVuc3VyZU5vbk51bGxhYmxlKHBvc2l0aW9uLmVuZC5vZmZzZXQpO1xuICBjb25zdCBub2RlU3RhcnRPZmZzZXQgPSBlbnN1cmVOb25OdWxsYWJsZShwb3NpdGlvbi5zdGFydC5vZmZzZXQpO1xuICBjb25zdCByYXdVcmwgPSBzdHIuc2xpY2UoYWxpYXNOb2RlRW5kT2Zmc2V0ICsgTElOS19BTElBU19TVUZGSVgubGVuZ3RoLCBub2RlRW5kT2Zmc2V0IC0gTElOS19TVUZGSVgubGVuZ3RoKTtcbiAgY29uc3QgaGFzQW5nbGVCcmFja2V0cyA9IGhhc0FuZ2xlQnJhY2tldHNJbkxpbmsocmF3LCByYXdVcmwpO1xuICBjb25zdCBpc0V4dGVybmFsID0gaXNVcmwobm9kZS51cmwpO1xuICBjb25zdCB1cmwgPSBkZWNvZGVVcmxTYWZlbHkobm9kZS51cmwsIGlzRXh0ZXJuYWwsIGhhc0FuZ2xlQnJhY2tldHMpO1xuICBjb25zdCBhbGlhcyA9IGV4dHJhY3RBbGlhcyhzdHIsIGFsaWFzTm9kZVN0YXJ0T2Zmc2V0LCBhbGlhc05vZGVFbmRPZmZzZXQpO1xuICByZXR1cm4gbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBhcnNlTGlua1Jlc3VsdD4oe1xuICAgIGFsaWFzLFxuICAgIGVuY29kZWRVcmw6IGlzRXh0ZXJuYWwgPyBlbmNvZGVVcmwodXJsKSA6IHVuZGVmaW5lZCxcbiAgICBlbmRPZmZzZXQ6IG5vZGVFbmRPZmZzZXQsXG4gICAgaGFzQW5nbGVCcmFja2V0cyxcbiAgICBpc0VtYmVkOiBmYWxzZSxcbiAgICBpc0V4dGVybmFsLFxuICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgIHJhdyxcbiAgICBzdGFydE9mZnNldDogbm9kZVN0YXJ0T2Zmc2V0LFxuICAgIHRpdGxlOiBub2RlLnRpdGxlID8/IHVuZGVmaW5lZCxcbiAgICB1bmVzY2FwZWRBbGlhczogYWxpYXMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHVuZXNjYXBlQWxpYXMoYWxpYXMpLFxuICAgIHVybFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VXaWtpbGlua05vZGUobm9kZTogV2lraUxpbmtOb2RlLCBzdHI6IHN0cmluZyk6IFBhcnNlTGlua1Jlc3VsdCB7XG4gIGNvbnN0IHBvc2l0aW9uID0gZW5zdXJlTm9uTnVsbGFibGUobm9kZS5wb3NpdGlvbik7XG4gIHJldHVybiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGFyc2VMaW5rUmVzdWx0Pih7XG4gICAgYWxpYXM6IHN0ci5pbmNsdWRlcyhXSUtJTElOS19ESVZJREVSKSA/IG5vZGUuZGF0YS5hbGlhcyA6IHVuZGVmaW5lZCxcbiAgICBlbmRPZmZzZXQ6IGVuc3VyZU5vbk51bGxhYmxlKHBvc2l0aW9uLmVuZC5vZmZzZXQpLFxuICAgIGlzRW1iZWQ6IGZhbHNlLFxuICAgIGlzRXh0ZXJuYWw6IGZhbHNlLFxuICAgIGlzV2lraWxpbms6IHRydWUsXG4gICAgcmF3OiBnZXRSYXdMaW5rKG5vZGUsIHN0ciksXG4gICAgc3RhcnRPZmZzZXQ6IGVuc3VyZU5vbk51bGxhYmxlKHBvc2l0aW9uLnN0YXJ0Lm9mZnNldCksXG4gICAgdXJsOiBub2RlLnZhbHVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRmluYWxMaW5rUGF0aFN0eWxlRnJvbU9ic2lkaWFuU2V0dGluZ3MoYXBwOiBBcHApOiBGaW5hbExpbmtQYXRoU3R5bGUge1xuICBjb25zdCBuZXdMaW5rRm9ybWF0ID0gZ2V0TmV3TGlua0Zvcm1hdChhcHApO1xuICBzd2l0Y2ggKG5ld0xpbmtGb3JtYXQpIHtcbiAgICBjYXNlICdhYnNvbHV0ZSc6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHQ7XG4gICAgY2FzZSAncmVsYXRpdmUnOlxuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZTtcbiAgICBjYXNlICdzaG9ydGVzdCc6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZTtcbiAgICBkZWZhdWx0OlxuICAgICAgYXNzZXJ0TmV2ZXIobmV3TGlua0Zvcm1hdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkRXNjYXBlV2lraWxpbmtEaXZpZGVyKGZpbGVDaGFuZ2U6IEZpbGVDaGFuZ2UsIHRhYmxlUG9zaXRpb25zOiBUYWJsZVBvc2l0aW9uW10pOiBib29sZWFuIHtcbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIGdldEZpbGVDaGFuZ2VzIG9ubHkgY2FsbHMgdGhpcyBmb3Igbm9uLWNhbnZhcyBmaWxlcyB3aGljaCBhbHdheXMgaGF2ZSBjb250ZW50IGNoYW5nZXMuICovXG4gIGlmICghaXNDb250ZW50Q2hhbmdlKGZpbGVDaGFuZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG5cbiAgaWYgKCFVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAudGVzdChmaWxlQ2hhbmdlLm5ld0NvbnRlbnQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlUG9zaXRpb25zLnNvbWUoKHRhYmxlUG9zaXRpb24pID0+XG4gICAgdGFibGVQb3NpdGlvbi5zdGFydCA8PSBmaWxlQ2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQgJiYgZmlsZUNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uZW5kLm9mZnNldCA8PSB0YWJsZVBvc2l0aW9uLmVuZFxuICApO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VXaWtpbGlua1N0eWxlKGFwcDogQXBwLCBvcmlnaW5hbExpbms/OiBzdHJpbmcsIGxpbmtTdHlsZT86IExpbmtTdHlsZSk6IGJvb2xlYW4ge1xuICBjb25zdCByZXNvbHZlZFN0eWxlID0gbGlua1N0eWxlID8/IExpbmtTdHlsZS5QcmVzZXJ2ZUV4aXN0aW5nO1xuICBzd2l0Y2ggKHJlc29sdmVkU3R5bGUpIHtcbiAgICBjYXNlIExpbmtTdHlsZS5NYXJrZG93bjpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjYXNlIExpbmtTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDpcbiAgICAgIHJldHVybiBzaG91bGRVc2VXaWtpbGlua3MoYXBwKTtcbiAgICBjYXNlIExpbmtTdHlsZS5QcmVzZXJ2ZUV4aXN0aW5nOlxuICAgICAgcmV0dXJuIG9yaWdpbmFsTGluayA9PT0gdW5kZWZpbmVkID8gc2hvdWxkVXNlV2lraWxpbmtzKGFwcCkgOiB0ZXN0V2lraWxpbmsob3JpZ2luYWxMaW5rKTtcbiAgICBjYXNlIExpbmtTdHlsZS5XaWtpbGluazpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICBhc3NlcnROZXZlcihyZXNvbHZlZFN0eWxlKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUE0QixZQUF3QixnQkFBMEM7QUFFckcsTUFBSSxLQUFDLG9DQUFnQixVQUFVLEdBQUc7QUFDaEMsV0FBTztBQUFBLEVBQ1Q7QUFHQSxNQUFJLENBQUMsa0NBQWtDLEtBQUssV0FBVyxVQUFVLEdBQUc7QUFDbEUsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLGVBQWU7QUFBQSxJQUFLLENBQUMsa0JBQzFCLGNBQWMsU0FBUyxXQUFXLFVBQVUsU0FBUyxNQUFNLFVBQVUsV0FBVyxVQUFVLFNBQVMsSUFBSSxVQUFVLGNBQWM7QUFBQSxFQUNqSTtBQUNGO0FBRUEsU0FBUyx1QkFBdUIsS0FBVSxjQUF1QixXQUFnQztBQUMvRixRQUFNLGdCQUFnQixhQUFhO0FBQ25DLFVBQVEsZUFBZTtBQUFBLElBQ3JCLEtBQUs7QUFDSCxhQUFPO0FBQUEsSUFDVCxLQUFLO0FBQ0gsaUJBQU8sNkNBQW1CLEdBQUc7QUFBQSxJQUMvQixLQUFLO0FBQ0gsYUFBTyxpQkFBaUIsYUFBWSw2Q0FBbUIsR0FBRyxJQUFJLGFBQWEsWUFBWTtBQUFBLElBQ3pGLEtBQUs7QUFDSCxhQUFPO0FBQUEsSUFDVDtBQUNFLDBDQUFZLGFBQWE7QUFBQSxFQUM3QjtBQUNGOyIsCiAgIm5hbWVzIjogWyJMaW5rUGF0aFN0eWxlIiwgIkxpbmtTdHlsZSIsICJyZW1hcmtQYXJzZSJdCn0K
897
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGhhbmRsaW5nIGFuZCB1cGRhdGluZyBsaW5rcyB3aXRoaW4gT2JzaWRpYW4gdmF1bHRzLiBJdCBpbmNsdWRlc1xuICogZnVuY3Rpb25zIHRvIHNwbGl0IHBhdGhzLCB1cGRhdGUgbGlua3MgaW4gZmlsZXMsIGFuZCBnZW5lcmF0ZSBtYXJrZG93biBsaW5rcyB3aXRoIHZhcmlvdXMgb3B0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExpbmsgfSBmcm9tICdtZGFzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFBsdWdpbixcbiAgUmVmZXJlbmNlLFxuICBURmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBOb2RlIH0gZnJvbSAndW5pc3QnO1xuXG5pbXBvcnQgeyBJbnRlcm5hbFBsdWdpbk5hbWUgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVQYXRoLFxuICBwYXJzZUxpbmt0ZXh0LFxuICByZXF1aXJlQXBpVmVyc2lvblxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyByZW1hcmsgfSBmcm9tICdyZW1hcmsnO1xuaW1wb3J0IHJlbWFya1BhcnNlIGZyb20gJ3JlbWFyay1wYXJzZSc7XG5pbXBvcnQgeyB3aWtpTGlua1BsdWdpbiB9IGZyb20gJ3JlbWFyay13aWtpLWxpbmsnO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tICd1bmlzdC11dGlsLXZpc2l0JztcblxuaW1wb3J0IHR5cGUgeyBHZW5lcmljT2JqZWN0IH0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXliZVJldHVybiB9IGZyb20gJy4uL3R5cGUudHMnO1xuaW1wb3J0IHR5cGUgeyBGaWxlQ2hhbmdlIH0gZnJvbSAnLi9maWxlLWNoYW5nZS50cyc7XG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgUHJvY2Vzc09wdGlvbnMgfSBmcm9tICcuL3ZhdWx0LnRzJztcblxuaW1wb3J0IHsgYWJvcnRTaWduYWxOZXZlciB9IGZyb20gJy4uL2Fib3J0LWNvbnRyb2xsZXIudHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZSxcbiAgcmVwbGFjZUFsbCxcbiAgdHJpbUVuZFxufSBmcm9tICcuLi9zdHJpbmcudHMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0TmV2ZXIsXG4gIGFzc2VydE5vbk51bGxhYmxlLFxuICBlbnN1cmVOb25OdWxsYWJsZVxufSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgeyBpc1VybCB9IGZyb20gJy4uL3VybC50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuL2FwcC50cyc7XG5pbXBvcnQge1xuICBhcHBseUNvbnRlbnRDaGFuZ2VzLFxuICBhcHBseUZpbGVDaGFuZ2VzLFxuICBpc0NhbnZhc0NoYW5nZSxcbiAgaXNDb250ZW50Q2hhbmdlXG59IGZyb20gJy4vZmlsZS1jaGFuZ2UudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0UGF0aCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc01hcmtkb3duRmlsZSxcbiAgTUFSS0RPV05fRklMRV9FWFRFTlNJT05cbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBnZXRBbGxMaW5rcyxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUsXG4gIGdldENhY2hlU2FmZSxcbiAgcGFyc2VNZXRhZGF0YSxcbiAgdGVtcFJlZ2lzdGVyRmlsZXNBbmRSdW5cbn0gZnJvbSAnLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQge1xuICBnZXROZXdMaW5rRm9ybWF0LFxuICBzaG91bGRVc2VXaWtpbGlua3Ncbn0gZnJvbSAnLi9vYnNpZGlhbi1zZXR0aW5ncy50cyc7XG5pbXBvcnQge1xuICBpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlLFxuICByZWZlcmVuY2VUb0ZpbGVDaGFuZ2Vcbn0gZnJvbSAnLi9yZWZlcmVuY2UudHMnO1xuXG5jb25zdCBFU0NBUEVEX1dJS0lMSU5LX0RJVklERVIgPSAnXFxcXHwnO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc3BlY2lhbCBsaW5rIHN5bWJvbHMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4IC0tIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgd3JpdHRlbiB0byBjYXB0dXJlIGNvbnRyb2wgY2hhcmFjdGVycy5cbmNvbnN0IFNQRUNJQUxfTElOS19TWU1CT0xTX1JFR0VYUCA9IC9bXFxcXFxceDAwXFx4MDhcXHgwQlxceDBDXFx4MEUtXFx4MUYgXS9nO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc3BlY2lhbCBtYXJrZG93biBsaW5rIHN5bWJvbHMuXG4gKi9cbmNvbnN0IFNQRUNJQUxfTUFSS0RPV05fTElOS19TWU1CT0xTX1JFR0VYID0gL1tcXFxcW1xcXTw+Xyp+PWAkXS9nO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgdW5lc2NhcGVkIHBpcGVzLlxuICovXG5jb25zdCBVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAgPSAvKD88IVxcXFwpXFx8L2c7XG5cbmNvbnN0IFdJS0lMSU5LX0RJVklERVIgPSAnfCc7XG5cbi8qKlxuICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICovXG5leHBvcnQgZW51bSBMaW5rUGF0aFN0eWxlIHtcbiAgLyoqXG4gICAqIFVzZSB0aGUgYWJzb2x1dGUgcGF0aCBpbiB0aGUgdmF1bHQuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW3BhdGgvZnJvbS90aGUvdmF1bHQvcm9vdC90YXJnZXRdXWBcbiAgICovXG4gIEFic29sdXRlUGF0aEluVmF1bHQgPSAnQWJzb2x1dGVQYXRoSW5WYXVsdCcsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZGVmYXVsdCBsaW5rIHBhdGggc3R5bGUgZGVmaW5lZCBpbiBPYnNpZGlhbiBzZXR0aW5ncy5cbiAgICovXG4gIE9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0ID0gJ09ic2lkaWFuU2V0dGluZ3NEZWZhdWx0JyxcblxuICAvKipcbiAgICogVXNlIHRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBzb3VyY2UuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbWy4uLy4uL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqL1xuICBSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZSA9ICdSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZScsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgc2hvcnRlc3QgcGF0aCB3aGVuIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1tzaG9ydGVzdC1wYXRoLXRvLXRhcmdldF1dYFxuICAgKi9cbiAgU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlID0gJ1Nob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSdcbn1cblxuLyoqXG4gKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICovXG5leHBvcnQgZW51bSBMaW5rU3R5bGUge1xuICAvKipcbiAgICogRm9yY2UgdGhlIGxpbmsgdG8gYmUgaW4gbWFya2Rvd24gZm9ybWF0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW2FsaWFzXShwYXRoL3RvL3RhcmdldC5tZClgXG4gICAqL1xuICBNYXJrZG93biA9ICdNYXJrZG93bicsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZGVmYXVsdCBsaW5rIHN0eWxlIGRlZmluZWQgaW4gT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBPYnNpZGlhblNldHRpbmdzRGVmYXVsdCA9ICdPYnNpZGlhblNldHRpbmdzRGVmYXVsdCcsXG5cbiAgLyoqXG4gICAqIFByZXNlcnZlIHRoZSBleGlzdGluZyBsaW5rIHN0eWxlLlxuICAgKi9cbiAgUHJlc2VydmVFeGlzdGluZyA9ICdQcmVzZXJ2ZUV4aXN0aW5nJyxcblxuICAvKipcbiAgICogRm9yY2UgdGhlIGxpbmsgdG8gYmUgaW4gd2lraWxpbmsgZm9ybWF0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1twYXRoL3RvL3RhcmdldF1dYFxuICAgKiBAZXhhbXBsZSBgW1twYXRoL3RvL3RhcmdldHxhbGlhc11dYFxuICAgKi9cbiAgV2lraWxpbmsgPSAnV2lraWxpbmsnXG59XG5cbmVudW0gRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgQWJzb2x1dGVQYXRoSW5WYXVsdCA9ICdBYnNvbHV0ZVBhdGhJblZhdWx0JyxcbiAgUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UgPSAnUmVsYXRpdmVQYXRoVG9UaGVOb3RlJyxcbiAgU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlID0gJ1Nob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSdcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgY29udmVydExpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnRMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdlbmVyYXRlTWFya2Rvd25MaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBmb3IgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW2FsaWFzfGxpbmtdXWBcbiAgICogQGV4YW1wbGUgYFthbGlhc10obGluay5tZClgXG4gICAqL1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgYmUgZW1iZWRkZWQuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZSBpbmZlcnJlZCBiYXNlZCBvbiB0aGUgZmlsZSB0eXBlLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW1t0YXJnZXRdXWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3RhcmdldF1dYC5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGFuIGVtcHR5IGFsaWFzIGZvciBlbWJlZHMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtdKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYCFbZm9vXShmb28ucG5nKWAuXG4gICAqL1xuICByZWFkb25seSBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IG5vbi1leGlzdGluZyBmaWxlcy4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYCBhbmQge0BsaW5rIHRhcmdldFBhdGhPckZpbGV9IGlzIGEgbm9uLWV4aXN0aW5nIGZpbGUsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhIHNpbmdsZSBzdWJwYXRoLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgdGFyZ2V0UGF0aE9yRmlsZX0gYW5kIHtAbGluayBzb3VyY2VQYXRoT3JGaWxlfSBhcmUgdGhlIHNhbWUgZmlsZS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1sjc3VicGF0aF1dYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbc291cmNlI3N1YnBhdGhdXWBcbiAgICovXG4gIHJlYWRvbmx5IGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZTtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQW4gb3JpZ2luYWwgbGluayB0ZXh0LlxuICAgKlxuICAgKiBJZiBwcm92aWRlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGluZmVyIHRoZSB2YWx1ZXMgb2ZcbiAgICpcbiAgICogLSB7QGxpbmsgaXNFbWJlZH1cbiAgICogLSB7QGxpbmsgbGlua1N0eWxlfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VBbmdsZUJyYWNrZXRzfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoc31cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc31cbiAgICpcbiAgICogVGhlc2UgaW5mZXJyZWQgdmFsdWVzIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBjb3JyZXNwb25kaW5nIHNldHRpbmdzIGlmIHNwZWNpZmllZC5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbmFsTGluaz86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBhdHRhY2htZW50IGV4dGVuc2lvbiBpbiB0aGUgZW1iZWQgYWxpYXMuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbZm9vLnBuZ10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2Zvb10oZm9vLnBuZylgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBkb3QuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9Tb3VyY2V9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy4vcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIHNsYXNoLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHR9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy9hYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1thYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHN1YnBhdGggb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIFNob3VsZCBiZSBlbXB0eSBvciBzdGFydCB3aXRoIGAjYC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRoLWVtcHR5LXN1YnBhdGhdXWBcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRoLXN1YnBhdGgjc3VicGF0aF1dYFxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtc3VicGF0aCNzdWJwYXRoI25lc3RlZC1zdWJwYXRoXV1gXG4gICAqL1xuICByZWFkb25seSBzdWJwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZVJhd01hcmtkb3duTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVSYXdNYXJrZG93bkxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWxpYXMgb2YgdGhlIGxpbmsuIERlZmF1bHRzIHRvIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGFuIGVtYmVkIGxpbmsuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICByZWFkb25seSBpc0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYSB3aWtpbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzV2lraWxpbms6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy4gQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc1dpa2lsaW5rfSBpcyBgZmFsc2VgLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVzZSBhbmdsZSBicmFja2V0cy4gQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc1dpa2lsaW5rfSBpcyBgZmFsc2VgLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgdGl0bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gVVJMIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSByZXN1bHQgb2YgcGFyc2luZyBhIGxpbmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VMaW5rUmVzdWx0IHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW1xcKmFsaWFzXFwqXShsaW5rLm1kKSAtPiBcXCphbGlhc1xcKlxuICAgKiBgYGBcbiAgICovXG4gIGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmNvZGVkIFVSTCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oPGxpbmsgd2l0aCBzcGFjZS5tZD4pIC0+IGxpbmslMjB3aXRoJTIwc3BhY2UubWRcbiAgICogYGBgXG4gICAqL1xuICBlbmNvZGVkVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBvcmlnaW5hbCB0ZXh0LlxuICAgKi9cbiAgZW5kT2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBoYXMgYW5nbGUgYnJhY2tldHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKDxsaW5rLm1kPikgLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGxpbmsubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgaGFzQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhbiBlbWJlZCBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogIVtbYWxpYXNdXSAtPiB0cnVlXG4gICAqIFtbYWxpYXNdXSAtPiBmYWxzZVxuICAgKiBgYGBcbiAgICovXG4gIGlzRW1iZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBleHRlcm5hbC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oaHR0cHM6Ly9leGFtcGxlLmNvbSkgLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGZpbGUubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgaXNFeHRlcm5hbDogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGEgd2lraWxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbW2FsaWFzXV0gLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGxpbmsubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgaXNXaWtpbGluazogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSByYXcgbGluayB0ZXh0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXShsaW5rLm1kKSAtPiBbYWxpYXNdKGxpbmsubWQpXG4gICAqIGBgYFxuICAgKi9cbiAgcmF3OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RhcnQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBvcmlnaW5hbCB0ZXh0LlxuICAgKi9cbiAgc3RhcnRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQSB0aXRsZSBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10obGluay5tZCBcInRpdGxlXCIpIC0+IHRpdGxlXG4gICAqIGBgYFxuICAgKi9cbiAgdGl0bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIHVuZXNjYXBlZCBhbGlhcyBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFtcXCphbGlhc1xcKl0obGluay5tZCkgLT4gKmFsaWFzKlxuICAgKiBgYGBcbiAgICovXG4gIHVuZXNjYXBlZEFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBVUkwgb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKGxpbmslMjB3aXRoJTIwc3BhY2UubWQpIC0+IGxpbmsgd2l0aCBzcGFjZS5tZFxuICAgKiBgYGBcbiAgICovXG4gIHVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBzaG91bGRSZXNldEFsaWFzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaG91bGRSZXNldEFsaWFzUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGRpc3BsYXkgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhIHdpa2lsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNXaWtpbGluaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgdGFyZ2V0IHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRUYXJnZXRQYXRoOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIC8qKlxuICAgKiBBIGxpbmsgcGF0aC5cbiAgICovXG4gIGxpbmtQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aC5cbiAgICovXG4gIHN1YnBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdXBkYXRlTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIG1hcmtkb3duIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3VGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRUYXJnZXRQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdXBkYXRlTGlua3NJbkZpbGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zIGV4dGVuZHMgUHJvY2Vzc09wdGlvbnMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgZmlsZSB0byB1cGRhdGUgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgb25seSBlbWJlZGRlZCBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIExpbmtDb25maWcge1xuICByZWFkb25seSBpc0VtYmVkOiBib29sZWFuO1xuICByZWFkb25seSBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBib29sZWFuO1xuICByZWFkb25seSBpc1dpa2lsaW5rOiBib29sZWFuO1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlOiBGaW5hbExpbmtQYXRoU3R5bGU7XG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzOiBib29sZWFuO1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVGFibGVQb3NpdGlvbiB7XG4gIGVuZDogbnVtYmVyO1xuICBzdGFydDogbnVtYmVyO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB1cGRhdGVMaW5rc0luQ29udGVudH0uXG4gKi9cbmludGVyZmFjZSBVcGRhdGVMaW5rc0luQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBjb250ZW50IHRvIHVwZGF0ZSB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgbmV3IHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBvbmx5IGVtYmVkZGVkIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFdpa2lMaW5rTm9kZSBleHRlbmRzIE5vZGUge1xuICBkYXRhOiBXaWtpTGlua05vZGVEYXRhO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgV2lraUxpbmtOb2RlRGF0YSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgYWxpYXM6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGxpbmsgdG8gYSBuZXcgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGNvbnZlcnRpbmcgdGhlIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0TGluayhwYXJhbXM6IENvbnZlcnRMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGV4dHJhY3RMaW5rRmlsZShwYXJhbXMuYXBwLCBwYXJhbXMubGluaywgcGFyYW1zLm9sZFNvdXJjZVBhdGhPckZpbGUgPz8gcGFyYW1zLm5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBpZiAoIXRhcmdldEZpbGUpIHtcbiAgICByZXR1cm4gcGFyYW1zLmxpbmsub3JpZ2luYWw7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua1BhcmFtcz4oe1xuICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICBsaW5rOiBwYXJhbXMubGluayxcbiAgICBsaW5rU3R5bGU6IHBhcmFtcy5saW5rU3R5bGUsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogdGFyZ2V0RmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlOiBwYXJhbXMub2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBwYXJhbXMuc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9KSk7XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGJhY2tsaW5rcyBmb3IgYSBmaWxlIG9yIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBlZGl0IHRoZSBiYWNrbGlua3MgZm9yLlxuICogQHBhcmFtIGxpbmtDb252ZXJ0ZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gcHJvY2Vzc09wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIGZvciByZXRyeWluZyB0aGUgb3BlcmF0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYWNrbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRCYWNrbGlua3MoXG4gIGFwcDogQXBwLFxuICBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLFxuICBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+LFxuICBwcm9jZXNzT3B0aW9uczogUHJvY2Vzc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKGFwcCwgcGF0aE9yRmlsZSwgcHJvY2Vzc09wdGlvbnMpO1xuICBmb3IgKGNvbnN0IGJhY2tsaW5rTm90ZVBhdGggb2YgYmFja2xpbmtzLmtleXMoKSkge1xuICAgIGNvbnN0IGN1cnJlbnRMaW5rcyA9IGVuc3VyZU5vbk51bGxhYmxlKGJhY2tsaW5rcy5nZXQoYmFja2xpbmtOb3RlUGF0aCkpO1xuICAgIGNvbnN0IGxpbmtKc29ucyA9IG5ldyBTZXQ8c3RyaW5nPihjdXJyZW50TGlua3MubWFwKChsaW5rKSA9PiBKU09OLnN0cmluZ2lmeShsaW5rKSkpO1xuICAgIGF3YWl0IGVkaXRMaW5rcyhhcHAsIGJhY2tsaW5rTm90ZVBhdGgsIChsaW5rKSA9PiB7XG4gICAgICBjb25zdCBsaW5rSnNvbiA9IEpTT04uc3RyaW5naWZ5KGxpbmspO1xuICAgICAgaWYgKCFsaW5rSnNvbnMuaGFzKGxpbmtKc29uKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaW5rQ29udmVydGVyKGxpbmspO1xuICAgIH0sIHByb2Nlc3NPcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gZWRpdCB0aGUgYmFja2xpbmtzIGZvci5cbiAqIEBwYXJhbSBsaW5rQ29udmVydGVyIC0gVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICogQHBhcmFtIHByb2Nlc3NPcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyBmb3IgcmV0cnlpbmcgdGhlIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYmFja2xpbmtzIGhhdmUgYmVlbiBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3MoXG4gIGFwcDogQXBwLFxuICBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLFxuICBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+LFxuICBwcm9jZXNzT3B0aW9uczogUHJvY2Vzc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFwcGx5RmlsZUNoYW5nZXMoYXBwLCBwYXRoT3JGaWxlLCBhc3luYyAoeyBhYm9ydFNpZ25hbCwgY29udGVudCB9KSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGNvbnN0IGZpbGUgPSBnZXRGaWxlKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgY29uc3QgY2FjaGVkQ29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xuICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgaWYgKGNvbnRlbnQgIT09IGNhY2hlZENvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBnZXRGaWxlQ2hhbmdlcyhjYWNoZSwgaXNDYW52YXNGaWxlKGFwcCwgcGF0aE9yRmlsZSksIGxpbmtDb252ZXJ0ZXIsIGFib3J0U2lnbmFsKTtcbiAgfSwgcHJvY2Vzc09wdGlvbnMpO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gY29udGVudCAtIFRoZSBjb250ZW50IHRvIGVkaXQgdGhlIGxpbmtzIGluLlxuICogQHBhcmFtIGxpbmtDb252ZXJ0ZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3NJbkNvbnRlbnQoXG4gIGFwcDogQXBwLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj4sXG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IGFwcGx5Q29udGVudENoYW5nZXMoYWJvcnRTaWduYWwsIGNvbnRlbnQsICcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBwYXJzZU1ldGFkYXRhKGFwcCwgY29udGVudCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBjaGFuZ2VzID0gYXdhaXQgZ2V0RmlsZUNoYW5nZXMoY2FjaGUsIGZhbHNlLCBsaW5rQ29udmVydGVyLCBhYm9ydFNpZ25hbCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfSk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgYXNzZXJ0Tm9uTnVsbGFibGUobmV3Q29udGVudCwgJ0ZhaWxlZCB0byB1cGRhdGUgbGlua3MgaW4gY29udGVudCcpO1xuXG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuXG4vKipcbiAqIEVuY29kZXMgYSBVUkwuXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBVUkwgdG8gZW5jb2RlLlxuICogQHJldHVybnMgVGhlIGVuY29kZWQgVVJMLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlcGxhY2VBbGwodXJsLCBTUEVDSUFMX0xJTktfU1lNQk9MU19SRUdFWFAsICh7IHN1YnN0cmluZzogc3BlY2lhbExpbmtTeW1ib2wgfSkgPT4gZW5jb2RlVVJJQ29tcG9uZW50KHNwZWNpYWxMaW5rU3ltYm9sKSk7XG59XG5cbi8qKlxuICogRXNjYXBlcyB0aGUgYWxpYXMgb2YgYSBtYXJrZG93biBsaW5rLlxuICpcbiAqIEBwYXJhbSBhbGlhcyAtIEFuIGFsaWFzIG9mIGEgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIEFuIGVzY2FwZWQgYWxpYXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBlc2NhcGVBbGlhcygnKiphbGlhcyoqJykgLy8gJ1xcXFwqXFxcXCphbGlhc1xcXFwqXFxcXConXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUFsaWFzKGFsaWFzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZUFsbChhbGlhcywgU1BFQ0lBTF9NQVJLRE9XTl9MSU5LX1NZTUJPTFNfUkVHRVgsICdcXFxcJCYnKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBsaW5rLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gbGluayAtIFRoZSByZWZlcmVuY2UgY2FjaGUgZm9yIHRoZSBsaW5rLlxuICogQHBhcmFtIHNvdXJjZVBhdGhPckZpbGUgLSBUaGUgc291cmNlIHBhdGggb3IgZmlsZS5cbiAqIEBwYXJhbSBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSAtIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogQHJldHVybnMgVGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBvciBgbnVsbGAgaWYgbm90IGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdExpbmtGaWxlKGFwcDogQXBwLCBsaW5rOiBSZWZlcmVuY2UsIHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlID0gZmFsc2UpOiBudWxsIHwgVEZpbGUge1xuICBjb25zdCB7IGxpbmtQYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcbiAgY29uc3Qgc291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBzb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3QgZmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGxpbmtQYXRoLCBzb3VyY2VQYXRoKTtcbiAgaWYgKGZpbGUpIHtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuXG4gIGlmICghc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChsaW5rUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICByZXR1cm4gZ2V0RmlsZShhcHAsIGxpbmtQYXRoLCB0cnVlKTtcbiAgfVxuXG4gIGNvbnN0IGZ1bGxMaW5rUGF0aCA9IGpvaW4oZGlybmFtZShzb3VyY2VQYXRoKSwgYC4vJHtsaW5rUGF0aH1gKTtcblxuICBpZiAoZnVsbExpbmtQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZ2V0RmlsZShhcHAsIGZ1bGxMaW5rUGF0aCwgdHJ1ZSk7XG59XG5cbi8qKlxuICogRml4ZXMgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIGluIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gY2FjaGUgLSBUaGUgbWV0YWRhdGEgY2FjaGUgdG8gZml4IHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyBpbi5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIHdlcmUgZml4ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3MoY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3NJbXBsKGNhY2hlLmZyb250bWF0dGVyLCAnJywgY2FjaGUpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG1hcmtkb3duIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBnZW5lcmF0aW5nIHRoZSBtYXJrZG93biBsaW5rLlxuICogQHJldHVybnMgVGhlIGdlbmVyYXRlZCBtYXJrZG93biBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93bkxpbmsocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgREVGQVVMVF9PUFRJT05TOiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPiA9IHtcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ6IHRydWVcbiAgfTtcblxuICBjb25zdCBjdXN0b21EZWZhdWx0T3B0aW9ucyA9IGdldEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdE9wdGlvbnNGbnMoYXBwKS5tYXAoKGRlZmF1bHRPcHRpb25zRm4pID0+IGRlZmF1bHRPcHRpb25zRm4oKSk7XG4gIHBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUywgLi4uY3VzdG9tRGVmYXVsdE9wdGlvbnMsIHBhcmFtcyk7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKGFwcCwgcGFyYW1zLnRhcmdldFBhdGhPckZpbGUsIHBhcmFtcy5pc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQpO1xuXG4gIHJldHVybiB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1bihhcHAsIFt0YXJnZXRGaWxlXSwgKCkgPT4gZ2VuZXJhdGVNYXJrZG93bkxpbmtJbXBsKHBhcmFtcykpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhdyBtYXJrZG93biBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZ2VuZXJhdGluZyBhIHJhdyBtYXJrZG93biBsaW5rLlxuICogQHJldHVybnMgQSByYXcgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHBhcmFtczogR2VuZXJhdGVSYXdNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBlbWJlZFByZWZpeCA9IHBhcmFtcy5pc0VtYmVkID8gJyEnIDogJyc7XG5cbiAgaWYgKHBhcmFtcy5pc1dpa2lsaW5rKSB7XG4gICAgY29uc3QgYWxpYXNQYXJ0ID0gcGFyYW1zLmFsaWFzID8gYHwke3BhcmFtcy5hbGlhc31gIDogJyc7XG4gICAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVtbJHtwYXJhbXMudXJsfSR7YWxpYXNQYXJ0fV1dYDtcbiAgfVxuXG4gIGNvbnN0IGFsaWFzID0gcGFyYW1zLmFsaWFzID8/ICcnO1xuICBjb25zdCBzaG91bGRFc2NhcGVBbGlhcyA9IHBhcmFtcy5zaG91bGRFc2NhcGVBbGlhcyA/PyBmYWxzZTtcbiAgY29uc3QgZXNjYXBlZEFsaWFzID0gc2hvdWxkRXNjYXBlQWxpYXMgPyBlc2NhcGVBbGlhcyhhbGlhcykgOiBhbGlhcztcblxuICBjb25zdCB1cmwgPSBwYXJhbXMuc2hvdWxkVXNlQW5nbGVCcmFja2V0c1xuICAgID8gYDwke3BhcmFtcy51cmx9PmBcbiAgICA6IGVuY29kZVVybChwYXJhbXMudXJsKTtcblxuICBjb25zdCB0aXRsZVBhcnQgPSBwYXJhbXMudGl0bGUgPyBgICR7SlNPTi5zdHJpbmdpZnkocGFyYW1zLnRpdGxlKX1gIDogJyc7XG5cbiAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVske2VzY2FwZWRBbGlhc31dKCR7dXJsfSR7dGl0bGVQYXJ0fSlgO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIGxpbmsgaW50byBpdHMgY29tcG9uZW50cy5cbiAqXG4gKiBAcGFyYW0gc3RyIC0gVGhlIGxpbmsgdG8gcGFyc2UuXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpbmsoc3RyOiBzdHJpbmcpOiBudWxsIHwgUGFyc2VMaW5rUmVzdWx0IHtcbiAgY29uc3QgbGlua3MgPSBwYXJzZUxpbmtzKHN0cik7XG4gIHJldHVybiBsaW5rc1swXT8ucmF3ID09PSBzdHIgPyBsaW5rc1swXSA6IG51bGw7XG59XG5cbi8qKlxuICogUGFyc2VzIGFsbCBsaW5rcyBpbiBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gc3RyIC0gVGhlIHN0cmluZyB0byBwYXJzZSB0aGUgbGlua3MgaW4uXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIGxpbmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaW5rcyhzdHI6IHN0cmluZyk6IFBhcnNlTGlua1Jlc3VsdFtdIHtcbiAgY29uc3QgZW1iZWRTeW1ib2xPZmZzZXRzID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgY29uc3QgRU1CRURfTElOS19QUkVGSVggPSAnIVsnO1xuICBjb25zdCBOT19FTUJFRF9MSU5LX1BSRUZJWCA9ICdAWyc7XG4gIGNvbnN0IERVTU1ZX0NIQVJBQ1RFUiA9ICdAJztcblxuICBjb25zdCBFTUJFRF9JTlNJREVfTElOS19SRUdfRVhQID0gL1xcWyg/PExpbmtBbGlhcz4hXFxbLio/XFxdXFwoLis/XFwpKVxcXVxcKCg/PExpbms+Lis/KVxcKS9nO1xuICBjb25zdCBub0luc2lkZUVtYmVkc0xpbmtzU3RyID0gcmVwbGFjZUFsbChzdHIsIEVNQkVEX0lOU0lERV9MSU5LX1JFR19FWFAsICh7IGNhcHR1cmVkR3JvdXBBcmdzOiBbbGlua0FsaWFzID0gJycsIGxpbmsgPSAnJ10gfSkgPT4ge1xuICAgIGNvbnN0IGR1bW15QWxpYXMgPSBEVU1NWV9DSEFSQUNURVIucmVwZWF0KGxpbmtBbGlhcy5sZW5ndGgpO1xuICAgIHJldHVybiBgWyR7ZHVtbXlBbGlhc31dKCR7bGlua30pYDtcbiAgfSk7XG5cbiAgY29uc3Qgbm9FbWJlZFN0ciA9IHJlcGxhY2VBbGwobm9JbnNpZGVFbWJlZHNMaW5rc1N0ciwgRU1CRURfTElOS19QUkVGSVgsIChhcmdzKSA9PiB7XG4gICAgZW1iZWRTeW1ib2xPZmZzZXRzLmFkZChhcmdzLm9mZnNldCk7XG4gICAgcmV0dXJuIE5PX0VNQkVEX0xJTktfUFJFRklYO1xuICB9KTtcblxuICBjb25zdCBwcm9jZXNzb3IgPSByZW1hcmsoKS51c2UocmVtYXJrUGFyc2UpLnVzZSh3aWtpTGlua1BsdWdpbiwgeyBhbGlhc0RpdmlkZXI6IFdJS0lMSU5LX0RJVklERVIgfSk7XG4gIGNvbnN0IHJvb3QgPSBwcm9jZXNzb3IucGFyc2Uobm9FbWJlZFN0cik7XG5cbiAgY29uc3QgbGlua3M6IFBhcnNlTGlua1Jlc3VsdFtdID0gW107XG4gIGNvbnN0IHRleHRMaW5rczogUGFyc2VMaW5rUmVzdWx0W10gPSBbXTtcblxuICB2aXNpdChyb290LCAobm9kZTogTm9kZSkgPT4ge1xuICAgIGxldCBsaW5rOiBQYXJzZUxpbmtSZXN1bHQ7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgICBsaW5rID0gcGFyc2VMaW5rTm9kZShub2RlIGFzIExpbmssIHN0cik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2lraUxpbmsnOlxuICAgICAgICBsaW5rID0gcGFyc2VXaWtpbGlua05vZGUobm9kZSBhcyBXaWtpTGlua05vZGUsIHN0cik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChlbWJlZFN5bWJvbE9mZnNldHMuaGFzKGxpbmsuc3RhcnRPZmZzZXQgLSAxKSkge1xuICAgICAgbGluay5pc0VtYmVkID0gdHJ1ZTtcbiAgICAgIGxpbmsuc3RhcnRPZmZzZXQtLTtcbiAgICAgIGxpbmsucmF3ID0gYCEke2xpbmsucmF3fWA7XG4gICAgfVxuICAgIGxpbmtzLnB1c2gobGluayk7XG4gIH0pO1xuXG4gIGxpbmtzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnRPZmZzZXQgLSBiLnN0YXJ0T2Zmc2V0KTtcblxuICBsZXQgdGV4dFN0YXJ0T2Zmc2V0ID0gMDtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcbiAgICBleHRyYWN0VGV4dExpbmtzKHN0ciwgdGV4dFN0YXJ0T2Zmc2V0LCBsaW5rLnN0YXJ0T2Zmc2V0IC0gMSwgdGV4dExpbmtzKTtcbiAgICB0ZXh0U3RhcnRPZmZzZXQgPSBsaW5rLmVuZE9mZnNldCArIDE7XG4gIH1cblxuICBleHRyYWN0VGV4dExpbmtzKHN0ciwgdGV4dFN0YXJ0T2Zmc2V0LCBzdHIubGVuZ3RoIC0gMSwgdGV4dExpbmtzKTtcblxuICBsaW5rcy5wdXNoKC4uLnRleHRMaW5rcyk7XG4gIGxpbmtzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnRPZmZzZXQgLSBiLnN0YXJ0T2Zmc2V0KTtcblxuICByZXR1cm4gbGlua3M7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGRlZmF1bHQgb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyBhIG1hcmtkb3duIGxpbmsuXG4gKlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gaW5zdGFuY2UuXG4gKiBAcGFyYW0gZm4gLSBUaGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBkZWZhdWx0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdE9wdGlvbnNGbihwbHVnaW46IFBsdWdpbiwgZm46ICgpID0+IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KTogdm9pZCB7XG4gIGNvbnN0IGdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdE9wdGlvbnNGbnMgPSBnZXRHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRPcHRpb25zRm5zKHBsdWdpbi5hcHApO1xuICBnZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRPcHRpb25zRm5zLnB1c2goZm4pO1xuICBwbHVnaW4ucmVnaXN0ZXIoKCkgPT4ge1xuICAgIGdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdE9wdGlvbnNGbnMucmVtb3ZlKGZuKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgYWxpYXMgb2YgYSBsaW5rIHNob3VsZCBiZSByZXNldC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGRldGVybWluaW5nIGlmIHRoZSBhbGlhcyBzaG91bGQgYmUgcmVzZXQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhbGlhcyBzaG91bGQgYmUgcmVzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRSZXNldEFsaWFzKHBhcmFtczogU2hvdWxkUmVzZXRBbGlhc1BhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGRpc3BsYXlUZXh0LFxuICAgIGlzV2lraWxpbmssXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGgsXG4gICAgdGFyZ2V0UGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBpZiAoaXNXaWtpbGluayA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWRpc3BsYXlUZXh0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZShhcHAsIHRhcmdldFBhdGhPckZpbGUsIHRydWUpO1xuICBjb25zdCBuZXdTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBvbGRTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFNvdXJjZVBhdGhPckZpbGUgPz8gbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG5ld1NvdXJjZUZvbGRlciA9IGRpcm5hbWUobmV3U291cmNlUGF0aCk7XG4gIGNvbnN0IG9sZFNvdXJjZUZvbGRlciA9IGRpcm5hbWUob2xkU291cmNlUGF0aCk7XG4gIGNvbnN0IGFsaWFzZXNUb1Jlc2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBwYXRoT3JGaWxlIG9mIFt0YXJnZXRGaWxlLnBhdGgsIG9sZFRhcmdldFBhdGhdKSB7XG4gICAgaWYgKCFwYXRoT3JGaWxlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChwYXRoKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQoYmFzZW5hbWUocGF0aCkpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChyZWxhdGl2ZShuZXdTb3VyY2VGb2xkZXIsIHBhdGgpKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocmVsYXRpdmUob2xkU291cmNlRm9sZGVyLCBwYXRoKSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHNvdXJjZVBhdGggb2YgW29sZFNvdXJjZVBhdGgsIG5ld1NvdXJjZVBhdGhdKSB7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVUb0xpbmt0ZXh0KHRhcmdldEZpbGUsIHNvdXJjZVBhdGgsIGZhbHNlKSk7XG4gIH1cblxuICBjb25zdCBjbGVhbkRpc3BsYXlUZXh0ID0gcmVwbGFjZUFsbChub3JtYWxpemVQYXRoKGVuc3VyZU5vbk51bGxhYmxlKGRpc3BsYXlUZXh0LnNwbGl0KCcgPiAnKVswXSkpLCAvXlxcLlxcLy9nLCAnJykudG9Mb3dlckNhc2UoKTtcblxuICBmb3IgKGNvbnN0IGFsaWFzIG9mIGFsaWFzZXNUb1Jlc2V0KSB7XG4gICAgaWYgKGFsaWFzLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGRpcm5hbWUoYWxpYXMpO1xuICAgIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShhbGlhcywgZXh0bmFtZShhbGlhcykpO1xuICAgIGlmIChqb2luKGZvbGRlciwgYmFzZSkudG9Mb3dlckNhc2UoKSA9PT0gY2xlYW5EaXNwbGF5VGV4dCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gVGhlIGxpbmsgdG8gc3BsaXQuXG4gKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRTdWJwYXRoKGxpbms6IHN0cmluZyk6IFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlTGlua3RleHQobm9ybWFsaXplKGxpbmspKTtcbiAgcmV0dXJuIHtcbiAgICBsaW5rUGF0aDogcGFyc2VkLnBhdGgsXG4gICAgc3VicGF0aDogcGFyc2VkLnN1YnBhdGhcbiAgfTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayB1c2VzIGFuZ2xlIGJyYWNrZXRzLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbdGl0bGVdKDxsaW5rPilgLCBgIVt0aXRsZV0oPGxpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgdXNlcyBhbmdsZSBicmFja2V0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdEFuZ2xlQnJhY2tldHMobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8uaGFzQW5nbGVCcmFja2V0cyA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBpcyBhbiBlbWJlZCBsaW5rOlxuICogYCFbW2xpbmtdXWAsIGAhW3RpdGxlXShsaW5rKWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaXMgYW4gZW1iZWQgbGlua1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdEVtYmVkKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LmlzRW1iZWQgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaGFzIGEgbGVhZGluZyBkb3QsIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbLi9saW5rXV1gLCBgW3RpdGxlXSguL2xpbmspYCwgYFt0aXRsZV0oPC4vbGluaz4pYCxcbiAqIGAhW1suL2xpbmtdXWAsIGAhW3RpdGxlXSguL2xpbmspYCwgYCFbdGl0bGVdKDwuL2xpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaGFzIGEgbGVhZGluZyBkb3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RMZWFkaW5nRG90KGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LnVybC5zdGFydHNXaXRoKCcuLycpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGhhcyBhIGxlYWRpbmcgc2xhc2gsIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbL2xpbmtdXWAsIGBbdGl0bGVdKC9saW5rKWAsIGBbdGl0bGVdKDwvbGluaz4pYCxcbiAqIGAhW1svbGlua11dYCwgYCFbdGl0bGVdKC9saW5rKWAsIGAhW3RpdGxlXSg8L2xpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaGFzIGEgbGVhZGluZyBzbGFzaFxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdExlYWRpbmdTbGFzaChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py51cmwuc3RhcnRzV2l0aCgnLycpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGlzIGEgd2lraWxpbmssIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbbGlua11dYCwgYCFbW2xpbmtdXWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaXMgYSB3aWtpbGlua1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdFdpa2lsaW5rKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LmlzV2lraWxpbmsgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVW5lc2NhcGVzIHRoZSBhbGlhcyBvZiBhIG1hcmtkb3duIGxpbmsuXG4gKlxuICogQHBhcmFtIGVzY2FwZWRBbGlhcyAtIEFuIGVzY2FwZWQgYWxpYXMuXG4gKiBAcmV0dXJucyBBbiB1bmVzY2FwZWQgYWxpYXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiB1bmVzY2FwZUFsaWFzKCdcXFxcKlxcXFwqYWxpYXNcXFxcKlxcXFwqJykgLy8gJyoqYWxpYXMqKidcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5lc2NhcGVBbGlhcyhlc2NhcGVkQWxpYXM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiByZXBsYWNlQWxsKFxuICAgIGVzY2FwZWRBbGlhcyxcbiAgICAvKD88QmFja3NsYXNoZXM+XFxcXCspKD88U3BlY2lhbENoYXJhY3Rlcj5bIVwiIyQlJicoKSorLC0uLzo7PD0+P0BbXFxcXFxcXV5fYHt8fX5dKS9nLFxuICAgICh7IGNhcHR1cmVkR3JvdXBBcmdzOiBbYmFja3NsYXNoZXMgPSAnJywgc3BlY2lhbENoYXIgPSAnJ10gfSkgPT4ge1xuICAgICAgY29uc3QgRVNDQVBFRF9CQUNLU0xBU0hfTEVOR1RIID0gMjtcbiAgICAgIGNvbnN0IGJhY2tzbGFzaENvdW50ID0gYmFja3NsYXNoZXMubGVuZ3RoO1xuICAgICAgY29uc3Qga2VlcENvdW50ID0gTWF0aC5mbG9vcihiYWNrc2xhc2hDb3VudCAvIEVTQ0FQRURfQkFDS1NMQVNIX0xFTkdUSCk7XG4gICAgICByZXR1cm4gJ1xcXFwnLnJlcGVhdChrZWVwQ291bnQpICsgc3BlY2lhbENoYXI7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYSBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdXBkYXRpbmcgdGhlIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTGluayhwYXJhbXM6IFVwZGF0ZUxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmssXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgbmV3VGFyZ2V0UGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9ID0gcGFyYW1zO1xuICBpZiAoIW5ld1RhcmdldFBhdGhPckZpbGUpIHtcbiAgICByZXR1cm4gbGluay5vcmlnaW5hbDtcbiAgfVxuICBjb25zdCBuZXdUYXJnZXRGaWxlID0gZ2V0RmlsZShhcHAsIG5ld1RhcmdldFBhdGhPckZpbGUsIHRydWUpO1xuICBjb25zdCBvbGRTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFNvdXJjZVBhdGhPckZpbGUgPz8gbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG9sZFRhcmdldFBhdGggPSBnZXRQYXRoKGFwcCwgb2xkVGFyZ2V0UGF0aE9yRmlsZSA/PyBuZXdUYXJnZXRQYXRoT3JGaWxlKTtcbiAgY29uc3QgaXNXaWtpbGluayA9IHNob3VsZFVzZVdpa2lsaW5rU3R5bGUoYXBwLCBsaW5rLm9yaWdpbmFsLCBsaW5rU3R5bGUpO1xuXG4gIGNvbnN0IHsgc3VicGF0aCB9ID0gc3BsaXRTdWJwYXRoKGxpbmsubGluayk7XG4gIGxldCBzaG91bGRLZWVwQWxpYXMgPSAhc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcztcblxuICBpZiAoaXNDYW52YXNGaWxlKGFwcCwgbmV3U291cmNlUGF0aE9yRmlsZSkpIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQ2FudmFzIGZpbGUgbm9kZSByZWZlcmVuY2UgYnJhbmNoIGlzIGhhcmQgdG8gcmVwcm9kdWNlIGluIHVuaXQgdGVzdHMuICovXG4gICAgaWYgKGlzQ2FudmFzRmlsZU5vZGVSZWZlcmVuY2UobGluaykpIHtcbiAgICAgIHJldHVybiBuZXdUYXJnZXRGaWxlLnBhdGggKyBzdWJwYXRoO1xuICAgIH1cbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICB9XG5cbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmsub3JpZ2luYWwpO1xuICBsZXQgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoaXNXaWtpbGluayAmJiBwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzKSB7XG4gICAgYWxpYXMgPSBwYXJzZUxpbmtSZXN1bHQuYWxpYXM7XG4gICAgc2hvdWxkS2VlcEFsaWFzID0gdHJ1ZTtcbiAgfVxuXG4gIGFsaWFzID8/PSBzaG91bGRSZXNldEFsaWFzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTaG91bGRSZXNldEFsaWFzUGFyYW1zPih7XG4gICAgICBhcHAsXG4gICAgICBkaXNwbGF5VGV4dDogbGluay5kaXNwbGF5VGV4dCxcbiAgICAgIGlzV2lraWxpbmssXG4gICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFRhcmdldFBhdGgsXG4gICAgICB0YXJnZXRQYXRoT3JGaWxlOiBuZXdUYXJnZXRGaWxlXG4gICAgfSkpXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHBhcnNlTGlua1Jlc3VsdD8uYWxpYXM7XG5cbiAgaWYgKCFzaG91bGRLZWVwQWxpYXMpIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxpYXMgbWF0Y2hpbmcgYnJhbmNoZXMgYXJlIGhhcmQgdG8gcmVwcm9kdWNlIGluIHVuaXQgdGVzdHMuICovXG4gICAgaWYgKGFsaWFzID09PSBiYXNlbmFtZShvbGRUYXJnZXRQYXRoLCBleHRuYW1lKG9sZFRhcmdldFBhdGgpKSkge1xuICAgICAgYWxpYXMgPSBuZXdUYXJnZXRGaWxlLmJhc2VuYW1lO1xuICAgIH0gZWxzZSBpZiAoYWxpYXMgPT09IGJhc2VuYW1lKG9sZFRhcmdldFBhdGgpKSB7XG4gICAgICBhbGlhcyA9IG5ld1RhcmdldEZpbGUubmFtZTtcbiAgICB9XG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxuXG4gIGNvbnN0IG5ld0xpbmsgPSBnZW5lcmF0ZU1hcmtkb3duTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KHtcbiAgICBhbGlhcyxcbiAgICBhcHAsXG4gICAgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZDogb2xkU291cmNlUGF0aCA9PT0gb2xkVGFyZ2V0UGF0aCAmJiAhIXBhcnNlTGlua1Jlc3VsdD8uYWxpYXMsXG4gICAgbGlua1N0eWxlLFxuICAgIG9yaWdpbmFsTGluazogbGluay5vcmlnaW5hbCxcbiAgICBzb3VyY2VQYXRoT3JGaWxlOiBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHN1YnBhdGgsXG4gICAgdGFyZ2V0UGF0aE9yRmlsZTogbmV3VGFyZ2V0RmlsZVxuICB9KSk7XG4gIHJldHVybiBuZXdMaW5rO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGxpbmtzIGluIGEgY29udGVudCBzdHJpbmcgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZW50IHdpdGggdXBkYXRlZCBsaW5rcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUxpbmtzSW5Db250ZW50KHBhcmFtczogVXBkYXRlTGlua3NJbkNvbnRlbnRQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGNvbnRlbnQsXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gIH0gPSBwYXJhbXM7XG5cbiAgcmV0dXJuIGF3YWl0IGVkaXRMaW5rc0luQ29udGVudChhcHAsIGNvbnRlbnQsIChsaW5rKSA9PiB7XG4gICAgY29uc3QgaXNFbWJlZExpbmsgPSB0ZXN0RW1iZWQobGluay5vcmlnaW5hbCk7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSB1bmRlZmluZWQgJiYgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IGlzRW1iZWRMaW5rKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBjb252ZXJ0TGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8Q29udmVydExpbmtQYXJhbXM+KHtcbiAgICAgIGFwcCxcbiAgICAgIGxpbmssXG4gICAgICBsaW5rU3R5bGUsXG4gICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGxpbmtzIGluIGEgZmlsZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbGlua3MgYXJlIHVwZGF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVMaW5rc0luRmlsZShwYXJhbXM6IFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gIH0gPSBwYXJhbXM7XG5cbiAgaWYgKGlzQ2FudmFzRmlsZShhcHAsIG5ld1NvdXJjZVBhdGhPckZpbGUpICYmICFhcHAuaW50ZXJuYWxQbHVnaW5zLmdldEVuYWJsZWRQbHVnaW5CeUlkKEludGVybmFsUGx1Z2luTmFtZS5DYW52YXMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgZWRpdExpbmtzKGFwcCwgbmV3U291cmNlUGF0aE9yRmlsZSwgKGxpbmspID0+IHtcbiAgICBjb25zdCBpc0VtYmVkTGluayA9IHRlc3RFbWJlZChsaW5rLm9yaWdpbmFsKTtcbiAgICBpZiAoc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IHVuZGVmaW5lZCAmJiBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gaXNFbWJlZExpbmspIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnZlcnRMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxDb252ZXJ0TGlua1BhcmFtcz4oe1xuICAgICAgYXBwLFxuICAgICAgbGluayxcbiAgICAgIGxpbmtTdHlsZSxcbiAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICAgIH0pKTtcbiAgfSwgcGFyYW1zKTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlVXJsU2FmZWx5KHVybDogc3RyaW5nLCBpc0V4dGVybmFsOiBib29sZWFuLCBoYXNBbmdsZUJyYWNrZXRzOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGlzRXh0ZXJuYWwgfHwgaGFzQW5nbGVCcmFja2V0cykge1xuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodXJsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZGVjb2RlIFVSTCAke3VybH1gLCBlcnJvcik7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0QWxpYXMoc3RyOiBzdHJpbmcsIGFsaWFzU3RhcnRPZmZzZXQ6IG51bWJlciwgYWxpYXNFbmRPZmZzZXQ6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBhbGlhc1N0YXJ0T2Zmc2V0IDwgYWxpYXNFbmRPZmZzZXRcbiAgICA/IHN0ci5zbGljZShhbGlhc1N0YXJ0T2Zmc2V0LCBhbGlhc0VuZE9mZnNldClcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFRleHRMaW5rcyhzdHI6IHN0cmluZywgc3RhcnRPZmZzZXQ6IG51bWJlciwgZW5kT2Zmc2V0OiBudW1iZXIsIHRleHRMaW5rczogUGFyc2VMaW5rUmVzdWx0W10pOiB2b2lkIHtcbiAgaWYgKHN0YXJ0T2Zmc2V0ID4gZW5kT2Zmc2V0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdGV4dFBhcnQgPSBzdHIuc2xpY2Uoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCArIDEpO1xuICByZXBsYWNlQWxsKHRleHRQYXJ0LCAvKD88VXJsPlxcUyspL2csICh7IGNhcHR1cmVkR3JvdXBBcmdzOiBbdXJsID0gJyddLCBvZmZzZXQgfSkgPT4ge1xuICAgIGlmICghaXNVcmwodXJsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRleHRMaW5rcy5wdXNoKHtcbiAgICAgIGVuY29kZWRVcmw6IGVuY29kZVVybCh1cmwpLFxuICAgICAgZW5kT2Zmc2V0OiBzdGFydE9mZnNldCArIG9mZnNldCArIHVybC5sZW5ndGgsXG4gICAgICBoYXNBbmdsZUJyYWNrZXRzOiBmYWxzZSxcbiAgICAgIGlzRW1iZWQ6IGZhbHNlLFxuICAgICAgaXNFeHRlcm5hbDogdHJ1ZSxcbiAgICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgICAgcmF3OiB1cmwsXG4gICAgICBzdGFydE9mZnNldDogc3RhcnRPZmZzZXQgKyBvZmZzZXQsXG4gICAgICB1cmxcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGwodmFsdWU6IHVua25vd24sIGtleTogc3RyaW5nLCBjYWNoZTogQ2FjaGVkTWV0YWRhdGEpOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsodmFsdWUpO1xuICAgIGlmICghcGFyc2VMaW5rUmVzdWx0IHx8IHBhcnNlTGlua1Jlc3VsdC5pc1dpa2lsaW5rIHx8IHBhcnNlTGlua1Jlc3VsdC5pc0V4dGVybmFsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY2FjaGUuZnJvbnRtYXR0ZXJMaW5rcyA/Pz0gW107XG4gICAgbGV0IGxpbmsgPSBjYWNoZS5mcm9udG1hdHRlckxpbmtzLmZpbmQoKGZyb250bWF0dGVyTGluaykgPT4gZnJvbnRtYXR0ZXJMaW5rLmtleSA9PT0ga2V5KTtcblxuICAgIGlmICghbGluaykge1xuICAgICAgbGluayA9IHtcbiAgICAgICAga2V5LFxuICAgICAgICBsaW5rOiAnJyxcbiAgICAgICAgb3JpZ2luYWw6ICcnXG4gICAgICB9O1xuICAgICAgY2FjaGUuZnJvbnRtYXR0ZXJMaW5rcy5wdXNoKGxpbmspO1xuICAgIH1cblxuICAgIGxpbmsubGluayA9IHBhcnNlTGlua1Jlc3VsdC51cmw7XG4gICAgbGluay5vcmlnaW5hbCA9IHZhbHVlO1xuICAgIGlmIChwYXJzZUxpbmtSZXN1bHQuYWxpYXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbGluay5kaXNwbGF5VGV4dCA9IHBhcnNlTGlua1Jlc3VsdC5hbGlhcztcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGhhc0Zyb250bWF0dGVyTGlua3MgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IFtjaGlsZEtleSwgY2hpbGRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUgYXMgR2VuZXJpY09iamVjdCkpIHtcbiAgICBjb25zdCBoYXNDaGlsZEZyb250bWF0dGVyTGlua3MgPSBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3NJbXBsKGNoaWxkVmFsdWUsIGtleSA/IGAke2tleX0uJHtjaGlsZEtleX1gIDogY2hpbGRLZXksIGNhY2hlKTtcbiAgICBoYXNGcm9udG1hdHRlckxpbmtzIHx8PSBoYXNDaGlsZEZyb250bWF0dGVyTGlua3M7XG4gIH1cblxuICByZXR1cm4gaGFzRnJvbnRtYXR0ZXJMaW5rcztcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVMaW5rVGV4dChhcHA6IEFwcCwgdGFyZ2V0RmlsZTogVEZpbGUsIHNvdXJjZVBhdGg6IHN0cmluZywgc3VicGF0aDogc3RyaW5nLCBjb25maWc6IExpbmtDb25maWcpOiBzdHJpbmcge1xuICBpZiAoc291cmNlUGF0aCA9PT0gJy8nKSB7XG4gICAgc291cmNlUGF0aCA9ICcnO1xuICB9XG5cbiAgbGV0IGxpbmtUZXh0OiBzdHJpbmc7XG5cbiAgaWYgKHRhcmdldEZpbGUucGF0aCA9PT0gc291cmNlUGF0aCAmJiBzdWJwYXRoICYmIGNvbmZpZy5pc1NpbmdsZVN1YnBhdGhBbGxvd2VkKSB7XG4gICAgbGlua1RleHQgPSAnJztcbiAgfSBlbHNlIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxsIGJyYW5jaGVzIGNvdmVyZWQgYnV0IHY4IHJlcG9ydHMgc3dpdGNoIGFzIHBhcnRpYWwuICovXG4gICAgc3dpdGNoIChjb25maWcubGlua1BhdGhTdHlsZSkge1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIGNhc2UgRmluYWxMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHQ6XG4gICAgICAgIGxpbmtUZXh0ID0gdGFyZ2V0RmlsZS5wYXRoO1xuICAgICAgICBpZiAoY29uZmlnLnNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHMgJiYgIWxpbmtUZXh0LnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgIGxpbmtUZXh0ID0gYC8ke2xpbmtUZXh0fWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZTpcbiAgICAgICAgbGlua1RleHQgPSByZWxhdGl2ZShkaXJuYW1lKHNvdXJjZVBhdGgpLCB0YXJnZXRGaWxlLnBhdGgpO1xuICAgICAgICBpZiAoY29uZmlnLnNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgICBsaW5rVGV4dCA9IGAuLyR7bGlua1RleHR9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZToge1xuICAgICAgICBjb25zdCBzaG9ydGVzdE5hbWUgPSBpc01hcmtkb3duRmlsZShhcHAsIHRhcmdldEZpbGUpID8gdGFyZ2V0RmlsZS5iYXNlbmFtZSA6IHRhcmdldEZpbGUubmFtZTtcbiAgICAgICAgY29uc3QgbWF0Y2hlZEZpbGVzID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0TGlua3BhdGhEZXN0KHNob3J0ZXN0TmFtZSwgc291cmNlUGF0aCk7XG4gICAgICAgIGxpbmtUZXh0ID0gbWF0Y2hlZEZpbGVzLmxlbmd0aCA9PT0gMSAmJiBtYXRjaGVkRmlsZXNbMF0gPT09IHRhcmdldEZpbGUgPyB0YXJnZXRGaWxlLm5hbWUgOiB0YXJnZXRGaWxlLnBhdGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsbCB2YWxpZCBGaW5hbExpbmtQYXRoU3R5bGUgdmFsdWVzIGFyZSBoYW5kbGVkIGFib3ZlLiAqL1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXNzZXJ0TmV2ZXIoY29uZmlnLmxpbmtQYXRoU3R5bGUpO1xuICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIH1cbiAgfVxuXG4gIGxpbmtUZXh0ID0gY29uZmlnLmlzV2lraWxpbmsgPyB0cmltRW5kKGxpbmtUZXh0LCBgLiR7TUFSS0RPV05fRklMRV9FWFRFTlNJT059YCkgOiBsaW5rVGV4dDtcbiAgbGlua1RleHQgKz0gc3VicGF0aDtcblxuICByZXR1cm4gbGlua1RleHQ7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25MaW5rSW1wbChwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoYXBwLCBwYXJhbXMudGFyZ2V0UGF0aE9yRmlsZSwgcGFyYW1zLmlzTm9uRXhpc3RpbmdGaWxlQWxsb3dlZCk7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgcGFyYW1zLnNvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBzdWJwYXRoID0gcGFyYW1zLnN1YnBhdGggPz8gJyc7XG5cbiAgY29uc3QgbGlua0NvbmZpZyA9IGdldExpbmtDb25maWcocGFyYW1zLCB0YXJnZXRGaWxlKTtcbiAgY29uc3QgbGlua1RleHQgPSBnZW5lcmF0ZUxpbmtUZXh0KGFwcCwgdGFyZ2V0RmlsZSwgc291cmNlUGF0aCwgc3VicGF0aCwgbGlua0NvbmZpZyk7XG5cbiAgcmV0dXJuIGxpbmtDb25maWcuaXNXaWtpbGlua1xuICAgID8gZ2VuZXJhdGVXaWtpTGluayhsaW5rVGV4dCwgcGFyYW1zLmFsaWFzLCBsaW5rQ29uZmlnLmlzRW1iZWQpXG4gICAgOiBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rKGxpbmtUZXh0LCB0YXJnZXRGaWxlLCBwYXJhbXMsIGxpbmtDb25maWcpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rKGxpbmtUZXh0OiBzdHJpbmcsIHRhcmdldEZpbGU6IFRGaWxlLCBwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zLCBjb25maWc6IExpbmtDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuXG4gIGxldCBhbGlhcyA9IHBhcmFtcy5hbGlhcyA/PyAnJztcbiAgbGV0IHNob3VsZEVzY2FwZUFsaWFzID0gcGFyYW1zLnNob3VsZEVzY2FwZUFsaWFzID8/IGZhbHNlO1xuICBpZiAoIWFsaWFzICYmIChpc01hcmtkb3duRmlsZShhcHAsIHRhcmdldEZpbGUpIHx8ICFwYXJhbXMuaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkKSkge1xuICAgIGFsaWFzID0gIXBhcmFtcy5zaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyB8fCBpc01hcmtkb3duRmlsZShhcHAsIHRhcmdldEZpbGUpXG4gICAgICA/IHRhcmdldEZpbGUuYmFzZW5hbWVcbiAgICAgIDogdGFyZ2V0RmlsZS5uYW1lO1xuICAgIHNob3VsZEVzY2FwZUFsaWFzID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayh7XG4gICAgYWxpYXMsXG4gICAgaXNFbWJlZDogY29uZmlnLmlzRW1iZWQsXG4gICAgaXNXaWtpbGluazogZmFsc2UsXG4gICAgc2hvdWxkRXNjYXBlQWxpYXMsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogY29uZmlnLnNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgdXJsOiBsaW5rVGV4dFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVXaWtpTGluayhsaW5rVGV4dDogc3RyaW5nLCBhbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkLCBpc0VtYmVkOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGFsaWFzPy50b0xvd2VyQ2FzZSgpID09PSBsaW5rVGV4dC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHtcbiAgICAgIGlzRW1iZWQsXG4gICAgICBpc1dpa2lsaW5rOiB0cnVlLFxuICAgICAgdXJsOiBhbGlhc1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHtcbiAgICBhbGlhcyxcbiAgICBpc0VtYmVkLFxuICAgIGlzV2lraWxpbms6IHRydWUsXG4gICAgdXJsOiBsaW5rVGV4dFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RmlsZUNoYW5nZXMoXG4gIGNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwsXG4gIGlzQ2FudmFzRmlsZUNhY2hlOiBib29sZWFuLFxuICBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlLCBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj4sXG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWxcbik6IFByb21pc2U8RmlsZUNoYW5nZVtdPiB7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGNoYW5nZXM6IEZpbGVDaGFuZ2VbXSA9IFtdO1xuXG4gIGNvbnN0IHRhYmxlUG9zaXRpb25zOiBUYWJsZVBvc2l0aW9uW10gPSAoY2FjaGUuc2VjdGlvbnMgPz8gW10pLmZpbHRlcigoc2VjdGlvbikgPT4gc2VjdGlvbi50eXBlID09PSAndGFibGUnKS5tYXAoKHNlY3Rpb24pID0+ICh7XG4gICAgZW5kOiBzZWN0aW9uLnBvc2l0aW9uLmVuZC5vZmZzZXQsXG4gICAgc3RhcnQ6IHNlY3Rpb24ucG9zaXRpb24uc3RhcnQub2Zmc2V0XG4gIH0pKTtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2YgZ2V0QWxsTGlua3MoY2FjaGUpKSB7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgbGlua0NvbnZlcnRlcihsaW5rLCBhYm9ydFNpZ25hbCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBpZiAobmV3Q29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlQ2hhbmdlID0gcmVmZXJlbmNlVG9GaWxlQ2hhbmdlKGxpbmssIG5ld0NvbnRlbnQpO1xuXG4gICAgaWYgKGlzQ2FudmFzRmlsZUNhY2hlKSB7XG4gICAgICBpZiAoaXNDYW52YXNDaGFuZ2UoZmlsZUNoYW5nZSkpIHtcbiAgICAgICAgY2hhbmdlcy5wdXNoKGZpbGVDaGFuZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5zdXBwb3J0ZWQgZmlsZSBjaGFuZ2UnLCBmaWxlQ2hhbmdlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzaG91bGRFc2NhcGVXaWtpbGlua0RpdmlkZXIoZmlsZUNoYW5nZSwgdGFibGVQb3NpdGlvbnMpKSB7XG4gICAgICAgIGZpbGVDaGFuZ2UubmV3Q29udGVudCA9IGZpbGVDaGFuZ2UubmV3Q29udGVudC5yZXBsYWNlQWxsKFVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUCwgRVNDQVBFRF9XSUtJTElOS19ESVZJREVSKTtcbiAgICAgIH1cblxuICAgICAgY2hhbmdlcy5wdXNoKGZpbGVDaGFuZ2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hhbmdlcztcbn1cblxuZnVuY3Rpb24gZ2V0RmluYWxMaW5rUGF0aFN0eWxlKGFwcDogQXBwLCBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZSk6IEZpbmFsTGlua1BhdGhTdHlsZSB7XG4gIGNvbnN0IHJlc29sdmVkU3R5bGUgPSBsaW5rUGF0aFN0eWxlID8/IExpbmtQYXRoU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ7XG4gIHN3aXRjaCAocmVzb2x2ZWRTdHlsZSkge1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0OlxuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0O1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDpcbiAgICAgIHJldHVybiByZXNvbHZlRmluYWxMaW5rUGF0aFN0eWxlRnJvbU9ic2lkaWFuU2V0dGluZ3MoYXBwKTtcbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlO1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZTtcbiAgICBkZWZhdWx0OlxuICAgICAgYXNzZXJ0TmV2ZXIocmVzb2x2ZWRTdHlsZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0T3B0aW9uc0ZucyhhcHA6IEFwcCk6ICgoKSA9PiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPilbXSB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGU8KCgpID0+IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KVtdPihhcHAsICdnZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRPcHRpb25zRm5zJywgW10pLnZhbHVlO1xufVxuXG5mdW5jdGlvbiBnZXRMaW5rQ29uZmlnKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMsIHRhcmdldEZpbGU6IFRGaWxlKTogTGlua0NvbmZpZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIHJlcXVpcmVBcGlWZXJzaW9uIGZhbGxiYWNrIGlzIG9ubHkgcmVhY2hlZCBpbiBvbGRlciBPYnNpZGlhbiB2ZXJzaW9ucy4gKi9cbiAgICBpc0VtYmVkOiBwYXJhbXMuaXNFbWJlZCA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IHRlc3RFbWJlZChwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZClcbiAgICAgID8/ICghcmVxdWlyZUFwaVZlcnNpb24oJzEuMTAuMCcpICYmICFpc01hcmtkb3duRmlsZShhcHAsIHRhcmdldEZpbGUpKSxcbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ6IHBhcmFtcy5pc1NpbmdsZVN1YnBhdGhBbGxvd2VkID8/IHRydWUsXG4gICAgaXNXaWtpbGluazogc2hvdWxkVXNlV2lraWxpbmtTdHlsZShhcHAsIHBhcmFtcy5vcmlnaW5hbExpbmssIHBhcmFtcy5saW5rU3R5bGUpLFxuICAgIGxpbmtQYXRoU3R5bGU6IGdldEZpbmFsTGlua1BhdGhTdHlsZShhcHAsIHBhcmFtcy5saW5rUGF0aFN0eWxlKSxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBwYXJhbXMuc2hvdWxkVXNlQW5nbGVCcmFja2V0cyA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IHRlc3RBbmdsZUJyYWNrZXRzKHBhcmFtcy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZSxcbiAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoczogcGFyYW1zLnNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzXG4gICAgICA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IHRlc3RMZWFkaW5nRG90KHBhcmFtcy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZSxcbiAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzOiBwYXJhbXMuc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc1xuICAgICAgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyB0ZXN0TGVhZGluZ1NsYXNoKHBhcmFtcy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRSYXdMaW5rKG5vZGU6IE5vZGUsIHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcG9zID0gZW5zdXJlTm9uTnVsbGFibGUobm9kZS5wb3NpdGlvbik7XG4gIHJldHVybiBzdHIuc2xpY2UocG9zLnN0YXJ0Lm9mZnNldCwgcG9zLmVuZC5vZmZzZXQpO1xufVxuXG5mdW5jdGlvbiBoYXNBbmdsZUJyYWNrZXRzSW5MaW5rKHJhdzogc3RyaW5nLCByYXdVcmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBPUEVOX0FOR0xFX0JSQUNLRVQgPSAnPCc7XG4gIHJldHVybiByYXcuc3RhcnRzV2l0aChPUEVOX0FOR0xFX0JSQUNLRVQpIHx8IHJhd1VybC5zdGFydHNXaXRoKE9QRU5fQU5HTEVfQlJBQ0tFVCk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTGlua05vZGUobm9kZTogTGluaywgc3RyOiBzdHJpbmcpOiBQYXJzZUxpbmtSZXN1bHQge1xuICBjb25zdCBMSU5LX0FMSUFTX1NVRkZJWCA9ICddKCc7XG4gIGNvbnN0IExJTktfU1VGRklYID0gJyknO1xuICBjb25zdCByYXcgPSBnZXRSYXdMaW5rKG5vZGUsIHN0cik7XG4gIGNvbnN0IGFsaWFzTm9kZVN0YXJ0T2Zmc2V0ID0gbm9kZS5jaGlsZHJlblswXT8ucG9zaXRpb24/LnN0YXJ0Lm9mZnNldCA/PyAxO1xuICBjb25zdCBhbGlhc05vZGVFbmRPZmZzZXQgPSBub2RlLmNoaWxkcmVuLmF0KC0xKT8ucG9zaXRpb24/LmVuZC5vZmZzZXQgPz8gMTtcbiAgY29uc3QgcG9zaXRpb24gPSBlbnN1cmVOb25OdWxsYWJsZShub2RlLnBvc2l0aW9uKTtcbiAgY29uc3Qgbm9kZUVuZE9mZnNldCA9IGVuc3VyZU5vbk51bGxhYmxlKHBvc2l0aW9uLmVuZC5vZmZzZXQpO1xuICBjb25zdCBub2RlU3RhcnRPZmZzZXQgPSBlbnN1cmVOb25OdWxsYWJsZShwb3NpdGlvbi5zdGFydC5vZmZzZXQpO1xuICBjb25zdCByYXdVcmwgPSBzdHIuc2xpY2UoYWxpYXNOb2RlRW5kT2Zmc2V0ICsgTElOS19BTElBU19TVUZGSVgubGVuZ3RoLCBub2RlRW5kT2Zmc2V0IC0gTElOS19TVUZGSVgubGVuZ3RoKTtcbiAgY29uc3QgaGFzQW5nbGVCcmFja2V0cyA9IGhhc0FuZ2xlQnJhY2tldHNJbkxpbmsocmF3LCByYXdVcmwpO1xuICBjb25zdCBpc0V4dGVybmFsID0gaXNVcmwobm9kZS51cmwpO1xuICBjb25zdCB1cmwgPSBkZWNvZGVVcmxTYWZlbHkobm9kZS51cmwsIGlzRXh0ZXJuYWwsIGhhc0FuZ2xlQnJhY2tldHMpO1xuICBjb25zdCBhbGlhcyA9IGV4dHJhY3RBbGlhcyhzdHIsIGFsaWFzTm9kZVN0YXJ0T2Zmc2V0LCBhbGlhc05vZGVFbmRPZmZzZXQpO1xuICByZXR1cm4gbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBhcnNlTGlua1Jlc3VsdD4oe1xuICAgIGFsaWFzLFxuICAgIGVuY29kZWRVcmw6IGlzRXh0ZXJuYWwgPyBlbmNvZGVVcmwodXJsKSA6IHVuZGVmaW5lZCxcbiAgICBlbmRPZmZzZXQ6IG5vZGVFbmRPZmZzZXQsXG4gICAgaGFzQW5nbGVCcmFja2V0cyxcbiAgICBpc0VtYmVkOiBmYWxzZSxcbiAgICBpc0V4dGVybmFsLFxuICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgIHJhdyxcbiAgICBzdGFydE9mZnNldDogbm9kZVN0YXJ0T2Zmc2V0LFxuICAgIHRpdGxlOiBub2RlLnRpdGxlID8/IHVuZGVmaW5lZCxcbiAgICB1bmVzY2FwZWRBbGlhczogYWxpYXMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHVuZXNjYXBlQWxpYXMoYWxpYXMpLFxuICAgIHVybFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VXaWtpbGlua05vZGUobm9kZTogV2lraUxpbmtOb2RlLCBzdHI6IHN0cmluZyk6IFBhcnNlTGlua1Jlc3VsdCB7XG4gIGNvbnN0IHBvc2l0aW9uID0gZW5zdXJlTm9uTnVsbGFibGUobm9kZS5wb3NpdGlvbik7XG4gIHJldHVybiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGFyc2VMaW5rUmVzdWx0Pih7XG4gICAgYWxpYXM6IHN0ci5pbmNsdWRlcyhXSUtJTElOS19ESVZJREVSKSA/IG5vZGUuZGF0YS5hbGlhcyA6IHVuZGVmaW5lZCxcbiAgICBlbmRPZmZzZXQ6IGVuc3VyZU5vbk51bGxhYmxlKHBvc2l0aW9uLmVuZC5vZmZzZXQpLFxuICAgIGlzRW1iZWQ6IGZhbHNlLFxuICAgIGlzRXh0ZXJuYWw6IGZhbHNlLFxuICAgIGlzV2lraWxpbms6IHRydWUsXG4gICAgcmF3OiBnZXRSYXdMaW5rKG5vZGUsIHN0ciksXG4gICAgc3RhcnRPZmZzZXQ6IGVuc3VyZU5vbk51bGxhYmxlKHBvc2l0aW9uLnN0YXJ0Lm9mZnNldCksXG4gICAgdXJsOiBub2RlLnZhbHVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRmluYWxMaW5rUGF0aFN0eWxlRnJvbU9ic2lkaWFuU2V0dGluZ3MoYXBwOiBBcHApOiBGaW5hbExpbmtQYXRoU3R5bGUge1xuICBjb25zdCBuZXdMaW5rRm9ybWF0ID0gZ2V0TmV3TGlua0Zvcm1hdChhcHApO1xuICBzd2l0Y2ggKG5ld0xpbmtGb3JtYXQpIHtcbiAgICBjYXNlICdhYnNvbHV0ZSc6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHQ7XG4gICAgY2FzZSAncmVsYXRpdmUnOlxuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZTtcbiAgICBjYXNlICdzaG9ydGVzdCc6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZTtcbiAgICBkZWZhdWx0OlxuICAgICAgYXNzZXJ0TmV2ZXIobmV3TGlua0Zvcm1hdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkRXNjYXBlV2lraWxpbmtEaXZpZGVyKGZpbGVDaGFuZ2U6IEZpbGVDaGFuZ2UsIHRhYmxlUG9zaXRpb25zOiBUYWJsZVBvc2l0aW9uW10pOiBib29sZWFuIHtcbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIGdldEZpbGVDaGFuZ2VzIG9ubHkgY2FsbHMgdGhpcyBmb3Igbm9uLWNhbnZhcyBmaWxlcyB3aGljaCBhbHdheXMgaGF2ZSBjb250ZW50IGNoYW5nZXMuICovXG4gIGlmICghaXNDb250ZW50Q2hhbmdlKGZpbGVDaGFuZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG5cbiAgaWYgKCFVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAudGVzdChmaWxlQ2hhbmdlLm5ld0NvbnRlbnQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlUG9zaXRpb25zLnNvbWUoKHRhYmxlUG9zaXRpb24pID0+IHRhYmxlUG9zaXRpb24uc3RhcnQgPD0gZmlsZUNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uc3RhcnQub2Zmc2V0ICYmIGZpbGVDaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLmVuZC5vZmZzZXQgPD0gdGFibGVQb3NpdGlvbi5lbmQpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VXaWtpbGlua1N0eWxlKGFwcDogQXBwLCBvcmlnaW5hbExpbms/OiBzdHJpbmcsIGxpbmtTdHlsZT86IExpbmtTdHlsZSk6IGJvb2xlYW4ge1xuICBjb25zdCByZXNvbHZlZFN0eWxlID0gbGlua1N0eWxlID8/IExpbmtTdHlsZS5QcmVzZXJ2ZUV4aXN0aW5nO1xuICBzd2l0Y2ggKHJlc29sdmVkU3R5bGUpIHtcbiAgICBjYXNlIExpbmtTdHlsZS5NYXJrZG93bjpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjYXNlIExpbmtTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDpcbiAgICAgIHJldHVybiBzaG91bGRVc2VXaWtpbGlua3MoYXBwKTtcbiAgICBjYXNlIExpbmtTdHlsZS5QcmVzZXJ2ZUV4aXN0aW5nOlxuICAgICAgcmV0dXJuIG9yaWdpbmFsTGluayA9PT0gdW5kZWZpbmVkID8gc2hvdWxkVXNlV2lraWxpbmtzKGFwcCkgOiB0ZXN0V2lraWxpbmsob3JpZ2luYWxMaW5rKTtcbiAgICBjYXNlIExpbmtTdHlsZS5XaWtpbGluazpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICBhc3NlcnROZXZlcihyZXNvbHZlZFN0eWxlKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBa0JBLDZCQUFtQztBQUNuQyxzQkFJTztBQUNQLG9CQUF1QjtBQUN2QiwwQkFBd0I7QUFDeEIsOEJBQStCO0FBQy9CLDhCQUFzQjtBQVF0Qiw4QkFBaUM7QUFDakMsMEJBQTRDO0FBQzVDLGtCQU1PO0FBQ1Asb0JBSU87QUFDUCx5QkFJTztBQUNQLGlCQUFzQjtBQUN0QixpQkFBeUM7QUFDekMseUJBS087QUFDUCx5QkFNTztBQUNQLDRCQU1PO0FBQ1AsK0JBR087QUFDUCx1QkFHTztBQUVQLE1BQU0sMkJBQTJCO0FBTWpDLE1BQU0sOEJBQThCO0FBS3BDLE1BQU0sc0NBQXNDO0FBSzVDLE1BQU0sb0NBQW9DO0FBRTFDLE1BQU0sbUJBQW1CO0FBS2xCLElBQUssZ0JBQUwsa0JBQUtBLG1CQUFMO0FBTUwsRUFBQUEsZUFBQSx5QkFBc0I7QUFLdEIsRUFBQUEsZUFBQSw2QkFBMEI7QUFPMUIsRUFBQUEsZUFBQSw2QkFBMEI7QUFPMUIsRUFBQUEsZUFBQSw4QkFBMkI7QUF6QmpCLFNBQUFBO0FBQUEsR0FBQTtBQStCTCxJQUFLLFlBQUwsa0JBQUtDLGVBQUw7QUFNTCxFQUFBQSxXQUFBLGNBQVc7QUFLWCxFQUFBQSxXQUFBLDZCQUEwQjtBQUsxQixFQUFBQSxXQUFBLHNCQUFtQjtBQVFuQixFQUFBQSxXQUFBLGNBQVc7QUF4QkQsU0FBQUE7QUFBQSxHQUFBO0FBNmtCTCxTQUFTLFlBQVksUUFBbUM7QUFDN0QsUUFBTSxhQUFhLGdCQUFnQixPQUFPLEtBQUssT0FBTyxNQUFNLE9BQU8sdUJBQXVCLE9BQU8sbUJBQW1CO0FBQ3BILE1BQUksQ0FBQyxZQUFZO0FBQ2YsV0FBTyxPQUFPLEtBQUs7QUFBQSxFQUNyQjtBQUVBLFNBQU8sZUFBVyxpREFBOEM7QUFBQSxJQUM5RCxLQUFLLE9BQU87QUFBQSxJQUNaLE1BQU0sT0FBTztBQUFBLElBQ2IsV0FBVyxPQUFPO0FBQUEsSUFDbEIscUJBQXFCLE9BQU87QUFBQSxJQUM1QixxQkFBcUI7QUFBQSxJQUNyQixxQkFBcUIsT0FBTztBQUFBLElBQzVCLDJCQUEyQixPQUFPO0FBQUEsRUFDcEMsQ0FBQyxDQUFDO0FBQ0o7QUFXQSxlQUFzQixjQUNwQixLQUNBLFlBQ0EsZUFDQSxpQkFBaUMsQ0FBQyxHQUNuQjtBQUNmLFFBQU0sWUFBWSxVQUFNLCtDQUF3QixLQUFLLFlBQVksY0FBYztBQUMvRSxhQUFXLG9CQUFvQixVQUFVLEtBQUssR0FBRztBQUMvQyxVQUFNLG1CQUFlLHNDQUFrQixVQUFVLElBQUksZ0JBQWdCLENBQUM7QUFDdEUsVUFBTSxZQUFZLElBQUksSUFBWSxhQUFhLElBQUksQ0FBQyxTQUFTLEtBQUssVUFBVSxJQUFJLENBQUMsQ0FBQztBQUNsRixVQUFNLFVBQVUsS0FBSyxrQkFBa0IsQ0FBQyxTQUFTO0FBQy9DLFlBQU0sV0FBVyxLQUFLLFVBQVUsSUFBSTtBQUNwQyxVQUFJLENBQUMsVUFBVSxJQUFJLFFBQVEsR0FBRztBQUM1QjtBQUFBLE1BQ0Y7QUFFQSxhQUFPLGNBQWMsSUFBSTtBQUFBLElBQzNCLEdBQUcsY0FBYztBQUFBLEVBQ25CO0FBQ0Y7QUFXQSxlQUFzQixVQUNwQixLQUNBLFlBQ0EsZUFDQSxpQkFBaUMsQ0FBQyxHQUNuQjtBQUNmLFlBQU0scUNBQWlCLEtBQUssWUFBWSxPQUFPLEVBQUUsYUFBYSxRQUFRLE1BQU07QUFDMUUsVUFBTSxRQUFRLFVBQU0sb0NBQWEsS0FBSyxVQUFVO0FBQ2hELGdCQUFZLGVBQWU7QUFDM0IsVUFBTSxXQUFPLDRCQUFRLEtBQUssVUFBVTtBQUNwQyxVQUFNLGdCQUFnQixNQUFNLElBQUksTUFBTSxXQUFXLElBQUk7QUFDckQsZ0JBQVksZUFBZTtBQUMzQixRQUFJLFlBQVksZUFBZTtBQUM3QixhQUFPO0FBQUEsSUFDVDtBQUVBLFdBQU8sTUFBTSxlQUFlLFdBQU8saUNBQWEsS0FBSyxVQUFVLEdBQUcsZUFBZSxXQUFXO0FBQUEsRUFDOUYsR0FBRyxjQUFjO0FBQ25CO0FBV0EsZUFBc0IsbUJBQ3BCLEtBQ0EsU0FDQSxlQUNBLGFBQ2lCO0FBQ2pCLHNCQUFnQiwwQ0FBaUI7QUFDakMsY0FBWSxlQUFlO0FBRTNCLFFBQU0sYUFBYSxVQUFNLHdDQUFvQixhQUFhLFNBQVMsSUFBSSxZQUFZO0FBQ2pGLFVBQU0sUUFBUSxVQUFNLHFDQUFjLEtBQUssT0FBTztBQUM5QyxnQkFBWSxlQUFlO0FBQzNCLFVBQU0sVUFBVSxNQUFNLGVBQWUsT0FBTyxPQUFPLGVBQWUsV0FBVztBQUM3RSxnQkFBWSxlQUFlO0FBQzNCLFdBQU87QUFBQSxFQUNULENBQUM7QUFDRCxjQUFZLGVBQWU7QUFFM0IsNENBQWtCLFlBQVksbUNBQW1DO0FBRWpFLFNBQU87QUFDVDtBQVFPLFNBQVMsVUFBVSxLQUFxQjtBQUM3QyxhQUFPLDBCQUFXLEtBQUssNkJBQTZCLENBQUMsRUFBRSxXQUFXLGtCQUFrQixNQUFNLG1CQUFtQixpQkFBaUIsQ0FBQztBQUNqSTtBQWFPLFNBQVMsWUFBWSxPQUF1QjtBQUNqRCxhQUFPLDBCQUFXLE9BQU8scUNBQXFDLE1BQU07QUFDdEU7QUFXTyxTQUFTLGdCQUFnQixLQUFVLE1BQWlCLGtCQUE4Qiw2QkFBNkIsT0FBcUI7QUFDekksUUFBTSxFQUFFLFNBQVMsSUFBSSxhQUFhLEtBQUssSUFBSTtBQUMzQyxRQUFNLGlCQUFhLDRCQUFRLEtBQUssZ0JBQWdCO0FBQ2hELFFBQU0sT0FBTyxJQUFJLGNBQWMscUJBQXFCLFVBQVUsVUFBVTtBQUN4RSxNQUFJLE1BQU07QUFDUixXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksQ0FBQyw0QkFBNEI7QUFDL0IsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLFNBQVMsV0FBVyxHQUFHLEdBQUc7QUFDNUIsZUFBTyw0QkFBUSxLQUFLLFVBQVUsSUFBSTtBQUFBLEVBQ3BDO0FBRUEsUUFBTSxtQkFBZSxzQkFBSyxxQkFBUSxVQUFVLEdBQUcsS0FBSyxRQUFRLEVBQUU7QUFFOUQsTUFBSSxhQUFhLFdBQVcsS0FBSyxHQUFHO0FBQ2xDLFdBQU87QUFBQSxFQUNUO0FBRUEsYUFBTyw0QkFBUSxLQUFLLGNBQWMsSUFBSTtBQUN4QztBQVFPLFNBQVMsNEJBQTRCLE9BQWdDO0FBQzFFLFNBQU8sZ0NBQWdDLE1BQU0sYUFBYSxJQUFJLEtBQUs7QUFDckU7QUFRTyxTQUFTLHFCQUFxQixRQUE0QztBQUMvRSxRQUFNLEVBQUUsSUFBSSxJQUFJO0FBRWhCLFFBQU0sa0JBQXVEO0FBQUEsSUFDM0QsMEJBQTBCO0FBQUEsRUFDNUI7QUFFQSxRQUFNLHVCQUF1Qix5Q0FBeUMsR0FBRyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsaUJBQWlCLENBQUM7QUFDdkgsV0FBUyxPQUFPLE9BQU8sQ0FBQyxHQUFHLGlCQUFpQixHQUFHLHNCQUFzQixNQUFNO0FBQzNFLFFBQU0saUJBQWEsNEJBQVEsS0FBSyxPQUFPLGtCQUFrQixPQUFPLHdCQUF3QjtBQUV4RixhQUFPLCtDQUF3QixLQUFLLENBQUMsVUFBVSxHQUFHLE1BQU0seUJBQXlCLE1BQU0sQ0FBQztBQUMxRjtBQVFPLFNBQVMsd0JBQXdCLFFBQStDO0FBQ3JGLFFBQU0sY0FBYyxPQUFPLFVBQVUsTUFBTTtBQUUzQyxNQUFJLE9BQU8sWUFBWTtBQUNyQixVQUFNLFlBQVksT0FBTyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUs7QUFDdEQsV0FBTyxHQUFHLFdBQVcsS0FBSyxPQUFPLEdBQUcsR0FBRyxTQUFTO0FBQUEsRUFDbEQ7QUFFQSxRQUFNLFFBQVEsT0FBTyxTQUFTO0FBQzlCLFFBQU0sb0JBQW9CLE9BQU8scUJBQXFCO0FBQ3RELFFBQU0sZUFBZSxvQkFBb0IsWUFBWSxLQUFLLElBQUk7QUFFOUQsUUFBTSxNQUFNLE9BQU8seUJBQ2YsSUFBSSxPQUFPLEdBQUcsTUFDZCxVQUFVLE9BQU8sR0FBRztBQUV4QixRQUFNLFlBQVksT0FBTyxRQUFRLElBQUksS0FBSyxVQUFVLE9BQU8sS0FBSyxDQUFDLEtBQUs7QUFFdEUsU0FBTyxHQUFHLFdBQVcsSUFBSSxZQUFZLEtBQUssR0FBRyxHQUFHLFNBQVM7QUFDM0Q7QUFRTyxTQUFTLFVBQVUsS0FBcUM7QUFDN0QsUUFBTSxRQUFRLFdBQVcsR0FBRztBQUM1QixTQUFPLE1BQU0sQ0FBQyxHQUFHLFFBQVEsTUFBTSxNQUFNLENBQUMsSUFBSTtBQUM1QztBQVFPLFNBQVMsV0FBVyxLQUFnQztBQUN6RCxRQUFNLHFCQUFxQixvQkFBSSxJQUFZO0FBRTNDLFFBQU0sb0JBQW9CO0FBQzFCLFFBQU0sdUJBQXVCO0FBQzdCLFFBQU0sa0JBQWtCO0FBRXhCLFFBQU0sNEJBQTRCO0FBQ2xDLFFBQU0sNkJBQXlCLDBCQUFXLEtBQUssMkJBQTJCLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxZQUFZLElBQUksT0FBTyxFQUFFLEVBQUUsTUFBTTtBQUNoSSxVQUFNLGFBQWEsZ0JBQWdCLE9BQU8sVUFBVSxNQUFNO0FBQzFELFdBQU8sSUFBSSxVQUFVLEtBQUssSUFBSTtBQUFBLEVBQ2hDLENBQUM7QUFFRCxRQUFNLGlCQUFhLDBCQUFXLHdCQUF3QixtQkFBbUIsQ0FBQyxTQUFTO0FBQ2pGLHVCQUFtQixJQUFJLEtBQUssTUFBTTtBQUNsQyxXQUFPO0FBQUEsRUFDVCxDQUFDO0FBRUQsUUFBTSxnQkFBWSxzQkFBTyxFQUFFLElBQUksb0JBQUFDLE9BQVcsRUFBRSxJQUFJLHdDQUFnQixFQUFFLGNBQWMsaUJBQWlCLENBQUM7QUFDbEcsUUFBTSxPQUFPLFVBQVUsTUFBTSxVQUFVO0FBRXZDLFFBQU0sUUFBMkIsQ0FBQztBQUNsQyxRQUFNLFlBQStCLENBQUM7QUFFdEMscUNBQU0sTUFBTSxDQUFDLFNBQWU7QUFDMUIsUUFBSTtBQUNKLFlBQVEsS0FBSyxNQUFNO0FBQUEsTUFDakIsS0FBSztBQUNILGVBQU8sY0FBYyxNQUFjLEdBQUc7QUFDdEM7QUFBQSxNQUNGLEtBQUs7QUFDSCxlQUFPLGtCQUFrQixNQUFzQixHQUFHO0FBQ2xEO0FBQUEsTUFDRjtBQUNFO0FBQUEsSUFDSjtBQUVBLFFBQUksbUJBQW1CLElBQUksS0FBSyxjQUFjLENBQUMsR0FBRztBQUNoRCxXQUFLLFVBQVU7QUFDZixXQUFLO0FBQ0wsV0FBSyxNQUFNLElBQUksS0FBSyxHQUFHO0FBQUEsSUFDekI7QUFDQSxVQUFNLEtBQUssSUFBSTtBQUFBLEVBQ2pCLENBQUM7QUFFRCxRQUFNLEtBQUssQ0FBQyxHQUFHLE1BQU0sRUFBRSxjQUFjLEVBQUUsV0FBVztBQUVsRCxNQUFJLGtCQUFrQjtBQUV0QixhQUFXLFFBQVEsT0FBTztBQUN4QixxQkFBaUIsS0FBSyxpQkFBaUIsS0FBSyxjQUFjLEdBQUcsU0FBUztBQUN0RSxzQkFBa0IsS0FBSyxZQUFZO0FBQUEsRUFDckM7QUFFQSxtQkFBaUIsS0FBSyxpQkFBaUIsSUFBSSxTQUFTLEdBQUcsU0FBUztBQUVoRSxRQUFNLEtBQUssR0FBRyxTQUFTO0FBQ3ZCLFFBQU0sS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLGNBQWMsRUFBRSxXQUFXO0FBRWxELFNBQU87QUFDVDtBQVFPLFNBQVMsNkNBQTZDLFFBQWdCLElBQXFEO0FBQ2hJLFFBQU0sd0NBQXdDLHlDQUF5QyxPQUFPLEdBQUc7QUFDakcsd0NBQXNDLEtBQUssRUFBRTtBQUM3QyxTQUFPLFNBQVMsTUFBTTtBQUNwQiwwQ0FBc0MsT0FBTyxFQUFFO0FBQUEsRUFDakQsQ0FBQztBQUNIO0FBUU8sU0FBUyxpQkFBaUIsUUFBeUM7QUFDeEUsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixNQUFJLGVBQWUsT0FBTztBQUN4QixXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksQ0FBQyxhQUFhO0FBQ2hCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxpQkFBYSw0QkFBUSxLQUFLLGtCQUFrQixJQUFJO0FBQ3RELFFBQU0sb0JBQWdCLDRCQUFRLEtBQUssbUJBQW1CO0FBQ3RELFFBQU0sb0JBQWdCLDRCQUFRLEtBQUssdUJBQXVCLG1CQUFtQjtBQUM3RSxRQUFNLHNCQUFrQixxQkFBUSxhQUFhO0FBQzdDLFFBQU0sc0JBQWtCLHFCQUFRLGFBQWE7QUFDN0MsUUFBTSxpQkFBaUIsb0JBQUksSUFBWTtBQUV2QyxhQUFXLGNBQWMsQ0FBQyxXQUFXLE1BQU0sYUFBYSxHQUFHO0FBQ3pELFFBQUksQ0FBQyxZQUFZO0FBQ2Y7QUFBQSxJQUNGO0FBRUEsVUFBTSxXQUFPLDRCQUFRLEtBQUssVUFBVTtBQUNwQyxtQkFBZSxJQUFJLElBQUk7QUFDdkIsbUJBQWUsUUFBSSxzQkFBUyxJQUFJLENBQUM7QUFDakMsbUJBQWUsUUFBSSxzQkFBUyxpQkFBaUIsSUFBSSxDQUFDO0FBQ2xELG1CQUFlLFFBQUksc0JBQVMsaUJBQWlCLElBQUksQ0FBQztBQUFBLEVBQ3BEO0FBRUEsYUFBVyxjQUFjLENBQUMsZUFBZSxhQUFhLEdBQUc7QUFDdkQsbUJBQWUsSUFBSSxJQUFJLGNBQWMsZUFBZSxZQUFZLFlBQVksS0FBSyxDQUFDO0FBQUEsRUFDcEY7QUFFQSxRQUFNLHVCQUFtQiw4QkFBVyxtQ0FBYyxzQ0FBa0IsWUFBWSxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsRUFBRSxFQUFFLFlBQVk7QUFFN0gsYUFBVyxTQUFTLGdCQUFnQjtBQUNsQyxRQUFJLE1BQU0sWUFBWSxNQUFNLGtCQUFrQjtBQUM1QyxhQUFPO0FBQUEsSUFDVDtBQUVBLFVBQU0sYUFBUyxxQkFBUSxLQUFLO0FBQzVCLFVBQU0sV0FBTyxzQkFBUyxXQUFPLHFCQUFRLEtBQUssQ0FBQztBQUMzQyxZQUFJLGtCQUFLLFFBQVEsSUFBSSxFQUFFLFlBQVksTUFBTSxrQkFBa0I7QUFDekQsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBUU8sU0FBUyxhQUFhLE1BQWtDO0FBQzdELFFBQU0sYUFBUyxtQ0FBYyx5QkFBVSxJQUFJLENBQUM7QUFDNUMsU0FBTztBQUFBLElBQ0wsVUFBVSxPQUFPO0FBQUEsSUFDakIsU0FBUyxPQUFPO0FBQUEsRUFDbEI7QUFDRjtBQVNPLFNBQVMsa0JBQWtCLE1BQXVCO0FBQ3ZELFFBQU0sa0JBQWtCLFVBQVUsSUFBSTtBQUN0QyxTQUFPLGlCQUFpQixvQkFBb0I7QUFDOUM7QUFTTyxTQUFTLFVBQVUsTUFBdUI7QUFDL0MsUUFBTSxrQkFBa0IsVUFBVSxJQUFJO0FBQ3RDLFNBQU8saUJBQWlCLFdBQVc7QUFDckM7QUFVTyxTQUFTLGVBQWUsTUFBdUI7QUFDcEQsUUFBTSxrQkFBa0IsVUFBVSxJQUFJO0FBQ3RDLFNBQU8saUJBQWlCLElBQUksV0FBVyxJQUFJLEtBQUs7QUFDbEQ7QUFVTyxTQUFTLGlCQUFpQixNQUF1QjtBQUN0RCxRQUFNLGtCQUFrQixVQUFVLElBQUk7QUFDdEMsU0FBTyxpQkFBaUIsSUFBSSxXQUFXLEdBQUcsS0FBSztBQUNqRDtBQVNPLFNBQVMsYUFBYSxNQUF1QjtBQUNsRCxRQUFNLGtCQUFrQixVQUFVLElBQUk7QUFDdEMsU0FBTyxpQkFBaUIsY0FBYztBQUN4QztBQWFPLFNBQVMsY0FBYyxjQUE4QjtBQUMxRCxhQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxJQUNBLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxjQUFjLElBQUksY0FBYyxFQUFFLEVBQUUsTUFBTTtBQUMvRCxZQUFNLDJCQUEyQjtBQUNqQyxZQUFNLGlCQUFpQixZQUFZO0FBQ25DLFlBQU0sWUFBWSxLQUFLLE1BQU0saUJBQWlCLHdCQUF3QjtBQUN0RSxhQUFPLEtBQUssT0FBTyxTQUFTLElBQUk7QUFBQSxJQUNsQztBQUFBLEVBQ0Y7QUFDRjtBQVFPLFNBQVMsV0FBVyxRQUFrQztBQUMzRCxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixNQUFJLENBQUMscUJBQXFCO0FBQ3hCLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFDQSxRQUFNLG9CQUFnQiw0QkFBUSxLQUFLLHFCQUFxQixJQUFJO0FBQzVELFFBQU0sb0JBQWdCLDRCQUFRLEtBQUssdUJBQXVCLG1CQUFtQjtBQUM3RSxRQUFNLG9CQUFnQiw0QkFBUSxLQUFLLHVCQUF1QixtQkFBbUI7QUFDN0UsUUFBTSxhQUFhLHVCQUF1QixLQUFLLEtBQUssVUFBVSxTQUFTO0FBRXZFLFFBQU0sRUFBRSxRQUFRLElBQUksYUFBYSxLQUFLLElBQUk7QUFDMUMsTUFBSSxrQkFBa0IsQ0FBQztBQUV2QixVQUFJLGlDQUFhLEtBQUssbUJBQW1CLEdBQUc7QUFFMUMsWUFBSSw0Q0FBMEIsSUFBSSxHQUFHO0FBQ25DLGFBQU8sY0FBYyxPQUFPO0FBQUEsSUFDOUI7QUFBQSxFQUVGO0FBRUEsUUFBTSxrQkFBa0IsVUFBVSxLQUFLLFFBQVE7QUFDL0MsTUFBSTtBQUVKLE1BQUksY0FBYyxpQkFBaUIsT0FBTztBQUN4QyxZQUFRLGdCQUFnQjtBQUN4QixzQkFBa0I7QUFBQSxFQUNwQjtBQUVBLFlBQVUscUJBQWlCLGlEQUFvRDtBQUFBLElBQzNFO0FBQUEsSUFDQSxhQUFhLEtBQUs7QUFBQSxJQUNsQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0Esa0JBQWtCO0FBQUEsRUFDcEIsQ0FBQyxDQUFDLElBQ0EsU0FDQSxpQkFBaUI7QUFFckIsTUFBSSxDQUFDLGlCQUFpQjtBQUVwQixRQUFJLGNBQVUsc0JBQVMsbUJBQWUscUJBQVEsYUFBYSxDQUFDLEdBQUc7QUFDN0QsY0FBUSxjQUFjO0FBQUEsSUFDeEIsV0FBVyxjQUFVLHNCQUFTLGFBQWEsR0FBRztBQUM1QyxjQUFRLGNBQWM7QUFBQSxJQUN4QjtBQUFBLEVBRUY7QUFFQSxRQUFNLFVBQVUseUJBQXFCLGlEQUF3RDtBQUFBLElBQzNGO0FBQUEsSUFDQTtBQUFBLElBQ0Esd0JBQXdCLGtCQUFrQixpQkFBaUIsQ0FBQyxDQUFDLGlCQUFpQjtBQUFBLElBQzlFO0FBQUEsSUFDQSxjQUFjLEtBQUs7QUFBQSxJQUNuQixrQkFBa0I7QUFBQSxJQUNsQjtBQUFBLElBQ0Esa0JBQWtCO0FBQUEsRUFDcEIsQ0FBQyxDQUFDO0FBQ0YsU0FBTztBQUNUO0FBUUEsZUFBc0IscUJBQXFCLFFBQXFEO0FBQzlGLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBRUosU0FBTyxNQUFNLG1CQUFtQixLQUFLLFNBQVMsQ0FBQyxTQUFTO0FBQ3RELFVBQU0sY0FBYyxVQUFVLEtBQUssUUFBUTtBQUMzQyxRQUFJLCtCQUErQixVQUFhLCtCQUErQixhQUFhO0FBQzFGO0FBQUEsSUFDRjtBQUNBLFdBQU8sZ0JBQVksaURBQStDO0FBQUEsTUFDaEU7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0YsQ0FBQyxDQUFDO0FBQUEsRUFDSixDQUFDO0FBQ0g7QUFRQSxlQUFzQixrQkFBa0IsUUFBZ0Q7QUFDdEYsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUVKLFVBQUksaUNBQWEsS0FBSyxtQkFBbUIsS0FBSyxDQUFDLElBQUksZ0JBQWdCLHFCQUFxQiwwQ0FBbUIsTUFBTSxHQUFHO0FBQ2xIO0FBQUEsRUFDRjtBQUVBLFFBQU0sVUFBVSxLQUFLLHFCQUFxQixDQUFDLFNBQVM7QUFDbEQsVUFBTSxjQUFjLFVBQVUsS0FBSyxRQUFRO0FBQzNDLFFBQUksK0JBQStCLFVBQWEsK0JBQStCLGFBQWE7QUFDMUY7QUFBQSxJQUNGO0FBQ0EsV0FBTyxnQkFBWSxpREFBK0M7QUFBQSxNQUNoRTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRixDQUFDLENBQUM7QUFBQSxFQUNKLEdBQUcsTUFBTTtBQUNYO0FBRUEsU0FBUyxnQkFBZ0IsS0FBYSxZQUFxQixrQkFBbUM7QUFDNUYsTUFBSSxjQUFjLGtCQUFrQjtBQUNsQyxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUk7QUFDRixXQUFPLG1CQUFtQixHQUFHO0FBQUEsRUFDL0IsU0FBUyxPQUFPO0FBQ2QsWUFBUSxNQUFNLHdCQUF3QixHQUFHLElBQUksS0FBSztBQUNsRCxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRUEsU0FBUyxhQUFhLEtBQWEsa0JBQTBCLGdCQUE0QztBQUN2RyxTQUFPLG1CQUFtQixpQkFDdEIsSUFBSSxNQUFNLGtCQUFrQixjQUFjLElBQzFDO0FBQ047QUFFQSxTQUFTLGlCQUFpQixLQUFhLGFBQXFCLFdBQW1CLFdBQW9DO0FBQ2pILE1BQUksY0FBYyxXQUFXO0FBQzNCO0FBQUEsRUFDRjtBQUVBLFFBQU0sV0FBVyxJQUFJLE1BQU0sYUFBYSxZQUFZLENBQUM7QUFDckQsZ0NBQVcsVUFBVSxnQkFBZ0IsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxHQUFHLE9BQU8sTUFBTTtBQUNsRixRQUFJLEtBQUMsa0JBQU0sR0FBRyxHQUFHO0FBQ2Y7QUFBQSxJQUNGO0FBRUEsY0FBVSxLQUFLO0FBQUEsTUFDYixZQUFZLFVBQVUsR0FBRztBQUFBLE1BQ3pCLFdBQVcsY0FBYyxTQUFTLElBQUk7QUFBQSxNQUN0QyxrQkFBa0I7QUFBQSxNQUNsQixTQUFTO0FBQUEsTUFDVCxZQUFZO0FBQUEsTUFDWixZQUFZO0FBQUEsTUFDWixLQUFLO0FBQUEsTUFDTCxhQUFhLGNBQWM7QUFBQSxNQUMzQjtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0gsQ0FBQztBQUNIO0FBRUEsU0FBUyxnQ0FBZ0MsT0FBZ0IsS0FBYSxPQUFnQztBQUNwRyxNQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzdCLFVBQU0sa0JBQWtCLFVBQVUsS0FBSztBQUN2QyxRQUFJLENBQUMsbUJBQW1CLGdCQUFnQixjQUFjLGdCQUFnQixZQUFZO0FBQ2hGLGFBQU87QUFBQSxJQUNUO0FBRUEsVUFBTSxxQkFBcUIsQ0FBQztBQUM1QixRQUFJLE9BQU8sTUFBTSxpQkFBaUIsS0FBSyxDQUFDLG9CQUFvQixnQkFBZ0IsUUFBUSxHQUFHO0FBRXZGLFFBQUksQ0FBQyxNQUFNO0FBQ1QsYUFBTztBQUFBLFFBQ0w7QUFBQSxRQUNBLE1BQU07QUFBQSxRQUNOLFVBQVU7QUFBQSxNQUNaO0FBQ0EsWUFBTSxpQkFBaUIsS0FBSyxJQUFJO0FBQUEsSUFDbEM7QUFFQSxTQUFLLE9BQU8sZ0JBQWdCO0FBQzVCLFNBQUssV0FBVztBQUNoQixRQUFJLGdCQUFnQixVQUFVLFFBQVc7QUFDdkMsV0FBSyxjQUFjLGdCQUFnQjtBQUFBLElBQ3JDO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLE9BQU8sVUFBVSxZQUFZLFVBQVUsTUFBTTtBQUMvQyxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksc0JBQXNCO0FBRTFCLGFBQVcsQ0FBQyxVQUFVLFVBQVUsS0FBSyxPQUFPLFFBQVEsS0FBc0IsR0FBRztBQUMzRSxVQUFNLDJCQUEyQixnQ0FBZ0MsWUFBWSxNQUFNLEdBQUcsR0FBRyxJQUFJLFFBQVEsS0FBSyxVQUFVLEtBQUs7QUFDekgsNEJBQXdCO0FBQUEsRUFDMUI7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLGlCQUFpQixLQUFVLFlBQW1CLFlBQW9CLFNBQWlCLFFBQTRCO0FBQ3RILE1BQUksZUFBZSxLQUFLO0FBQ3RCLGlCQUFhO0FBQUEsRUFDZjtBQUVBLE1BQUk7QUFFSixNQUFJLFdBQVcsU0FBUyxjQUFjLFdBQVcsT0FBTyx3QkFBd0I7QUFDOUUsZUFBVztBQUFBLEVBQ2IsT0FBTztBQUVMLFlBQVEsT0FBTyxlQUFlO0FBQUE7QUFBQSxNQUU1QixLQUFLO0FBQ0gsbUJBQVcsV0FBVztBQUN0QixZQUFJLE9BQU8seUNBQXlDLENBQUMsU0FBUyxXQUFXLEdBQUcsR0FBRztBQUM3RSxxQkFBVyxJQUFJLFFBQVE7QUFBQSxRQUN6QjtBQUNBO0FBQUEsTUFDRixLQUFLO0FBQ0gsdUJBQVcsMEJBQVMscUJBQVEsVUFBVSxHQUFHLFdBQVcsSUFBSTtBQUN4RCxZQUFJLE9BQU8sdUNBQXVDLENBQUMsU0FBUyxXQUFXLEdBQUcsR0FBRztBQUMzRSxxQkFBVyxLQUFLLFFBQVE7QUFBQSxRQUMxQjtBQUNBO0FBQUEsTUFDRixLQUFLLDJEQUE2QztBQUNoRCxjQUFNLG1CQUFlLG1DQUFlLEtBQUssVUFBVSxJQUFJLFdBQVcsV0FBVyxXQUFXO0FBQ3hGLGNBQU0sZUFBZSxJQUFJLGNBQWMsZ0JBQWdCLGNBQWMsVUFBVTtBQUMvRSxtQkFBVyxhQUFhLFdBQVcsS0FBSyxhQUFhLENBQUMsTUFBTSxhQUFhLFdBQVcsT0FBTyxXQUFXO0FBQ3RHO0FBQUEsTUFDRjtBQUFBO0FBQUEsTUFFQTtBQUNFLDRDQUFZLE9BQU8sYUFBYTtBQUFBLElBRXBDO0FBQUEsRUFDRjtBQUVBLGFBQVcsT0FBTyxpQkFBYSx1QkFBUSxVQUFVLElBQUksMENBQXVCLEVBQUUsSUFBSTtBQUNsRixjQUFZO0FBRVosU0FBTztBQUNUO0FBRUEsU0FBUyx5QkFBeUIsUUFBNEM7QUFDNUUsUUFBTSxFQUFFLElBQUksSUFBSTtBQUNoQixRQUFNLGlCQUFhLDRCQUFRLEtBQUssT0FBTyxrQkFBa0IsT0FBTyx3QkFBd0I7QUFDeEYsUUFBTSxpQkFBYSw0QkFBUSxLQUFLLE9BQU8sZ0JBQWdCO0FBQ3ZELFFBQU0sVUFBVSxPQUFPLFdBQVc7QUFFbEMsUUFBTSxhQUFhLGNBQWMsUUFBUSxVQUFVO0FBQ25ELFFBQU0sV0FBVyxpQkFBaUIsS0FBSyxZQUFZLFlBQVksU0FBUyxVQUFVO0FBRWxGLFNBQU8sV0FBVyxhQUNkLGlCQUFpQixVQUFVLE9BQU8sT0FBTyxXQUFXLE9BQU8sSUFDM0QsMEJBQTBCLFVBQVUsWUFBWSxRQUFRLFVBQVU7QUFDeEU7QUFFQSxTQUFTLDBCQUEwQixVQUFrQixZQUFtQixRQUFvQyxRQUE0QjtBQUN0SSxRQUFNLEVBQUUsSUFBSSxJQUFJO0FBRWhCLE1BQUksUUFBUSxPQUFPLFNBQVM7QUFDNUIsTUFBSSxvQkFBb0IsT0FBTyxxQkFBcUI7QUFDcEQsTUFBSSxDQUFDLGNBQVUsbUNBQWUsS0FBSyxVQUFVLEtBQUssQ0FBQyxPQUFPLDJCQUEyQjtBQUNuRixZQUFRLENBQUMsT0FBTyxvREFBZ0QsbUNBQWUsS0FBSyxVQUFVLElBQzFGLFdBQVcsV0FDWCxXQUFXO0FBQ2Ysd0JBQW9CO0FBQUEsRUFDdEI7QUFFQSxTQUFPLHdCQUF3QjtBQUFBLElBQzdCO0FBQUEsSUFDQSxTQUFTLE9BQU87QUFBQSxJQUNoQixZQUFZO0FBQUEsSUFDWjtBQUFBLElBQ0Esd0JBQXdCLE9BQU87QUFBQSxJQUMvQixLQUFLO0FBQUEsRUFDUCxDQUFDO0FBQ0g7QUFFQSxTQUFTLGlCQUFpQixVQUFrQixPQUEyQixTQUEwQjtBQUMvRixNQUFJLE9BQU8sWUFBWSxNQUFNLFNBQVMsWUFBWSxHQUFHO0FBQ25ELFdBQU8sd0JBQXdCO0FBQUEsTUFDN0I7QUFBQSxNQUNBLFlBQVk7QUFBQSxNQUNaLEtBQUs7QUFBQSxJQUNQLENBQUM7QUFBQSxFQUNIO0FBRUEsU0FBTyx3QkFBd0I7QUFBQSxJQUM3QjtBQUFBLElBQ0E7QUFBQSxJQUNBLFlBQVk7QUFBQSxJQUNaLEtBQUs7QUFBQSxFQUNQLENBQUM7QUFDSDtBQUVBLGVBQWUsZUFDYixPQUNBLG1CQUNBLGVBQ0EsYUFDdUI7QUFDdkIsc0JBQWdCLDBDQUFpQjtBQUNqQyxjQUFZLGVBQWU7QUFFM0IsTUFBSSxDQUFDLE9BQU87QUFDVixXQUFPLENBQUM7QUFBQSxFQUNWO0FBRUEsUUFBTSxVQUF3QixDQUFDO0FBRS9CLFFBQU0sa0JBQW1DLE1BQU0sWUFBWSxDQUFDLEdBQUcsT0FBTyxDQUFDLFlBQVksUUFBUSxTQUFTLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYTtBQUFBLElBQzdILEtBQUssUUFBUSxTQUFTLElBQUk7QUFBQSxJQUMxQixPQUFPLFFBQVEsU0FBUyxNQUFNO0FBQUEsRUFDaEMsRUFBRTtBQUVGLGFBQVcsWUFBUSxtQ0FBWSxLQUFLLEdBQUc7QUFDckMsZ0JBQVksZUFBZTtBQUMzQixVQUFNLGFBQWEsTUFBTSxjQUFjLE1BQU0sV0FBVztBQUN4RCxnQkFBWSxlQUFlO0FBQzNCLFFBQUksZUFBZSxRQUFXO0FBQzVCO0FBQUEsSUFDRjtBQUVBLFVBQU0saUJBQWEsd0NBQXNCLE1BQU0sVUFBVTtBQUV6RCxRQUFJLG1CQUFtQjtBQUNyQixjQUFJLG1DQUFlLFVBQVUsR0FBRztBQUM5QixnQkFBUSxLQUFLLFVBQVU7QUFBQSxNQUN6QixPQUFPO0FBQ0wsZ0JBQVEsTUFBTSwyQkFBMkIsVUFBVTtBQUNuRDtBQUFBLE1BQ0Y7QUFBQSxJQUNGLE9BQU87QUFDTCxVQUFJLDRCQUE0QixZQUFZLGNBQWMsR0FBRztBQUMzRCxtQkFBVyxhQUFhLFdBQVcsV0FBVyxXQUFXLG1DQUFtQyx3QkFBd0I7QUFBQSxNQUN0SDtBQUVBLGNBQVEsS0FBSyxVQUFVO0FBQUEsSUFDekI7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBRUEsU0FBUyxzQkFBc0IsS0FBVSxlQUFtRDtBQUMxRixRQUFNLGdCQUFnQixpQkFBaUI7QUFDdkMsVUFBUSxlQUFlO0FBQUEsSUFDckIsS0FBSztBQUNILGFBQU87QUFBQSxJQUNULEtBQUs7QUFDSCxhQUFPLDhDQUE4QyxHQUFHO0FBQUEsSUFDMUQsS0FBSztBQUNILGFBQU87QUFBQSxJQUNULEtBQUs7QUFDSCxhQUFPO0FBQUEsSUFDVDtBQUNFLDBDQUFZLGFBQWE7QUFBQSxFQUM3QjtBQUNGO0FBRUEsU0FBUyx5Q0FBeUMsS0FBeUQ7QUFDekcsYUFBTyxxQ0FBd0UsS0FBSyx5Q0FBeUMsQ0FBQyxDQUFDLEVBQUU7QUFDbkk7QUFFQSxTQUFTLGNBQWMsUUFBb0MsWUFBK0I7QUFDeEYsUUFBTSxFQUFFLElBQUksSUFBSTtBQUNoQixTQUFPO0FBQUE7QUFBQSxJQUVMLFNBQVMsT0FBTyxZQUFZLE9BQU8sZUFBZSxVQUFVLE9BQU8sWUFBWSxJQUFJLFlBQzdFLEtBQUMsbUNBQWtCLFFBQVEsS0FBSyxLQUFDLG1DQUFlLEtBQUssVUFBVTtBQUFBO0FBQUEsSUFFckUsd0JBQXdCLE9BQU8sMEJBQTBCO0FBQUEsSUFDekQsWUFBWSx1QkFBdUIsS0FBSyxPQUFPLGNBQWMsT0FBTyxTQUFTO0FBQUEsSUFDN0UsZUFBZSxzQkFBc0IsS0FBSyxPQUFPLGFBQWE7QUFBQSxJQUM5RCx3QkFBd0IsT0FBTywyQkFBMkIsT0FBTyxlQUFlLGtCQUFrQixPQUFPLFlBQVksSUFBSSxXQUFjO0FBQUEsSUFDdkkscUNBQXFDLE9BQU8sd0NBQ3RDLE9BQU8sZUFBZSxlQUFlLE9BQU8sWUFBWSxJQUFJLFdBQWM7QUFBQSxJQUNoRix1Q0FBdUMsT0FBTywwQ0FDeEMsT0FBTyxlQUFlLGlCQUFpQixPQUFPLFlBQVksSUFBSSxXQUFjO0FBQUEsRUFDcEY7QUFDRjtBQUVBLFNBQVMsV0FBVyxNQUFZLEtBQXFCO0FBQ25ELFFBQU0sVUFBTSxzQ0FBa0IsS0FBSyxRQUFRO0FBQzNDLFNBQU8sSUFBSSxNQUFNLElBQUksTUFBTSxRQUFRLElBQUksSUFBSSxNQUFNO0FBQ25EO0FBRUEsU0FBUyx1QkFBdUIsS0FBYSxRQUF5QjtBQUNwRSxRQUFNLHFCQUFxQjtBQUMzQixTQUFPLElBQUksV0FBVyxrQkFBa0IsS0FBSyxPQUFPLFdBQVcsa0JBQWtCO0FBQ25GO0FBRUEsU0FBUyxjQUFjLE1BQVksS0FBOEI7QUFDL0QsUUFBTSxvQkFBb0I7QUFDMUIsUUFBTSxjQUFjO0FBQ3BCLFFBQU0sTUFBTSxXQUFXLE1BQU0sR0FBRztBQUNoQyxRQUFNLHVCQUF1QixLQUFLLFNBQVMsQ0FBQyxHQUFHLFVBQVUsTUFBTSxVQUFVO0FBQ3pFLFFBQU0scUJBQXFCLEtBQUssU0FBUyxHQUFHLEVBQUUsR0FBRyxVQUFVLElBQUksVUFBVTtBQUN6RSxRQUFNLGVBQVcsc0NBQWtCLEtBQUssUUFBUTtBQUNoRCxRQUFNLG9CQUFnQixzQ0FBa0IsU0FBUyxJQUFJLE1BQU07QUFDM0QsUUFBTSxzQkFBa0Isc0NBQWtCLFNBQVMsTUFBTSxNQUFNO0FBQy9ELFFBQU0sU0FBUyxJQUFJLE1BQU0scUJBQXFCLGtCQUFrQixRQUFRLGdCQUFnQixZQUFZLE1BQU07QUFDMUcsUUFBTSxtQkFBbUIsdUJBQXVCLEtBQUssTUFBTTtBQUMzRCxRQUFNLGlCQUFhLGtCQUFNLEtBQUssR0FBRztBQUNqQyxRQUFNLE1BQU0sZ0JBQWdCLEtBQUssS0FBSyxZQUFZLGdCQUFnQjtBQUNsRSxRQUFNLFFBQVEsYUFBYSxLQUFLLHNCQUFzQixrQkFBa0I7QUFDeEUsYUFBTyxpREFBNkM7QUFBQSxJQUNsRDtBQUFBLElBQ0EsWUFBWSxhQUFhLFVBQVUsR0FBRyxJQUFJO0FBQUEsSUFDMUMsV0FBVztBQUFBLElBQ1g7QUFBQSxJQUNBLFNBQVM7QUFBQSxJQUNUO0FBQUEsSUFDQSxZQUFZO0FBQUEsSUFDWjtBQUFBLElBQ0EsYUFBYTtBQUFBLElBQ2IsT0FBTyxLQUFLLFNBQVM7QUFBQSxJQUNyQixnQkFBZ0IsVUFBVSxTQUFZLFNBQVksY0FBYyxLQUFLO0FBQUEsSUFDckU7QUFBQSxFQUNGLENBQUM7QUFDSDtBQUVBLFNBQVMsa0JBQWtCLE1BQW9CLEtBQThCO0FBQzNFLFFBQU0sZUFBVyxzQ0FBa0IsS0FBSyxRQUFRO0FBQ2hELGFBQU8saURBQTZDO0FBQUEsSUFDbEQsT0FBTyxJQUFJLFNBQVMsZ0JBQWdCLElBQUksS0FBSyxLQUFLLFFBQVE7QUFBQSxJQUMxRCxlQUFXLHNDQUFrQixTQUFTLElBQUksTUFBTTtBQUFBLElBQ2hELFNBQVM7QUFBQSxJQUNULFlBQVk7QUFBQSxJQUNaLFlBQVk7QUFBQSxJQUNaLEtBQUssV0FBVyxNQUFNLEdBQUc7QUFBQSxJQUN6QixpQkFBYSxzQ0FBa0IsU0FBUyxNQUFNLE1BQU07QUFBQSxJQUNwRCxLQUFLLEtBQUs7QUFBQSxFQUNaLENBQUM7QUFDSDtBQUVBLFNBQVMsOENBQThDLEtBQThCO0FBQ25GLFFBQU0sb0JBQWdCLDJDQUFpQixHQUFHO0FBQzFDLFVBQVEsZUFBZTtBQUFBLElBQ3JCLEtBQUs7QUFDSCxhQUFPO0FBQUEsSUFDVCxLQUFLO0FBQ0gsYUFBTztBQUFBLElBQ1QsS0FBSztBQUNILGFBQU87QUFBQSxJQUNUO0FBQ0UsMENBQVksYUFBYTtBQUFBLEVBQzdCO0FBQ0Y7QUFFQSxTQUFTLDRCQUE0QixZQUF3QixnQkFBMEM7QUFFckcsTUFBSSxLQUFDLG9DQUFnQixVQUFVLEdBQUc7QUFDaEMsV0FBTztBQUFBLEVBQ1Q7QUFHQSxNQUFJLENBQUMsa0NBQWtDLEtBQUssV0FBVyxVQUFVLEdBQUc7QUFDbEUsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLGVBQWUsS0FBSyxDQUFDLGtCQUFrQixjQUFjLFNBQVMsV0FBVyxVQUFVLFNBQVMsTUFBTSxVQUFVLFdBQVcsVUFBVSxTQUFTLElBQUksVUFBVSxjQUFjLEdBQUc7QUFDbEw7QUFFQSxTQUFTLHVCQUF1QixLQUFVLGNBQXVCLFdBQWdDO0FBQy9GLFFBQU0sZ0JBQWdCLGFBQWE7QUFDbkMsVUFBUSxlQUFlO0FBQUEsSUFDckIsS0FBSztBQUNILGFBQU87QUFBQSxJQUNULEtBQUs7QUFDSCxpQkFBTyw2Q0FBbUIsR0FBRztBQUFBLElBQy9CLEtBQUs7QUFDSCxhQUFPLGlCQUFpQixhQUFZLDZDQUFtQixHQUFHLElBQUksYUFBYSxZQUFZO0FBQUEsSUFDekYsS0FBSztBQUNILGFBQU87QUFBQSxJQUNUO0FBQ0UsMENBQVksYUFBYTtBQUFBLEVBQzdCO0FBQ0Y7IiwKICAibmFtZXMiOiBbIkxpbmtQYXRoU3R5bGUiLCAiTGlua1N0eWxlIiwgInJlbWFya1BhcnNlIl0KfQo=
@@ -173,9 +173,7 @@ async function getCodeBlockMarkdownInfo(params) {
173
173
  textLineOffsets.set(linesBeforeSectionCount + i + 1, lineOffset);
174
174
  lastTextLineOffset = lineOffset;
175
175
  }
176
- const potentialCodeBlockTextLines = textLines.map(
177
- (line, index) => approximateSectionInfo.lineStart <= index && index <= approximateSectionInfo.lineEnd ? line : ""
178
- );
176
+ const potentialCodeBlockTextLines = textLines.map((line, index) => approximateSectionInfo.lineStart <= index && index <= approximateSectionInfo.lineEnd ? line : "");
179
177
  const potentialCodeBlockText = potentialCodeBlockTextLines.join("\n");
180
178
  const REG_EXP = /(?<=^|\n)(?<LinePrefix> {0,3}(?:> {1,3})*)(?<CodeBlockStartDelimiter>(?<CodeBlockStartDelimiterChar>[`~])(?:\k<CodeBlockStartDelimiterChar>{2,}))(?<CodeBlockLanguage>\S*)(?:[ \t](?<CodeBlockArgs>.*?))?(?:\n(?<CodeBlockContent>(?:\n?\k<LinePrefix>.*)+?))?\n\k<LinePrefix>(?<CodeBlockEndDelimiter>\k<CodeBlockStartDelimiter>\k<CodeBlockStartDelimiterChar>*)[ \t]*(?=\n|$)/g;
181
179
  for (const match of potentialCodeBlockText.matchAll(REG_EXP)) {
@@ -363,4 +361,4 @@ function isSuitableCodeBlock(match, language, sourceLf, isInCallout) {
363
361
  removeCodeBlock,
364
362
  replaceCodeBlock
365
363
  });
366
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21hcmtkb3duLWNvZGUtYmxvY2stcHJvY2Vzc29yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgY29kZSBibG9ja3MgaW4gT2JzaWRpYW4uXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQsXG4gIE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBWYWx1ZVByb3ZpZGVyIH0gZnJvbSAnLi4vdmFsdWUtcHJvdmlkZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBDb2RlQmxvY2tNYXJrZG93bkluZm9ybWF0aW9uIH0gZnJvbSAnLi9jb2RlLWJsb2NrLW1hcmtkb3duLWluZm9ybWF0aW9uLnRzJztcbmltcG9ydCB0eXBlIHsgQ29udGVudEFyZ3MgfSBmcm9tICcuL3ZhdWx0LnRzJztcblxuaW1wb3J0IHsgYWJvcnRTaWduYWxBbnkgfSBmcm9tICcuLi9hYm9ydC1jb250cm9sbGVyLnRzJztcbmltcG9ydCB7IHJlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuaW1wb3J0IHtcbiAgZW5zdXJlTGZFbmRpbmdzLFxuICBnZXRMZk5vcm1hbGl6ZWRPZmZzZXRUb09yaWdpbmFsT2Zmc2V0TWFwcGVyLFxuICBoYXNTaW5nbGVPY2N1cnJlbmNlLFxuICBpbmRlbnQsXG4gIHVuaW5kZW50XG59IGZyb20gJy4uL3N0cmluZy50cyc7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsYWJsZSB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJy4uL3ZhbHVlLXByb3ZpZGVyLnRzJztcbmltcG9ydCB7IGdldEZpbGVPck51bGwgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGludm9rZVdpdGhGaWxlU3lzdGVtTG9jayxcbiAgcHJvY2VzcyxcbiAgc2F2ZU5vdGVcbn0gZnJvbSAnLi92YXVsdC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdldENvZGVCbG9ja01hcmtkb3duSW5mb30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHtAbGluayBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0fSBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSBjdHg6IE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQ7XG5cbiAgLyoqXG4gICAqIEEge0BsaW5rIEhUTUxFbGVtZW50fSByZXByZXNlbnRpbmcgdGhlIGNvZGUgYmxvY2suXG4gICAqL1xuICByZWFkb25seSBlbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIG9mIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGluc2VydEFmdGVyQ29kZUJsb2NrfSAvIHtAbGluayBpbnNlcnRCZWZvcmVDb2RlQmxvY2t9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydENvZGVCbG9ja1BhcmFtcyBleHRlbmRzIEdldENvZGVCbG9ja01hcmtkb3duSW5mb1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBIG51bWJlciBvZiBsaW5lcyB0byBvZmZzZXQgdGhlIGluc2VydGlvbiBieS4gRGVmYXVsdCBpcyBgMGAuXG4gICAqL1xuICByZWFkb25seSBsaW5lT2Zmc2V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXNlcnZlIHRoZSBsaW5lIHByZWZpeCBvZiB0aGUgY29kZSBibG9jay4gRGVmYXVsdCBpcyBgZmFsc2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSB0ZXh0IHRvIGluc2VydCBhZnRlciB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcmVtb3ZlQ29kZUJsb2NrfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW1vdmVDb2RlQmxvY2tQYXJhbXMgZXh0ZW5kcyBHZXRDb2RlQmxvY2tNYXJrZG93bkluZm9QYXJhbXMge1xuICAvKipcbiAgICogV2hldGhlciB0byBrZWVwIHRoZSBnYXAgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGNvZGUgYmxvY2suIERlZmF1bHQgaXMgYGZhbHNlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEtlZXBHYXA/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayByZXBsYWNlQ29kZUJsb2NrfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBsYWNlQ29kZUJsb2NrUGFyYW1zIGV4dGVuZHMgR2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogUHJvdmlkZXMgYSBuZXcgY29kZSBibG9jay5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGVCbG9ja1Byb3ZpZGVyOiBWYWx1ZVByb3ZpZGVyPHN0cmluZywgQ29udGVudEFyZ3M+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGtlZXAgdGhlIGdhcCB3aGVuIHRoZSBuZXcgY29kZSBibG9jayBpcyBlbXB0eS4gRGVmYXVsdCBpcyBgZmFsc2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkS2VlcEdhcFdoZW5FbXB0eT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJlc2VydmUgdGhlIGxpbmUgcHJlZml4IG9mIHRoZSBjb2RlIGJsb2NrLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXg/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQ3JlYXRlTWFya2Rvd25JbmZvRnJvbU1hdGNoUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwcm94aW1hdGVTZWN0aW9uSW5mbzogTWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb247XG4gIHJlYWRvbmx5IGxpbmVzQmVmb3JlU2VjdGlvbkNvdW50OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5O1xuICByZWFkb25seSBub3RlQ29udGVudDogc3RyaW5nO1xuICByZWFkb25seSBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNvdXJjZUxpbmVzQ291bnQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgdGV4dExpbmVPZmZzZXRzOiBSZWFkb25seU1hcDxudW1iZXIsIG51bWJlcj47XG59XG5cbi8qKlxuICogR2V0cyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYSBjb2RlIGJsb2NrIGluIGEgTWFya2Rvd24gc2VjdGlvbi5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZSBibG9jayBpbiB0aGUgTWFya2Rvd24gc2VjdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvZGVCbG9ja01hcmtkb3duSW5mbyhwYXJhbXM6IEdldENvZGVCbG9ja01hcmtkb3duSW5mb1BhcmFtcyk6IFByb21pc2U8Q29kZUJsb2NrTWFya2Rvd25JbmZvcm1hdGlvbiB8IG51bGw+IHtcbiAgY29uc3QgeyBhcHAsIGN0eCwgZWwsIHNvdXJjZSB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBnZXRGaWxlT3JOdWxsKGFwcCwgY3R4LnNvdXJjZVBhdGgpO1xuICBhc3NlcnROb25OdWxsYWJsZShzb3VyY2VGaWxlLCBgU291cmNlIGZpbGUgJHtjdHguc291cmNlUGF0aH0gbm90IGZvdW5kLmApO1xuXG4gIGF3YWl0IHJlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jKCk7XG4gIGF3YWl0IHNhdmVOb3RlKGFwcCwgc291cmNlRmlsZSk7XG5cbiAgbGV0IG1hcmtkb3duSW5mbzogQ29kZUJsb2NrTWFya2Rvd25JbmZvcm1hdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGF3YWl0IGludm9rZVdpdGhGaWxlU3lzdGVtTG9jayhhcHAsIHNvdXJjZUZpbGUsIChub3RlQ29udGVudCkgPT4ge1xuICAgIGNvbnN0IG5vdGVDb250ZW50TGYgPSBlbnN1cmVMZkVuZGluZ3Mobm90ZUNvbnRlbnQpO1xuXG4gICAgY29uc3QgYXBwcm94aW1hdGVTZWN0aW9uSW5mbzogTWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb24gPSB7XG4gICAgICBsaW5lRW5kOiBub3RlQ29udGVudExmLnNwbGl0KCdcXG4nKS5sZW5ndGggLSAxLFxuICAgICAgbGluZVN0YXJ0OiAwLFxuICAgICAgdGV4dDogbm90ZUNvbnRlbnRMZlxuICAgIH07XG5cbiAgICBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLnRleHQgPSBlbnN1cmVMZkVuZGluZ3MoYXBwcm94aW1hdGVTZWN0aW9uSW5mby50ZXh0KTtcbiAgICBjb25zdCBzb3VyY2VMZiA9IGVuc3VyZUxmRW5kaW5ncyhzb3VyY2UpO1xuXG4gICAgaWYgKCFoYXNTaW5nbGVPY2N1cnJlbmNlKG5vdGVDb250ZW50TGYsIGFwcHJveGltYXRlU2VjdGlvbkluZm8udGV4dCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWN0aW9uT2Zmc2V0ID0gbm90ZUNvbnRlbnRMZi5pbmRleE9mKGFwcHJveGltYXRlU2VjdGlvbkluZm8udGV4dCk7XG4gICAgY29uc3QgbGluZXNCZWZvcmVTZWN0aW9uQ291bnQgPSBub3RlQ29udGVudExmLnNsaWNlKDAsIHNlY3Rpb25PZmZzZXQpLnNwbGl0KCdcXG4nKS5sZW5ndGggLSAxO1xuXG4gICAgY29uc3QgaXNJbkNhbGxvdXQgPSAhIWVsLnBhcmVudEVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucygnY2FsbG91dC1jb250ZW50Jyk7XG5cbiAgICBjb25zdCBsYW5ndWFnZSA9IGdldExhbmd1YWdlRnJvbUVsZW1lbnQoZWwpO1xuICAgIGNvbnN0IHNvdXJjZUxpbmVzID0gc291cmNlTGYuc3BsaXQoJ1xcbicpO1xuXG4gICAgY29uc3QgdGV4dExpbmVzID0gYXBwcm94aW1hdGVTZWN0aW9uSW5mby50ZXh0LnNwbGl0KCdcXG4nKTtcbiAgICBjb25zdCB0ZXh0TGluZU9mZnNldHMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICAgIHRleHRMaW5lT2Zmc2V0cy5zZXQobGluZXNCZWZvcmVTZWN0aW9uQ291bnQsIHNlY3Rpb25PZmZzZXQpO1xuXG4gICAgbGV0IGxhc3RUZXh0TGluZU9mZnNldCA9IHNlY3Rpb25PZmZzZXQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0TGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRleHRMaW5lID0gdGV4dExpbmVzW2ldID8/ICcnO1xuICAgICAgY29uc3QgbGluZU9mZnNldCA9IGxhc3RUZXh0TGluZU9mZnNldCArIHRleHRMaW5lLmxlbmd0aCArIDE7XG4gICAgICB0ZXh0TGluZU9mZnNldHMuc2V0KGxpbmVzQmVmb3JlU2VjdGlvbkNvdW50ICsgaSArIDEsIGxpbmVPZmZzZXQpO1xuICAgICAgbGFzdFRleHRMaW5lT2Zmc2V0ID0gbGluZU9mZnNldDtcbiAgICB9XG5cbiAgICBjb25zdCBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0TGluZXMgPSB0ZXh0TGluZXMubWFwKChsaW5lLCBpbmRleCkgPT5cbiAgICAgIGFwcHJveGltYXRlU2VjdGlvbkluZm8ubGluZVN0YXJ0IDw9IGluZGV4ICYmIGluZGV4IDw9IGFwcHJveGltYXRlU2VjdGlvbkluZm8ubGluZUVuZCA/IGxpbmUgOiAnJ1xuICAgICk7XG4gICAgY29uc3QgcG90ZW50aWFsQ29kZUJsb2NrVGV4dCA9IHBvdGVudGlhbENvZGVCbG9ja1RleHRMaW5lcy5qb2luKCdcXG4nKTtcblxuICAgIGNvbnN0IFJFR19FWFAgPVxuICAgICAgLyg/PD1efFxcbikoPzxMaW5lUHJlZml4PiB7MCwzfSg/Oj4gezEsM30pKikoPzxDb2RlQmxvY2tTdGFydERlbGltaXRlcj4oPzxDb2RlQmxvY2tTdGFydERlbGltaXRlckNoYXI+W2B+XSkoPzpcXGs8Q29kZUJsb2NrU3RhcnREZWxpbWl0ZXJDaGFyPnsyLH0pKSg/PENvZGVCbG9ja0xhbmd1YWdlPlxcUyopKD86WyBcXHRdKD88Q29kZUJsb2NrQXJncz4uKj8pKT8oPzpcXG4oPzxDb2RlQmxvY2tDb250ZW50Pig/Olxcbj9cXGs8TGluZVByZWZpeD4uKikrPykpP1xcblxcazxMaW5lUHJlZml4Pig/PENvZGVCbG9ja0VuZERlbGltaXRlcj5cXGs8Q29kZUJsb2NrU3RhcnREZWxpbWl0ZXI+XFxrPENvZGVCbG9ja1N0YXJ0RGVsaW1pdGVyQ2hhcj4qKVsgXFx0XSooPz1cXG58JCkvZztcblxuICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgcG90ZW50aWFsQ29kZUJsb2NrVGV4dC5tYXRjaEFsbChSRUdfRVhQKSkge1xuICAgICAgaWYgKCFpc1N1aXRhYmxlQ29kZUJsb2NrKG1hdGNoLCBsYW5ndWFnZSwgc291cmNlTGYsIGlzSW5DYWxsb3V0KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1hcmtkb3duSW5mbykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG1hcmtkb3duSW5mbyA9IGNyZWF0ZU1hcmtkb3duSW5mb0Zyb21NYXRjaCh7XG4gICAgICAgIGFwcHJveGltYXRlU2VjdGlvbkluZm8sXG4gICAgICAgIGxpbmVzQmVmb3JlU2VjdGlvbkNvdW50LFxuICAgICAgICBtYXRjaCxcbiAgICAgICAgbm90ZUNvbnRlbnQsXG4gICAgICAgIHBvdGVudGlhbENvZGVCbG9ja1RleHQsXG4gICAgICAgIHNvdXJjZUxpbmVzQ291bnQ6IHNvdXJjZUxpbmVzLmxlbmd0aCxcbiAgICAgICAgdGV4dExpbmVPZmZzZXRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIW1hcmtkb3duSW5mbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChub3RlQ29udGVudExmID09PSBub3RlQ29udGVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxmT2Zmc2V0TWFwcGVyID0gZ2V0TGZOb3JtYWxpemVkT2Zmc2V0VG9PcmlnaW5hbE9mZnNldE1hcHBlcihub3RlQ29udGVudCk7XG4gICAgbWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLnN0YXJ0Lm9mZnNldCA9IGxmT2Zmc2V0TWFwcGVyKG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5zdGFydC5vZmZzZXQpO1xuICAgIG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5lbmQub2Zmc2V0ID0gbGZPZmZzZXRNYXBwZXIobWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLmVuZC5vZmZzZXQpO1xuICB9KTtcblxuICByZXR1cm4gbWFya2Rvd25JbmZvO1xufVxuXG4vKipcbiAqIEluc2VydHMgdGV4dCBhZnRlciB0aGUgY29kZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFuLWRldi11dGlscy9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoIC0tIEludGVudGlvbmFsbHkgc2hhcmVzIEluc2VydENvZGVCbG9ja1BhcmFtcyB3aXRoIGluc2VydEJlZm9yZUNvZGVCbG9jay5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnNlcnRBZnRlckNvZGVCbG9jayhwYXJhbXM6IEluc2VydENvZGVCbG9ja1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFwcCwgY3R4LCBsaW5lT2Zmc2V0ID0gMCwgdGV4dCB9ID0gcGFyYW1zO1xuXG4gIGF3YWl0IHByb2Nlc3MoYXBwLCBjdHguc291cmNlUGF0aCwgYXN5bmMgKHsgY29udGVudCB9KSA9PiB7XG4gICAgY29uc3QgbWFya2Rvd25JbmZvID0gYXdhaXQgZ2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvKHBhcmFtcyk7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUobWFya2Rvd25JbmZvLCAnQ291bGQgbm90IHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBjb2RlIGJsb2NrLicpO1xuXG4gICAgaWYgKGNvbnRlbnQgIT09IG1hcmtkb3duSW5mby5ub3RlQ29udGVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgaW5zZXJ0TGluZUluZGV4ID0gbWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLmVuZC5saW5lICsgbGluZU9mZnNldCArIDE7XG4gICAgcmV0dXJuIGluc2VydFRleHQoY29udGVudCwgaW5zZXJ0TGluZUluZGV4LCB0ZXh0LCBwYXJhbXMuc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4KTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyB0ZXh0IGJlZm9yZSB0aGUgY29kZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFuLWRldi11dGlscy9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoIC0tIEludGVudGlvbmFsbHkgc2hhcmVzIEluc2VydENvZGVCbG9ja1BhcmFtcyB3aXRoIGluc2VydEFmdGVyQ29kZUJsb2NrLlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc2VydEJlZm9yZUNvZGVCbG9jayhwYXJhbXM6IEluc2VydENvZGVCbG9ja1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFwcCwgY3R4LCBsaW5lT2Zmc2V0ID0gMCwgdGV4dCB9ID0gcGFyYW1zO1xuXG4gIGF3YWl0IHByb2Nlc3MoYXBwLCBjdHguc291cmNlUGF0aCwgYXN5bmMgKHsgY29udGVudCB9KSA9PiB7XG4gICAgY29uc3QgbWFya2Rvd25JbmZvID0gYXdhaXQgZ2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvKHBhcmFtcyk7XG4gICAgaWYgKCFtYXJrZG93bkluZm8pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBjb2RlIGJsb2NrLicpO1xuICAgIH1cblxuICAgIGlmIChjb250ZW50ICE9PSBtYXJrZG93bkluZm8ubm90ZUNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGluc2VydExpbmVJbmRleCA9IG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5zdGFydC5saW5lIC0gbGluZU9mZnNldDtcbiAgICByZXR1cm4gaW5zZXJ0VGV4dChjb250ZW50LCBpbnNlcnRMaW5lSW5kZXgsIHRleHQsIHBhcmFtcy5zaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBjb2RlIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlQ29kZUJsb2NrKHBhcmFtczogUmVtb3ZlQ29kZUJsb2NrUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlcGxhY2VDb2RlQmxvY2soe1xuICAgIC4uLnBhcmFtcyxcbiAgICBjb2RlQmxvY2tQcm92aWRlcjogJycsXG4gICAgc2hvdWxkS2VlcEdhcFdoZW5FbXB0eTogcGFyYW1zLnNob3VsZEtlZXBHYXAgPz8gZmFsc2VcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwbGFjZXMgdGhlIGNvZGUgYmxvY2suXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXBsYWNlQ29kZUJsb2NrKHBhcmFtczogUmVwbGFjZUNvZGVCbG9ja1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFwcCwgY29kZUJsb2NrUHJvdmlkZXIsIGN0eCB9ID0gcGFyYW1zO1xuICBwYXJhbXMuYWJvcnRTaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG5cbiAgYXdhaXQgcHJvY2VzcyhhcHAsIGN0eC5zb3VyY2VQYXRoLCBhc3luYyAoeyBhYm9ydFNpZ25hbCwgY29udGVudCB9KSA9PiB7XG4gICAgYWJvcnRTaWduYWwgPSBhYm9ydFNpZ25hbEFueShhYm9ydFNpZ25hbCwgcGFyYW1zLmFib3J0U2lnbmFsKTtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGNvbnN0IG1hcmtkb3duSW5mbyA9IGF3YWl0IGdldENvZGVCbG9ja01hcmtkb3duSW5mbyhwYXJhbXMpO1xuICAgIGlmICghbWFya2Rvd25JbmZvKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCB1bmlxdWVseSBpZGVudGlmeSB0aGUgY29kZSBibG9jay4nKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGVudCAhPT0gbWFya2Rvd25JbmZvLm5vdGVDb250ZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgb2xkQ29kZUJsb2NrID0gY29udGVudC5zbGljZShtYXJrZG93bkluZm8ucG9zaXRpb25Jbk5vdGUuc3RhcnQub2Zmc2V0LCBtYXJrZG93bkluZm8ucG9zaXRpb25Jbk5vdGUuZW5kLm9mZnNldCk7XG4gICAgaWYgKHBhcmFtcy5zaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXgpIHtcbiAgICAgIG9sZENvZGVCbG9jayA9IHVuaW5kZW50KG9sZENvZGVCbG9jaywgbWFya2Rvd25JbmZvLmxpbmVQcmVmaXgpO1xuICAgIH1cblxuICAgIGxldCBuZXdDb2RlQmxvY2sgPSBhd2FpdCByZXNvbHZlVmFsdWUoY29kZUJsb2NrUHJvdmlkZXIsIHsgYWJvcnRTaWduYWwsIGNvbnRlbnQ6IG9sZENvZGVCbG9jayB9KTtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGlmICgobmV3Q29kZUJsb2NrIHx8IHBhcmFtcy5zaG91bGRLZWVwR2FwV2hlbkVtcHR5KSAmJiBwYXJhbXMuc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4KSB7XG4gICAgICBuZXdDb2RlQmxvY2sgPSBpbmRlbnQobmV3Q29kZUJsb2NrLCBtYXJrZG93bkluZm8ubGluZVByZWZpeCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJlZm9yZUNvZGVCbG9jayA9IGNvbnRlbnQuc2xpY2UoMCwgbWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLnN0YXJ0Lm9mZnNldCk7XG4gICAgY29uc3QgdGV4dEFmdGVyQ29kZUJsb2NrID0gY29udGVudC5zbGljZShtYXJrZG93bkluZm8ucG9zaXRpb25Jbk5vdGUuZW5kLm9mZnNldCk7XG5cbiAgICBpZiAobmV3Q29kZUJsb2NrIHx8IHBhcmFtcy5zaG91bGRLZWVwR2FwV2hlbkVtcHR5KSB7XG4gICAgICByZXR1cm4gYCR7dGV4dEJlZm9yZUNvZGVCbG9ja30ke25ld0NvZGVCbG9ja30ke3RleHRBZnRlckNvZGVCbG9ja31gO1xuICAgIH1cblxuICAgIGlmICghdGV4dEJlZm9yZUNvZGVCbG9jayAmJiAhdGV4dEFmdGVyQ29kZUJsb2NrKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgaWYgKHRleHRCZWZvcmVDb2RlQmxvY2spIHtcbiAgICAgIHJldHVybiBgJHt0ZXh0QmVmb3JlQ29kZUJsb2NrLnNsaWNlKDAsIC0xKX0ke3RleHRBZnRlckNvZGVCbG9ja31gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0ZXh0QmVmb3JlQ29kZUJsb2NrfSR7dGV4dEFmdGVyQ29kZUJsb2NrLnNsaWNlKDEpfWA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVNYXJrZG93bkluZm9Gcm9tTWF0Y2gocGFyYW1zOiBDcmVhdGVNYXJrZG93bkluZm9Gcm9tTWF0Y2hQYXJhbXMpOiBDb2RlQmxvY2tNYXJrZG93bkluZm9ybWF0aW9uIHtcbiAgY29uc3Qge1xuICAgIGFwcHJveGltYXRlU2VjdGlvbkluZm8sXG4gICAgbGluZXNCZWZvcmVTZWN0aW9uQ291bnQsXG4gICAgbWF0Y2gsXG4gICAgbm90ZUNvbnRlbnQsXG4gICAgcG90ZW50aWFsQ29kZUJsb2NrVGV4dCxcbiAgICBzb3VyY2VMaW5lc0NvdW50LFxuICAgIHRleHRMaW5lT2Zmc2V0c1xuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGxpbmVQcmVmaXggPSBtYXRjaC5ncm91cHM/LlsnTGluZVByZWZpeCddID8/ICcnO1xuICBjb25zdCBjb2RlQmxvY2tTdGFydERlbGltaXRlciA9IG1hdGNoLmdyb3Vwcz8uWydDb2RlQmxvY2tTdGFydERlbGltaXRlciddID8/ICcnO1xuICBjb25zdCBjb2RlQmxvY2tFbmREZWxpbWl0ZXIgPSBtYXRjaC5ncm91cHM/LlsnQ29kZUJsb2NrRW5kRGVsaW1pdGVyJ10gPz8gJyc7XG4gIGNvbnN0IGNvZGVCbG9ja0FyZ3NTdHIgPSBtYXRjaC5ncm91cHM/LlsnQ29kZUJsb2NrQXJncyddID8/ICcnO1xuICBjb25zdCBsYW5ndWFnZSA9IG1hdGNoLmdyb3Vwcz8uWydDb2RlQmxvY2tMYW5ndWFnZSddID8/ICcnO1xuXG4gIGNvbnN0IHByZXZpb3VzVGV4dCA9IHBvdGVudGlhbENvZGVCbG9ja1RleHQuc2xpY2UoMCwgbWF0Y2guaW5kZXgpO1xuICBjb25zdCBwcmV2aW91c1RleHRMaW5lc0NvdW50ID0gcHJldmlvdXNUZXh0LnNwbGl0KCdcXG4nKS5sZW5ndGggLSAxO1xuXG4gIGNvbnN0IHN0YXJ0TGluZSA9IGxpbmVzQmVmb3JlU2VjdGlvbkNvdW50ICsgcHJldmlvdXNUZXh0TGluZXNDb3VudDtcbiAgY29uc3QgZW5kTGluZSA9IHN0YXJ0TGluZSArIHNvdXJjZUxpbmVzQ291bnQgKyAxO1xuXG4gIHJldHVybiB7XG4gICAgYXJnczogY29kZUJsb2NrQXJnc1N0ci5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKSxcbiAgICBlbmREZWxpbWl0ZXI6IGNvZGVCbG9ja0VuZERlbGltaXRlcixcbiAgICBsYW5ndWFnZSxcbiAgICBsaW5lUHJlZml4LFxuICAgIG5vdGVDb250ZW50LFxuICAgIHBvc2l0aW9uSW5Ob3RlOiB7XG4gICAgICBlbmQ6IHtcbiAgICAgICAgY29sOiAodGV4dExpbmVPZmZzZXRzLmdldChlbmRMaW5lICsgMSkgPz8gMCkgLSAodGV4dExpbmVPZmZzZXRzLmdldChlbmRMaW5lKSA/PyAwKSAtIDEsXG4gICAgICAgIGxpbmU6IGVuZExpbmUsXG4gICAgICAgIG9mZnNldDogKHRleHRMaW5lT2Zmc2V0cy5nZXQoZW5kTGluZSArIDEpID8/IDApIC0gMVxuICAgICAgfSxcbiAgICAgIHN0YXJ0OiB7XG4gICAgICAgIGNvbDogMCxcbiAgICAgICAgbGluZTogc3RhcnRMaW5lLFxuICAgICAgICBvZmZzZXQ6IHRleHRMaW5lT2Zmc2V0cy5nZXQoc3RhcnRMaW5lKSA/PyAwXG4gICAgICB9XG4gICAgfSxcbiAgICByYXdBcmdzU3RyOiBjb2RlQmxvY2tBcmdzU3RyLFxuICAgIHNlY3Rpb25JbmZvOiB7XG4gICAgICBsaW5lRW5kOiBwcmV2aW91c1RleHRMaW5lc0NvdW50ICsgc291cmNlTGluZXNDb3VudCArIDEsXG4gICAgICBsaW5lU3RhcnQ6IHByZXZpb3VzVGV4dExpbmVzQ291bnQsXG4gICAgICB0ZXh0OiBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLnRleHRcbiAgICB9LFxuICAgIHN0YXJ0RGVsaW1pdGVyOiBjb2RlQmxvY2tTdGFydERlbGltaXRlclxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRMYW5ndWFnZUZyb21FbGVtZW50KGVsOiBIVE1MRWxlbWVudCk6IHN0cmluZyB7XG4gIGNvbnN0IEJMT0NLX0xBTkdVQUdFX1BSRUZJWCA9ICdibG9jay1sYW5ndWFnZS0nO1xuICByZXR1cm4gQXJyYXkuZnJvbShlbC5jbGFzc0xpc3QpLmZpbmQoKGNscykgPT4gY2xzLnN0YXJ0c1dpdGgoQkxPQ0tfTEFOR1VBR0VfUFJFRklYKSk/LnNsaWNlKEJMT0NLX0xBTkdVQUdFX1BSRUZJWC5sZW5ndGgpID8/ICcnO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRUZXh0KGNvbnRlbnQ6IHN0cmluZywgaW5zZXJ0TGluZUluZGV4OiBudW1iZXIsIHRleHQ6IHN0cmluZywgc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4PzogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IG5ld0xpbmVzID0gbGluZXMuc2xpY2UoKTtcbiAgY29uc3QgdGV4dExpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG5cbiAgaWYgKGluc2VydExpbmVJbmRleCA8IDApIHtcbiAgICBpbnNlcnRMaW5lSW5kZXggPSAwO1xuICB9XG4gIGlmIChpbnNlcnRMaW5lSW5kZXggPiBsaW5lcy5sZW5ndGgpIHtcbiAgICBpbnNlcnRMaW5lSW5kZXggPSBsaW5lcy5sZW5ndGg7XG4gIH1cblxuICBjb25zdCBQUkVGSVhfTElORV9SRUdfRVhQID0gL14gezAsM30oPzo+IHsxLDN9KSovZztcbiAgY29uc3QgbWF0Y2ggPSAobGluZXNbaW5zZXJ0TGluZUluZGV4XSA/PyAnJykubWF0Y2goUFJFRklYX0xJTkVfUkVHX0VYUCk7XG4gIGNvbnN0IGxpbmVQcmVmaXggPSBtYXRjaD8uWzBdID8/ICcnO1xuICBuZXdMaW5lcy5zcGxpY2UoaW5zZXJ0TGluZUluZGV4LCAwLCAuLi4oc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4ID8gdGV4dExpbmVzLm1hcCgobGluZSkgPT4gaW5kZW50KGxpbmUsIGxpbmVQcmVmaXgpKSA6IHRleHRMaW5lcykpO1xuICByZXR1cm4gbmV3TGluZXMuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGlzU3VpdGFibGVDb2RlQmxvY2soXG4gIG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5LFxuICBsYW5ndWFnZTogc3RyaW5nLFxuICBzb3VyY2VMZjogc3RyaW5nLFxuICBpc0luQ2FsbG91dDogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvZGVCbG9ja0xhbmd1YWdlID0gbWF0Y2guZ3JvdXBzPy5bJ0NvZGVCbG9ja0xhbmd1YWdlJ10gPz8gJyc7XG4gIGlmIChjb2RlQmxvY2tMYW5ndWFnZSAhPT0gbGFuZ3VhZ2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBsaW5lUHJlZml4ID0gbWF0Y2guZ3JvdXBzPy5bJ0xpbmVQcmVmaXgnXSA/PyAnJztcblxuICBpZiAoaXNJbkNhbGxvdXQgJiYgIWxpbmVQcmVmaXguaW5jbHVkZXMoJz4gJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjb2RlQmxvY2tDb250ZW50ID0gbWF0Y2guZ3JvdXBzPy5bJ0NvZGVCbG9ja0NvbnRlbnQnXSA/PyAnJztcbiAgY29uc3QgY2xlYW5Db2RlQmxvY2tDb250ZW50ID0gY29kZUJsb2NrQ29udGVudC5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiBsaW5lLnNsaWNlKGxpbmVQcmVmaXgubGVuZ3RoKSkuam9pbignXFxuJyk7XG5cbiAgcmV0dXJuIGNsZWFuQ29kZUJsb2NrQ29udGVudCA9PT0gc291cmNlTGY7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWtCQSw4QkFBK0I7QUFDL0IsbUJBQTJDO0FBQzNDLG9CQU1PO0FBQ1AseUJBQWtDO0FBQ2xDLDRCQUE2QjtBQUM3Qix5QkFBOEI7QUFDOUIsbUJBSU87QUFrR1AsZUFBc0IseUJBQXlCLFFBQXNGO0FBQ25JLFFBQU0sRUFBRSxLQUFLLEtBQUssSUFBSSxPQUFPLElBQUk7QUFFakMsUUFBTSxpQkFBYSxrQ0FBYyxLQUFLLElBQUksVUFBVTtBQUNwRCw0Q0FBa0IsWUFBWSxlQUFlLElBQUksVUFBVSxhQUFhO0FBRXhFLFlBQU0seUNBQTJCO0FBQ2pDLFlBQU0sdUJBQVMsS0FBSyxVQUFVO0FBRTlCLE1BQUksZUFBb0Q7QUFFeEQsWUFBTSx1Q0FBeUIsS0FBSyxZQUFZLENBQUMsZ0JBQWdCO0FBQy9ELFVBQU0sb0JBQWdCLCtCQUFnQixXQUFXO0FBRWpELFVBQU0seUJBQXFEO0FBQUEsTUFDekQsU0FBUyxjQUFjLE1BQU0sSUFBSSxFQUFFLFNBQVM7QUFBQSxNQUM1QyxXQUFXO0FBQUEsTUFDWCxNQUFNO0FBQUEsSUFDUjtBQUVBLDJCQUF1QixXQUFPLCtCQUFnQix1QkFBdUIsSUFBSTtBQUN6RSxVQUFNLGVBQVcsK0JBQWdCLE1BQU07QUFFdkMsUUFBSSxLQUFDLG1DQUFvQixlQUFlLHVCQUF1QixJQUFJLEdB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
364
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21hcmtkb3duLWNvZGUtYmxvY2stcHJvY2Vzc29yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgY29kZSBibG9ja3MgaW4gT2JzaWRpYW4uXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQsXG4gIE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBWYWx1ZVByb3ZpZGVyIH0gZnJvbSAnLi4vdmFsdWUtcHJvdmlkZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBDb2RlQmxvY2tNYXJrZG93bkluZm9ybWF0aW9uIH0gZnJvbSAnLi9jb2RlLWJsb2NrLW1hcmtkb3duLWluZm9ybWF0aW9uLnRzJztcbmltcG9ydCB0eXBlIHsgQ29udGVudEFyZ3MgfSBmcm9tICcuL3ZhdWx0LnRzJztcblxuaW1wb3J0IHsgYWJvcnRTaWduYWxBbnkgfSBmcm9tICcuLi9hYm9ydC1jb250cm9sbGVyLnRzJztcbmltcG9ydCB7IHJlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuaW1wb3J0IHtcbiAgZW5zdXJlTGZFbmRpbmdzLFxuICBnZXRMZk5vcm1hbGl6ZWRPZmZzZXRUb09yaWdpbmFsT2Zmc2V0TWFwcGVyLFxuICBoYXNTaW5nbGVPY2N1cnJlbmNlLFxuICBpbmRlbnQsXG4gIHVuaW5kZW50XG59IGZyb20gJy4uL3N0cmluZy50cyc7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsYWJsZSB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJy4uL3ZhbHVlLXByb3ZpZGVyLnRzJztcbmltcG9ydCB7IGdldEZpbGVPck51bGwgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGludm9rZVdpdGhGaWxlU3lzdGVtTG9jayxcbiAgcHJvY2VzcyxcbiAgc2F2ZU5vdGVcbn0gZnJvbSAnLi92YXVsdC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdldENvZGVCbG9ja01hcmtkb3duSW5mb30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHtAbGluayBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0fSBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSBjdHg6IE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQ7XG5cbiAgLyoqXG4gICAqIEEge0BsaW5rIEhUTUxFbGVtZW50fSByZXByZXNlbnRpbmcgdGhlIGNvZGUgYmxvY2suXG4gICAqL1xuICByZWFkb25seSBlbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIG9mIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGluc2VydEFmdGVyQ29kZUJsb2NrfSAvIHtAbGluayBpbnNlcnRCZWZvcmVDb2RlQmxvY2t9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydENvZGVCbG9ja1BhcmFtcyBleHRlbmRzIEdldENvZGVCbG9ja01hcmtkb3duSW5mb1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBIG51bWJlciBvZiBsaW5lcyB0byBvZmZzZXQgdGhlIGluc2VydGlvbiBieS4gRGVmYXVsdCBpcyBgMGAuXG4gICAqL1xuICByZWFkb25seSBsaW5lT2Zmc2V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXNlcnZlIHRoZSBsaW5lIHByZWZpeCBvZiB0aGUgY29kZSBibG9jay4gRGVmYXVsdCBpcyBgZmFsc2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSB0ZXh0IHRvIGluc2VydCBhZnRlciB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcmVtb3ZlQ29kZUJsb2NrfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW1vdmVDb2RlQmxvY2tQYXJhbXMgZXh0ZW5kcyBHZXRDb2RlQmxvY2tNYXJrZG93bkluZm9QYXJhbXMge1xuICAvKipcbiAgICogV2hldGhlciB0byBrZWVwIHRoZSBnYXAgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGNvZGUgYmxvY2suIERlZmF1bHQgaXMgYGZhbHNlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEtlZXBHYXA/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayByZXBsYWNlQ29kZUJsb2NrfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBsYWNlQ29kZUJsb2NrUGFyYW1zIGV4dGVuZHMgR2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogUHJvdmlkZXMgYSBuZXcgY29kZSBibG9jay5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGVCbG9ja1Byb3ZpZGVyOiBWYWx1ZVByb3ZpZGVyPHN0cmluZywgQ29udGVudEFyZ3M+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGtlZXAgdGhlIGdhcCB3aGVuIHRoZSBuZXcgY29kZSBibG9jayBpcyBlbXB0eS4gRGVmYXVsdCBpcyBgZmFsc2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkS2VlcEdhcFdoZW5FbXB0eT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJlc2VydmUgdGhlIGxpbmUgcHJlZml4IG9mIHRoZSBjb2RlIGJsb2NrLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXg/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQ3JlYXRlTWFya2Rvd25JbmZvRnJvbU1hdGNoUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwcm94aW1hdGVTZWN0aW9uSW5mbzogTWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb247XG4gIHJlYWRvbmx5IGxpbmVzQmVmb3JlU2VjdGlvbkNvdW50OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5O1xuICByZWFkb25seSBub3RlQ29udGVudDogc3RyaW5nO1xuICByZWFkb25seSBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNvdXJjZUxpbmVzQ291bnQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgdGV4dExpbmVPZmZzZXRzOiBSZWFkb25seU1hcDxudW1iZXIsIG51bWJlcj47XG59XG5cbi8qKlxuICogR2V0cyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYSBjb2RlIGJsb2NrIGluIGEgTWFya2Rvd24gc2VjdGlvbi5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZSBibG9jayBpbiB0aGUgTWFya2Rvd24gc2VjdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvZGVCbG9ja01hcmtkb3duSW5mbyhwYXJhbXM6IEdldENvZGVCbG9ja01hcmtkb3duSW5mb1BhcmFtcyk6IFByb21pc2U8Q29kZUJsb2NrTWFya2Rvd25JbmZvcm1hdGlvbiB8IG51bGw+IHtcbiAgY29uc3QgeyBhcHAsIGN0eCwgZWwsIHNvdXJjZSB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBnZXRGaWxlT3JOdWxsKGFwcCwgY3R4LnNvdXJjZVBhdGgpO1xuICBhc3NlcnROb25OdWxsYWJsZShzb3VyY2VGaWxlLCBgU291cmNlIGZpbGUgJHtjdHguc291cmNlUGF0aH0gbm90IGZvdW5kLmApO1xuXG4gIGF3YWl0IHJlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jKCk7XG4gIGF3YWl0IHNhdmVOb3RlKGFwcCwgc291cmNlRmlsZSk7XG5cbiAgbGV0IG1hcmtkb3duSW5mbzogQ29kZUJsb2NrTWFya2Rvd25JbmZvcm1hdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGF3YWl0IGludm9rZVdpdGhGaWxlU3lzdGVtTG9jayhhcHAsIHNvdXJjZUZpbGUsIChub3RlQ29udGVudCkgPT4ge1xuICAgIGNvbnN0IG5vdGVDb250ZW50TGYgPSBlbnN1cmVMZkVuZGluZ3Mobm90ZUNvbnRlbnQpO1xuXG4gICAgY29uc3QgYXBwcm94aW1hdGVTZWN0aW9uSW5mbzogTWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb24gPSB7XG4gICAgICBsaW5lRW5kOiBub3RlQ29udGVudExmLnNwbGl0KCdcXG4nKS5sZW5ndGggLSAxLFxuICAgICAgbGluZVN0YXJ0OiAwLFxuICAgICAgdGV4dDogbm90ZUNvbnRlbnRMZlxuICAgIH07XG5cbiAgICBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLnRleHQgPSBlbnN1cmVMZkVuZGluZ3MoYXBwcm94aW1hdGVTZWN0aW9uSW5mby50ZXh0KTtcbiAgICBjb25zdCBzb3VyY2VMZiA9IGVuc3VyZUxmRW5kaW5ncyhzb3VyY2UpO1xuXG4gICAgaWYgKCFoYXNTaW5nbGVPY2N1cnJlbmNlKG5vdGVDb250ZW50TGYsIGFwcHJveGltYXRlU2VjdGlvbkluZm8udGV4dCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWN0aW9uT2Zmc2V0ID0gbm90ZUNvbnRlbnRMZi5pbmRleE9mKGFwcHJveGltYXRlU2VjdGlvbkluZm8udGV4dCk7XG4gICAgY29uc3QgbGluZXNCZWZvcmVTZWN0aW9uQ291bnQgPSBub3RlQ29udGVudExmLnNsaWNlKDAsIHNlY3Rpb25PZmZzZXQpLnNwbGl0KCdcXG4nKS5sZW5ndGggLSAxO1xuXG4gICAgY29uc3QgaXNJbkNhbGxvdXQgPSAhIWVsLnBhcmVudEVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucygnY2FsbG91dC1jb250ZW50Jyk7XG5cbiAgICBjb25zdCBsYW5ndWFnZSA9IGdldExhbmd1YWdlRnJvbUVsZW1lbnQoZWwpO1xuICAgIGNvbnN0IHNvdXJjZUxpbmVzID0gc291cmNlTGYuc3BsaXQoJ1xcbicpO1xuXG4gICAgY29uc3QgdGV4dExpbmVzID0gYXBwcm94aW1hdGVTZWN0aW9uSW5mby50ZXh0LnNwbGl0KCdcXG4nKTtcbiAgICBjb25zdCB0ZXh0TGluZU9mZnNldHMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICAgIHRleHRMaW5lT2Zmc2V0cy5zZXQobGluZXNCZWZvcmVTZWN0aW9uQ291bnQsIHNlY3Rpb25PZmZzZXQpO1xuXG4gICAgbGV0IGxhc3RUZXh0TGluZU9mZnNldCA9IHNlY3Rpb25PZmZzZXQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0TGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRleHRMaW5lID0gdGV4dExpbmVzW2ldID8/ICcnO1xuICAgICAgY29uc3QgbGluZU9mZnNldCA9IGxhc3RUZXh0TGluZU9mZnNldCArIHRleHRMaW5lLmxlbmd0aCArIDE7XG4gICAgICB0ZXh0TGluZU9mZnNldHMuc2V0KGxpbmVzQmVmb3JlU2VjdGlvbkNvdW50ICsgaSArIDEsIGxpbmVPZmZzZXQpO1xuICAgICAgbGFzdFRleHRMaW5lT2Zmc2V0ID0gbGluZU9mZnNldDtcbiAgICB9XG5cbiAgICBjb25zdCBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0TGluZXMgPSB0ZXh0TGluZXMubWFwKChsaW5lLCBpbmRleCkgPT4gYXBwcm94aW1hdGVTZWN0aW9uSW5mby5saW5lU3RhcnQgPD0gaW5kZXggJiYgaW5kZXggPD0gYXBwcm94aW1hdGVTZWN0aW9uSW5mby5saW5lRW5kID8gbGluZSA6ICcnKTtcbiAgICBjb25zdCBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0ID0gcG90ZW50aWFsQ29kZUJsb2NrVGV4dExpbmVzLmpvaW4oJ1xcbicpO1xuXG4gICAgY29uc3QgUkVHX0VYUCA9IC8oPzw9XnxcXG4pKD88TGluZVByZWZpeD4gezAsM30oPzo+IHsxLDN9KSopKD88Q29kZUJsb2NrU3RhcnREZWxpbWl0ZXI+KD88Q29kZUJsb2NrU3RhcnREZWxpbWl0ZXJDaGFyPltgfl0pKD86XFxrPENvZGVCbG9ja1N0YXJ0RGVsaW1pdGVyQ2hhcj57Mix9KSkoPzxDb2RlQmxvY2tMYW5ndWFnZT5cXFMqKSg/OlsgXFx0XSg/PENvZGVCbG9ja0FyZ3M+Lio/KSk/KD86XFxuKD88Q29kZUJsb2NrQ29udGVudD4oPzpcXG4/XFxrPExpbmVQcmVmaXg+LiopKz8pKT9cXG5cXGs8TGluZVByZWZpeD4oPzxDb2RlQmxvY2tFbmREZWxpbWl0ZXI+XFxrPENvZGVCbG9ja1N0YXJ0RGVsaW1pdGVyPlxcazxDb2RlQmxvY2tTdGFydERlbGltaXRlckNoYXI+KilbIFxcdF0qKD89XFxufCQpL2c7XG5cbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIHBvdGVudGlhbENvZGVCbG9ja1RleHQubWF0Y2hBbGwoUkVHX0VYUCkpIHtcbiAgICAgIGlmICghaXNTdWl0YWJsZUNvZGVCbG9jayhtYXRjaCwgbGFuZ3VhZ2UsIHNvdXJjZUxmLCBpc0luQ2FsbG91dCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXJrZG93bkluZm8pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBtYXJrZG93bkluZm8gPSBjcmVhdGVNYXJrZG93bkluZm9Gcm9tTWF0Y2goe1xuICAgICAgICBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLFxuICAgICAgICBsaW5lc0JlZm9yZVNlY3Rpb25Db3VudCxcbiAgICAgICAgbWF0Y2gsXG4gICAgICAgIG5vdGVDb250ZW50LFxuICAgICAgICBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0LFxuICAgICAgICBzb3VyY2VMaW5lc0NvdW50OiBzb3VyY2VMaW5lcy5sZW5ndGgsXG4gICAgICAgIHRleHRMaW5lT2Zmc2V0c1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFtYXJrZG93bkluZm8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobm90ZUNvbnRlbnRMZiA9PT0gbm90ZUNvbnRlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsZk9mZnNldE1hcHBlciA9IGdldExmTm9ybWFsaXplZE9mZnNldFRvT3JpZ2luYWxPZmZzZXRNYXBwZXIobm90ZUNvbnRlbnQpO1xuICAgIG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5zdGFydC5vZmZzZXQgPSBsZk9mZnNldE1hcHBlcihtYXJrZG93bkluZm8ucG9zaXRpb25Jbk5vdGUuc3RhcnQub2Zmc2V0KTtcbiAgICBtYXJrZG93bkluZm8ucG9zaXRpb25Jbk5vdGUuZW5kLm9mZnNldCA9IGxmT2Zmc2V0TWFwcGVyKG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5lbmQub2Zmc2V0KTtcbiAgfSk7XG5cbiAgcmV0dXJuIG1hcmtkb3duSW5mbztcbn1cblxuLyoqXG4gKiBJbnNlcnRzIHRleHQgYWZ0ZXIgdGhlIGNvZGUgYmxvY2suXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbi1kZXYtdXRpbHMvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBJbnRlbnRpb25hbGx5IHNoYXJlcyBJbnNlcnRDb2RlQmxvY2tQYXJhbXMgd2l0aCBpbnNlcnRCZWZvcmVDb2RlQmxvY2suXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zZXJ0QWZ0ZXJDb2RlQmxvY2socGFyYW1zOiBJbnNlcnRDb2RlQmxvY2tQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhcHAsIGN0eCwgbGluZU9mZnNldCA9IDAsIHRleHQgfSA9IHBhcmFtcztcblxuICBhd2FpdCBwcm9jZXNzKGFwcCwgY3R4LnNvdXJjZVBhdGgsIGFzeW5jICh7IGNvbnRlbnQgfSkgPT4ge1xuICAgIGNvbnN0IG1hcmtkb3duSW5mbyA9IGF3YWl0IGdldENvZGVCbG9ja01hcmtkb3duSW5mbyhwYXJhbXMpO1xuICAgIGFzc2VydE5vbk51bGxhYmxlKG1hcmtkb3duSW5mbywgJ0NvdWxkIG5vdCB1bmlxdWVseSBpZGVudGlmeSB0aGUgY29kZSBibG9jay4nKTtcblxuICAgIGlmIChjb250ZW50ICE9PSBtYXJrZG93bkluZm8ubm90ZUNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGluc2VydExpbmVJbmRleCA9IG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5lbmQubGluZSArIGxpbmVPZmZzZXQgKyAxO1xuICAgIHJldHVybiBpbnNlcnRUZXh0KGNvbnRlbnQsIGluc2VydExpbmVJbmRleCwgdGV4dCwgcGFyYW1zLnNob3VsZFByZXNlcnZlTGluZVByZWZpeCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEluc2VydHMgdGV4dCBiZWZvcmUgdGhlIGNvZGUgYmxvY2suXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbi1kZXYtdXRpbHMvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBJbnRlbnRpb25hbGx5IHNoYXJlcyBJbnNlcnRDb2RlQmxvY2tQYXJhbXMgd2l0aCBpbnNlcnRBZnRlckNvZGVCbG9jay5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnNlcnRCZWZvcmVDb2RlQmxvY2socGFyYW1zOiBJbnNlcnRDb2RlQmxvY2tQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhcHAsIGN0eCwgbGluZU9mZnNldCA9IDAsIHRleHQgfSA9IHBhcmFtcztcblxuICBhd2FpdCBwcm9jZXNzKGFwcCwgY3R4LnNvdXJjZVBhdGgsIGFzeW5jICh7IGNvbnRlbnQgfSkgPT4ge1xuICAgIGNvbnN0IG1hcmtkb3duSW5mbyA9IGF3YWl0IGdldENvZGVCbG9ja01hcmtkb3duSW5mbyhwYXJhbXMpO1xuICAgIGlmICghbWFya2Rvd25JbmZvKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCB1bmlxdWVseSBpZGVudGlmeSB0aGUgY29kZSBibG9jay4nKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGVudCAhPT0gbWFya2Rvd25JbmZvLm5vdGVDb250ZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBpbnNlcnRMaW5lSW5kZXggPSBtYXJrZG93bkluZm8ucG9zaXRpb25Jbk5vdGUuc3RhcnQubGluZSAtIGxpbmVPZmZzZXQ7XG4gICAgcmV0dXJuIGluc2VydFRleHQoY29udGVudCwgaW5zZXJ0TGluZUluZGV4LCB0ZXh0LCBwYXJhbXMuc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4KTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgY29kZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUNvZGVCbG9jayhwYXJhbXM6IFJlbW92ZUNvZGVCbG9ja1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZXBsYWNlQ29kZUJsb2NrKHtcbiAgICAuLi5wYXJhbXMsXG4gICAgY29kZUJsb2NrUHJvdmlkZXI6ICcnLFxuICAgIHNob3VsZEtlZXBHYXBXaGVuRW1wdHk6IHBhcmFtcy5zaG91bGRLZWVwR2FwID8/IGZhbHNlXG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2VzIHRoZSBjb2RlIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVwbGFjZUNvZGVCbG9jayhwYXJhbXM6IFJlcGxhY2VDb2RlQmxvY2tQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhcHAsIGNvZGVCbG9ja1Byb3ZpZGVyLCBjdHggfSA9IHBhcmFtcztcbiAgcGFyYW1zLmFib3J0U2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGF3YWl0IHByb2Nlc3MoYXBwLCBjdHguc291cmNlUGF0aCwgYXN5bmMgKHsgYWJvcnRTaWduYWwsIGNvbnRlbnQgfSkgPT4ge1xuICAgIGFib3J0U2lnbmFsID0gYWJvcnRTaWduYWxBbnkoYWJvcnRTaWduYWwsIHBhcmFtcy5hYm9ydFNpZ25hbCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBtYXJrZG93bkluZm8gPSBhd2FpdCBnZXRDb2RlQmxvY2tNYXJrZG93bkluZm8ocGFyYW1zKTtcbiAgICBpZiAoIW1hcmtkb3duSW5mbykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGNvZGUgYmxvY2suJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRlbnQgIT09IG1hcmtkb3duSW5mby5ub3RlQ29udGVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IG9sZENvZGVCbG9jayA9IGNvbnRlbnQuc2xpY2UobWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLnN0YXJ0Lm9mZnNldCwgbWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLmVuZC5vZmZzZXQpO1xuICAgIGlmIChwYXJhbXMuc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4KSB7XG4gICAgICBvbGRDb2RlQmxvY2sgPSB1bmluZGVudChvbGRDb2RlQmxvY2ssIG1hcmtkb3duSW5mby5saW5lUHJlZml4KTtcbiAgICB9XG5cbiAgICBsZXQgbmV3Q29kZUJsb2NrID0gYXdhaXQgcmVzb2x2ZVZhbHVlKGNvZGVCbG9ja1Byb3ZpZGVyLCB7IGFib3J0U2lnbmFsLCBjb250ZW50OiBvbGRDb2RlQmxvY2sgfSk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBpZiAoKG5ld0NvZGVCbG9jayB8fCBwYXJhbXMuc2hvdWxkS2VlcEdhcFdoZW5FbXB0eSkgJiYgcGFyYW1zLnNob3VsZFByZXNlcnZlTGluZVByZWZpeCkge1xuICAgICAgbmV3Q29kZUJsb2NrID0gaW5kZW50KG5ld0NvZGVCbG9jaywgbWFya2Rvd25JbmZvLmxpbmVQcmVmaXgpO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCZWZvcmVDb2RlQmxvY2sgPSBjb250ZW50LnNsaWNlKDAsIG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5zdGFydC5vZmZzZXQpO1xuICAgIGNvbnN0IHRleHRBZnRlckNvZGVCbG9jayA9IGNvbnRlbnQuc2xpY2UobWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLmVuZC5vZmZzZXQpO1xuXG4gICAgaWYgKG5ld0NvZGVCbG9jayB8fCBwYXJhbXMuc2hvdWxkS2VlcEdhcFdoZW5FbXB0eSkge1xuICAgICAgcmV0dXJuIGAke3RleHRCZWZvcmVDb2RlQmxvY2t9JHtuZXdDb2RlQmxvY2t9JHt0ZXh0QWZ0ZXJDb2RlQmxvY2t9YDtcbiAgICB9XG5cbiAgICBpZiAoIXRleHRCZWZvcmVDb2RlQmxvY2sgJiYgIXRleHRBZnRlckNvZGVCbG9jaykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmICh0ZXh0QmVmb3JlQ29kZUJsb2NrKSB7XG4gICAgICByZXR1cm4gYCR7dGV4dEJlZm9yZUNvZGVCbG9jay5zbGljZSgwLCAtMSl9JHt0ZXh0QWZ0ZXJDb2RlQmxvY2t9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dGV4dEJlZm9yZUNvZGVCbG9ja30ke3RleHRBZnRlckNvZGVCbG9jay5zbGljZSgxKX1gO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFya2Rvd25JbmZvRnJvbU1hdGNoKHBhcmFtczogQ3JlYXRlTWFya2Rvd25JbmZvRnJvbU1hdGNoUGFyYW1zKTogQ29kZUJsb2NrTWFya2Rvd25JbmZvcm1hdGlvbiB7XG4gIGNvbnN0IHtcbiAgICBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLFxuICAgIGxpbmVzQmVmb3JlU2VjdGlvbkNvdW50LFxuICAgIG1hdGNoLFxuICAgIG5vdGVDb250ZW50LFxuICAgIHBvdGVudGlhbENvZGVCbG9ja1RleHQsXG4gICAgc291cmNlTGluZXNDb3VudCxcbiAgICB0ZXh0TGluZU9mZnNldHNcbiAgfSA9IHBhcmFtcztcblxuICBjb25zdCBsaW5lUHJlZml4ID0gbWF0Y2guZ3JvdXBzPy5bJ0xpbmVQcmVmaXgnXSA/PyAnJztcbiAgY29uc3QgY29kZUJsb2NrU3RhcnREZWxpbWl0ZXIgPSBtYXRjaC5ncm91cHM/LlsnQ29kZUJsb2NrU3RhcnREZWxpbWl0ZXInXSA/PyAnJztcbiAgY29uc3QgY29kZUJsb2NrRW5kRGVsaW1pdGVyID0gbWF0Y2guZ3JvdXBzPy5bJ0NvZGVCbG9ja0VuZERlbGltaXRlciddID8/ICcnO1xuICBjb25zdCBjb2RlQmxvY2tBcmdzU3RyID0gbWF0Y2guZ3JvdXBzPy5bJ0NvZGVCbG9ja0FyZ3MnXSA/PyAnJztcbiAgY29uc3QgbGFuZ3VhZ2UgPSBtYXRjaC5ncm91cHM/LlsnQ29kZUJsb2NrTGFuZ3VhZ2UnXSA/PyAnJztcblxuICBjb25zdCBwcmV2aW91c1RleHQgPSBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0LnNsaWNlKDAsIG1hdGNoLmluZGV4KTtcbiAgY29uc3QgcHJldmlvdXNUZXh0TGluZXNDb3VudCA9IHByZXZpb3VzVGV4dC5zcGxpdCgnXFxuJykubGVuZ3RoIC0gMTtcblxuICBjb25zdCBzdGFydExpbmUgPSBsaW5lc0JlZm9yZVNlY3Rpb25Db3VudCArIHByZXZpb3VzVGV4dExpbmVzQ291bnQ7XG4gIGNvbnN0IGVuZExpbmUgPSBzdGFydExpbmUgKyBzb3VyY2VMaW5lc0NvdW50ICsgMTtcblxuICByZXR1cm4ge1xuICAgIGFyZ3M6IGNvZGVCbG9ja0FyZ3NTdHIuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbiksXG4gICAgZW5kRGVsaW1pdGVyOiBjb2RlQmxvY2tFbmREZWxpbWl0ZXIsXG4gICAgbGFuZ3VhZ2UsXG4gICAgbGluZVByZWZpeCxcbiAgICBub3RlQ29udGVudCxcbiAgICBwb3NpdGlvbkluTm90ZToge1xuICAgICAgZW5kOiB7XG4gICAgICAgIGNvbDogKHRleHRMaW5lT2Zmc2V0cy5nZXQoZW5kTGluZSArIDEpID8/IDApIC0gKHRleHRMaW5lT2Zmc2V0cy5nZXQoZW5kTGluZSkgPz8gMCkgLSAxLFxuICAgICAgICBsaW5lOiBlbmRMaW5lLFxuICAgICAgICBvZmZzZXQ6ICh0ZXh0TGluZU9mZnNldHMuZ2V0KGVuZExpbmUgKyAxKSA/PyAwKSAtIDFcbiAgICAgIH0sXG4gICAgICBzdGFydDoge1xuICAgICAgICBjb2w6IDAsXG4gICAgICAgIGxpbmU6IHN0YXJ0TGluZSxcbiAgICAgICAgb2Zmc2V0OiB0ZXh0TGluZU9mZnNldHMuZ2V0KHN0YXJ0TGluZSkgPz8gMFxuICAgICAgfVxuICAgIH0sXG4gICAgcmF3QXJnc1N0cjogY29kZUJsb2NrQXJnc1N0cixcbiAgICBzZWN0aW9uSW5mbzoge1xuICAgICAgbGluZUVuZDogcHJldmlvdXNUZXh0TGluZXNDb3VudCArIHNvdXJjZUxpbmVzQ291bnQgKyAxLFxuICAgICAgbGluZVN0YXJ0OiBwcmV2aW91c1RleHRMaW5lc0NvdW50LFxuICAgICAgdGV4dDogYXBwcm94aW1hdGVTZWN0aW9uSW5mby50ZXh0XG4gICAgfSxcbiAgICBzdGFydERlbGltaXRlcjogY29kZUJsb2NrU3RhcnREZWxpbWl0ZXJcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0TGFuZ3VhZ2VGcm9tRWxlbWVudChlbDogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xuICBjb25zdCBCTE9DS19MQU5HVUFHRV9QUkVGSVggPSAnYmxvY2stbGFuZ3VhZ2UtJztcbiAgcmV0dXJuIEFycmF5LmZyb20oZWwuY2xhc3NMaXN0KS5maW5kKChjbHMpID0+IGNscy5zdGFydHNXaXRoKEJMT0NLX0xBTkdVQUdFX1BSRUZJWCkpPy5zbGljZShCTE9DS19MQU5HVUFHRV9QUkVGSVgubGVuZ3RoKSA/PyAnJztcbn1cblxuZnVuY3Rpb24gaW5zZXJ0VGV4dChjb250ZW50OiBzdHJpbmcsIGluc2VydExpbmVJbmRleDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcsIHNob3VsZFByZXNlcnZlTGluZVByZWZpeD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBuZXdMaW5lcyA9IGxpbmVzLnNsaWNlKCk7XG4gIGNvbnN0IHRleHRMaW5lcyA9IHRleHQuc3BsaXQoJ1xcbicpO1xuXG4gIGlmIChpbnNlcnRMaW5lSW5kZXggPCAwKSB7XG4gICAgaW5zZXJ0TGluZUluZGV4ID0gMDtcbiAgfVxuICBpZiAoaW5zZXJ0TGluZUluZGV4ID4gbGluZXMubGVuZ3RoKSB7XG4gICAgaW5zZXJ0TGluZUluZGV4ID0gbGluZXMubGVuZ3RoO1xuICB9XG5cbiAgY29uc3QgUFJFRklYX0xJTkVfUkVHX0VYUCA9IC9eIHswLDN9KD86PiB7MSwzfSkqL2c7XG4gIGNvbnN0IG1hdGNoID0gKGxpbmVzW2luc2VydExpbmVJbmRleF0gPz8gJycpLm1hdGNoKFBSRUZJWF9MSU5FX1JFR19FWFApO1xuICBjb25zdCBsaW5lUHJlZml4ID0gbWF0Y2g/LlswXSA/PyAnJztcbiAgbmV3TGluZXMuc3BsaWNlKGluc2VydExpbmVJbmRleCwgMCwgLi4uKHNob3VsZFByZXNlcnZlTGluZVByZWZpeCA/IHRleHRMaW5lcy5tYXAoKGxpbmUpID0+IGluZGVudChsaW5lLCBsaW5lUHJlZml4KSkgOiB0ZXh0TGluZXMpKTtcbiAgcmV0dXJuIG5ld0xpbmVzLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBpc1N1aXRhYmxlQ29kZUJsb2NrKFxuICBtYXRjaDogUmVnRXhwTWF0Y2hBcnJheSxcbiAgbGFuZ3VhZ2U6IHN0cmluZyxcbiAgc291cmNlTGY6IHN0cmluZyxcbiAgaXNJbkNhbGxvdXQ6IGJvb2xlYW5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBjb2RlQmxvY2tMYW5ndWFnZSA9IG1hdGNoLmdyb3Vwcz8uWydDb2RlQmxvY2tMYW5ndWFnZSddID8/ICcnO1xuICBpZiAoY29kZUJsb2NrTGFuZ3VhZ2UgIT09IGxhbmd1YWdlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbGluZVByZWZpeCA9IG1hdGNoLmdyb3Vwcz8uWydMaW5lUHJlZml4J10gPz8gJyc7XG5cbiAgaWYgKGlzSW5DYWxsb3V0ICYmICFsaW5lUHJlZml4LmluY2x1ZGVzKCc+ICcpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY29kZUJsb2NrQ29udGVudCA9IG1hdGNoLmdyb3Vwcz8uWydDb2RlQmxvY2tDb250ZW50J10gPz8gJyc7XG4gIGNvbnN0IGNsZWFuQ29kZUJsb2NrQ29udGVudCA9IGNvZGVCbG9ja0NvbnRlbnQuc3BsaXQoJ1xcbicpLm1hcCgobGluZSkgPT4gbGluZS5zbGljZShsaW5lUHJlZml4Lmxlbmd0aCkpLmpvaW4oJ1xcbicpO1xuXG4gIHJldHVybiBjbGVhbkNvZGVCbG9ja0NvbnRlbnQgPT09IHNvdXJjZUxmO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFrQkEsOEJBQStCO0FBQy9CLG1CQUEyQztBQUMzQyxvQkFNTztBQUNQLHlCQUFrQztBQUNsQyw0QkFBNkI7QUFDN0IseUJBQThCO0FBQzlCLG1CQUlPO0FBa0dQLGVBQXNCLHlCQUF5QixRQUFzRjtBQUNuSSxRQUFNLEVBQUUsS0FBSyxLQUFLLElBQUksT0FBTyxJQUFJO0FBRWpDLFFBQU0saUJBQWEsa0NBQWMsS0FBSyxJQUFJLFVBQVU7QUFDcEQsNENBQWtCLFlBQVksZUFBZSxJQUFJLFVBQVUsYUFBYTtBQUV4RSxZQUFNLHlDQUEyQjtBQUNqQyxZQUFNLHVCQUFTLEtBQUssVUFBVTtBQUU5QixNQUFJLGVBQW9EO0FBRXhELFlBQU0sdUNBQXlCLEtBQUssWUFBWSxDQUFDLGdCQUFnQjtBQUMvRCxVQUFNLG9CQUFnQiwrQkFBZ0IsV0FBVztBQUVqRCxVQUFNLHlCQUFxRDtBQUFBLE1BQ3pELFNBQVMsY0FBYyxNQUFNLElBQUksRUFBRSxTQUFTO0FBQUEsTUFDNUMsV0FBVztBQUFBLE1BQ1gsTUFBTTtBQUFBLElBQ1I7QUFFQSwyQkFBdUIsV0FBTywrQkFBZ0IsdUJBQXVCLElBQUk7QUFDekUsVUFBTSxlQUFXLCtCQUFnQixNQUFNO0FBRXZDLFFBQUksS0FBQyxtQ0FBb0IsZUFBZSx1QkFBdUIsSUFBSSxHQUFHO0FBQ3BFO0FBQUEsSUFDRjtB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