valyrian.js 7.2.11 → 7.2.12

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 (64) hide show
  1. package/dist/dataset/index.d.ts +2 -2
  2. package/dist/dataset/index.d.ts.map +1 -1
  3. package/dist/dataset/index.js +21 -21
  4. package/dist/dataset/index.js.map +2 -2
  5. package/dist/dataset/index.mjs +22 -22
  6. package/dist/dataset/index.mjs.map +2 -2
  7. package/dist/hooks/index.d.ts.map +1 -1
  8. package/dist/hooks/index.js +17 -32
  9. package/dist/hooks/index.js.map +3 -3
  10. package/dist/hooks/index.mjs +17 -32
  11. package/dist/hooks/index.mjs.map +3 -3
  12. package/dist/index.d.ts +49 -53
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +378 -326
  15. package/dist/index.js.map +3 -3
  16. package/dist/index.min.js +1 -1
  17. package/dist/index.min.js.map +1 -1
  18. package/dist/index.mjs +378 -326
  19. package/dist/index.mjs.map +3 -3
  20. package/dist/node/index.js +101 -78
  21. package/dist/node/index.js.map +2 -2
  22. package/dist/node/index.mjs +101 -78
  23. package/dist/node/index.mjs.map +2 -2
  24. package/dist/node/utils/tree-adapter.d.ts +5 -0
  25. package/dist/node/utils/tree-adapter.d.ts.map +1 -1
  26. package/dist/proxy-signal/index.js +10 -10
  27. package/dist/proxy-signal/index.js.map +2 -2
  28. package/dist/proxy-signal/index.mjs +10 -10
  29. package/dist/proxy-signal/index.mjs.map +2 -2
  30. package/dist/request/index.js +16 -16
  31. package/dist/request/index.js.map +2 -2
  32. package/dist/request/index.mjs +16 -16
  33. package/dist/request/index.mjs.map +2 -2
  34. package/dist/router/index.d.ts.map +1 -1
  35. package/dist/router/index.js +21 -20
  36. package/dist/router/index.js.map +2 -2
  37. package/dist/router/index.mjs +21 -20
  38. package/dist/router/index.mjs.map +2 -2
  39. package/dist/signal/index.d.ts +7 -18
  40. package/dist/signal/index.d.ts.map +1 -1
  41. package/dist/signal/index.js +29 -48
  42. package/dist/signal/index.js.map +3 -3
  43. package/dist/signal/index.mjs +31 -50
  44. package/dist/signal/index.mjs.map +3 -3
  45. package/dist/store/index.js +2 -2
  46. package/dist/store/index.js.map +2 -2
  47. package/dist/store/index.mjs +2 -2
  48. package/dist/store/index.mjs.map +2 -2
  49. package/lib/dataset/index.ts +25 -25
  50. package/lib/hooks/index.ts +25 -54
  51. package/lib/index.ts +465 -715
  52. package/lib/node/index.ts +2 -2
  53. package/lib/node/utils/icons.ts +5 -5
  54. package/lib/node/utils/inline.ts +17 -17
  55. package/lib/node/utils/sw.ts +3 -3
  56. package/lib/node/utils/tree-adapter.ts +81 -52
  57. package/lib/proxy-signal/index.ts +10 -10
  58. package/lib/request/index.ts +16 -16
  59. package/lib/router/index.ts +21 -20
  60. package/lib/signal/index.ts +56 -131
  61. package/lib/store/index.ts +2 -2
  62. package/package.json +10 -3
  63. package/lib/index.d.ts +0 -0
  64. package/lib/interfaces.ts.bak +0 -141
@@ -1 +1 @@
1
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0ZXh0VGFnIiwiaXNOb2RlSnMiLCJCb29sZWFuIiwicHJvY2VzcyIsInZlcnNpb25zIiwibm9kZSIsImNyZWF0ZURvbUVsZW1lbnQiLCJ0YWciLCJpc1NWRyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudE5TIiwiY3JlYXRlRWxlbWVudCIsIlZub2RlIiwicHJvcHMiLCJjaGlsZHJlbiIsInRoaXMiLCJpc0NvbXBvbmVudCIsImNvbXBvbmVudCIsImlzVm5vZGUiLCJvYmplY3QiLCJpc1Zub2RlQ29tcG9uZW50IiwiZG9tVG9Wbm9kZSIsImRvbSIsIm5vZGVUeXBlIiwidm5vZGUiLCJub2RlVmFsdWUiLCJpIiwibCIsImNoaWxkTm9kZXMiLCJsZW5ndGgiLCJjaGlsZERvbSIsInB1c2giLCJhdHRyaWJ1dGVzIiwiYXR0ciIsIm5vZGVOYW1lIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwidHJ1c3QiLCJodG1sU3RyaW5nIiwiZGl2IiwiaW5uZXJIVE1MIiwidHJpbSIsIm1hcCIsImNhbGwiLCJpdGVtIiwibWFpbkNvbXBvbmVudCIsIm1haW5Wbm9kZSIsImlzTW91bnRlZCIsImN1cnJlbnQiLCJvbGRWbm9kZSIsImV2ZW50IiwicmVzZXJ2ZWRQcm9wcyIsImtleSIsInN0YXRlIiwib25DbGVhbnVwU2V0IiwiU2V0Iiwib25Nb3VudFNldCIsIm9uVXBkYXRlU2V0Iiwib25Vbm1vdW50U2V0Iiwib25DbGVhbnVwIiwiY2FsbGJhY2siLCJhZGQiLCJjYWxsU2V0Iiwic2V0IiwiY2xlYXIiLCJldmVudExpc3RlbmVyTmFtZXMiLCJldmVudExpc3RlbmVyIiwiZSIsInRhcmdldCIsIm5hbWUiLCJ0eXBlIiwiZGVmYXVsdFByZXZlbnRlZCIsInVwZGF0ZSIsInBhcmVudE5vZGUiLCJoaWRlRGlyZWN0aXZlIiwidGVzdCIsImJvb2wiLCJvbGRub2RlIiwibmV3ZG9tIiwiY3JlYXRlVGV4dE5vZGUiLCJyZXBsYWNlQ2hpbGQiLCJkaXJlY3RpdmVzIiwibmV3Q2hpbGRyZW4iLCJzdHlsZSIsImRpc3BsYXkiLCJjbGFzc2VzIiwiY2xhc3NMaXN0IiwidG9nZ2xlIiwiaHRtbCIsIm1vZGVsIiwicHJvcGVydHkiLCJ2YWx1ZSIsImhhbmRsZXIiLCJBcnJheSIsImlzQXJyYXkiLCJ2YWwiLCJpZHgiLCJpbmRleE9mIiwic3BsaWNlIiwic2hhcmVkU2V0QXR0cmlidXRlIiwibXVsdGlwbGUiLCJjdHJsS2V5IiwiZm9yRWFjaCIsImNoaWxkIiwiam9pbiIsInNlbGVjdGVkIiwicHJldkhhbmRsZXIiLCJjbGVhbnVwIiwibmV3Vm5vZGUiLCJhZGRFdmVudExpc3RlbmVyIiwic2xpY2UiLCJyZW1vdmVBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJ1cGRhdGVBdHRyaWJ1dGVzIiwicGF0Y2giLCJ0ZXh0Q29udGVudCIsIm5ld1RyZWUiLCJvbGRUcmVlIiwib2xkVHJlZUxlbmd0aCIsIm5ld1RyZWVMZW5ndGgiLCJvbGRLZXllZExpc3QiLCJuZXdLZXllZExpc3QiLCJuZXdDaGlsZCIsIm9sZENoaWxkIiwic2hvdWxkUGF0Y2giLCJhcHBlbmRDaGlsZCIsInJlbW92ZUNoaWxkIiwidmlldyIsImJpbmQiLCJvbGRNYWluVm5vZGUiLCJ1bm1vdW50IiwicmVzdWx0IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIlJlZmxlY3QiLCJkZWxldGVQcm9wZXJ0eSIsInYiLCJ0YWdPckNvbXBvbmVudCIsImZyYWdtZW50IiwiXyIsImRpcmVjdGl2ZSIsImRpcmVjdGl2ZU5hbWUiLCJjb250YWluZXIiLCJxdWVyeVNlbGVjdG9yQWxsIiwidm5vZGVDb21wb25lbnQiXSwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbi8qIGVzbGludC1kaXNhYmxlIGluZGVudCAqL1xuLyogZXNsaW50LWRpc2FibGUgc29uYXJqcy9jb2duaXRpdmUtY29tcGxleGl0eSAqL1xuLyogZXNsaW50LWRpc2FibGUgY29tcGxleGl0eSAqL1xuXG5pbnRlcmZhY2UgRGVmYXVsdFJlY29yZCBleHRlbmRzIFJlY29yZDxzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIGFueT4ge31cblxuLy8gVGhlIFZub2RlUHJvcGVydGllcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBhIHZpcnR1YWwgbm9kZS5cbmV4cG9ydCBpbnRlcmZhY2UgVm5vZGVQcm9wZXJ0aWVzIGV4dGVuZHMgRGVmYXVsdFJlY29yZCB7XG4gIC8vIEEgdW5pcXVlIGtleSBmb3IgdGhlIHZpcnR1YWwgbm9kZSwgd2hpY2ggY2FuIGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyLlxuICAvLyBUaGlzIGlzIHVzZWZ1bCBmb3Igb3B0aW1pemluZyB1cGRhdGVzIGluIGEgbGlzdCBvZiBub2Rlcy5cbiAga2V5Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAvLyBBIHN0YXRlIG9iamVjdCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmlydHVhbCBub2RlLlxuICBzdGF0ZT86IGFueTtcbn1cblxuLy8gVGhlIERvbUVsZW1lbnQgaW50ZXJmYWNlIGV4dGVuZHMgdGhlIEVsZW1lbnQgaW50ZXJmYWNlIHdpdGggYW4gaW5kZXggc2lnbmF0dXJlLlxuLy8gVGhpcyBhbGxvd3MgZm9yIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gRE9NIGVsZW1lbnRzLlxuZXhwb3J0IGludGVyZmFjZSBEb21FbGVtZW50IGV4dGVuZHMgRWxlbWVudCwgRGVmYXVsdFJlY29yZCB7fVxuXG4vLyBUaGUgVm5vZGVJbnRlcmZhY2UgcmVwcmVzZW50cyBhIHZpcnR1YWwgbm9kZS4gSXQgaGFzIGEgbnVtYmVyIG9mIG9wdGlvbmFsIGZpZWxkcyxcbi8vIGluY2x1ZGluZyBhIHRhZywgcHJvcHMsIGNoaWxkcmVuLCBhbmQgYSBET00gZWxlbWVudC5cbmV4cG9ydCBpbnRlcmZhY2UgVm5vZGVJbnRlcmZhY2UgZXh0ZW5kcyBEZWZhdWx0UmVjb3JkIHtcbiAgLy8gVGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdmlydHVhbCBub2RlLiBJdCB0YWtlcyBhIHRhZywgcHJvcHMsIGFuZCBjaGlsZHJlbiBhcyBhcmd1bWVudHMuXG4gIC8vIFRoZSB0YWcgY2FuIGJlIGEgc3RyaW5nLCBhIGNvbXBvbmVudCwgb3IgYSBQT0pPIGNvbXBvbmVudC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIG5ldyAodGFnOiBzdHJpbmcgfCBDb21wb25lbnQgfCBQT0pPQ29tcG9uZW50LCBwcm9wczogVm5vZGVQcm9wZXJ0aWVzLCBjaGlsZHJlbjogQ2hpbGRyZW4pOiBWbm9kZUludGVyZmFjZTtcbiAgLy8gVGhlIHRhZyBmb3IgdGhlIHZpcnR1YWwgbm9kZS4gSXQgY2FuIGJlIGEgc3RyaW5nLCBhIGNvbXBvbmVudCwgb3IgYSBQT0pPIGNvbXBvbmVudC5cbiAgdGFnOiBzdHJpbmcgfCBDb21wb25lbnQgfCBQT0pPQ29tcG9uZW50O1xuICAvLyBUaGUgcHJvcHMgZm9yIHRoZSB2aXJ0dWFsIG5vZGUuXG4gIHByb3BzOiBWbm9kZVByb3BlcnRpZXM7XG4gIC8vIFRoZSBjaGlsZHJlbiBmb3IgdGhlIHZpcnR1YWwgbm9kZS5cbiAgY2hpbGRyZW46IENoaWxkcmVuO1xuICAvLyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2aXJ0dWFsIG5vZGUgaXMgYW4gU1ZHIGVsZW1lbnQuXG4gIGlzU1ZHPzogYm9vbGVhbjtcbiAgLy8gVGhlIERPTSBlbGVtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHZpcnR1YWwgbm9kZS5cbiAgZG9tPzogRG9tRWxlbWVudDtcbiAgLy8gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgdmlydHVhbCBub2RlIGhhcyBiZWVuIHByb2Nlc3NlZCBpbiB0aGUga2V5ZWQgZGlmZmluZyBhbGdvcml0aG0uXG4gIHByb2Nlc3NlZD86IGJvb2xlYW47XG59XG5cbi8vIFRoZSBWbm9kZVdpdGhEb20gaW50ZXJmYWNlIHJlcHJlc2VudHMgYSB2aXJ0dWFsIG5vZGUgdGhhdCBoYXMgYSBET00gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggaXQuXG5leHBvcnQgaW50ZXJmYWNlIFZub2RlV2l0aERvbSBleHRlbmRzIFZub2RlSW50ZXJmYWNlIHtcbiAgZG9tOiBEb21FbGVtZW50O1xufVxuXG4vLyBUaGUgQ29tcG9uZW50IGludGVyZmFjZSByZXByZXNlbnRzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgdmlydHVhbCBub2RlIG9yIGEgbGlzdCBvZiB2aXJ0dWFsIG5vZGVzLlxuLy8gSXQgY2FuIGFsc28gaGF2ZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudCBleHRlbmRzIERlZmF1bHRSZWNvcmQge1xuICAvLyBUaGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgdmlydHVhbCBub2RlIG9yIGEgbGlzdCBvZiB2aXJ0dWFsIG5vZGVzLlxuICAvLyBJdCBjYW4gdGFrZSBwcm9wcyBhbmQgY2hpbGRyZW4gYXMgYXJndW1lbnRzLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgKHByb3BzPzogVm5vZGVQcm9wZXJ0aWVzIHwgbnVsbCwgLi4uY2hpbGRyZW46IGFueVtdKTogVm5vZGVJbnRlcmZhY2UgfCBDaGlsZHJlbiB8IGFueTtcbn1cblxuLy8gVGhlIFBPSk9Db21wb25lbnQgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBcInBsYWluIG9sZCBKYXZhU2NyaXB0IG9iamVjdFwiIChQT0pPKSBjb21wb25lbnQuXG4vLyBJdCBoYXMgYSB2aWV3IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHZpcnR1YWwgbm9kZSBvciBhIGxpc3Qgb2YgdmlydHVhbCBub2Rlcyxcbi8vIGFzIHdlbGwgYXMgb3B0aW9uYWwgcHJvcHMgYW5kIGNoaWxkcmVuLlxuLy8gSXQgY2FuIGJlIHVzZWQgYWxzbyB0byBpZGVudGlmeSBjbGFzcyBpbnN0YW5jZSBjb21wb25lbnRzLlxuZXhwb3J0IGludGVyZmFjZSBQT0pPQ29tcG9uZW50IGV4dGVuZHMgRGVmYXVsdFJlY29yZCB7XG4gIC8vIFRoZSB2aWV3IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHZpcnR1YWwgbm9kZSBvciBhIGxpc3Qgb2YgdmlydHVhbCBub2Rlcy5cbiAgdmlldzogQ29tcG9uZW50O1xuICAvLyBUaGUgcHJvcHMgZm9yIHRoZSBjb21wb25lbnQuXG4gIHByb3BzPzogVm5vZGVQcm9wZXJ0aWVzIHwgbnVsbDtcbiAgLy8gVGhlIGNoaWxkcmVuIGZvciB0aGUgY29tcG9uZW50LlxuICBjaGlsZHJlbj86IGFueVtdO1xufVxuXG4vLyBUaGUgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgcmVwcmVzZW50cyBhIHZpcnR1YWwgbm9kZSB0aGF0IGhhcyBhIGNvbXBvbmVudCBhcyBpdHMgdGFnLlxuLy8gSXQgaGFzIHByb3BzIGFuZCBjaGlsZHJlbiwganVzdCBsaWtlIGEgcmVndWxhciB2aXJ0dWFsIG5vZGUuXG5leHBvcnQgaW50ZXJmYWNlIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlIGV4dGVuZHMgVm5vZGVJbnRlcmZhY2Uge1xuICB0YWc6IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQ7XG4gIHByb3BzOiBWbm9kZVByb3BlcnRpZXM7XG4gIGNoaWxkcmVuOiBDaGlsZHJlbjtcbn1cblxuLy8gVGhlIENoaWxkcmVuIGludGVyZmFjZSByZXByZXNlbnRzIGEgbGlzdCBvZiB2aXJ0dWFsIG5vZGVzIG9yIG90aGVyIHZhbHVlcy5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbGRyZW4gZXh0ZW5kcyBBcnJheTxWbm9kZUludGVyZmFjZSB8IFZub2RlQ29tcG9uZW50SW50ZXJmYWNlIHwgYW55PiB7fVxuXG4vLyBUaGUgRGlyZWN0aXZlIGludGVyZmFjZSByZXByZXNlbnRzIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIHZpcnR1YWwgbm9kZS5cbi8vIEl0IHJlY2VpdmVzIHRoZSB2YWx1ZSwgdmlydHVhbCBub2RlLCBhbmQgb2xkIHZpcnR1YWwgbm9kZSBhcyBhcmd1bWVudHMsIGFuZCBjYW4gcmV0dXJuIGEgYm9vbGVhbiB2YWx1ZS5cbi8vIElmIG9ubHkgdGhlIHZpcnR1YWwgbm9kZSBpcyBwYXNzZWQsIGl0IG1lYW5zIGl0cyB0aGUgb24gY3JlYXRlIHBoYXNlIGZvciB0aGUgdi1ub2RlLlxuLy8gSWYgdGhlIG9sZCB2aXJ0dWFsIG5vZGUgaXMgYWxzbyBwYXNzZWQsIGl0IG1lYW5zIGl0cyB0aGUgb24gdXBkYXRlIHBoYXNlIGZvciB0aGUgdi1ub2RlLlxuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmUge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgKHZhbHVlOiBhbnksIHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB8IGJvb2xlYW47XG59XG5cbi8vIFRoZSBEaXJlY3RpdmVzIGludGVyZmFjZSBpcyBhIG1hcHBpbmcgb2YgZGlyZWN0aXZlIG5hbWVzIHRvIERpcmVjdGl2ZSBmdW5jdGlvbnMuXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBEaXJlY3RpdmU+IHt9XG5cbi8vIFRoZSBSZXNlcnZlZFByb3BzIGludGVyZmFjZSBpcyBhIG1hcHBpbmcgb2YgcmVzZXJ2ZWQgcHJvcCBuYW1lcyB0byB0aGUgdmFsdWUgYHRydWVgLlxuLy8gVGhlc2UgcHJvcCBuYW1lcyBjYW5ub3QgYmUgdXNlZCBhcyBjdXN0b20gcHJvcCBuYW1lcy5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzZXJ2ZWRQcm9wcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHRydWU+IHt9XG5cbi8vIFRoZSBDdXJyZW50IGludGVyZmFjZSByZXByZXNlbnRzIHRoZSBjdXJyZW50IGNvbXBvbmVudCBhbmQgdmlydHVhbCBub2RlIHRoYXQgYXJlIGJlaW5nIHByb2Nlc3NlZC5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VycmVudCB7XG4gIC8vIFRoZSBjdXJyZW50IGNvbXBvbmVudC4gSXQgY2FuIGJlIGEgY29tcG9uZW50LCBhIFBPSk8gY29tcG9uZW50LCBvciBudWxsLlxuICBjb21wb25lbnQ6IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQgfCBudWxsO1xuICAvLyBUaGUgY3VycmVudCB2aXJ0dWFsIG5vZGUuIEl0IG11c3QgaGF2ZSBhIERPTSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBpdC5cbiAgdm5vZGU6IFZub2RlV2l0aERvbSB8IG51bGw7XG4gIC8vIFRoZSBvbGQgdmlydHVhbCBub2RlLiBJdCBtdXN0IGhhdmUgYSBET00gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggaXQuXG4gIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tIHwgbnVsbDtcbiAgLy8gVGhlIGN1cnJlbnQgZXZlbnQuIEl0IGNhbiBiZSBhbiBldmVudCBvciBudWxsLlxuICBldmVudDogRXZlbnQgfCBudWxsO1xufVxuXG4vLyBUaGUgViBmdW5jdGlvbiBpcyB0aGUgbWFpbiBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgdmlydHVhbCBub2Rlcy5cbi8vIEl0IHRha2VzIGEgdGFnIG9yIGNvbXBvbmVudCwgcHJvcHMsIGFuZCBjaGlsZHJlbiBhcyBhcmd1bWVudHMsIGFuZCByZXR1cm5zIGEgdmlydHVhbCBub2RlLlxuZXhwb3J0IGludGVyZmFjZSBWIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzLCBuby11c2UtYmVmb3JlLWRlZmluZVxuICAodGFnT3JDb21wb25lbnQ6IHN0cmluZyB8IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQsIHByb3BzOiBWbm9kZVByb3BlcnRpZXMgfCBudWxsLCAuLi5jaGlsZHJlbjogQ2hpbGRyZW4pOlxuICAgIHwgVm5vZGVJbnRlcmZhY2VcbiAgICB8IFZub2RlQ29tcG9uZW50SW50ZXJmYWNlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMsIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIGZyYWdtZW50KF86IGFueSwgLi4uY2hpbGRyZW46IENoaWxkcmVuKTogQ2hpbGRyZW47XG59XG5cbi8vICd0ZXh0VGFnJyBpcyBhIGNvbnN0YW50IHN0cmluZyB0aGF0IGlzIHVzZWQgdG8gcmVwcmVzZW50IHRleHQgbm9kZXMgaW4gdGhlIHZpcnR1YWwgRE9NLlxuY29uc3QgdGV4dFRhZyA9IFwiI3RleHRcIjtcblxuLy8gJ2lzTm9kZUpzJyBpcyBhIGJvb2xlYW4gdGhhdCBpcyB0cnVlIGlmIHRoZSBjb2RlIGlzIHJ1bm5pbmcgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50IGFuZCBmYWxzZSBvdGhlcndpc2UuXG4vLyBJdCBpcyBkZXRlcm1pbmVkIGJ5IGNoZWNraW5nIGlmIHRoZSAncHJvY2VzcycgZ2xvYmFsIG9iamVjdCBpcyBkZWZpbmVkIGFuZCBoYXMgYSAndmVyc2lvbnMnIHByb3BlcnR5LlxuZXhwb3J0IGxldCBpc05vZGVKcyA9IEJvb2xlYW4odHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy52ZXJzaW9ucyAmJiBwcm9jZXNzLnZlcnNpb25zLm5vZGUpO1xuXG4vLyAnY3JlYXRlRG9tRWxlbWVudCcgaXMgYSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBuZXcgRE9NIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHRhZyBuYW1lLlxuLy8gSWYgJ2lzU1ZHJyBpcyB0cnVlLCBpdCBjcmVhdGVzIGFuIFNWRyBlbGVtZW50IGluc3RlYWQgb2YgYSByZWd1bGFyIERPTSBlbGVtZW50LlxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURvbUVsZW1lbnQodGFnOiBzdHJpbmcsIGlzU1ZHOiBib29sZWFuID0gZmFsc2UpOiBEb21FbGVtZW50IHtcbiAgcmV0dXJuIGlzU1ZHID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgdGFnKSA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcbn1cblxuLy8gJ1Zub2RlJyBpcyBhIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIHZpcnR1YWwgRE9NIG5vZGUuXG4vLyBJdCBoYXMgdGhyZWUgcHJvcGVydGllczogJ3RhZycsICdwcm9wcycsIGFuZCAnY2hpbGRyZW4nLlxuLy8gJ1Zub2RlJyBpcyBleHBvcnRlZCBhcyBhbiBvYmplY3Qgd2l0aCBhIHR5cGUgb2YgJ1Zub2RlSW50ZXJmYWNlJy5cbi8vIFRoZSAnYXMgdW5rbm93biBhcyBWbm9kZUludGVyZmFjZScgaXMgdXNlZCB0byB0ZWxsIFR5cGVTY3JpcHQgdGhhdCB0aGUgJ1Zub2RlJyBmdW5jdGlvbiBoYXMgdGhlIHNhbWUgdHlwZSBhcyAnVm5vZGVJbnRlcmZhY2UnLlxuZXhwb3J0IGNvbnN0IFZub2RlID0gZnVuY3Rpb24gVm5vZGUodGhpczogVm5vZGVJbnRlcmZhY2UsIHRhZzogc3RyaW5nLCBwcm9wczogVm5vZGVQcm9wZXJ0aWVzLCBjaGlsZHJlbjogQ2hpbGRyZW4pIHtcbiAgLy8gJ3RoaXMnIHJlZmVycyB0byB0aGUgY3VycmVudCBpbnN0YW5jZSBvZiAnVm5vZGUnLlxuICB0aGlzLnRhZyA9IHRhZztcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG59IGFzIHVua25vd24gYXMgVm5vZGVJbnRlcmZhY2U7XG5cbi8vICdpc0NvbXBvbmVudCcgaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gJ2NvbXBvbmVudCcgaXMgYSB2YWxpZCBjb21wb25lbnQgYW5kIGZhbHNlIG90aGVyd2lzZS5cbi8vIEEgY29tcG9uZW50IGlzIGVpdGhlciBhIGZ1bmN0aW9uIG9yIGFuIG9iamVjdCB3aXRoIGEgJ3ZpZXcnIGZ1bmN0aW9uLlxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcG9uZW50KGNvbXBvbmVudDogdW5rbm93bik6IGNvbXBvbmVudCBpcyBDb21wb25lbnQge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICBjb21wb25lbnQgJiYgKHR5cGVvZiBjb21wb25lbnQgPT09IFwiZnVuY3Rpb25cIiB8fCAodHlwZW9mIGNvbXBvbmVudCA9PT0gXCJvYmplY3RcIiAmJiBcInZpZXdcIiBpbiBjb21wb25lbnQpKVxuICApO1xufVxuXG4vLyAnaXNWbm9kZScgaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gJ29iamVjdCcgaXMgYSAnVm5vZGUnIGluc3RhbmNlIGFuZCBmYWxzZSBvdGhlcndpc2UuXG5leHBvcnQgY29uc3QgaXNWbm9kZSA9IChvYmplY3Q/OiB1bmtub3duIHwgVm5vZGVJbnRlcmZhY2UpOiBvYmplY3QgaXMgVm5vZGVJbnRlcmZhY2UgPT4ge1xuICAvLyBVc2UgdGhlICdpbnN0YW5jZW9mJyBvcGVyYXRvciB0byBjaGVjayBpZiAnb2JqZWN0JyBpcyBhbiBpbnN0YW5jZSBvZiAnVm5vZGUnLlxuICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgVm5vZGU7XG59O1xuXG4vLyAnaXNWbm9kZUNvbXBvbmVudCcgaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gJ29iamVjdCcgaXMgYSAnVm5vZGUnIGluc3RhbmNlIHdpdGggYSAndGFnJyBwcm9wZXJ0eSB0aGF0IGlzIGEgdmFsaWQgY29tcG9uZW50LlxuLy8gSXQgcmV0dXJucyBmYWxzZSBvdGhlcndpc2UuXG5leHBvcnQgY29uc3QgaXNWbm9kZUNvbXBvbmVudCA9IChvYmplY3Q/OiB1bmtub3duIHwgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UpOiBvYmplY3QgaXMgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgPT4ge1xuICAvLyBDaGVjayBpZiAnb2JqZWN0JyBpcyBhICdWbm9kZScgaW5zdGFuY2UgYW5kIGl0cyAndGFnJyBwcm9wZXJ0eSBpcyBhIHZhbGlkIGNvbXBvbmVudC5cbiAgcmV0dXJuIGlzVm5vZGUob2JqZWN0KSAmJiBpc0NvbXBvbmVudChvYmplY3QudGFnKTtcbn07XG5cbi8vICdkb21Ub1Zub2RlJyBpcyBhIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgYSBET00gbm9kZSB0byBhICdWbm9kZScgaW5zdGFuY2UuXG5leHBvcnQgZnVuY3Rpb24gZG9tVG9Wbm9kZShkb206IGFueSk6IFZub2RlV2l0aERvbSB7XG4gIC8vIElmIHRoZSBjaGlsZCBub2RlIGlzIGEgdGV4dCBub2RlLCBjcmVhdGUgYSAnVm5vZGUnIGluc3RhbmNlIHdpdGggdGhlICd0ZXh0VGFnJyBjb25zdGFudCBhcyB0aGUgJ3RhZycgcHJvcGVydHkuXG4gIC8vIFNldCB0aGUgJ2RvbScgcHJvcGVydHkgb2YgdGhlICdWbm9kZScgaW5zdGFuY2UgdG8gdGhlIGNoaWxkIERPTSBub2RlLlxuICAvLyBQdXNoIHRoZSAnVm5vZGUnIGluc3RhbmNlIHRvIHRoZSAnY2hpbGRyZW4nIGFycmF5LlxuICBpZiAoZG9tLm5vZGVUeXBlID09PSAzKSB7XG4gICAgbGV0IHZub2RlID0gbmV3IFZub2RlKHRleHRUYWcsIHt9LCBbZG9tLm5vZGVWYWx1ZV0pO1xuICAgIHZub2RlLmRvbSA9IGRvbTtcbiAgICByZXR1cm4gdm5vZGUgYXMgVm5vZGVXaXRoRG9tO1xuICB9XG5cbiAgbGV0IGNoaWxkcmVuOiBWbm9kZVdpdGhEb21bXSA9IFtdO1xuICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIGNoaWxkIG5vZGVzIG9mICdkb20nLlxuICBmb3IgKGxldCBpID0gMCwgbCA9IGRvbS5jaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGxldCBjaGlsZERvbSA9IGRvbS5jaGlsZE5vZGVzW2ldO1xuICAgIC8vIElmIHRoZSBjaGlsZCBub2RlIGlzIGFuIGVsZW1lbnQgbm9kZSwgcmVjdXJzaXZlbHkgY2FsbCAnZG9tVG9Wbm9kZScgdG8gY29udmVydCBpdCB0byBhICdWbm9kZScgaW5zdGFuY2UuXG4gICAgLy8gUHVzaCB0aGUgJ1Zub2RlJyBpbnN0YW5jZSB0byB0aGUgJ2NoaWxkcmVuJyBhcnJheS5cbiAgICBpZiAoY2hpbGREb20ubm9kZVR5cGUgPT09IDEgfHwgY2hpbGREb20ubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgIGNoaWxkcmVuLnB1c2goZG9tVG9Wbm9kZShjaGlsZERvbSkpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBwcm9wczogVm5vZGVQcm9wZXJ0aWVzID0ge307XG4gIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgYXR0cmlidXRlcyBvZiAnZG9tJy5cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBkb20uYXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBsZXQgYXR0ciA9IGRvbS5hdHRyaWJ1dGVzW2ldO1xuICAgIC8vIEFkZCB0aGUgYXR0cmlidXRlIHRvIHRoZSAncHJvcHMnIG9iamVjdCwgdXNpbmcgdGhlIGF0dHJpYnV0ZSdzIG5hbWUgYXMgdGhlIGtleSBhbmQgaXRzIHZhbHVlIGFzIHRoZSB2YWx1ZS5cbiAgICBwcm9wc1thdHRyLm5vZGVOYW1lXSA9IGF0dHIubm9kZVZhbHVlO1xuICB9XG5cbiAgLy8gQ3JlYXRlIGEgbmV3ICdWbm9kZScgaW5zdGFuY2Ugd2l0aCB0aGUgJ3RhZycgcHJvcGVydHkgc2V0IHRvIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiBvZiB0aGUgRE9NIG5vZGUncyB0YWcgbmFtZS5cbiAgLy8gU2V0IHRoZSAncHJvcHMnIGFuZCAnY2hpbGRyZW4nIHByb3BlcnRpZXMgdG8gdGhlICdwcm9wcycgYW5kICdjaGlsZHJlbicgYXJyYXlzIHJlc3BlY3RpdmVseS5cbiAgLy8gU2V0IHRoZSAnZG9tJyBwcm9wZXJ0eSBvZiB0aGUgJ1Zub2RlJyBpbnN0YW5jZSB0byB0aGUgRE9NIG5vZGUuXG4gIGxldCB2bm9kZSA9IG5ldyBWbm9kZShkb20udGFnTmFtZS50b0xvd2VyQ2FzZSgpLCBwcm9wcywgY2hpbGRyZW4pO1xuICB2bm9kZS5kb20gPSBkb207XG4gIHJldHVybiB2bm9kZSBhcyBWbm9kZVdpdGhEb207XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgaW4gYW4gSFRNTCBzdHJpbmcgYW5kIGNyZWF0ZXMgYSB2aXJ0dWFsIG5vZGUgcmVwcmVzZW50YXRpb24gb2YgaXRcbi8vIHVzaW5nIHRoZSBgZG9tVG9Wbm9kZWAgZnVuY3Rpb24uIEl0IGRvZXMgdGhpcyBieSBjcmVhdGluZyBhIG5ldyBgZGl2YCBlbGVtZW50LCBzZXR0aW5nXG4vLyBpdHMgYGlubmVySFRNTGAgdG8gdGhlIHByb3ZpZGVkIEhUTUwgc3RyaW5nLCBhbmQgdGhlbiB1c2luZyBgbWFwYCB0byBpdGVyYXRlIG92ZXIgdGhlXG4vLyBgY2hpbGROb2Rlc2Agb2YgdGhlIGBkaXZgIGVsZW1lbnQsIHBhc3NpbmcgZWFjaCBvbmUgdG8gYGRvbVRvVm5vZGVgIHRvIGNyZWF0ZSBhIHZpcnR1YWxcbi8vIG5vZGUgcmVwcmVzZW50YXRpb24gb2YgaXQuIFRoZSByZXN1bHRpbmcgYXJyYXkgb2YgdmlydHVhbCBub2RlcyBpcyB0aGVuIHJldHVybmVkLlxuZXhwb3J0IGZ1bmN0aW9uIHRydXN0KGh0bWxTdHJpbmc6IHN0cmluZykge1xuICBsZXQgZGl2ID0gY3JlYXRlRG9tRWxlbWVudChcImRpdlwiKTtcbiAgZGl2LmlubmVySFRNTCA9IGh0bWxTdHJpbmcudHJpbSgpO1xuXG4gIHJldHVybiBbXS5tYXAuY2FsbChkaXYuY2hpbGROb2RlcywgKGl0ZW0pID0+IGRvbVRvVm5vZGUoaXRlbSkpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyogTWFpbiBDb21wb25lbnQgaW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8vIFRoZXNlIHZhcmlhYmxlcyBhcmUgdXNlZCB0byBzdG9yZSB0aGUgbWFpbiBjb21wb25lbnQsIHRoZSBtYWluIHZpcnR1YWwgbm9kZSwgYW5kIHdoZXRoZXJcbi8vIHRoZSBtYWluIGNvbXBvbmVudCBpcyBjdXJyZW50bHkgbW91bnRlZC5cbmxldCBtYWluQ29tcG9uZW50OiBWbm9kZUNvbXBvbmVudEludGVyZmFjZSB8IG51bGwgPSBudWxsO1xubGV0IG1haW5Wbm9kZTogVm5vZGVXaXRoRG9tIHwgbnVsbCA9IG51bGw7XG5sZXQgaXNNb3VudGVkID0gZmFsc2U7XG5cbi8vIFRoaXMgb2JqZWN0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIGN1cnJlbnQgdmlydHVhbCBub2RlIGFuZCBjb21wb25lbnQgYmVpbmcgcmVuZGVyZWQuXG5leHBvcnQgY29uc3QgY3VycmVudDogQ3VycmVudCA9IHtcbiAgdm5vZGU6IG51bGwsXG4gIG9sZFZub2RlOiBudWxsLFxuICBjb21wb25lbnQ6IG51bGwsXG4gIGV2ZW50OiBudWxsXG59O1xuXG4vKiBSZXNlcnZlZCBwcm9wcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLy8gVGhpcyBvYmplY3QgaXMgdXNlZCB0byBzdG9yZSB0aGUgbmFtZXMgb2YgcmVzZXJ2ZWQgcHJvcHMsIHdoaWNoIGFyZSBwcm9wcyB0aGF0IGFyZSByZXNlcnZlZFxuLy8gZm9yIHNwZWNpYWwgcHVycG9zZXMgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBhcyByZWd1bGFyIGNvbXBvbmVudCBwcm9wcy5cbmV4cG9ydCBjb25zdCByZXNlcnZlZFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB0cnVlPiA9IHtcbiAga2V5OiB0cnVlLFxuICBzdGF0ZTogdHJ1ZSxcbiAgXCJ2LWtlZXBcIjogdHJ1ZSxcblxuICAvLyBCdWlsdCBpbiBkaXJlY3RpdmVzXG4gIFwidi1pZlwiOiB0cnVlLFxuICBcInYtdW5sZXNzXCI6IHRydWUsXG4gIFwidi1mb3JcIjogdHJ1ZSxcbiAgXCJ2LXNob3dcIjogdHJ1ZSxcbiAgXCJ2LWNsYXNzXCI6IHRydWUsXG4gIFwidi1odG1sXCI6IHRydWUsXG4gIFwidi1tb2RlbFwiOiB0cnVlLFxuICBcInYtY3JlYXRlXCI6IHRydWUsXG4gIFwidi11cGRhdGVcIjogdHJ1ZSxcbiAgXCJ2LWNsZWFudXBcIjogdHJ1ZVxufTtcblxuLyogTW91bnRpbmcsIFVwZGF0aW5nLCBDbGVhbnVwIGFuZCBVbm1vdW50aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi8vIFRoZXNlIHNldHMgYXJlIHVzZWQgdG8gc3RvcmUgY2FsbGJhY2tzIGZvciB2YXJpb3VzIGxpZmVjeWNsZSBldmVudHM6IG1vdW50aW5nLCB1cGRhdGluZyxcbi8vIGNsZWFuaW5nIHVwLCBhbmQgdW5tb3VudGluZy5cbmNvbnN0IG9uQ2xlYW51cFNldDogU2V0PEZ1bmN0aW9uPiA9IG5ldyBTZXQoKTtcbmNvbnN0IG9uTW91bnRTZXQ6IFNldDxGdW5jdGlvbj4gPSBuZXcgU2V0KCk7XG5jb25zdCBvblVwZGF0ZVNldDogU2V0PEZ1bmN0aW9uPiA9IG5ldyBTZXQoKTtcbmNvbnN0IG9uVW5tb3VudFNldDogU2V0PEZ1bmN0aW9uPiA9IG5ldyBTZXQoKTtcblxuLy8gVGhlc2UgZnVuY3Rpb25zIGFsbG93IHVzZXJzIHRvIHJlZ2lzdGVyIGNhbGxiYWNrcyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgbGlmZWN5Y2xlIGV2ZW50cy5cbmV4cG9ydCBmdW5jdGlvbiBvbk1vdW50KGNhbGxiYWNrOiBGdW5jdGlvbikge1xuICBpZiAoIWlzTW91bnRlZCkge1xuICAgIG9uTW91bnRTZXQuYWRkKGNhbGxiYWNrKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb25VcGRhdGUoY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gIG9uVXBkYXRlU2V0LmFkZChjYWxsYmFjayk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvbkNsZWFudXAoY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gIG9uQ2xlYW51cFNldC5hZGQoY2FsbGJhY2spO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb25Vbm1vdW50KGNhbGxiYWNrOiBGdW5jdGlvbikge1xuICBpZiAoIWlzTW91bnRlZCkge1xuICAgIG9uVW5tb3VudFNldC5hZGQoY2FsbGJhY2spO1xuICB9XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjYWxsIGFsbCB0aGUgY2FsbGJhY2tzIGluIGEgZ2l2ZW4gc2V0LlxuZnVuY3Rpb24gY2FsbFNldChzZXQ6IFNldDxGdW5jdGlvbj4pIHtcbiAgZm9yIChsZXQgY2FsbGJhY2sgb2Ygc2V0KSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxuXG4gIHNldC5jbGVhcigpO1xufVxuXG4vKiBFdmVudCBsaXN0ZW5lciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vLyBUaGlzIG9iamVjdCBzdG9yZXMgdGhlIG5hbWVzIG9mIGV2ZW50IGxpc3RlbmVycyB0aGF0IGhhdmUgYmVlbiBhZGRlZFxuY29uc3QgZXZlbnRMaXN0ZW5lck5hbWVzOiBSZWNvcmQ8c3RyaW5nLCB0cnVlPiA9IHt9O1xuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIGV2ZW50IG9jY3Vyc1xuZnVuY3Rpb24gZXZlbnRMaXN0ZW5lcihlOiBFdmVudCkge1xuICAvLyBTZXQgdGhlIGN1cnJlbnQgZXZlbnQgdG8gdGhlIGV2ZW50IHRoYXQgb2NjdXJyZWQgc28gdGhhdCBpdCBjYW4gYmUgcHJldmVudGVkIGlmIG5lY2Vzc2FyeVxuICBjdXJyZW50LmV2ZW50ID0gZTtcblxuICAvLyBDb252ZXJ0IHRoZSB0YXJnZXQgb2YgdGhlIGV2ZW50IHRvIGEgRE9NIGVsZW1lbnRcbiAgbGV0IGRvbSA9IGUudGFyZ2V0IGFzIERvbUVsZW1lbnQ7XG5cbiAgLy8gQ3JlYXRlIHRoZSBuYW1lIG9mIHRoZSBldmVudCBsaXN0ZW5lciBieSBhZGRpbmcgXCJ2LW9uXCIgdG8gdGhlIGV2ZW50IHR5cGVcbiAgbGV0IG5hbWUgPSBgdi1vbiR7ZS50eXBlfWA7XG5cbiAgLy8gS2VlcCBnb2luZyB1cCB0aGUgRE9NIHRyZWUgdW50aWwgd2UgZmluZCBhbiBlbGVtZW50IHdpdGggYW4gZXZlbnQgbGlzdGVuZXJcbiAgLy8gbWF0Y2hpbmcgdGhlIGV2ZW50IHR5cGVcbiAgd2hpbGUgKGRvbSkge1xuICAgIGlmIChkb21bbmFtZV0pIHtcbiAgICAgIC8vIENhbGwgdGhlIGV2ZW50IGxpc3RlbmVyIGZ1bmN0aW9uXG4gICAgICBkb21bbmFtZV0oZSwgZG9tKTtcblxuICAgICAgLy8gSWYgdGhlIGRlZmF1bHQgYWN0aW9uIG9mIHRoZSBldmVudCBoYXNuJ3QgYmVlbiBwcmV2ZW50ZWQsIHVwZGF0ZSB0aGUgRE9NXG4gICAgICBpZiAoIWUuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICB1cGRhdGUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZG9tID0gZG9tLnBhcmVudE5vZGUgYXMgRG9tRWxlbWVudDtcbiAgfVxuXG4gIGN1cnJlbnQuZXZlbnQgPSBudWxsO1xufVxuXG4vKiBEaXJlY3RpdmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vLyBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBkaXJlY3RpdmUgdGhhdCBoaWRlcyBhbiBlbGVtZW50IGJhc2VkIG9uIGEgY29uZGl0aW9uXG5sZXQgaGlkZURpcmVjdGl2ZSA9ICh0ZXN0OiBib29sZWFuKSA9PiAoYm9vbDogYm9vbGVhbiwgdm5vZGU6IFZub2RlSW50ZXJmYWNlLCBvbGRub2RlPzogVm5vZGVJbnRlcmZhY2UpID0+IHtcbiAgLy8gSWYgdGVzdCBpcyB0cnVlLCB1c2UgdGhlIHZhbHVlIG9mIGJvb2wuIE90aGVyd2lzZSwgdXNlIHRoZSBvcHBvc2l0ZSBvZiBib29sLlxuICBsZXQgdmFsdWUgPSB0ZXN0ID8gYm9vbCA6ICFib29sO1xuXG4gIC8vIElmIHRoZSB2YWx1ZSBpcyB0cnVlLCBoaWRlIHRoZSBlbGVtZW50IGJ5IHJlcGxhY2luZyBpdCB3aXRoIGEgdGV4dCBub2RlXG4gIGlmICh2YWx1ZSkge1xuICAgIGxldCBuZXdkb20gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcbiAgICBpZiAob2xkbm9kZSAmJiBvbGRub2RlLmRvbSAmJiBvbGRub2RlLmRvbS5wYXJlbnROb2RlKSB7XG4gICAgICBvbGRub2RlLmRvbS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdkb20sIG9sZG5vZGUuZG9tKTtcbiAgICB9XG4gICAgdm5vZGUudGFnID0gXCIjdGV4dFwiO1xuICAgIHZub2RlLmNoaWxkcmVuID0gW107XG4gICAgdm5vZGUucHJvcHMgPSB7fTtcbiAgICB2bm9kZS5kb20gPSBuZXdkb20gYXMgdW5rbm93biBhcyBEb21FbGVtZW50O1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuLy8gVGhpcyBvYmplY3Qgc3RvcmVzIGFsbCB0aGUgYXZhaWxhYmxlIGRpcmVjdGl2ZXNcbmV4cG9ydCBjb25zdCBkaXJlY3RpdmVzOiBEaXJlY3RpdmVzID0ge1xuICAvLyBUaGUgXCJ2LWlmXCIgZGlyZWN0aXZlIGhpZGVzIGFuIGVsZW1lbnQgaWYgdGhlIGdpdmVuIGNvbmRpdGlvbiBpcyBmYWxzZVxuICBcInYtaWZcIjogaGlkZURpcmVjdGl2ZShmYWxzZSksXG5cbiAgLy8gVGhlIFwidi11bmxlc3NcIiBkaXJlY3RpdmUgaGlkZXMgYW4gZWxlbWVudCBpZiB0aGUgZ2l2ZW4gY29uZGl0aW9uIGlzIHRydWVcbiAgXCJ2LXVubGVzc1wiOiBoaWRlRGlyZWN0aXZlKHRydWUpLFxuXG4gIC8vIFRoZSBcInYtZm9yXCIgZGlyZWN0aXZlIGNyZWF0ZXMgYSBsb29wIGFuZCBhcHBsaWVzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZWFjaCBpdGVtIGluIHRoZSBsb29wXG4gIFwidi1mb3JcIjogKHNldDogdW5rbm93bltdLCB2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgbGV0IG5ld0NoaWxkcmVuOiBWbm9kZUludGVyZmFjZVtdID0gW107XG4gICAgbGV0IGNhbGxiYWNrID0gdm5vZGUuY2hpbGRyZW5bMF07XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzZXQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBuZXdDaGlsZHJlbi5wdXNoKGNhbGxiYWNrKHNldFtpXSwgaSkpO1xuICAgIH1cbiAgICB2bm9kZS5jaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xuICB9LFxuXG4gIC8vIFRoZSBcInYtc2hvd1wiIGRpcmVjdGl2ZSBzaG93cyBvciBoaWRlcyBhbiBlbGVtZW50IGJ5IHNldHRpbmcgdGhlIFwiZGlzcGxheVwiIHN0eWxlIHByb3BlcnR5XG4gIFwidi1zaG93XCI6IChib29sOiBib29sZWFuLCB2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgKFxuICAgICAgdm5vZGUuZG9tIGFzIHVua25vd24gYXMge1xuICAgICAgICBzdHlsZTogeyBkaXNwbGF5OiBzdHJpbmcgfTtcbiAgICAgIH1cbiAgICApLnN0eWxlLmRpc3BsYXkgPSBib29sID8gXCJcIiA6IFwibm9uZVwiO1xuICB9LFxuXG4gIC8vIFRoZSBcInYtY2xhc3NcIiBkaXJlY3RpdmUgYWRkcyBvciByZW1vdmVzIGNsYXNzIG5hbWVzIGZyb20gYW4gZWxlbWVudCBiYXNlZCBvbiBhIGNvbmRpdGlvblxuICBcInYtY2xhc3NcIjogKGNsYXNzZXM6IHsgW3g6IHN0cmluZ106IGJvb2xlYW4gfSwgdm5vZGU6IFZub2RlV2l0aERvbSkgPT4ge1xuICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIGNsYXNzIG5hbWVzIGluIHRoZSBjbGFzc2VzIG9iamVjdFxuICAgIGZvciAobGV0IG5hbWUgaW4gY2xhc3Nlcykge1xuICAgICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgY2xhc3MgbmFtZSBmcm9tIHRoZSBlbGVtZW50J3MgY2xhc3MgbGlzdCBiYXNlZCBvbiB0aGUgdmFsdWUgaW4gdGhlIGNsYXNzZXMgb2JqZWN0XG4gICAgICAodm5vZGUuZG9tIGFzIERvbUVsZW1lbnQpLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgY2xhc3Nlc1tuYW1lXSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFRoZSBcInYtaHRtbFwiIGRpcmVjdGl2ZSBzZXRzIHRoZSBpbm5lciBIVE1MIG9mIGFuIGVsZW1lbnQgdG8gdGhlIGdpdmVuIEhUTUwgc3RyaW5nXG4gIFwidi1odG1sXCI6IChodG1sOiBzdHJpbmcsIHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICAvLyBTZXQgdGhlIGNoaWxkcmVuIG9mIHRoZSB2bm9kZSB0byBhIHRydXN0ZWQgdmVyc2lvbiBvZiB0aGUgSFRNTCBzdHJpbmdcbiAgICB2bm9kZS5jaGlsZHJlbiA9IFt0cnVzdChodG1sKV07XG4gIH0sXG5cbiAgLy8gVGhlIFwidi1tb2RlbFwiIGRpcmVjdGl2ZSBiaW5kcyB0aGUgdmFsdWUgb2YgYW4gaW5wdXQgZWxlbWVudCB0byBhIG1vZGVsIHByb3BlcnR5XG4gIFwidi1tb2RlbFwiOiAoW21vZGVsLCBwcm9wZXJ0eSwgZXZlbnRdOiBhbnlbXSwgdm5vZGU6IFZub2RlV2l0aERvbSwgb2xkVm5vZGU/OiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICBsZXQgdmFsdWU7XG4gICAgLy8gVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBtb2RlbCBwcm9wZXJ0eSB3aGVuIHRoZSBpbnB1dCBlbGVtZW50J3MgdmFsdWUgY2hhbmdlc1xuICAgIGxldCBoYW5kbGVyID0gKGU6IEV2ZW50KSA9PiAobW9kZWxbcHJvcGVydHldID0gKGUudGFyZ2V0IGFzIERvbUVsZW1lbnQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+KS52YWx1ZSk7XG4gICAgaWYgKHZub2RlLnRhZyA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBhbiBpbnB1dCwgdXNlIHRoZSBcImlucHV0XCIgZXZlbnQgYnkgZGVmYXVsdFxuICAgICAgZXZlbnQgPSBldmVudCB8fCBcIm9uaW5wdXRcIjtcbiAgICAgIC8vIERlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBpbnB1dCBlbGVtZW50LCB1c2UgYSBkaWZmZXJlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgc3dpdGNoICh2bm9kZS5wcm9wcy50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJjaGVja2JveFwiOiB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobW9kZWxbcHJvcGVydHldKSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIG1vZGVsIHByb3BlcnR5IGlzIGFuIGFycmF5LCBhZGQgb3IgcmVtb3ZlIHRoZSB2YWx1ZSBmcm9tIHRoZSBhcnJheSB3aGVuIHRoZSBjaGVja2JveCBpcyBjaGVja2VkIG9yIHVuY2hlY2tlZFxuICAgICAgICAgICAgaGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgICBsZXQgdmFsID0gKGUudGFyZ2V0IGFzIERvbUVsZW1lbnQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+KS52YWx1ZTtcbiAgICAgICAgICAgICAgbGV0IGlkeCA9IG1vZGVsW3Byb3BlcnR5XS5pbmRleE9mKHZhbCk7XG4gICAgICAgICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0uc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgaW4gdGhlIGFycmF5LCBzZXQgdGhlIGNoZWNrYm94IHRvIGJlIGNoZWNrZWRcbiAgICAgICAgICAgIHZhbHVlID0gbW9kZWxbcHJvcGVydHldLmluZGV4T2Yodm5vZGUuZG9tLnZhbHVlKSAhPT0gLTE7XG4gICAgICAgICAgfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gdm5vZGUucHJvcHMpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBpbnB1dCBlbGVtZW50IGhhcyBhIFwidmFsdWVcIiBhdHRyaWJ1dGUsIHVzZSBpdCB0byBkZXRlcm1pbmUgdGhlIGNoZWNrZWQgc3RhdGVcbiAgICAgICAgICAgIGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChtb2RlbFtwcm9wZXJ0eV0gPT09IHZub2RlLnByb3BzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldID0gbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0gPSB2bm9kZS5wcm9wcy52YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhbHVlID0gbW9kZWxbcHJvcGVydHldID09PSB2bm9kZS5wcm9wcy52YWx1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gXCJ2YWx1ZVwiIGF0dHJpYnV0ZSwgdXNlIGEgYm9vbGVhbiB2YWx1ZSBmb3IgdGhlIG1vZGVsIHByb3BlcnR5XG4gICAgICAgICAgICBoYW5kbGVyID0gKCkgPT4gKG1vZGVsW3Byb3BlcnR5XSA9ICFtb2RlbFtwcm9wZXJ0eV0pO1xuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV07XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNldCB0aGUgXCJjaGVja2VkXCIgYXR0cmlidXRlIG9uIHRoZSBpbnB1dCBlbGVtZW50XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgc2hhcmVkU2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCB2YWx1ZSwgdm5vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyYWRpb1wiOiB7XG4gICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgYSByYWRpbyBidXR0b24sIHNldCB0aGUgXCJjaGVja2VkXCIgYXR0cmlidXRlIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICBzaGFyZWRTZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIG1vZGVsW3Byb3BlcnR5XSA9PT0gdm5vZGUuZG9tLnZhbHVlLCB2bm9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIC8vIEZvciBhbGwgb3RoZXIgaW5wdXQgdHlwZXMsIHNldCB0aGUgXCJ2YWx1ZVwiIGF0dHJpYnV0ZSBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlIG1vZGVsIHByb3BlcnR5XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgc2hhcmVkU2V0QXR0cmlidXRlKFwidmFsdWVcIiwgbW9kZWxbcHJvcGVydHldLCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZub2RlLnRhZyA9PT0gXCJzZWxlY3RcIikge1xuICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgYSBzZWxlY3QgZWxlbWVudCwgdXNlIHRoZSBcImNsaWNrXCIgZXZlbnQgYnkgZGVmYXVsdFxuICAgICAgZXZlbnQgPSBldmVudCB8fCBcIm9uY2xpY2tcIjtcbiAgICAgIGlmICh2bm9kZS5wcm9wcy5tdWx0aXBsZSkge1xuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0IGVsZW1lbnQgYWxsb3dzIG11bHRpcGxlIHNlbGVjdGlvbnMsIHVwZGF0ZSB0aGUgbW9kZWwgcHJvcGVydHkgd2l0aCBhbiBhcnJheSBvZiBzZWxlY3RlZCB2YWx1ZXNcbiAgICAgICAgaGFuZGxlciA9IChlOiBFdmVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHtcbiAgICAgICAgICBsZXQgdmFsID0gKGUudGFyZ2V0IGFzIERvbUVsZW1lbnQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+KS52YWx1ZTtcbiAgICAgICAgICBpZiAoZS5jdHJsS2V5KSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgQ3RybCBrZXkgaXMgcHJlc3NlZCwgYWRkIG9yIHJlbW92ZSB0aGUgdmFsdWUgZnJvbSB0aGUgYXJyYXlcbiAgICAgICAgICAgIGxldCBpZHggPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2YWwpO1xuICAgICAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnB1c2godmFsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlIEN0cmwga2V5IGlzIG5vdCBwcmVzc2VkLCBzZXQgdGhlIG1vZGVsIHByb3BlcnR5IHRvIGFuIGFycmF5IHdpdGggdGhlIHNlbGVjdGVkIHZhbHVlXG4gICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0uc3BsaWNlKDAsIG1vZGVsW3Byb3BlcnR5XS5sZW5ndGgpO1xuICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnB1c2godmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIFNldCB0aGUgXCJzZWxlY3RlZFwiIGF0dHJpYnV0ZSBvbiB0aGUgb3B0aW9ucyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgYXJlIGluIHRoZSBtb2RlbCBwcm9wZXJ0eSBhcnJheVxuICAgICAgICB2bm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogVm5vZGVJbnRlcmZhY2UpID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQudGFnID09PSBcIm9wdGlvblwiKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBcInZhbHVlXCIgaW4gY2hpbGQucHJvcHMgPyBjaGlsZC5wcm9wcy52YWx1ZSA6IGNoaWxkLmNoaWxkcmVuLmpvaW4oXCJcIikudHJpbSgpO1xuICAgICAgICAgICAgY2hpbGQucHJvcHMuc2VsZWN0ZWQgPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2YWx1ZSkgIT09IC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0IGVsZW1lbnQgZG9lcyBub3QgYWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9ucywgc2V0IHRoZSBcInNlbGVjdGVkXCIgYXR0cmlidXRlIG9uIHRoZSBvcHRpb25zIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgICAgdm5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IFZub2RlSW50ZXJmYWNlKSA9PiB7XG4gICAgICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gXCJvcHRpb25cIikge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gXCJ2YWx1ZVwiIGluIGNoaWxkLnByb3BzID8gY2hpbGQucHJvcHMudmFsdWUgOiBjaGlsZC5jaGlsZHJlbi5qb2luKFwiXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGNoaWxkLnByb3BzLnNlbGVjdGVkID0gdmFsdWUgPT09IG1vZGVsW3Byb3BlcnR5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSBcInRleHRhcmVhXCIpIHtcbiAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIGEgdGV4dGFyZWEsIHVzZSB0aGUgXCJpbnB1dFwiIGV2ZW50IGJ5IGRlZmF1bHRcbiAgICAgIGV2ZW50ID0gZXZlbnQgfHwgXCJvbmlucHV0XCI7XG4gICAgICAvLyBTZXQgdGhlIHRleHRhcmVhJ3MgY29udGVudCB0byB0aGUgdmFsdWUgb2YgdGhlIG1vZGVsIHByb3BlcnR5XG4gICAgICB2bm9kZS5jaGlsZHJlbiA9IFttb2RlbFtwcm9wZXJ0eV1dO1xuICAgIH1cblxuICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBwcmV2IGhhbmRsZXIgaWYgYW55IHdpbGwgbm90IGJlIGNoYW5nZWQgYnkgdGhlIHVzZXIgYWNyb3NzIHBhdGNoc1xuICAgIGxldCBwcmV2SGFuZGxlciA9IHZub2RlLnByb3BzW2V2ZW50XTtcblxuICAgIC8vIFNldCB0aGUgZXZlbnQgaGFuZGxlciBvbiB0aGUgZWxlbWVudFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIHNoYXJlZFNldEF0dHJpYnV0ZShcbiAgICAgIGV2ZW50LFxuICAgICAgKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgIGhhbmRsZXIoZSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIGhhbmRsZXIgaXMgZGVmaW5lZCwgY2FsbCBpdCBhZnRlciB0aGUgbW9kZWwgaGFzIGJlZW4gdXBkYXRlZFxuICAgICAgICBpZiAocHJldkhhbmRsZXIpIHtcbiAgICAgICAgICBwcmV2SGFuZGxlcihlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHZub2RlLFxuICAgICAgb2xkVm5vZGVcbiAgICApO1xuICB9LFxuXG4gIC8vIFRoZSBcInYtY3JlYXRlXCIgZGlyZWN0aXZlIGlzIGNhbGxlZCB3aGVuIGEgbmV3IHZpcnR1YWwgbm9kZSBpcyBjcmVhdGVkLlxuICAvLyBUaGUgcHJvdmlkZWQgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIG5ldyB2aXJ0dWFsIG5vZGUgYXMgYW4gYXJndW1lbnQuXG4gIC8vIFRoaXMgZGlyZWN0aXZlIGlzIG9ubHkgY2FsbGVkIG9uY2UgcGVyIHZpcnR1YWwgbm9kZSwgd2hlbiBpdCBpcyBmaXJzdCBjcmVhdGVkLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgXCJ2LWNyZWF0ZVwiOiAoY2FsbGJhY2s6ICh2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB2b2lkLCB2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSkgPT4ge1xuICAgIC8vIElmIHRoaXMgaXMgbm90IGFuIHVwZGF0ZSwgY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCB0aGUgbmV3IHZpcnR1YWwgbm9kZVxuICAgIGlmICghb2xkVm5vZGUpIHtcbiAgICAgIGxldCBjbGVhbnVwID0gY2FsbGJhY2sodm5vZGUpO1xuXG4gICAgICAvLyBJZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcmV0dXJucyBhIGZ1bmN0aW9uLCBjYWxsIGl0IHdoZW4gdGhlIHVwZGF0ZSBpcyBnb25uYSBiZSBjbGVhbmVkIHVwXG4gICAgICBpZiAodHlwZW9mIGNsZWFudXAgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBvbkNsZWFudXAoY2xlYW51cCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIFRoZSBcInYtdXBkYXRlXCIgZGlyZWN0aXZlIGlzIGNhbGxlZCB3aGVuIGFuIGV4aXN0aW5nIHZpcnR1YWwgbm9kZSBpcyB1cGRhdGVkLlxuICAvLyBUaGUgcHJvdmlkZWQgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIG5ldyBhbmQgb2xkIHZpcnR1YWwgbm9kZXMgYXMgYXJndW1lbnRzLlxuICAvLyBUaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IGNhbGxlZCBvbmNlIHBlciB2aXJ0dWFsIG5vZGUgdXBkYXRlLlxuICBcInYtdXBkYXRlXCI6IChcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBjYWxsYmFjazogKHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlOiBWbm9kZVdpdGhEb20pID0+IHZvaWQsXG4gICAgdm5vZGU6IFZub2RlV2l0aERvbSxcbiAgICBvbGRWbm9kZT86IFZub2RlV2l0aERvbVxuICApID0+IHtcbiAgICAvLyBJZiB0aGlzIGlzIGFuIHVwZGF0ZSwgY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCB0aGUgbmV3IGFuZCBvbGQgdmlydHVhbCBub2Rlc1xuICAgIGlmIChvbGRWbm9kZSkge1xuICAgICAgbGV0IGNsZWFudXAgPSBjYWxsYmFjayh2bm9kZSwgb2xkVm5vZGUpO1xuXG4gICAgICAvLyBJZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcmV0dXJucyBhIGZ1bmN0aW9uLCBjYWxsIGl0IHdoZW4gdGhlIHVwZGF0ZSBpcyBnb25uYSBiZSBjbGVhbmVkIHVwXG4gICAgICBpZiAodHlwZW9mIGNsZWFudXAgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBvbkNsZWFudXAoY2xlYW51cCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIFRoZSBcInYtY2xlYW51cFwiIGRpcmVjdGl2ZSBpcyBjYWxsZWQgd2hlbiB0aGUgdXBkYXRlIGlzIGNsZWFuZWQgdXAuXG4gIC8vIFRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgb2xkIHZpcnR1YWwgbm9kZSBhcyBhbiBhcmd1bWVudC5cbiAgLy8gVGhpcyBkaXJlY3RpdmUgaXMgb25seSBjYWxsZWQgb25jZSBwZXIgdmlydHVhbCBub2RlLCB3aGVuIHRoZSB1cGRhdGUgaXMgY2xlYW5lZCB1cC5cbiAgXCJ2LWNsZWFudXBcIjogKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGNhbGxiYWNrOiAodm5vZGU6IFZub2RlV2l0aERvbSwgb2xkVm5vZGU/OiBWbm9kZVdpdGhEb20pID0+IHZvaWQsXG4gICAgdm5vZGU6IFZub2RlV2l0aERvbSxcbiAgICBvbGRWbm9kZT86IFZub2RlV2l0aERvbVxuICApID0+IHtcbiAgICAvLyBBZGQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHRoZSBsaXN0IG9mIGNsZWFudXAgZnVuY3Rpb25zIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSB1cGRhdGUgaXMgY2xlYW5lZCB1cFxuICAgIG9uQ2xlYW51cCgoKSA9PiBjYWxsYmFjayh2bm9kZSwgb2xkVm5vZGUpKTtcbiAgfVxufTtcbi8vIEFkZCBhIGRpcmVjdGl2ZSB0byB0aGUgZ2xvYmFsIGRpcmVjdGl2ZXMgb2JqZWN0LCB3aXRoIHRoZSBrZXkgYmVpbmcgdGhlIG5hbWVcbi8vIHByZWNlZGVkIGJ5IFwidi1cIi4gQWxzbyBhZGQgdGhlIG5hbWUgdG8gdGhlIGdsb2JhbCByZXNlcnZlZFByb3BzIG9iamVjdC5cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3RpdmUobmFtZTogc3RyaW5nLCBkaXJlY3RpdmU6IERpcmVjdGl2ZSkge1xuICBsZXQgZGlyZWN0aXZlTmFtZSA9IGB2LSR7bmFtZX1gO1xuICBkaXJlY3RpdmVzW2RpcmVjdGl2ZU5hbWVdID0gZGlyZWN0aXZlO1xuICByZXNlcnZlZFByb3BzW2RpcmVjdGl2ZU5hbWVdID0gdHJ1ZTtcbn1cblxuLy8gU2V0IGFuIGF0dHJpYnV0ZSBvbiBhIHZpcnR1YWwgRE9NIG5vZGUgYW5kIHVwZGF0ZSB0aGUgYWN0dWFsIERPTSBlbGVtZW50LlxuLy8gSWYgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBhZGQgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHRoZSBhdHRyaWJ1dGVcbi8vIG5hbWUgdG8gdGhlIERPTSBlbGVtZW50IHJlcHJlc2VudGVkIGJ5IG1haW5Wbm9kZS5cbi8vIElmIG9sZFZub2RlIGlzIHByb3ZpZGVkLCBjb21wYXJlIHRoZSBuZXcgYXR0cmlidXRlIHZhbHVlIHRvIHRoZSBvbGQgdmFsdWVcbi8vIGFuZCBvbmx5IHVwZGF0ZSB0aGUgYXR0cmlidXRlIGlmIHRoZSB2YWx1ZXMgYXJlIGRpZmZlcmVudC5cbmZ1bmN0aW9uIHNoYXJlZFNldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB8IGJvb2xlYW4ge1xuICAvLyBJZiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGFkZCBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIGF0dHJpYnV0ZVxuICAvLyBuYW1lIHRvIHRoZSBET00gZWxlbWVudCByZXByZXNlbnRlZCBieSBtYWluVm5vZGUuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIC8vIE9ubHkgYWRkIHRoZSBldmVudCBsaXN0ZW5lciBpZiBpdCBoYXNuJ3QgYmVlbiBhZGRlZCB5ZXQuXG4gICAgaWYgKG5hbWUgaW4gZXZlbnRMaXN0ZW5lck5hbWVzID09PSBmYWxzZSkge1xuICAgICAgKG1haW5Wbm9kZSBhcyBWbm9kZVdpdGhEb20pLmRvbS5hZGRFdmVudExpc3RlbmVyKG5hbWUuc2xpY2UoMiksIGV2ZW50TGlzdGVuZXIpO1xuICAgICAgZXZlbnRMaXN0ZW5lck5hbWVzW25hbWVdID0gdHJ1ZTtcbiAgICB9XG4gICAgbmV3Vm5vZGUuZG9tW2B2LSR7bmFtZX1gXSA9IHZhbHVlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIElmIHRoZSBhdHRyaWJ1dGUgaXMgcHJlc2VudCBvbiB0aGUgRE9NIGVsZW1lbnQgYW5kIG5ld1Zub2RlIGlzIG5vdCBhbiBTVkcsXG4gIC8vIHVwZGF0ZSB0aGUgYXR0cmlidXRlIGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZC5cbiAgaWYgKG5hbWUgaW4gbmV3Vm5vZGUuZG9tICYmIG5ld1Zub2RlLmlzU1ZHID09PSBmYWxzZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcbiAgICBpZiAobmV3Vm5vZGUuZG9tW25hbWVdICE9IHZhbHVlKSB7XG4gICAgICBuZXdWbm9kZS5kb21bbmFtZV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgb2xkVm5vZGUgaXMgbm90IHByb3ZpZGVkIG9yIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaGFzIGNoYW5nZWQsIHVwZGF0ZSB0aGVcbiAgLy8gYXR0cmlidXRlIG9uIHRoZSBET00gZWxlbWVudC5cbiAgaWYgKCFvbGRWbm9kZSB8fCB2YWx1ZSAhPT0gb2xkVm5vZGUucHJvcHNbbmFtZV0pIHtcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICBuZXdWbm9kZS5kb20ucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdWbm9kZS5kb20uc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gU2V0IGFuIGF0dHJpYnV0ZSBvbiBhIHZpcnR1YWwgRE9NIG5vZGUgYW5kIHVwZGF0ZSB0aGUgYWN0dWFsIERPTSBlbGVtZW50LlxuLy8gU2tpcCB0aGUgYXR0cmlidXRlIGlmIGl0IGlzIGluIHRoZSByZXNlcnZlZFByb3BzIG9iamVjdC5cbmV4cG9ydCBmdW5jdGlvbiBzZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBuZXdWbm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSk6IHZvaWQge1xuICBpZiAobmFtZSBpbiByZXNlcnZlZFByb3BzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIG5ld1Zub2RlLnByb3BzW25hbWVdID0gdmFsdWU7XG4gIHNoYXJlZFNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgbmV3Vm5vZGUgYXMgVm5vZGVXaXRoRG9tLCBvbGRWbm9kZSk7XG59XG5cbi8vIFVwZGF0ZSB0aGUgYXR0cmlidXRlcyBvbiBhIHZpcnR1YWwgRE9NIG5vZGUuIElmIG9sZFZub2RlIGlzIHByb3ZpZGVkLCByZW1vdmVcbi8vIGF0dHJpYnV0ZXMgZnJvbSB0aGUgRE9NIGVsZW1lbnQgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gbmV3Vm5vZGUucHJvcHMgYnV0IGFyZVxuLy8gcHJlc2VudCBpbiBvbGRWbm9kZS5wcm9wcy4gVGhlbiwgaXRlcmF0ZSBvdmVyIHRoZSBhdHRyaWJ1dGVzIGluIG5ld1Zub2RlLnByb3BzXG4vLyBhbmQgdXBkYXRlIHRoZSBET00gZWxlbWVudCB3aXRoIHRoZSBhdHRyaWJ1dGVzIHVzaW5nIHRoZSBzaGFyZWRTZXRBdHRyaWJ1dGVcbi8vIGZ1bmN0aW9uLiBJZiBhbiBhdHRyaWJ1dGUgaXMgaW4gdGhlIHJlc2VydmVkUHJvcHMgb2JqZWN0IGFuZCBoYXMgYSBjb3JyZXNwb25kaW5nXG4vLyBkaXJlY3RpdmUgaW4gdGhlIGRpcmVjdGl2ZXMgb2JqZWN0LCBjYWxsIHRoZSBkaXJlY3RpdmUgd2l0aCB0aGUgYXR0cmlidXRlIHZhbHVlXG4vLyBhbmQgdGhlIHR3byB2aXJ0dWFsIERPTSBub2RlcyBhcyBhcmd1bWVudHMuIElmIHRoZSBkaXJlY3RpdmUgcmV0dXJucyBmYWxzZSwgZXhpdFxuLy8gdGhlIGxvb3AuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQXR0cmlidXRlcyhuZXdWbm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSk6IHZvaWQge1xuICAvLyBJZiBvbGRWbm9kZSBpcyBwcm92aWRlZCwgcmVtb3ZlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgRE9NIGVsZW1lbnQgdGhhdCBhcmUgbm90XG4gIC8vIHByZXNlbnQgaW4gbmV3Vm5vZGUucHJvcHMgYnV0IGFyZSBwcmVzZW50IGluIG9sZFZub2RlLnByb3BzLlxuICBpZiAob2xkVm5vZGUpIHtcbiAgICBmb3IgKGxldCBuYW1lIGluIG9sZFZub2RlLnByb3BzKSB7XG4gICAgICBpZiAobmFtZSBpbiBuZXdWbm9kZS5wcm9wcyA9PT0gZmFsc2UgJiYgbmFtZSBpbiBldmVudExpc3RlbmVyTmFtZXMgPT09IGZhbHNlICYmIG5hbWUgaW4gcmVzZXJ2ZWRQcm9wcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgaWYgKG5hbWUgaW4gbmV3Vm5vZGUuZG9tICYmIG5ld1Zub2RlLmlzU1ZHID09PSBmYWxzZSkge1xuICAgICAgICAgIG5ld1Zub2RlLmRvbVtuYW1lXSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3Vm5vZGUuZG9tLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEl0ZXJhdGUgb3ZlciB0aGUgYXR0cmlidXRlcyBpbiBuZXdWbm9kZS5wcm9wcyBhbmQgdXBkYXRlIHRoZSBET00gZWxlbWVudCB3aXRoXG4gIC8vIHRoZSBhdHRyaWJ1dGVzIHVzaW5nIHRoZSBzaGFyZWRTZXRBdHRyaWJ1dGUgZnVuY3Rpb24uXG4gIGZvciAobGV0IG5hbWUgaW4gbmV3Vm5vZGUucHJvcHMpIHtcbiAgICBpZiAobmFtZSBpbiByZXNlcnZlZFByb3BzKSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBhIGRpcmVjdGl2ZSBmb3IgdGhlIGF0dHJpYnV0ZSwgY2FsbCBpdCB3aXRoIHRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAgICAgIC8vIGFuZCB0aGUgdHdvIHZpcnR1YWwgRE9NIG5vZGVzIGFzIGFyZ3VtZW50cy4gSWYgdGhlIGRpcmVjdGl2ZSByZXR1cm5zIGZhbHNlLFxuICAgICAgLy8gZXhpdCB0aGUgbG9vcC5cbiAgICAgIGlmIChuYW1lIGluIGRpcmVjdGl2ZXMgJiYgZGlyZWN0aXZlc1tuYW1lXShuZXdWbm9kZS5wcm9wc1tuYW1lXSwgbmV3Vm5vZGUsIG9sZFZub2RlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgc2hhcmVkU2V0QXR0cmlidXRlKG5hbWUsIG5ld1Zub2RlLnByb3BzW25hbWVdLCBuZXdWbm9kZSwgb2xkVm5vZGUpO1xuICB9XG59XG5cbi8qIHBhdGNoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLy8gUGF0Y2ggYSBET00gbm9kZSB3aXRoIGEgbmV3IFZOb2RlIHRyZWVcbmV4cG9ydCBmdW5jdGlvbiBwYXRjaChuZXdWbm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSk6IHZvaWQge1xuICAvLyBJZiB0aGUgbmV3IHRyZWUgaGFzIG5vIGNoaWxkcmVuLCBzZXQgdGhlIHRleHQgY29udGVudCBvZiB0aGUgcGFyZW50IERPTSBlbGVtZW50IHRvIGFuIGVtcHR5IHN0cmluZ1xuICBpZiAobmV3Vm5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgbmV3Vm5vZGUuZG9tLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBHZXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBuZXcgYW5kIG9sZCB2aXJ0dWFsIERPTSBub2Rlc1xuICBsZXQgbmV3VHJlZSA9IG5ld1Zub2RlLmNoaWxkcmVuO1xuICBsZXQgb2xkVHJlZSA9IG9sZFZub2RlPy5jaGlsZHJlbiB8fCBbXTtcbiAgLy8gR2V0IHRoZSBsZW5ndGggb2YgdGhlIG9sZCB0cmVlXG4gIGxldCBvbGRUcmVlTGVuZ3RoID0gb2xkVHJlZS5sZW5ndGg7XG5cbiAgLy8gSWYgdGhlIG9sZCB0cmVlIGhhcyBjaGlsZHJlbiBhbmQgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBuZXcgdHJlZSBpcyBhIFZOb2RlIHdpdGggYSBcImtleVwiXG4gIC8vIGF0dHJpYnV0ZSBhbmQgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBvbGQgdHJlZSBpcyBhIFZOb2RlIHdpdGggYSBcImtleVwiIGF0dHJpYnV0ZSwgdXBkYXRlXG4gIC8vIHRoZSBET00gZWxlbWVudCBpbiBwbGFjZSBieSBjb21wYXJpbmcgdGhlIGtleXMgb2YgdGhlIG5vZGVzIGluIHRoZSB0cmVlcy5cbiAgaWYgKG9sZFRyZWVMZW5ndGggJiYgbmV3VHJlZVswXSBpbnN0YW5jZW9mIFZub2RlICYmIFwia2V5XCIgaW4gbmV3VHJlZVswXS5wcm9wcyAmJiBcImtleVwiIGluIG9sZFRyZWVbMF0ucHJvcHMpIHtcbiAgICAvLyBHZXQgdGhlIGxlbmd0aHMgb2YgdGhlIG5ldyBhbmQgb2xkIHRyZWVzXG4gICAgbGV0IG5ld1RyZWVMZW5ndGggPSBuZXdUcmVlLmxlbmd0aDtcblxuICAgIC8vIENyZWF0ZSBhbiBvYmplY3QgdGhhdCBtYXBzIGtleXMgdG8gaW5kaWNlcyBpbiB0aGUgb2xkIHRyZWVcbiAgICBsZXQgb2xkS2V5ZWRMaXN0OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbGRUcmVlTGVuZ3RoOyBpKyspIHtcbiAgICAgIG9sZEtleWVkTGlzdFtvbGRUcmVlW2ldLnByb3BzLmtleV0gPSBpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhbiBvYmplY3QgdGhhdCBtYXBzIGtleXMgdG8gaW5kaWNlcyBpbiB0aGUgbmV3IHRyZWVcbiAgICBsZXQgbmV3S2V5ZWRMaXN0OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdUcmVlTGVuZ3RoOyBpKyspIHtcbiAgICAgIG5ld0tleWVkTGlzdFtuZXdUcmVlW2ldLnByb3BzLmtleV0gPSBpO1xuICAgIH1cblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgbmV3IHRyZWVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1RyZWVMZW5ndGg7IGkrKykge1xuICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IG5ldyBjaGlsZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgb2xkIGNoaWxkXG4gICAgICBsZXQgbmV3Q2hpbGQgPSBuZXdUcmVlW2ldO1xuICAgICAgbGV0IG9sZENoaWxkID0gb2xkVHJlZVtvbGRLZXllZExpc3RbbmV3Q2hpbGQucHJvcHMua2V5XV07XG4gICAgICAvLyBJbml0aWFsaXplIGEgZmxhZyB0byBkZXRlcm1pbmUgd2hldGhlciB0byBwYXRjaCB0aGUgY2hpbGRcbiAgICAgIGxldCBzaG91bGRQYXRjaCA9IHRydWU7XG5cbiAgICAgIC8vIElmIHRoZSBvbGQgY2hpbGQgZXhpc3RzLCB1cGRhdGUgdGhlIERPTSBlbGVtZW50IG9mIHRoZSBuZXcgY2hpbGQgdG8gbWF0Y2ggdGhlIG9sZCBjaGlsZCdzIERPTSBlbGVtZW50XG4gICAgICBpZiAob2xkQ2hpbGQpIHtcbiAgICAgICAgbmV3Q2hpbGQuZG9tID0gb2xkQ2hpbGQuZG9tO1xuICAgICAgICAvLyBJZiB0aGUgbmV3IGFuZCBvbGQgY2hpbGRyZW4gaGF2ZSB0aGUgc2FtZSBcInYta2VlcFwiIGF0dHJpYnV0ZSB2YWx1ZSwgdXBkYXRlIHRoZSBjaGlsZHJlbiBvZiB0aGUgbmV3IGNoaWxkIHRvIG1hdGNoIHRoZSBvbGQgY2hpbGQncyBjaGlsZHJlblxuICAgICAgICBpZiAoXCJ2LWtlZXBcIiBpbiBuZXdDaGlsZC5wcm9wcyAmJiBuZXdDaGlsZC5wcm9wc1tcInYta2VlcFwiXSA9PT0gb2xkQ2hpbGQucHJvcHNbXCJ2LWtlZXBcIl0pIHtcbiAgICAgICAgICBuZXdDaGlsZC5jaGlsZHJlbiA9IG9sZENoaWxkLmNoaWxkcmVuO1xuICAgICAgICAgIC8vIFNldCB0aGUgc2hvdWxkUGF0Y2ggZmxhZyB0byBmYWxzZVxuICAgICAgICAgIHNob3VsZFBhdGNoID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXBkYXRlQXR0cmlidXRlcyhuZXdDaGlsZCwgb2xkQ2hpbGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIG9sZCBjaGlsZCBkb2VzIG5vdCBleGlzdCwgY3JlYXRlIGEgbmV3IERPTSBlbGVtZW50IGZvciB0aGUgbmV3IGNoaWxkIGFuZCB1cGRhdGUgaXRzIGF0dHJpYnV0ZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld0NoaWxkLmRvbSA9IGNyZWF0ZURvbUVsZW1lbnQobmV3Q2hpbGQudGFnLCBuZXdDaGlsZC5pc1NWRyk7XG4gICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXMobmV3Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgbmV3IGNoaWxkJ3MgRE9NIGVsZW1lbnQgaXMgbm90IHRoZSBpLXRoIGNoaWxkIG9mIHRoZSBwYXJlbnQgRE9NIGVsZW1lbnQsIGluc2VydCBpdFxuICAgICAgaWYgKCFuZXdWbm9kZS5kb20uY2hpbGROb2Rlc1tpXSkge1xuICAgICAgICBuZXdWbm9kZS5kb20uYXBwZW5kQ2hpbGQobmV3Q2hpbGQuZG9tKTtcblxuICAgICAgICAvLyBJZiB0aGUgbmV3IGNoaWxkJ3MgRE9NIGVsZW1lbnQgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBpLXRoIGNoaWxkIG9mIHRoZSBwYXJlbnQgRE9NIGVsZW1lbnQsIHJlcGxhY2UgdGhlIGktdGggY2hpbGQgd2l0aCB0aGUgbmV3IGNoaWxkJ3MgRE9NIGVsZW1lbnRcbiAgICAgIH0gZWxzZSBpZiAobmV3Vm5vZGUuZG9tLmNoaWxkTm9kZXNbaV0gIT09IG5ld0NoaWxkLmRvbSkge1xuICAgICAgICBuZXdWbm9kZS5kb20ucmVwbGFjZUNoaWxkKG5ld0NoaWxkLmRvbSwgbmV3Vm5vZGUuZG9tLmNoaWxkTm9kZXNbaV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgc2hvdWxkUGF0Y2ggZmxhZyBpcyB0cnVlLCByZWN1cnNpdmVseSBjYWxsIHRoZSBwYXRjaCBmdW5jdGlvbiBvbiB0aGUgbmV3IGNoaWxkLCBwYXNzaW5nIGluIHRoZSBvbGQgY2hpbGQgYXMgdGhlIHNlY29uZCBhcmd1bWVudFxuICAgICAgc2hvdWxkUGF0Y2ggJiYgcGF0Y2gobmV3Q2hpbGQsIG9sZENoaWxkKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgdGhlIHJlc3Qgb2YgdGhlIGNoaWxkcmVuLCB3ZSBzaG91bGQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgRE9NXG4gICAgZm9yIChsZXQgaSA9IG5ld1RyZWVMZW5ndGg7IGkgPCBvbGRUcmVlTGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIElmIHRoZSBpLXRoIGNoaWxkIG9mIHRoZSBvbGQgdHJlZSBkb2VzIG5vdCBoYXZlIGEgY29ycmVzcG9uZGluZyBrZXkgaW4gdGhlIG5ldyB0cmVlLCByZW1vdmUgaXRzIERPTSBlbGVtZW50IGZyb20gdGhlIHBhcmVudCBET00gZWxlbWVudFxuICAgICAgaWYgKCFuZXdLZXllZExpc3Rbb2xkVHJlZVtpXS5wcm9wcy5rZXldKSB7XG4gICAgICAgIG9sZFRyZWVbaV0uZG9tLnBhcmVudE5vZGUgJiYgb2xkVHJlZVtpXS5kb20ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvbGRUcmVlW2ldLmRvbSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIElmIHRoZSBuZXcgdHJlZSBoYXMgbm8gY2hpbGRyZW4sIHNldCB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBwYXJlbnQgRE9NIGVsZW1lbnQgdG8gYW4gZW1wdHkgc3RyaW5nXG4gIGlmIChuZXdUcmVlLmxlbmd0aCA9PT0gMCkge1xuICAgIG5ld1Zub2RlLmRvbS50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gU2V0IHRoZSBnbG9iYWwgY3VycmVudCBvYmplY3QgdG8gdGhlIG5ldyBhbmQgb2xkIHZpcnR1YWwgRE9NIG5vZGVzXG4gIGN1cnJlbnQudm5vZGUgPSBuZXdWbm9kZTtcbiAgY3VycmVudC5vbGRWbm9kZSA9IG9sZFZub2RlO1xuXG4gIC8vIEZsYXR0ZW4gdGhlIG5ldyB0cmVlXG4gIC8vIFRha2UgaW50byBhY2NvdW50IHRoYXQgaXMgbmVjZXNzYXJ5IHRvIGZsYXR0ZW4gdGhlIHRyZWUgYmVmb3JlIHRoZSBwYXRjaCBwcm9jZXNzXG4gIC8vIHRvIGxldCB0aGUgaG9va3MgYW5kIHNpZ25hbHMgd29yayBwcm9wZXJseVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1RyZWUubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgbmV3Q2hpbGQgPSBuZXdUcmVlW2ldO1xuXG4gICAgLy8gSWYgdGhlIG5ldyBjaGlsZCBpcyBhIFZub2RlIGFuZCBpcyBub3QgYSB0ZXh0IG5vZGVcbiAgICBpZiAobmV3Q2hpbGQgaW5zdGFuY2VvZiBWbm9kZSkge1xuICAgICAgLy8gSWYgdGhlIHRhZyBvZiB0aGUgbmV3IGNoaWxkIGlzIG5vdCBhIHN0cmluZywgaXQgaXMgYSBjb21wb25lbnRcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQudGFnICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIC8vIFNldCB0aGUgY3VycmVudCBjb21wb25lbnQgdG8gdGhlIHRhZyBvZiB0aGUgbmV3IGNoaWxkXG4gICAgICAgIGN1cnJlbnQuY29tcG9uZW50ID0gbmV3Q2hpbGQudGFnO1xuICAgICAgICAvLyBSZXBsYWNlIHRoZSBuZXcgY2hpbGQgd2l0aCB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgaXRzIHZpZXcgb3IgYmluZCBtZXRob2QsIHBhc3NpbmcgaW4gdGhlIHByb3BzIGFuZCBjaGlsZHJlbiBhcyBhcmd1bWVudHNcbiAgICAgICAgbmV3VHJlZS5zcGxpY2UoXG4gICAgICAgICAgaS0tLFxuICAgICAgICAgIDEsXG4gICAgICAgICAgKFwidmlld1wiIGluIG5ld0NoaWxkLnRhZyA/IG5ld0NoaWxkLnRhZy52aWV3LmJpbmQobmV3Q2hpbGQudGFnKSA6IG5ld0NoaWxkLnRhZy5iaW5kKG5ld0NoaWxkLnRhZykpKFxuICAgICAgICAgICAgbmV3Q2hpbGQucHJvcHMsXG4gICAgICAgICAgICAuLi5uZXdDaGlsZC5jaGlsZHJlblxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIG5ldyBjaGlsZCBpcyBhbiBhcnJheSwgZmxhdHRlbiBpdCBhbmQgY29udGludWUgdGhlIGxvb3BcbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdDaGlsZCkpIHtcbiAgICAgIG5ld1RyZWUuc3BsaWNlKGktLSwgMSwgLi4ubmV3Q2hpbGQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIG5ldyBjaGlsZCBpcyBudWxsIG9yIHVuZGVmaW5lZCwgcmVtb3ZlIGl0IGZyb20gdGhlIG5ldyB0cmVlIGFuZCBjb250aW51ZSB0aGUgbG9vcFxuICAgIGlmIChuZXdDaGlsZCA9PT0gbnVsbCB8fCBuZXdDaGlsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXdUcmVlLnNwbGljZShpLS0sIDEpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIG5ldyBjaGlsZCBpcyBhIFZub2RlLCBzZXQgdGhlIHRleHQgb2YgdGhlIFZub2RlIHRvIHRoZSB0ZXh0IGNvbnRlbnQgb2YgaXRzIGRvbSBwcm9wZXJ0eVxuICAgIG5ld1RyZWVbaV0gPSBuZXcgVm5vZGUodGV4dFRhZywge30sIFtuZXdDaGlsZF0pO1xuICB9XG5cbiAgLy8gUGF0Y2ggdGhlIHRoZSBvbGQgdHJlZVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1RyZWUubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgbmV3Q2hpbGQgPSBuZXdUcmVlW2ldO1xuXG4gICAgaWYgKG5ld0NoaWxkLnRhZyA9PT0gdGV4dFRhZykge1xuICAgICAgLy8gSWYgbm8gb2xkIGNoaWxkIGV4aXN0cyBhdCB0aGUgc2FtZSBpbmRleFxuICAgICAgaWYgKGkgPj0gb2xkVHJlZUxlbmd0aCkge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgdGV4dCBub2RlIGZvciB0aGUgbmV3IGNoaWxkXG4gICAgICAgIG5ld0NoaWxkLmRvbSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5ld0NoaWxkLmNoaWxkcmVuWzBdKTtcbiAgICAgICAgLy8gQXBwZW5kIHRoZSBuZXcgdGV4dCBub2RlIHRvIHRoZSBkb21cbiAgICAgICAgbmV3Vm5vZGUuZG9tLmFwcGVuZENoaWxkKG5ld0NoaWxkLmRvbSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGVyZSBpcyBhbiBvbGQgY2hpbGQgYXQgdGhlIHNhbWUgaW5kZXhcbiAgICAgIGxldCBvbGRDaGlsZCA9IG9sZFRyZWVbaV07XG5cbiAgICAgIC8vIElmIHRoZSBvbGQgY2hpbGQgaXMgbm90IGEgdGV4dCBub2RlXG4gICAgICBpZiAob2xkQ2hpbGQudGFnICE9PSB0ZXh0VGFnKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyB0ZXh0IG5vZGUgZm9yIHRoZSBuZXcgY2hpbGRcbiAgICAgICAgbmV3Q2hpbGQuZG9tID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmV3Q2hpbGQuY2hpbGRyZW5bMF0pO1xuICAgICAgICAvLyBSZXBsYWNlIHRoZSBvbGQgY2hpbGQgaW4gdGhlIGRvbSB3aXRoIHRoZSBuZXcgdGV4dCBub2RlXG4gICAgICAgIG5ld1Zub2RlLmRvbS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQuZG9tLCBvbGRDaGlsZC5kb20pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIG9sZCBjaGlsZCBpcyBhIHRleHQgbm9kZVxuICAgICAgLy8gU2V0IHRoZSBkb20gcHJvcGVydHkgb2YgdGhlIHRleHQgVm5vZGUgdG8gdGhlIGRvbSBwcm9wZXJ0eSBvZiB0aGUgb2xkIGNoaWxkXG4gICAgICBuZXdDaGlsZC5kb20gPSBvbGRDaGlsZC5kb207XG4gICAgICAvLyBJZiB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBvbGQgY2hpbGQgaXMgZGlmZmVyZW50IGZyb20gdGhlIG5ldyBjaGlsZCwgdXBkYXRlIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIG9sZCBjaGlsZFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICAgICAgaWYgKG5ld0NoaWxkLmNoaWxkcmVuWzBdICE9IG9sZENoaWxkLmRvbS50ZXh0Q29udGVudCkge1xuICAgICAgICBvbGRDaGlsZC5kb20udGV4dENvbnRlbnQgPSBuZXdDaGlsZC5jaGlsZHJlblswXTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBuZXcgY2hpbGQgaXMgbm90IGEgdGV4dCBub2RlXG4gICAgLy8gU2V0IHRoZSBpc1NWRyBmbGFnIGZvciB0aGUgbmV3IGNoaWxkIGlmIGl0IGlzIGFuIFNWRyBlbGVtZW50IG9yIGlmIHRoZSBwYXJlbnQgaXMgYW4gU1ZHIGVsZW1lbnRcbiAgICBuZXdDaGlsZC5pc1NWRyA9IG5ld1Zub2RlLmlzU1ZHIHx8IG5ld0NoaWxkLnRhZyA9PT0gXCJzdmdcIjtcblxuICAgIC8vIElmIHRoZXJlIGlzIG5vIG9sZCBjaGlsZCBhdCB0aGUgc2FtZSBpbmRleFxuICAgIGlmIChpID49IG9sZFRyZWVMZW5ndGgpIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBkb20gZWxlbWVudCBmb3IgdGhlIG5ldyBjaGlsZFxuICAgICAgbmV3Q2hpbGQuZG9tID0gY3JlYXRlRG9tRWxlbWVudChuZXdDaGlsZC50YWcgYXMgc3RyaW5nLCBuZXdDaGlsZC5pc1NWRyk7XG4gICAgICAvLyBVcGRhdGUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5ldyBjaGlsZFxuICAgICAgdXBkYXRlQXR0cmlidXRlcyhuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20pO1xuICAgICAgLy8gQXBwZW5kIHRoZSBuZXcgY2hpbGQgdG8gdGhlIGRvbVxuICAgICAgbmV3Vm5vZGUuZG9tLmFwcGVuZENoaWxkKG5ld0NoaWxkLmRvbSk7XG4gICAgICAvLyBSZWN1cnNpdmVseSBwYXRjaCB0aGUgbmV3IGNoaWxkXG4gICAgICBwYXRjaChuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgYW4gb2xkIGNoaWxkIGF0IHRoZSBzYW1lIGluZGV4XG4gICAgbGV0IG9sZENoaWxkID0gb2xkVHJlZVtpXTtcblxuICAgIC8vIElmIHRoZSB0YWcgb2YgdGhlIG5ldyBjaGlsZCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgdGFnIG9mIHRoZSBvbGQgY2hpbGRcbiAgICBpZiAobmV3Q2hpbGQudGFnICE9PSBvbGRDaGlsZC50YWcpIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBkb20gZWxlbWVudCBmb3IgdGhlIG5ldyBjaGlsZFxuICAgICAgbmV3Q2hpbGQuZG9tID0gY3JlYXRlRG9tRWxlbWVudChuZXdDaGlsZC50YWcgYXMgc3RyaW5nLCBuZXdDaGlsZC5pc1NWRyk7XG4gICAgICAvLyBVcGRhdGUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5ldyBjaGlsZFxuICAgICAgdXBkYXRlQXR0cmlidXRlcyhuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20pO1xuICAgICAgLy8gUmVwbGFjZSB0aGUgb2xkIGNoaWxkIGluIHRoZSBkb20gd2l0aCB0aGUgbmV3IGNoaWxkXG4gICAgICBuZXdWbm9kZS5kb20ucmVwbGFjZUNoaWxkKG5ld0NoaWxkLmRvbSwgb2xkQ2hpbGQuZG9tKTtcbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IHBhdGNoIHRoZSBuZXcgY2hpbGRcbiAgICAgIHBhdGNoKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgdGFnIG9mIHRoZSBuZXcgY2hpbGQgaXMgdGhlIHNhbWUgYXMgdGhlIHRhZyBvZiB0aGUgb2xkIGNoaWxkXG4gICAgLy8gU2V0IHRoZSBkb20gcHJvcGVydHkgb2YgdGhlIG5ldyBjaGlsZCB0byB0aGUgZG9tIHByb3BlcnR5IG9mIHRoZSBvbGQgY2hpbGRcbiAgICBuZXdDaGlsZC5kb20gPSBvbGRDaGlsZC5kb207XG4gICAgLy8gSWYgdGhlIHYta2VlcCBwcm9wIGlzIHRoZSBzYW1lIGZvciBib3RoIHRoZSBuZXcgYW5kIG9sZCBjaGlsZCwgc2V0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbmV3IGNoaWxkIHRvIHRoZSBjaGlsZHJlbiBvZiB0aGUgb2xkIGNoaWxkXG4gICAgaWYgKFwidi1rZWVwXCIgaW4gbmV3Q2hpbGQucHJvcHMgJiYgbmV3Q2hpbGQucHJvcHNbXCJ2LWtlZXBcIl0gPT09IG9sZENoaWxkLnByb3BzW1widi1rZWVwXCJdKSB7XG4gICAgICBuZXdDaGlsZC5jaGlsZHJlbiA9IG9sZENoaWxkLmNoaWxkcmVuO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZXcgY2hpbGQgYmFzZWQgb24gdGhlIG9sZCBjaGlsZFxuICAgIHVwZGF0ZUF0dHJpYnV0ZXMobmV3Q2hpbGQgYXMgVm5vZGVXaXRoRG9tLCBvbGRDaGlsZCk7XG4gICAgLy8gUmVjdXJzaXZlbHkgcGF0Y2ggdGhlIG5ldyBhbmQgb2xkIGNoaWxkcmVuXG4gICAgcGF0Y2gobmV3Q2hpbGQgYXMgVm5vZGVXaXRoRG9tLCBvbGRDaGlsZCk7XG4gIH1cblxuICAvLyBSZW1vdmUgYW55IG9sZCBjaGlsZHJlbiB0aGF0IGFyZSBubyBsb25nZXIgcHJlc2VudCBpbiB0aGUgbmV3IHRyZWVcbiAgZm9yIChsZXQgaSA9IG5ld1RyZWUubGVuZ3RoOyBpIDwgb2xkVHJlZUxlbmd0aDsgaSsrKSB7XG4gICAgbmV3Vm5vZGUuZG9tLnJlbW92ZUNoaWxkKG9sZFRyZWVbaV0uZG9tKTtcbiAgfVxufVxuXG4vLyBVcGRhdGUgdGhlIG1haW4gVm5vZGVcbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGUoKTogdm9pZCB8IHN0cmluZyB7XG4gIC8vIElmIHRoZSBtYWluIFZub2RlIGV4aXN0c1xuICBpZiAobWFpblZub2RlKSB7XG4gICAgLy8gQ2FsbCBhbnkgY2xlYW51cCBmdW5jdGlvbnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBvbkNsZWFudXBTZXQgc2V0XG4gICAgY2FsbFNldChvbkNsZWFudXBTZXQpO1xuICAgIC8vIFN0b3JlIGEgcmVmZXJlbmNlIHRvIHRoZSBvbGQgbWFpbiBWbm9kZVxuICAgIGxldCBvbGRNYWluVm5vZGUgPSBtYWluVm5vZGU7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IG1haW4gVm5vZGUgd2l0aCB0aGUgbWFpbiBjb21wb25lbnQgYXMgaXRzIG9ubHkgY2hpbGRcbiAgICBtYWluVm5vZGUgPSBuZXcgVm5vZGUob2xkTWFpblZub2RlLnRhZywgb2xkTWFpblZub2RlLnByb3BzLCBbbWFpbkNvbXBvbmVudF0pIGFzIFZub2RlV2l0aERvbTtcbiAgICBtYWluVm5vZGUuZG9tID0gb2xkTWFpblZub2RlLmRvbTtcbiAgICBtYWluVm5vZGUuaXNTVkcgPSBvbGRNYWluVm5vZGUuaXNTVkc7XG5cbiAgICAvLyBSZWN1cnNpdmVseSBwYXRjaCB0aGUgbmV3IGFuZCBvbGQgbWFpbiBWbm9kZXNcbiAgICBwYXRjaChtYWluVm5vZGUsIG9sZE1haW5Wbm9kZSk7XG5cbiAgICAvLyBDYWxsIGFueSB1cGRhdGUgb3IgbW91bnQgZnVuY3Rpb25zIHRoYXQgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgb25VcGRhdGVTZXQgb3Igb25Nb3VudFNldCBzZXRcbiAgICBjYWxsU2V0KGlzTW91bnRlZCA/IG9uVXBkYXRlU2V0IDogb25Nb3VudFNldCk7XG5cbiAgICAvLyBTZXQgdGhlIGlzTW91bnRlZCBmbGFnIHRvIHRydWVcbiAgICBpc01vdW50ZWQgPSB0cnVlO1xuXG4gICAgLy8gUmVzZXQgdGhlIGN1cnJlbnQgdm5vZGUsIG9sZFZub2RlLCBhbmQgY29tcG9uZW50IHByb3BlcnRpZXNcbiAgICBjdXJyZW50LnZub2RlID0gbnVsbDtcbiAgICBjdXJyZW50Lm9sZFZub2RlID0gbnVsbDtcbiAgICBjdXJyZW50LmNvbXBvbmVudCA9IG51bGw7XG5cbiAgICAvLyBJZiB0aGUgY29kZSBpcyBydW5uaW5nIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudCwgcmV0dXJuIHRoZSBpbm5lciBIVE1MIG9mIHRoZSBtYWluIFZub2RlJ3MgZG9tIGVsZW1lbnRcbiAgICBpZiAoaXNOb2RlSnMpIHtcbiAgICAgIHJldHVybiBtYWluVm5vZGUuZG9tLmlubmVySFRNTDtcbiAgICB9XG4gIH1cbn1cblxuLy8gVXBkYXRlIGN1c3RvbSBWbm9kZVxuLy8gSXQgaXMgYXNzdW1lZCB0aGF0IGEgZmlyc3QgbW91bnQgaGFzIGFscmVhZHkgb2NjdXJyZWQsIHNvLFxuLy8gdGhlIG9sZFZub2RlIGlzIG5vdCBudWxsIGFuZCB0aGUgZG9tIHByb3BlcnR5IG9mIHRoZSBvbGRWbm9kZSBpcyBub3QgbnVsbFxuLy8gWW91IG5lZWQgdG8gc2V0IHRoZSBkb20gcHJvcGVydHkgb2YgdGhlIG5ld1Zub2RlIHRvIHRoZSBkb20gcHJvcGVydHkgb2YgdGhlIG9sZFZub2RlXG4vLyBUaGUgc2FtZSB3aXRoIHRoZSBpc1NWRyBwcm9wZXJ0eVxuLy8gUHJlZmVyIHRoaXMgZnVuY3Rpb24gb3ZlciBwYXRjaCB0byBhbGxvdyBmb3IgY2xlYW51cCwgb25VcGRhdGUgYW5kIG9uTW91bnQgc2V0cyB0byBiZSBjYWxsZWRcbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVWbm9kZSh2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZTogVm5vZGVXaXRoRG9tKTogc3RyaW5nIHwgdm9pZCB7XG4gIC8vIENhbGwgYW55IGNsZWFudXAgZnVuY3Rpb25zIHRoYXQgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgb25DbGVhbnVwU2V0IHNldFxuICBjYWxsU2V0KG9uQ2xlYW51cFNldCk7XG5cbiAgLy8gUmVjdXJzaXZlbHkgcGF0Y2ggdGhlIG5ldyBhbmQgb2xkIG1haW4gVm5vZGVzXG4gIHBhdGNoKHZub2RlLCBvbGRWbm9kZSk7XG5cbiAgLy8gU2V0IHRoZSBvbGRWbm9kZSdzIHRhZywgcHJvcHMsIGNoaWxkcmVuLCBkb20sIGFuZCBpc1NWRyBwcm9wZXJ0aWVzIHRvIHRoZSBuZXdWbm9kZSdzIHRhZywgcHJvcHMsIGNoaWxkcmVuLCBkb20sIGFuZCBpc1NWRyBwcm9wZXJ0aWVzXG4gIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGFsbG93IGZvciB0aGUgb2xkVm5vZGUgdG8gYmUgdXNlZCBhcyB0aGUgbmV3Vm5vZGUgaW4gdGhlIG5leHQgdXBkYXRlIHdpdGggdGhlIG5vcm1hbCB1cGRhdGUgZnVuY3Rpb25cbiAgb2xkVm5vZGUudGFnID0gdm5vZGUudGFnO1xuICBvbGRWbm9kZS5wcm9wcyA9IHsgLi4udm5vZGUucHJvcHMgfTtcbiAgb2xkVm5vZGUuY2hpbGRyZW4gPSBbLi4udm5vZGUuY2hpbGRyZW5dO1xuICBvbGRWbm9kZS5kb20gPSB2bm9kZS5kb207XG4gIG9sZFZub2RlLmlzU1ZHID0gdm5vZGUuaXNTVkc7XG5cbiAgLy8gQ2FsbCBhbnkgdXBkYXRlIG9yIG1vdW50IGZ1bmN0aW9ucyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIG9uVXBkYXRlU2V0IG9yIG9uTW91bnRTZXQgc2V0XG4gIGNhbGxTZXQoaXNNb3VudGVkID8gb25VcGRhdGVTZXQgOiBvbk1vdW50U2V0KTtcblxuICAvLyBTZXQgdGhlIGlzTW91bnRlZCBmbGFnIHRvIHRydWVcbiAgaXNNb3VudGVkID0gdHJ1ZTtcblxuICAvLyBSZXNldCB0aGUgY3VycmVudCB2bm9kZSwgb2xkVm5vZGUsIGFuZCBjb21wb25lbnQgcHJvcGVydGllc1xuICBjdXJyZW50LnZub2RlID0gbnVsbDtcbiAgY3VycmVudC5vbGRWbm9kZSA9IG51bGw7XG4gIGN1cnJlbnQuY29tcG9uZW50ID0gbnVsbDtcblxuICBpZiAoaXNOb2RlSnMpIHtcbiAgICByZXR1cm4gdm5vZGUuZG9tLmlubmVySFRNTDtcbiAgfVxufVxuXG4vLyBVbm1vdW50IHRoZSBtYWluIFZub2RlXG5leHBvcnQgZnVuY3Rpb24gdW5tb3VudCgpIHtcbiAgLy8gSWYgdGhlIG1haW4gVm5vZGUgZXhpc3RzXG4gIGlmIChtYWluVm5vZGUpIHtcbiAgICAvLyBTZXQgdGhlIG1haW4gY29tcG9uZW50IHRvIGEgbnVsbCBWbm9kZVxuICAgIG1haW5Db21wb25lbnQgPSBuZXcgVm5vZGUoKCkgPT4gbnVsbCwge30sIFtdKSBhcyBWbm9kZUNvbXBvbmVudEludGVyZmFjZTtcbiAgICAvLyBVcGRhdGUgdGhlIG1haW4gVm5vZGVcbiAgICBsZXQgcmVzdWx0ID0gdXBkYXRlKCk7XG4gICAgLy8gQ2FsbCBhbnkgdW5tb3VudCBmdW5jdGlvbnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBvblVubW91bnRTZXQgc2V0XG4gICAgY2FsbFNldChvblVubW91bnRTZXQpO1xuXG4gICAgLy8gUmVtb3ZlIGFueSBldmVudCBsaXN0ZW5lcnMgdGhhdCB3ZXJlIGFkZGVkIHRvIHRoZSBtYWluIFZub2RlJ3MgZG9tIGVsZW1lbnRcbiAgICBmb3IgKGxldCBuYW1lIGluIGV2ZW50TGlzdGVuZXJOYW1lcykge1xuICAgICAgbWFpblZub2RlLmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgZXZlbnRMaXN0ZW5lcik7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGV2ZW50TGlzdGVuZXJOYW1lcywgbmFtZSk7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgdGhlIG1haW4gY29tcG9uZW50IGFuZCBtYWluIFZub2RlXG4gICAgbWFpbkNvbXBvbmVudCA9IG51bGw7XG4gICAgbWFpblZub2RlID0gbnVsbDtcbiAgICAvLyBTZXQgdGhlIGlzTW91bnRlZCBmbGFnIHRvIGZhbHNlXG4gICAgaXNNb3VudGVkID0gZmFsc2U7XG4gICAgLy8gUmVzZXQgdGhlIGN1cnJlbnQgdm5vZGUsIG9sZFZub2RlLCBhbmQgY29tcG9uZW50IHByb3BlcnRpZXNcbiAgICBjdXJyZW50LnZub2RlID0gbnVsbDtcbiAgICBjdXJyZW50Lm9sZFZub2RlID0gbnVsbDtcbiAgICBjdXJyZW50LmNvbXBvbmVudCA9IG51bGw7XG4gICAgLy8gUmV0dXJuIHRoZSByZXN1bHQgb2YgdXBkYXRpbmcgdGhlIG1haW4gVm5vZGVcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4vLyBUaGlzIGZ1bmN0aW9uIHRha2VzIGluIGEgRE9NIGVsZW1lbnQgb3IgYSBET00gZWxlbWVudCBzZWxlY3RvciBhbmQgYSBjb21wb25lbnQgdG8gYmUgbW91bnRlZCBvbiBpdC5cbmV4cG9ydCBmdW5jdGlvbiBtb3VudChkb206IHN0cmluZyB8IERvbUVsZW1lbnQsIGNvbXBvbmVudDogYW55KSB7XG4gIC8vIENoZWNrIGlmIHRoZSAnZG9tJyBhcmd1bWVudCBpcyBhIHN0cmluZy4gSWYgaXQgaXMsIHNlbGVjdCB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHNlbGVjdG9yLlxuICAvLyBPdGhlcndpc2UsIHVzZSB0aGUgJ2RvbScgYXJndW1lbnQgYXMgdGhlIGNvbnRhaW5lci5cbiAgbGV0IGNvbnRhaW5lciA9XG4gICAgdHlwZW9mIGRvbSA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBpc05vZGVKc1xuICAgICAgICA/IGNyZWF0ZURvbUVsZW1lbnQoZG9tLCBkb20gPT09IFwic3ZnXCIpXG4gICAgICAgIDogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChkb20pWzBdXG4gICAgICA6IGRvbTtcblxuICAvLyBDaGVjayBpZiB0aGUgJ2NvbXBvbmVudCcgYXJndW1lbnQgaXMgYSBWbm9kZSBjb21wb25lbnQgb3IgYSByZWd1bGFyIGNvbXBvbmVudC5cbiAgLy8gSWYgaXQncyBhIHJlZ3VsYXIgY29tcG9uZW50LCBjcmVhdGUgYSBuZXcgVm5vZGUgY29tcG9uZW50IHVzaW5nIHRoZSAnY29tcG9uZW50JyBhcmd1bWVudCBhcyB0aGUgdGFnLlxuICAvLyBJZiBpdCdzIG5vdCBhIGNvbXBvbmVudCBhdCBhbGwsIGNyZWF0ZSBhIG5ldyBWbm9kZSBjb21wb25lbnQgd2l0aCB0aGUgJ2NvbXBvbmVudCcgYXJndW1lbnQgYXMgdGhlIHJlbmRlcmluZyBmdW5jdGlvbi5cbiAgbGV0IHZub2RlQ29tcG9uZW50ID0gaXNWbm9kZUNvbXBvbmVudChjb21wb25lbnQpXG4gICAgPyBjb21wb25lbnRcbiAgICA6IGlzQ29tcG9uZW50KGNvbXBvbmVudClcbiAgICA/IG5ldyBWbm9kZShjb21wb25lbnQsIHt9LCBbXSlcbiAgICA6IG5ldyBWbm9kZSgoKSA9PiBjb21wb25lbnQsIHt9LCBbXSk7XG5cbiAgLy8gSWYgYSBtYWluIGNvbXBvbmVudCBhbHJlYWR5IGV4aXN0cyBhbmQgaXQncyBub3QgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgJ3Zub2RlQ29tcG9uZW50JywgdW5tb3VudCBpdC5cbiAgaWYgKG1haW5Db21wb25lbnQgJiYgbWFpbkNvbXBvbmVudC50YWcgIT09IHZub2RlQ29tcG9uZW50LnRhZykge1xuICAgIHVubW91bnQoKTtcbiAgfVxuXG4gIC8vIFNldCB0aGUgJ3Zub2RlQ29tcG9uZW50JyBhcyB0aGUgbWFpbiBjb21wb25lbnQuXG4gIG1haW5Db21wb25lbnQgPSB2bm9kZUNvbXBvbmVudCBhcyBWbm9kZUNvbXBvbmVudEludGVyZmFjZTtcbiAgLy8gQ29udmVydCB0aGUgY29udGFpbmVyIGVsZW1lbnQgdG8gYSBWbm9kZS5cbiAgbWFpblZub2RlID0gZG9tVG9Wbm9kZShjb250YWluZXIpO1xuICAvLyBVcGRhdGUgdGhlIERPTSB3aXRoIHRoZSBuZXcgY29tcG9uZW50LlxuICByZXR1cm4gdXBkYXRlKCk7XG59XG5cbi8vIFRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGZvciBjcmVhdGluZyBWbm9kZSBvYmplY3RzLlxuLy8gSXQgdGFrZXMgaW4gYSB0YWcgb3IgY29tcG9uZW50LCBhbmQgb3B0aW9uYWwgcHJvcHMgYW5kIGNoaWxkcmVuIGFyZ3VtZW50cy5cbmV4cG9ydCBjb25zdCB2OiBWID0gKHRhZ09yQ29tcG9uZW50LCBwcm9wcyA9IHt9LCAuLi5jaGlsZHJlbikgPT4ge1xuICAvLyBSZXR1cm4gYSBuZXcgVm5vZGUgb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMuXG4gIHJldHVybiBuZXcgVm5vZGUodGFnT3JDb21wb25lbnQsIHByb3BzIHx8IHt9LCBjaGlsZHJlbik7XG59O1xuXG4vLyBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gY3JlYXRlcyBhIGZyYWdtZW50IFZub2RlLlxuLy8gSXQgdGFrZXMgaW4gYSBwbGFjZWhvbGRlciBhbmQgdGhlIGNoaWxkcmVuIGFyZ3VtZW50cywgcmV0dXJucyBvbmx5IHRoZSBjaGlsZHJlbi5cbnYuZnJhZ21lbnQgPSAoXzogVm5vZGVQcm9wZXJ0aWVzLCAuLi5jaGlsZHJlbjogQ2hpbGRyZW4pID0+IGNoaWxkcmVuO1xuIl0sIm1hcHBpbmdzIjoiTUF1SEEsSUFBTUEsRUFBVSxRQUlMQyxFQUFXQyxRQUEyQixvQkFBWkMsU0FBMkJBLFFBQVFDLFVBQVlELFFBQVFDLFNBQVNDLE1BSTlGLFNBQVNDLEVBQWlCQyxFQUFhQyxHQUFpQixHQUM3RCxPQUFPQSxFQUFRQyxTQUFTQyxnQkFBZ0IsNkJBQThCSCxHQUFPRSxTQUFTRSxjQUFjSixFQUN0RyxDQU1PLElBQU1LLEVBQVEsU0FBcUNMLEVBQWFNLEVBQXdCQyxHQUU3RkMsS0FBS1IsSUFBTUEsRUFDWFEsS0FBS0YsTUFBUUEsRUFDYkUsS0FBS0QsU0FBV0EsQ0FDbEIsRUFJTyxTQUFTRSxFQUFZQyxHQUMxQixPQUFPZixRQUNMZSxJQUFtQyxtQkFBZEEsR0FBa0QsaUJBQWRBLEdBQTBCLFNBQVVBLEdBRWpHLENBR08sSUFBTUMsRUFBV0MsR0FFZkEsYUFBa0JQLEVBS2RRLEVBQW9CRCxHQUV4QkQsRUFBUUMsSUFBV0gsRUFBWUcsRUFBT1osS0FJeEMsU0FBU2MsRUFBV0MsR0FJekIsR0FBcUIsSUFBakJBLEVBQUlDLFNBQWdCLENBQ3RCLElBQUlDLEVBQVEsSUFBSVosRUFBTVosRUFBUyxDQUFDLEVBQUcsQ0FBQ3NCLEVBQUlHLFlBRXhDLE9BREFELEVBQU1GLElBQU1BLEVBQ0xFLENBQ1QsQ0FFQSxJQUFJVixFQUEyQixHQUUvQixRQUFTWSxFQUFJLEVBQUdDLEVBQUlMLEVBQUlNLFdBQVdDLE9BQVFILEVBQUlDLEVBQUdELElBQUssQ0FDckQsSUFBSUksRUFBV1IsRUFBSU0sV0FBV0YsR0FHSixJQUF0QkksRUFBU1AsVUFBd0MsSUFBdEJPLEVBQVNQLFVBQ3RDVCxFQUFTaUIsS0FBS1YsRUFBV1MsR0FFN0IsQ0FFQSxJQUFJakIsRUFBeUIsQ0FBQyxFQUU5QixRQUFTYSxFQUFJLEVBQUdDLEVBQUlMLEVBQUlVLFdBQVdILE9BQVFILEVBQUlDLEVBQUdELElBQUss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
1
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc05vZGVKcyIsIkJvb2xlYW4iLCJwcm9jZXNzIiwidmVyc2lvbnMiLCJub2RlIiwiVm5vZGUiLCJjb25zdHJ1Y3RvciIsInRhZyIsInByb3BzIiwiY2hpbGRyZW4iLCJkb20iLCJpc1NWRyIsInRoaXMiLCJpc0NvbXBvbmVudCIsImNvbXBvbmVudCIsImlzVm5vZGUiLCJvYmplY3QiLCJpc1Zub2RlQ29tcG9uZW50IiwidiIsInRhZ09yQ29tcG9uZW50IiwiZG9tVG9Wbm9kZSIsIm5vZGVUeXBlIiwibm9kZVZhbHVlIiwibm9kZU5hbWUiLCJ0b0xvd2VyQ2FzZSIsImkiLCJsIiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNoaWxkRG9tIiwicHVzaCIsImNoaWxkVm5vZGUiLCJhdHRyaWJ1dGVzIiwiYXR0ciIsInRydXN0IiwiaHRtbFN0cmluZyIsImRpdiIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImlubmVySFRNTCIsInRyaW0iLCJBcnJheSIsImZyb20iLCJtYXAiLCJmcmFnbWVudCIsIl8iLCJtYWluQ29tcG9uZW50IiwibWFpblZub2RlIiwiaXNNb3VudGVkIiwiY3VycmVudCIsInZub2RlIiwiZXZlbnQiLCJyZXNlcnZlZFByb3BzIiwiU2V0Iiwib25DbGVhbnVwU2V0Iiwib25Nb3VudFNldCIsIm9uVXBkYXRlU2V0Iiwib25Vbm1vdW50U2V0Iiwib25DbGVhbnVwIiwiY2FsbGJhY2siLCJhZGQiLCJjYWxsU2V0Iiwic2V0IiwiY2xlYXIiLCJoYW5kbGVWSWYiLCJzaG91bGRSZW5kZXIiLCJ2YWx1ZSIsInBhcmVudE5vZGUiLCJuZXdkb20iLCJjcmVhdGVUZXh0Tm9kZSIsInJlcGxhY2VDaGlsZCIsImRpcmVjdGl2ZXMiLCJib29sIiwic3R5bGUiLCJkaXNwbGF5IiwidmFsIiwibW9kZWwiLCJwcm9wZXJ0eSIsImhhbmRsZXIiLCJlIiwidGFyZ2V0IiwidHlwZSIsImlzQXJyYXkiLCJpZHgiLCJpbmRleE9mIiwic3BsaWNlIiwic2hhcmVkU2V0QXR0cmlidXRlIiwibXVsdGlwbGUiLCJjdHJsS2V5IiwiZm9yRWFjaCIsImNoaWxkIiwiam9pbiIsInNlbGVjdGVkIiwicHJldkhhbmRsZXIiLCJvbGRQcm9wcyIsImNsZWFudXAiLCJjbGFzc05hbWUiLCJjbGFzc0xpc3QiLCJuYW1lIiwidG9nZ2xlIiwiY2xhc3MiLCJpZCIsImRvbVN0eWxlIiwiZXZlbnRMaXN0ZW5lck5hbWVzIiwiZXZlbnRMaXN0ZW5lciIsImRlZmF1bHRQcmV2ZW50ZWQiLCJ1cGRhdGUiLCJuZXdWbm9kZSIsIm5ld1Zub2RlRG9tIiwicmVtb3ZlQXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwiaGFzIiwiYWRkRXZlbnRMaXN0ZW5lciIsInNsaWNlIiwiYWRkUHJvcGVydGllcyIsInZub2RlUHJvcHMiLCJ1cGRhdGVBdHRyaWJ1dGVzIiwidm5vZGVEb20iLCJyZW1vdmVBdHRyaWJ1dGVzIiwiY3JlYXRlRWxlbWVudE5TIiwiZmxhdFRyZWUiLCJuZXdDaGlsZCIsInZpZXciLCJiaW5kIiwiaGFuZGxlVkZvciIsImNyZWF0ZU5ld0VsZW1lbnQiLCJvbGRDaGlsZCIsImFwcGVuZENoaWxkIiwidGV4dENvbnRlbnQiLCJwYXRjaCIsIm9sZERvbUNoaWxkcmVuIiwib2xkQ2hpbGRyZW5MZW5ndGgiLCJmaXJzdE9sZFByb3BzIiwiZmlyc3RWbm9kZSIsIm9sZFRyZWUiLCJvbGRLZXllZExpc3QiLCJuZXdLZXllZExpc3QiLCJrZXkiLCJjdXJyZW50Q2hpbGQiLCJyZW1vdmUiLCJwYXRjaEtleWVkIiwiY2hpbGRyZW5MZW5ndGgiLCJuZXh0T2xkQ2hpbGQiLCJ1cGRhdGVWbm9kZSIsImRpcmVjdGl2ZSIsImRpcmVjdGl2ZU5hbWUiLCJjb250YWluZXIiLCJxdWVyeVNlbGVjdG9yIiwicmVzdWx0IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIlJlZmxlY3QiLCJkZWxldGVQcm9wZXJ0eSJdLCJzb3VyY2VzIjpbIi4uL2xpYi9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBzb25hcmpzL2NvZ25pdGl2ZS1jb21wbGV4aXR5ICovXG5kZWNsYXJlIGdsb2JhbCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2YXJzLW9uLXRvcCwgbm8tdmFyLCBuby11bnVzZWQtdmFyc1xuICB2YXIgZG9jdW1lbnQ6IERvY3VtZW50O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgbmFtZXNwYWNlIEpTWCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzLCBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIGludGVyZmFjZSBJbnRyaW5zaWNFbGVtZW50cyBleHRlbmRzIERlZmF1bHRSZWNvcmQge31cbiAgfVxufVxuXG5pbnRlcmZhY2UgRGVmYXVsdFJlY29yZCBleHRlbmRzIFJlY29yZDxzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIGFueT4ge31cblxuZXhwb3J0IGludGVyZmFjZSBWbm9kZVByb3BlcnRpZXMgZXh0ZW5kcyBEZWZhdWx0UmVjb3JkIHtcbiAga2V5Pzogc3RyaW5nIHwgbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERvbUVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50LCBEZWZhdWx0UmVjb3JkIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50IGV4dGVuZHMgRGVmYXVsdFJlY29yZCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycywgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgKHByb3BzOiBWbm9kZVByb3BlcnRpZXMsIGNoaWxkcmVuOiBhbnlbXSk6IFZub2RlIHwgYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBPSk9Db21wb25lbnQgZXh0ZW5kcyBEZWZhdWx0UmVjb3JkIHtcbiAgdmlldzogQ29tcG9uZW50O1xufVxuXG5leHBvcnQgdHlwZSBWYWx5cmlhbkNvbXBvbmVudCA9IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQ7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuZXhwb3J0IGludGVyZmFjZSBWbm9kZUNvbXBvbmVudEludGVyZmFjZSBleHRlbmRzIFZub2RlIHtcbiAgdGFnOiBWYWx5cmlhbkNvbXBvbmVudDtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG5leHBvcnQgaW50ZXJmYWNlIENoaWxkcmVuIGV4dGVuZHMgQXJyYXk8Vm5vZGUgfCBWbm9kZUNvbXBvbmVudEludGVyZmFjZSB8IFZhbHlyaWFuQ29tcG9uZW50IHwgYW55PiB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycywgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgKHZhbHVlOiBhbnksIHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFByb3BzOiBWbm9kZVByb3BlcnRpZXMgfCBudWxsKTogdm9pZCB8IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBpc05vZGVKcyA9IEJvb2xlYW4odHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy52ZXJzaW9ucyAmJiBwcm9jZXNzLnZlcnNpb25zLm5vZGUpO1xuXG5leHBvcnQgY2xhc3MgVm5vZGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgdGFnOiBzdHJpbmcgfCBDb21wb25lbnQgfCBQT0pPQ29tcG9uZW50LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBwcm9wczogbnVsbCB8IFZub2RlUHJvcGVydGllcyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgY2hpbGRyZW46IENoaWxkcmVuLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBkb20/OiBEb21FbGVtZW50LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBpc1NWRz86IGJvb2xlYW5cbiAgKSB7fVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZub2RlV2l0aERvbSBleHRlbmRzIFZub2RlIHtcbiAgdGFnOiBzdHJpbmc7XG4gIGRvbTogRG9tRWxlbWVudDtcbiAgcHJvcHM6IFZub2RlUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGNvbnN0IGlzQ29tcG9uZW50ID0gKGNvbXBvbmVudDogdW5rbm93bik6IGNvbXBvbmVudCBpcyBDb21wb25lbnQgPT5cbiAgQm9vbGVhbih0eXBlb2YgY29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIgfHwgKGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50ID09PSBcIm9iamVjdFwiICYmIFwidmlld1wiIGluIGNvbXBvbmVudCkpO1xuZXhwb3J0IGNvbnN0IGlzVm5vZGUgPSAob2JqZWN0PzogdW5rbm93bik6IG9iamVjdCBpcyBWbm9kZSA9PiBvYmplY3QgaW5zdGFuY2VvZiBWbm9kZTtcblxuZXhwb3J0IGNvbnN0IGlzVm5vZGVDb21wb25lbnQgPSAob2JqZWN0PzogdW5rbm93bik6IG9iamVjdCBpcyBWbm9kZUNvbXBvbmVudEludGVyZmFjZSA9PiB7XG4gIHJldHVybiBpc1Zub2RlKG9iamVjdCkgJiYgaXNDb21wb25lbnQob2JqZWN0LnRhZyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdih0YWdPckNvbXBvbmVudDogc3RyaW5nIHwgQ29tcG9uZW50LCBwcm9wczogVm5vZGVQcm9wZXJ0aWVzLCAuLi5jaGlsZHJlbjogQ2hpbGRyZW4pIHtcbiAgcmV0dXJuIG5ldyBWbm9kZSh0YWdPckNvbXBvbmVudCwgcHJvcHMsIGNoaWxkcmVuKTtcbn1cblxudi5mcmFnbWVudCA9IChfOiBWbm9kZVByb3BlcnRpZXMsIC4uLmNoaWxkcmVuOiBDaGlsZHJlbikgPT4gY2hpbGRyZW47XG5cbmV4cG9ydCBmdW5jdGlvbiBkb21Ub1Zub2RlKGRvbTogYW55KTogVm5vZGVXaXRoRG9tIHwgdm9pZCB7XG4gIGlmIChkb20ubm9kZVR5cGUgPT09IDMpIHtcbiAgICByZXR1cm4gZG9tLm5vZGVWYWx1ZTtcbiAgfVxuXG4gIGlmIChkb20ubm9kZVR5cGUgPT09IDEpIHtcbiAgICBjb25zdCB0YWcgPSBkb20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBwcm9wcyA9IHt9IGFzIFZub2RlUHJvcGVydGllcztcbiAgICBjb25zdCBjaGlsZHJlbiA9IFtdIGFzIENoaWxkcmVuO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBkb20uY2hpbGROb2Rlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkRG9tID0gZG9tLmNoaWxkTm9kZXNbaV07XG4gICAgICBpZiAoY2hpbGREb20ubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZERvbS5ub2RlVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChjaGlsZERvbS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICBjb25zdCBjaGlsZFZub2RlID0gZG9tVG9Wbm9kZShjaGlsZERvbSk7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGRWbm9kZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGRvbS5hdHRyaWJ1dGVzO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gYXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNvbnN0IGF0dHIgPSBhdHRyaWJ1dGVzW2ldO1xuICAgICAgcHJvcHNbYXR0ci5ub2RlTmFtZV0gPSBhdHRyLm5vZGVWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFZub2RlKHRhZywgcHJvcHMsIGNoaWxkcmVuLCBkb20sIHRhZyA9PT0gXCJzdmdcIikgYXMgVm5vZGVXaXRoRG9tO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cnVzdChodG1sU3RyaW5nOiBzdHJpbmcpIHtcbiAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgZGl2LmlubmVySFRNTCA9IGh0bWxTdHJpbmcudHJpbSgpO1xuICByZXR1cm4gQXJyYXkuZnJvbShkaXYuY2hpbGROb2RlcykubWFwKGRvbVRvVm5vZGUpO1xufVxuXG5sZXQgbWFpbkNvbXBvbmVudDogVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgfCBudWxsID0gbnVsbDtcbmxldCBtYWluVm5vZGU6IFZub2RlV2l0aERvbSB8IG51bGwgPSBudWxsO1xubGV0IGlzTW91bnRlZCA9IGZhbHNlO1xuXG5leHBvcnQgY29uc3QgY3VycmVudCA9IHtcbiAgdm5vZGU6IG51bGwgYXMgVm5vZGUgfCBudWxsLFxuICBjb21wb25lbnQ6IG51bGwgYXMgVmFseXJpYW5Db21wb25lbnQgfCBudWxsLFxuICBldmVudDogbnVsbCBhcyBFdmVudCB8IG51bGxcbn07XG5cbmV4cG9ydCBjb25zdCByZXNlcnZlZFByb3BzID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgXCJrZXlcIixcbiAgXCJzdGF0ZVwiLFxuICBcInYta2VlcFwiLFxuICBcInYtdGV4dFwiLFxuICBcInYtaWZcIixcbiAgXCJ2LWZvclwiLFxuICBcInYtc2hvd1wiLFxuICBcInYtY2xhc3NcIixcbiAgXCJ2LWh0bWxcIixcbiAgXCJ2LW1vZGVsXCIsXG4gIFwidi1jcmVhdGVcIixcbiAgXCJ2LXVwZGF0ZVwiLFxuICBcInYtY2xlYW51cFwiXG5dKTtcblxuY29uc3Qgb25DbGVhbnVwU2V0ID0gbmV3IFNldDxGdW5jdGlvbj4oKTtcbmNvbnN0IG9uTW91bnRTZXQgPSBuZXcgU2V0PEZ1bmN0aW9uPigpO1xuY29uc3Qgb25VcGRhdGVTZXQgPSBuZXcgU2V0PEZ1bmN0aW9uPigpO1xuY29uc3Qgb25Vbm1vdW50U2V0ID0gbmV3IFNldDxGdW5jdGlvbj4oKTtcbmV4cG9ydCBjb25zdCBvbk1vdW50ID0gKGNhbGxiYWNrOiBGdW5jdGlvbikgPT4gIWlzTW91bnRlZCAmJiBvbk1vdW50U2V0LmFkZChjYWxsYmFjayk7XG5leHBvcnQgY29uc3Qgb25VcGRhdGUgPSAoY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiBvblVwZGF0ZVNldC5hZGQoY2FsbGJhY2spO1xuZXhwb3J0IGNvbnN0IG9uQ2xlYW51cCA9IChjYWxsYmFjazogRnVuY3Rpb24pID0+IG9uQ2xlYW51cFNldC5hZGQoY2FsbGJhY2spO1xuZXhwb3J0IGNvbnN0IG9uVW5tb3VudCA9IChjYWxsYmFjazogRnVuY3Rpb24pID0+ICFpc01vdW50ZWQgJiYgb25Vbm1vdW50U2V0LmFkZChjYWxsYmFjayk7XG5jb25zdCBjYWxsU2V0ID0gKHNldDogU2V0PEZ1bmN0aW9uPikgPT4ge1xuICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHNldCkge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cbiAgc2V0LmNsZWFyKCk7XG59O1xuXG5jb25zdCBoYW5kbGVWSWYgPSAoc2hvdWxkUmVuZGVyOiBib29sZWFuKTogRGlyZWN0aXZlID0+IHtcbiAgcmV0dXJuICh2YWx1ZSwgdm5vZGUpID0+IHtcbiAgICBjb25zdCBib29sID0gc2hvdWxkUmVuZGVyICE9PSBCb29sZWFuKHZhbHVlKTtcbiAgICBpZiAoYm9vbCkge1xuICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHZub2RlLmRvbT8ucGFyZW50Tm9kZTtcbiAgICAgIGlmIChwYXJlbnROb2RlKSB7XG4gICAgICAgIGNvbnN0IG5ld2RvbSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xuICAgICAgICBwYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdkb20sIHZub2RlLmRvbSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZGlyZWN0aXZlczogUmVjb3JkPHN0cmluZywgRGlyZWN0aXZlPiA9IHtcbiAgXCJ2LWlmXCI6IGhhbmRsZVZJZih0cnVlKSxcbiAgXCJ2LXVubGVzc1wiOiBoYW5kbGVWSWYoZmFsc2UpLFxuXG4gIFwidi1zaG93XCI6ICh2YWx1ZSwgdm5vZGUpID0+IHtcbiAgICBjb25zdCBib29sID0gQm9vbGVhbih2YWx1ZSk7XG4gICAgKFxuICAgICAgdm5vZGUuZG9tIGFzIHVua25vd24gYXMge1xuICAgICAgICBzdHlsZTogeyBkaXNwbGF5OiBzdHJpbmcgfTtcbiAgICAgIH1cbiAgICApLnN0eWxlLmRpc3BsYXkgPSBib29sID8gXCJcIiA6IFwibm9uZVwiO1xuICB9LFxuXG4gIFwidi1odG1sXCI6ICh2YWx1ZSwgdm5vZGUpID0+IHtcbiAgICB2bm9kZS5jaGlsZHJlbiA9IFt0cnVzdCh2YWx1ZSBhcyBzdHJpbmcpXTtcbiAgfSxcblxuICAvLyBUaGUgXCJ2LW1vZGVsXCIgZGlyZWN0aXZlIGJpbmRzIHRoZSB2YWx1ZSBvZiBhbiBpbnB1dCBlbGVtZW50IHRvIGEgbW9kZWwgcHJvcGVydHlcbiAgXCJ2LW1vZGVsXCI6ICh2YWwsIHZub2RlKSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCBbbW9kZWwsIHByb3BlcnR5LCBldmVudF06IGFueVtdID0gdmFsIGFzIGFueVtdO1xuICAgIGxldCB2YWx1ZTtcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIG1vZGVsIHByb3BlcnR5IHdoZW4gdGhlIGlucHV0IGVsZW1lbnQncyB2YWx1ZSBjaGFuZ2VzXG4gICAgbGV0IGhhbmRsZXIgPSAoZTogRXZlbnQpID0+IChtb2RlbFtwcm9wZXJ0eV0gPSAoZS50YXJnZXQgYXMgRG9tRWxlbWVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pLnZhbHVlKTtcbiAgICBpZiAodm5vZGUudGFnID09PSBcImlucHV0XCIpIHtcbiAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIGFuIGlucHV0LCB1c2UgdGhlIFwiaW5wdXRcIiBldmVudCBieSBkZWZhdWx0XG4gICAgICBldmVudCA9IGV2ZW50IHx8IFwib25pbnB1dFwiO1xuICAgICAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGlucHV0IGVsZW1lbnQsIHVzZSBhIGRpZmZlcmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICBzd2l0Y2ggKHZub2RlLnByb3BzLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6IHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RlbFtwcm9wZXJ0eV0pKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgbW9kZWwgcHJvcGVydHkgaXMgYW4gYXJyYXksIGFkZCBvciByZW1vdmUgdGhlIHZhbHVlIGZyb20gdGhlIGFycmF5IHdoZW4gdGhlIGNoZWNrYm94IGlzIGNoZWNrZWQgb3IgdW5jaGVja2VkXG4gICAgICAgICAgICBoYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChlLnRhcmdldCBhcyBEb21FbGVtZW50ICYgUmVjb3JkPHN0cmluZywgYW55PikudmFsdWU7XG4gICAgICAgICAgICAgIGNvbnN0IGlkeCA9IG1vZGVsW3Byb3BlcnR5XS5pbmRleE9mKHZhbCk7XG4gICAgICAgICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0uc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgaW4gdGhlIGFycmF5LCBzZXQgdGhlIGNoZWNrYm94IHRvIGJlIGNoZWNrZWRcbiAgICAgICAgICAgIHZhbHVlID0gbW9kZWxbcHJvcGVydHldLmluZGV4T2Yodm5vZGUuZG9tLnZhbHVlKSAhPT0gLTE7XG4gICAgICAgICAgfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gdm5vZGUucHJvcHMpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBpbnB1dCBlbGVtZW50IGhhcyBhIFwidmFsdWVcIiBhdHRyaWJ1dGUsIHVzZSBpdCB0byBkZXRlcm1pbmUgdGhlIGNoZWNrZWQgc3RhdGVcbiAgICAgICAgICAgIGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChtb2RlbFtwcm9wZXJ0eV0gPT09IHZub2RlLnByb3BzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldID0gbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0gPSB2bm9kZS5wcm9wcy52YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhbHVlID0gbW9kZWxbcHJvcGVydHldID09PSB2bm9kZS5wcm9wcy52YWx1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gXCJ2YWx1ZVwiIGF0dHJpYnV0ZSwgdXNlIGEgYm9vbGVhbiB2YWx1ZSBmb3IgdGhlIG1vZGVsIHByb3BlcnR5XG4gICAgICAgICAgICBoYW5kbGVyID0gKCkgPT4gKG1vZGVsW3Byb3BlcnR5XSA9ICFtb2RlbFtwcm9wZXJ0eV0pO1xuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV07XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNldCB0aGUgXCJjaGVja2VkXCIgYXR0cmlidXRlIG9uIHRoZSBpbnB1dCBlbGVtZW50XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgc2hhcmVkU2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCB2YWx1ZSwgdm5vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyYWRpb1wiOiB7XG4gICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgYSByYWRpbyBidXR0b24sIHNldCB0aGUgXCJjaGVja2VkXCIgYXR0cmlidXRlIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICBzaGFyZWRTZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIG1vZGVsW3Byb3BlcnR5XSA9PT0gdm5vZGUuZG9tLnZhbHVlLCB2bm9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIC8vIEZvciBhbGwgb3RoZXIgaW5wdXQgdHlwZXMsIHNldCB0aGUgXCJ2YWx1ZVwiIGF0dHJpYnV0ZSBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlIG1vZGVsIHByb3BlcnR5XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgc2hhcmVkU2V0QXR0cmlidXRlKFwidmFsdWVcIiwgbW9kZWxbcHJvcGVydHldLCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZub2RlLnRhZyA9PT0gXCJzZWxlY3RcIikge1xuICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgYSBzZWxlY3QgZWxlbWVudCwgdXNlIHRoZSBcImNsaWNrXCIgZXZlbnQgYnkgZGVmYXVsdFxuICAgICAgZXZlbnQgPSBldmVudCB8fCBcIm9uY2xpY2tcIjtcbiAgICAgIGlmICh2bm9kZS5wcm9wcy5tdWx0aXBsZSkge1xuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0IGVsZW1lbnQgYWxsb3dzIG11bHRpcGxlIHNlbGVjdGlvbnMsIHVwZGF0ZSB0aGUgbW9kZWwgcHJvcGVydHkgd2l0aCBhbiBhcnJheSBvZiBzZWxlY3RlZCB2YWx1ZXNcbiAgICAgICAgaGFuZGxlciA9IChlOiBFdmVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHtcbiAgICAgICAgICBjb25zdCB2YWwgPSAoZS50YXJnZXQgYXMgRG9tRWxlbWVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pLnZhbHVlO1xuICAgICAgICAgIGlmIChlLmN0cmxLZXkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBDdHJsIGtleSBpcyBwcmVzc2VkLCBhZGQgb3IgcmVtb3ZlIHRoZSB2YWx1ZSBmcm9tIHRoZSBhcnJheVxuICAgICAgICAgICAgY29uc3QgaWR4ID0gbW9kZWxbcHJvcGVydHldLmluZGV4T2YodmFsKTtcbiAgICAgICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5wdXNoKHZhbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0uc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBDdHJsIGtleSBpcyBub3QgcHJlc3NlZCwgc2V0IHRoZSBtb2RlbCBwcm9wZXJ0eSB0byBhbiBhcnJheSB3aXRoIHRoZSBzZWxlY3RlZCB2YWx1ZVxuICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnNwbGljZSgwLCBtb2RlbFtwcm9wZXJ0eV0ubGVuZ3RoKTtcbiAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5wdXNoKHZhbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBTZXQgdGhlIFwic2VsZWN0ZWRcIiBhdHRyaWJ1dGUgb24gdGhlIG9wdGlvbnMgYmFzZWQgb24gd2hldGhlciB0aGV5IGFyZSBpbiB0aGUgbW9kZWwgcHJvcGVydHkgYXJyYXlcbiAgICAgICAgdm5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IFZub2RlV2l0aERvbSkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZC50YWcgPT09IFwib3B0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gXCJ2YWx1ZVwiIGluIGNoaWxkLnByb3BzID8gY2hpbGQucHJvcHMudmFsdWUgOiBjaGlsZC5jaGlsZHJlbi5qb2luKFwiXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGNoaWxkLnByb3BzLnNlbGVjdGVkID0gbW9kZWxbcHJvcGVydHldLmluZGV4T2YodmFsdWUpICE9PSAtMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgdGhlIHNlbGVjdCBlbGVtZW50IGRvZXMgbm90IGFsbG93IG11bHRpcGxlIHNlbGVjdGlvbnMsIHNldCB0aGUgXCJzZWxlY3RlZFwiIGF0dHJpYnV0ZSBvbiB0aGUgb3B0aW9ucyBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlIG1vZGVsIHByb3BlcnR5XG4gICAgICAgIHZub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQudGFnID09PSBcIm9wdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IFwidmFsdWVcIiBpbiBjaGlsZC5wcm9wcyA/IGNoaWxkLnByb3BzLnZhbHVlIDogY2hpbGQuY2hpbGRyZW4uam9pbihcIlwiKS50cmltKCk7XG4gICAgICAgICAgICBjaGlsZC5wcm9wcy5zZWxlY3RlZCA9IHZhbHVlID09PSBtb2RlbFtwcm9wZXJ0eV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZub2RlLnRhZyA9PT0gXCJ0ZXh0YXJlYVwiKSB7XG4gICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBhIHRleHRhcmVhLCB1c2UgdGhlIFwiaW5wdXRcIiBldmVudCBieSBkZWZhdWx0XG4gICAgICBldmVudCA9IGV2ZW50IHx8IFwib25pbnB1dFwiO1xuICAgICAgLy8gU2V0IHRoZSB0ZXh0YXJlYSdzIGNvbnRlbnQgdG8gdGhlIHZhbHVlIG9mIHRoZSBtb2RlbCBwcm9wZXJ0eVxuICAgICAgdm5vZGUuY2hpbGRyZW4gPSBbbW9kZWxbcHJvcGVydHldXTtcbiAgICB9XG5cbiAgICAvLyBXZSBhc3N1bWUgdGhhdCB0aGUgcHJldiBoYW5kbGVyIGlmIGFueSB3aWxsIG5vdCBiZSBjaGFuZ2VkIGJ5IHRoZSB1c2VyIGFjcm9zcyBwYXRjaHNcbiAgICBjb25zdCBwcmV2SGFuZGxlciA9IHZub2RlLnByb3BzW2V2ZW50XTtcblxuICAgIC8vIFNldCB0aGUgZXZlbnQgaGFuZGxlciBvbiB0aGUgZWxlbWVudFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIHNoYXJlZFNldEF0dHJpYnV0ZShcbiAgICAgIGV2ZW50LFxuICAgICAgKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgIGhhbmRsZXIoZSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIGhhbmRsZXIgaXMgZGVmaW5lZCwgY2FsbCBpdCBhZnRlciB0aGUgbW9kZWwgaGFzIGJlZW4gdXBkYXRlZFxuICAgICAgICBpZiAocHJldkhhbmRsZXIpIHtcbiAgICAgICAgICBwcmV2SGFuZGxlcihlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHZub2RlXG4gICAgKTtcbiAgfSxcblxuICBcInYtY3JlYXRlXCI6IChjYWxsYmFjaywgdm5vZGUsIG9sZFByb3BzKSA9PiB7XG4gICAgaWYgKCFvbGRQcm9wcykge1xuICAgICAgY29uc3QgY2xlYW51cCA9IGNhbGxiYWNrKHZub2RlKTtcblxuICAgICAgaWYgKHR5cGVvZiBjbGVhbnVwID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgb25DbGVhbnVwKGNsZWFudXApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBcInYtdXBkYXRlXCI6IChjYWxsYmFjaywgdm5vZGUsIG9sZFByb3BzKSA9PiB7XG4gICAgaWYgKG9sZFByb3BzKSB7XG4gICAgICBjb25zdCBjbGVhbnVwID0gY2FsbGJhY2sodm5vZGUsIG9sZFByb3BzKTtcblxuICAgICAgaWYgKHR5cGVvZiBjbGVhbnVwID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgb25DbGVhbnVwKGNsZWFudXApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBcInYtY2xlYW51cFwiOiAoY2FsbGJhY2ssIHZub2RlKSA9PiB7XG4gICAgb25DbGVhbnVwKCgpID0+IGNhbGxiYWNrKHZub2RlKSk7XG4gIH0sXG5cbiAgXCJ2LWNsYXNzXCI6ICh2YWx1ZSwgdm5vZGUpID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2bm9kZS5kb20uY2xhc3NOYW1lID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgdm5vZGUuZG9tLmNsYXNzTmFtZSA9IHZhbHVlLmpvaW4oXCIgXCIpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCBjbGFzc0xpc3QgPSB2bm9kZS5kb20uY2xhc3NMaXN0O1xuICAgICAgZm9yIChjb25zdCBuYW1lIGluIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHR5cGVvZiB2YWx1ZVtuYW1lXSA9PT0gXCJmdW5jdGlvblwiID8gKHZhbHVlW25hbWVdIGFzIEZ1bmN0aW9uKSgpIDogdmFsdWVbbmFtZV07XG4gICAgICAgIGNsYXNzTGlzdC50b2dnbGUobmFtZSwgdmFsKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gRnJlcXVlbnQgdXNlZCBwcm9wZXJ0aWVzXG4gIGNsYXNzKHZhbHVlLCB2bm9kZSkge1xuICAgIGlmICh2bm9kZS5kb20uY2xhc3NOYW1lICE9PSB2YWx1ZSkge1xuICAgICAgdm5vZGUuZG9tLmNsYXNzTmFtZSA9IHZhbHVlO1xuICAgIH1cbiAgfSxcblxuICBjbGFzc05hbWUodmFsdWUsIHZub2RlKSB7XG4gICAgZGlyZWN0aXZlcy5jbGFzcyh2YWx1ZSwgdm5vZGUsIG51bGwpO1xuICB9LFxuXG4gIGlkOiAodmFsdWUsIHZub2RlKSA9PiB7XG4gICAgdm5vZGUuZG9tLmlkID0gdmFsdWU7XG4gIH0sXG5cbiAgc3R5bGU6ICh2YWx1ZSwgdm5vZGUpID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2bm9kZS5kb20uc3R5bGUgPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdm5vZGUuZG9tLnN0eWxlID0gXCJcIjtcbiAgICAgIGNvbnN0IGRvbVN0eWxlID0gdm5vZGUuZG9tLnN0eWxlO1xuICAgICAgZm9yIChjb25zdCBuYW1lIGluIHZhbHVlKSB7XG4gICAgICAgIGRvbVN0eWxlW25hbWVdID0gdmFsdWVbbmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlyZWN0aXZlKG5hbWU6IHN0cmluZywgZGlyZWN0aXZlOiBEaXJlY3RpdmUpIHtcbiAgY29uc3QgZGlyZWN0aXZlTmFtZSA9IGB2LSR7bmFtZX1gO1xuICBkaXJlY3RpdmVzW2RpcmVjdGl2ZU5hbWVdID0gZGlyZWN0aXZlO1xuICByZXNlcnZlZFByb3BzLmFkZChkaXJlY3RpdmVOYW1lKTtcbn1cblxuY29uc3QgZXZlbnRMaXN0ZW5lck5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbmZ1bmN0aW9uIGV2ZW50TGlzdGVuZXIoZTogRXZlbnQpIHtcbiAgY3VycmVudC5ldmVudCA9IGU7XG4gIGxldCBkb20gPSBlLnRhcmdldCBhcyBEb21FbGVtZW50O1xuICBjb25zdCBuYW1lID0gYG9uJHtlLnR5cGV9YDtcblxuICB3aGlsZSAoZG9tKSB7XG4gICAgY29uc3Qgb2xkUHJvcHMgPSBkb20ucHJvcHM7XG4gICAgaWYgKG9sZFByb3BzICYmIG9sZFByb3BzW25hbWVdKSB7XG4gICAgICBvbGRQcm9wc1tuYW1lXShlLCBkb20pO1xuXG4gICAgICBpZiAoIWUuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgdXBkYXRlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRvbSA9IGRvbS5wYXJlbnROb2RlIGFzIERvbUVsZW1lbnQ7XG4gIH1cblxuICBjdXJyZW50LmV2ZW50ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gc2hhcmVkU2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgbmV3Vm5vZGU6IFZub2RlV2l0aERvbSk6IHZvaWQgfCBib29sZWFuIHtcbiAgY29uc3QgbmV3Vm5vZGVEb20gPSBuZXdWbm9kZS5kb207XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGlmICghZXZlbnRMaXN0ZW5lck5hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgKG1haW5Wbm9kZSBhcyBWbm9kZVdpdGhEb20pLmRvbS5hZGRFdmVudExpc3RlbmVyKG5hbWUuc2xpY2UoMiksIGV2ZW50TGlzdGVuZXIpO1xuICAgICAgZXZlbnRMaXN0ZW5lck5hbWVzLmFkZChuYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG5hbWUgaW4gbmV3Vm5vZGVEb20pIHtcbiAgICBuZXdWbm9kZURvbVtuYW1lXSA9IHZhbHVlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICBuZXdWbm9kZURvbS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgbmV3Vm5vZGVEb20uc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgbmV3Vm5vZGU6IFZub2RlV2l0aERvbSk6IHZvaWQge1xuICBpZiAoIXJlc2VydmVkUHJvcHMuaGFzKG5hbWUpKSB7XG4gICAgbmV3Vm5vZGUucHJvcHNbbmFtZV0gPSB2YWx1ZTtcbiAgICBzaGFyZWRTZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIG5ld1Zub2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVBdHRyaWJ1dGVzKHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFByb3BzOiBWbm9kZVByb3BlcnRpZXMgfCBudWxsKTogdm9pZCB7XG4gIGlmICghb2xkUHJvcHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB2bm9kZURvbSA9IHZub2RlLmRvbTtcbiAgY29uc3Qgdm5vZGVQcm9wcyA9IHZub2RlLnByb3BzO1xuXG4gIGZvciAoY29uc3QgbmFtZSBpbiBvbGRQcm9wcykge1xuICAgIGlmIChuYW1lIGluIHZub2RlUHJvcHMgPT09IGZhbHNlICYmICFldmVudExpc3RlbmVyTmFtZXMuaGFzKG5hbWUpICYmICFyZXNlcnZlZFByb3BzLmhhcyhuYW1lKSkge1xuICAgICAgaWYgKG5hbWUgaW4gdm5vZGVEb20pIHtcbiAgICAgICAgdm5vZGVEb21bbmFtZV0gPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdm5vZGVEb20ucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRQcm9wZXJ0aWVzKHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFByb3BzOiBWbm9kZVByb3BlcnRpZXMgfCBudWxsKSB7XG4gIGNvbnN0IHZub2RlUHJvcHMgPSB2bm9kZS5wcm9wcztcbiAgZm9yIChjb25zdCBuYW1lIGluIHZub2RlUHJvcHMpIHtcbiAgICBpZiAoZGlyZWN0aXZlc1tuYW1lXSkge1xuICAgICAgaWYgKGRpcmVjdGl2ZXNbbmFtZV0odm5vZGVQcm9wc1tuYW1lXSwgdm5vZGUsIG9sZFByb3BzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocmVzZXJ2ZWRQcm9wcy5oYXMobmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHNoYXJlZFNldEF0dHJpYnV0ZShuYW1lLCB2bm9kZVByb3BzW25hbWVdLCB2bm9kZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUF0dHJpYnV0ZXMobmV3Vm5vZGU6IFZub2RlV2l0aERvbSwgb2xkUHJvcHM6IFZub2RlUHJvcGVydGllcyB8IG51bGwpOiB2b2lkIHtcbiAgcmVtb3ZlQXR0cmlidXRlcyhuZXdWbm9kZSwgb2xkUHJvcHMpO1xuICBhZGRQcm9wZXJ0aWVzKG5ld1Zub2RlLCBvbGRQcm9wcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KHRhZzogc3RyaW5nLCBpc1NWRzogYm9vbGVhbik6IERvbUVsZW1lbnQge1xuICByZXR1cm4gaXNTVkdcbiAgICA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIHRhZylcbiAgICA6IChkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZykgYXMgRG9tRWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIGZsYXRUcmVlKG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIGNoaWxkcmVuOiBDaGlsZHJlbikge1xuICBjdXJyZW50LnZub2RlID0gbmV3Vm5vZGU7XG4gIGxldCBpID0gMDtcblxuICB3aGlsZSAoaSA8IGNoaWxkcmVuLmxlbmd0aCkge1xuICAgIGNvbnN0IG5ld0NoaWxkID0gY2hpbGRyZW5baV07XG5cbiAgICBpZiAobmV3Q2hpbGQgPT0gbnVsbCkge1xuICAgICAgY2hpbGRyZW4uc3BsaWNlKGksIDEpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV3Q2hpbGQpKSB7XG4gICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMSwgLi4ubmV3Q2hpbGQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5ld0NoaWxkIGluc3RhbmNlb2YgVm5vZGUpIHtcbiAgICAgIGlmIChuZXdDaGlsZC5wcm9wcyA9PT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZC5wcm9wcyA9IHt9O1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkLnRhZyAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXdDaGlsZC50YWc7XG5cbiAgICAgICAgY3VycmVudC5jb21wb25lbnQgPSBuZXdDaGlsZC50YWc7XG4gICAgICAgIGNoaWxkcmVuW2ldID0gKFwidmlld1wiIGluIGNvbXBvbmVudCA/IGNvbXBvbmVudC52aWV3IDogY29tcG9uZW50KS5iaW5kKGNvbXBvbmVudCkoXG4gICAgICAgICAgbmV3Q2hpbGQucHJvcHMsXG4gICAgICAgICAgbmV3Q2hpbGQuY2hpbGRyZW5cbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdDaGlsZC5pc1NWRyA9IG5ld1Zub2RlLmlzU1ZHIHx8IG5ld0NoaWxkLnRhZyA9PT0gXCJzdmdcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpKys7XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW47XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVZGb3IobmV3Vm5vZGU6IFZub2RlV2l0aERvbSkge1xuICBpZiAoXCJ2LWZvclwiIGluIG5ld1Zub2RlLnByb3BzKSB7XG4gICAgY29uc3Qgc2V0ID0gbmV3Vm5vZGUucHJvcHNbXCJ2LWZvclwiXTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IFtdO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gbmV3Vm5vZGUuY2hpbGRyZW5bMF07XG4gICAgY2hpbGRyZW4ubGVuZ3RoID0gc2V0Lmxlbmd0aDtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gc2V0Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgY2hpbGRyZW5baV0gPSBjYWxsYmFjayhzZXRbaV0sIGkpO1xuICAgIH1cblxuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuICByZXR1cm4gWy4uLm5ld1Zub2RlLmNoaWxkcmVuXTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTmV3RWxlbWVudChuZXdDaGlsZDogVm5vZGVXaXRoRG9tLCBuZXdWbm9kZTogVm5vZGVXaXRoRG9tLCBvbGRDaGlsZDogRG9tRWxlbWVudCB8IG51bGwpIHtcbiAgY29uc3QgZG9tID0gY3JlYXRlRWxlbWVudChuZXdDaGlsZC50YWcsIG5ld0NoaWxkLmlzU1ZHIGFzIGJvb2xlYW4pO1xuICBpZiAob2xkQ2hpbGQpIHtcbiAgICBuZXdWbm9kZS5kb20ucmVwbGFjZUNoaWxkKGRvbSwgb2xkQ2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIG5ld1Zub2RlLmRvbS5hcHBlbmRDaGlsZChkb20pO1xuICB9XG4gIG5ld0NoaWxkLmRvbSA9IGRvbTtcbiAgYWRkUHJvcGVydGllcyhuZXdDaGlsZCwgbnVsbCk7XG4gIG5ld0NoaWxkLmRvbS5wcm9wcyA9IG5ld0NoaWxkLnByb3BzO1xuICBpZiAoXCJ2LXRleHRcIiBpbiBuZXdDaGlsZC5wcm9wcykge1xuICAgIG5ld0NoaWxkLmRvbS50ZXh0Q29udGVudCA9IG5ld0NoaWxkLnByb3BzW1widi10ZXh0XCJdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNoaWxkcmVuID0gZmxhdFRyZWUobmV3Q2hpbGQsIGhhbmRsZVZGb3IobmV3Q2hpbGQpKTtcbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgIG5ld0NoaWxkLmRvbS50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoY2hpbGRyZW5baV0gaW5zdGFuY2VvZiBWbm9kZSA9PT0gZmFsc2UpIHtcbiAgICAgIG5ld0NoaWxkLmRvbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjaGlsZHJlbltpXSkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNyZWF0ZU5ld0VsZW1lbnQoY2hpbGRyZW5baV0sIG5ld0NoaWxkLCBudWxsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXRjaEtleWVkKG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIGNoaWxkcmVuOiBDaGlsZHJlbikge1xuICBjb25zdCBvbGRUcmVlID0gWy4uLkFycmF5LmZyb20obmV3Vm5vZGUuZG9tLmNoaWxkTm9kZXMpXSBhcyB1bmtub3duIGFzIERvbUVsZW1lbnRbXTtcbiAgY29uc3QgY2hpbGROb2RlcyA9IG5ld1Zub2RlLmRvbS5jaGlsZE5vZGVzO1xuICBjb25zdCBvbGRLZXllZExpc3Q6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgY29uc3QgbmV3S2V5ZWRMaXN0OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG5cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBvbGRUcmVlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IG9sZFByb3BzID0gb2xkVHJlZVtpXS5wcm9wcztcbiAgICBpZiAob2xkUHJvcHMpIHtcbiAgICAgIG9sZEtleWVkTGlzdFtvbGRQcm9wcy5rZXkgYXMgc3RyaW5nXSA9IGk7XG4gICAgfVxuXG4gICAgaWYgKGkgPCBjaGlsZHJlbi5sZW5ndGggJiYgY2hpbGRyZW5baV0gaW5zdGFuY2VvZiBWbm9kZSkge1xuICAgICAgbmV3S2V5ZWRMaXN0W2NoaWxkcmVuW2ldLnByb3BzLmtleSBhcyBzdHJpbmddID0gaTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IG5ld0NoaWxkID0gY2hpbGRyZW5baV07XG4gICAgY29uc3Qgb2xkQ2hpbGQgPSBvbGRUcmVlW29sZEtleWVkTGlzdFtuZXdDaGlsZC5wcm9wcy5rZXkgYXMgc3RyaW5nXV07XG5cbiAgICBpZiAoIW9sZENoaWxkKSB7XG4gICAgICBjcmVhdGVOZXdFbGVtZW50KG5ld0NoaWxkLCBuZXdWbm9kZSwgY2hpbGROb2Rlc1tpXSBhcyBEb21FbGVtZW50IHwgbnVsbCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBuZXdDaGlsZC5kb20gPSBvbGRDaGlsZDtcbiAgICBjb25zdCBjdXJyZW50Q2hpbGQgPSBjaGlsZE5vZGVzW2ldO1xuICAgIGlmICghY3VycmVudENoaWxkKSB7XG4gICAgICBuZXdWbm9kZS5kb20uYXBwZW5kQ2hpbGQob2xkQ2hpbGQpO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudENoaWxkICE9PSBvbGRDaGlsZCkge1xuICAgICAgbmV3Vm5vZGUuZG9tLnJlcGxhY2VDaGlsZChvbGRDaGlsZCwgY3VycmVudENoaWxkKTtcbiAgICB9XG5cbiAgICBpZiAoXCJ2LWtlZXBcIiBpbiBuZXdDaGlsZC5wcm9wcyA9PT0gZmFsc2UgfHwgb2xkQ2hpbGQucHJvcHNbXCJ2LWtlZXBcIl0gIT09IG5ld0NoaWxkLnByb3BzW1widi1rZWVwXCJdKSB7XG4gICAgICB1cGRhdGVBdHRyaWJ1dGVzKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSwgb2xkQ2hpbGQucHJvcHMpO1xuICAgICAgb2xkQ2hpbGQucHJvcHMgPSBuZXdDaGlsZC5wcm9wcztcblxuICAgICAgaWYgKFwidi10ZXh0XCIgaW4gbmV3Q2hpbGQucHJvcHMpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICAgICAgICBpZiAob2xkQ2hpbGQudGV4dENvbnRlbnQgIT0gbmV3Q2hpbGQucHJvcHNbXCJ2LXRleHRcIl0pIHtcbiAgICAgICAgICBvbGRDaGlsZC50ZXh0Q29udGVudCA9IG5ld0NoaWxkLnByb3BzW1widi10ZXh0XCJdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICBwYXRjaChuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20pO1xuICAgIH1cbiAgfVxuXG4gIGZvciAobGV0IGkgPSBjaGlsZHJlbi5sZW5ndGgsIGwgPSBjaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNoaWxkTm9kZXNbaV0/LnJlbW92ZSgpO1xuICB9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5leHBvcnQgZnVuY3Rpb24gcGF0Y2gobmV3Vm5vZGU6IFZub2RlV2l0aERvbSk6IHZvaWQge1xuICBjb25zdCBjaGlsZHJlbiA9IGZsYXRUcmVlKG5ld1Zub2RlLCBoYW5kbGVWRm9yKG5ld1Zub2RlKSk7XG5cbiAgY29uc3QgZG9tID0gbmV3Vm5vZGUuZG9tO1xuXG4gIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoZG9tLmNoaWxkTm9kZXMubGVuZ3RoKSB7XG4gICAgICBkb20udGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvbGREb21DaGlsZHJlbiA9IGRvbS5jaGlsZE5vZGVzIGFzIHVua25vd24gYXMgRG9tRWxlbWVudFtdO1xuICBjb25zdCBvbGRDaGlsZHJlbkxlbmd0aCA9IG9sZERvbUNoaWxkcmVuLmxlbmd0aDtcbiAgaWYgKG9sZENoaWxkcmVuTGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGZpcnN0T2xkUHJvcHMgPSBvbGREb21DaGlsZHJlblswXS5wcm9wcztcbiAgICBjb25zdCBmaXJzdFZub2RlID0gY2hpbGRyZW5bMF0gYXMgVm5vZGVXaXRoRG9tO1xuICAgIGlmIChmaXJzdE9sZFByb3BzICYmIGZpcnN0Vm5vZGUgaW5zdGFuY2VvZiBWbm9kZSAmJiBcImtleVwiIGluIGZpcnN0Vm5vZGUucHJvcHMgJiYgXCJrZXlcIiBpbiBmaXJzdE9sZFByb3BzKSB7XG4gICAgICBwYXRjaEtleWVkKG5ld1Zub2RlLCBjaGlsZHJlbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY2hpbGRyZW5MZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7XG4gIGlmIChvbGRDaGlsZHJlbkxlbmd0aCA9PT0gMCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgVm5vZGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGRvbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjaGlsZHJlbltpXSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNyZWF0ZU5ld0VsZW1lbnQoY2hpbGRyZW5baV0sIG5ld1Zub2RlLCBudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgb2xkQ2hpbGQgPSBvbGREb21DaGlsZHJlbltpXTtcbiAgICBjb25zdCBuZXdDaGlsZCA9IGNoaWxkcmVuW2ldO1xuXG4gICAgaWYgKCFvbGRDaGlsZCkge1xuICAgICAgY3JlYXRlTmV3RWxlbWVudChuZXdDaGlsZCwgbmV3Vm5vZGUsIG51bGwpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5ld0NoaWxkIGluc3RhbmNlb2YgVm5vZGUgPT09IGZhbHNlKSB7XG4gICAgICBpZiAob2xkQ2hpbGQubm9kZVR5cGUgIT09IDMpIHtcbiAgICAgICAgbmV3Vm5vZGUuZG9tLnJlcGxhY2VDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuZXdDaGlsZCksIG9sZENoaWxkKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcbiAgICAgIGlmIChvbGRDaGlsZC5ub2RlVmFsdWUgIT0gbmV3Q2hpbGQpIHtcbiAgICAgICAgb2xkQ2hpbGQubm9kZVZhbHVlID0gbmV3Q2hpbGQ7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoXCJ2LWtlZXBcIiBpbiBuZXdDaGlsZC5wcm9wcykge1xuICAgICAgaWYgKG9sZENoaWxkLnByb3BzICYmIG9sZENoaWxkLnByb3BzW1widi1rZWVwXCJdID09PSBuZXdDaGlsZC5wcm9wc1tcInYta2VlcFwiXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dE9sZENoaWxkID0gb2xkRG9tQ2hpbGRyZW5baSArIDFdO1xuICAgICAgaWYgKG5leHRPbGRDaGlsZCAmJiBuZXh0T2xkQ2hpbGQucHJvcHMgJiYgbmV4dE9sZENoaWxkLnByb3BzW1widi1rZWVwXCJdID09PSBuZXdDaGlsZC5wcm9wc1tcInYta2VlcFwiXSkge1xuICAgICAgICBvbGRDaGlsZC5yZW1vdmUoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5ld0NoaWxkLnRhZyAhPT0gb2xkQ2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY3JlYXRlTmV3RWxlbWVudChuZXdDaGlsZCwgbmV3Vm5vZGUsIG9sZENoaWxkKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIG5ld0NoaWxkLmRvbSA9IG9sZENoaWxkO1xuICAgIHVwZGF0ZUF0dHJpYnV0ZXMobmV3Q2hpbGQgYXMgVm5vZGVXaXRoRG9tLCBvbGRDaGlsZC5wcm9wcyB8fCBudWxsKTtcbiAgICBvbGRDaGlsZC5wcm9wcyA9IG5ld0NoaWxkLnByb3BzO1xuICAgIGlmIChcInYtdGV4dFwiIGluIG5ld0NoaWxkLnByb3BzKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG4gICAgICBpZiAobmV3Q2hpbGQuZG9tLnRleHRDb250ZW50ICE9IG5ld0NoaWxkLnByb3BzW1widi10ZXh0XCJdKSB7XG4gICAgICAgIG5ld0NoaWxkLmRvbS50ZXh0Q29udGVudCA9IG5ld0NoaWxkLnByb3BzW1widi10ZXh0XCJdO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHBhdGNoKG5ld0NoaWxkKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSBjaGlsZHJlbkxlbmd0aCwgbCA9IG9sZERvbUNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIG9sZERvbUNoaWxkcmVuW2ldPy5yZW1vdmUoKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlVm5vZGUodm5vZGU6IFZub2RlV2l0aERvbSk6IHN0cmluZyB8IHZvaWQge1xuICBjYWxsU2V0KG9uQ2xlYW51cFNldCk7XG4gIHZub2RlLnByb3BzID0gdm5vZGUucHJvcHMgfHwge307XG4gIHBhdGNoKHZub2RlKTtcbiAgY2FsbFNldChpc01vdW50ZWQgPyBvblVwZGF0ZVNldCA6IG9uTW91bnRTZXQpO1xuICBpc01vdW50ZWQgPSB0cnVlO1xuICBjdXJyZW50LnZub2RlID0gbnVsbDtcbiAgY3VycmVudC5jb21wb25lbnQgPSBudWxsO1xuICBpZiAoaXNOb2RlSnMpIHtcbiAgICByZXR1cm4gdm5vZGUuZG9tLmlubmVySFRNTDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlKCk6IHZvaWQgfCBzdHJpbmcge1xuICBpZiAobWFpblZub2RlKSB7XG4gICAgbWFpblZub2RlLmNoaWxkcmVuID0gW21haW5Db21wb25lbnRdO1xuICAgIHJldHVybiB1cGRhdGVWbm9kZShtYWluVm5vZGUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bm1vdW50KCkge1xuICBpZiAobWFpblZub2RlKSB7XG4gICAgbWFpbkNvbXBvbmVudCA9IHYoKCkgPT4gbnVsbCwge30pIGFzIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHVwZGF0ZSgpO1xuICAgIGNhbGxTZXQob25Vbm1vdW50U2V0KTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZXZlbnRMaXN0ZW5lck5hbWVzKSB7XG4gICAgICBtYWluVm5vZGUuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZS5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCBldmVudExpc3RlbmVyKTtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoZXZlbnRMaXN0ZW5lck5hbWVzLCBuYW1lKTtcbiAgICB9XG5cbiAgICBtYWluQ29tcG9uZW50ID0gbnVsbDtcbiAgICBtYWluVm5vZGUgPSBudWxsO1xuICAgIGlzTW91bnRlZCA9IGZhbHNlO1xuICAgIGN1cnJlbnQudm5vZGUgPSBudWxsO1xuICAgIGN1cnJlbnQuY29tcG9uZW50ID0gbnVsbDtcbiAgICBjdXJyZW50LmV2ZW50ID0gbnVsbDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb3VudChkb206IHN0cmluZyB8IERvbUVsZW1lbnQsIGNvbXBvbmVudDogYW55KSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9XG4gICAgdHlwZW9mIGRvbSA9PT0gXCJzdHJpbmdcIiA/IChpc05vZGVKcyA/IGNyZWF0ZUVsZW1lbnQoZG9tLCBkb20gPT09IFwic3ZnXCIpIDogZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihkb20pKSA6IGRvbTtcblxuICBpZiAoaXNDb21wb25lbnQoY29tcG9uZW50KSkge1xuICAgIG1haW5Db21wb25lbnQgPSBuZXcgVm5vZGUoY29tcG9uZW50LCB7fSwgW10pIGFzIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlO1xuICB9IGVsc2UgaWYgKGlzVm5vZGVDb21wb25lbnQoY29tcG9uZW50KSkge1xuICAgIG1haW5Db21wb25lbnQgPSBjb21wb25lbnQ7XG4gIH0gZWxzZSB7XG4gICAgbWFpbkNvbXBvbmVudCA9IG5ldyBWbm9kZSgoKSA9PiBjb21wb25lbnQsIHt9LCBbXSkgYXMgVm5vZGVDb21wb25lbnRJbnRlcmZhY2U7XG4gIH1cblxuICBtYWluVm5vZGUgPSBkb21Ub1Zub2RlKGNvbnRhaW5lcikgYXMgVm5vZGVXaXRoRG9tO1xuICByZXR1cm4gdXBkYXRlKCk7XG59XG4iXSwibWFwcGluZ3MiOiJNQTJDTyxJQUFNQSxFQUFXQyxRQUEyQixvQkFBWkMsU0FBMkJBLFFBQVFDLFVBQVlELFFBQVFDLFNBQVNDLE1BRTFGQyxFQUFOLE1BQ0wsV0FBQUMsQ0FFU0MsRUFFQUMsRUFFQUMsRUFFQUMsRUFFQUMsR0FSQUMsS0FBQUwsTUFFQUssS0FBQUosUUFFQUksS0FBQUgsV0FFQUcsS0FBQUYsTUFFQUUsS0FBQUQsT0FDTixHQVNRRSxFQUFlQyxHQUMxQmIsUUFBNkIsbUJBQWRhLEdBQTZCQSxHQUFrQyxpQkFBZEEsR0FBMEIsU0FBVUEsR0FDekZDLEVBQVdDLEdBQXNDQSxhQUFrQlgsRUFFbkVZLEVBQW9CRCxHQUN4QkQsRUFBUUMsSUFBV0gsRUFBWUcsRUFBT1QsS0FHeEMsU0FBU1csRUFBRUMsRUFBb0NYLEtBQTJCQyxHQUMvRSxPQUFPLElBQUlKLEVBQU1jLEVBQWdCWCxFQUFPQyxFQUMxQyxDQUlPLFNBQVNXLEVBQVdWLEdBQ3pCLEdBQXFCLElBQWpCQSxFQUFJVyxTQUNOLE9BQU9YLEVBQUlZLFVBR2IsR0FBcUIsSUFBakJaLEVBQUlXLFNBQWdCLENBQ3RCLE1BQU1kLEVBQU1HLEVBQUlhLFNBQVNDLGNBQ25CaEIsRUFBUSxDQUFDLEVBQ1RDLEVBQVcsR0FFakIsUUFBU2dCLEVBQUksRUFBR0MsRUFBSWhCLEVBQUlpQixXQUFXQyxPQUFRSCxFQUFJQyxFQUFHRCxJQUFLLENBQ3JELE1BQU1JLEVBQVduQixFQUFJaUIsV0FBV0YsR0FDaEMsR0FBMEIsSUFBdEJJLEVBQVNSLFNBQ1haLEVBQVNxQixLQUFLRCxFQUFTUCxnQkFDekIsR0FBaUMsSUFBdEJPLEVBQVNSLFNBQWdCLENBQ2xDLE1BQU1VLEVBQWFY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