@citolab/qti-components 6.9.1-beta.68 → 6.9.1-beta.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -4685,9 +4685,6 @@ var QtiPortableCustomInteraction = class extends Interaction {
4685
4685
  </div>`}`;
4686
4686
  }
4687
4687
  };
4688
- __decorateClass([
4689
- n5({ type: String, attribute: "response-identifier" })
4690
- ], QtiPortableCustomInteraction.prototype, "responseIdentifier", 2);
4691
4688
  __decorateClass([
4692
4689
  n5({ type: String, attribute: "module" })
4693
4690
  ], QtiPortableCustomInteraction.prototype, "module", 2);
@@ -5782,9 +5779,6 @@ var QtiCustomInteraction = class extends Interaction {
5782
5779
  </div>`}`;
5783
5780
  }
5784
5781
  };
5785
- __decorateClass([
5786
- n5({ type: String, attribute: "response-identifier" })
5787
- ], QtiCustomInteraction.prototype, "responseIdentifier", 2);
5788
5782
  __decorateClass([
5789
5783
  n5({ type: String, attribute: "data" })
5790
5784
  ], QtiCustomInteraction.prototype, "data", 2);
@@ -7854,4 +7848,4 @@ lit-html/node/directives/style-map.js:
7854
7848
  * SPDX-License-Identifier: BSD-3-Clause
7855
7849
  *)
7856
7850
  */
7857
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL0BsaXQvY29udGV4dC9zcmMvbGliL2NvbnRleHQtcmVxdWVzdC1ldmVudC50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9jb250ZXh0L3NyYy9saWIvY3JlYXRlLWNvbnRleHQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvY29udGV4dC9zcmMvbGliL2NvbnRyb2xsZXJzL2NvbnRleHQtY29uc3VtZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvY29udGV4dC9zcmMvbGliL3ZhbHVlLW5vdGlmaWVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L2NvbnRleHQvc3JjL2xpYi9jb250cm9sbGVycy9jb250ZXh0LXByb3ZpZGVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L2NvbnRleHQvc3JjL2xpYi9kZWNvcmF0b3JzL3Byb3ZpZGUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvY29udGV4dC9zcmMvbGliL2RlY29yYXRvcnMvY29uc3VtZS50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC1sYWJzL3Nzci1kb20tc2hpbS9zcmMvbGliL2VsZW1lbnQtaW50ZXJuYWxzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0LWxhYnMvc3NyLWRvbS1zaGltL3NyYy9pbmRleC50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3NyYy9jc3MtdGFnLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvc3JjL3JlYWN0aXZlLWVsZW1lbnQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL3NyYy9saXQtaHRtbC50cyIsICIuLi9ub2RlX21vZHVsZXMvbGl0LWVsZW1lbnQvc3JjL2xpdC1lbGVtZW50LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvc3JjL2RlY29yYXRvcnMvY3VzdG9tLWVsZW1lbnQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9zcmMvZGVjb3JhdG9ycy9wcm9wZXJ0eS50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3NyYy9kZWNvcmF0b3JzL3N0YXRlLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvc3JjL2RlY29yYXRvcnMvYmFzZS50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3NyYy9kZWNvcmF0b3JzL3F1ZXJ5LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvc3JjL2RlY29yYXRvcnMvcXVlcnktYXNzaWduZWQtZWxlbWVudHMudHMiLCAiLi4vc3JjL2xpYi9kZWNvcmF0b3JzL3dhdGNoLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0udHMiLCAiLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL3F0aS10cmFuc2Zvcm1lcnMudHMiLCAiLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL3F0aS10cmFuc2Zvcm0taXRlbS50cyIsICIuLi9zcmMvbGliL3F0aS10cmFuc2Zvcm1lcnMvcXRpLXRyYW5zZm9ybS1tYW5pZmVzdC50cyIsICIuLi9zcmMvbGliL3F0aS10cmFuc2Zvcm1lcnMvcXRpLXRyYW5zZm9ybS10ZXN0LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pdGVtLWJvZHkvcXRpLWl0ZW0tYm9keS5zdHlsZXMudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHkudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcHJvbXB0L3F0aS1wcm9tcHQudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktc3R5bGVzaGVldC9xdGktc3R5bGVzaGVldC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1ydWJyaWMtYmxvY2svcXRpLWNvbnRlbnQtYm9keS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1ydWJyaWMtYmxvY2svcXRpLXJ1YnJpYy1ibG9jay50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3V0aWxzLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2stYmxvY2svcXRpLWZlZWRiYWNrLWJsb2NrLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1pbmxpbmUvcXRpLWZlZWRiYWNrLWlubGluZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlLWhlbHBlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL3NyYy9kaXJlY3RpdmUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL3NyYy9hc3luYy1kaXJlY3RpdmUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL3NyYy9kaXJlY3RpdmVzL3JlZi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLm1peGluLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvdm9jYWJ1bGFyeS92b2NhYnVsYXJ5LW1peGluLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi9xdGktY2hvaWNlLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdGVtcGxhdGUtc3RyaW5ncy50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXJ1bGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktbG9va3VwLW91dGNvbWUtdmFsdWUvcXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbi9xdGktcmVzcG9uc2UtY29uZGl0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXNldC1vdXRjb21lLXZhbHVlL3F0aS1zZXQtb3V0Y29tZS12YWx1ZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1lbHNlL3F0aS1yZXNwb25zZS1lbHNlLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLWVsc2UvcXRpLXJlc3BvbnNlLWlmL3F0aS1yZXNwb25zZS1pZi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1lbHNlL3F0aS1yZXNwb25zZS1pZi9xdGktcmVzcG9uc2UtZWxzZS1pZi9xdGktcmVzcG9uc2UtZWxzZS1pZi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWFuZC9xdGktYW5kLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWFuZC9pbmRleC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1iYXNldmFsdWUvcXRpLWJhc2V2YWx1ZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1jb250YWlucy9xdGktY29udGFpbnMudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktY29ycmVjdC9xdGktY29ycmVjdC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1lcXVhbC1yb3VuZGVkL3F0aS1lcXVhbC1yb3VuZGVkLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWVxdWFsL3F0aS1lcXVhbC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1ndC9xdGktZ3QudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZ3RlL3F0aS1ndGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktaXMtbnVsbC9xdGktaXMtbnVsbC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1sdC9xdGktbHQudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbHRlL3F0aS1sdGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwLXJlc3BvbnNlL3F0aS1tYXAtcmVzcG9uc2UudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwcGluZy9xdGktbWFwcGluZy50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXRjaC9xdGktbWF0Y2gudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWVtYmVyL3F0aS1tZW1iZXIudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbXVsdGlwbGUvcXRpLW11bHRpcGxlLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW5vdC9xdGktbm90LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW9yL3F0aS1vci50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1vcmRlcmVkL3F0aS1vcmRlcmVkLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXByaW50ZWQtdmFyaWFibGUvcXRpLXByaW50ZWQtdmFyaWFibGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktcHJvZHVjdC9xdGktcHJvZHVjdC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1zdHJpbmctbWF0Y2gvcXRpLXN0cmluZy1tYXRjaC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1zdW0vcXRpLXN1bS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS12YXJpYWJsZS9xdGktdmFyaWFibGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtYXBpLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcm9wcGFibGVzLW1peGluLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9mbGlwcGFibGVzLW1peGluLnRzIiwgIi4uL3NyYy9saWIvZGVjb3JhdG9ycy9saXZlLXF1ZXJ5LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uLnN0eWxlcy50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbi9xdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlcy9yZXBlYXQudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uLnN0eWxlcy50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbi9xdGktbWVkaWEtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uL3F0aS1vcmRlci1pbnRlcmFjdGlvbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlcy9zdHlsZS1tYXAudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1jdXN0b20tb3BlcmF0b3IvcXRpLWN1c3RvbS1vcGVyYXRvci50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYWJsZS1ob3RzcG90LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1pbWcudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC10ZXh0LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWNob2ljZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90dGV4dC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2ltcGxlLWNob2ljZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL2luZGV4LnRzIiwgIi4uL3NyYy9saWIvcXRpLWl0ZW0vcXRpLWl0ZW0ubWl4aW4udHMiLCAiLi4vc3JjL2xpYi9xdGktaXRlbS9xdGktaXRlbS50cyIsICIuLi9zcmMvbGliL3F0aS1sb2FkZXIvcXRpLWxvYWRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbmltcG9ydCB7Q29udGV4dFR5cGUsIENvbnRleHR9IGZyb20gJy4vY3JlYXRlLWNvbnRleHQuanMnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudEV2ZW50TWFwIHtcbiAgICAvKipcbiAgICAgKiBBICdjb250ZXh0LXJlcXVlc3QnIGV2ZW50IGNhbiBiZSBlbWl0dGVkIGJ5IGFueSBlbGVtZW50IHdoaWNoIGRlc2lyZXNcbiAgICAgKiBhIGNvbnRleHQgdmFsdWUgdG8gYmUgaW5qZWN0ZWQgYnkgYW4gZXh0ZXJuYWwgcHJvdmlkZXIuXG4gICAgICovXG4gICAgJ2NvbnRleHQtcmVxdWVzdCc6IENvbnRleHRSZXF1ZXN0RXZlbnQ8Q29udGV4dDx1bmtub3duLCB1bmtub3duPj47XG4gIH1cbn1cblxuLyoqXG4gKiBBIGNhbGxiYWNrIHdoaWNoIGlzIHByb3ZpZGVkIGJ5IGEgY29udGV4dCByZXF1ZXN0ZXIgYW5kIGlzIGNhbGxlZCB3aXRoIHRoZSB2YWx1ZSBzYXRpc2Z5aW5nIHRoZSByZXF1ZXN0LlxuICogVGhpcyBjYWxsYmFjayBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGJ5IGNvbnRleHQgcHJvdmlkZXJzIGFzIHRoZSByZXF1ZXN0ZWQgdmFsdWUgaXMgY2hhbmdlZC5cbiAqL1xuZXhwb3J0IHR5cGUgQ29udGV4dENhbGxiYWNrPFZhbHVlVHlwZT4gPSAoXG4gIHZhbHVlOiBWYWx1ZVR5cGUsXG4gIHVuc3Vic2NyaWJlPzogKCkgPT4gdm9pZFxuKSA9PiB2b2lkO1xuXG4vKipcbiAqIEludGVyZmFjZSBkZWZpbml0aW9uIGZvciBhIENvbnRleHRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGV4dFJlcXVlc3Q8QyBleHRlbmRzIENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4+IHtcbiAgcmVhZG9ubHkgY29udGV4dDogQztcbiAgcmVhZG9ubHkgY2FsbGJhY2s6IENvbnRleHRDYWxsYmFjazxDb250ZXh0VHlwZTxDPj47XG4gIHJlYWRvbmx5IHN1YnNjcmliZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gZXZlbnQgZmlyZWQgYnkgYSBjb250ZXh0IHJlcXVlc3RlciB0byBzaWduYWwgaXQgZGVzaXJlcyBhIHNwZWNpZmllZCBjb250ZXh0IHdpdGggdGhlIGdpdmVuIGtleS5cbiAqXG4gKiBBIHByb3ZpZGVyIHNob3VsZCBpbnNwZWN0IHRoZSBgY29udGV4dGAgcHJvcGVydHkgb2YgdGhlIGV2ZW50IHRvIGRldGVybWluZSBpZiBpdCBoYXMgYSB2YWx1ZSB0aGF0IGNhblxuICogc2F0aXNmeSB0aGUgcmVxdWVzdCwgY2FsbGluZyB0aGUgYGNhbGxiYWNrYCB3aXRoIHRoZSByZXF1ZXN0ZWQgdmFsdWUgaWYgc28uXG4gKlxuICogSWYgdGhlIHJlcXVlc3RlZCBjb250ZXh0IGV2ZW50IGNvbnRhaW5zIGEgdHJ1dGh5IGBzdWJzY3JpYmVgIHZhbHVlLCB0aGVuIGEgcHJvdmlkZXIgY2FuIGNhbGwgdGhlIGNhbGxiYWNrXG4gKiBtdWx0aXBsZSB0aW1lcyBpZiB0aGUgdmFsdWUgaXMgY2hhbmdlZCwgaWYgdGhpcyBpcyB0aGUgY2FzZSB0aGUgcHJvdmlkZXIgc2hvdWxkIHBhc3MgYW4gYHVuc3Vic2NyaWJlYFxuICogbWV0aG9kIHRvIHRoZSBjYWxsYmFjayB3aGljaCBjb25zdW1lcnMgY2FuIGludm9rZSB0byBpbmRpY2F0ZSB0aGV5IG5vIGxvbmdlciB3aXNoIHRvIHJlY2VpdmUgdGhlc2UgdXBkYXRlcy5cbiAqXG4gKiBJZiBubyBgc3Vic2NyaWJlYCB2YWx1ZSBpcyBwcmVzZW50IGluIHRoZSBldmVudCwgdGhlbiB0aGUgcHJvdmlkZXIgY2FuIGFzc3VtZSB0aGF0IHRoaXMgaXMgYSAnb25lIHRpbWUnXG4gKiByZXF1ZXN0IGZvciB0aGUgY29udGV4dCBhbmQgY2FuIHRoZXJlZm9yZSBub3QgdHJhY2sgdGhlIGNvbnN1bWVyLlxuICovXG5leHBvcnQgY2xhc3MgQ29udGV4dFJlcXVlc3RFdmVudDxDIGV4dGVuZHMgQ29udGV4dDx1bmtub3duLCB1bmtub3duPj5cbiAgZXh0ZW5kcyBFdmVudFxuICBpbXBsZW1lbnRzIENvbnRleHRSZXF1ZXN0PEM+XG57XG4gIHJlYWRvbmx5IGNvbnRleHQ6IEM7XG4gIHJlYWRvbmx5IGNhbGxiYWNrOiBDb250ZXh0Q2FsbGJhY2s8Q29udGV4dFR5cGU8Qz4+O1xuICByZWFkb25seSBzdWJzY3JpYmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBrZXkgdG8gcmVxdWVzdFxuICAgKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRoYXQgc2hvdWxkIGJlIGludm9rZWQgd2hlbiB0aGUgY29udGV4dCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGlzIGF2YWlsYWJsZVxuICAgKiBAcGFyYW0gc3Vic2NyaWJlIHdoZW4sIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gc3Vic2NyaWJlIHRvIGZ1dHVyZSB1cGRhdGVzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBjb250ZXh0OiBDLFxuICAgIGNhbGxiYWNrOiBDb250ZXh0Q2FsbGJhY2s8Q29udGV4dFR5cGU8Qz4+LFxuICAgIHN1YnNjcmliZT86IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIoJ2NvbnRleHQtcmVxdWVzdCcsIHtidWJibGVzOiB0cnVlLCBjb21wb3NlZDogdHJ1ZX0pO1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuc3Vic2NyaWJlID0gc3Vic2NyaWJlID8/IGZhbHNlO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbi8qKlxuICogVGhlIENvbnRleHQgdHlwZSBkZWZpbmVzIGEgdHlwZSBicmFuZCB0byBhc3NvY2lhdGUgYSBrZXkgdmFsdWUgd2l0aCB0aGUgY29udGV4dCB2YWx1ZSB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHQ8S2V5VHlwZSwgVmFsdWVUeXBlPiA9IEtleVR5cGUgJiB7X19jb250ZXh0X186IFZhbHVlVHlwZX07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIENvbnRleHQgaW5zdGVhZFxuICovXG5leHBvcnQgdHlwZSBDb250ZXh0S2V5PEtleVR5cGUsIFZhbHVlVHlwZT4gPSBDb250ZXh0PEtleVR5cGUsIFZhbHVlVHlwZT47XG5cbi8qKlxuICogQSBoZWxwZXIgdHlwZSB3aGljaCBjYW4gZXh0cmFjdCBhIENvbnRleHQgdmFsdWUgdHlwZSBmcm9tIGEgQ29udGV4dCB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHRUeXBlPEtleSBleHRlbmRzIENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4+ID1cbiAgS2V5IGV4dGVuZHMgQ29udGV4dDx1bmtub3duLCBpbmZlciBWYWx1ZVR5cGU+ID8gVmFsdWVUeXBlIDogbmV2ZXI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHR5cGVkIENvbnRleHQuXG4gKlxuICogQ29udGV4dHMgYXJlIGNvbXBhcmVkIHdpdGggc3RyaWN0IGVxdWFsaXR5LlxuICpcbiAqIElmIHlvdSB3YW50IHR3byBzZXBhcmF0ZSBgY3JlYXRlQ29udGV4dCgpYCBjYWxscyB0byByZWZlcmVyIHRvIHRoZSBzYW1lXG4gKiBjb250ZXh0LCB0aGVuIHVzZSBhIGtleSB0aGF0IHdpbGwgYnkgZXF1YWwgdW5kZXIgc3RyaWN0IGVxdWFsaXR5IGxpa2UgYVxuICogc3RyaW5nIGZvciBgU3ltYm9sLmZvcigpYDpcbiAqXG4gKiBgYGB0c1xuICogLy8gdHJ1ZVxuICogY3JlYXRlQ29udGV4dCgnbXktY29udGV4dCcpID09PSBjcmVhdGVDb250ZXh0KCdteS1jb250ZXh0JylcbiAqIC8vIHRydWVcbiAqIGNyZWF0ZUNvbnRleHQoU3ltYm9sLmZvcignbXktY29udGV4dCcpKSA9PT0gY3JlYXRlQ29udGV4dChTeW1ib2wuZm9yKCdteS1jb250ZXh0JykpXG4gKiBgYGBcbiAqXG4gKiBJZiB5b3Ugd2FudCBhIGNvbnRleHQgdG8gYmUgdW5pcXVlIHNvIHRoYXQgaXQncyBndWFyYW50ZWVkIHRvIG5vdCBjb2xsaWRlXG4gKiB3aXRoIG90aGVyIGNvbnRleHRzLCB1c2UgYSBrZXkgdGhhdCdzIHVuaXF1ZSB1bmRlciBzdHJpY3QgZXF1YWxpdHksIGxpa2VcbiAqIGEgYFN5bWJvbCgpYCBvciBvYmplY3QuOlxuICpcbiAqIGBgYFxuICogLy8gZmFsc2VcbiAqIGNyZWF0ZUNvbnRleHQoe30pID09PSBjcmVhdGVDb250ZXh0KHt9KVxuICogLy8gZmFsc2VcbiAqIGNyZWF0ZUNvbnRleHQoU3ltYm9sKCdteS1jb250ZXh0JykpID09PSBjcmVhdGVDb250ZXh0KFN5bWJvbCgnbXktY29udGV4dCcpKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGtleSBhIGNvbnRleHQga2V5IHZhbHVlXG4gKiBAdGVtcGxhdGUgVmFsdWVUeXBlIHRoZSB0eXBlIG9mIHZhbHVlIHRoYXQgY2FuIGJlIHByb3ZpZGVkIGJ5IHRoaXMgY29udGV4dC5cbiAqIEByZXR1cm5zIHRoZSBjb250ZXh0IGtleSB2YWx1ZSBjYXN0IHRvIGBDb250ZXh0PEssIFZhbHVlVHlwZT5gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250ZXh0PFZhbHVlVHlwZSwgSyA9IHVua25vd24+KGtleTogSykge1xuICByZXR1cm4ga2V5IGFzIENvbnRleHQ8SywgVmFsdWVUeXBlPjtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29udGV4dENhbGxiYWNrLFxuICBDb250ZXh0UmVxdWVzdEV2ZW50LFxufSBmcm9tICcuLi9jb250ZXh0LXJlcXVlc3QtZXZlbnQuanMnO1xuaW1wb3J0IHR5cGUge0NvbnRleHQsIENvbnRleHRUeXBlfSBmcm9tICcuLi9jcmVhdGUtY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJlYWN0aXZlQ29udHJvbGxlcixcbiAgUmVhY3RpdmVDb250cm9sbGVySG9zdCxcbn0gZnJvbSAnQGxpdC9yZWFjdGl2ZS1lbGVtZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBPcHRpb25zPEMgZXh0ZW5kcyBDb250ZXh0PHVua25vd24sIHVua25vd24+PiB7XG4gIGNvbnRleHQ6IEM7XG4gIGNhbGxiYWNrPzogKHZhbHVlOiBDb250ZXh0VHlwZTxDPiwgZGlzcG9zZT86ICgpID0+IHZvaWQpID0+IHZvaWQ7XG4gIHN1YnNjcmliZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBSZWFjdGl2ZUNvbnRyb2xsZXIgd2hpY2ggYWRkcyBjb250ZXh0IGNvbnN1bWluZyBiZWhhdmlvciB0byBhIGN1c3RvbVxuICogZWxlbWVudCBieSBkaXNwYXRjaGluZyBgY29udGV4dC1yZXF1ZXN0YCBldmVudHMuXG4gKlxuICogV2hlbiB0aGUgaG9zdCBlbGVtZW50IGlzIGNvbm5lY3RlZCB0byB0aGUgZG9jdW1lbnQgaXQgd2lsbCBlbWl0IGFcbiAqIGBjb250ZXh0LXJlcXVlc3RgIGV2ZW50IHdpdGggaXRzIGNvbnRleHQga2V5LiBXaGVuIHRoZSBjb250ZXh0IHJlcXVlc3RcbiAqIGlzIHNhdGlzZmllZCB0aGUgY29udHJvbGxlciB3aWxsIGludm9rZSB0aGUgY2FsbGJhY2ssIGlmIHByZXNlbnQsIGFuZFxuICogdHJpZ2dlciBhIGhvc3QgdXBkYXRlIHNvIGl0IGNhbiByZXNwb25kIHRvIHRoZSBuZXcgdmFsdWUuXG4gKlxuICogSXQgd2lsbCBhbHNvIGNhbGwgdGhlIGRpc3Bvc2UgbWV0aG9kIGdpdmVuIGJ5IHRoZSBwcm92aWRlciB3aGVuIHRoZVxuICogaG9zdCBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRleHRDb25zdW1lcjxcbiAgQyBleHRlbmRzIENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4sXG4gIEhvc3RFbGVtZW50IGV4dGVuZHMgUmVhY3RpdmVDb250cm9sbGVySG9zdCAmIEhUTUxFbGVtZW50LFxuPiBpbXBsZW1lbnRzIFJlYWN0aXZlQ29udHJvbGxlclxue1xuICBwcm90ZWN0ZWQgaG9zdDogSG9zdEVsZW1lbnQ7XG4gIHByaXZhdGUgY29udGV4dDogQztcbiAgcHJpdmF0ZSBjYWxsYmFjaz86ICh2YWx1ZTogQ29udGV4dFR5cGU8Qz4sIGRpc3Bvc2U/OiAoKSA9PiB2b2lkKSA9PiB2b2lkO1xuICBwcml2YXRlIHN1YnNjcmliZSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcHJvdmlkZWQgPSBmYWxzZTtcblxuICB2YWx1ZT86IENvbnRleHRUeXBlPEM+ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGhvc3Q6IEhvc3RFbGVtZW50LCBvcHRpb25zOiBPcHRpb25zPEM+KTtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBuZXcgQ29udGV4dENvbnN1bWVyKGhvc3QsIG9wdGlvbnMpICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvc3Q6IEhvc3RFbGVtZW50LFxuICAgIGNvbnRleHQ6IEMsXG4gICAgY2FsbGJhY2s/OiAodmFsdWU6IENvbnRleHRUeXBlPEM+LCBkaXNwb3NlPzogKCkgPT4gdm9pZCkgPT4gdm9pZCxcbiAgICBzdWJzY3JpYmU/OiBib29sZWFuXG4gICk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvc3Q6IEhvc3RFbGVtZW50LFxuICAgIGNvbnRleHRPck9wdGlvbnM6IEMgfCBPcHRpb25zPEM+LFxuICAgIGNhbGxiYWNrPzogKHZhbHVlOiBDb250ZXh0VHlwZTxDPiwgZGlzcG9zZT86ICgpID0+IHZvaWQpID0+IHZvaWQsXG4gICAgc3Vic2NyaWJlPzogYm9vbGVhblxuICApIHtcbiAgICB0aGlzLmhvc3QgPSBob3N0O1xuICAgIC8vIFRoaXMgaXMgYSBwb3RlbnRpYWxseSBmcmFnaWxlIGR1Y2stdHlwZS4gSXQgbWVhbnMgYSBjb250ZXh0IG9iamVjdCBjYW4ndFxuICAgIC8vIGhhdmUgYSBwcm9wZXJ0eSBuYW1lIGNvbnRleHQgYW5kIGJlIHVzZWQgaW4gcG9zaXRpb25hbCBhcmd1bWVudCBmb3JtLlxuICAgIGlmICgoY29udGV4dE9yT3B0aW9ucyBhcyBPcHRpb25zPEM+KS5jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb250ZXh0T3JPcHRpb25zIGFzIE9wdGlvbnM8Qz47XG4gICAgICB0aGlzLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgICB0aGlzLmNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcbiAgICAgIHRoaXMuc3Vic2NyaWJlID0gb3B0aW9ucy5zdWJzY3JpYmUgPz8gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRPck9wdGlvbnMgYXMgQztcbiAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgIHRoaXMuc3Vic2NyaWJlID0gc3Vic2NyaWJlID8/IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmhvc3QuYWRkQ29udHJvbGxlcih0aGlzKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmU/OiAoKSA9PiB2b2lkO1xuXG4gIGhvc3RDb25uZWN0ZWQoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaFJlcXVlc3QoKTtcbiAgfVxuXG4gIGhvc3REaXNjb25uZWN0ZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudW5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaFJlcXVlc3QoKSB7XG4gICAgdGhpcy5ob3N0LmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ29udGV4dFJlcXVlc3RFdmVudCh0aGlzLmNvbnRleHQsIHRoaXMuX2NhbGxiYWNrLCB0aGlzLnN1YnNjcmliZSlcbiAgICApO1xuICB9XG5cbiAgLy8gVGhpcyBmdW5jdGlvbiBtdXN0IGhhdmUgc3RhYmxlIGlkZW50aXR5IHRvIHByb3Blcmx5IGRlZHVwZSBpbiBDb250ZXh0Um9vdFxuICAvLyBpZiB0aGlzIGVsZW1lbnQgY29ubmVjdHMgbXVsdGlwbGUgdGltZXMuXG4gIHByaXZhdGUgX2NhbGxiYWNrOiBDb250ZXh0Q2FsbGJhY2s8Q29udGV4dFR5cGU8Qz4+ID0gKHZhbHVlLCB1bnN1YnNjcmliZSkgPT4ge1xuICAgIC8vIHNvbWUgcHJvdmlkZXJzIHdpbGwgcGFzcyBhbiB1bnN1YnNjcmliZSBmdW5jdGlvbiBpbmRpY2F0aW5nIHRoZXkgbWF5IHByb3ZpZGUgZnV0dXJlIHZhbHVlc1xuICAgIGlmICh0aGlzLnVuc3Vic2NyaWJlKSB7XG4gICAgICAvLyBpZiB0aGUgdW5zdWJzY3JpYmUgZnVuY3Rpb24gY2hhbmdlcyB0aGlzIGltcGxpZXMgd2UgaGF2ZSBjaGFuZ2VkIHByb3ZpZGVyXG4gICAgICBpZiAodGhpcy51bnN1YnNjcmliZSAhPT0gdW5zdWJzY3JpYmUpIHtcbiAgICAgICAgLy8gY2xlYW51cCB0aGUgb2xkIHByb3ZpZGVyXG4gICAgICAgIHRoaXMucHJvdmlkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgICAgLy8gaWYgd2UgZG9uJ3Qgc3VwcG9ydCBzdWJzY3JpcHRpb24sIGltbWVkaWF0ZWx5IHVuc3Vic2NyaWJlXG4gICAgICBpZiAoIXRoaXMuc3Vic2NyaWJlKSB7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzdG9yZSB0aGUgdmFsdWUgc28gdGhhdCBpdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIGNvbnRyb2xsZXJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgLy8gc2NoZWR1bGUgYW4gdXBkYXRlIGluIGNhc2UgdGhpcyB2YWx1ZSBpcyB1c2VkIGluIGEgdGVtcGxhdGVcbiAgICB0aGlzLmhvc3QucmVxdWVzdFVwZGF0ZSgpO1xuXG4gICAgLy8gb25seSBpbnZva2UgY2FsbGJhY2sgaWYgd2UgYXJlIGVpdGhlciBleHBlY3RpbmcgdXBkYXRlcyBvciBoYXZlIG5vdCB5ZXRcbiAgICAvLyBiZWVuIHByb3ZpZGVkIGEgdmFsdWVcbiAgICBpZiAoIXRoaXMucHJvdmlkZWQgfHwgdGhpcy5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMucHJvdmlkZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5jYWxsYmFjayh2YWx1ZSwgdW5zdWJzY3JpYmUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudW5zdWJzY3JpYmUgPSB1bnN1YnNjcmliZTtcbiAgfTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtDb250ZXh0Q2FsbGJhY2t9IGZyb20gJy4vY29udGV4dC1yZXF1ZXN0LWV2ZW50LmpzJztcblxuLyoqXG4gKiBBIGRpc3Bvc2VyIGZ1bmN0aW9uXG4gKi9cbnR5cGUgRGlzcG9zZXIgPSAoKSA9PiB2b2lkO1xuXG5pbnRlcmZhY2UgQ2FsbGJhY2tJbmZvIHtcbiAgZGlzcG9zZXI6IERpc3Bvc2VyO1xuICBjb25zdW1lckhvc3Q6IEVsZW1lbnQ7XG59XG5cbi8qKlxuICogQSBzaW1wbGUgY2xhc3Mgd2hpY2ggc3RvcmVzIGEgdmFsdWUsIGFuZCB0cmlnZ2VycyByZWdpc3RlcmVkIGNhbGxiYWNrcyB3aGVuXG4gKiB0aGUgdmFsdWUgaXMgY2hhbmdlZCB2aWEgaXRzIHNldHRlci5cbiAqXG4gKiBBbiBpbXBsZW1lbnRvciBtaWdodCB1c2Ugb3RoZXIgb2JzZXJ2YWJsZSBwYXR0ZXJucyBzdWNoIGFzIE1vYlggb3IgUmVkdXggdG9cbiAqIGdldCBiZWhhdmlvciBsaWtlIHRoaXMuIEJ1dCB0aGlzIGlzIGEgcHJldHR5IG1pbmltYWwgYXBwcm9hY2ggdGhhdCB3aWxsXG4gKiBsaWtlbHkgd29yayBmb3IgYSBudW1iZXIgb2YgdXNlIGNhc2VzLlxuICovXG5leHBvcnQgY2xhc3MgVmFsdWVOb3RpZmllcjxUPiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IE1hcDxcbiAgICBDb250ZXh0Q2FsbGJhY2s8VD4sXG4gICAgQ2FsbGJhY2tJbmZvXG4gID4oKTtcbiAgcHJpdmF0ZSBfdmFsdWUhOiBUO1xuICBnZXQgdmFsdWUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2OiBUKSB7XG4gICAgdGhpcy5zZXRWYWx1ZSh2KTtcbiAgfVxuXG4gIHNldFZhbHVlKHY6IFQsIGZvcmNlID0gZmFsc2UpIHtcbiAgICBjb25zdCB1cGRhdGUgPSBmb3JjZSB8fCAhT2JqZWN0LmlzKHYsIHRoaXMuX3ZhbHVlKTtcbiAgICB0aGlzLl92YWx1ZSA9IHY7XG4gICAgaWYgKHVwZGF0ZSkge1xuICAgICAgdGhpcy51cGRhdGVPYnNlcnZlcnMoKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihkZWZhdWx0VmFsdWU/OiBUKSB7XG4gICAgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZU9ic2VydmVycyA9ICgpOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IFtjYWxsYmFjaywge2Rpc3Bvc2VyfV0gb2YgdGhpcy5zdWJzY3JpcHRpb25zKSB7XG4gICAgICBjYWxsYmFjayh0aGlzLl92YWx1ZSwgZGlzcG9zZXIpO1xuICAgIH1cbiAgfTtcblxuICBhZGRDYWxsYmFjayhcbiAgICBjYWxsYmFjazogQ29udGV4dENhbGxiYWNrPFQ+LFxuICAgIGNvbnN1bWVySG9zdDogRWxlbWVudCxcbiAgICBzdWJzY3JpYmU/OiBib29sZWFuXG4gICk6IHZvaWQge1xuICAgIGlmICghc3Vic2NyaWJlKSB7XG4gICAgICAvLyBqdXN0IGNhbGwgdGhlIGNhbGxiYWNrIG9uY2UgYW5kIHdlJ3JlIGRvbmVcbiAgICAgIGNhbGxiYWNrKHRoaXMudmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc3Vic2NyaXB0aW9ucy5oYXMoY2FsbGJhY2spKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuc2V0KGNhbGxiYWNrLCB7XG4gICAgICAgIGRpc3Bvc2VyOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmRlbGV0ZShjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbnN1bWVySG9zdCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7ZGlzcG9zZXJ9ID0gdGhpcy5zdWJzY3JpcHRpb25zLmdldChjYWxsYmFjaykhO1xuICAgIGNhbGxiYWNrKHRoaXMudmFsdWUsIGRpc3Bvc2VyKTtcbiAgfVxuXG4gIGNsZWFyQ2FsbGJhY2tzKCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5jbGVhcigpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbmltcG9ydCB7Q29udGV4dFJlcXVlc3RFdmVudH0gZnJvbSAnLi4vY29udGV4dC1yZXF1ZXN0LWV2ZW50LmpzJztcbmltcG9ydCB7VmFsdWVOb3RpZmllcn0gZnJvbSAnLi4vdmFsdWUtbm90aWZpZXIuanMnO1xuaW1wb3J0IHR5cGUge0NvbnRleHQsIENvbnRleHRUeXBlfSBmcm9tICcuLi9jcmVhdGUtY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJlYWN0aXZlQ29udHJvbGxlcixcbiAgUmVhY3RpdmVDb250cm9sbGVySG9zdCxcbn0gZnJvbSAnQGxpdC9yZWFjdGl2ZS1lbGVtZW50JztcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRFdmVudE1hcCB7XG4gICAgLyoqXG4gICAgICogQSAnY29udGV4dC1wcm92aWRlcicgZXZlbnQgY2FuIGJlIGVtaXR0ZWQgYnkgYW55IGVsZW1lbnQgd2hpY2ggaG9zdHNcbiAgICAgKiBhIGNvbnRleHQgcHJvdmlkZXIgdG8gaW5kaWNhdGUgaXQgaXMgYXZhaWxhYmxlIGZvciB1c2UuXG4gICAgICovXG4gICAgJ2NvbnRleHQtcHJvdmlkZXInOiBDb250ZXh0UHJvdmlkZXJFdmVudDxDb250ZXh0PHVua25vd24sIHVua25vd24+PjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29udGV4dFByb3ZpZGVyRXZlbnQ8XG4gIEMgZXh0ZW5kcyBDb250ZXh0PHVua25vd24sIHVua25vd24+LFxuPiBleHRlbmRzIEV2ZW50IHtcbiAgcmVhZG9ubHkgY29udGV4dDogQztcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgd2hpY2ggdGhpcyBwcm92aWRlciBjYW4gcHJvdmlkZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29udGV4dDogQykge1xuICAgIHN1cGVyKCdjb250ZXh0LXByb3ZpZGVyJywge2J1YmJsZXM6IHRydWUsIGNvbXBvc2VkOiB0cnVlfSk7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbnM8QyBleHRlbmRzIENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4+IHtcbiAgY29udGV4dDogQztcbiAgaW5pdGlhbFZhbHVlPzogQ29udGV4dFR5cGU8Qz47XG59XG5cbnR5cGUgUmVhY3RpdmVFbGVtZW50SG9zdCA9IFBhcnRpYWw8UmVhY3RpdmVDb250cm9sbGVySG9zdD4gJiBIVE1MRWxlbWVudDtcblxuLyoqXG4gKiBBIFJlYWN0aXZlQ29udHJvbGxlciB3aGljaCBhZGRzIGNvbnRleHQgcHJvdmlkZXIgYmVoYXZpb3IgdG8gYVxuICogY3VzdG9tIGVsZW1lbnQuXG4gKlxuICogVGhpcyBjb250cm9sbGVyIHNpbXBseSBsaXN0ZW5zIHRvIHRoZSBgY29udGV4dC1yZXF1ZXN0YCBldmVudCB3aGVuXG4gKiB0aGUgaG9zdCBpcyBjb25uZWN0ZWQgdG8gdGhlIERPTSBhbmQgcmVnaXN0ZXJzIHRoZSByZWNlaXZlZCBjYWxsYmFja3NcbiAqIGFnYWluc3QgaXRzIG9ic2VydmFibGUgQ29udGV4dCBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBUaGUgY29udHJvbGxlciBtYXkgYWxzbyBiZSBhdHRhY2hlZCB0byBhbnkgSFRNTCBlbGVtZW50IGluIHdoaWNoIGNhc2UgaXQnc1xuICogdXAgdG8gdGhlIHVzZXIgdG8gY2FsbCBob3N0Q29ubmVjdGVkKCkgd2hlbiBhdHRhY2hlZCB0byB0aGUgRE9NLiBUaGlzIGlzXG4gKiBkb25lIGF1dG9tYXRpY2FsbHkgZm9yIGFueSBjdXN0b20gZWxlbWVudHMgaW1wbGVtZW50aW5nXG4gKiBSZWFjdGl2ZUNvbnRyb2xsZXJIb3N0LlxuICovXG5leHBvcnQgY2xhc3MgQ29udGV4dFByb3ZpZGVyPFxuICAgIFQgZXh0ZW5kcyBDb250ZXh0PHVua25vd24sIHVua25vd24+LFxuICAgIEhvc3RFbGVtZW50IGV4dGVuZHMgUmVhY3RpdmVFbGVtZW50SG9zdCA9IFJlYWN0aXZlRWxlbWVudEhvc3QsXG4gID5cbiAgZXh0ZW5kcyBWYWx1ZU5vdGlmaWVyPENvbnRleHRUeXBlPFQ+PlxuICBpbXBsZW1lbnRzIFJlYWN0aXZlQ29udHJvbGxlclxue1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaG9zdDogSG9zdEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dDogVDtcblxuICBjb25zdHJ1Y3Rvcihob3N0OiBIb3N0RWxlbWVudCwgb3B0aW9uczogT3B0aW9uczxUPik7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgbmV3IENvbnRleHRQcm92aWRlcihob3N0LCBvcHRpb25zKSAqL1xuICBjb25zdHJ1Y3Rvcihob3N0OiBIb3N0RWxlbWVudCwgY29udGV4dDogVCwgaW5pdGlhbFZhbHVlPzogQ29udGV4dFR5cGU8VD4pO1xuICBjb25zdHJ1Y3RvcihcbiAgICBob3N0OiBIb3N0RWxlbWVudCxcbiAgICBjb250ZXh0T3JPcHRpb25zOiBUIHwgT3B0aW9uczxUPixcbiAgICBpbml0aWFsVmFsdWU/OiBDb250ZXh0VHlwZTxUPlxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIChjb250ZXh0T3JPcHRpb25zIGFzIE9wdGlvbnM8VD4pLmNvbnRleHQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IChjb250ZXh0T3JPcHRpb25zIGFzIE9wdGlvbnM8VD4pLmluaXRpYWxWYWx1ZVxuICAgICAgICA6IGluaXRpYWxWYWx1ZVxuICAgICk7XG4gICAgdGhpcy5ob3N0ID0gaG9zdDtcbiAgICBpZiAoKGNvbnRleHRPck9wdGlvbnMgYXMgT3B0aW9uczxUPikuY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNvbnRleHQgPSAoY29udGV4dE9yT3B0aW9ucyBhcyBPcHRpb25zPFQ+KS5jb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0T3JPcHRpb25zIGFzIFQ7XG4gICAgfVxuICAgIHRoaXMuYXR0YWNoTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5ob3N0LmFkZENvbnRyb2xsZXI/Lih0aGlzKTtcbiAgfVxuXG4gIG9uQ29udGV4dFJlcXVlc3QgPSAoXG4gICAgZXY6IENvbnRleHRSZXF1ZXN0RXZlbnQ8Q29udGV4dDx1bmtub3duLCB1bmtub3duPj5cbiAgKTogdm9pZCA9PiB7XG4gICAgLy8gT25seSBjYWxsIHRoZSBjYWxsYmFjayBpZiB0aGUgY29udGV4dCBtYXRjaGVzLlxuICAgIC8vIEFsc28sIGluIGNhc2UgYW4gZWxlbWVudCBpcyBhIGNvbnN1bWVyIEFORCBhIHByb3ZpZGVyXG4gICAgLy8gb2YgdGhlIHNhbWUgY29udGV4dCwgd2Ugd2FudCB0byBhdm9pZCB0aGUgZWxlbWVudCB0byBzZWxmLXJlZ2lzdGVyLlxuICAgIC8vIFRoZSBjaGVjayBvbiBjb21wb3NlZFBhdGggKGFzIG9wcG9zZWQgdG8gZXYudGFyZ2V0KSBpcyB0byBjb3ZlciBjYXNlc1xuICAgIC8vIHdoZXJlIHRoZSBjb25zdW1lciBpcyBpbiB0aGUgc2hhZG93RG9tIG9mIHRoZSBwcm92aWRlciAoaW4gd2hpY2ggY2FzZSxcbiAgICAvLyBldmVudC50YXJnZXQgPT09IHRoaXMuaG9zdCBiZWNhdXNlIG9mIGV2ZW50IHJldGFyZ2V0aW5nKS5cbiAgICBjb25zdCBjb25zdW1lckhvc3QgPSBldi5jb21wb3NlZFBhdGgoKVswXSBhcyBFbGVtZW50O1xuICAgIGlmIChldi5jb250ZXh0ICE9PSB0aGlzLmNvbnRleHQgfHwgY29uc3VtZXJIb3N0ID09PSB0aGlzLmhvc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5hZGRDYWxsYmFjayhldi5jYWxsYmFjaywgY29uc3VtZXJIb3N0LCBldi5zdWJzY3JpYmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBXaGVuIHdlIGdldCBhIHByb3ZpZGVyIHJlcXVlc3QgZXZlbnQsIHRoYXQgbWVhbnMgYSBjaGlsZCBvZiB0aGlzIGVsZW1lbnRcbiAgICogaGFzIGp1c3Qgd29rZW4gdXAuIElmIGl0J3MgYSBwcm92aWRlciBvZiBvdXIgY29udGV4dCwgdGhlbiB3ZSBtYXkgbmVlZCB0b1xuICAgKiByZS1wYXJlbnQgb3VyIHN1YnNjcmlwdGlvbnMsIGJlY2F1c2UgaXMgYSBtb3JlIHNwZWNpZmljIHByb3ZpZGVyIHRoYW4gdXNcbiAgICogZm9yIGl0cyBzdWJ0cmVlLlxuICAgKi9cbiAgb25Qcm92aWRlclJlcXVlc3QgPSAoXG4gICAgZXY6IENvbnRleHRQcm92aWRlckV2ZW50PENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4+XG4gICk6IHZvaWQgPT4ge1xuICAgIC8vIElnbm9yZSBldmVudHMgd2hlbiB0aGUgY29udGV4dCBkb2Vzbid0IG1hdGNoLlxuICAgIC8vIEFsc28sIGluIGNhc2UgYW4gZWxlbWVudCBpcyBhIGNvbnN1bWVyIEFORCBhIHByb3ZpZGVyXG4gICAgLy8gb2YgdGhlIHNhbWUgY29udGV4dCBpdCBzaG91bGRuJ3QgcHJvdmlkZSB0byBpdHNlbGYuXG4gICAgLy8gV2UgdXNlIGNvbXBvc2VkUGF0aCAoYXMgb3Bwb3NlZCB0byBldi50YXJnZXQpIHRvIGNvdmVyIGNhc2VzXG4gICAgLy8gd2hlcmUgdGhlIGNvbnN1bWVyIGlzIGluIHRoZSBzaGFkb3dEb20gb2YgdGhlIHByb3ZpZGVyIChpbiB3aGljaCBjYXNlLFxuICAgIC8vIGV2ZW50LnRhcmdldCA9PT0gdGhpcy5ob3N0IGJlY2F1c2Ugb2YgZXZlbnQgcmV0YXJnZXRpbmcpLlxuICAgIGNvbnN0IGNoaWxkUHJvdmlkZXJIb3N0ID0gZXYuY29tcG9zZWRQYXRoKClbMF0gYXMgRWxlbWVudDtcbiAgICBpZiAoZXYuY29udGV4dCAhPT0gdGhpcy5jb250ZXh0IHx8IGNoaWxkUHJvdmlkZXJIb3N0ID09PSB0aGlzLmhvc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUmUtcGFyZW50IGFsbCBvZiBvdXIgc3Vic2NyaXB0aW9ucyBpbiBjYXNlIHRoaXMgbmV3IGNoaWxkIHByb3ZpZGVyXG4gICAgLy8gc2hvdWxkIHRha2UgdGhlbSBvdmVyLlxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHVua25vd24+KCk7XG4gICAgZm9yIChjb25zdCBbY2FsbGJhY2ssIHtjb25zdW1lckhvc3R9XSBvZiB0aGlzLnN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIC8vIFByZXZlbnQgaW5maW5pdGUgbG9vcHMgaW4gdGhlIGNhc2Ugd2hlcmUgYSBvbmUgaG9zdCBlbGVtZW50XG4gICAgICAvLyBpcyBwcm92aWRpbmcgdGhlIHNhbWUgY29udGV4dCBtdWx0aXBsZSB0aW1lcy5cbiAgICAgIC8vXG4gICAgICAvLyBXaGlsZSBub3JtYWxseSBpdCdzIGEgbm8tb3AgdG8gYXR0ZW1wdCB0byByZS1wYXJlbnQgYSBzdWJzY3JpcHRpb25cbiAgICAgIC8vIHRoYXQgYWxyZWFkeSBoYXMgaXRzIHByb3BlciBwYXJlbnQsIGluIHRoZSBjYXNlIHdoZXJlIHRoZXJlJ3MgbW9yZVxuICAgICAgLy8gdGhhbiBvbmUgVmFsdWVQcm92aWRlciBmb3IgdGhlIHNhbWUgY29udGV4dCBvbiB0aGUgc2FtZSBob3N0RWxlbWVudCxcbiAgICAgIC8vIHRoZXkgd2lsbCBlYWNoIGNhbGwgdGhlIGNvbnN1bWVyLCBhbmQgc2luY2UgdGhleSB3aWxsIGVhY2ggaGF2ZSB0aGVpclxuICAgICAgLy8gb3duIGRpc3Bvc2UgZnVuY3Rpb24sIGEgd2VsbCBiZWhhdmVkIGNvbnN1bWVyIHdpbGwgbm90aWNlIHRoZSBjaGFuZ2VcbiAgICAgIC8vIGluIGRpc3Bvc2UgZnVuY3Rpb24gYW5kIGNhbGwgdGhlaXIgb2xkIG9uZS5cbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIHdpbGwgY2F1c2UgdGhlIHN1YnNjcmlwdGlvbnMgdG8gdGhyYXNoLCBidXQgd29yc2UsIHdpdGhvdXQgdGhpc1xuICAgICAgLy8gc2V0IGNoZWNrIGhlcmUsIHdlIGNhbiBlbmQgdXAgaW4gYW4gaW5maW5pdGUgbG9vcCwgYXMgd2UgYWRkIGFuZCByZW1vdmVcbiAgICAgIC8vIHRoZSBzYW1lIHN1YnNjcmlwdGlvbnMgb250byB0aGUgZW5kIG9mIHRoZSBtYXAgb3ZlciBhbmQgb3Zlci5cbiAgICAgIGlmIChzZWVuLmhhcyhjYWxsYmFjaykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzZWVuLmFkZChjYWxsYmFjayk7XG4gICAgICBjb25zdW1lckhvc3QuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IENvbnRleHRSZXF1ZXN0RXZlbnQodGhpcy5jb250ZXh0LCBjYWxsYmFjaywgdHJ1ZSlcbiAgICAgICk7XG4gICAgfVxuICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9O1xuXG4gIHByaXZhdGUgYXR0YWNoTGlzdGVuZXJzKCkge1xuICAgIHRoaXMuaG9zdC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0LXJlcXVlc3QnLCB0aGlzLm9uQ29udGV4dFJlcXVlc3QpO1xuICAgIHRoaXMuaG9zdC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0LXByb3ZpZGVyJywgdGhpcy5vblByb3ZpZGVyUmVxdWVzdCk7XG4gIH1cblxuICBob3N0Q29ubmVjdGVkKCk6IHZvaWQge1xuICAgIC8vIGVtaXQgYW4gZXZlbnQgdG8gc2lnbmFsIGEgcHJvdmlkZXIgaXMgYXZhaWxhYmxlIGZvciB0aGlzIGNvbnRleHRcbiAgICB0aGlzLmhvc3QuZGlzcGF0Y2hFdmVudChuZXcgQ29udGV4dFByb3ZpZGVyRXZlbnQodGhpcy5jb250ZXh0KSk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtSZWFjdGl2ZUVsZW1lbnR9IGZyb20gJ0BsaXQvcmVhY3RpdmUtZWxlbWVudCc7XG5pbXBvcnQge0NvbnRleHR9IGZyb20gJy4uL2NyZWF0ZS1jb250ZXh0LmpzJztcbmltcG9ydCB7Q29udGV4dFByb3ZpZGVyfSBmcm9tICcuLi9jb250cm9sbGVycy9jb250ZXh0LXByb3ZpZGVyLmpzJztcblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cblxuLyoqXG4gKiBBIHByb3BlcnR5IGRlY29yYXRvciB0aGF0IGFkZHMgYSBDb250ZXh0UHJvdmlkZXIgY29udHJvbGxlciB0byB0aGUgY29tcG9uZW50XG4gKiBtYWtpbmcgaXQgcmVzcG9uZCB0byBhbnkgYGNvbnRleHQtcmVxdWVzdGAgZXZlbnRzIGZyb20gaXRzIGNoaWxkcmVuIGNvbnN1bWVyLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IEEgQ29udGV4dCBpZGVudGlmaWVyIHZhbHVlIGNyZWF0ZWQgdmlhIGBjcmVhdGVDb250ZXh0YFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7cHJvdmlkZX0gZnJvbSAnQGxpdC9jb250ZXh0JztcbiAqIGltcG9ydCB7TG9nZ2VyfSBmcm9tICdteS1sb2dnaW5nLWxpYnJhcnknO1xuICogaW1wb3J0IHtsb2dnZXJDb250ZXh0fSBmcm9tICcuL2xvZ2dlci1jb250ZXh0LmpzJztcbiAqXG4gKiBjbGFzcyBNeUVsZW1lbnQge1xuICogICBAcHJvdmlkZSh7Y29udGV4dDogbG9nZ2VyQ29udGV4dH0pXG4gKiAgIGxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcbiAqIH1cbiAqIGBgYFxuICogQGNhdGVnb3J5IERlY29yYXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZTxWYWx1ZVR5cGU+KHtcbiAgY29udGV4dDogY29udGV4dCxcbn06IHtcbiAgY29udGV4dDogQ29udGV4dDx1bmtub3duLCBWYWx1ZVR5cGU+O1xufSk6IFByb3ZpZGVEZWNvcmF0b3I8VmFsdWVUeXBlPiB7XG4gIHJldHVybiAoKFxuICAgIHByb3RvT3JUYXJnZXQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8UmVhY3RpdmVFbGVtZW50LCBWYWx1ZVR5cGU+LFxuICAgIG5hbWVPckNvbnRleHQ6XG4gICAgICB8IFByb3BlcnR5S2V5XG4gICAgICB8IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0PFJlYWN0aXZlRWxlbWVudCwgVmFsdWVUeXBlPlxuICApID0+IHtcbiAgICAvLyBNYXAgb2YgaW5zdGFuY2VzIHRvIGNvbnRyb2xsZXJzXG4gICAgY29uc3QgY29udHJvbGxlck1hcCA9IG5ldyBXZWFrTWFwPFxuICAgICAgUmVhY3RpdmVFbGVtZW50LFxuICAgICAgQ29udGV4dFByb3ZpZGVyPENvbnRleHQ8dW5rbm93biwgVmFsdWVUeXBlPj5cbiAgICA+KCk7XG4gICAgaWYgKHR5cGVvZiBuYW1lT3JDb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgLy8gU3RhbmRhcmQgZGVjb3JhdG9ycyBicmFuY2hcbiAgICAgIG5hbWVPckNvbnRleHQuYWRkSW5pdGlhbGl6ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBjb250cm9sbGVyTWFwLnNldCh0aGlzLCBuZXcgQ29udGV4dFByb3ZpZGVyKHRoaXMsIHtjb250ZXh0fSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBnZXQodGhpczogUmVhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIHByb3RvT3JUYXJnZXQuZ2V0LmNhbGwodGhpcyk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQsIHZhbHVlOiBWYWx1ZVR5cGUpIHtcbiAgICAgICAgICBjb250cm9sbGVyTWFwLmdldCh0aGlzKT8uc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgIHJldHVybiBwcm90b09yVGFyZ2V0LnNldC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgaW5pdCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQsIHZhbHVlOiBWYWx1ZVR5cGUpIHtcbiAgICAgICAgICBjb250cm9sbGVyTWFwLmdldCh0aGlzKT8uc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV4cGVyaW1lbnRhbCBkZWNvcmF0b3JzIGJyYW5jaFxuICAgICAgKHByb3RvT3JUYXJnZXQuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuYWRkSW5pdGlhbGl6ZXIoXG4gICAgICAgIChlbGVtZW50OiBSZWFjdGl2ZUVsZW1lbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICBjb250cm9sbGVyTWFwLnNldChlbGVtZW50LCBuZXcgQ29udGV4dFByb3ZpZGVyKGVsZW1lbnQsIHtjb250ZXh0fSkpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgLy8gcHJveHkgYW55IGV4aXN0aW5nIHNldHRlciBmb3IgdGhpcyBwcm9wZXJ0eSBhbmQgdXNlIGl0IHRvXG4gICAgICAvLyBub3RpZnkgdGhlIGNvbnRyb2xsZXIgb2YgYW4gdXBkYXRlZCB2YWx1ZVxuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgIHByb3RvT3JUYXJnZXQsXG4gICAgICAgIG5hbWVPckNvbnRleHRcbiAgICAgICk7XG4gICAgICBsZXQgbmV3RGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgICAgaWYgKGRlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB2YWx1ZU1hcCA9IG5ldyBXZWFrTWFwPFJlYWN0aXZlRWxlbWVudCwgVmFsdWVUeXBlPigpO1xuICAgICAgICBuZXdEZXNjcmlwdG9yID0ge1xuICAgICAgICAgIGdldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZU1hcC5nZXQodGhpcyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQodGhpczogUmVhY3RpdmVFbGVtZW50LCB2YWx1ZTogVmFsdWVUeXBlKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyTWFwLmdldCh0aGlzKSEuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgdmFsdWVNYXAuc2V0KHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb2xkU2V0dGVyID0gZGVzY3JpcHRvci5zZXQ7XG4gICAgICAgIG5ld0Rlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgLi4uZGVzY3JpcHRvcixcbiAgICAgICAgICBzZXQodGhpczogUmVhY3RpdmVFbGVtZW50LCB2YWx1ZTogVmFsdWVUeXBlKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyTWFwLmdldCh0aGlzKSEuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgb2xkU2V0dGVyPy5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvT3JUYXJnZXQsIG5hbWVPckNvbnRleHQsIG5ld0Rlc2NyaXB0b3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSkgYXMgUHJvdmlkZURlY29yYXRvcjxWYWx1ZVR5cGU+O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHB1YmxpYyBpbnRlcmZhY2UgdHlwZSB0aGF0IHJlbW92ZXMgcHJpdmF0ZSBhbmQgcHJvdGVjdGVkIGZpZWxkcy5cbiAqIFRoaXMgYWxsb3dzIGFjY2VwdGluZyBvdGhlcndpc2UgY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiB0aGUgdHlwZSAoZS5nLiBmcm9tXG4gKiBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgcGFja2FnZSBpbiBgbm9kZV9tb2R1bGVzYCkuXG4gKi9cbnR5cGUgSW50ZXJmYWNlPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXTtcbn07XG5cbnR5cGUgUHJvdmlkZURlY29yYXRvcjxDb250ZXh0VHlwZT4gPSB7XG4gIC8vIGxlZ2FjeVxuICA8XG4gICAgSyBleHRlbmRzIFByb3BlcnR5S2V5LFxuICAgIFByb3RvIGV4dGVuZHMgSW50ZXJmYWNlPE9taXQ8UmVhY3RpdmVFbGVtZW50LCAncmVuZGVyUm9vdCc+PixcbiAgPihcbiAgICBwcm90b09yRGVzY3JpcHRvcjogUHJvdG8sXG4gICAgbmFtZT86IEtcbiAgKTogRmllbGRNdXN0TWF0Y2hDb250ZXh0VHlwZTxQcm90bywgSywgQ29udGV4dFR5cGU+O1xuXG4gIC8vIHN0YW5kYXJkXG4gIDxcbiAgICBDIGV4dGVuZHMgSW50ZXJmYWNlPE9taXQ8UmVhY3RpdmVFbGVtZW50LCAncmVuZGVyUm9vdCc+PixcbiAgICBWIGV4dGVuZHMgQ29udGV4dFR5cGUsXG4gID4oXG4gICAgdmFsdWU6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj4sXG4gICAgY29udGV4dDogQ2xhc3NBY2Nlc3NvckRlY29yYXRvckNvbnRleHQ8QywgVj5cbiAgKTogdm9pZDtcbn07XG5cbi8vIE5vdGUgVHlwZVNjcmlwdCByZXF1aXJlcyB0aGUgcmV0dXJuIHR5cGUgb2YgYSBkZWNvcmF0b3IgdG8gYmUgYHZvaWQgfCBhbnlgXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxudHlwZSBEZWNvcmF0b3JSZXR1cm4gPSB2b2lkIHwgYW55O1xuXG50eXBlIEZpZWxkTXVzdE1hdGNoQ29udGV4dFR5cGU8T2JqLCBLZXkgZXh0ZW5kcyBQcm9wZXJ0eUtleSwgQ29udGV4dFR5cGU+ID1cbiAgLy8gRmlyc3Qgd2UgY2hlY2sgd2hldGhlciB0aGUgb2JqZWN0IGhhcyB0aGUgcHJvcGVydHkgYXMgYSByZXF1aXJlZCBmaWVsZFxuICBPYmogZXh0ZW5kcyBSZWNvcmQ8S2V5LCBpbmZlciBQcm92aWRpbmdUeXBlPlxuICAgID8gLy8gT2ssIGl0IGRvZXMsIGp1c3QgY2hlY2sgd2hldGhlciBpdCdzIG9rIHRvIGFzc2lnbiB0aGVcbiAgICAgIC8vIHByb3ZpZGVkIHR5cGUgdG8gdGhlIGNvbnN1bWluZyBmaWVsZFxuICAgICAgW1Byb3ZpZGluZ1R5cGVdIGV4dGVuZHMgW0NvbnRleHRUeXBlXVxuICAgICAgPyBEZWNvcmF0b3JSZXR1cm5cbiAgICAgIDoge1xuICAgICAgICAgIG1lc3NhZ2U6ICdwcm92aWRpbmcgZmllbGQgbm90IGFzc2lnbmFibGUgdG8gY29udGV4dCc7XG4gICAgICAgICAgY29udGV4dDogQ29udGV4dFR5cGU7XG4gICAgICAgICAgcHJvdmlkZWQ6IFByb3ZpZGluZ1R5cGU7XG4gICAgICAgIH1cbiAgICA6IC8vIE5leHQgd2UgY2hlY2sgd2hldGhlciB0aGUgb2JqZWN0IGhhcyB0aGUgcHJvcGVydHkgYXMgYW4gb3B0aW9uYWwgZmllbGRcbiAgICAgIE9iaiBleHRlbmRzIFBhcnRpYWw8UmVjb3JkPEtleSwgaW5mZXIgUHJvdmlkaW5nPj5cbiAgICAgID8gLy8gQ2hlY2sgYXNzaWduYWJpbGl0eSBhZ2Fpbi4gTm90ZSB0aGF0IHdlIGhhdmUgdG8gaW5jbHVkZSB1bmRlZmluZWRcbiAgICAgICAgLy8gaGVyZSBvbiB0aGUgcHJvdmlkaW5nIHR5cGUgYmVjYXVzZSBpdCdzIG9wdGlvbmFsLlxuICAgICAgICBbUHJvdmlkaW5nIHwgdW5kZWZpbmVkXSBleHRlbmRzIFtDb250ZXh0VHlwZV1cbiAgICAgICAgPyBEZWNvcmF0b3JSZXR1cm5cbiAgICAgICAgOiB7XG4gICAgICAgICAgICBtZXNzYWdlOiAncHJvdmlkaW5nIGZpZWxkIG5vdCBhc3NpZ25hYmxlIHRvIGNvbnRleHQnO1xuICAgICAgICAgICAgY29udGV4dDogQ29udGV4dFR5cGU7XG4gICAgICAgICAgICBjb25zdW1pbmc6IFByb3ZpZGluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICA6IC8vIE9rLCB0aGUgZmllbGQgaXNuJ3QgcHJlc2VudCwgc28gZWl0aGVyIHNvbWVvbmUncyB1c2luZyBwcm92aWRlXG4gICAgICAgIC8vIG1hbnVhbGx5LCBpLmUuIG5vdCBhcyBhIGRlY29yYXRvciAobWF5YmUgZG9uJ3QgZG8gdGhhdCEgYnV0IGlmIHlvdSBkbyxcbiAgICAgICAgLy8geW91J3JlIG9uIHlvdXIgb3duIGZvciB5b3VyIHR5cGUgY2hlY2tpbmcsIHNvcnJ5KSwgb3IgdGhlIGZpZWxkIGlzXG4gICAgICAgIC8vIHByaXZhdGUsIGluIHdoaWNoIGNhc2Ugd2UgY2FuJ3QgY2hlY2sgaXQuXG4gICAgICAgIERlY29yYXRvclJldHVybjtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtSZWFjdGl2ZUVsZW1lbnR9IGZyb20gJ0BsaXQvcmVhY3RpdmUtZWxlbWVudCc7XG5pbXBvcnQge0NvbnRleHRDb25zdW1lcn0gZnJvbSAnLi4vY29udHJvbGxlcnMvY29udGV4dC1jb25zdW1lci5qcyc7XG5pbXBvcnQge0NvbnRleHR9IGZyb20gJy4uL2NyZWF0ZS1jb250ZXh0LmpzJztcblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cblxuLyoqXG4gKiBBIHByb3BlcnR5IGRlY29yYXRvciB0aGF0IGFkZHMgYSBDb250ZXh0Q29uc3VtZXIgY29udHJvbGxlciB0byB0aGUgY29tcG9uZW50XG4gKiB3aGljaCB3aWxsIHRyeSBhbmQgcmV0cmlldmUgYSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IHZpYSB0aGUgQ29udGV4dCBBUEkuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgQSBDb250ZXh0IGlkZW50aWZpZXIgdmFsdWUgY3JlYXRlZCB2aWEgYGNyZWF0ZUNvbnRleHRgXG4gKiBAcGFyYW0gc3Vic2NyaWJlIEFuIG9wdGlvbmFsIGJvb2xlYW4gd2hpY2ggd2hlbiB0cnVlIGFsbG93cyB0aGUgdmFsdWUgdG8gYmUgdXBkYXRlZFxuICogICBtdWx0aXBsZSB0aW1lcy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2NvbnN1bWV9IGZyb20gJ0BsaXQvY29udGV4dCc7XG4gKiBpbXBvcnQge2xvZ2dlckNvbnRleHQsIExvZ2dlcn0gZnJvbSAnY29tbXVuaXR5LXByb3RvY29scy9sb2dnZXInO1xuICpcbiAqIGNsYXNzIE15RWxlbWVudCB7XG4gKiAgIEBjb25zdW1lKHtjb250ZXh0OiBsb2dnZXJDb250ZXh0fSlcbiAqICAgbG9nZ2VyPzogTG9nZ2VyO1xuICpcbiAqICAgZG9UaGluZygpIHtcbiAqICAgICB0aGlzLmxvZ2dlciEubG9nKCd0aGluZyB3YXMgZG9uZScpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN1bWU8VmFsdWVUeXBlPih7XG4gIGNvbnRleHQsXG4gIHN1YnNjcmliZSxcbn06IHtcbiAgY29udGV4dDogQ29udGV4dDx1bmtub3duLCBWYWx1ZVR5cGU+O1xuICBzdWJzY3JpYmU/OiBib29sZWFuO1xufSk6IENvbnN1bWVEZWNvcmF0b3I8VmFsdWVUeXBlPiB7XG4gIHJldHVybiAoKFxuICAgIHByb3RvT3JUYXJnZXQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8UmVhY3RpdmVFbGVtZW50LCBWYWx1ZVR5cGU+LFxuICAgIG5hbWVPckNvbnRleHQ6XG4gICAgICB8IFByb3BlcnR5S2V5XG4gICAgICB8IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0PFJlYWN0aXZlRWxlbWVudCwgVmFsdWVUeXBlPlxuICApID0+IHtcbiAgICBpZiAodHlwZW9mIG5hbWVPckNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBTdGFuZGFyZCBkZWNvcmF0b3JzIGJyYW5jaFxuICAgICAgbmFtZU9yQ29udGV4dC5hZGRJbml0aWFsaXplcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIG5ldyBDb250ZXh0Q29uc3VtZXIodGhpcywge1xuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgY2FsbGJhY2s6ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgcHJvdG9PclRhcmdldC5zZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV4cGVyaW1lbnRhbCBkZWNvcmF0b3JzIGJyYW5jaFxuICAgICAgKHByb3RvT3JUYXJnZXQuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuYWRkSW5pdGlhbGl6ZXIoXG4gICAgICAgIChlbGVtZW50OiBSZWFjdGl2ZUVsZW1lbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICBuZXcgQ29udGV4dENvbnN1bWVyKGVsZW1lbnQsIHtcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICBjYWxsYmFjazogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgIChlbGVtZW50IGFzIGFueSlbbmFtZU9yQ29udGV4dF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9KSBhcyBDb25zdW1lRGVjb3JhdG9yPFZhbHVlVHlwZT47XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcHVibGljIGludGVyZmFjZSB0eXBlIHRoYXQgcmVtb3ZlcyBwcml2YXRlIGFuZCBwcm90ZWN0ZWQgZmllbGRzLlxuICogVGhpcyBhbGxvd3MgYWNjZXB0aW5nIG90aGVyd2lzZSBpbmNvbXBhdGlibGUgdmVyc2lvbnMgb2YgdGhlIHR5cGUgKGUuZy4gZnJvbVxuICogbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIHBhY2thZ2UgaW4gYG5vZGVfbW9kdWxlc2ApLlxuICovXG50eXBlIEludGVyZmFjZTxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS107XG59O1xuXG50eXBlIENvbnN1bWVEZWNvcmF0b3I8VmFsdWVUeXBlPiA9IHtcbiAgLy8gbGVnYWN5XG4gIDxcbiAgICBLIGV4dGVuZHMgUHJvcGVydHlLZXksXG4gICAgUHJvdG8gZXh0ZW5kcyBJbnRlcmZhY2U8T21pdDxSZWFjdGl2ZUVsZW1lbnQsICdyZW5kZXJSb290Jz4+LFxuICA+KFxuICAgIHByb3RvT3JEZXNjcmlwdG9yOiBQcm90byxcbiAgICBuYW1lPzogS1xuICApOiBGaWVsZE11c3RNYXRjaFByb3ZpZGVkVHlwZTxQcm90bywgSywgVmFsdWVUeXBlPjtcblxuICAvLyBzdGFuZGFyZFxuICA8XG4gICAgQyBleHRlbmRzIEludGVyZmFjZTxPbWl0PFJlYWN0aXZlRWxlbWVudCwgJ3JlbmRlclJvb3QnPj4sXG4gICAgViBleHRlbmRzIFZhbHVlVHlwZSxcbiAgPihcbiAgICB2YWx1ZTogQ2xhc3NBY2Nlc3NvckRlY29yYXRvclRhcmdldDxDLCBWPixcbiAgICBjb250ZXh0OiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dDxDLCBWPlxuICApOiB2b2lkO1xufTtcblxuLy8gTm90ZSBUeXBlU2NyaXB0IHJlcXVpcmVzIHRoZSByZXR1cm4gdHlwZSBvZiBhIGRlY29yYXRvciB0byBiZSBgdm9pZCB8IGFueWBcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG50eXBlIERlY29yYXRvclJldHVybiA9IHZvaWQgfCBhbnk7XG5cbnR5cGUgRmllbGRNdXN0TWF0Y2hQcm92aWRlZFR5cGU8T2JqLCBLZXkgZXh0ZW5kcyBQcm9wZXJ0eUtleSwgUHJvdmlkZWRUeXBlPiA9XG4gIC8vIEZpcnN0IHdlIGNoZWNrIHdoZXRoZXIgdGhlIG9iamVjdCBoYXMgdGhlIHByb3BlcnR5IGFzIGEgcmVxdWlyZWQgZmllbGRcbiAgT2JqIGV4dGVuZHMgUmVjb3JkPEtleSwgaW5mZXIgQ29uc3VtaW5nVHlwZT5cbiAgICA/IC8vIE9rLCBpdCBkb2VzLCBqdXN0IGNoZWNrIHdoZXRoZXIgaXQncyBvayB0byBhc3NpZ24gdGhlXG4gICAgICAvLyBwcm92aWRlZCB0eXBlIHRvIHRoZSBjb25zdW1pbmcgZmllbGRcbiAgICAgIFtQcm92aWRlZFR5cGVdIGV4dGVuZHMgW0NvbnN1bWluZ1R5cGVdXG4gICAgICA/IERlY29yYXRvclJldHVyblxuICAgICAgOiB7XG4gICAgICAgICAgbWVzc2FnZTogJ3Byb3ZpZGVkIHR5cGUgbm90IGFzc2lnbmFibGUgdG8gY29uc3VtaW5nIGZpZWxkJztcbiAgICAgICAgICBwcm92aWRlZDogUHJvdmlkZWRUeXBlO1xuICAgICAgICAgIGNvbnN1bWluZzogQ29uc3VtaW5nVHlwZTtcbiAgICAgICAgfVxuICAgIDogLy8gTmV4dCB3ZSBjaGVjayB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eSBhcyBhbiBvcHRpb25hbCBmaWVsZFxuICAgICAgT2JqIGV4dGVuZHMgUGFydGlhbDxSZWNvcmQ8S2V5LCBpbmZlciBDb25zdW1pbmdUeXBlPj5cbiAgICAgID8gLy8gQ2hlY2sgYXNzaWduYWJpbGl0eSBhZ2Fpbi4gTm90ZSB0aGF0IHdlIGhhdmUgdG8gaW5jbHVkZSB1bmRlZmluZWRcbiAgICAgICAgLy8gaGVyZSBvbiB0aGUgY29uc3VtaW5nIHR5cGUgYmVjYXVzZSBpdCdzIG9wdGlvbmFsLlxuICAgICAgICBbUHJvdmlkZWRUeXBlXSBleHRlbmRzIFtDb25zdW1pbmdUeXBlIHwgdW5kZWZpbmVkXVxuICAgICAgICA/IERlY29yYXRvclJldHVyblxuICAgICAgICA6IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdwcm92aWRlZCB0eXBlIG5vdCBhc3NpZ25hYmxlIHRvIGNvbnN1bWluZyBmaWVsZCc7XG4gICAgICAgICAgICBwcm92aWRlZDogUHJvdmlkZWRUeXBlO1xuICAgICAgICAgICAgY29uc3VtaW5nOiBDb25zdW1pbmdUeXBlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgIDogLy8gT2ssIHRoZSBmaWVsZCBpc24ndCBwcmVzZW50LCBzbyBlaXRoZXIgc29tZW9uZSdzIHVzaW5nIGNvbnN1bWVcbiAgICAgICAgLy8gbWFudWFsbHksIGkuZS4gbm90IGFzIGEgZGVjb3JhdG9yIChtYXliZSBkb24ndCBkbyB0aGF0ISBidXQgaWYgeW91IGRvLFxuICAgICAgICAvLyB5b3UncmUgb24geW91ciBvd24gZm9yIHlvdXIgdHlwZSBjaGVja2luZywgc29ycnkpLCBvciB0aGUgZmllbGQgaXNcbiAgICAgICAgLy8gcHJpdmF0ZSwgaW4gd2hpY2ggY2FzZSB3ZSBjYW4ndCBjaGVjayBpdC5cbiAgICAgICAgRGVjb3JhdG9yUmV0dXJuO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG50eXBlIEFSSUFBdHRyaWJ1dGVNYXAgPSB7XG4gIFtLIGluIGtleW9mIEFSSUFNaXhpbl06IHN0cmluZztcbn07XG5cbi8qKlxuICogTWFwIG9mIEFSSUFNaXhpbiBwcm9wZXJ0aWVzIHRvIGF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGFyaWFNaXhpbkF0dHJpYnV0ZXM6IEFSSUFBdHRyaWJ1dGVNYXAgPSB7XG4gIGFyaWFBdG9taWM6ICdhcmlhLWF0b21pYycsXG4gIGFyaWFBdXRvQ29tcGxldGU6ICdhcmlhLWF1dG9jb21wbGV0ZScsXG4gIGFyaWFCcmFpbGxlTGFiZWw6ICdhcmlhLWJyYWlsbGVsYWJlbCcsXG4gIGFyaWFCcmFpbGxlUm9sZURlc2NyaXB0aW9uOiAnYXJpYS1icmFpbGxlcm9sZWRlc2NyaXB0aW9uJyxcbiAgYXJpYUJ1c3k6ICdhcmlhLWJ1c3knLFxuICBhcmlhQ2hlY2tlZDogJ2FyaWEtY2hlY2tlZCcsXG4gIGFyaWFDb2xDb3VudDogJ2FyaWEtY29sY291bnQnLFxuICBhcmlhQ29sSW5kZXg6ICdhcmlhLWNvbGluZGV4JyxcbiAgYXJpYUNvbFNwYW46ICdhcmlhLWNvbHNwYW4nLFxuICBhcmlhQ3VycmVudDogJ2FyaWEtY3VycmVudCcsXG4gIGFyaWFEZXNjcmlwdGlvbjogJ2FyaWEtZGVzY3JpcHRpb24nLFxuICBhcmlhRGlzYWJsZWQ6ICdhcmlhLWRpc2FibGVkJyxcbiAgYXJpYUV4cGFuZGVkOiAnYXJpYS1leHBhbmRlZCcsXG4gIGFyaWFIYXNQb3B1cDogJ2FyaWEtaGFzcG9wdXAnLFxuICBhcmlhSGlkZGVuOiAnYXJpYS1oaWRkZW4nLFxuICBhcmlhSW52YWxpZDogJ2FyaWEtaW52YWxpZCcsXG4gIGFyaWFLZXlTaG9ydGN1dHM6ICdhcmlhLWtleXNob3J0Y3V0cycsXG4gIGFyaWFMYWJlbDogJ2FyaWEtbGFiZWwnLFxuICBhcmlhTGV2ZWw6ICdhcmlhLWxldmVsJyxcbiAgYXJpYUxpdmU6ICdhcmlhLWxpdmUnLFxuICBhcmlhTW9kYWw6ICdhcmlhLW1vZGFsJyxcbiAgYXJpYU11bHRpTGluZTogJ2FyaWEtbXVsdGlsaW5lJyxcbiAgYXJpYU11bHRpU2VsZWN0YWJsZTogJ2FyaWEtbXVsdGlzZWxlY3RhYmxlJyxcbiAgYXJpYU9yaWVudGF0aW9uOiAnYXJpYS1vcmllbnRhdGlvbicsXG4gIGFyaWFQbGFjZWhvbGRlcjogJ2FyaWEtcGxhY2Vob2xkZXInLFxuICBhcmlhUG9zSW5TZXQ6ICdhcmlhLXBvc2luc2V0JyxcbiAgYXJpYVByZXNzZWQ6ICdhcmlhLXByZXNzZWQnLFxuICBhcmlhUmVhZE9ubHk6ICdhcmlhLXJlYWRvbmx5JyxcbiAgYXJpYVJlcXVpcmVkOiAnYXJpYS1yZXF1aXJlZCcsXG4gIGFyaWFSb2xlRGVzY3JpcHRpb246ICdhcmlhLXJvbGVkZXNjcmlwdGlvbicsXG4gIGFyaWFSb3dDb3VudDogJ2FyaWEtcm93Y291bnQnLFxuICBhcmlhUm93SW5kZXg6ICdhcmlhLXJvd2luZGV4JyxcbiAgYXJpYVJvd1NwYW46ICdhcmlhLXJvd3NwYW4nLFxuICBhcmlhU2VsZWN0ZWQ6ICdhcmlhLXNlbGVjdGVkJyxcbiAgYXJpYVNldFNpemU6ICdhcmlhLXNldHNpemUnLFxuICBhcmlhU29ydDogJ2FyaWEtc29ydCcsXG4gIGFyaWFWYWx1ZU1heDogJ2FyaWEtdmFsdWVtYXgnLFxuICBhcmlhVmFsdWVNaW46ICdhcmlhLXZhbHVlbWluJyxcbiAgYXJpYVZhbHVlTm93OiAnYXJpYS12YWx1ZW5vdycsXG4gIGFyaWFWYWx1ZVRleHQ6ICdhcmlhLXZhbHVldGV4dCcsXG4gIHJvbGU6ICdyb2xlJyxcbn07XG5cbnR5cGUgRWxlbWVudEludGVybmFsc0ludGVyZmFjZSA9IEVsZW1lbnRJbnRlcm5hbHM7XG5cbi8vIFNoaW0gdGhlIGdsb2JhbCBlbGVtZW50IGludGVybmFscyBvYmplY3Rcbi8vIE1ldGhvZHMgc2hvdWxkIGJlIGZpbmUgYXMgbm9vcHMgYW5kIHByb3BlcnRpZXMgY2FuIGdlbmVyYWxseVxuLy8gYmUgd2hpbGUgb24gdGhlIHNlcnZlci5cbmV4cG9ydCBjb25zdCBFbGVtZW50SW50ZXJuYWxzU2hpbSA9IGNsYXNzIEVsZW1lbnRJbnRlcm5hbHNcbiAgaW1wbGVtZW50cyBFbGVtZW50SW50ZXJuYWxzSW50ZXJmYWNlXG57XG4gIGFyaWFBdG9taWMgPSAnJztcbiAgYXJpYUF1dG9Db21wbGV0ZSA9ICcnO1xuICBhcmlhQnJhaWxsZUxhYmVsID0gJyc7XG4gIGFyaWFCcmFpbGxlUm9sZURlc2NyaXB0aW9uID0gJyc7XG4gIGFyaWFCdXN5ID0gJyc7XG4gIGFyaWFDaGVja2VkID0gJyc7XG4gIGFyaWFDb2xDb3VudCA9ICcnO1xuICBhcmlhQ29sSW5kZXggPSAnJztcbiAgYXJpYUNvbFNwYW4gPSAnJztcbiAgYXJpYUN1cnJlbnQgPSAnJztcbiAgYXJpYURlc2NyaXB0aW9uID0gJyc7XG4gIGFyaWFEaXNhYmxlZCA9ICcnO1xuICBhcmlhRXhwYW5kZWQgPSAnJztcbiAgYXJpYUhhc1BvcHVwID0gJyc7XG4gIGFyaWFIaWRkZW4gPSAnJztcbiAgYXJpYUludmFsaWQgPSAnJztcbiAgYXJpYUtleVNob3J0Y3V0cyA9ICcnO1xuICBhcmlhTGFiZWwgPSAnJztcbiAgYXJpYUxldmVsID0gJyc7XG4gIGFyaWFMaXZlID0gJyc7XG4gIGFyaWFNb2RhbCA9ICcnO1xuICBhcmlhTXVsdGlMaW5lID0gJyc7XG4gIGFyaWFNdWx0aVNlbGVjdGFibGUgPSAnJztcbiAgYXJpYU9yaWVudGF0aW9uID0gJyc7XG4gIGFyaWFQbGFjZWhvbGRlciA9ICcnO1xuICBhcmlhUG9zSW5TZXQgPSAnJztcbiAgYXJpYVByZXNzZWQgPSAnJztcbiAgYXJpYVJlYWRPbmx5ID0gJyc7XG4gIGFyaWFSZXF1aXJlZCA9ICcnO1xuICBhcmlhUm9sZURlc2NyaXB0aW9uID0gJyc7XG4gIGFyaWFSb3dDb3VudCA9ICcnO1xuICBhcmlhUm93SW5kZXggPSAnJztcbiAgYXJpYVJvd1NwYW4gPSAnJztcbiAgYXJpYVNlbGVjdGVkID0gJyc7XG4gIGFyaWFTZXRTaXplID0gJyc7XG4gIGFyaWFTb3J0ID0gJyc7XG4gIGFyaWFWYWx1ZU1heCA9ICcnO1xuICBhcmlhVmFsdWVNaW4gPSAnJztcbiAgYXJpYVZhbHVlTm93ID0gJyc7XG4gIGFyaWFWYWx1ZVRleHQgPSAnJztcbiAgcm9sZSA9ICcnO1xuICBfX2hvc3Q6IEhUTUxFbGVtZW50O1xuICBnZXQgc2hhZG93Um9vdCgpIHtcbiAgICAvLyBHcmFiIHRoZSBzaGFkb3cgcm9vdCBpbnN0YW5jZSBmcm9tIHRoZSBFbGVtZW50IHNoaW1cbiAgICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgc2hhZG93IHJvb3QgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgIC8vIHRvIHRoZSBpbnRlcm5hbHMgaW5zdGFuY2UgZXZlbiBpZiB0aGUgbW9kZSBpcyAnY2xvc2VkJ1xuICAgIHJldHVybiAodGhpcy5fX2hvc3QgYXMgSFRNTEVsZW1lbnQgJiB7X19zaGFkb3dSb290OiBTaGFkb3dSb290fSlcbiAgICAgIC5fX3NoYWRvd1Jvb3Q7XG4gIH1cbiAgY29uc3RydWN0b3IoX2hvc3Q6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fX2hvc3QgPSBfaG9zdDtcbiAgfVxuICBjaGVja1ZhbGlkaXR5KCkge1xuICAgIC8vIFRPRE8oYXVndXN0amspIENvbnNpZGVyIGFjdHVhbGx5IGltcGxlbWVudGluZyBsb2dpYy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvaXNzdWVzLzM3NDBcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnYEVsZW1lbnRJbnRlcm5hbHMuY2hlY2tWYWxpZGl0eSgpYCB3YXMgY2FsbGVkIG9uIHRoZSBzZXJ2ZXIuJyArXG4gICAgICAgICdUaGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyB0cnVlLidcbiAgICApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGZvcm0gPSBudWxsO1xuICBsYWJlbHMgPSBbXSBhcyB1bmtub3duIGFzIE5vZGVMaXN0T2Y8SFRNTExhYmVsRWxlbWVudD47XG4gIHJlcG9ydFZhbGlkaXR5KCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHNldEZvcm1WYWx1ZSgpOiB2b2lkIHt9XG4gIHNldFZhbGlkaXR5KCk6IHZvaWQge31cbiAgc3RhdGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG4gIHZhbGlkaXR5ID0ge30gYXMgVmFsaWRpdHlTdGF0ZTtcbiAgd2lsbFZhbGlkYXRlID0gdHJ1ZTtcbn07XG5cbmNvbnN0IEVsZW1lbnRJbnRlcm5hbHNTaGltV2l0aFJlYWxUeXBlID1cbiAgRWxlbWVudEludGVybmFsc1NoaW0gYXMgb2JqZWN0IGFzIHR5cGVvZiBFbGVtZW50SW50ZXJuYWxzO1xuZXhwb3J0IHtFbGVtZW50SW50ZXJuYWxzU2hpbVdpdGhSZWFsVHlwZSBhcyBFbGVtZW50SW50ZXJuYWxzfTtcblxuZXhwb3J0IGNvbnN0IEhZRFJBVEVfSU5URVJOQUxTX0FUVFJfUFJFRklYID0gJ2h5ZHJhdGUtaW50ZXJuYWxzLSc7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5pbXBvcnQge0VsZW1lbnRJbnRlcm5hbHNTaGltfSBmcm9tICcuL2xpYi9lbGVtZW50LWludGVybmFscy5qcyc7XG5cbmV4cG9ydCB7XG4gIGFyaWFNaXhpbkF0dHJpYnV0ZXMsXG4gIEVsZW1lbnRJbnRlcm5hbHMsXG4gIEhZRFJBVEVfSU5URVJOQUxTX0FUVFJfUFJFRklYLFxufSBmcm9tICcuL2xpYi9lbGVtZW50LWludGVybmFscy5qcyc7XG5cbmNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgV2Vha01hcDxcbiAgSW5zdGFuY2VUeXBlPHR5cGVvZiBIVE1MRWxlbWVudFNoaW0+LFxuICBNYXA8c3RyaW5nLCBzdHJpbmc+XG4+KCk7XG5jb25zdCBhdHRyaWJ1dGVzRm9yRWxlbWVudCA9IChcbiAgZWxlbWVudDogSW5zdGFuY2VUeXBlPHR5cGVvZiBIVE1MRWxlbWVudFNoaW0+XG4pID0+IHtcbiAgbGV0IGF0dHJzID0gYXR0cmlidXRlcy5nZXQoZWxlbWVudCk7XG4gIGlmIChhdHRycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXR0cmlidXRlcy5zZXQoZWxlbWVudCwgKGF0dHJzID0gbmV3IE1hcCgpKSk7XG4gIH1cbiAgcmV0dXJuIGF0dHJzO1xufTtcblxuLy8gVGhlIHR5cGluZ3MgYXJvdW5kIHRoZSBleHBvcnRzIGJlbG93IGFyZSBhIGxpdHRsZSBmdW5reTpcbi8vXG4vLyAxLiBXZSB3YW50IHRoZSBgbmFtZWAgb2YgdGhlIHNoaW0gY2xhc3NlcyB0byBtYXRjaCB0aGUgcmVhbCBvbmVzIGF0IHJ1bnRpbWUsXG4vLyAgICBoZW5jZSBlLmcuIGBjbGFzcyBFbGVtZW50YC5cbi8vIDIuIFdlIGNhbid0IHNoYWRvdyB0aGUgZ2xvYmFsIHR5cGVzIHdpdGggYSBzaW1wbGUgY2xhc3MgZGVjbGFyYXRpb24sIGJlY2F1c2Vcbi8vICAgIHRoZW4gd2UgY2FuJ3QgcmVmZXJlbmNlIHRoZSBnbG9iYWwgdHlwZXMgZm9yIGNhc3RpbmcsIGhlbmNlIGUuZy5cbi8vICAgIGBjb25zdCBFbGVtZW50U2hpbSA9IGNsYXNzIEVsZW1lbnRgLlxuLy8gMy4gV2Ugd2FudCB0byBleHBvcnQgdGhlIGNsYXNzZXMgdHlwZWQgYXMgdGhlIHJlYWwgb25lcywgaGVuY2UgZS5nLlxuLy8gICAgYGNvbnN0IEVsZW1lbnRTaGltV2l0aFJlYWxUeXBlID0gRWxlbWVudFNoaW0gYXMgb2JqZWN0IGFzIHR5cGVvZiBFbGVtZW50O2AuXG4vLyA0LiBXZSB3YW50IHRoZSBleHBvcnRlZCBuYW1lcyB0byBtYXRjaCB0aGUgcmVhbCBvbmVzLCBoZW5jZSBlLmcuXG4vLyAgICBgZXhwb3J0IHtFbGVtZW50U2hpbVdpdGhSZWFsVHlwZSBhcyBFbGVtZW50fWAuXG5jb25zdCBFbGVtZW50U2hpbSA9IGNsYXNzIEVsZW1lbnQge1xuICBnZXQgYXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShhdHRyaWJ1dGVzRm9yRWxlbWVudCh0aGlzKSkubWFwKChbbmFtZSwgdmFsdWVdKSA9PiAoe1xuICAgICAgbmFtZSxcbiAgICAgIHZhbHVlLFxuICAgIH0pKTtcbiAgfVxuICBwcml2YXRlIF9fc2hhZG93Um9vdE1vZGU6IG51bGwgfCBTaGFkb3dSb290TW9kZSA9IG51bGw7XG4gIHByb3RlY3RlZCBfX3NoYWRvd1Jvb3Q6IG51bGwgfCBTaGFkb3dSb290ID0gbnVsbDtcbiAgcHJvdGVjdGVkIF9faW50ZXJuYWxzOiBudWxsIHwgRWxlbWVudEludGVybmFscyA9IG51bGw7XG5cbiAgZ2V0IHNoYWRvd1Jvb3QoKSB7XG4gICAgaWYgKHRoaXMuX19zaGFkb3dSb290TW9kZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX3NoYWRvd1Jvb3Q7XG4gIH1cbiAgZ2V0IGxvY2FsTmFtZSgpIHtcbiAgICByZXR1cm4gKHRoaXMuY29uc3RydWN0b3IgYXMgTmFtZWRDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yKS5fX2xvY2FsTmFtZTtcbiAgfVxuICBnZXQgdGFnTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbE5hbWU/LnRvVXBwZXJDYXNlKCk7XG4gIH1cbiAgc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBFbXVsYXRlIGJyb3dzZXIgYmVoYXZpb3IgdGhhdCBzaWxlbnRseSBjYXN0cyBhbGwgdmFsdWVzIHRvIHN0cmluZy4gRS5nLlxuICAgIC8vIGA0MmAgYmVjb21lcyBgXCI0MlwiYCBhbmQgYHt9YCBiZWNvbWVzIGBcIltvYmplY3QgT2JqZWN0XVwiXCJgLlxuICAgIGF0dHJpYnV0ZXNGb3JFbGVtZW50KHRoaXMpLnNldChuYW1lLCBTdHJpbmcodmFsdWUpKTtcbiAgfVxuICByZW1vdmVBdHRyaWJ1dGUobmFtZTogc3RyaW5nKSB7XG4gICAgYXR0cmlidXRlc0ZvckVsZW1lbnQodGhpcykuZGVsZXRlKG5hbWUpO1xuICB9XG4gIHRvZ2dsZUF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIGZvcmNlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIC8vIFN0ZXBzIHJlZmVyZW5jZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1lbGVtZW50LXRvZ2dsZWF0dHJpYnV0ZVxuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgLy8gU3RlcCA1XG4gICAgICBpZiAoZm9yY2UgPT09IHVuZGVmaW5lZCB8fCAhZm9yY2UpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RlcCA0XG4gICAgICBpZiAoZm9yY2UgPT09IHVuZGVmaW5lZCB8fCBmb3JjZSkge1xuICAgICAgICAvLyBTdGVwIDQuMVxuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCAnJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU3RlcCA0LjJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBTdGVwIDZcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBoYXNBdHRyaWJ1dGUobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXNGb3JFbGVtZW50KHRoaXMpLmhhcyhuYW1lKTtcbiAgfVxuICBhdHRhY2hTaGFkb3coaW5pdDogU2hhZG93Um9vdEluaXQpOiBTaGFkb3dSb290IHtcbiAgICBjb25zdCBzaGFkb3dSb290ID0ge2hvc3Q6IHRoaXN9IGFzIG9iamVjdCBhcyBTaGFkb3dSb290O1xuICAgIHRoaXMuX19zaGFkb3dSb290TW9kZSA9IGluaXQubW9kZTtcbiAgICBpZiAoaW5pdCAmJiBpbml0Lm1vZGUgPT09ICdvcGVuJykge1xuICAgICAgdGhpcy5fX3NoYWRvd1Jvb3QgPSBzaGFkb3dSb290O1xuICAgIH1cbiAgICByZXR1cm4gc2hhZG93Um9vdDtcbiAgfVxuICBhdHRhY2hJbnRlcm5hbHMoKTogRWxlbWVudEludGVybmFscyB7XG4gICAgaWYgKHRoaXMuX19pbnRlcm5hbHMgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBleGVjdXRlICdhdHRhY2hJbnRlcm5hbHMnIG9uICdIVE1MRWxlbWVudCc6IGAgK1xuICAgICAgICAgIGBFbGVtZW50SW50ZXJuYWxzIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgd2FzIGFscmVhZHkgYXR0YWNoZWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgaW50ZXJuYWxzID0gbmV3IEVsZW1lbnRJbnRlcm5hbHNTaGltKHRoaXMgYXMgdW5rbm93biBhcyBIVE1MRWxlbWVudCk7XG4gICAgdGhpcy5fX2ludGVybmFscyA9IGludGVybmFscztcbiAgICByZXR1cm4gaW50ZXJuYWxzIGFzIEVsZW1lbnRJbnRlcm5hbHM7XG4gIH1cbiAgZ2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHZhbHVlID0gYXR0cmlidXRlc0ZvckVsZW1lbnQodGhpcykuZ2V0KG5hbWUpO1xuICAgIHJldHVybiB2YWx1ZSA/PyBudWxsO1xuICB9XG59O1xuY29uc3QgRWxlbWVudFNoaW1XaXRoUmVhbFR5cGUgPSBFbGVtZW50U2hpbSBhcyBvYmplY3QgYXMgdHlwZW9mIEVsZW1lbnQ7XG5leHBvcnQge0VsZW1lbnRTaGltV2l0aFJlYWxUeXBlIGFzIEVsZW1lbnR9O1xuXG5jb25zdCBIVE1MRWxlbWVudFNoaW0gPSBjbGFzcyBIVE1MRWxlbWVudCBleHRlbmRzIEVsZW1lbnRTaGltIHt9O1xuY29uc3QgSFRNTEVsZW1lbnRTaGltV2l0aFJlYWxUeXBlID1cbiAgSFRNTEVsZW1lbnRTaGltIGFzIG9iamVjdCBhcyB0eXBlb2YgSFRNTEVsZW1lbnQ7XG5leHBvcnQge0hUTUxFbGVtZW50U2hpbVdpdGhSZWFsVHlwZSBhcyBIVE1MRWxlbWVudH07XG5cbmludGVyZmFjZSBDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yIHtcbiAgbmV3ICgpOiBIVE1MRWxlbWVudDtcbiAgb2JzZXJ2ZWRBdHRyaWJ1dGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBOYW1lZEN1c3RvbUhUTUxFbGVtZW50Q29uc3RydWN0b3JcbiAgZXh0ZW5kcyBDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yIHtcbiAgX19sb2NhbE5hbWU6IHN0cmluZztcbn1cblxudHlwZSBDdXN0b21FbGVtZW50UmVnaXN0cmF0aW9uID0ge1xuICBjdG9yOiB7bmV3ICgpOiBIVE1MRWxlbWVudH07XG4gIG9ic2VydmVkQXR0cmlidXRlczogc3RyaW5nW107XG59O1xuXG5jb25zdCBDdXN0b21FbGVtZW50UmVnaXN0cnlTaGltID0gY2xhc3MgQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBfX2RlZmluaXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRSZWdpc3RyYXRpb24+KCk7XG5cbiAgZGVmaW5lKG5hbWU6IHN0cmluZywgY3RvcjogQ3VzdG9tSFRNTEVsZW1lbnRDb25zdHJ1Y3Rvcikge1xuICAgIGlmICh0aGlzLl9fZGVmaW5pdGlvbnMuaGFzKG5hbWUpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGAnQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5JyBhbHJlYWR5IGhhcyBcIiR7bmFtZX1cIiBkZWZpbmVkLiBgICtcbiAgICAgICAgICAgIGBUaGlzIG1heSBoYXZlIGJlZW4gY2F1c2VkIGJ5IGxpdmUgcmVsb2FkIG9yIGhvdCBtb2R1bGUgYCArXG4gICAgICAgICAgICBgcmVwbGFjZW1lbnQgaW4gd2hpY2ggY2FzZSBpdCBjYW4gYmUgc2FmZWx5IGlnbm9yZWQuXFxuYCArXG4gICAgICAgICAgICBgTWFrZSBzdXJlIHRvIHRlc3QgeW91ciBhcHBsaWNhdGlvbiB3aXRoIGEgcHJvZHVjdGlvbiBidWlsZCBhcyBgICtcbiAgICAgICAgICAgIGByZXBlYXQgcmVnaXN0cmF0aW9ucyB3aWxsIHRocm93IGluIHByb2R1Y3Rpb24uYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gZXhlY3V0ZSAnZGVmaW5lJyBvbiAnQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5JzogYCArXG4gICAgICAgICAgICBgdGhlIG5hbWUgXCIke25hbWV9XCIgaGFzIGFscmVhZHkgYmVlbiB1c2VkIHdpdGggdGhpcyByZWdpc3RyeWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUHJvdmlkZSB0YWdOYW1lIGFuZCBsb2NhbE5hbWUgZm9yIHRoZSBjb21wb25lbnQuXG4gICAgKGN0b3IgYXMgTmFtZWRDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yKS5fX2xvY2FsTmFtZSA9IG5hbWU7XG4gICAgdGhpcy5fX2RlZmluaXRpb25zLnNldChuYW1lLCB7XG4gICAgICBjdG9yLFxuICAgICAgLy8gTm90ZSBpdCdzIGltcG9ydGFudCB3ZSByZWFkIGBvYnNlcnZlZEF0dHJpYnV0ZXNgIGluIGNhc2UgaXQgaXMgYSBnZXR0ZXJcbiAgICAgIC8vIHdpdGggc2lkZS1lZmZlY3RzLCBhcyBpcyB0aGUgY2FzZSBpbiBMaXQsIHdoZXJlIGl0IHRyaWdnZXJzIGNsYXNzXG4gICAgICAvLyBmaW5hbGl6YXRpb24uXG4gICAgICAvL1xuICAgICAgLy8gVE9ETyhhb21hcmtzKSBUbyBiZSBzcGVjIGNvbXBsaWFudCwgd2Ugc2hvdWxkIGFsc28gY2FwdHVyZSB0aGVcbiAgICAgIC8vIHJlZ2lzdHJhdGlvbi10aW1lIGxpZmVjeWNsZSBtZXRob2RzIGxpa2UgYGNvbm5lY3RlZENhbGxiYWNrYC4gRm9yIHRoZW1cbiAgICAgIC8vIHRvIGJlIGFjdHVhbGx5IGFjY2Vzc2libGUgdG8gZS5nLiB0aGUgTGl0IFNTUiBlbGVtZW50IHJlbmRlcmVyLCB0aG91Z2gsXG4gICAgICAvLyB3ZSdkIG5lZWQgdG8gaW50cm9kdWNlIGEgbmV3IEFQSSBmb3IgYWNjZXNzaW5nIHRoZW0gKHNpbmNlIGBnZXRgIG9ubHlcbiAgICAgIC8vIHJldHVybnMgdGhlIGNvbnN0cnVjdG9yKS5cbiAgICAgIG9ic2VydmVkQXR0cmlidXRlczogY3Rvci5vYnNlcnZlZEF0dHJpYnV0ZXMgPz8gW10sXG4gICAgfSk7XG4gIH1cblxuICBnZXQobmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IHRoaXMuX19kZWZpbml0aW9ucy5nZXQobmFtZSk7XG4gICAgcmV0dXJuIGRlZmluaXRpb24/LmN0b3I7XG4gIH1cbn07XG5jb25zdCBDdXN0b21FbGVtZW50UmVnaXN0cnlTaGltV2l0aFJlYWxUeXBlID1cbiAgQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5U2hpbSBhcyBvYmplY3QgYXMgdHlwZW9mIEN1c3RvbUVsZW1lbnRSZWdpc3RyeTtcbmV4cG9ydCB7Q3VzdG9tRWxlbWVudFJlZ2lzdHJ5U2hpbVdpdGhSZWFsVHlwZSBhcyBDdXN0b21FbGVtZW50UmVnaXN0cnl9O1xuXG5leHBvcnQgY29uc3QgY3VzdG9tRWxlbWVudHMgPSBuZXcgQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5U2hpbVdpdGhSZWFsVHlwZSgpO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG5jb25zdCBOT0RFX01PREUgPSBmYWxzZTtcblxuLy8gQWxsb3dzIG1pbmlmaWVycyB0byByZW5hbWUgcmVmZXJlbmNlcyB0byBnbG9iYWxUaGlzXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgYnJvd3NlciBzdXBwb3J0cyBgYWRvcHRlZFN0eWxlU2hlZXRzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0czogYm9vbGVhbiA9XG4gIGdsb2JhbC5TaGFkb3dSb290ICYmXG4gIChnbG9iYWwuU2hhZHlDU1MgPT09IHVuZGVmaW5lZCB8fCBnbG9iYWwuU2hhZHlDU1MubmF0aXZlU2hhZG93KSAmJlxuICAnYWRvcHRlZFN0eWxlU2hlZXRzJyBpbiBEb2N1bWVudC5wcm90b3R5cGUgJiZcbiAgJ3JlcGxhY2UnIGluIENTU1N0eWxlU2hlZXQucHJvdG90eXBlO1xuXG4vKipcbiAqIEEgQ1NTUmVzdWx0IG9yIG5hdGl2ZSBDU1NTdHlsZVNoZWV0LlxuICpcbiAqIEluIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBjb25zdHJ1Y3RpYmxlIENTUyBzdHlsZSBzaGVldHMsIENTU1N0eWxlU2hlZXRcbiAqIG9iamVjdCBjYW4gYmUgdXNlZCBmb3Igc3R5bGluZyBhbG9uZyBzaWRlIENTU1Jlc3VsdCBmcm9tIHRoZSBgY3NzYFxuICogdGVtcGxhdGUgdGFnLlxuICovXG5leHBvcnQgdHlwZSBDU1NSZXN1bHRPck5hdGl2ZSA9IENTU1Jlc3VsdCB8IENTU1N0eWxlU2hlZXQ7XG5cbmV4cG9ydCB0eXBlIENTU1Jlc3VsdEFycmF5ID0gQXJyYXk8Q1NTUmVzdWx0T3JOYXRpdmUgfCBDU1NSZXN1bHRBcnJheT47XG5cbi8qKlxuICogQSBzaW5nbGUgQ1NTUmVzdWx0LCBDU1NTdHlsZVNoZWV0LCBvciBhbiBhcnJheSBvciBuZXN0ZWQgYXJyYXlzIG9mIHRob3NlLlxuICovXG5leHBvcnQgdHlwZSBDU1NSZXN1bHRHcm91cCA9IENTU1Jlc3VsdE9yTmF0aXZlIHwgQ1NTUmVzdWx0QXJyYXk7XG5cbmNvbnN0IGNvbnN0cnVjdGlvblRva2VuID0gU3ltYm9sKCk7XG5cbmNvbnN0IGNzc1RhZ0NhY2hlID0gbmV3IFdlYWtNYXA8VGVtcGxhdGVTdHJpbmdzQXJyYXksIENTU1N0eWxlU2hlZXQ+KCk7XG5cbi8qKlxuICogQSBjb250YWluZXIgZm9yIGEgc3RyaW5nIG9mIENTUyB0ZXh0LCB0aGF0IG1heSBiZSB1c2VkIHRvIGNyZWF0ZSBhIENTU1N0eWxlU2hlZXQuXG4gKlxuICogQ1NTUmVzdWx0IGlzIHRoZSByZXR1cm4gdmFsdWUgb2YgYGNzc2AtdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWxzIGFuZFxuICogYHVuc2FmZUNTUygpYC4gSW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgQ1NTUmVzdWx0cyBhcmUgb25seSBjcmVhdGVkIHZpYSB0aGVcbiAqIGBjc3NgIHRhZyBhbmQgYHVuc2FmZUNTUygpYCwgQ1NTUmVzdWx0IGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseS5cbiAqL1xuZXhwb3J0IGNsYXNzIENTU1Jlc3VsdCB7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIFsnXyRjc3NSZXN1bHQkJ10gPSB0cnVlO1xuICByZWFkb25seSBjc3NUZXh0OiBzdHJpbmc7XG4gIHByaXZhdGUgX3N0eWxlU2hlZXQ/OiBDU1NTdHlsZVNoZWV0O1xuICBwcml2YXRlIF9zdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIGNzc1RleHQ6IHN0cmluZyxcbiAgICBzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHVuZGVmaW5lZCxcbiAgICBzYWZlVG9rZW46IHN5bWJvbFxuICApIHtcbiAgICBpZiAoc2FmZVRva2VuICE9PSBjb25zdHJ1Y3Rpb25Ub2tlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ1NTUmVzdWx0IGlzIG5vdCBjb25zdHJ1Y3RhYmxlLiBVc2UgYHVuc2FmZUNTU2Agb3IgYGNzc2AgaW5zdGVhZC4nXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmNzc1RleHQgPSBjc3NUZXh0O1xuICAgIHRoaXMuX3N0cmluZ3MgPSBzdHJpbmdzO1xuICB9XG5cbiAgLy8gVGhpcyBpcyBhIGdldHRlciBzbyB0aGF0IGl0J3MgbGF6eS4gSW4gcHJhY3RpY2UsIHRoaXMgbWVhbnMgc3R5bGVzaGVldHNcbiAgLy8gYXJlIG5vdCBjcmVhdGVkIHVudGlsIHRoZSBmaXJzdCBlbGVtZW50IGluc3RhbmNlIGlzIG1hZGUuXG4gIGdldCBzdHlsZVNoZWV0KCk6IENTU1N0eWxlU2hlZXQgfCB1bmRlZmluZWQge1xuICAgIC8vIElmIGBzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHNgIGlzIHRydWUgdGhlbiB3ZSBhc3N1bWUgQ1NTU3R5bGVTaGVldCBpc1xuICAgIC8vIGNvbnN0cnVjdGFibGUuXG4gICAgbGV0IHN0eWxlU2hlZXQgPSB0aGlzLl9zdHlsZVNoZWV0O1xuICAgIGNvbnN0IHN0cmluZ3MgPSB0aGlzLl9zdHJpbmdzO1xuICAgIGlmIChzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHMgJiYgc3R5bGVTaGVldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjYWNoZWFibGUgPSBzdHJpbmdzICE9PSB1bmRlZmluZWQgJiYgc3RyaW5ncy5sZW5ndGggPT09IDE7XG4gICAgICBpZiAoY2FjaGVhYmxlKSB7XG4gICAgICAgIHN0eWxlU2hlZXQgPSBjc3NUYWdDYWNoZS5nZXQoc3RyaW5ncyk7XG4gICAgICB9XG4gICAgICBpZiAoc3R5bGVTaGVldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICh0aGlzLl9zdHlsZVNoZWV0ID0gc3R5bGVTaGVldCA9IG5ldyBDU1NTdHlsZVNoZWV0KCkpLnJlcGxhY2VTeW5jKFxuICAgICAgICAgIHRoaXMuY3NzVGV4dFxuICAgICAgICApO1xuICAgICAgICBpZiAoY2FjaGVhYmxlKSB7XG4gICAgICAgICAgY3NzVGFnQ2FjaGUuc2V0KHN0cmluZ3MsIHN0eWxlU2hlZXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHlsZVNoZWV0O1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jc3NUZXh0O1xuICB9XG59XG5cbnR5cGUgQ29uc3RydWN0YWJsZUNTU1Jlc3VsdCA9IENTU1Jlc3VsdCAmIHtcbiAgbmV3IChcbiAgICBjc3NUZXh0OiBzdHJpbmcsXG4gICAgc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCB1bmRlZmluZWQsXG4gICAgc2FmZVRva2VuOiBzeW1ib2xcbiAgKTogQ1NTUmVzdWx0O1xufTtcblxuY29uc3QgdGV4dEZyb21DU1NSZXN1bHQgPSAodmFsdWU6IENTU1Jlc3VsdEdyb3VwIHwgbnVtYmVyKSA9PiB7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIGlmICgodmFsdWUgYXMgQ1NTUmVzdWx0KVsnXyRjc3NSZXN1bHQkJ10gPT09IHRydWUpIHtcbiAgICByZXR1cm4gKHZhbHVlIGFzIENTU1Jlc3VsdCkuY3NzVGV4dDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBWYWx1ZSBwYXNzZWQgdG8gJ2NzcycgZnVuY3Rpb24gbXVzdCBiZSBhICdjc3MnIGZ1bmN0aW9uIHJlc3VsdDogYCArXG4gICAgICAgIGAke3ZhbHVlfS4gVXNlICd1bnNhZmVDU1MnIHRvIHBhc3Mgbm9uLWxpdGVyYWwgdmFsdWVzLCBidXQgdGFrZSBjYXJlIGAgK1xuICAgICAgICBgdG8gZW5zdXJlIHBhZ2Ugc2VjdXJpdHkuYFxuICAgICk7XG4gIH1cbn07XG5cbi8qKlxuICogV3JhcCBhIHZhbHVlIGZvciBpbnRlcnBvbGF0aW9uIGluIGEge0BsaW5rY29kZSBjc3N9IHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsLlxuICpcbiAqIFRoaXMgaXMgdW5zYWZlIGJlY2F1c2UgdW50cnVzdGVkIENTUyB0ZXh0IGNhbiBiZSB1c2VkIHRvIHBob25lIGhvbWVcbiAqIG9yIGV4ZmlsdHJhdGUgZGF0YSB0byBhbiBhdHRhY2tlciBjb250cm9sbGVkIHNpdGUuIFRha2UgY2FyZSB0byBvbmx5IHVzZVxuICogdGhpcyB3aXRoIHRydXN0ZWQgaW5wdXQuXG4gKi9cbmV4cG9ydCBjb25zdCB1bnNhZmVDU1MgPSAodmFsdWU6IHVua25vd24pID0+XG4gIG5ldyAoQ1NTUmVzdWx0IGFzIENvbnN0cnVjdGFibGVDU1NSZXN1bHQpKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSksXG4gICAgdW5kZWZpbmVkLFxuICAgIGNvbnN0cnVjdGlvblRva2VuXG4gICk7XG5cbi8qKlxuICogQSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExpdEVsZW1lbnQnc1xuICoge0BsaW5rY29kZSBMaXRFbGVtZW50LnN0eWxlc30gcHJvcGVydHkgdG8gc2V0IGVsZW1lbnQgc3R5bGVzLlxuICpcbiAqIEZvciBzZWN1cml0eSByZWFzb25zLCBvbmx5IGxpdGVyYWwgc3RyaW5nIHZhbHVlcyBhbmQgbnVtYmVyIG1heSBiZSB1c2VkIGluXG4gKiBlbWJlZGRlZCBleHByZXNzaW9ucy4gVG8gaW5jb3Jwb3JhdGUgbm9uLWxpdGVyYWwgdmFsdWVzIHtAbGlua2NvZGUgdW5zYWZlQ1NTfVxuICogbWF5IGJlIHVzZWQgaW5zaWRlIGFuIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBjb25zdCBjc3MgPSAoXG4gIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5LFxuICAuLi52YWx1ZXM6IChDU1NSZXN1bHRHcm91cCB8IG51bWJlcilbXVxuKTogQ1NTUmVzdWx0ID0+IHtcbiAgY29uc3QgY3NzVGV4dCA9XG4gICAgc3RyaW5ncy5sZW5ndGggPT09IDFcbiAgICAgID8gc3RyaW5nc1swXVxuICAgICAgOiB2YWx1ZXMucmVkdWNlKFxuICAgICAgICAgIChhY2MsIHYsIGlkeCkgPT4gYWNjICsgdGV4dEZyb21DU1NSZXN1bHQodikgKyBzdHJpbmdzW2lkeCArIDFdLFxuICAgICAgICAgIHN0cmluZ3NbMF1cbiAgICAgICAgKTtcbiAgcmV0dXJuIG5ldyAoQ1NTUmVzdWx0IGFzIENvbnN0cnVjdGFibGVDU1NSZXN1bHQpKFxuICAgIGNzc1RleHQsXG4gICAgc3RyaW5ncyxcbiAgICBjb25zdHJ1Y3Rpb25Ub2tlblxuICApO1xufTtcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBnaXZlbiBzdHlsZXMgdG8gYSBgc2hhZG93Um9vdGAuIFdoZW4gU2hhZG93IERPTSBpc1xuICogYXZhaWxhYmxlIGJ1dCBgYWRvcHRlZFN0eWxlU2hlZXRzYCBpcyBub3QsIHN0eWxlcyBhcmUgYXBwZW5kZWQgdG8gdGhlXG4gKiBgc2hhZG93Um9vdGAgdG8gW21pbWljIHNwZWMgYmVoYXZpb3JdKGh0dHBzOi8vd2ljZy5naXRodWIuaW8vY29uc3RydWN0LXN0eWxlc2hlZXRzLyN1c2luZy1jb25zdHJ1Y3RlZC1zdHlsZXNoZWV0cykuXG4gKiBOb3RlLCB3aGVuIHNoaW1taW5nIGlzIHVzZWQsIGFueSBzdHlsZXMgdGhhdCBhcmUgc3Vic2VxdWVudGx5IHBsYWNlZCBpbnRvXG4gKiB0aGUgc2hhZG93Um9vdCBzaG91bGQgYmUgcGxhY2VkICpiZWZvcmUqIGFueSBzaGltbWVkIGFkb3B0ZWQgc3R5bGVzLiBUaGlzXG4gKiB3aWxsIG1hdGNoIHNwZWMgYmVoYXZpb3IgdGhhdCBnaXZlcyBhZG9wdGVkIHNoZWV0cyBwcmVjZWRlbmNlIG92ZXIgc3R5bGVzIGluXG4gKiBzaGFkb3dSb290LlxuICovXG5leHBvcnQgY29uc3QgYWRvcHRTdHlsZXMgPSAoXG4gIHJlbmRlclJvb3Q6IFNoYWRvd1Jvb3QsXG4gIHN0eWxlczogQXJyYXk8Q1NTUmVzdWx0T3JOYXRpdmU+XG4pID0+IHtcbiAgaWYgKHN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0cykge1xuICAgIChyZW5kZXJSb290IGFzIFNoYWRvd1Jvb3QpLmFkb3B0ZWRTdHlsZVNoZWV0cyA9IHN0eWxlcy5tYXAoKHMpID0+XG4gICAgICBzIGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldCA/IHMgOiBzLnN0eWxlU2hlZXQhXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHMgb2Ygc3R5bGVzKSB7XG4gICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uc3Qgbm9uY2UgPSAoZ2xvYmFsIGFzIGFueSlbJ2xpdE5vbmNlJ107XG4gICAgICBpZiAobm9uY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbm9uY2UpO1xuICAgICAgfVxuICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSAocyBhcyBDU1NSZXN1bHQpLmNzc1RleHQ7XG4gICAgICByZW5kZXJSb290LmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IGNzc1Jlc3VsdEZyb21TdHlsZVNoZWV0ID0gKHNoZWV0OiBDU1NTdHlsZVNoZWV0KSA9PiB7XG4gIGxldCBjc3NUZXh0ID0gJyc7XG4gIGZvciAoY29uc3QgcnVsZSBvZiBzaGVldC5jc3NSdWxlcykge1xuICAgIGNzc1RleHQgKz0gcnVsZS5jc3NUZXh0O1xuICB9XG4gIHJldHVybiB1bnNhZmVDU1MoY3NzVGV4dCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29tcGF0aWJsZVN0eWxlID1cbiAgc3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzIHx8XG4gIChOT0RFX01PREUgJiYgZ2xvYmFsLkNTU1N0eWxlU2hlZXQgPT09IHVuZGVmaW5lZClcbiAgICA/IChzOiBDU1NSZXN1bHRPck5hdGl2ZSkgPT4gc1xuICAgIDogKHM6IENTU1Jlc3VsdE9yTmF0aXZlKSA9PlxuICAgICAgICBzIGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldCA/IGNzc1Jlc3VsdEZyb21TdHlsZVNoZWV0KHMpIDogcztcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBVc2UgdGhpcyBtb2R1bGUgaWYgeW91IHdhbnQgdG8gY3JlYXRlIHlvdXIgb3duIGJhc2UgY2xhc3MgZXh0ZW5kaW5nXG4gKiB7QGxpbmsgUmVhY3RpdmVFbGVtZW50fS5cbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbmltcG9ydCB7XG4gIGdldENvbXBhdGlibGVTdHlsZSxcbiAgYWRvcHRTdHlsZXMsXG4gIENTU1Jlc3VsdEdyb3VwLFxuICBDU1NSZXN1bHRPck5hdGl2ZSxcbn0gZnJvbSAnLi9jc3MtdGFnLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgUmVhY3RpdmVDb250cm9sbGVyLFxuICBSZWFjdGl2ZUNvbnRyb2xsZXJIb3N0LFxufSBmcm9tICcuL3JlYWN0aXZlLWNvbnRyb2xsZXIuanMnO1xuXG4vLyBJbiB0aGUgTm9kZSBidWlsZCwgdGhpcyBpbXBvcnQgd2lsbCBiZSBpbmplY3RlZCBieSBSb2xsdXA6XG4vLyBpbXBvcnQge0hUTUxFbGVtZW50LCBjdXN0b21FbGVtZW50c30gZnJvbSAnQGxpdC1sYWJzL3Nzci1kb20tc2hpbSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vY3NzLXRhZy5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIFJlYWN0aXZlQ29udHJvbGxlcixcbiAgUmVhY3RpdmVDb250cm9sbGVySG9zdCxcbn0gZnJvbSAnLi9yZWFjdGl2ZS1jb250cm9sbGVyLmpzJztcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBgcmVhZG9ubHlgIG1vZGlmaWVyIGZyb20gcHJvcGVydGllcyBpbiB0aGUgdW5pb24gSy5cbiAqXG4gKiBUaGlzIGlzIGEgc2FmZXIgd2F5IHRvIGNhc3QgYSB2YWx1ZSB0byBhIHR5cGUgd2l0aCBhIG11dGFibGUgdmVyc2lvbiBvZiBhXG4gKiByZWFkb25seSBmaWVsZCwgdGhhbiBjYXN0aW5nIHRvIGFuIGludGVyZmFjZSB3aXRoIHRoZSBmaWVsZCByZS1kZWNsYXJlZFxuICogYmVjYXVzZSBpdCBwcmVzZXJ2ZXMgdGhlIHR5cGUgb2YgYWxsIHRoZSBmaWVsZHMgYW5kIHdhcm5zIG9uIHR5cG9zLlxuICovXG50eXBlIE11dGFibGU8VCwgSyBleHRlbmRzIGtleW9mIFQ+ID0gT21pdDxULCBLPiAmIHtcbiAgLXJlYWRvbmx5IFtQIGluIGtleW9mIFBpY2s8VCwgSz5dOiBQIGV4dGVuZHMgSyA/IFRbUF0gOiBuZXZlcjtcbn07XG5cbi8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiBBZGQgYGhhc093bmAgaGVyZSB3aGVuIHdlIHNoaXAgRVMyMDIyXG5jb25zdCB7XG4gIGlzLFxuICBkZWZpbmVQcm9wZXJ0eSxcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMsXG4gIGdldFByb3RvdHlwZU9mLFxufSA9IE9iamVjdDtcblxuY29uc3QgTk9ERV9NT0RFID0gZmFsc2U7XG5cbi8vIExldHMgYSBtaW5pZmllciByZXBsYWNlIGdsb2JhbFRoaXMgcmVmZXJlbmNlcyB3aXRoIGEgbWluaWZpZWQgbmFtZVxuY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcztcblxuaWYgKE5PREVfTU9ERSkge1xuICBnbG9iYWwuY3VzdG9tRWxlbWVudHMgPz89IGN1c3RvbUVsZW1lbnRzO1xufVxuXG5jb25zdCBERVZfTU9ERSA9IHRydWU7XG5cbmxldCBpc3N1ZVdhcm5pbmc6IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4gdm9pZDtcblxuY29uc3QgdHJ1c3RlZFR5cGVzID0gKGdsb2JhbCBhcyB1bmtub3duIGFzIHt0cnVzdGVkVHlwZXM/OiB7ZW1wdHlTY3JpcHQ6ICcnfX0pXG4gIC50cnVzdGVkVHlwZXM7XG5cbi8vIFRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBodHRwczovL2NyYnVnLmNvbS85OTMyNjhcbi8vIEN1cnJlbnRseSwgYW55IGF0dHJpYnV0ZSBzdGFydGluZyB3aXRoIFwib25cIiBpcyBjb25zaWRlcmVkIHRvIGJlIGFcbi8vIFRydXN0ZWRTY3JpcHQgc291cmNlLiBTdWNoIGJvb2xlYW4gYXR0cmlidXRlcyBtdXN0IGJlIHNldCB0byB0aGUgZXF1aXZhbGVudFxuLy8gdHJ1c3RlZCBlbXB0eVNjcmlwdCB2YWx1ZS5cbmNvbnN0IGVtcHR5U3RyaW5nRm9yQm9vbGVhbkF0dHJpYnV0ZSA9IHRydXN0ZWRUeXBlc1xuICA/ICh0cnVzdGVkVHlwZXMuZW1wdHlTY3JpcHQgYXMgdW5rbm93biBhcyAnJylcbiAgOiAnJztcblxuY29uc3QgcG9seWZpbGxTdXBwb3J0ID0gREVWX01PREVcbiAgPyBnbG9iYWwucmVhY3RpdmVFbGVtZW50UG9seWZpbGxTdXBwb3J0RGV2TW9kZVxuICA6IGdsb2JhbC5yZWFjdGl2ZUVsZW1lbnRQb2x5ZmlsbFN1cHBvcnQ7XG5cbmlmIChERVZfTU9ERSkge1xuICAvLyBFbnN1cmUgd2FybmluZ3MgYXJlIGlzc3VlZCBvbmx5IDF4LCBldmVuIGlmIG11bHRpcGxlIHZlcnNpb25zIG9mIExpdFxuICAvLyBhcmUgbG9hZGVkLlxuICBjb25zdCBpc3N1ZWRXYXJuaW5nczogU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4gPSAoZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzID8/PVxuICAgIG5ldyBTZXQoKSk7XG5cbiAgLy8gSXNzdWUgYSB3YXJuaW5nLCBpZiB3ZSBoYXZlbid0IGFscmVhZHkuXG4gIGlzc3VlV2FybmluZyA9IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4ge1xuICAgIHdhcm5pbmcgKz0gYCBTZWUgaHR0cHM6Ly9saXQuZGV2L21zZy8ke2NvZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLmA7XG4gICAgaWYgKCFpc3N1ZWRXYXJuaW5ncy5oYXMod2FybmluZykpIHtcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgIGlzc3VlZFdhcm5pbmdzLmFkZCh3YXJuaW5nKTtcbiAgICB9XG4gIH07XG5cbiAgaXNzdWVXYXJuaW5nKFxuICAgICdkZXYtbW9kZScsXG4gICAgYExpdCBpcyBpbiBkZXYgbW9kZS4gTm90IHJlY29tbWVuZGVkIGZvciBwcm9kdWN0aW9uIWBcbiAgKTtcblxuICAvLyBJc3N1ZSBwb2x5ZmlsbCBzdXBwb3J0IHdhcm5pbmcuXG4gIGlmIChnbG9iYWwuU2hhZHlET00/LmluVXNlICYmIHBvbHlmaWxsU3VwcG9ydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaXNzdWVXYXJuaW5nKFxuICAgICAgJ3BvbHlmaWxsLXN1cHBvcnQtbWlzc2luZycsXG4gICAgICBgU2hhZG93IERPTSBpcyBiZWluZyBwb2x5ZmlsbGVkIHZpYSBcXGBTaGFkeURPTVxcYCBidXQgYCArXG4gICAgICAgIGB0aGUgXFxgcG9seWZpbGwtc3VwcG9ydFxcYCBtb2R1bGUgaGFzIG5vdCBiZWVuIGxvYWRlZC5gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnRhaW5zIHR5cGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHVuc3RhYmxlIGRlYnVnIEFQSS5cbiAqXG4gKiBFdmVyeXRoaW5nIGluIHRoaXMgQVBJIGlzIG5vdCBzdGFibGUgYW5kIG1heSBjaGFuZ2Ugb3IgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLFxuICogZXZlbiBvbiBwYXRjaCByZWxlYXNlcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbmV4cG9ydCBuYW1lc3BhY2UgUmVhY3RpdmVVbnN0YWJsZSB7XG4gIC8qKlxuICAgKiBXaGVuIExpdCBpcyBydW5uaW5nIGluIGRldiBtb2RlIGFuZCBgd2luZG93LmVtaXRMaXREZWJ1Z0xvZ0V2ZW50c2AgaXMgdHJ1ZSxcbiAgICogd2Ugd2lsbCBlbWl0ICdsaXQtZGVidWcnIGV2ZW50cyB0byB3aW5kb3csIHdpdGggbGl2ZSBkZXRhaWxzIGFib3V0IHRoZSB1cGRhdGUgYW5kIHJlbmRlclxuICAgKiBsaWZlY3ljbGUuIFRoZXNlIGNhbiBiZSB1c2VmdWwgZm9yIHdyaXRpbmcgZGVidWcgdG9vbGluZyBhbmQgdmlzdWFsaXphdGlvbnMuXG4gICAqXG4gICAqIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHJ1bm5pbmcgd2l0aCB3aW5kb3cuZW1pdExpdERlYnVnTG9nRXZlbnRzIGhhcyBwZXJmb3JtYW5jZSBvdmVyaGVhZCxcbiAgICogbWFraW5nIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3JtYWxseSB2ZXJ5IGNoZWFwIChsaWtlIGEgbm8tb3AgcmVuZGVyKSBtdWNoIHNsb3dlcixcbiAgICogYmVjYXVzZSB3ZSBtdXN0IGNvcHkgZGF0YSBhbmQgZGlzcGF0Y2ggZXZlbnRzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbiAgZXhwb3J0IG5hbWVzcGFjZSBEZWJ1Z0xvZyB7XG4gICAgZXhwb3J0IHR5cGUgRW50cnkgPSBVcGRhdGU7XG4gICAgZXhwb3J0IGludGVyZmFjZSBVcGRhdGUge1xuICAgICAga2luZDogJ3VwZGF0ZSc7XG4gICAgfVxuICB9XG59XG5cbmludGVyZmFjZSBEZWJ1Z0xvZ2dpbmdXaW5kb3cge1xuICAvLyBFdmVuIGluIGRldiBtb2RlLCB3ZSBnZW5lcmFsbHkgZG9uJ3Qgd2FudCB0byBlbWl0IHRoZXNlIGV2ZW50cywgYXMgdGhhdCdzXG4gIC8vIGFub3RoZXIgbGV2ZWwgb2YgY29zdCwgc28gb25seSBlbWl0IHRoZW0gd2hlbiBERVZfTU9ERSBpcyB0cnVlIF9hbmRfIHdoZW5cbiAgLy8gd2luZG93LmVtaXRMaXREZWJ1Z0V2ZW50cyBpcyB0cnVlLlxuICBlbWl0TGl0RGVidWdMb2dFdmVudHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFVzZWZ1bCBmb3IgdmlzdWFsaXppbmcgYW5kIGxvZ2dpbmcgaW5zaWdodHMgaW50byB3aGF0IHRoZSBMaXQgdGVtcGxhdGUgc3lzdGVtIGlzIGRvaW5nLlxuICpcbiAqIENvbXBpbGVkIG91dCBvZiBwcm9kIG1vZGUgYnVpbGRzLlxuICovXG5jb25zdCBkZWJ1Z0xvZ0V2ZW50ID0gREVWX01PREVcbiAgPyAoZXZlbnQ6IFJlYWN0aXZlVW5zdGFibGUuRGVidWdMb2cuRW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEVtaXQgPSAoZ2xvYmFsIGFzIHVua25vd24gYXMgRGVidWdMb2dnaW5nV2luZG93KVxuICAgICAgICAuZW1pdExpdERlYnVnTG9nRXZlbnRzO1xuICAgICAgaWYgKCFzaG91bGRFbWl0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGdsb2JhbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8UmVhY3RpdmVVbnN0YWJsZS5EZWJ1Z0xvZy5FbnRyeT4oJ2xpdC1kZWJ1ZycsIHtcbiAgICAgICAgICBkZXRhaWw6IGV2ZW50LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIDogdW5kZWZpbmVkO1xuXG4vKlxuICogV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzXG4gKiByZXBsYWNlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIG11bmdlZCBuYW1lIGZvciBvYmplY3RbcHJvcGVydHldLiBXZSBjYW5ub3RcbiAqIGFsaWFzIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGhhdmUgdG8gdXNlIGEgc21hbGwgc2hpbSB0aGF0IGhhcyB0aGUgc2FtZVxuICogYmVoYXZpb3Igd2hlbiBub3QgY29tcGlsaW5nLlxuICovXG4vKkBfX0lOTElORV9fKi9cbmNvbnN0IEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSA8UCBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgcHJvcDogUCxcbiAgX29iajogdW5rbm93blxuKTogUCA9PiBwcm9wO1xuXG4vKipcbiAqIENvbnZlcnRzIHByb3BlcnR5IHZhbHVlcyB0byBhbmQgZnJvbSBhdHRyaWJ1dGUgdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXI8VHlwZSA9IHVua25vd24sIFR5cGVIaW50ID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogQ2FsbGVkIHRvIGNvbnZlcnQgYW4gYXR0cmlidXRlIHZhbHVlIHRvIGEgcHJvcGVydHlcbiAgICogdmFsdWUuXG4gICAqL1xuICBmcm9tQXR0cmlidXRlPyh2YWx1ZTogc3RyaW5nIHwgbnVsbCwgdHlwZT86IFR5cGVIaW50KTogVHlwZTtcblxuICAvKipcbiAgICogQ2FsbGVkIHRvIGNvbnZlcnQgYSBwcm9wZXJ0eSB2YWx1ZSB0byBhbiBhdHRyaWJ1dGVcbiAgICogdmFsdWUuXG4gICAqXG4gICAqIEl0IHJldHVybnMgdW5rbm93biBpbnN0ZWFkIG9mIHN0cmluZywgdG8gYmUgY29tcGF0aWJsZSB3aXRoXG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL3RydXN0ZWQtdHlwZXMgKGFuZCBzaW1pbGFyIGVmZm9ydHMpLlxuICAgKi9cbiAgdG9BdHRyaWJ1dGU/KHZhbHVlOiBUeXBlLCB0eXBlPzogVHlwZUhpbnQpOiB1bmtub3duO1xufVxuXG50eXBlIEF0dHJpYnV0ZUNvbnZlcnRlcjxUeXBlID0gdW5rbm93biwgVHlwZUhpbnQgPSB1bmtub3duPiA9XG4gIHwgQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlcjxUeXBlPlxuICB8ICgodmFsdWU6IHN0cmluZyB8IG51bGwsIHR5cGU/OiBUeXBlSGludCkgPT4gVHlwZSk7XG5cbi8qKlxuICogRGVmaW5lcyBvcHRpb25zIGZvciBhIHByb3BlcnR5IGFjY2Vzc29yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnR5RGVjbGFyYXRpb248VHlwZSA9IHVua25vd24sIFR5cGVIaW50ID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogV2hlbiBzZXQgdG8gYHRydWVgLCBpbmRpY2F0ZXMgdGhlIHByb3BlcnR5IGlzIGludGVybmFsIHByaXZhdGUgc3RhdGUuIFRoZVxuICAgKiBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIHNldCBieSB1c2Vycy4gV2hlbiB1c2luZyBUeXBlU2NyaXB0LCB0aGlzIHByb3BlcnR5XG4gICAqIHNob3VsZCBiZSBtYXJrZWQgYXMgYHByaXZhdGVgIG9yIGBwcm90ZWN0ZWRgLCBhbmQgaXQgaXMgYWxzbyBhIGNvbW1vblxuICAgKiBwcmFjdGljZSB0byB1c2UgYSBsZWFkaW5nIGBfYCBpbiB0aGUgbmFtZS4gVGhlIHByb3BlcnR5IGlzIG5vdCBhZGRlZCB0b1xuICAgKiBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGhvdyBhbmQgd2hldGhlciB0aGUgcHJvcGVydHkgYmVjb21lcyBhbiBvYnNlcnZlZCBhdHRyaWJ1dGUuXG4gICAqIElmIHRoZSB2YWx1ZSBpcyBgZmFsc2VgLCB0aGUgcHJvcGVydHkgaXMgbm90IGFkZGVkIHRvIGBvYnNlcnZlZEF0dHJpYnV0ZXNgLlxuICAgKiBJZiB0cnVlIG9yIGFic2VudCwgdGhlIGxvd2VyY2FzZWQgcHJvcGVydHkgbmFtZSBpcyBvYnNlcnZlZCAoZS5nLiBgZm9vQmFyYFxuICAgKiBiZWNvbWVzIGBmb29iYXJgKS4gSWYgYSBzdHJpbmcsIHRoZSBzdHJpbmcgdmFsdWUgaXMgb2JzZXJ2ZWQgKGUuZ1xuICAgKiBgYXR0cmlidXRlOiAnZm9vLWJhcidgKS5cbiAgICovXG4gIHJlYWRvbmx5IGF0dHJpYnV0ZT86IGJvb2xlYW4gfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgcHJvcGVydHkuIFRoaXMgaXMgdXNlZCBvbmx5IGFzIGEgaGludCBmb3IgdGhlXG4gICAqIGBjb252ZXJ0ZXJgIHRvIGRldGVybWluZSBob3cgdG8gY29udmVydCB0aGUgYXR0cmlidXRlXG4gICAqIHRvL2Zyb20gYSBwcm9wZXJ0eS5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBUeXBlSGludDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGhvdyB0byBjb252ZXJ0IHRoZSBhdHRyaWJ1dGUgdG8vZnJvbSBhIHByb3BlcnR5LiBJZiB0aGlzIHZhbHVlXG4gICAqIGlzIGEgZnVuY3Rpb24sIGl0IGlzIHVzZWQgdG8gY29udmVydCB0aGUgYXR0cmlidXRlIHZhbHVlIGEgdGhlIHByb3BlcnR5XG4gICAqIHZhbHVlLiBJZiBpdCdzIGFuIG9iamVjdCwgaXQgY2FuIGhhdmUga2V5cyBmb3IgYGZyb21BdHRyaWJ1dGVgIGFuZFxuICAgKiBgdG9BdHRyaWJ1dGVgLiBJZiBubyBgdG9BdHRyaWJ1dGVgIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGFuZFxuICAgKiBgcmVmbGVjdGAgaXMgc2V0IHRvIGB0cnVlYCwgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHNldCBkaXJlY3RseSB0byB0aGVcbiAgICogYXR0cmlidXRlLiBBIGRlZmF1bHQgYGNvbnZlcnRlcmAgaXMgdXNlZCBpZiBub25lIGlzIHByb3ZpZGVkOyBpdCBzdXBwb3J0c1xuICAgKiBgQm9vbGVhbmAsIGBTdHJpbmdgLCBgTnVtYmVyYCwgYE9iamVjdGAsIGFuZCBgQXJyYXlgLiBOb3RlLFxuICAgKiB3aGVuIGEgcHJvcGVydHkgY2hhbmdlcyBhbmQgdGhlIGNvbnZlcnRlciBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgYXR0cmlidXRlLFxuICAgKiB0aGUgcHJvcGVydHkgaXMgbmV2ZXIgdXBkYXRlZCBhZ2FpbiBhcyBhIHJlc3VsdCBvZiB0aGUgYXR0cmlidXRlIGNoYW5naW5nLFxuICAgKiBhbmQgdmljZSB2ZXJzYS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnZlcnRlcj86IEF0dHJpYnV0ZUNvbnZlcnRlcjxUeXBlLCBUeXBlSGludD47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIHJlZmxlY3QgdG8gYW4gYXR0cmlidXRlLlxuICAgKiBJZiBgdHJ1ZWAsIHdoZW4gdGhlIHByb3BlcnR5IGlzIHNldCwgdGhlIGF0dHJpYnV0ZSBpcyBzZXQgdXNpbmcgdGhlXG4gICAqIGF0dHJpYnV0ZSBuYW1lIGRldGVybWluZWQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBmb3IgdGhlIGBhdHRyaWJ1dGVgXG4gICAqIHByb3BlcnR5IG9wdGlvbiBhbmQgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBjb252ZXJ0ZWQgdXNpbmcgdGhlIHJ1bGVzXG4gICAqIGZyb20gdGhlIGBjb252ZXJ0ZXJgIHByb3BlcnR5IG9wdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHJlZmxlY3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgaW5kaWNhdGVzIGlmIGEgcHJvcGVydHkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgY2hhbmdlZCB3aGVuXG4gICAqIGl0IGlzIHNldC4gVGhlIGZ1bmN0aW9uIHNob3VsZCB0YWtlIHRoZSBgbmV3VmFsdWVgIGFuZCBgb2xkVmFsdWVgIGFuZFxuICAgKiByZXR1cm4gYHRydWVgIGlmIGFuIHVwZGF0ZSBzaG91bGQgYmUgcmVxdWVzdGVkLlxuICAgKi9cbiAgaGFzQ2hhbmdlZD8odmFsdWU6IFR5cGUsIG9sZFZhbHVlOiBUeXBlKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYW4gYWNjZXNzb3Igd2lsbCBiZSBjcmVhdGVkIGZvciB0aGlzIHByb3BlcnR5LiBCeVxuICAgKiBkZWZhdWx0LCBhbiBhY2Nlc3NvciB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgdGhpcyBwcm9wZXJ0eSB0aGF0IHJlcXVlc3RzIGFuXG4gICAqIHVwZGF0ZSB3aGVuIHNldC4gSWYgdGhpcyBmbGFnIGlzIGB0cnVlYCwgbm8gYWNjZXNzb3Igd2lsbCBiZSBjcmVhdGVkLCBhbmRcbiAgICogaXQgd2lsbCBiZSB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGNhbGxcbiAgICogYHRoaXMucmVxdWVzdFVwZGF0ZShwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlKWAgdG8gcmVxdWVzdCBhbiB1cGRhdGUgd2hlblxuICAgKiB0aGUgcHJvcGVydHkgY2hhbmdlcy5cbiAgICovXG4gIHJlYWRvbmx5IG5vQWNjZXNzb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcHJvcGVydHkgaXMgd3JhcHBpbmcgYWNjZXNzb3JzLiBUaGlzIGlzIHNldCBieSBgQHByb3BlcnR5YFxuICAgKiB0byBjb250cm9sIHRoZSBpbml0aWFsIHZhbHVlIGNoYW5nZSBhbmQgcmVmbGVjdGlvbiBsb2dpYy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICB3cmFwcGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBNYXAgb2YgcHJvcGVydGllcyB0byBQcm9wZXJ0eURlY2xhcmF0aW9uIG9wdGlvbnMuIEZvciBlYWNoIHByb3BlcnR5IGFuXG4gKiBhY2Nlc3NvciBpcyBtYWRlLCBhbmQgdGhlIHByb3BlcnR5IGlzIHByb2Nlc3NlZCBhY2NvcmRpbmcgdG8gdGhlXG4gKiBQcm9wZXJ0eURlY2xhcmF0aW9uIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvcGVydHlEZWNsYXJhdGlvbnMge1xuICByZWFkb25seSBba2V5OiBzdHJpbmddOiBQcm9wZXJ0eURlY2xhcmF0aW9uO1xufVxuXG50eXBlIFByb3BlcnR5RGVjbGFyYXRpb25NYXAgPSBNYXA8UHJvcGVydHlLZXksIFByb3BlcnR5RGVjbGFyYXRpb24+O1xuXG50eXBlIEF0dHJpYnV0ZU1hcCA9IE1hcDxzdHJpbmcsIFByb3BlcnR5S2V5PjtcblxuLyoqXG4gKiBBIE1hcCBvZiBwcm9wZXJ0eSBrZXlzIHRvIHZhbHVlcy5cbiAqXG4gKiBUYWtlcyBhbiBvcHRpb25hbCB0eXBlIHBhcmFtZXRlciBULCB3aGljaCB3aGVuIHNwZWNpZmllZCBhcyBhIG5vbi1hbnksXG4gKiBub24tdW5rbm93biB0eXBlLCB3aWxsIG1ha2UgdGhlIE1hcCBtb3JlIHN0cm9uZ2x5LXR5cGVkLCBhc3NvY2lhdGluZyB0aGUgbWFwXG4gKiBrZXlzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZSB0eXBlIG9uIFQuXG4gKlxuICogVXNlIGBQcm9wZXJ0eVZhbHVlczx0aGlzPmAgd2hlbiBvdmVycmlkaW5nIFJlYWN0aXZlRWxlbWVudC51cGRhdGUoKSBhbmRcbiAqIG90aGVyIGxpZmVjeWNsZSBtZXRob2RzIGluIG9yZGVyIHRvIGdldCBzdHJvbmdlciB0eXBlLWNoZWNraW5nIG9uIGtleXNcbiAqIGFuZCB2YWx1ZXMuXG4gKi9cbi8vIFRoaXMgdHlwZSBpcyBjb25kaXRpb25hbCBzbyB0aGF0IGlmIHRoZSBwYXJhbWV0ZXIgVCBpcyBub3Qgc3BlY2lmaWVkLCBvclxuLy8gaXMgYGFueWAsIHRoZSB0eXBlIHdpbGwgaW5jbHVkZSBgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPmAuIFNpbmNlIFQgaXMgbm90XG4vLyBnaXZlbiBpbiB0aGUgdXNlcyBvZiBQcm9wZXJ0eVZhbHVlcyBpbiB0aGlzIGZpbGUsIGFsbCB1c2VzIGhlcmUgZmFsbGJhY2sgdG9cbi8vIG1lYW5pbmcgYE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj5gLCBidXQgaWYgYSBkZXZlbG9wZXIgdXNlc1xuLy8gYFByb3BlcnR5VmFsdWVzPHRoaXM+YCAob3IgYW55IG90aGVyIHZhbHVlIGZvciBUKSB0aGV5IHdpbGwgZ2V0IGFcbi8vIHN0cm9uZ2x5LXR5cGVkIE1hcCB0eXBlLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIFByb3BlcnR5VmFsdWVzPFQgPSBhbnk+ID0gVCBleHRlbmRzIG9iamVjdFxuICA/IFByb3BlcnR5VmFsdWVNYXA8VD5cbiAgOiBNYXA8UHJvcGVydHlLZXksIHVua25vd24+O1xuXG4vKipcbiAqIERvIG5vdCB1c2UsIGluc3RlYWQgcHJlZmVyIHtAbGlua2NvZGUgUHJvcGVydHlWYWx1ZXN9LlxuICovXG4vLyBUaGlzIHR5cGUgbXVzdCBiZSBleHBvcnRlZCBzdWNoIHRoYXQgSmF2YVNjcmlwdCBnZW5lcmF0ZWQgYnkgdGhlIEdvb2dsZVxuLy8gQ2xvc3VyZSBDb21waWxlciBjYW4gaW1wb3J0IGEgdHlwZSByZWZlcmVuY2UuXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnR5VmFsdWVNYXA8VD4gZXh0ZW5kcyBNYXA8UHJvcGVydHlLZXksIHVua25vd24+IHtcbiAgZ2V0PEsgZXh0ZW5kcyBrZXlvZiBUPihrOiBLKTogVFtLXSB8IHVuZGVmaW5lZDtcbiAgc2V0PEsgZXh0ZW5kcyBrZXlvZiBUPihrZXk6IEssIHZhbHVlOiBUW0tdKTogdGhpcztcbiAgaGFzPEsgZXh0ZW5kcyBrZXlvZiBUPihrOiBLKTogYm9vbGVhbjtcbiAgZGVsZXRlPEsgZXh0ZW5kcyBrZXlvZiBUPihrOiBLKTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb252ZXJ0ZXI6IENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXIgPSB7XG4gIHRvQXR0cmlidXRlKHZhbHVlOiB1bmtub3duLCB0eXBlPzogdW5rbm93bik6IHVua25vd24ge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBCb29sZWFuOlxuICAgICAgICB2YWx1ZSA9IHZhbHVlID8gZW1wdHlTdHJpbmdGb3JCb29sZWFuQXR0cmlidXRlIDogbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9iamVjdDpcbiAgICAgIGNhc2UgQXJyYXk6XG4gICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgcGFzcyB0aGlzIHRocm91Z2hcbiAgICAgICAgLy8gdG8gYWxsb3cgcmVtb3Zpbmcvbm8gY2hhbmdlIGJlaGF2aW9yLlxuICAgICAgICB2YWx1ZSA9IHZhbHVlID09IG51bGwgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxuICBmcm9tQXR0cmlidXRlKHZhbHVlOiBzdHJpbmcgfCBudWxsLCB0eXBlPzogdW5rbm93bikge1xuICAgIGxldCBmcm9tVmFsdWU6IHVua25vd24gPSB2YWx1ZTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgQm9vbGVhbjpcbiAgICAgICAgZnJvbVZhbHVlID0gdmFsdWUgIT09IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBOdW1iZXI6XG4gICAgICAgIGZyb21WYWx1ZSA9IHZhbHVlID09PSBudWxsID8gbnVsbCA6IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPYmplY3Q6XG4gICAgICBjYXNlIEFycmF5OlxuICAgICAgICAvLyBEbyAqbm90KiBnZW5lcmF0ZSBleGNlcHRpb24gd2hlbiBpbnZhbGlkIEpTT04gaXMgc2V0IGFzIGVsZW1lbnRzXG4gICAgICAgIC8vIGRvbid0IG5vcm1hbGx5IGNvbXBsYWluIG9uIGJlaW5nIG1pcy1jb25maWd1cmVkLlxuICAgICAgICAvLyBUT0RPKHNvcnZlbGwpOiBEbyBnZW5lcmF0ZSBleGNlcHRpb24gaW4gKmRldiBtb2RlKi5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBBc3NlcnQgdG8gYWRoZXJlIHRvIEJhemVsJ3MgXCJtdXN0IHR5cGUgYXNzZXJ0IEpTT04gcGFyc2VcIiBydWxlLlxuICAgICAgICAgIGZyb21WYWx1ZSA9IEpTT04ucGFyc2UodmFsdWUhKSBhcyB1bmtub3duO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZnJvbVZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGZyb21WYWx1ZTtcbiAgfSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFzQ2hhbmdlZCB7XG4gICh2YWx1ZTogdW5rbm93biwgb2xkOiB1bmtub3duKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDaGFuZ2UgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBkaWZmZXJlbnQgZnJvbSBgb2xkVmFsdWVgLlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBmb3IgYSBwcm9wZXJ0eSdzIGBoYXNDaGFuZ2VkYCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vdEVxdWFsOiBIYXNDaGFuZ2VkID0gKHZhbHVlOiB1bmtub3duLCBvbGQ6IHVua25vd24pOiBib29sZWFuID0+XG4gICFpcyh2YWx1ZSwgb2xkKTtcblxuY29uc3QgZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb246IFByb3BlcnR5RGVjbGFyYXRpb24gPSB7XG4gIGF0dHJpYnV0ZTogdHJ1ZSxcbiAgdHlwZTogU3RyaW5nLFxuICBjb252ZXJ0ZXI6IGRlZmF1bHRDb252ZXJ0ZXIsXG4gIHJlZmxlY3Q6IGZhbHNlLFxuICBoYXNDaGFuZ2VkOiBub3RFcXVhbCxcbn07XG5cbi8qKlxuICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGRldiBtb2RlIHdhcm5pbmcgY2F0ZWdvcmllcy5cbiAqL1xuZXhwb3J0IHR5cGUgV2FybmluZ0tpbmQgPVxuICB8ICdjaGFuZ2UtaW4tdXBkYXRlJ1xuICB8ICdtaWdyYXRpb24nXG4gIHwgJ2FzeW5jLXBlcmZvcm0tdXBkYXRlJztcblxuZXhwb3J0IHR5cGUgSW5pdGlhbGl6ZXIgPSAoZWxlbWVudDogUmVhY3RpdmVFbGVtZW50KSA9PiB2b2lkO1xuXG4vLyBUZW1wb3JhcnksIHVudGlsIGdvb2dsZTMgaXMgb24gVHlwZVNjcmlwdCA1LjJcbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFN5bWJvbENvbnN0cnVjdG9yIHtcbiAgICByZWFkb25seSBtZXRhZGF0YTogdW5pcXVlIHN5bWJvbDtcbiAgfVxufVxuXG4vLyBFbnN1cmUgbWV0YWRhdGEgaXMgZW5hYmxlZC4gVHlwZVNjcmlwdCBkb2VzIG5vdCBwb2x5ZmlsbFxuLy8gU3ltYm9sLm1ldGFkYXRhLCBzbyB3ZSBtdXN0IGVuc3VyZSB0aGF0IGl0IGV4aXN0cy5cbihTeW1ib2wgYXMge21ldGFkYXRhOiBzeW1ib2x9KS5tZXRhZGF0YSA/Pz0gU3ltYm9sKCdtZXRhZGF0YScpO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIC8vIFRoaXMgaXMgcHVibGljIGdsb2JhbCBBUEksIGRvIG5vdCBjaGFuZ2UhXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby12YXJcbiAgdmFyIGxpdFByb3BlcnR5TWV0YWRhdGE6IFdlYWtNYXA8XG4gICAgb2JqZWN0LFxuICAgIE1hcDxQcm9wZXJ0eUtleSwgUHJvcGVydHlEZWNsYXJhdGlvbj5cbiAgPjtcbn1cblxuLy8gTWFwIGZyb20gYSBjbGFzcydzIG1ldGFkYXRhIG9iamVjdCB0byBwcm9wZXJ0eSBvcHRpb25zXG4vLyBOb3RlIHRoYXQgd2UgbXVzdCB1c2UgbnVsbGlzaC1jb2FsZXNjaW5nIGFzc2lnbm1lbnQgc28gdGhhdCB3ZSBvbmx5IHVzZSBvbmVcbi8vIG1hcCBldmVuIGlmIHdlIGxvYWQgbXVsdGlwbGUgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZS5cbmdsb2JhbC5saXRQcm9wZXJ0eU1ldGFkYXRhID8/PSBuZXcgV2Vha01hcDxcbiAgb2JqZWN0LFxuICBNYXA8UHJvcGVydHlLZXksIFByb3BlcnR5RGVjbGFyYXRpb24+XG4+KCk7XG5cbi8qKlxuICogQmFzZSBlbGVtZW50IGNsYXNzIHdoaWNoIG1hbmFnZXMgZWxlbWVudCBwcm9wZXJ0aWVzIGFuZCBhdHRyaWJ1dGVzLiBXaGVuXG4gKiBwcm9wZXJ0aWVzIGNoYW5nZSwgdGhlIGB1cGRhdGVgIG1ldGhvZCBpcyBhc3luY2hyb25vdXNseSBjYWxsZWQuIFRoaXMgbWV0aG9kXG4gKiBzaG91bGQgYmUgc3VwcGxpZWQgYnkgc3ViY2xhc3NlcyB0byByZW5kZXIgdXBkYXRlcyBhcyBkZXNpcmVkLlxuICogQG5vSW5oZXJpdERvY1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVhY3RpdmVFbGVtZW50XG4gIC8vIEluIHRoZSBOb2RlIGJ1aWxkLCB0aGlzIGBleHRlbmRzYCBjbGF1c2Ugd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoXG4gIC8vIGAoZ2xvYmFsVGhpcy5IVE1MRWxlbWVudCA/PyBIVE1MRWxlbWVudClgLlxuICAvL1xuICAvLyBUaGlzIHdheSwgd2Ugd2lsbCBmaXJzdCBwcmVmZXIgYW55IGdsb2JhbCBgSFRNTEVsZW1lbnRgIHBvbHlmaWxsIHRoYXQgdGhlXG4gIC8vIHVzZXIgaGFzIGFzc2lnbmVkLCBhbmQgdGhlbiBmYWxsIGJhY2sgdG8gdGhlIGBIVE1MRWxlbWVudGAgc2hpbSB3aGljaCBoYXNcbiAgLy8gYmVlbiBpbXBvcnRlZCAoc2VlIG5vdGUgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUgYWJvdXQgaG93IHRoaXMgaW1wb3J0IGlzXG4gIC8vIGdlbmVyYXRlZCBieSBSb2xsdXApLiBOb3RlIHRoYXQgdGhlIGBIVE1MRWxlbWVudGAgdmFyaWFibGUgaGFzIGJlZW5cbiAgLy8gc2hhZG93ZWQgYnkgdGhpcyBpbXBvcnQsIHNvIGl0IG5vIGxvbmdlciByZWZlcnMgdG8gdGhlIGdsb2JhbC5cbiAgZXh0ZW5kcyBIVE1MRWxlbWVudFxuICBpbXBsZW1lbnRzIFJlYWN0aXZlQ29udHJvbGxlckhvc3RcbntcbiAgLy8gTm90ZTogdGhlc2UgYXJlIHBhdGNoZWQgaW4gb25seSBpbiBERVZfTU9ERS5cbiAgLyoqXG4gICAqIFJlYWQgb3Igc2V0IGFsbCB0aGUgZW5hYmxlZCB3YXJuaW5nIGNhdGVnb3JpZXMgZm9yIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgb25seSB1c2VkIGluIGRldmVsb3BtZW50IGJ1aWxkcy5cbiAgICpcbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IGRldi1tb2RlXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlZFdhcm5pbmdzPzogV2FybmluZ0tpbmRbXTtcblxuICAvKipcbiAgICogRW5hYmxlIHRoZSBnaXZlbiB3YXJuaW5nIGNhdGVnb3J5IGZvciB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBvbmx5IGV4aXN0cyBpbiBkZXZlbG9wbWVudCBidWlsZHMsIHNvIGl0IHNob3VsZCBiZSBhY2Nlc3NlZFxuICAgKiB3aXRoIGEgZ3VhcmQgbGlrZTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gRW5hYmxlIGZvciBhbGwgUmVhY3RpdmVFbGVtZW50IHN1YmNsYXNzZXNcbiAgICogUmVhY3RpdmVFbGVtZW50LmVuYWJsZVdhcm5pbmc/LignbWlncmF0aW9uJyk7XG4gICAqXG4gICAqIC8vIEVuYWJsZSBmb3Igb25seSBNeUVsZW1lbnQgYW5kIHN1YmNsYXNzZXNcbiAgICogTXlFbGVtZW50LmVuYWJsZVdhcm5pbmc/LignbWlncmF0aW9uJyk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgZGV2LW1vZGVcbiAgICovXG4gIHN0YXRpYyBlbmFibGVXYXJuaW5nPzogKHdhcm5pbmdLaW5kOiBXYXJuaW5nS2luZCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogRGlzYWJsZSB0aGUgZ2l2ZW4gd2FybmluZyBjYXRlZ29yeSBmb3IgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogVGhpcyBtZXRob2Qgb25seSBleGlzdHMgaW4gZGV2ZWxvcG1lbnQgYnVpbGRzLCBzbyBpdCBzaG91bGQgYmUgYWNjZXNzZWRcbiAgICogd2l0aCBhIGd1YXJkIGxpa2U6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIERpc2FibGUgZm9yIGFsbCBSZWFjdGl2ZUVsZW1lbnQgc3ViY2xhc3Nlc1xuICAgKiBSZWFjdGl2ZUVsZW1lbnQuZGlzYWJsZVdhcm5pbmc/LignbWlncmF0aW9uJyk7XG4gICAqXG4gICAqIC8vIERpc2FibGUgZm9yIG9ubHkgTXlFbGVtZW50IGFuZCBzdWJjbGFzc2VzXG4gICAqIE15RWxlbWVudC5kaXNhYmxlV2FybmluZz8uKCdtaWdyYXRpb24nKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSBkZXYtbW9kZVxuICAgKi9cbiAgc3RhdGljIGRpc2FibGVXYXJuaW5nPzogKHdhcm5pbmdLaW5kOiBXYXJuaW5nS2luZCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhbiBpbml0aWFsaXplciBmdW5jdGlvbiB0byB0aGUgY2xhc3MgdGhhdCBpcyBjYWxsZWQgZHVyaW5nIGluc3RhbmNlXG4gICAqIGNvbnN0cnVjdGlvbi5cbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgZm9yIGNvZGUgdGhhdCBydW5zIGFnYWluc3QgYSBgUmVhY3RpdmVFbGVtZW50YFxuICAgKiBzdWJjbGFzcywgc3VjaCBhcyBhIGRlY29yYXRvciwgdGhhdCBuZWVkcyB0byBkbyB3b3JrIGZvciBlYWNoXG4gICAqIGluc3RhbmNlLCBzdWNoIGFzIHNldHRpbmcgdXAgYSBgUmVhY3RpdmVDb250cm9sbGVyYC5cbiAgICpcbiAgICogYGBgdHNcbiAgICogY29uc3QgbXlEZWNvcmF0b3IgPSAodGFyZ2V0OiB0eXBlb2YgUmVhY3RpdmVFbGVtZW50LCBrZXk6IHN0cmluZykgPT4ge1xuICAgKiAgIHRhcmdldC5hZGRJbml0aWFsaXplcigoaW5zdGFuY2U6IFJlYWN0aXZlRWxlbWVudCkgPT4ge1xuICAgKiAgICAgLy8gVGhpcyBpcyBydW4gZHVyaW5nIGNvbnN0cnVjdGlvbiBvZiB0aGUgZWxlbWVudFxuICAgKiAgICAgbmV3IE15Q29udHJvbGxlcihpbnN0YW5jZSk7XG4gICAqICAgfSk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIERlY29yYXRpbmcgYSBmaWVsZCB3aWxsIHRoZW4gY2F1c2UgZWFjaCBpbnN0YW5jZSB0byBydW4gYW4gaW5pdGlhbGl6ZXJcbiAgICogdGhhdCBhZGRzIGEgY29udHJvbGxlcjpcbiAgICpcbiAgICogYGBgdHNcbiAgICogY2xhc3MgTXlFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gICAqICAgQG15RGVjb3JhdG9yIGZvbztcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogSW5pdGlhbGl6ZXJzIGFyZSBzdG9yZWQgcGVyLWNvbnN0cnVjdG9yLiBBZGRpbmcgYW4gaW5pdGlhbGl6ZXIgdG8gYVxuICAgKiBzdWJjbGFzcyBkb2VzIG5vdCBhZGQgaXQgdG8gYSBzdXBlcmNsYXNzLiBTaW5jZSBpbml0aWFsaXplcnMgYXJlIHJ1biBpblxuICAgKiBjb25zdHJ1Y3RvcnMsIGluaXRpYWxpemVycyB3aWxsIHJ1biBpbiBvcmRlciBvZiB0aGUgY2xhc3MgaGllcmFyY2h5LFxuICAgKiBzdGFydGluZyB3aXRoIHN1cGVyY2xhc3NlcyBhbmQgcHJvZ3Jlc3NpbmcgdG8gdGhlIGluc3RhbmNlJ3MgY2xhc3MuXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqL1xuICBzdGF0aWMgYWRkSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyKSB7XG4gICAgdGhpcy5fX3ByZXBhcmUoKTtcbiAgICAodGhpcy5faW5pdGlhbGl6ZXJzID8/PSBbXSkucHVzaChpbml0aWFsaXplcik7XG4gIH1cblxuICBzdGF0aWMgX2luaXRpYWxpemVycz86IEluaXRpYWxpemVyW107XG5cbiAgLypcbiAgICogRHVlIHRvIGNsb3N1cmUgY29tcGlsZXIgRVM2IGNvbXBpbGF0aW9uIGJ1Z3MsIEBub2NvbGxhcHNlIGlzIHJlcXVpcmVkIG9uXG4gICAqIGFsbCBzdGF0aWMgbWV0aG9kcyBhbmQgcHJvcGVydGllcyB3aXRoIGluaXRpYWxpemVycy4gIFJlZmVyZW5jZTpcbiAgICogLSBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvaXNzdWVzLzE3NzZcbiAgICovXG5cbiAgLyoqXG4gICAqIE1hcHMgYXR0cmlidXRlIG5hbWVzIHRvIHByb3BlcnRpZXM7IGZvciBleGFtcGxlIGBmb29iYXJgIGF0dHJpYnV0ZSB0b1xuICAgKiBgZm9vQmFyYCBwcm9wZXJ0eS4gQ3JlYXRlZCBsYXppbHkgb24gdXNlciBzdWJjbGFzc2VzIHdoZW4gZmluYWxpemluZyB0aGVcbiAgICogY2xhc3MuXG4gICAqIEBub2NvbGxhcHNlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXA6IEF0dHJpYnV0ZU1hcDtcblxuICAvKipcbiAgICogTWFya3MgY2xhc3MgYXMgaGF2aW5nIGJlZW4gZmluYWxpemVkLCB3aGljaCBpbmNsdWRlcyBjcmVhdGluZyBwcm9wZXJ0aWVzXG4gICAqIGZyb20gYHN0YXRpYyBwcm9wZXJ0aWVzYCwgYnV0IGRvZXMgKm5vdCogaW5jbHVkZSBhbGwgcHJvcGVydGllcyBjcmVhdGVkXG4gICAqIGZyb20gZGVjb3JhdG9ycy5cbiAgICogQG5vY29sbGFwc2VcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgZmluYWxpemVkOiB0cnVlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBNZW1vaXplZCBsaXN0IG9mIGFsbCBlbGVtZW50IHByb3BlcnRpZXMsIGluY2x1ZGluZyBhbnkgc3VwZXJjbGFzc1xuICAgKiBwcm9wZXJ0aWVzLiBDcmVhdGVkIGxhemlseSBvbiB1c2VyIHN1YmNsYXNzZXMgd2hlbiBmaW5hbGl6aW5nIHRoZSBjbGFzcy5cbiAgICpcbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IHByb3BlcnRpZXNcbiAgICovXG4gIHN0YXRpYyBlbGVtZW50UHJvcGVydGllczogUHJvcGVydHlEZWNsYXJhdGlvbk1hcDtcblxuICAvKipcbiAgICogVXNlci1zdXBwbGllZCBvYmplY3QgdGhhdCBtYXBzIHByb3BlcnR5IG5hbWVzIHRvIGBQcm9wZXJ0eURlY2xhcmF0aW9uYFxuICAgKiBvYmplY3RzIGNvbnRhaW5pbmcgb3B0aW9ucyBmb3IgY29uZmlndXJpbmcgcmVhY3RpdmUgcHJvcGVydGllcy4gV2hlblxuICAgKiBhIHJlYWN0aXZlIHByb3BlcnR5IGlzIHNldCB0aGUgZWxlbWVudCB3aWxsIHVwZGF0ZSBhbmQgcmVuZGVyLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0IHByb3BlcnRpZXMgYXJlIHB1YmxpYyBmaWVsZHMsIGFuZCBhcyBzdWNoLCB0aGV5IHNob3VsZCBiZVxuICAgKiBjb25zaWRlcmVkIGFzIHByaW1hcmlseSBzZXR0YWJsZSBieSBlbGVtZW50IHVzZXJzLCBlaXRoZXIgdmlhIGF0dHJpYnV0ZSBvclxuICAgKiB0aGUgcHJvcGVydHkgaXRzZWxmLlxuICAgKlxuICAgKiBHZW5lcmFsbHksIHByb3BlcnRpZXMgdGhhdCBhcmUgY2hhbmdlZCBieSB0aGUgZWxlbWVudCBzaG91bGQgYmUgcHJpdmF0ZSBvclxuICAgKiBwcm90ZWN0ZWQgZmllbGRzIGFuZCBzaG91bGQgdXNlIHRoZSBgc3RhdGU6IHRydWVgIG9wdGlvbi4gUHJvcGVydGllc1xuICAgKiBtYXJrZWQgYXMgYHN0YXRlYCBkbyBub3QgcmVmbGVjdCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZVxuICAgKlxuICAgKiBIb3dldmVyLCBzb21ldGltZXMgZWxlbWVudCBjb2RlIGRvZXMgbmVlZCB0byBzZXQgYSBwdWJsaWMgcHJvcGVydHkuIFRoaXNcbiAgICogc2hvdWxkIHR5cGljYWxseSBvbmx5IGJlIGRvbmUgaW4gcmVzcG9uc2UgdG8gdXNlciBpbnRlcmFjdGlvbiwgYW5kIGFuIGV2ZW50XG4gICAqIHNob3VsZCBiZSBmaXJlZCBpbmZvcm1pbmcgdGhlIHVzZXI7IGZvciBleGFtcGxlLCBhIGNoZWNrYm94IHNldHMgaXRzXG4gICAqIGBjaGVja2VkYCBwcm9wZXJ0eSB3aGVuIGNsaWNrZWQgYW5kIGZpcmVzIGEgYGNoYW5nZWRgIGV2ZW50LiBNdXRhdGluZ1xuICAgKiBwdWJsaWMgcHJvcGVydGllcyBzaG91bGQgdHlwaWNhbGx5IG5vdCBiZSBkb25lIGZvciBub24tcHJpbWl0aXZlIChvYmplY3Qgb3JcbiAgICogYXJyYXkpIHByb3BlcnRpZXMuIEluIG90aGVyIGNhc2VzIHdoZW4gYW4gZWxlbWVudCBuZWVkcyB0byBtYW5hZ2Ugc3RhdGUsIGFcbiAgICogcHJpdmF0ZSBwcm9wZXJ0eSBzZXQgd2l0aCB0aGUgYHN0YXRlOiB0cnVlYCBvcHRpb24gc2hvdWxkIGJlIHVzZWQuIFdoZW5cbiAgICogbmVlZGVkLCBzdGF0ZSBwcm9wZXJ0aWVzIGNhbiBiZSBpbml0aWFsaXplZCB2aWEgcHVibGljIHByb3BlcnRpZXMgdG9cbiAgICogZmFjaWxpdGF0ZSBjb21wbGV4IGludGVyYWN0aW9ucy5cbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IHByb3BlcnRpZXNcbiAgICovXG4gIHN0YXRpYyBwcm9wZXJ0aWVzOiBQcm9wZXJ0eURlY2xhcmF0aW9ucztcblxuICAvKipcbiAgICogTWVtb2l6ZWQgbGlzdCBvZiBhbGwgZWxlbWVudCBzdHlsZXMuXG4gICAqIENyZWF0ZWQgbGF6aWx5IG9uIHVzZXIgc3ViY2xhc3NlcyB3aGVuIGZpbmFsaXppbmcgdGhlIGNsYXNzLlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgc3R5bGVzXG4gICAqL1xuICBzdGF0aWMgZWxlbWVudFN0eWxlczogQXJyYXk8Q1NTUmVzdWx0T3JOYXRpdmU+ID0gW107XG5cbiAgLyoqXG4gICAqIEFycmF5IG9mIHN0eWxlcyB0byBhcHBseSB0byB0aGUgZWxlbWVudC4gVGhlIHN0eWxlcyBzaG91bGQgYmUgZGVmaW5lZFxuICAgKiB1c2luZyB0aGUge0BsaW5rY29kZSBjc3N9IHRhZyBmdW5jdGlvbiwgdmlhIGNvbnN0cnVjdGlibGUgc3R5bGVzaGVldHMsIG9yXG4gICAqIGltcG9ydGVkIGZyb20gbmF0aXZlIENTUyBtb2R1bGUgc2NyaXB0cy5cbiAgICpcbiAgICogTm90ZSBvbiBDb250ZW50IFNlY3VyaXR5IFBvbGljeTpcbiAgICpcbiAgICogRWxlbWVudCBzdHlsZXMgYXJlIGltcGxlbWVudGVkIHdpdGggYDxzdHlsZT5gIHRhZ3Mgd2hlbiB0aGUgYnJvd3NlciBkb2Vzbid0XG4gICAqIHN1cHBvcnQgYWRvcHRlZCBTdHlsZVNoZWV0cy4gVG8gdXNlIHN1Y2ggYDxzdHlsZT5gIHRhZ3Mgd2l0aCB0aGUgc3R5bGUtc3JjXG4gICAqIENTUCBkaXJlY3RpdmUsIHRoZSBzdHlsZS1zcmMgdmFsdWUgbXVzdCBlaXRoZXIgaW5jbHVkZSAndW5zYWZlLWlubGluZScgb3JcbiAgICogYG5vbmNlLTxiYXNlNjQtdmFsdWU+YCB3aXRoIGA8YmFzZTY0LXZhbHVlPmAgcmVwbGFjZWQgYmUgYSBzZXJ2ZXItZ2VuZXJhdGVkXG4gICAqIG5vbmNlLlxuICAgKlxuICAgKiBUbyBwcm92aWRlIGEgbm9uY2UgdG8gdXNlIG9uIGdlbmVyYXRlZCBgPHN0eWxlPmAgZWxlbWVudHMsIHNldFxuICAgKiBgd2luZG93LmxpdE5vbmNlYCB0byBhIHNlcnZlci1nZW5lcmF0ZWQgbm9uY2UgaW4geW91ciBwYWdlJ3MgSFRNTCwgYmVmb3JlXG4gICAqIGxvYWRpbmcgYXBwbGljYXRpb24gY29kZTpcbiAgICpcbiAgICogYGBgaHRtbFxuICAgKiA8c2NyaXB0PlxuICAgKiAgIC8vIEdlbmVyYXRlZCBhbmQgdW5pcXVlIHBlciByZXF1ZXN0OlxuICAgKiAgIHdpbmRvdy5saXROb25jZSA9ICdhMWIyYzNkNCc7XG4gICAqIDwvc2NyaXB0PlxuICAgKiBgYGBcbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IHN0eWxlc1xuICAgKi9cbiAgc3RhdGljIHN0eWxlcz86IENTU1Jlc3VsdEdyb3VwO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhdHRyaWJ1dGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZ2lzdGVyZWQgcHJvcGVydGllcy5cbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IGF0dHJpYnV0ZXNcbiAgICovXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIC8vIEVuc3VyZSB3ZSd2ZSBjcmVhdGVkIGFsbCBwcm9wZXJ0aWVzXG4gICAgdGhpcy5maW5hbGl6ZSgpO1xuICAgIC8vIHRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwIGlzIG9ubHkgdW5kZWZpbmVkIGFmdGVyIGZpbmFsaXplKCkgaW5cbiAgICAvLyBSZWFjdGl2ZUVsZW1lbnQgaXRzZWxmLiBSZWFjdGl2ZUVsZW1lbnQub2JzZXJ2ZWRBdHRyaWJ1dGVzIGlzIG9ubHlcbiAgICAvLyBhY2Nlc3NlZCB3aXRoIFJlYWN0aXZlRWxlbWVudCBhcyB0aGUgcmVjZWl2ZXIgd2hlbiBhIHN1YmNsYXNzIG9yIG1peGluXG4gICAgLy8gY2FsbHMgc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwICYmIFsuLi50aGlzLl9fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcC5rZXlzKCldXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX19pbnN0YW5jZVByb3BlcnRpZXM/OiBQcm9wZXJ0eVZhbHVlcyA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHByb3BlcnR5IGFjY2Vzc29yIG9uIHRoZSBlbGVtZW50IHByb3RvdHlwZSBpZiBvbmUgZG9lcyBub3QgZXhpc3RcbiAgICogYW5kIHN0b3JlcyBhIHtAbGlua2NvZGUgUHJvcGVydHlEZWNsYXJhdGlvbn0gZm9yIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZVxuICAgKiBnaXZlbiBvcHRpb25zLiBUaGUgcHJvcGVydHkgc2V0dGVyIGNhbGxzIHRoZSBwcm9wZXJ0eSdzIGBoYXNDaGFuZ2VkYFxuICAgKiBwcm9wZXJ0eSBvcHRpb24gb3IgdXNlcyBhIHN0cmljdCBpZGVudGl0eSBjaGVjayB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3RcbiAgICogdG8gcmVxdWVzdCBhbiB1cGRhdGUuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIG1heSBiZSBvdmVycmlkZGVuIHRvIGN1c3RvbWl6ZSBwcm9wZXJ0aWVzOyBob3dldmVyLFxuICAgKiB3aGVuIGRvaW5nIHNvLCBpdCdzIGltcG9ydGFudCB0byBjYWxsIGBzdXBlci5jcmVhdGVQcm9wZXJ0eWAgdG8gZW5zdXJlXG4gICAqIHRoZSBwcm9wZXJ0eSBpcyBzZXR1cCBjb3JyZWN0bHkuIFRoaXMgbWV0aG9kIGNhbGxzXG4gICAqIGBnZXRQcm9wZXJ0eURlc2NyaXB0b3JgIGludGVybmFsbHkgdG8gZ2V0IGEgZGVzY3JpcHRvciB0byBpbnN0YWxsLlxuICAgKiBUbyBjdXN0b21pemUgd2hhdCBwcm9wZXJ0aWVzIGRvIHdoZW4gdGhleSBhcmUgZ2V0IG9yIHNldCwgb3ZlcnJpZGVcbiAgICogYGdldFByb3BlcnR5RGVzY3JpcHRvcmAuIFRvIGN1c3RvbWl6ZSB0aGUgb3B0aW9ucyBmb3IgYSBwcm9wZXJ0eSxcbiAgICogaW1wbGVtZW50IGBjcmVhdGVQcm9wZXJ0eWAgbGlrZSB0aGlzOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBzdGF0aWMgY3JlYXRlUHJvcGVydHkobmFtZSwgb3B0aW9ucykge1xuICAgKiAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKG9wdGlvbnMsIHtteU9wdGlvbjogdHJ1ZX0pO1xuICAgKiAgIHN1cGVyLmNyZWF0ZVByb3BlcnR5KG5hbWUsIG9wdGlvbnMpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgcHJvcGVydGllc1xuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVByb3BlcnR5KFxuICAgIG5hbWU6IFByb3BlcnR5S2V5LFxuICAgIG9wdGlvbnM6IFByb3BlcnR5RGVjbGFyYXRpb24gPSBkZWZhdWx0UHJvcGVydHlEZWNsYXJhdGlvblxuICApIHtcbiAgICAvLyBJZiB0aGlzIGlzIGEgc3RhdGUgcHJvcGVydHksIGZvcmNlIHRoZSBhdHRyaWJ1dGUgdG8gZmFsc2UuXG4gICAgaWYgKG9wdGlvbnMuc3RhdGUpIHtcbiAgICAgIChvcHRpb25zIGFzIE11dGFibGU8UHJvcGVydHlEZWNsYXJhdGlvbiwgJ2F0dHJpYnV0ZSc+KS5hdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5fX3ByZXBhcmUoKTtcbiAgICB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzLnNldChuYW1lLCBvcHRpb25zKTtcbiAgICBpZiAoIW9wdGlvbnMubm9BY2Nlc3Nvcikge1xuICAgICAgY29uc3Qga2V5ID0gREVWX01PREVcbiAgICAgICAgPyAvLyBVc2UgU3ltYm9sLmZvciBpbiBkZXYgbW9kZSB0byBtYWtlIGl0IGVhc2llciB0byBtYWludGFpbiBzdGF0ZVxuICAgICAgICAgIC8vIHdoZW4gZG9pbmcgSE1SLlxuICAgICAgICAgIFN5bWJvbC5mb3IoYCR7U3RyaW5nKG5hbWUpfSAoQHByb3BlcnR5KCkgY2FjaGUpYClcbiAgICAgICAgOiBTeW1ib2woKTtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLmdldFByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBrZXksIG9wdGlvbnMpO1xuICAgICAgaWYgKGRlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZGVzY3JpcHRvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIGJlIGRlZmluZWQgb24gdGhlIGdpdmVuIG5hbWVkIHByb3BlcnR5LlxuICAgKiBJZiBubyBkZXNjcmlwdG9yIGlzIHJldHVybmVkLCB0aGUgcHJvcGVydHkgd2lsbCBub3QgYmVjb21lIGFuIGFjY2Vzc29yLlxuICAgKiBGb3IgZXhhbXBsZSxcbiAgICpcbiAgICogYGBgdHNcbiAgICogY2xhc3MgTXlFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gICAqICAgc3RhdGljIGdldFByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBrZXksIG9wdGlvbnMpIHtcbiAgICogICAgIGNvbnN0IGRlZmF1bHREZXNjcmlwdG9yID1cbiAgICogICAgICAgICBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwga2V5LCBvcHRpb25zKTtcbiAgICogICAgIGNvbnN0IHNldHRlciA9IGRlZmF1bHREZXNjcmlwdG9yLnNldDtcbiAgICogICAgIHJldHVybiB7XG4gICAqICAgICAgIGdldDogZGVmYXVsdERlc2NyaXB0b3IuZ2V0LFxuICAgKiAgICAgICBzZXQodmFsdWUpIHtcbiAgICogICAgICAgICBzZXR0ZXIuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAqICAgICAgICAgLy8gY3VzdG9tIGFjdGlvbi5cbiAgICogICAgICAgfSxcbiAgICogICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgKiAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgcHJvcGVydGllc1xuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgbmFtZTogUHJvcGVydHlLZXksXG4gICAga2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgb3B0aW9uczogUHJvcGVydHlEZWNsYXJhdGlvblxuICApOiBQcm9wZXJ0eURlc2NyaXB0b3IgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHtnZXQsIHNldH0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcy5wcm90b3R5cGUsIG5hbWUpID8/IHtcbiAgICAgIGdldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNba2V5IGFzIGtleW9mIHR5cGVvZiB0aGlzXTtcbiAgICAgIH0sXG4gICAgICBzZXQodGhpczogUmVhY3RpdmVFbGVtZW50LCB2OiB1bmtub3duKSB7XG4gICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4pW2tleV0gPSB2O1xuICAgICAgfSxcbiAgICB9O1xuICAgIGlmIChERVZfTU9ERSAmJiBnZXQgPT0gbnVsbCkge1xuICAgICAgaWYgKCd2YWx1ZScgaW4gKGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLnByb3RvdHlwZSwgbmFtZSkgPz8ge30pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmllbGQgJHtKU09OLnN0cmluZ2lmeShTdHJpbmcobmFtZSkpfSBvbiBgICtcbiAgICAgICAgICAgIGAke3RoaXMubmFtZX0gd2FzIGRlY2xhcmVkIGFzIGEgcmVhY3RpdmUgcHJvcGVydHkgYCArXG4gICAgICAgICAgICBgYnV0IGl0J3MgYWN0dWFsbHkgZGVjbGFyZWQgYXMgYSB2YWx1ZSBvbiB0aGUgcHJvdG90eXBlLiBgICtcbiAgICAgICAgICAgIGBVc3VhbGx5IHRoaXMgaXMgZHVlIHRvIHVzaW5nIEBwcm9wZXJ0eSBvciBAc3RhdGUgb24gYSBtZXRob2QuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaXNzdWVXYXJuaW5nKFxuICAgICAgICAncmVhY3RpdmUtcHJvcGVydHktd2l0aG91dC1nZXR0ZXInLFxuICAgICAgICBgRmllbGQgJHtKU09OLnN0cmluZ2lmeShTdHJpbmcobmFtZSkpfSBvbiBgICtcbiAgICAgICAgICBgJHt0aGlzLm5hbWV9IHdhcyBkZWNsYXJlZCBhcyBhIHJlYWN0aXZlIHByb3BlcnR5IGAgK1xuICAgICAgICAgIGBidXQgaXQgZG9lcyBub3QgaGF2ZSBhIGdldHRlci4gVGhpcyB3aWxsIGJlIGFuIGVycm9yIGluIGEgYCArXG4gICAgICAgICAgYGZ1dHVyZSB2ZXJzaW9uIG9mIExpdC5gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZ2V0KHRoaXM6IFJlYWN0aXZlRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZ2V0Py5jYWxsKHRoaXMpO1xuICAgICAgfSxcbiAgICAgIHNldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gZ2V0Py5jYWxsKHRoaXMpO1xuICAgICAgICBzZXQhLmNhbGwodGhpcywgdmFsdWUpO1xuICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgfSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBvcHRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAqIFRoZXNlIG9wdGlvbnMgYXJlIGRlZmluZWQgd2l0aCBhIGBQcm9wZXJ0eURlY2xhcmF0aW9uYCB2aWEgdGhlIGBwcm9wZXJ0aWVzYFxuICAgKiBvYmplY3Qgb3IgdGhlIGBAcHJvcGVydHlgIGRlY29yYXRvciBhbmQgYXJlIHJlZ2lzdGVyZWQgaW5cbiAgICogYGNyZWF0ZVByb3BlcnR5KC4uLilgLlxuICAgKlxuICAgKiBOb3RlLCB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY29uc2lkZXJlZCBcImZpbmFsXCIgYW5kIG5vdCBvdmVycmlkZGVuLiBUb1xuICAgKiBjdXN0b21pemUgdGhlIG9wdGlvbnMgZm9yIGEgZ2l2ZW4gcHJvcGVydHksIG92ZXJyaWRlXG4gICAqIHtAbGlua2NvZGUgY3JlYXRlUHJvcGVydHl9LlxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAZmluYWxcbiAgICogQGNhdGVnb3J5IHByb3BlcnRpZXNcbiAgICovXG4gIHN0YXRpYyBnZXRQcm9wZXJ0eU9wdGlvbnMobmFtZTogUHJvcGVydHlLZXkpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UHJvcGVydGllcy5nZXQobmFtZSkgPz8gZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb247XG4gIH1cblxuICAvLyBUZW1wb3JhcnksIHVudGlsIGdvb2dsZTMgaXMgb24gVHlwZVNjcmlwdCA1LjJcbiAgZGVjbGFyZSBzdGF0aWMgW1N5bWJvbC5tZXRhZGF0YV06IG9iamVjdCAmIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHN0YXRpYyBvd24gcHJvcGVydGllcyBvZiB0aGUgY2xhc3MgdXNlZCBpbiBib29ra2VlcGluZ1xuICAgKiBmb3IgZWxlbWVudCBwcm9wZXJ0aWVzLCBpbml0aWFsaXplcnMsIGV0Yy5cbiAgICpcbiAgICogQ2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBieSBjb2RlIHRoYXQgbmVlZHMgdG8gZW5zdXJlIHRoZXNlXG4gICAqIHByb3BlcnRpZXMgZXhpc3QgYmVmb3JlIHVzaW5nIHRoZW0uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhlIHN1cGVyY2xhc3MgaXMgZmluYWxpemVkIHNvIHRoYXQgaW5oZXJpdGVkXG4gICAqIHByb3BlcnR5IG1ldGFkYXRhIGNhbiBiZSBjb3BpZWQgZG93bi5cbiAgICogQG5vY29sbGFwc2VcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9fcHJlcGFyZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2VsZW1lbnRQcm9wZXJ0aWVzJywgdGhpcykpXG4gICAgKSB7XG4gICAgICAvLyBBbHJlYWR5IHByZXBhcmVkXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZpbmFsaXplIGFueSBzdXBlcmNsYXNzZXNcbiAgICBjb25zdCBzdXBlckN0b3IgPSBnZXRQcm90b3R5cGVPZih0aGlzKSBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50O1xuICAgIHN1cGVyQ3Rvci5maW5hbGl6ZSgpO1xuXG4gICAgLy8gQ3JlYXRlIG93biBzZXQgb2YgaW5pdGlhbGl6ZXJzIGZvciB0aGlzIGNsYXNzIGlmIGFueSBleGlzdCBvbiB0aGVcbiAgICAvLyBzdXBlcmNsYXNzIGFuZCBjb3B5IHRoZW0gZG93bi4gTm90ZSwgZm9yIGEgc21hbGwgcGVyZiBib29zdCwgYXZvaWRcbiAgICAvLyBjcmVhdGluZyBpbml0aWFsaXplcnMgdW5sZXNzIG5lZWRlZC5cbiAgICBpZiAoc3VwZXJDdG9yLl9pbml0aWFsaXplcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZXJzID0gWy4uLnN1cGVyQ3Rvci5faW5pdGlhbGl6ZXJzXTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbGl6ZSBlbGVtZW50UHJvcGVydGllcyBmcm9tIHRoZSBzdXBlcmNsYXNzXG4gICAgdGhpcy5lbGVtZW50UHJvcGVydGllcyA9IG5ldyBNYXAoc3VwZXJDdG9yLmVsZW1lbnRQcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5pc2hlcyBzZXR0aW5nIHVwIHRoZSBjbGFzcyBzbyB0aGF0IGl0J3MgcmVhZHkgdG8gYmUgcmVnaXN0ZXJlZFxuICAgKiBhcyBhIGN1c3RvbSBlbGVtZW50IGFuZCBpbnN0YW50aWF0ZWQuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgUmVhY3RpdmVFbGVtZW50Lm9ic2VydmVkQXR0cmlidXRlcyBnZXR0ZXIuXG4gICAqIElmIHlvdSBvdmVycmlkZSB0aGUgb2JzZXJ2ZWRBdHRyaWJ1dGVzIGdldHRlciwgeW91IG11c3QgZWl0aGVyIGNhbGxcbiAgICogc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzIHRvIHRyaWdnZXIgZmluYWxpemF0aW9uLCBvciBjYWxsIGZpbmFsaXplKClcbiAgICogeW91cnNlbGYuXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsaXplKCkge1xuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2ZpbmFsaXplZCcsIHRoaXMpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZpbmFsaXplZCA9IHRydWU7XG4gICAgdGhpcy5fX3ByZXBhcmUoKTtcblxuICAgIC8vIENyZWF0ZSBwcm9wZXJ0aWVzIGZyb20gdGhlIHN0YXRpYyBwcm9wZXJ0aWVzIGJsb2NrOlxuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ3Byb3BlcnRpZXMnLCB0aGlzKSkpIHtcbiAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgY29uc3QgcHJvcEtleXMgPSBbXG4gICAgICAgIC4uLmdldE93blByb3BlcnR5TmFtZXMocHJvcHMpLFxuICAgICAgICAuLi5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocHJvcHMpLFxuICAgICAgXSBhcyBBcnJheTxrZXlvZiB0eXBlb2YgcHJvcHM+O1xuICAgICAgZm9yIChjb25zdCBwIG9mIHByb3BLZXlzKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlUHJvcGVydHkocCwgcHJvcHNbcF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBwcm9wZXJ0aWVzIGZyb20gc3RhbmRhcmQgZGVjb3JhdG9yIG1ldGFkYXRhOlxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpc1tTeW1ib2wubWV0YWRhdGFdO1xuICAgIGlmIChtZXRhZGF0YSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IGxpdFByb3BlcnR5TWV0YWRhdGEuZ2V0KG1ldGFkYXRhKTtcbiAgICAgIGlmIChwcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBbcCwgb3B0aW9uc10gb2YgcHJvcGVydGllcykge1xuICAgICAgICAgIHRoaXMuZWxlbWVudFByb3BlcnRpZXMuc2V0KHAsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBhdHRyaWJ1dGUtdG8tcHJvcGVydHkgbWFwXG4gICAgdGhpcy5fX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChjb25zdCBbcCwgb3B0aW9uc10gb2YgdGhpcy5lbGVtZW50UHJvcGVydGllcykge1xuICAgICAgY29uc3QgYXR0ciA9IHRoaXMuX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocCwgb3B0aW9ucyk7XG4gICAgICBpZiAoYXR0ciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwLnNldChhdHRyLCBwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnRTdHlsZXMgPSB0aGlzLmZpbmFsaXplU3R5bGVzKHRoaXMuc3R5bGVzKTtcblxuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoJ2NyZWF0ZVByb3BlcnR5JykpIHtcbiAgICAgICAgaXNzdWVXYXJuaW5nKFxuICAgICAgICAgICduby1vdmVycmlkZS1jcmVhdGUtcHJvcGVydHknLFxuICAgICAgICAgICdPdmVycmlkaW5nIFJlYWN0aXZlRWxlbWVudC5jcmVhdGVQcm9wZXJ0eSgpIGlzIGRlcHJlY2F0ZWQuICcgK1xuICAgICAgICAgICAgJ1RoZSBvdmVycmlkZSB3aWxsIG5vdCBiZSBjYWxsZWQgd2l0aCBzdGFuZGFyZCBkZWNvcmF0b3JzJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoJ2dldFByb3BlcnR5RGVzY3JpcHRvcicpKSB7XG4gICAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgICAnbm8tb3ZlcnJpZGUtZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3InLFxuICAgICAgICAgICdPdmVycmlkaW5nIFJlYWN0aXZlRWxlbWVudC5nZXRQcm9wZXJ0eURlc2NyaXB0b3IoKSBpcyBkZXByZWNhdGVkLiAnICtcbiAgICAgICAgICAgICdUaGUgb3ZlcnJpZGUgd2lsbCBub3QgYmUgY2FsbGVkIHdpdGggc3RhbmRhcmQgZGVjb3JhdG9ycydcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3B0aW9ucyB1c2VkIHdoZW4gY2FsbGluZyBgYXR0YWNoU2hhZG93YC4gU2V0IHRoaXMgcHJvcGVydHkgdG8gY3VzdG9taXplXG4gICAqIHRoZSBvcHRpb25zIGZvciB0aGUgc2hhZG93Um9vdDsgZm9yIGV4YW1wbGUsIHRvIGNyZWF0ZSBhIGNsb3NlZFxuICAgKiBzaGFkb3dSb290OiBge21vZGU6ICdjbG9zZWQnfWAuXG4gICAqXG4gICAqIE5vdGUsIHRoZXNlIG9wdGlvbnMgYXJlIHVzZWQgaW4gYGNyZWF0ZVJlbmRlclJvb3RgLiBJZiB0aGlzIG1ldGhvZFxuICAgKiBpcyBjdXN0b21pemVkLCBvcHRpb25zIHNob3VsZCBiZSByZXNwZWN0ZWQgaWYgcG9zc2libGUuXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHN0YXRpYyBzaGFkb3dSb290T3B0aW9uczogU2hhZG93Um9vdEluaXQgPSB7bW9kZTogJ29wZW4nfTtcblxuICAvKipcbiAgICogVGFrZXMgdGhlIHN0eWxlcyB0aGUgdXNlciBzdXBwbGllZCB2aWEgdGhlIGBzdGF0aWMgc3R5bGVzYCBwcm9wZXJ0eSBhbmRcbiAgICogcmV0dXJucyB0aGUgYXJyYXkgb2Ygc3R5bGVzIHRvIGFwcGx5IHRvIHRoZSBlbGVtZW50LlxuICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbnRlZ3JhdGUgaW50byBhIHN0eWxlIG1hbmFnZW1lbnQgc3lzdGVtLlxuICAgKlxuICAgKiBTdHlsZXMgYXJlIGRlZHVwbGljYXRlZCBwcmVzZXJ2aW5nIHRoZSBfbGFzdF8gaW5zdGFuY2UgaW4gdGhlIGxpc3QuIFRoaXNcbiAgICogaXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdG8gYXZvaWQgZHVwbGljYXRlZCBzdHlsZXMgdGhhdCBjYW4gb2NjdXJcbiAgICogZXNwZWNpYWxseSB3aGVuIGNvbXBvc2luZyB2aWEgc3ViY2xhc3NpbmcuIFRoZSBsYXN0IGl0ZW0gaXMga2VwdCB0byB0cnlcbiAgICogdG8gcHJlc2VydmUgdGhlIGNhc2NhZGUgb3JkZXIgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0J3MgbW9zdCBpbXBvcnRhbnRcbiAgICogdGhhdCBsYXN0IGFkZGVkIHN0eWxlcyBvdmVycmlkZSBwcmV2aW91cyBzdHlsZXMuXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSBzdHlsZXNcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgZmluYWxpemVTdHlsZXMoXG4gICAgc3R5bGVzPzogQ1NTUmVzdWx0R3JvdXBcbiAgKTogQXJyYXk8Q1NTUmVzdWx0T3JOYXRpdmU+IHtcbiAgICBjb25zdCBlbGVtZW50U3R5bGVzID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGVzKSkge1xuICAgICAgLy8gRGVkdXBlIHRoZSBmbGF0dGVuZWQgYXJyYXkgaW4gcmV2ZXJzZSBvcmRlciB0byBwcmVzZXJ2ZSB0aGUgbGFzdCBpdGVtcy5cbiAgICAgIC8vIENhc3RpbmcgdG8gQXJyYXk8dW5rbm93bj4gd29ya3MgYXJvdW5kIFRTIGVycm9yIHRoYXRcbiAgICAgIC8vIGFwcGVhcnMgdG8gY29tZSBmcm9tIHRyeWluZyB0byBmbGF0dGVuIGEgdHlwZSBDU1NSZXN1bHRBcnJheS5cbiAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoKHN0eWxlcyBhcyBBcnJheTx1bmtub3duPikuZmxhdChJbmZpbml0eSkucmV2ZXJzZSgpKTtcbiAgICAgIC8vIFRoZW4gcHJlc2VydmUgb3JpZ2luYWwgb3JkZXIgYnkgYWRkaW5nIHRoZSBzZXQgaXRlbXMgaW4gcmV2ZXJzZSBvcmRlci5cbiAgICAgIGZvciAoY29uc3QgcyBvZiBzZXQpIHtcbiAgICAgICAgZWxlbWVudFN0eWxlcy51bnNoaWZ0KGdldENvbXBhdGlibGVTdHlsZShzIGFzIENTU1Jlc3VsdE9yTmF0aXZlKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdHlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZWxlbWVudFN0eWxlcy5wdXNoKGdldENvbXBhdGlibGVTdHlsZShzdHlsZXMpKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRTdHlsZXM7XG4gIH1cblxuICAvKipcbiAgICogTm9kZSBvciBTaGFkb3dSb290IGludG8gd2hpY2ggZWxlbWVudCBET00gc2hvdWxkIGJlIHJlbmRlcmVkLiBEZWZhdWx0c1xuICAgKiB0byBhbiBvcGVuIHNoYWRvd1Jvb3QuXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IHJlbmRlclJvb3QhOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUgYG5hbWVgLlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkoXG4gICAgbmFtZTogUHJvcGVydHlLZXksXG4gICAgb3B0aW9uczogUHJvcGVydHlEZWNsYXJhdGlvblxuICApIHtcbiAgICBjb25zdCBhdHRyaWJ1dGUgPSBvcHRpb25zLmF0dHJpYnV0ZTtcbiAgICByZXR1cm4gYXR0cmlidXRlID09PSBmYWxzZVxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogdHlwZW9mIGF0dHJpYnV0ZSA9PT0gJ3N0cmluZydcbiAgICAgID8gYXR0cmlidXRlXG4gICAgICA6IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJ1xuICAgICAgPyBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSB0byBhbiB1bnJlc29sdmVkIFByb21pc2Ugc28gd2UgY2FuIG1ha2Ugc3VyZSB0aGUgZWxlbWVudCBoYXNcbiAgLy8gY29ubmVjdGVkIGJlZm9yZSBmaXJzdCB1cGRhdGUuXG4gIHByaXZhdGUgX191cGRhdGVQcm9taXNlITogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogVHJ1ZSBpZiB0aGVyZSBpcyBhIHBlbmRpbmcgdXBkYXRlIGFzIGEgcmVzdWx0IG9mIGNhbGxpbmcgYHJlcXVlc3RVcGRhdGUoKWAuXG4gICAqIFNob3VsZCBvbmx5IGJlIHJlYWQuXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBpc1VwZGF0ZVBlbmRpbmcgPSBmYWxzZTtcblxuICAvKipcbiAgICogSXMgc2V0IHRvIGB0cnVlYCBhZnRlciB0aGUgZmlyc3QgdXBkYXRlLiBUaGUgZWxlbWVudCBjb2RlIGNhbm5vdCBhc3N1bWVcbiAgICogdGhhdCBgcmVuZGVyUm9vdGAgZXhpc3RzIGJlZm9yZSB0aGUgZWxlbWVudCBgaGFzVXBkYXRlZGAuXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBoYXNVcGRhdGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIE1hcCB3aXRoIGtleXMgZm9yIGFueSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0XG4gICAqIHVwZGF0ZSBjeWNsZSB3aXRoIHByZXZpb3VzIHZhbHVlcy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfJGNoYW5nZWRQcm9wZXJ0aWVzITogUHJvcGVydHlWYWx1ZXM7XG5cbiAgLyoqXG4gICAqIFByb3BlcnRpZXMgdGhhdCBzaG91bGQgYmUgcmVmbGVjdGVkIHdoZW4gdXBkYXRlZC5cbiAgICovXG4gIHByaXZhdGUgX19yZWZsZWN0aW5nUHJvcGVydGllcz86IFNldDxQcm9wZXJ0eUtleT47XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgY3VycmVudGx5IHJlZmxlY3RpbmcgcHJvcGVydHlcbiAgICovXG4gIHByaXZhdGUgX19yZWZsZWN0aW5nUHJvcGVydHk6IFByb3BlcnR5S2V5IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiBjb250cm9sbGVycy5cbiAgICovXG4gIHByaXZhdGUgX19jb250cm9sbGVycz86IFNldDxSZWFjdGl2ZUNvbnRyb2xsZXI+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fX2luaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBvbmx5IG92ZXJyaWRlIHBvaW50IGZvciBjdXN0b21pemluZyB3b3JrIGRvbmUgd2hlbiBlbGVtZW50c1xuICAgKiBhcmUgY29uc3RydWN0ZWQuXG4gICAqL1xuICBwcml2YXRlIF9faW5pdGlhbGl6ZSgpIHtcbiAgICB0aGlzLl9fdXBkYXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlPGJvb2xlYW4+KFxuICAgICAgKHJlcykgPT4gKHRoaXMuZW5hYmxlVXBkYXRpbmcgPSByZXMpXG4gICAgKTtcbiAgICB0aGlzLl8kY2hhbmdlZFByb3BlcnRpZXMgPSBuZXcgTWFwKCk7XG4gICAgLy8gVGhpcyBlbnF1ZXVlcyBhIG1pY3JvdGFzayB0aGF0IHVzdCBydW4gYmVmb3JlIHRoZSBmaXJzdCB1cGRhdGUsIHNvIGl0XG4gICAgLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJlcXVlc3RVcGRhdGUoKVxuICAgIHRoaXMuX19zYXZlSW5zdGFuY2VQcm9wZXJ0aWVzKCk7XG4gICAgLy8gZW5zdXJlcyBmaXJzdCB1cGRhdGUgd2lsbCBiZSBjYXVnaHQgYnkgYW4gZWFybHkgYWNjZXNzIG9mXG4gICAgLy8gYHVwZGF0ZUNvbXBsZXRlYFxuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpLl9pbml0aWFsaXplcnM/LmZvckVhY2goKGkpID0+XG4gICAgICBpKHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBgUmVhY3RpdmVDb250cm9sbGVyYCB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUgZWxlbWVudCdzIHJlYWN0aXZlXG4gICAqIHVwZGF0ZSBjeWNsZS4gVGhlIGVsZW1lbnQgYXV0b21hdGljYWxseSBjYWxscyBpbnRvIGFueSByZWdpc3RlcmVkXG4gICAqIGNvbnRyb2xsZXJzIGR1cmluZyBpdHMgbGlmZWN5Y2xlIGNhbGxiYWNrcy5cbiAgICpcbiAgICogSWYgdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHdoZW4gYGFkZENvbnRyb2xsZXIoKWAgaXMgY2FsbGVkLCB0aGVcbiAgICogY29udHJvbGxlcidzIGBob3N0Q29ubmVjdGVkKClgIGNhbGxiYWNrIHdpbGwgYmUgaW1tZWRpYXRlbHkgY2FsbGVkLlxuICAgKiBAY2F0ZWdvcnkgY29udHJvbGxlcnNcbiAgICovXG4gIGFkZENvbnRyb2xsZXIoY29udHJvbGxlcjogUmVhY3RpdmVDb250cm9sbGVyKSB7XG4gICAgKHRoaXMuX19jb250cm9sbGVycyA/Pz0gbmV3IFNldCgpKS5hZGQoY29udHJvbGxlcik7XG4gICAgLy8gSWYgYSBjb250cm9sbGVyIGlzIGFkZGVkIGFmdGVyIHRoZSBlbGVtZW50IGhhcyBiZWVuIGNvbm5lY3RlZCxcbiAgICAvLyBjYWxsIGhvc3RDb25uZWN0ZWQuIE5vdGUsIHJlLXVzaW5nIGV4aXN0ZW5jZSBvZiBgcmVuZGVyUm9vdGAgaGVyZVxuICAgIC8vICh3aGljaCBpcyBzZXQgaW4gY29ubmVjdGVkQ2FsbGJhY2spIHRvIGF2b2lkIHRoZSBuZWVkIHRvIHRyYWNrIGFcbiAgICAvLyBmaXJzdCBjb25uZWN0ZWQgc3RhdGUuXG4gICAgaWYgKHRoaXMucmVuZGVyUm9vdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgIGNvbnRyb2xsZXIuaG9zdENvbm5lY3RlZD8uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBgUmVhY3RpdmVDb250cm9sbGVyYCBmcm9tIHRoZSBlbGVtZW50LlxuICAgKiBAY2F0ZWdvcnkgY29udHJvbGxlcnNcbiAgICovXG4gIHJlbW92ZUNvbnRyb2xsZXIoY29udHJvbGxlcjogUmVhY3RpdmVDb250cm9sbGVyKSB7XG4gICAgdGhpcy5fX2NvbnRyb2xsZXJzPy5kZWxldGUoY29udHJvbGxlcik7XG4gIH1cblxuICAvKipcbiAgICogRml4ZXMgYW55IHByb3BlcnRpZXMgc2V0IG9uIHRoZSBpbnN0YW5jZSBiZWZvcmUgdXBncmFkZSB0aW1lLlxuICAgKiBPdGhlcndpc2UgdGhlc2Ugd291bGQgc2hhZG93IHRoZSBhY2Nlc3NvciBhbmQgYnJlYWsgdGhlc2UgcHJvcGVydGllcy5cbiAgICogVGhlIHByb3BlcnRpZXMgYXJlIHN0b3JlZCBpbiBhIE1hcCB3aGljaCBpcyBwbGF5ZWQgYmFjayBhZnRlciB0aGVcbiAgICogY29uc3RydWN0b3IgcnVucy4gTm90ZSwgb24gdmVyeSBvbGQgdmVyc2lvbnMgb2YgU2FmYXJpICg8PTkpIG9yIENocm9tZVxuICAgKiAoPD00MSksIHByb3BlcnRpZXMgY3JlYXRlZCBmb3IgbmF0aXZlIHBsYXRmb3JtIHByb3BlcnRpZXMgbGlrZSAoYGlkYCBvclxuICAgKiBgbmFtZWApIG1heSBub3QgaGF2ZSBkZWZhdWx0IHZhbHVlcyBzZXQgaW4gdGhlIGVsZW1lbnQgY29uc3RydWN0b3IuIE9uXG4gICAqIHRoZXNlIGJyb3dzZXJzIG5hdGl2ZSBwcm9wZXJ0aWVzIGFwcGVhciBvbiBpbnN0YW5jZXMgYW5kIHRoZXJlZm9yZSB0aGVpclxuICAgKiBkZWZhdWx0IHZhbHVlIHdpbGwgb3ZlcndyaXRlIGFueSBlbGVtZW50IGRlZmF1bHQgKGUuZy4gaWYgdGhlIGVsZW1lbnQgc2V0c1xuICAgKiB0aGlzLmlkID0gJ2lkJyBpbiB0aGUgY29uc3RydWN0b3IsIHRoZSAnaWQnIHdpbGwgYmVjb21lICcnIHNpbmNlIHRoaXMgaXNcbiAgICogdGhlIG5hdGl2ZSBwbGF0Zm9ybSBkZWZhdWx0KS5cbiAgICovXG4gIHByaXZhdGUgX19zYXZlSW5zdGFuY2VQcm9wZXJ0aWVzKCkge1xuICAgIGNvbnN0IGluc3RhbmNlUHJvcGVydGllcyA9IG5ldyBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KCk7XG4gICAgY29uc3QgZWxlbWVudFByb3BlcnRpZXMgPSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50KVxuICAgICAgLmVsZW1lbnRQcm9wZXJ0aWVzO1xuICAgIGZvciAoY29uc3QgcCBvZiBlbGVtZW50UHJvcGVydGllcy5rZXlzKCkgYXMgSXRlcmFibGVJdGVyYXRvcjxrZXlvZiB0aGlzPikge1xuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgaW5zdGFuY2VQcm9wZXJ0aWVzLnNldChwLCB0aGlzW3BdKTtcbiAgICAgICAgZGVsZXRlIHRoaXNbcF07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZVByb3BlcnRpZXMuc2l6ZSA+IDApIHtcbiAgICAgIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMgPSBpbnN0YW5jZVByb3BlcnRpZXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5vZGUgaW50byB3aGljaCB0aGUgZWxlbWVudCBzaG91bGQgcmVuZGVyIGFuZCBieSBkZWZhdWx0XG4gICAqIGNyZWF0ZXMgYW5kIHJldHVybnMgYW4gb3BlbiBzaGFkb3dSb290LiBJbXBsZW1lbnQgdG8gY3VzdG9taXplIHdoZXJlIHRoZVxuICAgKiBlbGVtZW50J3MgRE9NIGlzIHJlbmRlcmVkLiBGb3IgZXhhbXBsZSwgdG8gcmVuZGVyIGludG8gdGhlIGVsZW1lbnQnc1xuICAgKiBjaGlsZE5vZGVzLCByZXR1cm4gYHRoaXNgLlxuICAgKlxuICAgKiBAcmV0dXJuIFJldHVybnMgYSBub2RlIGludG8gd2hpY2ggdG8gcmVuZGVyLlxuICAgKiBAY2F0ZWdvcnkgcmVuZGVyaW5nXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlUmVuZGVyUm9vdCgpOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IHJlbmRlclJvb3QgPVxuICAgICAgdGhpcy5zaGFkb3dSb290ID8/XG4gICAgICB0aGlzLmF0dGFjaFNoYWRvdyhcbiAgICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuc2hhZG93Um9vdE9wdGlvbnNcbiAgICAgICk7XG4gICAgYWRvcHRTdHlsZXMoXG4gICAgICByZW5kZXJSb290LFxuICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuZWxlbWVudFN0eWxlc1xuICAgICk7XG4gICAgcmV0dXJuIHJlbmRlclJvb3Q7XG4gIH1cblxuICAvKipcbiAgICogT24gZmlyc3QgY29ubmVjdGlvbiwgY3JlYXRlcyB0aGUgZWxlbWVudCdzIHJlbmRlclJvb3QsIHNldHMgdXBcbiAgICogZWxlbWVudCBzdHlsaW5nLCBhbmQgZW5hYmxlcyB1cGRhdGluZy5cbiAgICogQGNhdGVnb3J5IGxpZmVjeWNsZVxuICAgKi9cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgLy8gQ3JlYXRlIHJlbmRlclJvb3QgYmVmb3JlIGNvbnRyb2xsZXJzIGBob3N0Q29ubmVjdGVkYFxuICAgICh0aGlzIGFzIE11dGFibGU8dHlwZW9mIHRoaXMsICdyZW5kZXJSb290Jz4pLnJlbmRlclJvb3QgPz89XG4gICAgICB0aGlzLmNyZWF0ZVJlbmRlclJvb3QoKTtcbiAgICB0aGlzLmVuYWJsZVVwZGF0aW5nKHRydWUpO1xuICAgIHRoaXMuX19jb250cm9sbGVycz8uZm9yRWFjaCgoYykgPT4gYy5ob3N0Q29ubmVjdGVkPy4oKSk7XG4gIH1cblxuICAvKipcbiAgICogTm90ZSwgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZmluYWwgYW5kIG5vdCBvdmVycmlkZGVuLiBJdCBpc1xuICAgKiBvdmVycmlkZGVuIG9uIHRoZSBlbGVtZW50IGluc3RhbmNlIHdpdGggYSBmdW5jdGlvbiB0aGF0IHRyaWdnZXJzIHRoZSBmaXJzdFxuICAgKiB1cGRhdGUuXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBwcm90ZWN0ZWQgZW5hYmxlVXBkYXRpbmcoX3JlcXVlc3RlZFVwZGF0ZTogYm9vbGVhbikge31cblxuICAvKipcbiAgICogQWxsb3dzIGZvciBgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKWAgaW4gZXh0ZW5zaW9ucyB3aGlsZVxuICAgKiByZXNlcnZpbmcgdGhlIHBvc3NpYmlsaXR5IG9mIG1ha2luZyBub24tYnJlYWtpbmcgZmVhdHVyZSBhZGRpdGlvbnNcbiAgICogd2hlbiBkaXNjb25uZWN0aW5nIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS5cbiAgICogQGNhdGVnb3J5IGxpZmVjeWNsZVxuICAgKi9cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5fX2NvbnRyb2xsZXJzPy5mb3JFYWNoKChjKSA9PiBjLmhvc3REaXNjb25uZWN0ZWQ/LigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbml6ZXMgcHJvcGVydHkgdmFsdWVzIHdoZW4gYXR0cmlidXRlcyBjaGFuZ2UuXG4gICAqXG4gICAqIFNwZWNpZmljYWxseSwgd2hlbiBhbiBhdHRyaWJ1dGUgaXMgc2V0LCB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBpcyBzZXQuXG4gICAqIFlvdSBzaG91bGQgcmFyZWx5IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgY2FsbGJhY2suIElmIHRoaXMgbWV0aG9kIGlzXG4gICAqIG92ZXJyaWRkZW4sIGBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgX29sZCwgdmFsdWUpYCBtdXN0IGJlXG4gICAqIGNhbGxlZC5cbiAgICpcbiAgICogU2VlIFt1c2luZyB0aGUgbGlmZWN5Y2xlIGNhbGxiYWNrc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvV2ViX0NvbXBvbmVudHMvVXNpbmdfY3VzdG9tX2VsZW1lbnRzI3VzaW5nX3RoZV9saWZlY3ljbGVfY2FsbGJhY2tzKVxuICAgKiBvbiBNRE4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgLlxuICAgKiBAY2F0ZWdvcnkgYXR0cmlidXRlc1xuICAgKi9cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBfb2xkOiBzdHJpbmcgfCBudWxsLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudWxsXG4gICkge1xuICAgIHRoaXMuXyRhdHRyaWJ1dGVUb1Byb3BlcnR5KG5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX19wcm9wZXJ0eVRvQXR0cmlidXRlKG5hbWU6IFByb3BlcnR5S2V5LCB2YWx1ZTogdW5rbm93bikge1xuICAgIGNvbnN0IGVsZW1Qcm9wZXJ0aWVzOiBQcm9wZXJ0eURlY2xhcmF0aW9uTWFwID0gKFxuICAgICAgdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50XG4gICAgKS5lbGVtZW50UHJvcGVydGllcztcbiAgICBjb25zdCBvcHRpb25zID0gZWxlbVByb3BlcnRpZXMuZ2V0KG5hbWUpITtcbiAgICBjb25zdCBhdHRyID0gKFxuICAgICAgdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50XG4gICAgKS5fX2F0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShuYW1lLCBvcHRpb25zKTtcbiAgICBpZiAoYXR0ciAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMucmVmbGVjdCA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgY29udmVydGVyID1cbiAgICAgICAgKG9wdGlvbnMuY29udmVydGVyIGFzIENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXIpPy50b0F0dHJpYnV0ZSAhPT1cbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICAgPyAob3B0aW9ucy5jb252ZXJ0ZXIgYXMgQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlcilcbiAgICAgICAgICA6IGRlZmF1bHRDb252ZXJ0ZXI7XG4gICAgICBjb25zdCBhdHRyVmFsdWUgPSBjb252ZXJ0ZXIudG9BdHRyaWJ1dGUhKHZhbHVlLCBvcHRpb25zLnR5cGUpO1xuICAgICAgaWYgKFxuICAgICAgICBERVZfTU9ERSAmJlxuICAgICAgICAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50KS5lbmFibGVkV2FybmluZ3MhLmluY2x1ZGVzKFxuICAgICAgICAgICdtaWdyYXRpb24nXG4gICAgICAgICkgJiZcbiAgICAgICAgYXR0clZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAgICAgJ3VuZGVmaW5lZC1hdHRyaWJ1dGUtdmFsdWUnLFxuICAgICAgICAgIGBUaGUgYXR0cmlidXRlIHZhbHVlIGZvciB0aGUgJHtuYW1lIGFzIHN0cmluZ30gcHJvcGVydHkgaXMgYCArXG4gICAgICAgICAgICBgdW5kZWZpbmVkIG9uIGVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0uIFRoZSBhdHRyaWJ1dGUgd2lsbCBiZSBgICtcbiAgICAgICAgICAgIGByZW1vdmVkLCBidXQgaW4gdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgXFxgUmVhY3RpdmVFbGVtZW50XFxgLCBgICtcbiAgICAgICAgICAgIGB0aGUgYXR0cmlidXRlIHdvdWxkIG5vdCBoYXZlIGNoYW5nZWQuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gVHJhY2sgaWYgdGhlIHByb3BlcnR5IGlzIGJlaW5nIHJlZmxlY3RlZCB0byBhdm9pZFxuICAgICAgLy8gc2V0dGluZyB0aGUgcHJvcGVydHkgYWdhaW4gdmlhIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgLiBOb3RlOlxuICAgICAgLy8gMS4gdGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGUgY2FsbGJhY2sgaXMgc3luY2hyb25vdXMuXG4gICAgICAvLyAyLiB3aWxsIGJlaGF2ZSBpbmNvcnJlY3RseSBpZiBtdWx0aXBsZSBhdHRyaWJ1dGVzIGFyZSBpbiB0aGUgcmVhY3Rpb25cbiAgICAgIC8vIHN0YWNrIGF0IHRpbWUgb2YgY2FsbGluZy4gSG93ZXZlciwgc2luY2Ugd2UgcHJvY2VzcyBhdHRyaWJ1dGVzXG4gICAgICAvLyBpbiBgdXBkYXRlYCB0aGlzIHNob3VsZCBub3QgYmUgcG9zc2libGUgKG9yIGFuIGV4dHJlbWUgY29ybmVyIGNhc2VcbiAgICAgIC8vIHRoYXQgd2UnZCBsaWtlIHRvIGRpc2NvdmVyKS5cbiAgICAgIC8vIG1hcmsgc3RhdGUgcmVmbGVjdGluZ1xuICAgICAgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSA9IG5hbWU7XG4gICAgICBpZiAoYXR0clZhbHVlID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyVmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIC8vIG1hcmsgc3RhdGUgbm90IHJlZmxlY3RpbmdcbiAgICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRhdHRyaWJ1dGVUb1Byb3BlcnR5KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50O1xuICAgIC8vIE5vdGUsIGhpbnQgdGhpcyBhcyBhbiBgQXR0cmlidXRlTWFwYCBzbyBjbG9zdXJlIGNsZWFybHkgdW5kZXJzdGFuZHNcbiAgICAvLyB0aGUgdHlwZTsgaXQgaGFzIGlzc3VlcyB3aXRoIHRyYWNraW5nIHR5cGVzIHRocm91Z2ggc3RhdGljc1xuICAgIGNvbnN0IHByb3BOYW1lID0gKGN0b3IuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwIGFzIEF0dHJpYnV0ZU1hcCkuZ2V0KG5hbWUpO1xuICAgIC8vIFVzZSB0cmFja2luZyBpbmZvIHRvIGF2b2lkIHJlZmxlY3RpbmcgYSBwcm9wZXJ0eSB2YWx1ZSB0byBhbiBhdHRyaWJ1dGVcbiAgICAvLyBpZiBpdCB3YXMganVzdCBzZXQgYmVjYXVzZSB0aGUgYXR0cmlidXRlIGNoYW5nZWQuXG4gICAgaWYgKHByb3BOYW1lICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSAhPT0gcHJvcE5hbWUpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBjdG9yLmdldFByb3BlcnR5T3B0aW9ucyhwcm9wTmFtZSk7XG4gICAgICBjb25zdCBjb252ZXJ0ZXIgPVxuICAgICAgICB0eXBlb2Ygb3B0aW9ucy5jb252ZXJ0ZXIgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHtmcm9tQXR0cmlidXRlOiBvcHRpb25zLmNvbnZlcnRlcn1cbiAgICAgICAgICA6IG9wdGlvbnMuY29udmVydGVyPy5mcm9tQXR0cmlidXRlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IG9wdGlvbnMuY29udmVydGVyXG4gICAgICAgICAgOiBkZWZhdWx0Q29udmVydGVyO1xuICAgICAgLy8gbWFyayBzdGF0ZSByZWZsZWN0aW5nXG4gICAgICB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnR5ID0gcHJvcE5hbWU7XG4gICAgICB0aGlzW3Byb3BOYW1lIGFzIGtleW9mIHRoaXNdID0gY29udmVydGVyLmZyb21BdHRyaWJ1dGUhKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgb3B0aW9ucy50eXBlXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICApIGFzIGFueTtcbiAgICAgIC8vIG1hcmsgc3RhdGUgbm90IHJlZmxlY3RpbmdcbiAgICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBhbiB1cGRhdGUgd2hpY2ggaXMgcHJvY2Vzc2VkIGFzeW5jaHJvbm91c2x5LiBUaGlzIHNob3VsZCBiZSBjYWxsZWRcbiAgICogd2hlbiBhbiBlbGVtZW50IHNob3VsZCB1cGRhdGUgYmFzZWQgb24gc29tZSBzdGF0ZSBub3QgdHJpZ2dlcmVkIGJ5IHNldHRpbmdcbiAgICogYSByZWFjdGl2ZSBwcm9wZXJ0eS4gSW4gdGhpcyBjYXNlLCBwYXNzIG5vIGFyZ3VtZW50cy4gSXQgc2hvdWxkIGFsc28gYmVcbiAgICogY2FsbGVkIHdoZW4gbWFudWFsbHkgaW1wbGVtZW50aW5nIGEgcHJvcGVydHkgc2V0dGVyLiBJbiB0aGlzIGNhc2UsIHBhc3MgdGhlXG4gICAqIHByb3BlcnR5IGBuYW1lYCBhbmQgYG9sZFZhbHVlYCB0byBlbnN1cmUgdGhhdCBhbnkgY29uZmlndXJlZCBwcm9wZXJ0eVxuICAgKiBvcHRpb25zIGFyZSBob25vcmVkLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHJlcXVlc3RpbmcgcHJvcGVydHlcbiAgICogQHBhcmFtIG9sZFZhbHVlIG9sZCB2YWx1ZSBvZiByZXF1ZXN0aW5nIHByb3BlcnR5XG4gICAqIEBwYXJhbSBvcHRpb25zIHByb3BlcnR5IG9wdGlvbnMgdG8gdXNlIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzbHlcbiAgICogICAgIGNvbmZpZ3VyZWQgb3B0aW9uc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcmVxdWVzdFVwZGF0ZShcbiAgICBuYW1lPzogUHJvcGVydHlLZXksXG4gICAgb2xkVmFsdWU/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBQcm9wZXJ0eURlY2xhcmF0aW9uXG4gICk6IHZvaWQge1xuICAgIC8vIElmIHdlIGhhdmUgYSBwcm9wZXJ0eSBrZXksIHBlcmZvcm0gcHJvcGVydHkgdXBkYXRlIHN0ZXBzLlxuICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChERVZfTU9ERSAmJiAobmFtZSBhcyB1bmtub3duKSBpbnN0YW5jZW9mIEV2ZW50KSB7XG4gICAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgICBgYCxcbiAgICAgICAgICBgVGhlIHJlcXVlc3RVcGRhdGUoKSBtZXRob2Qgd2FzIGNhbGxlZCB3aXRoIGFuIEV2ZW50IGFzIHRoZSBwcm9wZXJ0eSBuYW1lLiBUaGlzIGlzIHByb2JhYmx5IGEgbWlzdGFrZSBjYXVzZWQgYnkgYmluZGluZyB0aGlzLnJlcXVlc3RVcGRhdGUgYXMgYW4gZXZlbnQgbGlzdGVuZXIuIEluc3RlYWQgYmluZCBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBjYWxsIGl0IHdpdGggbm8gYXJndW1lbnRzOiAoKSA9PiB0aGlzLnJlcXVlc3RVcGRhdGUoKWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMgPz89IChcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50XG4gICAgICApLmdldFByb3BlcnR5T3B0aW9ucyhuYW1lKTtcbiAgICAgIGNvbnN0IGhhc0NoYW5nZWQgPSBvcHRpb25zLmhhc0NoYW5nZWQgPz8gbm90RXF1YWw7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXNbbmFtZSBhcyBrZXlvZiB0aGlzXTtcbiAgICAgIGlmIChoYXNDaGFuZ2VkKG5ld1ZhbHVlLCBvbGRWYWx1ZSkpIHtcbiAgICAgICAgdGhpcy5fJGNoYW5nZVByb3BlcnR5KG5hbWUsIG9sZFZhbHVlLCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFib3J0IHRoZSByZXF1ZXN0IGlmIHRoZSBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgY2hhbmdlZC5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5pc1VwZGF0ZVBlbmRpbmcgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLl9fdXBkYXRlUHJvbWlzZSA9IHRoaXMuX19lbnF1ZXVlVXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgXyRjaGFuZ2VQcm9wZXJ0eShcbiAgICBuYW1lOiBQcm9wZXJ0eUtleSxcbiAgICBvbGRWYWx1ZTogdW5rbm93bixcbiAgICBvcHRpb25zOiBQcm9wZXJ0eURlY2xhcmF0aW9uXG4gICkge1xuICAgIC8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiBDcmVhdGUgYSBiZW5jaG1hcmsgb2YgTWFwLmhhcygpICsgTWFwLnNldChcbiAgICAvLyB2cyBqdXN0IE1hcC5zZXQoKVxuICAgIGlmICghdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzLmhhcyhuYW1lKSkge1xuICAgICAgdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzLnNldChuYW1lLCBvbGRWYWx1ZSk7XG4gICAgfVxuICAgIC8vIEFkZCB0byByZWZsZWN0aW5nIHByb3BlcnRpZXMgc2V0LlxuICAgIC8vIE5vdGUsIGl0J3MgaW1wb3J0YW50IHRoYXQgZXZlcnkgY2hhbmdlIGhhcyBhIGNoYW5jZSB0byBhZGQgdGhlXG4gICAgLy8gcHJvcGVydHkgdG8gYF9fcmVmbGVjdGluZ1Byb3BlcnRpZXNgLiBUaGlzIGVuc3VyZXMgc2V0dGluZ1xuICAgIC8vIGF0dHJpYnV0ZSArIHByb3BlcnR5IHJlZmxlY3RzIGNvcnJlY3RseS5cbiAgICBpZiAob3B0aW9ucy5yZWZsZWN0ID09PSB0cnVlICYmIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgIT09IG5hbWUpIHtcbiAgICAgICh0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnRpZXMgPz89IG5ldyBTZXQ8UHJvcGVydHlLZXk+KCkpLmFkZChuYW1lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0aGUgZWxlbWVudCB0byBhc3luY2hyb25vdXNseSB1cGRhdGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9fZW5xdWV1ZVVwZGF0ZSgpIHtcbiAgICB0aGlzLmlzVXBkYXRlUGVuZGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSBhbnkgcHJldmlvdXMgdXBkYXRlIGhhcyByZXNvbHZlZCBiZWZvcmUgdXBkYXRpbmcuXG4gICAgICAvLyBUaGlzIGBhd2FpdGAgYWxzbyBlbnN1cmVzIHRoYXQgcHJvcGVydHkgY2hhbmdlcyBhcmUgYmF0Y2hlZC5cbiAgICAgIGF3YWl0IHRoaXMuX191cGRhdGVQcm9taXNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFJlZmlyZSBhbnkgcHJldmlvdXMgZXJyb3JzIGFzeW5jIHNvIHRoZXkgZG8gbm90IGRpc3J1cHQgdGhlIHVwZGF0ZVxuICAgICAgLy8gY3ljbGUuIEVycm9ycyBhcmUgcmVmaXJlZCBzbyBkZXZlbG9wZXJzIGhhdmUgYSBjaGFuY2UgdG8gb2JzZXJ2ZVxuICAgICAgLy8gdGhlbSwgYW5kIHRoaXMgY2FuIGJlIGRvbmUgYnkgaW1wbGVtZW50aW5nXG4gICAgICAvLyBgd2luZG93Lm9udW5oYW5kbGVkcmVqZWN0aW9uYC5cbiAgICAgIFByb21pc2UucmVqZWN0KGUpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XG4gICAgLy8gSWYgYHNjaGVkdWxlVXBkYXRlYCByZXR1cm5zIGEgUHJvbWlzZSwgd2UgYXdhaXQgaXQuIFRoaXMgaXMgZG9uZSB0b1xuICAgIC8vIGVuYWJsZSBjb29yZGluYXRpbmcgdXBkYXRlcyB3aXRoIGEgc2NoZWR1bGVyLiBOb3RlLCB0aGUgcmVzdWx0IGlzXG4gICAgLy8gY2hlY2tlZCB0byBhdm9pZCBkZWxheWluZyBhbiBhZGRpdGlvbmFsIG1pY3JvdGFzayB1bmxlc3Mgd2UgbmVlZCB0by5cbiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuICF0aGlzLmlzVXBkYXRlUGVuZGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2hlZHVsZXMgYW4gZWxlbWVudCB1cGRhdGUuIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIHRoZVxuICAgKiB0aW1pbmcgb2YgdXBkYXRlcyBieSByZXR1cm5pbmcgYSBQcm9taXNlLiBUaGUgdXBkYXRlIHdpbGwgYXdhaXQgdGhlXG4gICAqIHJldHVybmVkIFByb21pc2UsIGFuZCB5b3Ugc2hvdWxkIHJlc29sdmUgdGhlIFByb21pc2UgdG8gYWxsb3cgdGhlIHVwZGF0ZVxuICAgKiB0byBwcm9jZWVkLiBJZiB0aGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuLCBgc3VwZXIuc2NoZWR1bGVVcGRhdGUoKWBcbiAgICogbXVzdCBiZSBjYWxsZWQuXG4gICAqXG4gICAqIEZvciBpbnN0YW5jZSwgdG8gc2NoZWR1bGUgdXBkYXRlcyB0byBvY2N1ciBqdXN0IGJlZm9yZSB0aGUgbmV4dCBmcmFtZTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogb3ZlcnJpZGUgcHJvdGVjdGVkIGFzeW5jIHNjaGVkdWxlVXBkYXRlKCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgKiAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gcmVzb2x2ZSgpKSk7XG4gICAqICAgc3VwZXIuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCBzY2hlZHVsZVVwZGF0ZSgpOiB2b2lkIHwgUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wZXJmb3JtVXBkYXRlKCk7XG4gICAgaWYgKFxuICAgICAgREVWX01PREUgJiZcbiAgICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpLmVuYWJsZWRXYXJuaW5ncyEuaW5jbHVkZXMoXG4gICAgICAgICdhc3luYy1wZXJmb3JtLXVwZGF0ZSdcbiAgICAgICkgJiZcbiAgICAgIHR5cGVvZiAocmVzdWx0IGFzIHVua25vd24gYXMgUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZCk/LnRoZW4gPT09XG4gICAgICAgICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgJ2FzeW5jLXBlcmZvcm0tdXBkYXRlJyxcbiAgICAgICAgYEVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0gcmV0dXJuZWQgYSBQcm9taXNlIGZyb20gcGVyZm9ybVVwZGF0ZSgpLiBgICtcbiAgICAgICAgICBgVGhpcyBiZWhhdmlvciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgYCArXG4gICAgICAgICAgYHZlcnNpb24gb2YgUmVhY3RpdmVFbGVtZW50LmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYW4gZWxlbWVudCB1cGRhdGUuIE5vdGUsIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIHRoZVxuICAgKiB1cGRhdGUsIGBmaXJzdFVwZGF0ZWRgIGFuZCBgdXBkYXRlZGAgd2lsbCBub3QgYmUgY2FsbGVkLlxuICAgKlxuICAgKiBDYWxsIGBwZXJmb3JtVXBkYXRlKClgIHRvIGltbWVkaWF0ZWx5IHByb2Nlc3MgYSBwZW5kaW5nIHVwZGF0ZS4gVGhpcyBzaG91bGRcbiAgICogZ2VuZXJhbGx5IG5vdCBiZSBuZWVkZWQsIGJ1dCBpdCBjYW4gYmUgZG9uZSBpbiByYXJlIGNhc2VzIHdoZW4geW91IG5lZWQgdG9cbiAgICogdXBkYXRlIHN5bmNocm9ub3VzbHkuXG4gICAqXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBwcm90ZWN0ZWQgcGVyZm9ybVVwZGF0ZSgpOiB2b2lkIHtcbiAgICAvLyBBYm9ydCBhbnkgdXBkYXRlIGlmIG9uZSBpcyBub3QgcGVuZGluZyB3aGVuIHRoaXMgaXMgY2FsbGVkLlxuICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBgcGVyZm9ybVVwZGF0ZWAgaXMgY2FsbGVkIGVhcmx5IHRvIFwiZmx1c2hcIlxuICAgIC8vIHRoZSB1cGRhdGUuXG4gICAgaWYgKCF0aGlzLmlzVXBkYXRlUGVuZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWJ1Z0xvZ0V2ZW50Py4oe2tpbmQ6ICd1cGRhdGUnfSk7XG4gICAgaWYgKCF0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgIC8vIENyZWF0ZSByZW5kZXJSb290IGJlZm9yZSBmaXJzdCB1cGRhdGUuIFRoaXMgb2NjdXJzIGluIGBjb25uZWN0ZWRDYWxsYmFja2BcbiAgICAgIC8vIGJ1dCBpcyBkb25lIGhlcmUgdG8gc3VwcG9ydCBvdXQgb2YgdHJlZSBjYWxscyB0byBgZW5hYmxlVXBkYXRpbmdgL2BwZXJmb3JtVXBkYXRlYC5cbiAgICAgICh0aGlzIGFzIE11dGFibGU8dHlwZW9mIHRoaXMsICdyZW5kZXJSb290Jz4pLnJlbmRlclJvb3QgPz89XG4gICAgICAgIHRoaXMuY3JlYXRlUmVuZGVyUm9vdCgpO1xuICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgIC8vIFByb2R1Y2Ugd2FybmluZyBpZiBhbnkgcmVhY3RpdmUgcHJvcGVydGllcyBvbiB0aGUgcHJvdG90eXBlIGFyZVxuICAgICAgICAvLyBzaGFkb3dlZCBieSBjbGFzcyBmaWVsZHMuIEluc3RhbmNlIGZpZWxkcyBzZXQgYmVmb3JlIHVwZ3JhZGUgYXJlXG4gICAgICAgIC8vIGRlbGV0ZWQgYnkgdGhpcyBwb2ludCwgc28gYW55IG93biBwcm9wZXJ0eSBpcyBjYXVzZWQgYnkgY2xhc3MgZmllbGRcbiAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24gaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBzaGFkb3dlZFByb3BlcnRpZXMgPSBbLi4uY3Rvci5lbGVtZW50UHJvcGVydGllcy5rZXlzKCldLmZpbHRlcihcbiAgICAgICAgICAocCkgPT4gdGhpcy5oYXNPd25Qcm9wZXJ0eShwKSAmJiBwIGluIGdldFByb3RvdHlwZU9mKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzaGFkb3dlZFByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBvbiBlbGVtZW50ICR7dGhpcy5sb2NhbE5hbWV9IHdpbGwgbm90IGAgK1xuICAgICAgICAgICAgICBgdHJpZ2dlciB1cGRhdGVzIGFzIGV4cGVjdGVkIGJlY2F1c2UgdGhleSBhcmUgc2V0IHVzaW5nIGNsYXNzIGAgK1xuICAgICAgICAgICAgICBgZmllbGRzOiAke3NoYWRvd2VkUHJvcGVydGllcy5qb2luKCcsICcpfS4gYCArXG4gICAgICAgICAgICAgIGBOYXRpdmUgY2xhc3MgZmllbGRzIGFuZCBzb21lIGNvbXBpbGVkIG91dHB1dCB3aWxsIG92ZXJ3cml0ZSBgICtcbiAgICAgICAgICAgICAgYGFjY2Vzc29ycyB1c2VkIGZvciBkZXRlY3RpbmcgY2hhbmdlcy4gU2VlIGAgK1xuICAgICAgICAgICAgICBgaHR0cHM6Ly9saXQuZGV2L21zZy9jbGFzcy1maWVsZC1zaGFkb3dpbmcgYCArXG4gICAgICAgICAgICAgIGBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gTWl4aW4gaW5zdGFuY2UgcHJvcGVydGllcyBvbmNlLCBpZiB0aGV5IGV4aXN0LlxuICAgICAgaWYgKHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMpIHtcbiAgICAgICAgLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IHNob3VsZCB3ZSB1c2UgdGhlIHN0b3JlZCB2YWx1ZT8gQ291bGQgYSBuZXcgdmFsdWVcbiAgICAgICAgLy8gaGF2ZSBiZWVuIHNldCBzaW5jZSB3ZSBzdG9yZWQgdGhlIG93biBwcm9wZXJ0eSB2YWx1ZT9cbiAgICAgICAgZm9yIChjb25zdCBbcCwgdmFsdWVdIG9mIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICB0aGlzW3AgYXMga2V5b2YgdGhpc10gPSB2YWx1ZSBhcyB0aGlzW2tleW9mIHRoaXNdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICAvLyBUcmlnZ2VyIGluaXRpYWwgdmFsdWUgcmVmbGVjdGlvbiBhbmQgcG9wdWxhdGUgdGhlIGluaXRpYWxcbiAgICAgIC8vIGNoYW5nZWRQcm9wZXJ0aWVzIG1hcCwgYnV0IG9ubHkgZm9yIHRoZSBjYXNlIG9mIGV4cGVyaW1lbnRhbFxuICAgICAgLy8gZGVjb3JhdG9ycyBvbiBhY2Nlc3NvcnMsIHdoaWNoIHdpbGwgbm90IGhhdmUgYWxyZWFkeSBwb3B1bGF0ZWQgdGhlXG4gICAgICAvLyBjaGFuZ2VkUHJvcGVydGllcyBtYXAuIFdlIGNhbid0IGtub3cgaWYgdGhlc2UgYWNjZXNzb3JzIGhhZFxuICAgICAgLy8gaW5pdGlhbGl6ZXJzLCBzbyB3ZSBqdXN0IHNldCB0aGVtIGFueXdheSAtIGEgZGlmZmVyZW5jZSBmcm9tXG4gICAgICAvLyBleHBlcmltZW50YWwgZGVjb3JhdG9ycyBvbiBmaWVsZHMgYW5kIHN0YW5kYXJkIGRlY29yYXRvcnMgb25cbiAgICAgIC8vIGF1dG8tYWNjZXNzb3JzLlxuICAgICAgLy8gRm9yIGNvbnRleHQgd2h5IGV4cGVyaW1lbnRhbERlY29yYXRvcnMgd2l0aCBhdXRvIGFjY2Vzc29ycyBhcmUgaGFuZGxlZFxuICAgICAgLy8gc3BlY2lmaWNhbGx5IGFsc28gc2VlOlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvcHVsbC80MTgzI2lzc3VlY29tbWVudC0xNzExOTU5NjM1XG4gICAgICBjb25zdCBlbGVtZW50UHJvcGVydGllcyA9ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpXG4gICAgICAgIC5lbGVtZW50UHJvcGVydGllcztcbiAgICAgIGlmIChlbGVtZW50UHJvcGVydGllcy5zaXplID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtwLCBvcHRpb25zXSBvZiBlbGVtZW50UHJvcGVydGllcykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG9wdGlvbnMud3JhcHBlZCA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgIXRoaXMuXyRjaGFuZ2VkUHJvcGVydGllcy5oYXMocCkgJiZcbiAgICAgICAgICAgIHRoaXNbcCBhcyBrZXlvZiB0aGlzXSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLl8kY2hhbmdlUHJvcGVydHkocCwgdGhpc1twIGFzIGtleW9mIHRoaXNdLCBvcHRpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IHNob3VsZFVwZGF0ZSA9IGZhbHNlO1xuICAgIGNvbnN0IGNoYW5nZWRQcm9wZXJ0aWVzID0gdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzO1xuICAgIHRyeSB7XG4gICAgICBzaG91bGRVcGRhdGUgPSB0aGlzLnNob3VsZFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICAgIHRoaXMud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICAgIHRoaXMuX19jb250cm9sbGVycz8uZm9yRWFjaCgoYykgPT4gYy5ob3N0VXBkYXRlPy4oKSk7XG4gICAgICAgIHRoaXMudXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX19tYXJrVXBkYXRlZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFByZXZlbnQgYGZpcnN0VXBkYXRlZGAgYW5kIGB1cGRhdGVkYCBmcm9tIHJ1bm5pbmcgd2hlbiB0aGVyZSdzIGFuXG4gICAgICAvLyB1cGRhdGUgZXhjZXB0aW9uLlxuICAgICAgc2hvdWxkVXBkYXRlID0gZmFsc2U7XG4gICAgICAvLyBFbnN1cmUgZWxlbWVudCBjYW4gYWNjZXB0IGFkZGl0aW9uYWwgdXBkYXRlcyBhZnRlciBhbiBleGNlcHRpb24uXG4gICAgICB0aGlzLl9fbWFya1VwZGF0ZWQoKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIC8vIFRoZSB1cGRhdGUgaXMgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgcGVuZGluZyBhbmQgZnVydGhlciB1cGRhdGVzIGFyZSBub3cgYWxsb3dlZC5cbiAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICB0aGlzLl8kZGlkVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlZCBiZWZvcmUgYHVwZGF0ZSgpYCB0byBjb21wdXRlIHZhbHVlcyBuZWVkZWQgZHVyaW5nIHRoZSB1cGRhdGUuXG4gICAqXG4gICAqIEltcGxlbWVudCBgd2lsbFVwZGF0ZWAgdG8gY29tcHV0ZSBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBkZXBlbmQgb24gb3RoZXJcbiAgICogcHJvcGVydGllcyBhbmQgYXJlIHVzZWQgaW4gdGhlIHJlc3Qgb2YgdGhlIHVwZGF0ZSBwcm9jZXNzLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKSB7XG4gICAqICAgLy8gb25seSBuZWVkIHRvIGNoZWNrIGNoYW5nZWQgcHJvcGVydGllcyBmb3IgYW4gZXhwZW5zaXZlIGNvbXB1dGF0aW9uLlxuICAgKiAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2ZpcnN0TmFtZScpIHx8IGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnbGFzdE5hbWUnKSkge1xuICAgKiAgICAgdGhpcy5zaGEgPSBjb21wdXRlU0hBKGAke3RoaXMuZmlyc3ROYW1lfSAke3RoaXMubGFzdE5hbWV9YCk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIHJlbmRlcigpIHtcbiAgICogICByZXR1cm4gaHRtbGBTSEE6ICR7dGhpcy5zaGF9YDtcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCB3aWxsVXBkYXRlKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpOiB2b2lkIHt9XG5cbiAgLy8gTm90ZSwgdGhpcyBpcyBhbiBvdmVycmlkZSBwb2ludCBmb3IgcG9seWZpbGwtc3VwcG9ydC5cbiAgLy8gQGludGVybmFsXG4gIF8kZGlkVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlcykge1xuICAgIHRoaXMuX19jb250cm9sbGVycz8uZm9yRWFjaCgoYykgPT4gYy5ob3N0VXBkYXRlZD8uKCkpO1xuICAgIGlmICghdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICB0aGlzLmhhc1VwZGF0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgIGlmIChcbiAgICAgIERFVl9NT0RFICYmXG4gICAgICB0aGlzLmlzVXBkYXRlUGVuZGluZyAmJlxuICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuZW5hYmxlZFdhcm5pbmdzIS5pbmNsdWRlcyhcbiAgICAgICAgJ2NoYW5nZS1pbi11cGRhdGUnXG4gICAgICApXG4gICAgKSB7XG4gICAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAgICdjaGFuZ2UtaW4tdXBkYXRlJyxcbiAgICAgICAgYEVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0gc2NoZWR1bGVkIGFuIHVwZGF0ZSBgICtcbiAgICAgICAgICBgKGdlbmVyYWxseSBiZWNhdXNlIGEgcHJvcGVydHkgd2FzIHNldCkgYCArXG4gICAgICAgICAgYGFmdGVyIGFuIHVwZGF0ZSBjb21wbGV0ZWQsIGNhdXNpbmcgYSBuZXcgdXBkYXRlIHRvIGJlIHNjaGVkdWxlZC4gYCArXG4gICAgICAgICAgYFRoaXMgaXMgaW5lZmZpY2llbnQgYW5kIHNob3VsZCBiZSBhdm9pZGVkIHVubGVzcyB0aGUgbmV4dCB1cGRhdGUgYCArXG4gICAgICAgICAgYGNhbiBvbmx5IGJlIHNjaGVkdWxlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIHRoZSBwcmV2aW91cyB1cGRhdGUuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9fbWFya1VwZGF0ZWQoKSB7XG4gICAgdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuaXNVcGRhdGVQZW5kaW5nID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBlbGVtZW50IGhhcyBjb21wbGV0ZWQgdXBkYXRpbmcuXG4gICAqIFRoZSBQcm9taXNlIHZhbHVlIGlzIGEgYm9vbGVhbiB0aGF0IGlzIGB0cnVlYCBpZiB0aGUgZWxlbWVudCBjb21wbGV0ZWQgdGhlXG4gICAqIHVwZGF0ZSB3aXRob3V0IHRyaWdnZXJpbmcgYW5vdGhlciB1cGRhdGUuIFRoZSBQcm9taXNlIHJlc3VsdCBpcyBgZmFsc2VgIGlmXG4gICAqIGEgcHJvcGVydHkgd2FzIHNldCBpbnNpZGUgYHVwZGF0ZWQoKWAuIElmIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLCBhblxuICAgKiBleGNlcHRpb24gd2FzIHRocm93biBkdXJpbmcgdGhlIHVwZGF0ZS5cbiAgICpcbiAgICogVG8gYXdhaXQgYWRkaXRpb25hbCBhc3luY2hyb25vdXMgd29yaywgb3ZlcnJpZGUgdGhlIGBnZXRVcGRhdGVDb21wbGV0ZWBcbiAgICogbWV0aG9kLiBGb3IgZXhhbXBsZSwgaXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBhd2FpdCBhIHJlbmRlcmVkIGVsZW1lbnRcbiAgICogYmVmb3JlIGZ1bGZpbGxpbmcgdGhpcyBQcm9taXNlLiBUbyBkbyB0aGlzLCBmaXJzdCBhd2FpdFxuICAgKiBgc3VwZXIuZ2V0VXBkYXRlQ29tcGxldGUoKWAsIHRoZW4gYW55IHN1YnNlcXVlbnQgc3RhdGUuXG4gICAqXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIG9mIGEgYm9vbGVhbiB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHVwZGF0ZSBjb21wbGV0ZWRcbiAgICogICAgIHdpdGhvdXQgdHJpZ2dlcmluZyBhbm90aGVyIHVwZGF0ZS5cbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIGdldCB1cGRhdGVDb21wbGV0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRVcGRhdGVDb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHBvaW50IGZvciB0aGUgYHVwZGF0ZUNvbXBsZXRlYCBwcm9taXNlLlxuICAgKlxuICAgKiBJdCBpcyBub3Qgc2FmZSB0byBvdmVycmlkZSB0aGUgYHVwZGF0ZUNvbXBsZXRlYCBnZXR0ZXIgZGlyZWN0bHkgZHVlIHRvIGFcbiAgICogbGltaXRhdGlvbiBpbiBUeXBlU2NyaXB0IHdoaWNoIG1lYW5zIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYWxsIGFcbiAgICogc3VwZXJjbGFzcyBnZXR0ZXIgKGUuZy4gYHN1cGVyLnVwZGF0ZUNvbXBsZXRlLnRoZW4oLi4uKWApIHdoZW4gdGhlIHRhcmdldFxuICAgKiBsYW5ndWFnZSBpcyBFUzUgKGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMzM4KS5cbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gaW5zdGVhZC4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGNsYXNzIE15RWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuICAgKiAgIG92ZXJyaWRlIGFzeW5jIGdldFVwZGF0ZUNvbXBsZXRlKCkge1xuICAgKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3VwZXIuZ2V0VXBkYXRlQ29tcGxldGUoKTtcbiAgICogICAgIGF3YWl0IHRoaXMuX215Q2hpbGQudXBkYXRlQ29tcGxldGU7XG4gICAqICAgICByZXR1cm4gcmVzdWx0O1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQHJldHVybiBBIHByb21pc2Ugb2YgYSBib29sZWFuIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgdXBkYXRlIGNvbXBsZXRlZFxuICAgKiAgICAgd2l0aG91dCB0cmlnZ2VyaW5nIGFub3RoZXIgdXBkYXRlLlxuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldFVwZGF0ZUNvbXBsZXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9fdXBkYXRlUHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIG9yIG5vdCBgdXBkYXRlKClgIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCByZXF1ZXN0c1xuICAgKiBhbiB1cGRhdGUuIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIGB0cnVlYCwgYnV0IHRoaXMgY2FuIGJlXG4gICAqIGN1c3RvbWl6ZWQgdG8gY29udHJvbCB3aGVuIHRvIHVwZGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHNob3VsZFVwZGF0ZShfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZWxlbWVudC4gVGhpcyBtZXRob2QgcmVmbGVjdHMgcHJvcGVydHkgdmFsdWVzIHRvIGF0dHJpYnV0ZXMuXG4gICAqIEl0IGNhbiBiZSBvdmVycmlkZGVuIHRvIHJlbmRlciBhbmQga2VlcCB1cGRhdGVkIGVsZW1lbnQgRE9NLlxuICAgKiBTZXR0aW5nIHByb3BlcnRpZXMgaW5zaWRlIHRoaXMgbWV0aG9kIHdpbGwgKm5vdCogdHJpZ2dlclxuICAgKiBhbm90aGVyIHVwZGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZShfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKSB7XG4gICAgLy8gVGhlIGZvckVhY2goKSBleHByZXNzaW9uIHdpbGwgb25seSBydW4gd2hlbiB3aGVuIF9fcmVmbGVjdGluZ1Byb3BlcnRpZXMgaXNcbiAgICAvLyBkZWZpbmVkLCBhbmQgaXQgcmV0dXJucyB1bmRlZmluZWQsIHNldHRpbmcgX19yZWZsZWN0aW5nUHJvcGVydGllcyB0b1xuICAgIC8vIHVuZGVmaW5lZFxuICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydGllcyAmJj0gdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0aWVzLmZvckVhY2goKHApID0+XG4gICAgICB0aGlzLl9fcHJvcGVydHlUb0F0dHJpYnV0ZShwLCB0aGlzW3AgYXMga2V5b2YgdGhpc10pXG4gICAgKSBhcyB1bmRlZmluZWQ7XG4gICAgdGhpcy5fX21hcmtVcGRhdGVkKCk7XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuZXZlciB0aGUgZWxlbWVudCBpcyB1cGRhdGVkLiBJbXBsZW1lbnQgdG8gcGVyZm9ybVxuICAgKiBwb3N0LXVwZGF0aW5nIHRhc2tzIHZpYSBET00gQVBJcywgZm9yIGV4YW1wbGUsIGZvY3VzaW5nIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIFNldHRpbmcgcHJvcGVydGllcyBpbnNpZGUgdGhpcyBtZXRob2Qgd2lsbCB0cmlnZ2VyIHRoZSBlbGVtZW50IHRvIHVwZGF0ZVxuICAgKiBhZ2FpbiBhZnRlciB0aGlzIHVwZGF0ZSBjeWNsZSBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBfY2hhbmdlZFByb3BlcnRpZXMgTWFwIG9mIGNoYW5nZWQgcHJvcGVydGllcyB3aXRoIG9sZCB2YWx1ZXNcbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCB1cGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpIHt9XG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBmaXJzdCB1cGRhdGVkLiBJbXBsZW1lbnQgdG8gcGVyZm9ybSBvbmUgdGltZVxuICAgKiB3b3JrIG9uIHRoZSBlbGVtZW50IGFmdGVyIHVwZGF0ZS5cbiAgICpcbiAgICogYGBgdHNcbiAgICogZmlyc3RVcGRhdGVkKCkge1xuICAgKiAgIHRoaXMucmVuZGVyUm9vdC5nZXRFbGVtZW50QnlJZCgnbXktdGV4dC1hcmVhJykuZm9jdXMoKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogU2V0dGluZyBwcm9wZXJ0aWVzIGluc2lkZSB0aGlzIG1ldGhvZCB3aWxsIHRyaWdnZXIgdGhlIGVsZW1lbnQgdG8gdXBkYXRlXG4gICAqIGFnYWluIGFmdGVyIHRoaXMgdXBkYXRlIGN5Y2xlIGNvbXBsZXRlcy5cbiAgICpcbiAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKSB7fVxufVxuLy8gQXNzaWduZWQgaGVyZSB0byB3b3JrIGFyb3VuZCBhIGpzY29tcGlsZXIgYnVnIHdpdGggc3RhdGljIGZpZWxkc1xuLy8gd2hlbiBjb21waWxpbmcgdG8gRVM1LlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWNvbXBpbGVyL2lzc3Vlcy8zMTc3XG4oUmVhY3RpdmVFbGVtZW50IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW1xuICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdlbGVtZW50UHJvcGVydGllcycsIFJlYWN0aXZlRWxlbWVudClcbl0gPSBuZXcgTWFwKCk7XG4oUmVhY3RpdmVFbGVtZW50IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW1xuICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdmaW5hbGl6ZWQnLCBSZWFjdGl2ZUVsZW1lbnQpXG5dID0gbmV3IE1hcCgpO1xuXG4vLyBBcHBseSBwb2x5ZmlsbHMgaWYgYXZhaWxhYmxlXG5wb2x5ZmlsbFN1cHBvcnQ/Lih7UmVhY3RpdmVFbGVtZW50fSk7XG5cbi8vIERldiBtb2RlIHdhcm5pbmdzLi4uXG5pZiAoREVWX01PREUpIHtcbiAgLy8gRGVmYXVsdCB3YXJuaW5nIHNldC5cbiAgUmVhY3RpdmVFbGVtZW50LmVuYWJsZWRXYXJuaW5ncyA9IFtcbiAgICAnY2hhbmdlLWluLXVwZGF0ZScsXG4gICAgJ2FzeW5jLXBlcmZvcm0tdXBkYXRlJyxcbiAgXTtcbiAgY29uc3QgZW5zdXJlT3duV2FybmluZ3MgPSBmdW5jdGlvbiAoY3RvcjogdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkge1xuICAgIGlmIChcbiAgICAgICFjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2VuYWJsZWRXYXJuaW5ncycsIGN0b3IpKVxuICAgICkge1xuICAgICAgY3Rvci5lbmFibGVkV2FybmluZ3MgPSBjdG9yLmVuYWJsZWRXYXJuaW5ncyEuc2xpY2UoKTtcbiAgICB9XG4gIH07XG4gIFJlYWN0aXZlRWxlbWVudC5lbmFibGVXYXJuaW5nID0gZnVuY3Rpb24gKFxuICAgIHRoaXM6IHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQsXG4gICAgd2FybmluZzogV2FybmluZ0tpbmRcbiAgKSB7XG4gICAgZW5zdXJlT3duV2FybmluZ3ModGhpcyk7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWRXYXJuaW5ncyEuaW5jbHVkZXMod2FybmluZykpIHtcbiAgICAgIHRoaXMuZW5hYmxlZFdhcm5pbmdzIS5wdXNoKHdhcm5pbmcpO1xuICAgIH1cbiAgfTtcbiAgUmVhY3RpdmVFbGVtZW50LmRpc2FibGVXYXJuaW5nID0gZnVuY3Rpb24gKFxuICAgIHRoaXM6IHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQsXG4gICAgd2FybmluZzogV2FybmluZ0tpbmRcbiAgKSB7XG4gICAgZW5zdXJlT3duV2FybmluZ3ModGhpcyk7XG4gICAgY29uc3QgaSA9IHRoaXMuZW5hYmxlZFdhcm5pbmdzIS5pbmRleE9mKHdhcm5pbmcpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuZW5hYmxlZFdhcm5pbmdzIS5zcGxpY2UoaSwgMSk7XG4gICAgfVxuICB9O1xufVxuXG4vLyBJTVBPUlRBTlQ6IGRvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnR5IG5hbWUgb3IgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbi5cbi8vIFRoaXMgbGluZSB3aWxsIGJlIHVzZWQgaW4gcmVnZXhlcyB0byBzZWFyY2ggZm9yIFJlYWN0aXZlRWxlbWVudCB1c2FnZS5cbihnbG9iYWwucmVhY3RpdmVFbGVtZW50VmVyc2lvbnMgPz89IFtdKS5wdXNoKCcyLjAuNCcpO1xuaWYgKERFVl9NT0RFICYmIGdsb2JhbC5yZWFjdGl2ZUVsZW1lbnRWZXJzaW9ucy5sZW5ndGggPiAxKSB7XG4gIGlzc3VlV2FybmluZyEoXG4gICAgJ211bHRpcGxlLXZlcnNpb25zJyxcbiAgICBgTXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0IGxvYWRlZC4gTG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBgICtcbiAgICAgIGBpcyBub3QgcmVjb21tZW5kZWQuYFxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG4vLyBJTVBPUlRBTlQ6IHRoZXNlIGltcG9ydHMgbXVzdCBiZSB0eXBlLW9ubHlcbmltcG9ydCB0eXBlIHtEaXJlY3RpdmUsIERpcmVjdGl2ZVJlc3VsdCwgUGFydEluZm99IGZyb20gJy4vZGlyZWN0aXZlLmpzJztcbmltcG9ydCB0eXBlIHtUcnVzdGVkSFRNTCwgVHJ1c3RlZFR5cGVzV2luZG93fSBmcm9tICd0cnVzdGVkLXR5cGVzL2xpYic7XG5cbmNvbnN0IERFVl9NT0RFID0gdHJ1ZTtcbmNvbnN0IEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUyA9IHRydWU7XG5jb25zdCBFTkFCTEVfU0hBRFlET01fTk9QQVRDSCA9IHRydWU7XG5jb25zdCBOT0RFX01PREUgPSBmYWxzZTtcblxuLy8gQWxsb3dzIG1pbmlmaWVycyB0byByZW5hbWUgcmVmZXJlbmNlcyB0byBnbG9iYWxUaGlzXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzO1xuXG4vKipcbiAqIENvbnRhaW5zIHR5cGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHVuc3RhYmxlIGRlYnVnIEFQSS5cbiAqXG4gKiBFdmVyeXRoaW5nIGluIHRoaXMgQVBJIGlzIG5vdCBzdGFibGUgYW5kIG1heSBjaGFuZ2Ugb3IgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLFxuICogZXZlbiBvbiBwYXRjaCByZWxlYXNlcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbmV4cG9ydCBuYW1lc3BhY2UgTGl0VW5zdGFibGUge1xuICAvKipcbiAgICogV2hlbiBMaXQgaXMgcnVubmluZyBpbiBkZXYgbW9kZSBhbmQgYHdpbmRvdy5lbWl0TGl0RGVidWdMb2dFdmVudHNgIGlzIHRydWUsXG4gICAqIHdlIHdpbGwgZW1pdCAnbGl0LWRlYnVnJyBldmVudHMgdG8gd2luZG93LCB3aXRoIGxpdmUgZGV0YWlscyBhYm91dCB0aGUgdXBkYXRlIGFuZCByZW5kZXJcbiAgICogbGlmZWN5Y2xlLiBUaGVzZSBjYW4gYmUgdXNlZnVsIGZvciB3cml0aW5nIGRlYnVnIHRvb2xpbmcgYW5kIHZpc3VhbGl6YXRpb25zLlxuICAgKlxuICAgKiBQbGVhc2UgYmUgYXdhcmUgdGhhdCBydW5uaW5nIHdpdGggd2luZG93LmVtaXRMaXREZWJ1Z0xvZ0V2ZW50cyBoYXMgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQsXG4gICAqIG1ha2luZyBjZXJ0YWluIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm9ybWFsbHkgdmVyeSBjaGVhcCAobGlrZSBhIG5vLW9wIHJlbmRlcikgbXVjaCBzbG93ZXIsXG4gICAqIGJlY2F1c2Ugd2UgbXVzdCBjb3B5IGRhdGEgYW5kIGRpc3BhdGNoIGV2ZW50cy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG4gIGV4cG9ydCBuYW1lc3BhY2UgRGVidWdMb2cge1xuICAgIGV4cG9ydCB0eXBlIEVudHJ5ID1cbiAgICAgIHwgVGVtcGxhdGVQcmVwXG4gICAgICB8IFRlbXBsYXRlSW5zdGFudGlhdGVkXG4gICAgICB8IFRlbXBsYXRlSW5zdGFudGlhdGVkQW5kVXBkYXRlZFxuICAgICAgfCBUZW1wbGF0ZVVwZGF0aW5nXG4gICAgICB8IEJlZ2luUmVuZGVyXG4gICAgICB8IEVuZFJlbmRlclxuICAgICAgfCBDb21taXRQYXJ0RW50cnlcbiAgICAgIHwgU2V0UGFydFZhbHVlO1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVQcmVwIHtcbiAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBwcmVwJztcbiAgICAgIHRlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgICAgIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5O1xuICAgICAgY2xvbmFibGVUZW1wbGF0ZTogSFRNTFRlbXBsYXRlRWxlbWVudDtcbiAgICAgIHBhcnRzOiBUZW1wbGF0ZVBhcnRbXTtcbiAgICB9XG4gICAgZXhwb3J0IGludGVyZmFjZSBCZWdpblJlbmRlciB7XG4gICAgICBraW5kOiAnYmVnaW4gcmVuZGVyJztcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB2YWx1ZTogdW5rbm93bjtcbiAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50O1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIHBhcnQ6IENoaWxkUGFydCB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZXhwb3J0IGludGVyZmFjZSBFbmRSZW5kZXIge1xuICAgICAga2luZDogJ2VuZCByZW5kZXInO1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgICAgcGFydDogQ2hpbGRQYXJ0O1xuICAgIH1cbiAgICBleHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlSW5zdGFudGlhdGVkIHtcbiAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQnO1xuICAgICAgdGVtcGxhdGU6IFRlbXBsYXRlIHwgQ29tcGlsZWRUZW1wbGF0ZTtcbiAgICAgIGluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIGZyYWdtZW50OiBOb2RlO1xuICAgICAgcGFydHM6IEFycmF5PFBhcnQgfCB1bmRlZmluZWQ+O1xuICAgICAgdmFsdWVzOiB1bmtub3duW107XG4gICAgfVxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVJbnN0YW50aWF0ZWRBbmRVcGRhdGVkIHtcbiAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQgYW5kIHVwZGF0ZWQnO1xuICAgICAgdGVtcGxhdGU6IFRlbXBsYXRlIHwgQ29tcGlsZWRUZW1wbGF0ZTtcbiAgICAgIGluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIGZyYWdtZW50OiBOb2RlO1xuICAgICAgcGFydHM6IEFycmF5PFBhcnQgfCB1bmRlZmluZWQ+O1xuICAgICAgdmFsdWVzOiB1bmtub3duW107XG4gICAgfVxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVVcGRhdGluZyB7XG4gICAgICBraW5kOiAndGVtcGxhdGUgdXBkYXRpbmcnO1xuICAgICAgdGVtcGxhdGU6IFRlbXBsYXRlIHwgQ29tcGlsZWRUZW1wbGF0ZTtcbiAgICAgIGluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIHBhcnRzOiBBcnJheTxQYXJ0IHwgdW5kZWZpbmVkPjtcbiAgICAgIHZhbHVlczogdW5rbm93bltdO1xuICAgIH1cbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldFBhcnRWYWx1ZSB7XG4gICAgICBraW5kOiAnc2V0IHBhcnQnO1xuICAgICAgcGFydDogUGFydDtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgdmFsdWVJbmRleDogbnVtYmVyO1xuICAgICAgdmFsdWVzOiB1bmtub3duW107XG4gICAgICB0ZW1wbGF0ZUluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgIH1cblxuICAgIGV4cG9ydCB0eXBlIENvbW1pdFBhcnRFbnRyeSA9XG4gICAgICB8IENvbW1pdE5vdGhpbmdUb0NoaWxkRW50cnlcbiAgICAgIHwgQ29tbWl0VGV4dFxuICAgICAgfCBDb21taXROb2RlXG4gICAgICB8IENvbW1pdEF0dHJpYnV0ZVxuICAgICAgfCBDb21taXRQcm9wZXJ0eVxuICAgICAgfCBDb21taXRCb29sZWFuQXR0cmlidXRlXG4gICAgICB8IENvbW1pdEV2ZW50TGlzdGVuZXJcbiAgICAgIHwgQ29tbWl0VG9FbGVtZW50QmluZGluZztcblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0Tm90aGluZ1RvQ2hpbGRFbnRyeSB7XG4gICAgICBraW5kOiAnY29tbWl0IG5vdGhpbmcgdG8gY2hpbGQnO1xuICAgICAgc3RhcnQ6IENoaWxkTm9kZTtcbiAgICAgIGVuZDogQ2hpbGROb2RlIHwgbnVsbDtcbiAgICAgIHBhcmVudDogRGlzY29ubmVjdGFibGUgfCB1bmRlZmluZWQ7XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0VGV4dCB7XG4gICAgICBraW5kOiAnY29tbWl0IHRleHQnO1xuICAgICAgbm9kZTogVGV4dDtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbW1pdE5vZGUge1xuICAgICAga2luZDogJ2NvbW1pdCBub2RlJztcbiAgICAgIHN0YXJ0OiBOb2RlO1xuICAgICAgcGFyZW50OiBEaXNjb25uZWN0YWJsZSB8IHVuZGVmaW5lZDtcbiAgICAgIHZhbHVlOiBOb2RlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbW1pdEF0dHJpYnV0ZSB7XG4gICAgICBraW5kOiAnY29tbWl0IGF0dHJpYnV0ZSc7XG4gICAgICBlbGVtZW50OiBFbGVtZW50O1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgdmFsdWU6IHVua25vd247XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0UHJvcGVydHkge1xuICAgICAga2luZDogJ2NvbW1pdCBwcm9wZXJ0eSc7XG4gICAgICBlbGVtZW50OiBFbGVtZW50O1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgdmFsdWU6IHVua25vd247XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0Qm9vbGVhbkF0dHJpYnV0ZSB7XG4gICAgICBraW5kOiAnY29tbWl0IGJvb2xlYW4gYXR0cmlidXRlJztcbiAgICAgIGVsZW1lbnQ6IEVsZW1lbnQ7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICB2YWx1ZTogYm9vbGVhbjtcbiAgICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb21taXRFdmVudExpc3RlbmVyIHtcbiAgICAgIGtpbmQ6ICdjb21taXQgZXZlbnQgbGlzdGVuZXInO1xuICAgICAgZWxlbWVudDogRWxlbWVudDtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgb2xkTGlzdGVuZXI6IHVua25vd247XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgICAgLy8gVHJ1ZSBpZiB3ZSdyZSByZW1vdmluZyB0aGUgb2xkIGV2ZW50IGxpc3RlbmVyIChlLmcuIGJlY2F1c2Ugc2V0dGluZ3MgY2hhbmdlZCwgb3IgdmFsdWUgaXMgbm90aGluZylcbiAgICAgIHJlbW92ZUxpc3RlbmVyOiBib29sZWFuO1xuICAgICAgLy8gVHJ1ZSBpZiB3ZSdyZSBhZGRpbmcgYSBuZXcgZXZlbnQgbGlzdGVuZXIgKGUuZy4gYmVjYXVzZSBmaXJzdCByZW5kZXIsIG9yIHNldHRpbmdzIGNoYW5nZWQpXG4gICAgICBhZGRMaXN0ZW5lcjogYm9vbGVhbjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbW1pdFRvRWxlbWVudEJpbmRpbmcge1xuICAgICAga2luZDogJ2NvbW1pdCB0byBlbGVtZW50IGJpbmRpbmcnO1xuICAgICAgZWxlbWVudDogRWxlbWVudDtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIERlYnVnTG9nZ2luZ1dpbmRvdyB7XG4gIC8vIEV2ZW4gaW4gZGV2IG1vZGUsIHdlIGdlbmVyYWxseSBkb24ndCB3YW50IHRvIGVtaXQgdGhlc2UgZXZlbnRzLCBhcyB0aGF0J3NcbiAgLy8gYW5vdGhlciBsZXZlbCBvZiBjb3N0LCBzbyBvbmx5IGVtaXQgdGhlbSB3aGVuIERFVl9NT0RFIGlzIHRydWUgX2FuZF8gd2hlblxuICAvLyB3aW5kb3cuZW1pdExpdERlYnVnRXZlbnRzIGlzIHRydWUuXG4gIGVtaXRMaXREZWJ1Z0xvZ0V2ZW50cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVXNlZnVsIGZvciB2aXN1YWxpemluZyBhbmQgbG9nZ2luZyBpbnNpZ2h0cyBpbnRvIHdoYXQgdGhlIExpdCB0ZW1wbGF0ZSBzeXN0ZW0gaXMgZG9pbmcuXG4gKlxuICogQ29tcGlsZWQgb3V0IG9mIHByb2QgbW9kZSBidWlsZHMuXG4gKi9cbmNvbnN0IGRlYnVnTG9nRXZlbnQgPSBERVZfTU9ERVxuICA/IChldmVudDogTGl0VW5zdGFibGUuRGVidWdMb2cuRW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEVtaXQgPSAoZ2xvYmFsIGFzIHVua25vd24gYXMgRGVidWdMb2dnaW5nV2luZG93KVxuICAgICAgICAuZW1pdExpdERlYnVnTG9nRXZlbnRzO1xuICAgICAgaWYgKCFzaG91bGRFbWl0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGdsb2JhbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8TGl0VW5zdGFibGUuRGVidWdMb2cuRW50cnk+KCdsaXQtZGVidWcnLCB7XG4gICAgICAgICAgZGV0YWlsOiBldmVudCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICA6IHVuZGVmaW5lZDtcbi8vIFVzZWQgZm9yIGNvbm5lY3RpbmcgYmVnaW5SZW5kZXIgYW5kIGVuZFJlbmRlciBldmVudHMgd2hlbiB0aGVyZSBhcmUgbmVzdGVkXG4vLyByZW5kZXJzIHdoZW4gZXJyb3JzIGFyZSB0aHJvd24gcHJldmVudGluZyBhbiBlbmRSZW5kZXIgZXZlbnQgZnJvbSBiZWluZ1xuLy8gY2FsbGVkLlxubGV0IGRlYnVnTG9nUmVuZGVySWQgPSAwO1xuXG5sZXQgaXNzdWVXYXJuaW5nOiAoY29kZTogc3RyaW5nLCB3YXJuaW5nOiBzdHJpbmcpID0+IHZvaWQ7XG5cbmlmIChERVZfTU9ERSkge1xuICBnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MgPz89IG5ldyBTZXQoKTtcblxuICAvLyBJc3N1ZSBhIHdhcm5pbmcsIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeS5cbiAgaXNzdWVXYXJuaW5nID0gKGNvZGU6IHN0cmluZywgd2FybmluZzogc3RyaW5nKSA9PiB7XG4gICAgd2FybmluZyArPSBjb2RlXG4gICAgICA/IGAgU2VlIGh0dHBzOi8vbGl0LmRldi9tc2cvJHtjb2RlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gXG4gICAgICA6ICcnO1xuICAgIGlmICghZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzIS5oYXMod2FybmluZykpIHtcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgIGdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncyEuYWRkKHdhcm5pbmcpO1xuICAgIH1cbiAgfTtcblxuICBpc3N1ZVdhcm5pbmcoXG4gICAgJ2Rldi1tb2RlJyxcbiAgICBgTGl0IGlzIGluIGRldiBtb2RlLiBOb3QgcmVjb21tZW5kZWQgZm9yIHByb2R1Y3Rpb24hYFxuICApO1xufVxuXG5jb25zdCB3cmFwID1cbiAgRU5BQkxFX1NIQURZRE9NX05PUEFUQ0ggJiZcbiAgZ2xvYmFsLlNoYWR5RE9NPy5pblVzZSAmJlxuICBnbG9iYWwuU2hhZHlET00/Lm5vUGF0Y2ggPT09IHRydWVcbiAgICA/IChnbG9iYWwuU2hhZHlET00hLndyYXAgYXMgPFQgZXh0ZW5kcyBOb2RlPihub2RlOiBUKSA9PiBUKVxuICAgIDogPFQgZXh0ZW5kcyBOb2RlPihub2RlOiBUKSA9PiBub2RlO1xuXG5jb25zdCB0cnVzdGVkVHlwZXMgPSAoZ2xvYmFsIGFzIHVua25vd24gYXMgVHJ1c3RlZFR5cGVzV2luZG93KS50cnVzdGVkVHlwZXM7XG5cbi8qKlxuICogT3VyIFRydXN0ZWRUeXBlUG9saWN5IGZvciBIVE1MIHdoaWNoIGlzIGRlY2xhcmVkIHVzaW5nIHRoZSBodG1sIHRlbXBsYXRlXG4gKiB0YWcgZnVuY3Rpb24uXG4gKlxuICogVGhhdCBIVE1MIGlzIGEgZGV2ZWxvcGVyLWF1dGhvcmVkIGNvbnN0YW50LCBhbmQgaXMgcGFyc2VkIHdpdGggaW5uZXJIVE1MXG4gKiBiZWZvcmUgYW55IHVudHJ1c3RlZCBleHByZXNzaW9ucyBoYXZlIGJlZW4gbWl4ZWQgaW4uIFRoZXJlZm9yIGl0IGlzXG4gKiBjb25zaWRlcmVkIHNhZmUgYnkgY29uc3RydWN0aW9uLlxuICovXG5jb25zdCBwb2xpY3kgPSB0cnVzdGVkVHlwZXNcbiAgPyB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KCdsaXQtaHRtbCcsIHtcbiAgICAgIGNyZWF0ZUhUTUw6IChzKSA9PiBzLFxuICAgIH0pXG4gIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFVzZWQgdG8gc2FuaXRpemUgYW55IHZhbHVlIGJlZm9yZSBpdCBpcyB3cml0dGVuIGludG8gdGhlIERPTS4gVGhpcyBjYW4gYmVcbiAqIHVzZWQgdG8gaW1wbGVtZW50IGEgc2VjdXJpdHkgcG9saWN5IG9mIGFsbG93ZWQgYW5kIGRpc2FsbG93ZWQgdmFsdWVzIGluXG4gKiBvcmRlciB0byBwcmV2ZW50IFhTUyBhdHRhY2tzLlxuICpcbiAqIE9uZSB3YXkgb2YgdXNpbmcgdGhpcyBjYWxsYmFjayB3b3VsZCBiZSB0byBjaGVjayBhdHRyaWJ1dGVzIGFuZCBwcm9wZXJ0aWVzXG4gKiBhZ2FpbnN0IGEgbGlzdCBvZiBoaWdoIHJpc2sgZmllbGRzLCBhbmQgcmVxdWlyZSB0aGF0IHZhbHVlcyB3cml0dGVuIHRvIHN1Y2hcbiAqIGZpZWxkcyBiZSBpbnN0YW5jZXMgb2YgYSBjbGFzcyB3aGljaCBpcyBzYWZlIGJ5IGNvbnN0cnVjdGlvbi4gQ2xvc3VyZSdzIFNhZmVcbiAqIEhUTUwgVHlwZXMgaXMgb25lIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgdGVjaG5pcXVlIChcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvc2FmZS1odG1sLXR5cGVzL2Jsb2IvbWFzdGVyL2RvYy9zYWZlaHRtbC10eXBlcy5tZCkuXG4gKiBUaGUgVHJ1c3RlZFR5cGVzIHBvbHlmaWxsIGluIEFQSS1vbmx5IG1vZGUgY291bGQgYWxzbyBiZSB1c2VkIGFzIGEgYmFzaXNcbiAqIGZvciB0aGlzIHRlY2huaXF1ZSAoaHR0cHM6Ly9naXRodWIuY29tL1dJQ0cvdHJ1c3RlZC10eXBlcykuXG4gKlxuICogQHBhcmFtIG5vZGUgVGhlIEhUTUwgbm9kZSAodXN1YWxseSBlaXRoZXIgYSAjdGV4dCBub2RlIG9yIGFuIEVsZW1lbnQpIHRoYXRcbiAqICAgICBpcyBiZWluZyB3cml0dGVuIHRvLiBOb3RlIHRoYXQgdGhpcyBpcyBqdXN0IGFuIGV4ZW1wbGFyIG5vZGUsIHRoZSB3cml0ZVxuICogICAgIG1heSB0YWtlIHBsYWNlIGFnYWluc3QgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgc2FtZSBjbGFzcyBvZiBub2RlLlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIG9yIHByb3BlcnR5IChmb3IgZXhhbXBsZSwgJ2hyZWYnKS5cbiAqIEBwYXJhbSB0eXBlIEluZGljYXRlcyB3aGV0aGVyIHRoZSB3cml0ZSB0aGF0J3MgYWJvdXQgdG8gYmUgcGVyZm9ybWVkIHdpbGxcbiAqICAgICBiZSB0byBhIHByb3BlcnR5IG9yIGEgbm9kZS5cbiAqIEByZXR1cm4gQSBmdW5jdGlvbiB0aGF0IHdpbGwgc2FuaXRpemUgdGhpcyBjbGFzcyBvZiB3cml0ZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFNhbml0aXplckZhY3RvcnkgPSAoXG4gIG5vZGU6IE5vZGUsXG4gIG5hbWU6IHN0cmluZyxcbiAgdHlwZTogJ3Byb3BlcnR5JyB8ICdhdHRyaWJ1dGUnXG4pID0+IFZhbHVlU2FuaXRpemVyO1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gd2hpY2ggY2FuIHNhbml0aXplIHZhbHVlcyB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byBhIHNwZWNpZmljIGtpbmRcbiAqIG9mIERPTSBzaW5rLlxuICpcbiAqIFNlZSBTYW5pdGl6ZXJGYWN0b3J5LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2FuaXRpemUuIFdpbGwgYmUgdGhlIGFjdHVhbCB2YWx1ZSBwYXNzZWQgaW50b1xuICogICAgIHRoZSBsaXQtaHRtbCB0ZW1wbGF0ZSBsaXRlcmFsLCBzbyB0aGlzIGNvdWxkIGJlIG9mIGFueSB0eXBlLlxuICogQHJldHVybiBUaGUgdmFsdWUgdG8gd3JpdGUgdG8gdGhlIERPTS4gVXN1YWxseSB0aGUgc2FtZSBhcyB0aGUgaW5wdXQgdmFsdWUsXG4gKiAgICAgdW5sZXNzIHNhbml0aXphdGlvbiBpcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFZhbHVlU2FuaXRpemVyID0gKHZhbHVlOiB1bmtub3duKSA9PiB1bmtub3duO1xuXG5jb25zdCBpZGVudGl0eUZ1bmN0aW9uOiBWYWx1ZVNhbml0aXplciA9ICh2YWx1ZTogdW5rbm93bikgPT4gdmFsdWU7XG5jb25zdCBub29wU2FuaXRpemVyOiBTYW5pdGl6ZXJGYWN0b3J5ID0gKFxuICBfbm9kZTogTm9kZSxcbiAgX25hbWU6IHN0cmluZyxcbiAgX3R5cGU6ICdwcm9wZXJ0eScgfCAnYXR0cmlidXRlJ1xuKSA9PiBpZGVudGl0eUZ1bmN0aW9uO1xuXG4vKiogU2V0cyB0aGUgZ2xvYmFsIHNhbml0aXplciBmYWN0b3J5LiAqL1xuY29uc3Qgc2V0U2FuaXRpemVyID0gKG5ld1Nhbml0aXplcjogU2FuaXRpemVyRmFjdG9yeSkgPT4ge1xuICBpZiAoIUVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoc2FuaXRpemVyRmFjdG9yeUludGVybmFsICE9PSBub29wU2FuaXRpemVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEF0dGVtcHRlZCB0byBvdmVyd3JpdGUgZXhpc3RpbmcgbGl0LWh0bWwgc2VjdXJpdHkgcG9saWN5LmAgK1xuICAgICAgICBgIHNldFNhbml0aXplRE9NVmFsdWVGYWN0b3J5IHNob3VsZCBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlLmBcbiAgICApO1xuICB9XG4gIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCA9IG5ld1Nhbml0aXplcjtcbn07XG5cbi8qKlxuICogT25seSB1c2VkIGluIGludGVybmFsIHRlc3RzLCBub3QgYSBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLlxuICovXG5jb25zdCBfdGVzdE9ubHlDbGVhclNhbml0aXplckZhY3RvcnlEb05vdENhbGxPckVsc2UgPSAoKSA9PiB7XG4gIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCA9IG5vb3BTYW5pdGl6ZXI7XG59O1xuXG5jb25zdCBjcmVhdGVTYW5pdGl6ZXI6IFNhbml0aXplckZhY3RvcnkgPSAobm9kZSwgbmFtZSwgdHlwZSkgPT4ge1xuICByZXR1cm4gc2FuaXRpemVyRmFjdG9yeUludGVybmFsKG5vZGUsIG5hbWUsIHR5cGUpO1xufTtcblxuLy8gQWRkZWQgdG8gYW4gYXR0cmlidXRlIG5hbWUgdG8gbWFyayB0aGUgYXR0cmlidXRlIGFzIGJvdW5kIHNvIHdlIGNhbiBmaW5kXG4vLyBpdCBlYXNpbHkuXG5jb25zdCBib3VuZEF0dHJpYnV0ZVN1ZmZpeCA9ICckbGl0JCc7XG5cbi8vIFRoaXMgbWFya2VyIGlzIHVzZWQgaW4gbWFueSBzeW50YWN0aWMgcG9zaXRpb25zIGluIEhUTUwsIHNvIGl0IG11c3QgYmVcbi8vIGEgdmFsaWQgZWxlbWVudCBuYW1lIGFuZCBhdHRyaWJ1dGUgbmFtZS4gV2UgZG9uJ3Qgc3VwcG9ydCBkeW5hbWljIG5hbWVzICh5ZXQpXG4vLyBidXQgdGhpcyBhdCBsZWFzdCBlbnN1cmVzIHRoYXQgdGhlIHBhcnNlIHRyZWUgaXMgY2xvc2VyIHRvIHRoZSB0ZW1wbGF0ZVxuLy8gaW50ZW50aW9uLlxuY29uc3QgbWFya2VyID0gYGxpdCQke01hdGgucmFuZG9tKCkudG9GaXhlZCg5KS5zbGljZSgyKX0kYDtcblxuLy8gU3RyaW5nIHVzZWQgdG8gdGVsbCBpZiBhIGNvbW1lbnQgaXMgYSBtYXJrZXIgY29tbWVudFxuY29uc3QgbWFya2VyTWF0Y2ggPSAnPycgKyBtYXJrZXI7XG5cbi8vIFRleHQgdXNlZCB0byBpbnNlcnQgYSBjb21tZW50IG1hcmtlciBub2RlLiBXZSB1c2UgcHJvY2Vzc2luZyBpbnN0cnVjdGlvblxuLy8gc3ludGF4IGJlY2F1c2UgaXQncyBzbGlnaHRseSBzbWFsbGVyLCBidXQgcGFyc2VzIGFzIGEgY29tbWVudCBub2RlLlxuY29uc3Qgbm9kZU1hcmtlciA9IGA8JHttYXJrZXJNYXRjaH0+YDtcblxuY29uc3QgZCA9XG4gIE5PREVfTU9ERSAmJiBnbG9iYWwuZG9jdW1lbnQgPT09IHVuZGVmaW5lZFxuICAgID8gKHtcbiAgICAgICAgY3JlYXRlVHJlZVdhbGtlcigpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH0sXG4gICAgICB9IGFzIHVua25vd24gYXMgRG9jdW1lbnQpXG4gICAgOiBkb2N1bWVudDtcblxuLy8gQ3JlYXRlcyBhIGR5bmFtaWMgbWFya2VyLiBXZSBuZXZlciBoYXZlIHRvIHNlYXJjaCBmb3IgdGhlc2UgaW4gdGhlIERPTS5cbmNvbnN0IGNyZWF0ZU1hcmtlciA9ICgpID0+IGQuY3JlYXRlQ29tbWVudCgnJyk7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGVvZi1vcGVyYXRvclxudHlwZSBQcmltaXRpdmUgPSBudWxsIHwgdW5kZWZpbmVkIHwgYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZyB8IHN5bWJvbCB8IGJpZ2ludDtcbmNvbnN0IGlzUHJpbWl0aXZlID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJpbWl0aXZlID0+XG4gIHZhbHVlID09PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgIT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlICE9ICdmdW5jdGlvbicpO1xuY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5jb25zdCBpc0l0ZXJhYmxlID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgSXRlcmFibGU8dW5rbm93bj4gPT5cbiAgaXNBcnJheSh2YWx1ZSkgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgdHlwZW9mICh2YWx1ZSBhcyBhbnkpPy5bU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcblxuY29uc3QgU1BBQ0VfQ0hBUiA9IGBbIFxcdFxcblxcZlxccl1gO1xuY29uc3QgQVRUUl9WQUxVRV9DSEFSID0gYFteIFxcdFxcblxcZlxcclwiJ1xcYDw+PV1gO1xuY29uc3QgTkFNRV9DSEFSID0gYFteXFxcXHNcIic+PS9dYDtcblxuLy8gVGhlc2UgcmVnZXhlcyByZXByZXNlbnQgdGhlIGZpdmUgcGFyc2luZyBzdGF0ZXMgdGhhdCB3ZSBjYXJlIGFib3V0IGluIHRoZVxuLy8gVGVtcGxhdGUncyBIVE1MIHNjYW5uZXIuIFRoZXkgbWF0Y2ggdGhlICplbmQqIG9mIHRoZSBzdGF0ZSB0aGV5J3JlIG5hbWVkXG4vLyBhZnRlci5cbi8vIERlcGVuZGluZyBvbiB0aGUgbWF0Y2gsIHdlIHRyYW5zaXRpb24gdG8gYSBuZXcgc3RhdGUuIElmIHRoZXJlJ3Mgbm8gbWF0Y2gsXG4vLyB3ZSBzdGF5IGluIHRoZSBzYW1lIHN0YXRlLlxuLy8gTm90ZSB0aGF0IHRoZSByZWdleGVzIGFyZSBzdGF0ZWZ1bC4gV2UgdXRpbGl6ZSBsYXN0SW5kZXggYW5kIHN5bmMgaXRcbi8vIGFjcm9zcyB0aGUgbXVsdGlwbGUgcmVnZXhlcyB1c2VkLiBJbiBhZGRpdGlvbiB0byB0aGUgZml2ZSByZWdleGVzIGJlbG93XG4vLyB3ZSBhbHNvIGR5bmFtaWNhbGx5IGNyZWF0ZSBhIHJlZ2V4IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVuZCB0YWdzIGZvciByYXdcbi8vIHRleHQgZWxlbWVudHMuXG5cbi8qKlxuICogRW5kIG9mIHRleHQgaXM6IGA8YCBmb2xsb3dlZCBieTpcbiAqICAgKGNvbW1lbnQgc3RhcnQpIG9yICh0YWcpIG9yIChkeW5hbWljIHRhZyBiaW5kaW5nKVxuICovXG5jb25zdCB0ZXh0RW5kUmVnZXggPSAvPCg/OighLS18XFwvW15hLXpBLVpdKXwoXFwvP1thLXpBLVpdW14+XFxzXSopfChcXC8/JCkpL2c7XG5jb25zdCBDT01NRU5UX1NUQVJUID0gMTtcbmNvbnN0IFRBR19OQU1FID0gMjtcbmNvbnN0IERZTkFNSUNfVEFHX05BTUUgPSAzO1xuXG5jb25zdCBjb21tZW50RW5kUmVnZXggPSAvLS0+L2c7XG4vKipcbiAqIENvbW1lbnRzIG5vdCBzdGFydGVkIHdpdGggPCEtLSwgbGlrZSA8L3ssIGNhbiBiZSBlbmRlZCBieSBhIHNpbmdsZSBgPmBcbiAqL1xuY29uc3QgY29tbWVudDJFbmRSZWdleCA9IC8+L2c7XG5cbi8qKlxuICogVGhlIHRhZ0VuZCByZWdleCBtYXRjaGVzIHRoZSBlbmQgb2YgdGhlIFwiaW5zaWRlIGFuIG9wZW5pbmdcIiB0YWcgc3ludGF4XG4gKiBwb3NpdGlvbi4gSXQgZWl0aGVyIG1hdGNoZXMgYSBgPmAsIGFuIGF0dHJpYnV0ZS1saWtlIHNlcXVlbmNlLCBvciB0aGUgZW5kXG4gKiBvZiB0aGUgc3RyaW5nIGFmdGVyIGEgc3BhY2UgKGF0dHJpYnV0ZS1uYW1lIHBvc2l0aW9uIGVuZGluZykuXG4gKlxuICogU2VlIGF0dHJpYnV0ZXMgaW4gdGhlIEhUTUwgc3BlYzpcbiAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zeW50YXguaHRtbCNlbGVtZW50cy1hdHRyaWJ1dGVzXG4gKlxuICogXCIgXFx0XFxuXFxmXFxyXCIgYXJlIEhUTUwgc3BhY2UgY2hhcmFjdGVyczpcbiAqIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNhc2NpaS13aGl0ZXNwYWNlXG4gKlxuICogU28gYW4gYXR0cmlidXRlIGlzOlxuICogICogVGhlIG5hbWU6IGFueSBjaGFyYWN0ZXIgZXhjZXB0IGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIsIChcIiksICgnKSwgXCI+XCIsXG4gKiAgICBcIj1cIiwgb3IgXCIvXCIuIE5vdGU6IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIEhUTUwgc3BlYyB3aGljaCBhbHNvIGV4Y2x1ZGVzIGNvbnRyb2wgY2hhcmFjdGVycy5cbiAqICAqIEZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBzcGFjZSBjaGFyYWN0ZXJzXG4gKiAgKiBGb2xsb3dlZCBieSBcIj1cIlxuICogICogRm9sbG93ZWQgYnkgemVybyBvciBtb3JlIHNwYWNlIGNoYXJhY3RlcnNcbiAqICAqIEZvbGxvd2VkIGJ5OlxuICogICAgKiBBbnkgY2hhcmFjdGVyIGV4Y2VwdCBzcGFjZSwgKCcpLCAoXCIpLCBcIjxcIiwgXCI+XCIsIFwiPVwiLCAoYCksIG9yXG4gKiAgICAqIChcIikgdGhlbiBhbnkgbm9uLShcIiksIG9yXG4gKiAgICAqICgnKSB0aGVuIGFueSBub24tKCcpXG4gKi9cbmNvbnN0IHRhZ0VuZFJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgYD58JHtTUEFDRV9DSEFSfSg/Oigke05BTUVfQ0hBUn0rKSgke1NQQUNFX0NIQVJ9Kj0ke1NQQUNFX0NIQVJ9Kig/OiR7QVRUUl9WQUxVRV9DSEFSfXwoXCJ8Jyl8KSl8JClgLFxuICAnZydcbik7XG5jb25zdCBFTlRJUkVfTUFUQ0ggPSAwO1xuY29uc3QgQVRUUklCVVRFX05BTUUgPSAxO1xuY29uc3QgU1BBQ0VTX0FORF9FUVVBTFMgPSAyO1xuY29uc3QgUVVPVEVfQ0hBUiA9IDM7XG5cbmNvbnN0IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4ID0gLycvZztcbmNvbnN0IGRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4ID0gL1wiL2c7XG4vKipcbiAqIE1hdGNoZXMgdGhlIHJhdyB0ZXh0IGVsZW1lbnRzLlxuICpcbiAqIENvbW1lbnRzIGFyZSBub3QgcGFyc2VkIHdpdGhpbiByYXcgdGV4dCBlbGVtZW50cywgc28gd2UgbmVlZCB0byBzZWFyY2ggdGhlaXJcbiAqIHRleHQgY29udGVudCBmb3IgbWFya2VyIHN0cmluZ3MuXG4gKi9cbmNvbnN0IHJhd1RleHRFbGVtZW50ID0gL14oPzpzY3JpcHR8c3R5bGV8dGV4dGFyZWF8dGl0bGUpJC9pO1xuXG4vKiogVGVtcGxhdGVSZXN1bHQgdHlwZXMgKi9cbmNvbnN0IEhUTUxfUkVTVUxUID0gMTtcbmNvbnN0IFNWR19SRVNVTFQgPSAyO1xuY29uc3QgTUFUSE1MX1JFU1VMVCA9IDM7XG5cbnR5cGUgUmVzdWx0VHlwZSA9IHR5cGVvZiBIVE1MX1JFU1VMVCB8IHR5cGVvZiBTVkdfUkVTVUxUIHwgdHlwZW9mIE1BVEhNTF9SRVNVTFQ7XG5cbi8vIFRlbXBsYXRlUGFydCB0eXBlc1xuLy8gSU1QT1JUQU5UOiB0aGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gUGFydFR5cGVcbmNvbnN0IEFUVFJJQlVURV9QQVJUID0gMTtcbmNvbnN0IENISUxEX1BBUlQgPSAyO1xuY29uc3QgUFJPUEVSVFlfUEFSVCA9IDM7XG5jb25zdCBCT09MRUFOX0FUVFJJQlVURV9QQVJUID0gNDtcbmNvbnN0IEVWRU5UX1BBUlQgPSA1O1xuY29uc3QgRUxFTUVOVF9QQVJUID0gNjtcbmNvbnN0IENPTU1FTlRfUEFSVCA9IDc7XG5cbi8qKlxuICogVGhlIHJldHVybiB0eXBlIG9mIHRoZSB0ZW1wbGF0ZSB0YWcgZnVuY3Rpb25zLCB7QGxpbmtjb2RlIGh0bWx9IGFuZFxuICoge0BsaW5rY29kZSBzdmd9IHdoZW4gaXQgaGFzbid0IGJlZW4gY29tcGlsZWQgYnkgQGxpdC1sYWJzL2NvbXBpbGVyLlxuICpcbiAqIEEgYFRlbXBsYXRlUmVzdWx0YCBvYmplY3QgaG9sZHMgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRlbXBsYXRlXG4gKiBleHByZXNzaW9uIHJlcXVpcmVkIHRvIHJlbmRlciBpdDogdGhlIHRlbXBsYXRlIHN0cmluZ3MsIGV4cHJlc3Npb24gdmFsdWVzLFxuICogYW5kIHR5cGUgb2YgdGVtcGxhdGUgKGh0bWwgb3Igc3ZnKS5cbiAqXG4gKiBgVGVtcGxhdGVSZXN1bHRgIG9iamVjdHMgZG8gbm90IGNyZWF0ZSBhbnkgRE9NIG9uIHRoZWlyIG93bi4gVG8gY3JlYXRlIG9yXG4gKiB1cGRhdGUgRE9NIHlvdSBuZWVkIHRvIHJlbmRlciB0aGUgYFRlbXBsYXRlUmVzdWx0YC4gU2VlXG4gKiBbUmVuZGVyaW5nXShodHRwczovL2xpdC5kZXYvZG9jcy9jb21wb25lbnRzL3JlbmRlcmluZykgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICovXG5leHBvcnQgdHlwZSBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQ8VCBleHRlbmRzIFJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlPiA9IHtcbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgWydfJGxpdFR5cGUkJ106IFQ7XG4gIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5O1xuICB2YWx1ZXM6IHVua25vd25bXTtcbn07XG5cbi8qKlxuICogVGhpcyBpcyBhIHRlbXBsYXRlIHJlc3VsdCB0aGF0IG1heSBiZSBlaXRoZXIgdW5jb21waWxlZCBvciBjb21waWxlZC5cbiAqXG4gKiBJbiB0aGUgZnV0dXJlLCBUZW1wbGF0ZVJlc3VsdCB3aWxsIGJlIHRoaXMgdHlwZS4gSWYgeW91IHdhbnQgdG8gZXhwbGljaXRseVxuICogbm90ZSB0aGF0IGEgdGVtcGxhdGUgcmVzdWx0IGlzIHBvdGVudGlhbGx5IGNvbXBpbGVkLCB5b3UgY2FuIHJlZmVyZW5jZSB0aGlzXG4gKiB0eXBlIGFuZCBpdCB3aWxsIGNvbnRpbnVlIHRvIGJlaGF2ZSB0aGUgc2FtZSB0aHJvdWdoIHRoZSBuZXh0IG1ham9yIHZlcnNpb25cbiAqIG9mIExpdC4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBjb2RlIHRoYXQgd2FudHMgdG8gcHJlcGFyZSBmb3IgdGhlIG5leHRcbiAqIG1ham9yIHZlcnNpb24gb2YgTGl0LlxuICovXG5leHBvcnQgdHlwZSBNYXliZUNvbXBpbGVkVGVtcGxhdGVSZXN1bHQ8VCBleHRlbmRzIFJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlPiA9XG4gIHwgVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0PFQ+XG4gIHwgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdDtcblxuLyoqXG4gKiBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHRlbXBsYXRlIHRhZyBmdW5jdGlvbnMsIHtAbGlua2NvZGUgaHRtbH0gYW5kXG4gKiB7QGxpbmtjb2RlIHN2Z30uXG4gKlxuICogQSBgVGVtcGxhdGVSZXN1bHRgIG9iamVjdCBob2xkcyBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgdGVtcGxhdGVcbiAqIGV4cHJlc3Npb24gcmVxdWlyZWQgdG8gcmVuZGVyIGl0OiB0aGUgdGVtcGxhdGUgc3RyaW5ncywgZXhwcmVzc2lvbiB2YWx1ZXMsXG4gKiBhbmQgdHlwZSBvZiB0ZW1wbGF0ZSAoaHRtbCBvciBzdmcpLlxuICpcbiAqIGBUZW1wbGF0ZVJlc3VsdGAgb2JqZWN0cyBkbyBub3QgY3JlYXRlIGFueSBET00gb24gdGhlaXIgb3duLiBUbyBjcmVhdGUgb3JcbiAqIHVwZGF0ZSBET00geW91IG5lZWQgdG8gcmVuZGVyIHRoZSBgVGVtcGxhdGVSZXN1bHRgLiBTZWVcbiAqIFtSZW5kZXJpbmddKGh0dHBzOi8vbGl0LmRldi9kb2NzL2NvbXBvbmVudHMvcmVuZGVyaW5nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBJbiBMaXQgNCwgdGhpcyB0eXBlIHdpbGwgYmUgYW4gYWxpYXMgb2ZcbiAqIE1heWJlQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCwgc28gdGhhdCBjb2RlIHdpbGwgZ2V0IHR5cGUgZXJyb3JzIGlmIGl0IGFzc3VtZXNcbiAqIHRoYXQgTGl0IHRlbXBsYXRlcyBhcmUgbm90IGNvbXBpbGVkLiBXaGVuIGRlbGliZXJhdGVseSB3b3JraW5nIHdpdGggb25seVxuICogb25lLCB1c2UgZWl0aGVyIHtAbGlua2NvZGUgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdH0gb3JcbiAqIHtAbGlua2NvZGUgVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0fSBleHBsaWNpdGx5LlxuICovXG5leHBvcnQgdHlwZSBUZW1wbGF0ZVJlc3VsdDxUIGV4dGVuZHMgUmVzdWx0VHlwZSA9IFJlc3VsdFR5cGU+ID1cbiAgVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0PFQ+O1xuXG5leHBvcnQgdHlwZSBIVE1MVGVtcGxhdGVSZXN1bHQgPSBUZW1wbGF0ZVJlc3VsdDx0eXBlb2YgSFRNTF9SRVNVTFQ+O1xuXG5leHBvcnQgdHlwZSBTVkdUZW1wbGF0ZVJlc3VsdCA9IFRlbXBsYXRlUmVzdWx0PHR5cGVvZiBTVkdfUkVTVUxUPjtcblxuZXhwb3J0IHR5cGUgTWF0aE1MVGVtcGxhdGVSZXN1bHQgPSBUZW1wbGF0ZVJlc3VsdDx0eXBlb2YgTUFUSE1MX1JFU1VMVD47XG5cbi8qKlxuICogQSBUZW1wbGF0ZVJlc3VsdCB0aGF0IGhhcyBiZWVuIGNvbXBpbGVkIGJ5IEBsaXQtbGFicy9jb21waWxlciwgc2tpcHBpbmcgdGhlXG4gKiBwcmVwYXJlIHN0ZXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCB7XG4gIC8vIFRoaXMgaXMgYSBmYWN0b3J5IGluIG9yZGVyIHRvIG1ha2UgdGVtcGxhdGUgaW5pdGlhbGl6YXRpb24gbGF6eVxuICAvLyBhbmQgYWxsb3cgU2hhZHlSZW5kZXJPcHRpb25zIHNjb3BlIHRvIGJlIHBhc3NlZCBpbi5cbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgWydfJGxpdFR5cGUkJ106IENvbXBpbGVkVGVtcGxhdGU7XG4gIHZhbHVlczogdW5rbm93bltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVkVGVtcGxhdGUgZXh0ZW5kcyBPbWl0PFRlbXBsYXRlLCAnZWwnPiB7XG4gIC8vIGVsIGlzIG92ZXJyaWRkZW4gdG8gYmUgb3B0aW9uYWwuIFdlIGluaXRpYWxpemUgaXQgb24gZmlyc3QgcmVuZGVyXG4gIGVsPzogSFRNTFRlbXBsYXRlRWxlbWVudDtcblxuICAvLyBUaGUgcHJlcGFyZWQgSFRNTCBzdHJpbmcgdG8gY3JlYXRlIGEgdGVtcGxhdGUgZWxlbWVudCBmcm9tLlxuICAvLyBUaGUgdHlwZSBpcyBhIFRlbXBsYXRlU3RyaW5nc0FycmF5IHRvIGd1YXJhbnRlZSB0aGF0IHRoZSB2YWx1ZSBjYW1lIGZyb21cbiAgLy8gc291cmNlIGNvZGUsIHByZXZlbnRpbmcgYSBKU09OIGluamVjdGlvbiBhdHRhY2suXG4gIGg6IFRlbXBsYXRlU3RyaW5nc0FycmF5O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHRlbXBsYXRlIGxpdGVyYWwgdGFnIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIFRlbXBsYXRlUmVzdWx0IHdpdGhcbiAqIHRoZSBnaXZlbiByZXN1bHQgdHlwZS5cbiAqL1xuY29uc3QgdGFnID1cbiAgPFQgZXh0ZW5kcyBSZXN1bHRUeXBlPih0eXBlOiBUKSA9PlxuICAoc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksIC4uLnZhbHVlczogdW5rbm93bltdKTogVGVtcGxhdGVSZXN1bHQ8VD4gPT4ge1xuICAgIC8vIFdhcm4gYWdhaW5zdCB0ZW1wbGF0ZXMgb2N0YWwgZXNjYXBlIHNlcXVlbmNlc1xuICAgIC8vIFdlIGRvIHRoaXMgaGVyZSByYXRoZXIgdGhhbiBpbiByZW5kZXIgc28gdGhhdCB0aGUgd2FybmluZyBpcyBjbG9zZXIgdG8gdGhlXG4gICAgLy8gdGVtcGxhdGUgZGVmaW5pdGlvbi5cbiAgICBpZiAoREVWX01PREUgJiYgc3RyaW5ncy5zb21lKChzKSA9PiBzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdTb21lIHRlbXBsYXRlIHN0cmluZ3MgYXJlIHVuZGVmaW5lZC5cXG4nICtcbiAgICAgICAgICAnVGhpcyBpcyBwcm9iYWJseSBjYXVzZWQgYnkgaWxsZWdhbCBvY3RhbCBlc2NhcGUgc2VxdWVuY2VzLidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgLy8gSW1wb3J0IHN0YXRpYy1odG1sLmpzIHJlc3VsdHMgaW4gYSBjaXJjdWxhciBkZXBlbmRlbmN5IHdoaWNoIGczIGRvZXNuJ3RcbiAgICAgIC8vIGhhbmRsZS4gSW5zdGVhZCB3ZSBrbm93IHRoYXQgc3RhdGljIHZhbHVlcyBtdXN0IGhhdmUgdGhlIGZpZWxkXG4gICAgICAvLyBgXyRsaXRTdGF0aWMkYC5cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWVzLnNvbWUoKHZhbCkgPT4gKHZhbCBhcyB7XyRsaXRTdGF0aWMkOiB1bmtub3dufSk/LlsnXyRsaXRTdGF0aWMkJ10pXG4gICAgICApIHtcbiAgICAgICAgaXNzdWVXYXJuaW5nKFxuICAgICAgICAgICcnLFxuICAgICAgICAgIGBTdGF0aWMgdmFsdWVzICdsaXRlcmFsJyBvciAndW5zYWZlU3RhdGljJyBjYW5ub3QgYmUgdXNlZCBhcyB2YWx1ZXMgdG8gbm9uLXN0YXRpYyB0ZW1wbGF0ZXMuXFxuYCArXG4gICAgICAgICAgICBgUGxlYXNlIHVzZSB0aGUgc3RhdGljICdodG1sJyB0YWcgZnVuY3Rpb24uIFNlZSBodHRwczovL2xpdC5kZXYvZG9jcy90ZW1wbGF0ZXMvZXhwcmVzc2lvbnMvI3N0YXRpYy1leHByZXNzaW9uc2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICBbJ18kbGl0VHlwZSQnXTogdHlwZSxcbiAgICAgIHN0cmluZ3MsXG4gICAgICB2YWx1ZXMsXG4gICAgfTtcbiAgfTtcblxuLyoqXG4gKiBJbnRlcnByZXRzIGEgdGVtcGxhdGUgbGl0ZXJhbCBhcyBhbiBIVE1MIHRlbXBsYXRlIHRoYXQgY2FuIGVmZmljaWVudGx5XG4gKiByZW5kZXIgdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgaGVhZGVyID0gKHRpdGxlOiBzdHJpbmcpID0+IGh0bWxgPGgxPiR7dGl0bGV9PC9oMT5gO1xuICogYGBgXG4gKlxuICogVGhlIGBodG1sYCB0YWcgcmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBET00gdG8gcmVuZGVyIGFzIGEgdmFsdWUuIEl0IGlzXG4gKiBsYXp5LCBtZWFuaW5nIG5vIHdvcmsgaXMgZG9uZSB1bnRpbCB0aGUgdGVtcGxhdGUgaXMgcmVuZGVyZWQuIFdoZW4gcmVuZGVyaW5nLFxuICogaWYgYSB0ZW1wbGF0ZSBjb21lcyBmcm9tIHRoZSBzYW1lIGV4cHJlc3Npb24gYXMgYSBwcmV2aW91c2x5IHJlbmRlcmVkIHJlc3VsdCxcbiAqIGl0J3MgZWZmaWNpZW50bHkgdXBkYXRlZCBpbnN0ZWFkIG9mIHJlcGxhY2VkLlxuICovXG5leHBvcnQgY29uc3QgaHRtbCA9IHRhZyhIVE1MX1JFU1VMVCk7XG5cbi8qKlxuICogSW50ZXJwcmV0cyBhIHRlbXBsYXRlIGxpdGVyYWwgYXMgYW4gU1ZHIGZyYWdtZW50IHRoYXQgY2FuIGVmZmljaWVudGx5IHJlbmRlclxuICogdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcmVjdCA9IHN2Z2A8cmVjdCB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIj48L3JlY3Q+YDtcbiAqXG4gKiBjb25zdCBteUltYWdlID0gaHRtbGBcbiAqICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICogICAgICR7cmVjdH1cbiAqICAgPC9zdmc+YDtcbiAqIGBgYFxuICpcbiAqIFRoZSBgc3ZnYCAqdGFnIGZ1bmN0aW9uKiBzaG91bGQgb25seSBiZSB1c2VkIGZvciBTVkcgZnJhZ21lbnRzLCBvciBlbGVtZW50c1xuICogdGhhdCB3b3VsZCBiZSBjb250YWluZWQgKippbnNpZGUqKiBhbiBgPHN2Zz5gIEhUTUwgZWxlbWVudC4gQSBjb21tb24gZXJyb3IgaXNcbiAqIHBsYWNpbmcgYW4gYDxzdmc+YCAqZWxlbWVudCogaW4gYSB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUgYHN2Z2AgdGFnXG4gKiBmdW5jdGlvbi4gVGhlIGA8c3ZnPmAgZWxlbWVudCBpcyBhbiBIVE1MIGVsZW1lbnQgYW5kIHNob3VsZCBiZSB1c2VkIHdpdGhpbiBhXG4gKiB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUge0BsaW5rY29kZSBodG1sfSB0YWcgZnVuY3Rpb24uXG4gKlxuICogSW4gTGl0RWxlbWVudCB1c2FnZSwgaXQncyBpbnZhbGlkIHRvIHJldHVybiBhbiBTVkcgZnJhZ21lbnQgZnJvbSB0aGVcbiAqIGByZW5kZXIoKWAgbWV0aG9kLCBhcyB0aGUgU1ZHIGZyYWdtZW50IHdpbGwgYmUgY29udGFpbmVkIHdpdGhpbiB0aGUgZWxlbWVudCdzXG4gKiBzaGFkb3cgcm9vdCBhbmQgdGh1cyBub3QgYmUgcHJvcGVybHkgY29udGFpbmVkIHdpdGhpbiBhbiBgPHN2Zz5gIEhUTUxcbiAqIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBzdmcgPSB0YWcoU1ZHX1JFU1VMVCk7XG5cbi8qKlxuICogSW50ZXJwcmV0cyBhIHRlbXBsYXRlIGxpdGVyYWwgYXMgTWF0aE1MIGZyYWdtZW50IHRoYXQgY2FuIGVmZmljaWVudGx5IHJlbmRlclxuICogdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgbnVtID0gbWF0aG1sYDxtbj4xPC9tbj5gO1xuICpcbiAqIGNvbnN0IGVxID0gaHRtbGBcbiAqICAgPG1hdGg+XG4gKiAgICAgJHtudW19XG4gKiAgIDwvbWF0aD5gO1xuICogYGBgXG4gKlxuICogVGhlIGBtYXRobWxgICp0YWcgZnVuY3Rpb24qIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIE1hdGhNTCBmcmFnbWVudHMsIG9yXG4gKiBlbGVtZW50cyB0aGF0IHdvdWxkIGJlIGNvbnRhaW5lZCAqKmluc2lkZSoqIGEgYDxtYXRoPmAgSFRNTCBlbGVtZW50LiBBIGNvbW1vblxuICogZXJyb3IgaXMgcGxhY2luZyBhIGA8bWF0aD5gICplbGVtZW50KiBpbiBhIHRlbXBsYXRlIHRhZ2dlZCB3aXRoIHRoZSBgbWF0aG1sYFxuICogdGFnIGZ1bmN0aW9uLiBUaGUgYDxtYXRoPmAgZWxlbWVudCBpcyBhbiBIVE1MIGVsZW1lbnQgYW5kIHNob3VsZCBiZSB1c2VkXG4gKiB3aXRoaW4gYSB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUge0BsaW5rY29kZSBodG1sfSB0YWcgZnVuY3Rpb24uXG4gKlxuICogSW4gTGl0RWxlbWVudCB1c2FnZSwgaXQncyBpbnZhbGlkIHRvIHJldHVybiBhbiBNYXRoTUwgZnJhZ21lbnQgZnJvbSB0aGVcbiAqIGByZW5kZXIoKWAgbWV0aG9kLCBhcyB0aGUgTWF0aE1MIGZyYWdtZW50IHdpbGwgYmUgY29udGFpbmVkIHdpdGhpbiB0aGVcbiAqIGVsZW1lbnQncyBzaGFkb3cgcm9vdCBhbmQgdGh1cyBub3QgYmUgcHJvcGVybHkgY29udGFpbmVkIHdpdGhpbiBhIGA8bWF0aD5gXG4gKiBIVE1MIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBtYXRobWwgPSB0YWcoTUFUSE1MX1JFU1VMVCk7XG5cbi8qKlxuICogQSBzZW50aW5lbCB2YWx1ZSB0aGF0IHNpZ25hbHMgdGhhdCBhIHZhbHVlIHdhcyBoYW5kbGVkIGJ5IGEgZGlyZWN0aXZlIGFuZFxuICogc2hvdWxkIG5vdCBiZSB3cml0dGVuIHRvIHRoZSBET00uXG4gKi9cbmV4cG9ydCBjb25zdCBub0NoYW5nZSA9IFN5bWJvbC5mb3IoJ2xpdC1ub0NoYW5nZScpO1xuXG4vKipcbiAqIEEgc2VudGluZWwgdmFsdWUgdGhhdCBzaWduYWxzIGEgQ2hpbGRQYXJ0IHRvIGZ1bGx5IGNsZWFyIGl0cyBjb250ZW50LlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBidXR0b24gPSBodG1sYCR7XG4gKiAgdXNlci5pc0FkbWluXG4gKiAgICA/IGh0bWxgPGJ1dHRvbj5ERUxFVEU8L2J1dHRvbj5gXG4gKiAgICA6IG5vdGhpbmdcbiAqIH1gO1xuICogYGBgXG4gKlxuICogUHJlZmVyIHVzaW5nIGBub3RoaW5nYCBvdmVyIG90aGVyIGZhbHN5IHZhbHVlcyBhcyBpdCBwcm92aWRlcyBhIGNvbnNpc3RlbnRcbiAqIGJlaGF2aW9yIGJldHdlZW4gdmFyaW91cyBleHByZXNzaW9uIGJpbmRpbmcgY29udGV4dHMuXG4gKlxuICogSW4gY2hpbGQgZXhwcmVzc2lvbnMsIGB1bmRlZmluZWRgLCBgbnVsbGAsIGAnJ2AsIGFuZCBgbm90aGluZ2AgYWxsIGJlaGF2ZSB0aGVcbiAqIHNhbWUgYW5kIHJlbmRlciBubyBub2Rlcy4gSW4gYXR0cmlidXRlIGV4cHJlc3Npb25zLCBgbm90aGluZ2AgX3JlbW92ZXNfIHRoZVxuICogYXR0cmlidXRlLCB3aGlsZSBgdW5kZWZpbmVkYCBhbmQgYG51bGxgIHdpbGwgcmVuZGVyIGFuIGVtcHR5IHN0cmluZy4gSW5cbiAqIHByb3BlcnR5IGV4cHJlc3Npb25zIGBub3RoaW5nYCBiZWNvbWVzIGB1bmRlZmluZWRgLlxuICovXG5leHBvcnQgY29uc3Qgbm90aGluZyA9IFN5bWJvbC5mb3IoJ2xpdC1ub3RoaW5nJyk7XG5cbi8qKlxuICogVGhlIGNhY2hlIG9mIHByZXBhcmVkIHRlbXBsYXRlcywga2V5ZWQgYnkgdGhlIHRhZ2dlZCBUZW1wbGF0ZVN0cmluZ3NBcnJheVxuICogYW5kIF9ub3RfIGFjY291bnRpbmcgZm9yIHRoZSBzcGVjaWZpYyB0ZW1wbGF0ZSB0YWcgdXNlZC4gVGhpcyBtZWFucyB0aGF0XG4gKiB0ZW1wbGF0ZSB0YWdzIGNhbm5vdCBiZSBkeW5hbWljIC0gdGhleSBtdXN0IHN0YXRpY2FsbHkgYmUgb25lIG9mIGh0bWwsIHN2ZyxcbiAqIG9yIGF0dHIuIFRoaXMgcmVzdHJpY3Rpb24gc2ltcGxpZmllcyB0aGUgY2FjaGUgbG9va3VwLCB3aGljaCBpcyBvbiB0aGUgaG90XG4gKiBwYXRoIGZvciByZW5kZXJpbmcuXG4gKi9cbmNvbnN0IHRlbXBsYXRlQ2FjaGUgPSBuZXcgV2Vha01hcDxUZW1wbGF0ZVN0cmluZ3NBcnJheSwgVGVtcGxhdGU+KCk7XG5cbi8qKlxuICogT2JqZWN0IHNwZWNpZnlpbmcgb3B0aW9ucyBmb3IgY29udHJvbGxpbmcgbGl0LWh0bWwgcmVuZGVyaW5nLiBOb3RlIHRoYXRcbiAqIHdoaWxlIGByZW5kZXJgIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgb24gdGhlIHNhbWUgYGNvbnRhaW5lcmAgKGFuZFxuICogYHJlbmRlckJlZm9yZWAgcmVmZXJlbmNlIG5vZGUpIHRvIGVmZmljaWVudGx5IHVwZGF0ZSB0aGUgcmVuZGVyZWQgY29udGVudCxcbiAqIG9ubHkgdGhlIG9wdGlvbnMgcGFzc2VkIGluIGR1cmluZyB0aGUgZmlyc3QgcmVuZGVyIGFyZSByZXNwZWN0ZWQgZHVyaW5nXG4gKiB0aGUgbGlmZXRpbWUgb2YgcmVuZGVycyB0byB0aGF0IHVuaXF1ZSBgY29udGFpbmVyYCArIGByZW5kZXJCZWZvcmVgXG4gKiBjb21iaW5hdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCB0byB1c2UgYXMgdGhlIGB0aGlzYCB2YWx1ZSBmb3IgZXZlbnQgbGlzdGVuZXJzLiBJdCdzIG9mdGVuXG4gICAqIHVzZWZ1bCB0byBzZXQgdGhpcyB0byB0aGUgaG9zdCBjb21wb25lbnQgcmVuZGVyaW5nIGEgdGVtcGxhdGUuXG4gICAqL1xuICBob3N0Pzogb2JqZWN0O1xuICAvKipcbiAgICogQSBET00gbm9kZSBiZWZvcmUgd2hpY2ggdG8gcmVuZGVyIGNvbnRlbnQgaW4gdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIHJlbmRlckJlZm9yZT86IENoaWxkTm9kZSB8IG51bGw7XG4gIC8qKlxuICAgKiBOb2RlIHVzZWQgZm9yIGNsb25pbmcgdGhlIHRlbXBsYXRlIChgaW1wb3J0Tm9kZWAgd2lsbCBiZSBjYWxsZWQgb24gdGhpc1xuICAgKiBub2RlKS4gVGhpcyBjb250cm9scyB0aGUgYG93bmVyRG9jdW1lbnRgIG9mIHRoZSByZW5kZXJlZCBET00sIGFsb25nIHdpdGhcbiAgICogYW55IGluaGVyaXRlZCBjb250ZXh0LiBEZWZhdWx0cyB0byB0aGUgZ2xvYmFsIGBkb2N1bWVudGAuXG4gICAqL1xuICBjcmVhdGlvblNjb3BlPzoge2ltcG9ydE5vZGUobm9kZTogTm9kZSwgZGVlcD86IGJvb2xlYW4pOiBOb2RlfTtcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIGNvbm5lY3RlZCBzdGF0ZSBmb3IgdGhlIHRvcC1sZXZlbCBwYXJ0IGJlaW5nIHJlbmRlcmVkLiBJZiBub1xuICAgKiBgaXNDb25uZWN0ZWRgIG9wdGlvbiBpcyBzZXQsIGBBc3luY0RpcmVjdGl2ZWBzIHdpbGwgYmUgY29ubmVjdGVkIGJ5XG4gICAqIGRlZmF1bHQuIFNldCB0byBgZmFsc2VgIGlmIHRoZSBpbml0aWFsIHJlbmRlciBvY2N1cnMgaW4gYSBkaXNjb25uZWN0ZWQgdHJlZVxuICAgKiBhbmQgYEFzeW5jRGlyZWN0aXZlYHMgc2hvdWxkIHNlZSBgaXNDb25uZWN0ZWQgPT09IGZhbHNlYCBmb3IgdGhlaXIgaW5pdGlhbFxuICAgKiByZW5kZXIuIFRoZSBgcGFydC5zZXRDb25uZWN0ZWQoKWAgbWV0aG9kIG11c3QgYmUgdXNlZCBzdWJzZXF1ZW50IHRvIGluaXRpYWxcbiAgICogcmVuZGVyIHRvIGNoYW5nZSB0aGUgY29ubmVjdGVkIHN0YXRlIG9mIHRoZSBwYXJ0LlxuICAgKi9cbiAgaXNDb25uZWN0ZWQ/OiBib29sZWFuO1xufVxuXG5jb25zdCB3YWxrZXIgPSBkLmNyZWF0ZVRyZWVXYWxrZXIoXG4gIGQsXG4gIDEyOSAvKiBOb2RlRmlsdGVyLlNIT1dfe0VMRU1FTlR8Q09NTUVOVH0gKi9cbik7XG5cbmxldCBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWw6IFNhbml0aXplckZhY3RvcnkgPSBub29wU2FuaXRpemVyO1xuXG4vL1xuLy8gQ2xhc3NlcyBvbmx5IGJlbG93IGhlcmUsIGNvbnN0IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBvbmx5IGFib3ZlIGhlcmUuLi5cbi8vXG4vLyBLZWVwaW5nIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBhbmQgY2xhc3NlcyB0b2dldGhlciBpbXByb3ZlcyBtaW5pZmljYXRpb24uXG4vLyBJbnRlcmZhY2VzIGFuZCB0eXBlIGFsaWFzZXMgY2FuIGJlIGludGVybGVhdmVkIGZyZWVseS5cbi8vXG5cbi8vIFR5cGUgZm9yIGNsYXNzZXMgdGhhdCBoYXZlIGEgYF9kaXJlY3RpdmVgIG9yIGBfZGlyZWN0aXZlc1tdYCBmaWVsZCwgdXNlZCBieVxuLy8gYHJlc29sdmVEaXJlY3RpdmVgXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZVBhcmVudCB7XG4gIF8kcGFyZW50PzogRGlyZWN0aXZlUGFyZW50O1xuICBfJGlzQ29ubmVjdGVkOiBib29sZWFuO1xuICBfX2RpcmVjdGl2ZT86IERpcmVjdGl2ZTtcbiAgX19kaXJlY3RpdmVzPzogQXJyYXk8RGlyZWN0aXZlIHwgdW5kZWZpbmVkPjtcbn1cblxuZnVuY3Rpb24gdHJ1c3RGcm9tVGVtcGxhdGVTdHJpbmcoXG4gIHRzYTogVGVtcGxhdGVTdHJpbmdzQXJyYXksXG4gIHN0cmluZ0Zyb21UU0E6IHN0cmluZ1xuKTogVHJ1c3RlZEhUTUwge1xuICAvLyBBIHNlY3VyaXR5IGNoZWNrIHRvIHByZXZlbnQgc3Bvb2Zpbmcgb2YgTGl0IHRlbXBsYXRlIHJlc3VsdHMuXG4gIC8vIEluIHRoZSBmdXR1cmUsIHdlIG1heSBiZSBhYmxlIHRvIHJlcGxhY2UgdGhpcyB3aXRoIEFycmF5LmlzVGVtcGxhdGVPYmplY3QsXG4gIC8vIHRob3VnaCB3ZSBtaWdodCBuZWVkIHRvIG1ha2UgdGhhdCBjaGVjayBpbnNpZGUgb2YgdGhlIGh0bWwgYW5kIHN2Z1xuICAvLyBmdW5jdGlvbnMsIGJlY2F1c2UgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGRvbid0IGNvbWUgaW4gYXNcbiAgLy8gVGVtcGxhdGVTdHJpbmdBcnJheSBvYmplY3RzLlxuICBpZiAoIWlzQXJyYXkodHNhKSB8fCAhdHNhLmhhc093blByb3BlcnR5KCdyYXcnKSkge1xuICAgIGxldCBtZXNzYWdlID0gJ2ludmFsaWQgdGVtcGxhdGUgc3RyaW5ncyBhcnJheSc7XG4gICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICBtZXNzYWdlID0gYFxuICAgICAgICAgIEludGVybmFsIEVycm9yOiBleHBlY3RlZCB0ZW1wbGF0ZSBzdHJpbmdzIHRvIGJlIGFuIGFycmF5XG4gICAgICAgICAgd2l0aCBhICdyYXcnIGZpZWxkLiBGYWtpbmcgYSB0ZW1wbGF0ZSBzdHJpbmdzIGFycmF5IGJ5XG4gICAgICAgICAgY2FsbGluZyBodG1sIG9yIHN2ZyBsaWtlIGFuIG9yZGluYXJ5IGZ1bmN0aW9uIGlzIGVmZmVjdGl2ZWx5XG4gICAgICAgICAgdGhlIHNhbWUgYXMgY2FsbGluZyB1bnNhZmVIdG1sIGFuZCBjYW4gbGVhZCB0byBtYWpvciBzZWN1cml0eVxuICAgICAgICAgIGlzc3VlcywgZS5nLiBvcGVuaW5nIHlvdXIgY29kZSB1cCB0byBYU1MgYXR0YWNrcy5cbiAgICAgICAgICBJZiB5b3UncmUgdXNpbmcgdGhlIGh0bWwgb3Igc3ZnIHRhZ2dlZCB0ZW1wbGF0ZSBmdW5jdGlvbnMgbm9ybWFsbHlcbiAgICAgICAgICBhbmQgc3RpbGwgc2VlaW5nIHRoaXMgZXJyb3IsIHBsZWFzZSBmaWxlIGEgYnVnIGF0XG4gICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvaXNzdWVzL25ldz90ZW1wbGF0ZT1idWdfcmVwb3J0Lm1kXG4gICAgICAgICAgYW5kIGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgeW91ciBidWlsZCB0b29saW5nLCBpZiBhbnkuXG4gICAgICAgIGBcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAucmVwbGFjZSgvXFxuICovZywgJ1xcbicpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH1cbiAgcmV0dXJuIHBvbGljeSAhPT0gdW5kZWZpbmVkXG4gICAgPyBwb2xpY3kuY3JlYXRlSFRNTChzdHJpbmdGcm9tVFNBKVxuICAgIDogKHN0cmluZ0Zyb21UU0EgYXMgdW5rbm93biBhcyBUcnVzdGVkSFRNTCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBIVE1MIHN0cmluZyBmb3IgdGhlIGdpdmVuIFRlbXBsYXRlU3RyaW5nc0FycmF5IGFuZCByZXN1bHQgdHlwZVxuICogKEhUTUwgb3IgU1ZHKSwgYWxvbmcgd2l0aCB0aGUgY2FzZS1zZW5zaXRpdmUgYm91bmQgYXR0cmlidXRlIG5hbWVzIGluXG4gKiB0ZW1wbGF0ZSBvcmRlci4gVGhlIEhUTUwgY29udGFpbnMgY29tbWVudCBtYXJrZXJzIGRlbm90aW5nIHRoZSBgQ2hpbGRQYXJ0YHNcbiAqIGFuZCBzdWZmaXhlcyBvbiBib3VuZCBhdHRyaWJ1dGVzIGRlbm90aW5nIHRoZSBgQXR0cmlidXRlUGFydHNgLlxuICpcbiAqIEBwYXJhbSBzdHJpbmdzIHRlbXBsYXRlIHN0cmluZ3MgYXJyYXlcbiAqIEBwYXJhbSB0eXBlIEhUTUwgb3IgU1ZHXG4gKiBAcmV0dXJuIEFycmF5IGNvbnRhaW5pbmcgYFtodG1sLCBhdHRyTmFtZXNdYCAoYXJyYXkgcmV0dXJuZWQgZm9yIHRlcnNlbmVzcyxcbiAqICAgICB0byBhdm9pZCBvYmplY3QgZmllbGRzIHNpbmNlIHRoaXMgY29kZSBpcyBzaGFyZWQgd2l0aCBub24tbWluaWZpZWQgU1NSXG4gKiAgICAgY29kZSlcbiAqL1xuY29uc3QgZ2V0VGVtcGxhdGVIdG1sID0gKFxuICBzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSxcbiAgdHlwZTogUmVzdWx0VHlwZVxuKTogW1RydXN0ZWRIVE1MLCBBcnJheTxzdHJpbmc+XSA9PiB7XG4gIC8vIEluc2VydCBtYWtlcnMgaW50byB0aGUgdGVtcGxhdGUgSFRNTCB0byByZXByZXNlbnQgdGhlIHBvc2l0aW9uIG9mXG4gIC8vIGJpbmRpbmdzLiBUaGUgZm9sbG93aW5nIGNvZGUgc2NhbnMgdGhlIHRlbXBsYXRlIHN0cmluZ3MgdG8gZGV0ZXJtaW5lIHRoZVxuICAvLyBzeW50YWN0aWMgcG9zaXRpb24gb2YgdGhlIGJpbmRpbmdzLiBUaGV5IGNhbiBiZSBpbiB0ZXh0IHBvc2l0aW9uLCB3aGVyZVxuICAvLyB3ZSBpbnNlcnQgYW4gSFRNTCBjb21tZW50LCBhdHRyaWJ1dGUgdmFsdWUgcG9zaXRpb24sIHdoZXJlIHdlIGluc2VydCBhXG4gIC8vIHNlbnRpbmVsIHN0cmluZyBhbmQgcmUtd3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lLCBvciBpbnNpZGUgYSB0YWcgd2hlcmVcbiAgLy8gd2UgaW5zZXJ0IHRoZSBzZW50aW5lbCBzdHJpbmcuXG4gIGNvbnN0IGwgPSBzdHJpbmdzLmxlbmd0aCAtIDE7XG4gIC8vIFN0b3JlcyB0aGUgY2FzZS1zZW5zaXRpdmUgYm91bmQgYXR0cmlidXRlIG5hbWVzIGluIHRoZSBvcmRlciBvZiB0aGVpclxuICAvLyBwYXJ0cy4gRWxlbWVudFBhcnRzIGFyZSBhbHNvIHJlZmxlY3RlZCBpbiB0aGlzIGFycmF5IGFzIHVuZGVmaW5lZFxuICAvLyByYXRoZXIgdGhhbiBhIHN0cmluZywgdG8gZGlzYW1iaWd1YXRlIGZyb20gYXR0cmlidXRlIGJpbmRpbmdzLlxuICBjb25zdCBhdHRyTmFtZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgbGV0IGh0bWwgPVxuICAgIHR5cGUgPT09IFNWR19SRVNVTFQgPyAnPHN2Zz4nIDogdHlwZSA9PT0gTUFUSE1MX1JFU1VMVCA/ICc8bWF0aD4nIDogJyc7XG5cbiAgLy8gV2hlbiB3ZSdyZSBpbnNpZGUgYSByYXcgdGV4dCB0YWcgKG5vdCBpdCdzIHRleHQgY29udGVudCksIHRoZSByZWdleFxuICAvLyB3aWxsIHN0aWxsIGJlIHRhZ1JlZ2V4IHNvIHdlIGNhbiBmaW5kIGF0dHJpYnV0ZXMsIGJ1dCB3aWxsIHN3aXRjaCB0b1xuICAvLyB0aGlzIHJlZ2V4IHdoZW4gdGhlIHRhZyBlbmRzLlxuICBsZXQgcmF3VGV4dEVuZFJlZ2V4OiBSZWdFeHAgfCB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIGN1cnJlbnQgcGFyc2luZyBzdGF0ZSwgcmVwcmVzZW50ZWQgYXMgYSByZWZlcmVuY2UgdG8gb25lIG9mIHRoZVxuICAvLyByZWdleGVzXG4gIGxldCByZWdleCA9IHRleHRFbmRSZWdleDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IHMgPSBzdHJpbmdzW2ldO1xuICAgIC8vIFRoZSBpbmRleCBvZiB0aGUgZW5kIG9mIHRoZSBsYXN0IGF0dHJpYnV0ZSBuYW1lLiBXaGVuIHRoaXMgaXNcbiAgICAvLyBwb3NpdGl2ZSBhdCBlbmQgb2YgYSBzdHJpbmcsIGl0IG1lYW5zIHdlJ3JlIGluIGFuIGF0dHJpYnV0ZSB2YWx1ZVxuICAgIC8vIHBvc2l0aW9uIGFuZCBuZWVkIHRvIHJld3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lLlxuICAgIC8vIFdlIGFsc28gdXNlIGEgc3BlY2lhbCB2YWx1ZSBvZiAtMiB0byBpbmRpY2F0ZSB0aGF0IHdlIGVuY291bnRlcmVkXG4gICAgLy8gdGhlIGVuZCBvZiBhIHN0cmluZyBpbiBhdHRyaWJ1dGUgbmFtZSBwb3NpdGlvbi5cbiAgICBsZXQgYXR0ck5hbWVFbmRJbmRleCA9IC0xO1xuICAgIGxldCBhdHRyTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBsYXN0SW5kZXggPSAwO1xuICAgIGxldCBtYXRjaCE6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG5cbiAgICAvLyBUaGUgY29uZGl0aW9ucyBpbiB0aGlzIGxvb3AgaGFuZGxlIHRoZSBjdXJyZW50IHBhcnNlIHN0YXRlLCBhbmQgdGhlXG4gICAgLy8gYXNzaWdubWVudHMgdG8gdGhlIGByZWdleGAgdmFyaWFibGUgYXJlIHRoZSBzdGF0ZSB0cmFuc2l0aW9ucy5cbiAgICB3aGlsZSAobGFzdEluZGV4IDwgcy5sZW5ndGgpIHtcbiAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzdGFydCBzZWFyY2hpbmcgZnJvbSB3aGVyZSB3ZSBwcmV2aW91c2x5IGxlZnQgb2ZmXG4gICAgICByZWdleC5sYXN0SW5kZXggPSBsYXN0SW5kZXg7XG4gICAgICBtYXRjaCA9IHJlZ2V4LmV4ZWMocyk7XG4gICAgICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsYXN0SW5kZXggPSByZWdleC5sYXN0SW5kZXg7XG4gICAgICBpZiAocmVnZXggPT09IHRleHRFbmRSZWdleCkge1xuICAgICAgICBpZiAobWF0Y2hbQ09NTUVOVF9TVEFSVF0gPT09ICchLS0nKSB7XG4gICAgICAgICAgcmVnZXggPSBjb21tZW50RW5kUmVnZXg7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hbQ09NTUVOVF9TVEFSVF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFdlIHN0YXJ0ZWQgYSB3ZWlyZCBjb21tZW50LCBsaWtlIDwve1xuICAgICAgICAgIHJlZ2V4ID0gY29tbWVudDJFbmRSZWdleDtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaFtUQUdfTkFNRV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChyYXdUZXh0RWxlbWVudC50ZXN0KG1hdGNoW1RBR19OQU1FXSkpIHtcbiAgICAgICAgICAgIC8vIFJlY29yZCBpZiB3ZSBlbmNvdW50ZXIgYSByYXctdGV4dCBlbGVtZW50LiBXZSdsbCBzd2l0Y2ggdG9cbiAgICAgICAgICAgIC8vIHRoaXMgcmVnZXggYXQgdGhlIGVuZCBvZiB0aGUgdGFnLlxuICAgICAgICAgICAgcmF3VGV4dEVuZFJlZ2V4ID0gbmV3IFJlZ0V4cChgPC8ke21hdGNoW1RBR19OQU1FXX1gLCAnZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWdleCA9IHRhZ0VuZFJlZ2V4O1xuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoW0RZTkFNSUNfVEFHX05BTUVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ0JpbmRpbmdzIGluIHRhZyBuYW1lcyBhcmUgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVzZSBzdGF0aWMgdGVtcGxhdGVzIGluc3RlYWQuICcgK1xuICAgICAgICAgICAgICAgICdTZWUgaHR0cHM6Ly9saXQuZGV2L2RvY3MvdGVtcGxhdGVzL2V4cHJlc3Npb25zLyNzdGF0aWMtZXhwcmVzc2lvbnMnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWdleCA9IHRhZ0VuZFJlZ2V4O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlZ2V4ID09PSB0YWdFbmRSZWdleCkge1xuICAgICAgICBpZiAobWF0Y2hbRU5USVJFX01BVENIXSA9PT0gJz4nKSB7XG4gICAgICAgICAgLy8gRW5kIG9mIGEgdGFnLiBJZiB3ZSBoYWQgc3RhcnRlZCBhIHJhdy10ZXh0IGVsZW1lbnQsIHVzZSB0aGF0XG4gICAgICAgICAgLy8gcmVnZXhcbiAgICAgICAgICByZWdleCA9IHJhd1RleHRFbmRSZWdleCA/PyB0ZXh0RW5kUmVnZXg7XG4gICAgICAgICAgLy8gV2UgbWF5IGJlIGVuZGluZyBhbiB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUsIHNvIG1ha2Ugc3VyZSB3ZVxuICAgICAgICAgIC8vIGNsZWFyIGFueSBwZW5kaW5nIGF0dHJOYW1lRW5kSW5kZXhcbiAgICAgICAgICBhdHRyTmFtZUVuZEluZGV4ID0gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hbQVRUUklCVVRFX05BTUVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBBdHRyaWJ1dGUgbmFtZSBwb3NpdGlvblxuICAgICAgICAgIGF0dHJOYW1lRW5kSW5kZXggPSAtMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhdHRyTmFtZUVuZEluZGV4ID0gcmVnZXgubGFzdEluZGV4IC0gbWF0Y2hbU1BBQ0VTX0FORF9FUVVBTFNdLmxlbmd0aDtcbiAgICAgICAgICBhdHRyTmFtZSA9IG1hdGNoW0FUVFJJQlVURV9OQU1FXTtcbiAgICAgICAgICByZWdleCA9XG4gICAgICAgICAgICBtYXRjaFtRVU9URV9DSEFSXSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gdGFnRW5kUmVnZXhcbiAgICAgICAgICAgICAgOiBtYXRjaFtRVU9URV9DSEFSXSA9PT0gJ1wiJ1xuICAgICAgICAgICAgICAgID8gZG91YmxlUXVvdGVBdHRyRW5kUmVnZXhcbiAgICAgICAgICAgICAgICA6IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICByZWdleCA9PT0gZG91YmxlUXVvdGVBdHRyRW5kUmVnZXggfHxcbiAgICAgICAgcmVnZXggPT09IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4XG4gICAgICApIHtcbiAgICAgICAgcmVnZXggPSB0YWdFbmRSZWdleDtcbiAgICAgIH0gZWxzZSBpZiAocmVnZXggPT09IGNvbW1lbnRFbmRSZWdleCB8fCByZWdleCA9PT0gY29tbWVudDJFbmRSZWdleCkge1xuICAgICAgICByZWdleCA9IHRleHRFbmRSZWdleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vdCBvbmUgb2YgdGhlIGZpdmUgc3RhdGUgcmVnZXhlcywgc28gaXQgbXVzdCBiZSB0aGUgZHluYW1pY2FsbHlcbiAgICAgICAgLy8gY3JlYXRlZCByYXcgdGV4dCByZWdleCBhbmQgd2UncmUgYXQgdGhlIGNsb3NlIG9mIHRoYXQgZWxlbWVudC5cbiAgICAgICAgcmVnZXggPSB0YWdFbmRSZWdleDtcbiAgICAgICAgcmF3VGV4dEVuZFJlZ2V4ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBhIGF0dHJOYW1lRW5kSW5kZXgsIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZFxuICAgICAgLy8gcmV3cml0ZSB0aGUgYXR0cmlidXRlIG5hbWUsIGFzc2VydCB0aGF0IHdlJ3JlIGluIGEgdmFsaWQgYXR0cmlidXRlXG4gICAgICAvLyBwb3NpdGlvbiAtIGVpdGhlciBpbiBhIHRhZywgb3IgYSBxdW90ZWQgYXR0cmlidXRlIHZhbHVlLlxuICAgICAgY29uc29sZS5hc3NlcnQoXG4gICAgICAgIGF0dHJOYW1lRW5kSW5kZXggPT09IC0xIHx8XG4gICAgICAgICAgcmVnZXggPT09IHRhZ0VuZFJlZ2V4IHx8XG4gICAgICAgICAgcmVnZXggPT09IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4IHx8XG4gICAgICAgICAgcmVnZXggPT09IGRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4LFxuICAgICAgICAndW5leHBlY3RlZCBwYXJzZSBzdGF0ZSBCJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBXZSBoYXZlIGZvdXIgY2FzZXM6XG4gICAgLy8gIDEuIFdlJ3JlIGluIHRleHQgcG9zaXRpb24sIGFuZCBub3QgaW4gYSByYXcgdGV4dCBlbGVtZW50XG4gICAgLy8gICAgIChyZWdleCA9PT0gdGV4dEVuZFJlZ2V4KTogaW5zZXJ0IGEgY29tbWVudCBtYXJrZXIuXG4gICAgLy8gIDIuIFdlIGhhdmUgYSBub24tbmVnYXRpdmUgYXR0ck5hbWVFbmRJbmRleCB3aGljaCBtZWFucyB3ZSBuZWVkIHRvXG4gICAgLy8gICAgIHJld3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGFkZCBhIGJvdW5kIGF0dHJpYnV0ZSBzdWZmaXguXG4gICAgLy8gIDMuIFdlJ3JlIGF0IHRoZSBub24tZmlyc3QgYmluZGluZyBpbiBhIG11bHRpLWJpbmRpbmcgYXR0cmlidXRlLCB1c2UgYVxuICAgIC8vICAgICBwbGFpbiBtYXJrZXIuXG4gICAgLy8gIDQuIFdlJ3JlIHNvbWV3aGVyZSBlbHNlIGluc2lkZSB0aGUgdGFnLiBJZiB3ZSdyZSBpbiBhdHRyaWJ1dGUgbmFtZVxuICAgIC8vICAgICBwb3NpdGlvbiAoYXR0ck5hbWVFbmRJbmRleCA9PT0gLTIpLCBhZGQgYSBzZXF1ZW50aWFsIHN1ZmZpeCB0b1xuICAgIC8vICAgICBnZW5lcmF0ZSBhIHVuaXF1ZSBhdHRyaWJ1dGUgbmFtZS5cblxuICAgIC8vIERldGVjdCBhIGJpbmRpbmcgbmV4dCB0byBzZWxmLWNsb3NpbmcgdGFnIGVuZCBhbmQgaW5zZXJ0IGEgc3BhY2UgdG9cbiAgICAvLyBzZXBhcmF0ZSB0aGUgbWFya2VyIGZyb20gdGhlIHRhZyBlbmQ6XG4gICAgY29uc3QgZW5kID1cbiAgICAgIHJlZ2V4ID09PSB0YWdFbmRSZWdleCAmJiBzdHJpbmdzW2kgKyAxXS5zdGFydHNXaXRoKCcvPicpID8gJyAnIDogJyc7XG4gICAgaHRtbCArPVxuICAgICAgcmVnZXggPT09IHRleHRFbmRSZWdleFxuICAgICAgICA/IHMgKyBub2RlTWFya2VyXG4gICAgICAgIDogYXR0ck5hbWVFbmRJbmRleCA+PSAwXG4gICAgICAgICAgPyAoYXR0ck5hbWVzLnB1c2goYXR0ck5hbWUhKSxcbiAgICAgICAgICAgIHMuc2xpY2UoMCwgYXR0ck5hbWVFbmRJbmRleCkgK1xuICAgICAgICAgICAgICBib3VuZEF0dHJpYnV0ZVN1ZmZpeCArXG4gICAgICAgICAgICAgIHMuc2xpY2UoYXR0ck5hbWVFbmRJbmRleCkpICtcbiAgICAgICAgICAgIG1hcmtlciArXG4gICAgICAgICAgICBlbmRcbiAgICAgICAgICA6IHMgKyBtYXJrZXIgKyAoYXR0ck5hbWVFbmRJbmRleCA9PT0gLTIgPyBpIDogZW5kKTtcbiAgfVxuXG4gIGNvbnN0IGh0bWxSZXN1bHQ6IHN0cmluZyB8IFRydXN0ZWRIVE1MID1cbiAgICBodG1sICtcbiAgICAoc3RyaW5nc1tsXSB8fCAnPD8+JykgK1xuICAgICh0eXBlID09PSBTVkdfUkVTVUxUID8gJzwvc3ZnPicgOiB0eXBlID09PSBNQVRITUxfUkVTVUxUID8gJzwvbWF0aD4nIDogJycpO1xuXG4gIC8vIFJldHVybmVkIGFzIGFuIGFycmF5IGZvciB0ZXJzZW5lc3NcbiAgcmV0dXJuIFt0cnVzdEZyb21UZW1wbGF0ZVN0cmluZyhzdHJpbmdzLCBodG1sUmVzdWx0KSwgYXR0ck5hbWVzXTtcbn07XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCB0eXBlIHtUZW1wbGF0ZX07XG5jbGFzcyBUZW1wbGF0ZSB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZWwhOiBIVE1MVGVtcGxhdGVFbGVtZW50O1xuXG4gIHBhcnRzOiBBcnJheTxUZW1wbGF0ZVBhcnQ+ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICB7c3RyaW5ncywgWydfJGxpdFR5cGUkJ106IHR5cGV9OiBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQsXG4gICAgb3B0aW9ucz86IFJlbmRlck9wdGlvbnNcbiAgKSB7XG4gICAgbGV0IG5vZGU6IE5vZGUgfCBudWxsO1xuICAgIGxldCBub2RlSW5kZXggPSAwO1xuICAgIGxldCBhdHRyTmFtZUluZGV4ID0gMDtcbiAgICBjb25zdCBwYXJ0Q291bnQgPSBzdHJpbmdzLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzO1xuXG4gICAgLy8gQ3JlYXRlIHRlbXBsYXRlIGVsZW1lbnRcbiAgICBjb25zdCBbaHRtbCwgYXR0ck5hbWVzXSA9IGdldFRlbXBsYXRlSHRtbChzdHJpbmdzLCB0eXBlKTtcbiAgICB0aGlzLmVsID0gVGVtcGxhdGUuY3JlYXRlRWxlbWVudChodG1sLCBvcHRpb25zKTtcbiAgICB3YWxrZXIuY3VycmVudE5vZGUgPSB0aGlzLmVsLmNvbnRlbnQ7XG5cbiAgICAvLyBSZS1wYXJlbnQgU1ZHIG9yIE1hdGhNTCBub2RlcyBpbnRvIHRlbXBsYXRlIHJvb3RcbiAgICBpZiAodHlwZSA9PT0gU1ZHX1JFU1VMVCB8fCB0eXBlID09PSBNQVRITUxfUkVTVUxUKSB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5lbC5jb250ZW50LmZpcnN0Q2hpbGQhO1xuICAgICAgd3JhcHBlci5yZXBsYWNlV2l0aCguLi53cmFwcGVyLmNoaWxkTm9kZXMpO1xuICAgIH1cblxuICAgIC8vIFdhbGsgdGhlIHRlbXBsYXRlIHRvIGZpbmQgYmluZGluZyBtYXJrZXJzIGFuZCBjcmVhdGUgVGVtcGxhdGVQYXJ0c1xuICAgIHdoaWxlICgobm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpKSAhPT0gbnVsbCAmJiBwYXJ0cy5sZW5ndGggPCBwYXJ0Q291bnQpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICAgIGNvbnN0IHRhZyA9IChub2RlIGFzIEVsZW1lbnQpLmxvY2FsTmFtZTtcbiAgICAgICAgICAvLyBXYXJuIGlmIGB0ZXh0YXJlYWAgaW5jbHVkZXMgYW4gZXhwcmVzc2lvbiBhbmQgdGhyb3cgaWYgYHRlbXBsYXRlYFxuICAgICAgICAgIC8vIGRvZXMgc2luY2UgdGhlc2UgYXJlIG5vdCBzdXBwb3J0ZWQuIFdlIGRvIHRoaXMgYnkgY2hlY2tpbmdcbiAgICAgICAgICAvLyBpbm5lckhUTUwgZm9yIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIG1hcmtlci4gVGhpcyBjYXRjaGVzXG4gICAgICAgICAgLy8gY2FzZXMgbGlrZSBiaW5kaW5ncyBpbiB0ZXh0YXJlYSB0aGVyZSBtYXJrZXJzIHR1cm4gaW50byB0ZXh0IG5vZGVzLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC9eKD86dGV4dGFyZWF8dGVtcGxhdGUpJC9pIS50ZXN0KHRhZykgJiZcbiAgICAgICAgICAgIChub2RlIGFzIEVsZW1lbnQpLmlubmVySFRNTC5pbmNsdWRlcyhtYXJrZXIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBtID1cbiAgICAgICAgICAgICAgYEV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIGluc2lkZSBcXGAke3RhZ31cXGAgYCArXG4gICAgICAgICAgICAgIGBlbGVtZW50cy4gU2VlIGh0dHBzOi8vbGl0LmRldi9tc2cvZXhwcmVzc2lvbi1pbi0ke3RhZ30gZm9yIG1vcmUgYCArXG4gICAgICAgICAgICAgIGBpbmZvcm1hdGlvbi5gO1xuICAgICAgICAgICAgaWYgKHRhZyA9PT0gJ3RlbXBsYXRlJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobSk7XG4gICAgICAgICAgICB9IGVsc2UgaXNzdWVXYXJuaW5nKCcnLCBtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IGZvciBhdHRlbXB0ZWQgZHluYW1pYyB0YWcgbmFtZXMsIHdlIGRvbid0XG4gICAgICAgIC8vIGluY3JlbWVudCB0aGUgYmluZGluZ0luZGV4LCBhbmQgaXQnbGwgYmUgb2ZmIGJ5IDEgaW4gdGhlIGVsZW1lbnRcbiAgICAgICAgLy8gYW5kIG9mZiBieSB0d28gYWZ0ZXIgaXQuXG4gICAgICAgIGlmICgobm9kZSBhcyBFbGVtZW50KS5oYXNBdHRyaWJ1dGVzKCkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoYm91bmRBdHRyaWJ1dGVTdWZmaXgpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlYWxOYW1lID0gYXR0ck5hbWVzW2F0dHJOYW1lSW5kZXgrK107XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKG5hbWUpITtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdGljcyA9IHZhbHVlLnNwbGl0KG1hcmtlcik7XG4gICAgICAgICAgICAgIGNvbnN0IG0gPSAvKFsuP0BdKT8oLiopLy5leGVjKHJlYWxOYW1lKSE7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IEFUVFJJQlVURV9QQVJULFxuICAgICAgICAgICAgICAgIGluZGV4OiBub2RlSW5kZXgsXG4gICAgICAgICAgICAgICAgbmFtZTogbVsyXSxcbiAgICAgICAgICAgICAgICBzdHJpbmdzOiBzdGF0aWNzLFxuICAgICAgICAgICAgICAgIGN0b3I6XG4gICAgICAgICAgICAgICAgICBtWzFdID09PSAnLidcbiAgICAgICAgICAgICAgICAgICAgPyBQcm9wZXJ0eVBhcnRcbiAgICAgICAgICAgICAgICAgICAgOiBtWzFdID09PSAnPydcbiAgICAgICAgICAgICAgICAgICAgICA/IEJvb2xlYW5BdHRyaWJ1dGVQYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgOiBtWzFdID09PSAnQCdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gRXZlbnRQYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IEF0dHJpYnV0ZVBhcnQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAobm9kZSBhcyBFbGVtZW50KS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aChtYXJrZXIpKSB7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IEVMRU1FTlRfUEFSVCxcbiAgICAgICAgICAgICAgICBpbmRleDogbm9kZUluZGV4LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgKG5vZGUgYXMgRWxlbWVudCkucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIChqdXN0aW5mYWduYW5pKTogYmVuY2htYXJrIHRoZSByZWdleCBhZ2FpbnN0IHRlc3RpbmcgZm9yIGVhY2hcbiAgICAgICAgLy8gb2YgdGhlIDMgcmF3IHRleHQgZWxlbWVudCBuYW1lcy5cbiAgICAgICAgaWYgKHJhd1RleHRFbGVtZW50LnRlc3QoKG5vZGUgYXMgRWxlbWVudCkudGFnTmFtZSkpIHtcbiAgICAgICAgICAvLyBGb3IgcmF3IHRleHQgZWxlbWVudHMgd2UgbmVlZCB0byBzcGxpdCB0aGUgdGV4dCBjb250ZW50IG9uXG4gICAgICAgICAgLy8gbWFya2VycywgY3JlYXRlIGEgVGV4dCBub2RlIGZvciBlYWNoIHNlZ21lbnQsIGFuZCBjcmVhdGVcbiAgICAgICAgICAvLyBhIFRlbXBsYXRlUGFydCBmb3IgZWFjaCBtYXJrZXIuXG4gICAgICAgICAgY29uc3Qgc3RyaW5ncyA9IChub2RlIGFzIEVsZW1lbnQpLnRleHRDb250ZW50IS5zcGxpdChtYXJrZXIpO1xuICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IHN0cmluZ3MubGVuZ3RoIC0gMTtcbiAgICAgICAgICBpZiAobGFzdEluZGV4ID4gMCkge1xuICAgICAgICAgICAgKG5vZGUgYXMgRWxlbWVudCkudGV4dENvbnRlbnQgPSB0cnVzdGVkVHlwZXNcbiAgICAgICAgICAgICAgPyAodHJ1c3RlZFR5cGVzLmVtcHR5U2NyaXB0IGFzIHVua25vd24gYXMgJycpXG4gICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgICAvLyBHZW5lcmF0ZSBhIG5ldyB0ZXh0IG5vZGUgZm9yIGVhY2ggbGl0ZXJhbCBzZWN0aW9uXG4gICAgICAgICAgICAvLyBUaGVzZSBub2RlcyBhcmUgYWxzbyB1c2VkIGFzIHRoZSBtYXJrZXJzIGZvciBub2RlIHBhcnRzXG4gICAgICAgICAgICAvLyBXZSBjYW4ndCB1c2UgZW1wdHkgdGV4dCBub2RlcyBhcyBtYXJrZXJzIGJlY2F1c2UgdGhleSdyZVxuICAgICAgICAgICAgLy8gbm9ybWFsaXplZCB3aGVuIGNsb25pbmcgaW4gSUUgKGNvdWxkIHNpbXBsaWZ5IHdoZW5cbiAgICAgICAgICAgIC8vIElFIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhc3RJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICAgIChub2RlIGFzIEVsZW1lbnQpLmFwcGVuZChzdHJpbmdzW2ldLCBjcmVhdGVNYXJrZXIoKSk7XG4gICAgICAgICAgICAgIC8vIFdhbGsgcGFzdCB0aGUgbWFya2VyIG5vZGUgd2UganVzdCBhZGRlZFxuICAgICAgICAgICAgICB3YWxrZXIubmV4dE5vZGUoKTtcbiAgICAgICAgICAgICAgcGFydHMucHVzaCh7dHlwZTogQ0hJTERfUEFSVCwgaW5kZXg6ICsrbm9kZUluZGV4fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBOb3RlIGJlY2F1c2UgdGhpcyBtYXJrZXIgaXMgYWRkZWQgYWZ0ZXIgdGhlIHdhbGtlcidzIGN1cnJlbnRcbiAgICAgICAgICAgIC8vIG5vZGUsIGl0IHdpbGwgYmUgd2Fsa2VkIHRvIGluIHRoZSBvdXRlciBsb29wIChhbmQgaWdub3JlZCksIHNvXG4gICAgICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGFkanVzdCBub2RlSW5kZXggaGVyZVxuICAgICAgICAgICAgKG5vZGUgYXMgRWxlbWVudCkuYXBwZW5kKHN0cmluZ3NbbGFzdEluZGV4XSwgY3JlYXRlTWFya2VyKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09PSA4KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSAobm9kZSBhcyBDb21tZW50KS5kYXRhO1xuICAgICAgICBpZiAoZGF0YSA9PT0gbWFya2VyTWF0Y2gpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKHt0eXBlOiBDSElMRF9QQVJULCBpbmRleDogbm9kZUluZGV4fSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IGkgPSAtMTtcbiAgICAgICAgICB3aGlsZSAoKGkgPSAobm9kZSBhcyBDb21tZW50KS5kYXRhLmluZGV4T2YobWFya2VyLCBpICsgMSkpICE9PSAtMSkge1xuICAgICAgICAgICAgLy8gQ29tbWVudCBub2RlIGhhcyBhIGJpbmRpbmcgbWFya2VyIGluc2lkZSwgbWFrZSBhbiBpbmFjdGl2ZSBwYXJ0XG4gICAgICAgICAgICAvLyBUaGUgYmluZGluZyB3b24ndCB3b3JrLCBidXQgc3Vic2VxdWVudCBiaW5kaW5ncyB3aWxsXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKHt0eXBlOiBDT01NRU5UX1BBUlQsIGluZGV4OiBub2RlSW5kZXh9KTtcbiAgICAgICAgICAgIC8vIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgbWF0Y2hcbiAgICAgICAgICAgIGkgKz0gbWFya2VyLmxlbmd0aCAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBub2RlSW5kZXgrKztcbiAgICB9XG5cbiAgICBpZiAoREVWX01PREUpIHtcbiAgICAgIC8vIElmIHRoZXJlIHdhcyBhIGR1cGxpY2F0ZSBhdHRyaWJ1dGUgb24gYSB0YWcsIHRoZW4gd2hlbiB0aGUgdGFnIGlzXG4gICAgICAvLyBwYXJzZWQgaW50byBhbiBlbGVtZW50IHRoZSBhdHRyaWJ1dGUgZ2V0cyBkZS1kdXBsaWNhdGVkLiBXZSBjYW4gZGV0ZWN0XG4gICAgICAvLyB0aGlzIG1pc21hdGNoIGlmIHdlIGhhdmVuJ3QgcHJlY2lzZWx5IGNvbnN1bWVkIGV2ZXJ5IGF0dHJpYnV0ZSBuYW1lXG4gICAgICAvLyB3aGVuIHByZXBhcmluZyB0aGUgdGVtcGxhdGUuIFRoaXMgd29ya3MgYmVjYXVzZSBgYXR0ck5hbWVzYCBpcyBidWlsdFxuICAgICAgLy8gZnJvbSB0aGUgdGVtcGxhdGUgc3RyaW5nIGFuZCBgYXR0ck5hbWVJbmRleGAgY29tZXMgZnJvbSBwcm9jZXNzaW5nIHRoZVxuICAgICAgLy8gcmVzdWx0aW5nIERPTS5cbiAgICAgIGlmIChhdHRyTmFtZXMubGVuZ3RoICE9PSBhdHRyTmFtZUluZGV4KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRGV0ZWN0ZWQgZHVwbGljYXRlIGF0dHJpYnV0ZSBiaW5kaW5ncy4gVGhpcyBvY2N1cnMgaWYgeW91ciB0ZW1wbGF0ZSBgICtcbiAgICAgICAgICAgIGBoYXMgZHVwbGljYXRlIGF0dHJpYnV0ZXMgb24gYW4gZWxlbWVudCB0YWcuIEZvciBleGFtcGxlIGAgK1xuICAgICAgICAgICAgYFwiPGlucHV0ID9kaXNhYmxlZD1cXCR7dHJ1ZX0gP2Rpc2FibGVkPVxcJHtmYWxzZX0+XCIgY29udGFpbnMgYSBgICtcbiAgICAgICAgICAgIGBkdXBsaWNhdGUgXCJkaXNhYmxlZFwiIGF0dHJpYnV0ZS4gVGhlIGVycm9yIHdhcyBkZXRlY3RlZCBpbiBgICtcbiAgICAgICAgICAgIGB0aGUgZm9sbG93aW5nIHRlbXBsYXRlOiBcXG5gICtcbiAgICAgICAgICAgICdgJyArXG4gICAgICAgICAgICBzdHJpbmdzLmpvaW4oJyR7Li4ufScpICtcbiAgICAgICAgICAgICdgJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdlIGNvdWxkIHNldCB3YWxrZXIuY3VycmVudE5vZGUgdG8gYW5vdGhlciBub2RlIGhlcmUgdG8gcHJldmVudCBhIG1lbW9yeVxuICAgIC8vIGxlYWssIGJ1dCBldmVyeSB0aW1lIHdlIHByZXBhcmUgYSB0ZW1wbGF0ZSwgd2UgaW1tZWRpYXRlbHkgcmVuZGVyIGl0XG4gICAgLy8gYW5kIHJlLXVzZSB0aGUgd2Fsa2VyIGluIG5ldyBUZW1wbGF0ZUluc3RhbmNlLl9jbG9uZSgpLlxuICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICBraW5kOiAndGVtcGxhdGUgcHJlcCcsXG4gICAgICAgIHRlbXBsYXRlOiB0aGlzLFxuICAgICAgICBjbG9uYWJsZVRlbXBsYXRlOiB0aGlzLmVsLFxuICAgICAgICBwYXJ0czogdGhpcy5wYXJ0cyxcbiAgICAgICAgc3RyaW5ncyxcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gT3ZlcnJpZGRlbiB2aWEgYGxpdEh0bWxQb2x5ZmlsbFN1cHBvcnRgIHRvIHByb3ZpZGUgcGxhdGZvcm0gc3VwcG9ydC5cbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjcmVhdGVFbGVtZW50KGh0bWw6IFRydXN0ZWRIVE1MLCBfb3B0aW9ucz86IFJlbmRlck9wdGlvbnMpIHtcbiAgICBjb25zdCBlbCA9IGQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICBlbC5pbm5lckhUTUwgPSBodG1sIGFzIHVua25vd24gYXMgc3RyaW5nO1xuICAgIHJldHVybiBlbDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpc2Nvbm5lY3RhYmxlIHtcbiAgXyRwYXJlbnQ/OiBEaXNjb25uZWN0YWJsZTtcbiAgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuPzogU2V0PERpc2Nvbm5lY3RhYmxlPjtcbiAgLy8gUmF0aGVyIHRoYW4gaG9sZCBjb25uZWN0aW9uIHN0YXRlIG9uIGluc3RhbmNlcywgRGlzY29ubmVjdGFibGVzIHJlY3Vyc2l2ZWx5XG4gIC8vIGZldGNoIHRoZSBjb25uZWN0aW9uIHN0YXRlIGZyb20gdGhlIFJvb3RQYXJ0IHRoZXkgYXJlIGNvbm5lY3RlZCBpbiB2aWFcbiAgLy8gZ2V0dGVycyB1cCB0aGUgRGlzY29ubmVjdGFibGUgdHJlZSB2aWEgXyRwYXJlbnQgcmVmZXJlbmNlcy4gVGhpcyBwdXNoZXMgdGhlXG4gIC8vIGNvc3Qgb2YgdHJhY2tpbmcgdGhlIGlzQ29ubmVjdGVkIHN0YXRlIHRvIGBBc3luY0RpcmVjdGl2ZXNgLCBhbmQgYXZvaWRzXG4gIC8vIG5lZWRpbmcgdG8gcGFzcyBhbGwgRGlzY29ubmVjdGFibGVzIChwYXJ0cywgdGVtcGxhdGUgaW5zdGFuY2VzLCBhbmRcbiAgLy8gZGlyZWN0aXZlcykgdGhlaXIgY29ubmVjdGlvbiBzdGF0ZSBlYWNoIHRpbWUgaXQgY2hhbmdlcywgd2hpY2ggd291bGQgYmVcbiAgLy8gY29zdGx5IGZvciB0cmVlcyB0aGF0IGhhdmUgbm8gQXN5bmNEaXJlY3RpdmVzLlxuICBfJGlzQ29ubmVjdGVkOiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGlyZWN0aXZlKFxuICBwYXJ0OiBDaGlsZFBhcnQgfCBBdHRyaWJ1dGVQYXJ0IHwgRWxlbWVudFBhcnQsXG4gIHZhbHVlOiB1bmtub3duLFxuICBwYXJlbnQ6IERpcmVjdGl2ZVBhcmVudCA9IHBhcnQsXG4gIGF0dHJpYnV0ZUluZGV4PzogbnVtYmVyXG4pOiB1bmtub3duIHtcbiAgLy8gQmFpbCBlYXJseSBpZiB0aGUgdmFsdWUgaXMgZXhwbGljaXRseSBub0NoYW5nZS4gTm90ZSwgdGhpcyBtZWFucyBhbnlcbiAgLy8gbmVzdGVkIGRpcmVjdGl2ZSBpcyBzdGlsbCBhdHRhY2hlZCBhbmQgaXMgbm90IHJ1bi5cbiAgaWYgKHZhbHVlID09PSBub0NoYW5nZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBsZXQgY3VycmVudERpcmVjdGl2ZSA9XG4gICAgYXR0cmlidXRlSW5kZXggIT09IHVuZGVmaW5lZFxuICAgICAgPyAocGFyZW50IGFzIEF0dHJpYnV0ZVBhcnQpLl9fZGlyZWN0aXZlcz8uW2F0dHJpYnV0ZUluZGV4XVxuICAgICAgOiAocGFyZW50IGFzIENoaWxkUGFydCB8IEVsZW1lbnRQYXJ0IHwgRGlyZWN0aXZlKS5fX2RpcmVjdGl2ZTtcbiAgY29uc3QgbmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yID0gaXNQcmltaXRpdmUodmFsdWUpXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICAodmFsdWUgYXMgRGlyZWN0aXZlUmVzdWx0KVsnXyRsaXREaXJlY3RpdmUkJ107XG4gIGlmIChjdXJyZW50RGlyZWN0aXZlPy5jb25zdHJ1Y3RvciAhPT0gbmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yKSB7XG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICBjdXJyZW50RGlyZWN0aXZlPy5bJ18kbm90aWZ5RGlyZWN0aXZlQ29ubmVjdGlvbkNoYW5nZWQnXT8uKGZhbHNlKTtcbiAgICBpZiAobmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGN1cnJlbnREaXJlY3RpdmUgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnREaXJlY3RpdmUgPSBuZXcgbmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yKHBhcnQgYXMgUGFydEluZm8pO1xuICAgICAgY3VycmVudERpcmVjdGl2ZS5fJGluaXRpYWxpemUocGFydCwgcGFyZW50LCBhdHRyaWJ1dGVJbmRleCk7XG4gICAgfVxuICAgIGlmIChhdHRyaWJ1dGVJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAoKHBhcmVudCBhcyBBdHRyaWJ1dGVQYXJ0KS5fX2RpcmVjdGl2ZXMgPz89IFtdKVthdHRyaWJ1dGVJbmRleF0gPVxuICAgICAgICBjdXJyZW50RGlyZWN0aXZlO1xuICAgIH0gZWxzZSB7XG4gICAgICAocGFyZW50IGFzIENoaWxkUGFydCB8IERpcmVjdGl2ZSkuX19kaXJlY3RpdmUgPSBjdXJyZW50RGlyZWN0aXZlO1xuICAgIH1cbiAgfVxuICBpZiAoY3VycmVudERpcmVjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsdWUgPSByZXNvbHZlRGlyZWN0aXZlKFxuICAgICAgcGFydCxcbiAgICAgIGN1cnJlbnREaXJlY3RpdmUuXyRyZXNvbHZlKHBhcnQsICh2YWx1ZSBhcyBEaXJlY3RpdmVSZXN1bHQpLnZhbHVlcyksXG4gICAgICBjdXJyZW50RGlyZWN0aXZlLFxuICAgICAgYXR0cmlidXRlSW5kZXhcbiAgICApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IHR5cGUge1RlbXBsYXRlSW5zdGFuY2V9O1xuLyoqXG4gKiBBbiB1cGRhdGVhYmxlIGluc3RhbmNlIG9mIGEgVGVtcGxhdGUuIEhvbGRzIHJlZmVyZW5jZXMgdG8gdGhlIFBhcnRzIHVzZWQgdG9cbiAqIHVwZGF0ZSB0aGUgdGVtcGxhdGUgaW5zdGFuY2UuXG4gKi9cbmNsYXNzIFRlbXBsYXRlSW5zdGFuY2UgaW1wbGVtZW50cyBEaXNjb25uZWN0YWJsZSB7XG4gIF8kdGVtcGxhdGU6IFRlbXBsYXRlO1xuICBfJHBhcnRzOiBBcnJheTxQYXJ0IHwgdW5kZWZpbmVkPiA9IFtdO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRwYXJlbnQ6IENoaWxkUGFydDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4/OiBTZXQ8RGlzY29ubmVjdGFibGU+ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlOiBUZW1wbGF0ZSwgcGFyZW50OiBDaGlsZFBhcnQpIHtcbiAgICB0aGlzLl8kdGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB0aGlzLl8kcGFyZW50ID0gcGFyZW50O1xuICB9XG5cbiAgLy8gQ2FsbGVkIGJ5IENoaWxkUGFydCBwYXJlbnROb2RlIGdldHRlclxuICBnZXQgcGFyZW50Tm9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5wYXJlbnROb2RlO1xuICB9XG5cbiAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5fJGlzQ29ubmVjdGVkO1xuICB9XG5cbiAgLy8gVGhpcyBtZXRob2QgaXMgc2VwYXJhdGUgZnJvbSB0aGUgY29uc3RydWN0b3IgYmVjYXVzZSB3ZSBuZWVkIHRvIHJldHVybiBhXG4gIC8vIERvY3VtZW50RnJhZ21lbnQgYW5kIHdlIGRvbid0IHdhbnQgdG8gaG9sZCBvbnRvIGl0IHdpdGggYW4gaW5zdGFuY2UgZmllbGQuXG4gIF9jbG9uZShvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qge1xuICAgICAgZWw6IHtjb250ZW50fSxcbiAgICAgIHBhcnRzOiBwYXJ0cyxcbiAgICB9ID0gdGhpcy5fJHRlbXBsYXRlO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gKG9wdGlvbnM/LmNyZWF0aW9uU2NvcGUgPz8gZCkuaW1wb3J0Tm9kZShjb250ZW50LCB0cnVlKTtcbiAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBmcmFnbWVudDtcblxuICAgIGxldCBub2RlID0gd2Fsa2VyLm5leHROb2RlKCkhO1xuICAgIGxldCBub2RlSW5kZXggPSAwO1xuICAgIGxldCBwYXJ0SW5kZXggPSAwO1xuICAgIGxldCB0ZW1wbGF0ZVBhcnQgPSBwYXJ0c1swXTtcblxuICAgIHdoaWxlICh0ZW1wbGF0ZVBhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG5vZGVJbmRleCA9PT0gdGVtcGxhdGVQYXJ0LmluZGV4KSB7XG4gICAgICAgIGxldCBwYXJ0OiBQYXJ0IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGVtcGxhdGVQYXJ0LnR5cGUgPT09IENISUxEX1BBUlQpIHtcbiAgICAgICAgICBwYXJ0ID0gbmV3IENoaWxkUGFydChcbiAgICAgICAgICAgIG5vZGUgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICBub2RlLm5leHRTaWJsaW5nLFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHRlbXBsYXRlUGFydC50eXBlID09PSBBVFRSSUJVVEVfUEFSVCkge1xuICAgICAgICAgIHBhcnQgPSBuZXcgdGVtcGxhdGVQYXJ0LmN0b3IoXG4gICAgICAgICAgICBub2RlIGFzIEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgdGVtcGxhdGVQYXJ0Lm5hbWUsXG4gICAgICAgICAgICB0ZW1wbGF0ZVBhcnQuc3RyaW5ncyxcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0ZW1wbGF0ZVBhcnQudHlwZSA9PT0gRUxFTUVOVF9QQVJUKSB7XG4gICAgICAgICAgcGFydCA9IG5ldyBFbGVtZW50UGFydChub2RlIGFzIEhUTUxFbGVtZW50LCB0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl8kcGFydHMucHVzaChwYXJ0KTtcbiAgICAgICAgdGVtcGxhdGVQYXJ0ID0gcGFydHNbKytwYXJ0SW5kZXhdO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGVJbmRleCAhPT0gdGVtcGxhdGVQYXJ0Py5pbmRleCkge1xuICAgICAgICBub2RlID0gd2Fsa2VyLm5leHROb2RlKCkhO1xuICAgICAgICBub2RlSW5kZXgrKztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gV2UgbmVlZCB0byBzZXQgdGhlIGN1cnJlbnROb2RlIGF3YXkgZnJvbSB0aGUgY2xvbmVkIHRyZWUgc28gdGhhdCB3ZVxuICAgIC8vIGRvbid0IGhvbGQgb250byB0aGUgdHJlZSBldmVuIGlmIHRoZSB0cmVlIGlzIGRldGFjaGVkIGFuZCBzaG91bGQgYmVcbiAgICAvLyBmcmVlZC5cbiAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBkO1xuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIF91cGRhdGUodmFsdWVzOiBBcnJheTx1bmtub3duPikge1xuICAgIGxldCBpID0gMDtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgdGhpcy5fJHBhcnRzKSB7XG4gICAgICBpZiAocGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgIGtpbmQ6ICdzZXQgcGFydCcsXG4gICAgICAgICAgICBwYXJ0LFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlc1tpXSxcbiAgICAgICAgICAgIHZhbHVlSW5kZXg6IGksXG4gICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICB0ZW1wbGF0ZUluc3RhbmNlOiB0aGlzLFxuICAgICAgICAgIH0pO1xuICAgICAgICBpZiAoKHBhcnQgYXMgQXR0cmlidXRlUGFydCkuc3RyaW5ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKHBhcnQgYXMgQXR0cmlidXRlUGFydCkuXyRzZXRWYWx1ZSh2YWx1ZXMsIHBhcnQgYXMgQXR0cmlidXRlUGFydCwgaSk7XG4gICAgICAgICAgLy8gVGhlIG51bWJlciBvZiB2YWx1ZXMgdGhlIHBhcnQgY29uc3VtZXMgaXMgcGFydC5zdHJpbmdzLmxlbmd0aCAtIDFcbiAgICAgICAgICAvLyBzaW5jZSB2YWx1ZXMgYXJlIGluIGJldHdlZW4gdGVtcGxhdGUgc3BhbnMuIFdlIGluY3JlbWVudCBpIGJ5IDFcbiAgICAgICAgICAvLyBsYXRlciBpbiB0aGUgbG9vcCwgc28gaW5jcmVtZW50IGl0IGJ5IHBhcnQuc3RyaW5ncy5sZW5ndGggLSAyIGhlcmVcbiAgICAgICAgICBpICs9IChwYXJ0IGFzIEF0dHJpYnV0ZVBhcnQpLnN0cmluZ3MhLmxlbmd0aCAtIDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFydC5fJHNldFZhbHVlKHZhbHVlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9XG4gIH1cbn1cblxuLypcbiAqIFBhcnRzXG4gKi9cbnR5cGUgQXR0cmlidXRlVGVtcGxhdGVQYXJ0ID0ge1xuICByZWFkb25seSB0eXBlOiB0eXBlb2YgQVRUUklCVVRFX1BBUlQ7XG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgY3RvcjogdHlwZW9mIEF0dHJpYnV0ZVBhcnQ7XG4gIHJlYWRvbmx5IHN0cmluZ3M6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPjtcbn07XG50eXBlIENoaWxkVGVtcGxhdGVQYXJ0ID0ge1xuICByZWFkb25seSB0eXBlOiB0eXBlb2YgQ0hJTERfUEFSVDtcbiAgcmVhZG9ubHkgaW5kZXg6IG51bWJlcjtcbn07XG50eXBlIEVsZW1lbnRUZW1wbGF0ZVBhcnQgPSB7XG4gIHJlYWRvbmx5IHR5cGU6IHR5cGVvZiBFTEVNRU5UX1BBUlQ7XG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG59O1xudHlwZSBDb21tZW50VGVtcGxhdGVQYXJ0ID0ge1xuICByZWFkb25seSB0eXBlOiB0eXBlb2YgQ09NTUVOVF9QQVJUO1xuICByZWFkb25seSBpbmRleDogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBBIFRlbXBsYXRlUGFydCByZXByZXNlbnRzIGEgZHluYW1pYyBwYXJ0IGluIGEgdGVtcGxhdGUsIGJlZm9yZSB0aGUgdGVtcGxhdGVcbiAqIGlzIGluc3RhbnRpYXRlZC4gV2hlbiBhIHRlbXBsYXRlIGlzIGluc3RhbnRpYXRlZCBQYXJ0cyBhcmUgY3JlYXRlZCBmcm9tXG4gKiBUZW1wbGF0ZVBhcnRzLlxuICovXG50eXBlIFRlbXBsYXRlUGFydCA9XG4gIHwgQ2hpbGRUZW1wbGF0ZVBhcnRcbiAgfCBBdHRyaWJ1dGVUZW1wbGF0ZVBhcnRcbiAgfCBFbGVtZW50VGVtcGxhdGVQYXJ0XG4gIHwgQ29tbWVudFRlbXBsYXRlUGFydDtcblxuZXhwb3J0IHR5cGUgUGFydCA9XG4gIHwgQ2hpbGRQYXJ0XG4gIHwgQXR0cmlidXRlUGFydFxuICB8IFByb3BlcnR5UGFydFxuICB8IEJvb2xlYW5BdHRyaWJ1dGVQYXJ0XG4gIHwgRWxlbWVudFBhcnRcbiAgfCBFdmVudFBhcnQ7XG5cbmV4cG9ydCB0eXBlIHtDaGlsZFBhcnR9O1xuY2xhc3MgQ2hpbGRQYXJ0IGltcGxlbWVudHMgRGlzY29ubmVjdGFibGUge1xuICByZWFkb25seSB0eXBlID0gQ0hJTERfUEFSVDtcbiAgcmVhZG9ubHkgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgXyRjb21taXR0ZWRWYWx1ZTogdW5rbm93biA9IG5vdGhpbmc7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX19kaXJlY3RpdmU/OiBEaXJlY3RpdmU7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRzdGFydE5vZGU6IENoaWxkTm9kZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGVuZE5vZGU6IENoaWxkTm9kZSB8IG51bGw7XG4gIHByaXZhdGUgX3RleHRTYW5pdGl6ZXI6IFZhbHVlU2FuaXRpemVyIHwgdW5kZWZpbmVkO1xuICAvKiogQGludGVybmFsICovXG4gIF8kcGFyZW50OiBEaXNjb25uZWN0YWJsZSB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIENvbm5lY3Rpb24gc3RhdGUgZm9yIFJvb3RQYXJ0cyBvbmx5IChpLmUuIENoaWxkUGFydCB3aXRob3V0IF8kcGFyZW50XG4gICAqIHJldHVybmVkIGZyb20gdG9wLWxldmVsIGByZW5kZXJgKS4gVGhpcyBmaWVsZCBpcyB1bnVzZWQgb3RoZXJ3aXNlLiBUaGVcbiAgICogaW50ZW50aW9uIHdvdWxkIGJlIGNsZWFyZXIgaWYgd2UgbWFkZSBgUm9vdFBhcnRgIGEgc3ViY2xhc3Mgb2YgYENoaWxkUGFydGBcbiAgICogd2l0aCB0aGlzIGZpZWxkIChhbmQgYSBkaWZmZXJlbnQgXyRpc0Nvbm5lY3RlZCBnZXR0ZXIpLCBidXQgdGhlIHN1YmNsYXNzXG4gICAqIGNhdXNlZCBhIHBlcmYgcmVncmVzc2lvbiwgcG9zc2libHkgZHVlIHRvIG1ha2luZyBjYWxsIHNpdGVzIHBvbHltb3JwaGljLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9faXNDb25uZWN0ZWQ6IGJvb2xlYW47XG5cbiAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICAvLyBDaGlsZFBhcnRzIHRoYXQgYXJlIG5vdCBhdCB0aGUgcm9vdCBzaG91bGQgYWx3YXlzIGJlIGNyZWF0ZWQgd2l0aCBhXG4gICAgLy8gcGFyZW50OyBvbmx5IFJvb3RDaGlsZE5vZGUncyB3b24ndCwgc28gdGhleSByZXR1cm4gdGhlIGxvY2FsIGlzQ29ubmVjdGVkXG4gICAgLy8gc3RhdGVcbiAgICByZXR1cm4gdGhpcy5fJHBhcmVudD8uXyRpc0Nvbm5lY3RlZCA/PyB0aGlzLl9faXNDb25uZWN0ZWQ7XG4gIH1cblxuICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkcyB3aWxsIGJlIHBhdGNoZWQgb250byBDaGlsZFBhcnRzIHdoZW4gcmVxdWlyZWQgYnlcbiAgLy8gQXN5bmNEaXJlY3RpdmVcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4/OiBTZXQ8RGlzY29ubmVjdGFibGU+ID0gdW5kZWZpbmVkO1xuICAvKiogQGludGVybmFsICovXG4gIF8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQ/KFxuICAgIGlzQ29ubmVjdGVkOiBib29sZWFuLFxuICAgIHJlbW92ZUZyb21QYXJlbnQ/OiBib29sZWFuLFxuICAgIGZyb20/OiBudW1iZXJcbiAgKTogdm9pZDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJHJlcGFyZW50RGlzY29ubmVjdGFibGVzPyhwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlKTogdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzdGFydE5vZGU6IENoaWxkTm9kZSxcbiAgICBlbmROb2RlOiBDaGlsZE5vZGUgfCBudWxsLFxuICAgIHBhcmVudDogVGVtcGxhdGVJbnN0YW5jZSB8IENoaWxkUGFydCB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuXyRzdGFydE5vZGUgPSBzdGFydE5vZGU7XG4gICAgdGhpcy5fJGVuZE5vZGUgPSBlbmROb2RlO1xuICAgIHRoaXMuXyRwYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAvLyBOb3RlIF9faXNDb25uZWN0ZWQgaXMgb25seSBldmVyIGFjY2Vzc2VkIG9uIFJvb3RQYXJ0cyAoaS5lLiB3aGVuIHRoZXJlIGlzXG4gICAgLy8gbm8gXyRwYXJlbnQpOyB0aGUgdmFsdWUgb24gYSBub24tcm9vdC1wYXJ0IGlzIFwiZG9uJ3QgY2FyZVwiLCBidXQgY2hlY2tpbmdcbiAgICAvLyBmb3IgcGFyZW50IHdvdWxkIGJlIG1vcmUgY29kZVxuICAgIHRoaXMuX19pc0Nvbm5lY3RlZCA9IG9wdGlvbnM/LmlzQ29ubmVjdGVkID8/IHRydWU7XG4gICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgLy8gRXhwbGljaXRseSBpbml0aWFsaXplIGZvciBjb25zaXN0ZW50IGNsYXNzIHNoYXBlLlxuICAgICAgdGhpcy5fdGV4dFNhbml0aXplciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhcmVudCBub2RlIGludG8gd2hpY2ggdGhlIHBhcnQgcmVuZGVycyBpdHMgY29udGVudC5cbiAgICpcbiAgICogQSBDaGlsZFBhcnQncyBjb250ZW50IGNvbnNpc3RzIG9mIGEgcmFuZ2Ugb2YgYWRqYWNlbnQgY2hpbGQgbm9kZXMgb2ZcbiAgICogYC5wYXJlbnROb2RlYCwgcG9zc2libHkgYm9yZGVyZWQgYnkgJ21hcmtlciBub2RlcycgKGAuc3RhcnROb2RlYCBhbmRcbiAgICogYC5lbmROb2RlYCkuXG4gICAqXG4gICAqIC0gSWYgYm90aCBgLnN0YXJ0Tm9kZWAgYW5kIGAuZW5kTm9kZWAgYXJlIG5vbi1udWxsLCB0aGVuIHRoZSBwYXJ0J3MgY29udGVudFxuICAgKiBjb25zaXN0cyBvZiBhbGwgc2libGluZ3MgYmV0d2VlbiBgLnN0YXJ0Tm9kZWAgYW5kIGAuZW5kTm9kZWAsIGV4Y2x1c2l2ZWx5LlxuICAgKlxuICAgKiAtIElmIGAuc3RhcnROb2RlYCBpcyBub24tbnVsbCBidXQgYC5lbmROb2RlYCBpcyBudWxsLCB0aGVuIHRoZSBwYXJ0J3NcbiAgICogY29udGVudCBjb25zaXN0cyBvZiBhbGwgc2libGluZ3MgZm9sbG93aW5nIGAuc3RhcnROb2RlYCwgdXAgdG8gYW5kXG4gICAqIGluY2x1ZGluZyB0aGUgbGFzdCBjaGlsZCBvZiBgLnBhcmVudE5vZGVgLiBJZiBgLmVuZE5vZGVgIGlzIG5vbi1udWxsLCB0aGVuXG4gICAqIGAuc3RhcnROb2RlYCB3aWxsIGFsd2F5cyBiZSBub24tbnVsbC5cbiAgICpcbiAgICogLSBJZiBib3RoIGAuZW5kTm9kZWAgYW5kIGAuc3RhcnROb2RlYCBhcmUgbnVsbCwgdGhlbiB0aGUgcGFydCdzIGNvbnRlbnRcbiAgICogY29uc2lzdHMgb2YgYWxsIGNoaWxkIG5vZGVzIG9mIGAucGFyZW50Tm9kZWAuXG4gICAqL1xuICBnZXQgcGFyZW50Tm9kZSgpOiBOb2RlIHtcbiAgICBsZXQgcGFyZW50Tm9kZTogTm9kZSA9IHdyYXAodGhpcy5fJHN0YXJ0Tm9kZSkucGFyZW50Tm9kZSE7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5fJHBhcmVudDtcbiAgICBpZiAoXG4gICAgICBwYXJlbnQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyZW50Tm9kZT8ubm9kZVR5cGUgPT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlQgKi9cbiAgICApIHtcbiAgICAgIC8vIElmIHRoZSBwYXJlbnROb2RlIGlzIGEgRG9jdW1lbnRGcmFnbWVudCwgaXQgbWF5IGJlIGJlY2F1c2UgdGhlIERPTSBpc1xuICAgICAgLy8gc3RpbGwgaW4gdGhlIGNsb25lZCBmcmFnbWVudCBkdXJpbmcgaW5pdGlhbCByZW5kZXI7IGlmIHNvLCBnZXQgdGhlIHJlYWxcbiAgICAgIC8vIHBhcmVudE5vZGUgdGhlIHBhcnQgd2lsbCBiZSBjb21taXR0ZWQgaW50byBieSBhc2tpbmcgdGhlIHBhcmVudC5cbiAgICAgIHBhcmVudE5vZGUgPSAocGFyZW50IGFzIENoaWxkUGFydCB8IFRlbXBsYXRlSW5zdGFuY2UpLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBwYXJlbnROb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJ0J3MgbGVhZGluZyBtYXJrZXIgbm9kZSwgaWYgYW55LiBTZWUgYC5wYXJlbnROb2RlYCBmb3IgbW9yZVxuICAgKiBpbmZvcm1hdGlvbi5cbiAgICovXG4gIGdldCBzdGFydE5vZGUoKTogTm9kZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl8kc3RhcnROb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJ0J3MgdHJhaWxpbmcgbWFya2VyIG5vZGUsIGlmIGFueS4gU2VlIGAucGFyZW50Tm9kZWAgZm9yIG1vcmVcbiAgICogaW5mb3JtYXRpb24uXG4gICAqL1xuICBnZXQgZW5kTm9kZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuXyRlbmROb2RlO1xuICB9XG5cbiAgXyRzZXRWYWx1ZSh2YWx1ZTogdW5rbm93biwgZGlyZWN0aXZlUGFyZW50OiBEaXJlY3RpdmVQYXJlbnQgPSB0aGlzKTogdm9pZCB7XG4gICAgaWYgKERFVl9NT0RFICYmIHRoaXMucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhpcyBcXGBDaGlsZFBhcnRcXGAgaGFzIG5vIFxcYHBhcmVudE5vZGVcXGAgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYWNjZXB0IGEgdmFsdWUuIFRoaXMgbGlrZWx5IG1lYW5zIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIHBhcnQgd2FzIG1hbmlwdWxhdGVkIGluIGFuIHVuc3VwcG9ydGVkIHdheSBvdXRzaWRlIG9mIExpdCdzIGNvbnRyb2wgc3VjaCB0aGF0IHRoZSBwYXJ0J3MgbWFya2VyIG5vZGVzIHdlcmUgZWplY3RlZCBmcm9tIERPTS4gRm9yIGV4YW1wbGUsIHNldHRpbmcgdGhlIGVsZW1lbnQncyBcXGBpbm5lckhUTUxcXGAgb3IgXFxgdGV4dENvbnRlbnRcXGAgY2FuIGRvIHRoaXMuYFxuICAgICAgKTtcbiAgICB9XG4gICAgdmFsdWUgPSByZXNvbHZlRGlyZWN0aXZlKHRoaXMsIHZhbHVlLCBkaXJlY3RpdmVQYXJlbnQpO1xuICAgIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgIC8vIE5vbi1yZW5kZXJpbmcgY2hpbGQgdmFsdWVzLiBJdCdzIGltcG9ydGFudCB0aGF0IHRoZXNlIGRvIG5vdCByZW5kZXJcbiAgICAgIC8vIGVtcHR5IHRleHQgbm9kZXMgdG8gYXZvaWQgaXNzdWVzIHdpdGggcHJldmVudGluZyBkZWZhdWx0IDxzbG90PlxuICAgICAgLy8gZmFsbGJhY2sgY29udGVudC5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbm90aGluZyB8fCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSAnJykge1xuICAgICAgICBpZiAodGhpcy5fJGNvbW1pdHRlZFZhbHVlICE9PSBub3RoaW5nKSB7XG4gICAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgbm90aGluZyB0byBjaGlsZCcsXG4gICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLl8kc3RhcnROb2RlLFxuICAgICAgICAgICAgICBlbmQ6IHRoaXMuXyRlbmROb2RlLFxuICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXMuXyRwYXJlbnQsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuXyRjbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IG5vdGhpbmc7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSB0aGlzLl8kY29tbWl0dGVkVmFsdWUgJiYgdmFsdWUgIT09IG5vQ2hhbmdlKSB7XG4gICAgICAgIHRoaXMuX2NvbW1pdFRleHQodmFsdWUpO1xuICAgICAgfVxuICAgICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICB9IGVsc2UgaWYgKCh2YWx1ZSBhcyBUZW1wbGF0ZVJlc3VsdClbJ18kbGl0VHlwZSQnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9jb21taXRUZW1wbGF0ZVJlc3VsdCh2YWx1ZSBhcyBUZW1wbGF0ZVJlc3VsdCk7XG4gICAgfSBlbHNlIGlmICgodmFsdWUgYXMgTm9kZSkubm9kZVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKERFVl9NT0RFICYmIHRoaXMub3B0aW9ucz8uaG9zdCA9PT0gdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fY29tbWl0VGV4dChcbiAgICAgICAgICBgW3Byb2JhYmxlIG1pc3Rha2U6IHJlbmRlcmVkIGEgdGVtcGxhdGUncyBob3N0IGluIGl0c2VsZiBgICtcbiAgICAgICAgICAgIGAoY29tbW9ubHkgY2F1c2VkIGJ5IHdyaXRpbmcgXFwke3RoaXN9IGluIGEgdGVtcGxhdGVdYFxuICAgICAgICApO1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYEF0dGVtcHRlZCB0byByZW5kZXIgdGhlIHRlbXBsYXRlIGhvc3RgLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIGBpbnNpZGUgaXRzZWxmLiBUaGlzIGlzIGFsbW9zdCBhbHdheXMgYSBtaXN0YWtlLCBhbmQgaW4gZGV2IG1vZGUgYCxcbiAgICAgICAgICBgd2UgcmVuZGVyIHNvbWUgd2FybmluZyB0ZXh0LiBJbiBwcm9kdWN0aW9uIGhvd2V2ZXIsIHdlJ2xsIGAsXG4gICAgICAgICAgYHJlbmRlciBpdCwgd2hpY2ggd2lsbCB1c3VhbGx5IHJlc3VsdCBpbiBhbiBlcnJvciwgYW5kIHNvbWV0aW1lcyBgLFxuICAgICAgICAgIGBpbiB0aGUgZWxlbWVudCBkaXNhcHBlYXJpbmcgZnJvbSB0aGUgRE9NLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fY29tbWl0Tm9kZSh2YWx1ZSBhcyBOb2RlKTtcbiAgICB9IGVsc2UgaWYgKGlzSXRlcmFibGUodmFsdWUpKSB7XG4gICAgICB0aGlzLl9jb21taXRJdGVyYWJsZSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGxiYWNrLCB3aWxsIHJlbmRlciB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAgICB0aGlzLl9jb21taXRUZXh0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pbnNlcnQ8VCBleHRlbmRzIE5vZGU+KG5vZGU6IFQpIHtcbiAgICByZXR1cm4gd3JhcCh3cmFwKHRoaXMuXyRzdGFydE5vZGUpLnBhcmVudE5vZGUhKS5pbnNlcnRCZWZvcmUoXG4gICAgICBub2RlLFxuICAgICAgdGhpcy5fJGVuZE5vZGVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tbWl0Tm9kZSh2YWx1ZTogTm9kZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl8kY2xlYXIoKTtcbiAgICAgIGlmIChcbiAgICAgICAgRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTICYmXG4gICAgICAgIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCAhPT0gbm9vcFNhbml0aXplclxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGVOYW1lID0gdGhpcy5fJHN0YXJ0Tm9kZS5wYXJlbnROb2RlPy5ub2RlTmFtZTtcbiAgICAgICAgaWYgKHBhcmVudE5vZGVOYW1lID09PSAnU1RZTEUnIHx8IHBhcmVudE5vZGVOYW1lID09PSAnU0NSSVBUJykge1xuICAgICAgICAgIGxldCBtZXNzYWdlID0gJ0ZvcmJpZGRlbic7XG4gICAgICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZU5hbWUgPT09ICdTVFlMRScpIHtcbiAgICAgICAgICAgICAgbWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgYExpdCBkb2VzIG5vdCBzdXBwb3J0IGJpbmRpbmcgaW5zaWRlIHN0eWxlIG5vZGVzLiBgICtcbiAgICAgICAgICAgICAgICBgVGhpcyBpcyBhIHNlY3VyaXR5IHJpc2ssIGFzIHN0eWxlIGluamVjdGlvbiBhdHRhY2tzIGNhbiBgICtcbiAgICAgICAgICAgICAgICBgZXhmaWx0cmF0ZSBkYXRhIGFuZCBzcG9vZiBVSXMuIGAgK1xuICAgICAgICAgICAgICAgIGBDb25zaWRlciBpbnN0ZWFkIHVzaW5nIGNzc1xcYC4uLlxcYCBsaXRlcmFscyBgICtcbiAgICAgICAgICAgICAgICBgdG8gY29tcG9zZSBzdHlsZXMsIGFuZCBkbyBkeW5hbWljIHN0eWxpbmcgd2l0aCBgICtcbiAgICAgICAgICAgICAgICBgY3NzIGN1c3RvbSBwcm9wZXJ0aWVzLCA6OnBhcnRzLCA8c2xvdD5zLCBgICtcbiAgICAgICAgICAgICAgICBgYW5kIGJ5IG11dGF0aW5nIHRoZSBET00gcmF0aGVyIHRoYW4gc3R5bGVzaGVldHMuYDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgIGBMaXQgZG9lcyBub3Qgc3VwcG9ydCBiaW5kaW5nIGluc2lkZSBzY3JpcHQgbm9kZXMuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGlzIGlzIGEgc2VjdXJpdHkgcmlzaywgYXMgaXQgY291bGQgYWxsb3cgYXJiaXRyYXJ5IGAgK1xuICAgICAgICAgICAgICAgIGBjb2RlIGV4ZWN1dGlvbi5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAga2luZDogJ2NvbW1pdCBub2RlJyxcbiAgICAgICAgICBzdGFydDogdGhpcy5fJHN0YXJ0Tm9kZSxcbiAgICAgICAgICBwYXJlbnQ6IHRoaXMuXyRwYXJlbnQsXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSB0aGlzLl9pbnNlcnQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NvbW1pdFRleHQodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBJZiB0aGUgY29tbWl0dGVkIHZhbHVlIGlzIGEgcHJpbWl0aXZlIGl0IG1lYW5zIHdlIGNhbGxlZCBfY29tbWl0VGV4dCBvblxuICAgIC8vIHRoZSBwcmV2aW91cyByZW5kZXIsIGFuZCB3ZSBrbm93IHRoYXQgdGhpcy5fJHN0YXJ0Tm9kZS5uZXh0U2libGluZyBpcyBhXG4gICAgLy8gVGV4dCBub2RlLiBXZSBjYW4gbm93IGp1c3QgcmVwbGFjZSB0aGUgdGV4dCBjb250ZW50ICguZGF0YSkgb2YgdGhlIG5vZGUuXG4gICAgaWYgKFxuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlICE9PSBub3RoaW5nICYmXG4gICAgICBpc1ByaW1pdGl2ZSh0aGlzLl8kY29tbWl0dGVkVmFsdWUpXG4gICAgKSB7XG4gICAgICBjb25zdCBub2RlID0gd3JhcCh0aGlzLl8kc3RhcnROb2RlKS5uZXh0U2libGluZyBhcyBUZXh0O1xuICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICBpZiAodGhpcy5fdGV4dFNhbml0aXplciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5fdGV4dFNhbml0aXplciA9IGNyZWF0ZVNhbml0aXplcihub2RlLCAnZGF0YScsICdwcm9wZXJ0eScpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdGhpcy5fdGV4dFNhbml0aXplcih2YWx1ZSk7XG4gICAgICB9XG4gICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgIGtpbmQ6ICdjb21taXQgdGV4dCcsXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgICAgKG5vZGUgYXMgVGV4dCkuZGF0YSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgICAgICB0aGlzLl9jb21taXROb2RlKHRleHROb2RlKTtcbiAgICAgICAgLy8gV2hlbiBzZXR0aW5nIHRleHQgY29udGVudCwgZm9yIHNlY3VyaXR5IHB1cnBvc2VzIGl0IG1hdHRlcnMgYSBsb3RcbiAgICAgICAgLy8gd2hhdCB0aGUgcGFyZW50IGlzLiBGb3IgZXhhbXBsZSwgPHN0eWxlPiBhbmQgPHNjcmlwdD4gbmVlZCB0byBiZVxuICAgICAgICAvLyBoYW5kbGVkIHdpdGggY2FyZSwgd2hpbGUgPHNwYW4+IGRvZXMgbm90LiBTbyBmaXJzdCB3ZSBuZWVkIHRvIHB1dCBhXG4gICAgICAgIC8vIHRleHQgbm9kZSBpbnRvIHRoZSBkb2N1bWVudCwgdGhlbiB3ZSBjYW4gc2FuaXRpemUgaXRzIGNvbnRlbnQuXG4gICAgICAgIGlmICh0aGlzLl90ZXh0U2FuaXRpemVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLl90ZXh0U2FuaXRpemVyID0gY3JlYXRlU2FuaXRpemVyKHRleHROb2RlLCAnZGF0YScsICdwcm9wZXJ0eScpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdGhpcy5fdGV4dFNhbml0aXplcih2YWx1ZSk7XG4gICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgdGV4dCcsXG4gICAgICAgICAgICBub2RlOiB0ZXh0Tm9kZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB0ZXh0Tm9kZS5kYXRhID0gdmFsdWUgYXMgc3RyaW5nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY29tbWl0Tm9kZShkLmNyZWF0ZVRleHROb2RlKHZhbHVlIGFzIHN0cmluZykpO1xuICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICBraW5kOiAnY29tbWl0IHRleHQnLFxuICAgICAgICAgICAgbm9kZTogd3JhcCh0aGlzLl8kc3RhcnROb2RlKS5uZXh0U2libGluZyBhcyBUZXh0LFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tbWl0VGVtcGxhdGVSZXN1bHQoXG4gICAgcmVzdWx0OiBUZW1wbGF0ZVJlc3VsdCB8IENvbXBpbGVkVGVtcGxhdGVSZXN1bHRcbiAgKTogdm9pZCB7XG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICBjb25zdCB7dmFsdWVzLCBbJ18kbGl0VHlwZSQnXTogdHlwZX0gPSByZXN1bHQ7XG4gICAgLy8gSWYgJGxpdFR5cGUkIGlzIGEgbnVtYmVyLCByZXN1bHQgaXMgYSBwbGFpbiBUZW1wbGF0ZVJlc3VsdCBhbmQgd2UgZ2V0XG4gICAgLy8gdGhlIHRlbXBsYXRlIGZyb20gdGhlIHRlbXBsYXRlIGNhY2hlLiBJZiBub3QsIHJlc3VsdCBpcyBhXG4gICAgLy8gQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCBhbmQgXyRsaXRUeXBlJCBpcyBhIENvbXBpbGVkVGVtcGxhdGUgYW5kIHdlIG5lZWRcbiAgICAvLyB0byBjcmVhdGUgdGhlIDx0ZW1wbGF0ZT4gZWxlbWVudCB0aGUgZmlyc3QgdGltZSB3ZSBzZWUgaXQuXG4gICAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlIHwgQ29tcGlsZWRUZW1wbGF0ZSA9XG4gICAgICB0eXBlb2YgdHlwZSA9PT0gJ251bWJlcidcbiAgICAgICAgPyB0aGlzLl8kZ2V0VGVtcGxhdGUocmVzdWx0IGFzIFVuY29tcGlsZWRUZW1wbGF0ZVJlc3VsdClcbiAgICAgICAgOiAodHlwZS5lbCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAodHlwZS5lbCA9IFRlbXBsYXRlLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgIHRydXN0RnJvbVRlbXBsYXRlU3RyaW5nKHR5cGUuaCwgdHlwZS5oWzBdKSxcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zXG4gICAgICAgICAgICApKSxcbiAgICAgICAgICB0eXBlKTtcblxuICAgIGlmICgodGhpcy5fJGNvbW1pdHRlZFZhbHVlIGFzIFRlbXBsYXRlSW5zdGFuY2UpPy5fJHRlbXBsYXRlID09PSB0ZW1wbGF0ZSkge1xuICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICBraW5kOiAndGVtcGxhdGUgdXBkYXRpbmcnLFxuICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgIGluc3RhbmNlOiB0aGlzLl8kY29tbWl0dGVkVmFsdWUgYXMgVGVtcGxhdGVJbnN0YW5jZSxcbiAgICAgICAgICBwYXJ0czogKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSBhcyBUZW1wbGF0ZUluc3RhbmNlKS5fJHBhcnRzLFxuICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgIH0pO1xuICAgICAgKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSBhcyBUZW1wbGF0ZUluc3RhbmNlKS5fdXBkYXRlKHZhbHVlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFRlbXBsYXRlSW5zdGFuY2UodGVtcGxhdGUgYXMgVGVtcGxhdGUsIHRoaXMpO1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBpbnN0YW5jZS5fY2xvbmUodGhpcy5vcHRpb25zKTtcbiAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAga2luZDogJ3RlbXBsYXRlIGluc3RhbnRpYXRlZCcsXG4gICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgcGFydHM6IGluc3RhbmNlLl8kcGFydHMsXG4gICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgIGZyYWdtZW50LFxuICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgfSk7XG4gICAgICBpbnN0YW5jZS5fdXBkYXRlKHZhbHVlcyk7XG4gICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQgYW5kIHVwZGF0ZWQnLFxuICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIHBhcnRzOiBpbnN0YW5jZS5fJHBhcnRzLFxuICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICBmcmFnbWVudCxcbiAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgIH0pO1xuICAgICAgdGhpcy5fY29tbWl0Tm9kZShmcmFnbWVudCk7XG4gICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSBpbnN0YW5jZTtcbiAgICB9XG4gIH1cblxuICAvLyBPdmVycmlkZGVuIHZpYSBgbGl0SHRtbFBvbHlmaWxsU3VwcG9ydGAgdG8gcHJvdmlkZSBwbGF0Zm9ybSBzdXBwb3J0LlxuICAvKiogQGludGVybmFsICovXG4gIF8kZ2V0VGVtcGxhdGUocmVzdWx0OiBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQpIHtcbiAgICBsZXQgdGVtcGxhdGUgPSB0ZW1wbGF0ZUNhY2hlLmdldChyZXN1bHQuc3RyaW5ncyk7XG4gICAgaWYgKHRlbXBsYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRlbXBsYXRlQ2FjaGUuc2V0KHJlc3VsdC5zdHJpbmdzLCAodGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUocmVzdWx0KSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcGxhdGU7XG4gIH1cblxuICBwcml2YXRlIF9jb21taXRJdGVyYWJsZSh2YWx1ZTogSXRlcmFibGU8dW5rbm93bj4pOiB2b2lkIHtcbiAgICAvLyBGb3IgYW4gSXRlcmFibGUsIHdlIGNyZWF0ZSBhIG5ldyBJbnN0YW5jZVBhcnQgcGVyIGl0ZW0sIHRoZW4gc2V0IGl0c1xuICAgIC8vIHZhbHVlIHRvIHRoZSBpdGVtLiBUaGlzIGlzIGEgbGl0dGxlIGJpdCBvZiBvdmVyaGVhZCBmb3IgZXZlcnkgaXRlbSBpblxuICAgIC8vIGFuIEl0ZXJhYmxlLCBidXQgaXQgbGV0cyB1cyByZWN1cnNlIGVhc2lseSBhbmQgZWZmaWNpZW50bHkgdXBkYXRlIEFycmF5c1xuICAgIC8vIG9mIFRlbXBsYXRlUmVzdWx0cyB0aGF0IHdpbGwgYmUgY29tbW9ubHkgcmV0dXJuZWQgZnJvbSBleHByZXNzaW9ucyBsaWtlOlxuICAgIC8vIGFycmF5Lm1hcCgoaSkgPT4gaHRtbGAke2l9YCksIGJ5IHJldXNpbmcgZXhpc3RpbmcgVGVtcGxhdGVJbnN0YW5jZXMuXG5cbiAgICAvLyBJZiB2YWx1ZSBpcyBhbiBhcnJheSwgdGhlbiB0aGUgcHJldmlvdXMgcmVuZGVyIHdhcyBvZiBhblxuICAgIC8vIGl0ZXJhYmxlIGFuZCB2YWx1ZSB3aWxsIGNvbnRhaW4gdGhlIENoaWxkUGFydHMgZnJvbSB0aGUgcHJldmlvdXNcbiAgICAvLyByZW5kZXIuIElmIHZhbHVlIGlzIG5vdCBhbiBhcnJheSwgY2xlYXIgdGhpcyBwYXJ0IGFuZCBtYWtlIGEgbmV3XG4gICAgLy8gYXJyYXkgZm9yIENoaWxkUGFydHMuXG4gICAgaWYgKCFpc0FycmF5KHRoaXMuXyRjb21taXR0ZWRWYWx1ZSkpIHtcbiAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IFtdO1xuICAgICAgdGhpcy5fJGNsZWFyKCk7XG4gICAgfVxuXG4gICAgLy8gTGV0cyB1cyBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IGl0ZW1zIHdlIHN0YW1wZWQgc28gd2UgY2FuIGNsZWFyIGxlZnRvdmVyXG4gICAgLy8gaXRlbXMgZnJvbSBhIHByZXZpb3VzIHJlbmRlclxuICAgIGNvbnN0IGl0ZW1QYXJ0cyA9IHRoaXMuXyRjb21taXR0ZWRWYWx1ZSBhcyBDaGlsZFBhcnRbXTtcbiAgICBsZXQgcGFydEluZGV4ID0gMDtcbiAgICBsZXQgaXRlbVBhcnQ6IENoaWxkUGFydCB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgaWYgKHBhcnRJbmRleCA9PT0gaXRlbVBhcnRzLmxlbmd0aCkge1xuICAgICAgICAvLyBJZiBubyBleGlzdGluZyBwYXJ0LCBjcmVhdGUgYSBuZXcgb25lXG4gICAgICAgIC8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiB0ZXN0IHBlcmYgaW1wYWN0IG9mIGFsd2F5cyBjcmVhdGluZyB0d28gcGFydHNcbiAgICAgICAgLy8gaW5zdGVhZCBvZiBzaGFyaW5nIHBhcnRzIGJldHdlZW4gbm9kZXNcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvaXNzdWVzLzEyNjZcbiAgICAgICAgaXRlbVBhcnRzLnB1c2goXG4gICAgICAgICAgKGl0ZW1QYXJ0ID0gbmV3IENoaWxkUGFydChcbiAgICAgICAgICAgIHRoaXMuX2luc2VydChjcmVhdGVNYXJrZXIoKSksXG4gICAgICAgICAgICB0aGlzLl9pbnNlcnQoY3JlYXRlTWFya2VyKCkpLFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc1xuICAgICAgICAgICkpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZXVzZSBhbiBleGlzdGluZyBwYXJ0XG4gICAgICAgIGl0ZW1QYXJ0ID0gaXRlbVBhcnRzW3BhcnRJbmRleF07XG4gICAgICB9XG4gICAgICBpdGVtUGFydC5fJHNldFZhbHVlKGl0ZW0pO1xuICAgICAgcGFydEluZGV4Kys7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRJbmRleCA8IGl0ZW1QYXJ0cy5sZW5ndGgpIHtcbiAgICAgIC8vIGl0ZW1QYXJ0cyBhbHdheXMgaGF2ZSBlbmQgbm9kZXNcbiAgICAgIHRoaXMuXyRjbGVhcihcbiAgICAgICAgaXRlbVBhcnQgJiYgd3JhcChpdGVtUGFydC5fJGVuZE5vZGUhKS5uZXh0U2libGluZyxcbiAgICAgICAgcGFydEluZGV4XG4gICAgICApO1xuICAgICAgLy8gVHJ1bmNhdGUgdGhlIHBhcnRzIGFycmF5IHNvIF92YWx1ZSByZWZsZWN0cyB0aGUgY3VycmVudCBzdGF0ZVxuICAgICAgaXRlbVBhcnRzLmxlbmd0aCA9IHBhcnRJbmRleDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgbm9kZXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIFBhcnQgZnJvbSB0aGUgRE9NLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhcnQgU3RhcnQgbm9kZSB0byBjbGVhciBmcm9tLCBmb3IgY2xlYXJpbmcgYSBzdWJzZXQgb2YgdGhlIHBhcnQnc1xuICAgKiAgICAgRE9NICh1c2VkIHdoZW4gdHJ1bmNhdGluZyBpdGVyYWJsZXMpXG4gICAqIEBwYXJhbSBmcm9tICBXaGVuIGBzdGFydGAgaXMgc3BlY2lmaWVkLCB0aGUgaW5kZXggd2l0aGluIHRoZSBpdGVyYWJsZSBmcm9tXG4gICAqICAgICB3aGljaCBDaGlsZFBhcnRzIGFyZSBiZWluZyByZW1vdmVkLCB1c2VkIGZvciBkaXNjb25uZWN0aW5nIGRpcmVjdGl2ZXMgaW5cbiAgICogICAgIHRob3NlIFBhcnRzLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF8kY2xlYXIoXG4gICAgc3RhcnQ6IENoaWxkTm9kZSB8IG51bGwgPSB3cmFwKHRoaXMuXyRzdGFydE5vZGUpLm5leHRTaWJsaW5nLFxuICAgIGZyb20/OiBudW1iZXJcbiAgKSB7XG4gICAgdGhpcy5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkPy4oZmFsc2UsIHRydWUsIGZyb20pO1xuICAgIHdoaWxlIChzdGFydCAmJiBzdGFydCAhPT0gdGhpcy5fJGVuZE5vZGUpIHtcbiAgICAgIGNvbnN0IG4gPSB3cmFwKHN0YXJ0ISkubmV4dFNpYmxpbmc7XG4gICAgICAod3JhcChzdGFydCEpIGFzIEVsZW1lbnQpLnJlbW92ZSgpO1xuICAgICAgc3RhcnQgPSBuO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gb2YgUm9vdFBhcnQncyBgaXNDb25uZWN0ZWRgLiBOb3RlIHRoYXQgdGhpcyBtZXRob2RcbiAgICogc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGBSb290UGFydGBzICh0aGUgYENoaWxkUGFydGAgcmV0dXJuZWQgZnJvbSBhXG4gICAqIHRvcC1sZXZlbCBgcmVuZGVyKClgIGNhbGwpLiBJdCBoYXMgbm8gZWZmZWN0IG9uIG5vbi1yb290IENoaWxkUGFydHMuXG4gICAqIEBwYXJhbSBpc0Nvbm5lY3RlZCBXaGV0aGVyIHRvIHNldFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHNldENvbm5lY3RlZChpc0Nvbm5lY3RlZDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLl8kcGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX19pc0Nvbm5lY3RlZCA9IGlzQ29ubmVjdGVkO1xuICAgICAgdGhpcy5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkPy4oaXNDb25uZWN0ZWQpO1xuICAgIH0gZWxzZSBpZiAoREVWX01PREUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3BhcnQuc2V0Q29ubmVjdGVkKCkgbWF5IG9ubHkgYmUgY2FsbGVkIG9uIGEgJyArXG4gICAgICAgICAgJ1Jvb3RQYXJ0IHJldHVybmVkIGZyb20gcmVuZGVyKCkuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIHRvcC1sZXZlbCBgQ2hpbGRQYXJ0YCByZXR1cm5lZCBmcm9tIGByZW5kZXJgIHRoYXQgbWFuYWdlcyB0aGUgY29ubmVjdGVkXG4gKiBzdGF0ZSBvZiBgQXN5bmNEaXJlY3RpdmVgcyBjcmVhdGVkIHRocm91Z2hvdXQgdGhlIHRyZWUgYmVsb3cgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdFBhcnQgZXh0ZW5kcyBDaGlsZFBhcnQge1xuICAvKipcbiAgICogU2V0cyB0aGUgY29ubmVjdGlvbiBzdGF0ZSBmb3IgYEFzeW5jRGlyZWN0aXZlYHMgY29udGFpbmVkIHdpdGhpbiB0aGlzIHJvb3RcbiAgICogQ2hpbGRQYXJ0LlxuICAgKlxuICAgKiBsaXQtaHRtbCBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IG1vbml0b3IgdGhlIGNvbm5lY3RlZG5lc3Mgb2YgRE9NIHJlbmRlcmVkO1xuICAgKiBhcyBzdWNoLCBpdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBgcmVuZGVyYCB0byBlbnN1cmUgdGhhdFxuICAgKiBgcGFydC5zZXRDb25uZWN0ZWQoZmFsc2UpYCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBwYXJ0IG9iamVjdCBpcyBwb3RlbnRpYWxseVxuICAgKiBkaXNjYXJkZWQsIHRvIGVuc3VyZSB0aGF0IGBBc3luY0RpcmVjdGl2ZWBzIGhhdmUgYSBjaGFuY2UgdG8gZGlzcG9zZSBvZlxuICAgKiBhbnkgcmVzb3VyY2VzIGJlaW5nIGhlbGQuIElmIGEgYFJvb3RQYXJ0YCB0aGF0IHdhcyBwcmV2aW91c2x5XG4gICAqIGRpc2Nvbm5lY3RlZCBpcyBzdWJzZXF1ZW50bHkgcmUtY29ubmVjdGVkIChhbmQgaXRzIGBBc3luY0RpcmVjdGl2ZWBzIHNob3VsZFxuICAgKiByZS1jb25uZWN0KSwgYHNldENvbm5lY3RlZCh0cnVlKWAgc2hvdWxkIGJlIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGlzQ29ubmVjdGVkIFdoZXRoZXIgZGlyZWN0aXZlcyB3aXRoaW4gdGhpcyB0cmVlIHNob3VsZCBiZSBjb25uZWN0ZWRcbiAgICogb3Igbm90XG4gICAqL1xuICBzZXRDb25uZWN0ZWQoaXNDb25uZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSB7QXR0cmlidXRlUGFydH07XG5jbGFzcyBBdHRyaWJ1dGVQYXJ0IGltcGxlbWVudHMgRGlzY29ubmVjdGFibGUge1xuICByZWFkb25seSB0eXBlOlxuICAgIHwgdHlwZW9mIEFUVFJJQlVURV9QQVJUXG4gICAgfCB0eXBlb2YgUFJPUEVSVFlfUEFSVFxuICAgIHwgdHlwZW9mIEJPT0xFQU5fQVRUUklCVVRFX1BBUlRcbiAgICB8IHR5cGVvZiBFVkVOVF9QQVJUID0gQVRUUklCVVRFX1BBUlQ7XG4gIHJlYWRvbmx5IGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgYXR0cmlidXRlIHBhcnQgcmVwcmVzZW50cyBhbiBpbnRlcnBvbGF0aW9uLCB0aGlzIGNvbnRhaW5zIHRoZVxuICAgKiBzdGF0aWMgc3RyaW5ncyBvZiB0aGUgaW50ZXJwb2xhdGlvbi4gRm9yIHNpbmdsZS12YWx1ZSwgY29tcGxldGUgYmluZGluZ3MsXG4gICAqIHRoaXMgaXMgdW5kZWZpbmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RyaW5ncz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGNvbW1pdHRlZFZhbHVlOiB1bmtub3duIHwgQXJyYXk8dW5rbm93bj4gPSBub3RoaW5nO1xuICAvKiogQGludGVybmFsICovXG4gIF9fZGlyZWN0aXZlcz86IEFycmF5PERpcmVjdGl2ZSB8IHVuZGVmaW5lZD47XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlO1xuICAvKiogQGludGVybmFsICovXG4gIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbj86IFNldDxEaXNjb25uZWN0YWJsZT4gPSB1bmRlZmluZWQ7XG5cbiAgcHJvdGVjdGVkIF9zYW5pdGl6ZXI6IFZhbHVlU2FuaXRpemVyIHwgdW5kZWZpbmVkO1xuXG4gIGdldCB0YWdOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnQudGFnTmFtZTtcbiAgfVxuXG4gIC8vIFNlZSBjb21tZW50IGluIERpc2Nvbm5lY3RhYmxlIGludGVyZmFjZSBmb3Igd2h5IHRoaXMgaXMgYSBnZXR0ZXJcbiAgZ2V0IF8kaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuXyRwYXJlbnQuXyRpc0Nvbm5lY3RlZDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzdHJpbmdzOiBSZWFkb25seUFycmF5PHN0cmluZz4sXG4gICAgcGFyZW50OiBEaXNjb25uZWN0YWJsZSxcbiAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLl8kcGFyZW50ID0gcGFyZW50O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgaWYgKHN0cmluZ3MubGVuZ3RoID4gMiB8fCBzdHJpbmdzWzBdICE9PSAnJyB8fCBzdHJpbmdzWzFdICE9PSAnJykge1xuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbmV3IEFycmF5KHN0cmluZ3MubGVuZ3RoIC0gMSkuZmlsbChuZXcgU3RyaW5nKCkpO1xuICAgICAgdGhpcy5zdHJpbmdzID0gc3RyaW5ncztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbm90aGluZztcbiAgICB9XG4gICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgdGhpcy5fc2FuaXRpemVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHBhcnQgYnkgcmVzb2x2aW5nIHRoZSB2YWx1ZSBmcm9tIHBvc3NpYmx5IG11bHRpcGxlXG4gICAqIHZhbHVlcyBhbmQgc3RhdGljIHN0cmluZ3MgYW5kIGNvbW1pdHRpbmcgaXQgdG8gdGhlIERPTS5cbiAgICogSWYgdGhpcyBwYXJ0IGlzIHNpbmdsZS12YWx1ZWQsIGB0aGlzLl9zdHJpbmdzYCB3aWxsIGJlIHVuZGVmaW5lZCwgYW5kIHRoZVxuICAgKiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0aCBhIHNpbmdsZSB2YWx1ZSBhcmd1bWVudC4gSWYgdGhpcyBwYXJ0IGlzXG4gICAqIG11bHRpLXZhbHVlLCBgdGhpcy5fc3RyaW5nc2Agd2lsbCBiZSBkZWZpbmVkLCBhbmQgdGhlIG1ldGhvZCBpcyBjYWxsZWRcbiAgICogd2l0aCB0aGUgdmFsdWUgYXJyYXkgb2YgdGhlIHBhcnQncyBvd25pbmcgVGVtcGxhdGVJbnN0YW5jZSwgYW5kIGFuIG9mZnNldFxuICAgKiBpbnRvIHRoZSB2YWx1ZSBhcnJheSBmcm9tIHdoaWNoIHRoZSB2YWx1ZXMgc2hvdWxkIGJlIHJlYWQuXG4gICAqIFRoaXMgbWV0aG9kIGlzIG92ZXJsb2FkZWQgdGhpcyB3YXkgdG8gZWxpbWluYXRlIHNob3J0LWxpdmVkIGFycmF5IHNsaWNlc1xuICAgKiBvZiB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdmFsdWVzLCBhbmQgYWxsb3cgYSBmYXN0LXBhdGggZm9yIHNpbmdsZS12YWx1ZWRcbiAgICogcGFydHMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgcGFydCB2YWx1ZSwgb3IgYW4gYXJyYXkgb2YgdmFsdWVzIGZvciBtdWx0aS12YWx1ZWQgcGFydHNcbiAgICogQHBhcmFtIHZhbHVlSW5kZXggdGhlIGluZGV4IHRvIHN0YXJ0IHJlYWRpbmcgdmFsdWVzIGZyb20uIGB1bmRlZmluZWRgIGZvclxuICAgKiAgIHNpbmdsZS12YWx1ZWQgcGFydHNcbiAgICogQHBhcmFtIG5vQ29tbWl0IGNhdXNlcyB0aGUgcGFydCB0byBub3QgY29tbWl0IGl0cyB2YWx1ZSB0byB0aGUgRE9NLiBVc2VkXG4gICAqICAgaW4gaHlkcmF0aW9uIHRvIHByaW1lIGF0dHJpYnV0ZSBwYXJ0cyB3aXRoIHRoZWlyIGZpcnN0LXJlbmRlcmVkIHZhbHVlLFxuICAgKiAgIGJ1dCBub3Qgc2V0IHRoZSBhdHRyaWJ1dGUsIGFuZCBpbiBTU1IgdG8gbm8tb3AgdGhlIERPTSBvcGVyYXRpb24gYW5kXG4gICAqICAgY2FwdHVyZSB0aGUgdmFsdWUgZm9yIHNlcmlhbGl6YXRpb24uXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgXyRzZXRWYWx1ZShcbiAgICB2YWx1ZTogdW5rbm93biB8IEFycmF5PHVua25vd24+LFxuICAgIGRpcmVjdGl2ZVBhcmVudDogRGlyZWN0aXZlUGFyZW50ID0gdGhpcyxcbiAgICB2YWx1ZUluZGV4PzogbnVtYmVyLFxuICAgIG5vQ29tbWl0PzogYm9vbGVhblxuICApIHtcbiAgICBjb25zdCBzdHJpbmdzID0gdGhpcy5zdHJpbmdzO1xuXG4gICAgLy8gV2hldGhlciBhbnkgb2YgdGhlIHZhbHVlcyBoYXMgY2hhbmdlZCwgZm9yIGRpcnR5LWNoZWNraW5nXG4gICAgbGV0IGNoYW5nZSA9IGZhbHNlO1xuXG4gICAgaWYgKHN0cmluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gU2luZ2xlLXZhbHVlIGJpbmRpbmcgY2FzZVxuICAgICAgdmFsdWUgPSByZXNvbHZlRGlyZWN0aXZlKHRoaXMsIHZhbHVlLCBkaXJlY3RpdmVQYXJlbnQsIDApO1xuICAgICAgY2hhbmdlID1cbiAgICAgICAgIWlzUHJpbWl0aXZlKHZhbHVlKSB8fFxuICAgICAgICAodmFsdWUgIT09IHRoaXMuXyRjb21taXR0ZWRWYWx1ZSAmJiB2YWx1ZSAhPT0gbm9DaGFuZ2UpO1xuICAgICAgaWYgKGNoYW5nZSkge1xuICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW50ZXJwb2xhdGlvbiBjYXNlXG4gICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZSBhcyBBcnJheTx1bmtub3duPjtcbiAgICAgIHZhbHVlID0gc3RyaW5nc1swXTtcblxuICAgICAgbGV0IGksIHY7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgdiA9IHJlc29sdmVEaXJlY3RpdmUodGhpcywgdmFsdWVzW3ZhbHVlSW5kZXghICsgaV0sIGRpcmVjdGl2ZVBhcmVudCwgaSk7XG5cbiAgICAgICAgaWYgKHYgPT09IG5vQ2hhbmdlKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHVzZXItcHJvdmlkZWQgdmFsdWUgaXMgYG5vQ2hhbmdlYCwgdXNlIHRoZSBwcmV2aW91cyB2YWx1ZVxuICAgICAgICAgIHYgPSAodGhpcy5fJGNvbW1pdHRlZFZhbHVlIGFzIEFycmF5PHVua25vd24+KVtpXTtcbiAgICAgICAgfVxuICAgICAgICBjaGFuZ2UgfHw9XG4gICAgICAgICAgIWlzUHJpbWl0aXZlKHYpIHx8IHYgIT09ICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgYXMgQXJyYXk8dW5rbm93bj4pW2ldO1xuICAgICAgICBpZiAodiA9PT0gbm90aGluZykge1xuICAgICAgICAgIHZhbHVlID0gbm90aGluZztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gbm90aGluZykge1xuICAgICAgICAgIHZhbHVlICs9ICh2ID8/ICcnKSArIHN0cmluZ3NbaSArIDFdO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGFsd2F5cyByZWNvcmQgZWFjaCB2YWx1ZSwgZXZlbiBpZiBvbmUgaXMgYG5vdGhpbmdgLCBmb3IgZnV0dXJlXG4gICAgICAgIC8vIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICAgICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgYXMgQXJyYXk8dW5rbm93bj4pW2ldID0gdjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZSAmJiAhbm9Db21taXQpIHtcbiAgICAgIHRoaXMuX2NvbW1pdFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9jb21taXRWYWx1ZSh2YWx1ZTogdW5rbm93bikge1xuICAgIGlmICh2YWx1ZSA9PT0gbm90aGluZykge1xuICAgICAgKHdyYXAodGhpcy5lbGVtZW50KSBhcyBFbGVtZW50KS5yZW1vdmVBdHRyaWJ1dGUodGhpcy5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICBpZiAodGhpcy5fc2FuaXRpemVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLl9zYW5pdGl6ZXIgPSBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWwoXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgICAgICAnYXR0cmlidXRlJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB0aGlzLl9zYW5pdGl6ZXIodmFsdWUgPz8gJycpO1xuICAgICAgfVxuICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICBraW5kOiAnY29tbWl0IGF0dHJpYnV0ZScsXG4gICAgICAgICAgZWxlbWVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgICAgKHdyYXAodGhpcy5lbGVtZW50KSBhcyBFbGVtZW50KS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgIHRoaXMubmFtZSxcbiAgICAgICAgKHZhbHVlID8/ICcnKSBhcyBzdHJpbmdcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB0eXBlIHtQcm9wZXJ0eVBhcnR9O1xuY2xhc3MgUHJvcGVydHlQYXJ0IGV4dGVuZHMgQXR0cmlidXRlUGFydCB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHR5cGUgPSBQUk9QRVJUWV9QQVJUO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgb3ZlcnJpZGUgX2NvbW1pdFZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgaWYgKHRoaXMuX3Nhbml0aXplciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX3Nhbml0aXplciA9IHNhbml0aXplckZhY3RvcnlJbnRlcm5hbChcbiAgICAgICAgICB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICAgICdwcm9wZXJ0eSdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdGhpcy5fc2FuaXRpemVyKHZhbHVlKTtcbiAgICB9XG4gICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgIGtpbmQ6ICdjb21taXQgcHJvcGVydHknLFxuICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgKHRoaXMuZWxlbWVudCBhcyBhbnkpW3RoaXMubmFtZV0gPSB2YWx1ZSA9PT0gbm90aGluZyA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIHtCb29sZWFuQXR0cmlidXRlUGFydH07XG5jbGFzcyBCb29sZWFuQXR0cmlidXRlUGFydCBleHRlbmRzIEF0dHJpYnV0ZVBhcnQge1xuICBvdmVycmlkZSByZWFkb25seSB0eXBlID0gQk9PTEVBTl9BVFRSSUJVVEVfUEFSVDtcblxuICAvKiogQGludGVybmFsICovXG4gIG92ZXJyaWRlIF9jb21taXRWYWx1ZSh2YWx1ZTogdW5rbm93bikge1xuICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICBraW5kOiAnY29tbWl0IGJvb2xlYW4gYXR0cmlidXRlJyxcbiAgICAgICAgZWxlbWVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIHZhbHVlOiAhISh2YWx1ZSAmJiB2YWx1ZSAhPT0gbm90aGluZyksXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgIH0pO1xuICAgICh3cmFwKHRoaXMuZWxlbWVudCkgYXMgRWxlbWVudCkudG9nZ2xlQXR0cmlidXRlKFxuICAgICAgdGhpcy5uYW1lLFxuICAgICAgISF2YWx1ZSAmJiB2YWx1ZSAhPT0gbm90aGluZ1xuICAgICk7XG4gIH1cbn1cblxudHlwZSBFdmVudExpc3RlbmVyV2l0aE9wdGlvbnMgPSBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0ICZcbiAgUGFydGlhbDxBZGRFdmVudExpc3RlbmVyT3B0aW9ucz47XG5cbi8qKlxuICogQW4gQXR0cmlidXRlUGFydCB0aGF0IG1hbmFnZXMgYW4gZXZlbnQgbGlzdGVuZXIgdmlhIGFkZC9yZW1vdmVFdmVudExpc3RlbmVyLlxuICpcbiAqIFRoaXMgcGFydCB3b3JrcyBieSBhZGRpbmcgaXRzZWxmIGFzIHRoZSBldmVudCBsaXN0ZW5lciBvbiBhbiBlbGVtZW50LCB0aGVuXG4gKiBkZWxlZ2F0aW5nIHRvIHRoZSB2YWx1ZSBwYXNzZWQgdG8gaXQuIFRoaXMgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvXG4gKiBhZGQvcmVtb3ZlRXZlbnRMaXN0ZW5lciBpZiB0aGUgbGlzdGVuZXIgY2hhbmdlcyBmcmVxdWVudGx5LCBzdWNoIGFzIHdoZW4gYW5cbiAqIGlubGluZSBmdW5jdGlvbiBpcyB1c2VkIGFzIGEgbGlzdGVuZXIuXG4gKlxuICogQmVjYXVzZSBldmVudCBvcHRpb25zIGFyZSBwYXNzZWQgd2hlbiBhZGRpbmcgbGlzdGVuZXJzLCB3ZSBtdXN0IHRha2UgY2FzZVxuICogdG8gYWRkIGFuZCByZW1vdmUgdGhlIHBhcnQgYXMgYSBsaXN0ZW5lciB3aGVuIHRoZSBldmVudCBvcHRpb25zIGNoYW5nZS5cbiAqL1xuZXhwb3J0IHR5cGUge0V2ZW50UGFydH07XG5jbGFzcyBFdmVudFBhcnQgZXh0ZW5kcyBBdHRyaWJ1dGVQYXJ0IHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgdHlwZSA9IEVWRU5UX1BBUlQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0cmluZ3M6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgICBwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlLFxuICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgbmFtZSwgc3RyaW5ncywgcGFyZW50LCBvcHRpb25zKTtcblxuICAgIGlmIChERVZfTU9ERSAmJiB0aGlzLnN0cmluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQSBcXGA8JHtlbGVtZW50LmxvY2FsTmFtZX0+XFxgIGhhcyBhIFxcYEAke25hbWV9PS4uLlxcYCBsaXN0ZW5lciB3aXRoIGAgK1xuICAgICAgICAgICdpbnZhbGlkIGNvbnRlbnQuIEV2ZW50IGxpc3RlbmVycyBpbiB0ZW1wbGF0ZXMgbXVzdCBoYXZlIGV4YWN0bHkgJyArXG4gICAgICAgICAgJ29uZSBleHByZXNzaW9uIGFuZCBubyBzdXJyb3VuZGluZyB0ZXh0LidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXZlbnRQYXJ0IGRvZXMgbm90IHVzZSB0aGUgYmFzZSBfJHNldFZhbHVlL19yZXNvbHZlVmFsdWUgaW1wbGVtZW50YXRpb25cbiAgLy8gc2luY2UgdGhlIGRpcnR5IGNoZWNraW5nIGlzIG1vcmUgY29tcGxleFxuICAvKiogQGludGVybmFsICovXG4gIG92ZXJyaWRlIF8kc2V0VmFsdWUoXG4gICAgbmV3TGlzdGVuZXI6IHVua25vd24sXG4gICAgZGlyZWN0aXZlUGFyZW50OiBEaXJlY3RpdmVQYXJlbnQgPSB0aGlzXG4gICkge1xuICAgIG5ld0xpc3RlbmVyID1cbiAgICAgIHJlc29sdmVEaXJlY3RpdmUodGhpcywgbmV3TGlzdGVuZXIsIGRpcmVjdGl2ZVBhcmVudCwgMCkgPz8gbm90aGluZztcbiAgICBpZiAobmV3TGlzdGVuZXIgPT09IG5vQ2hhbmdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9sZExpc3RlbmVyID0gdGhpcy5fJGNvbW1pdHRlZFZhbHVlO1xuXG4gICAgLy8gSWYgdGhlIG5ldyB2YWx1ZSBpcyBub3RoaW5nIG9yIGFueSBvcHRpb25zIGNoYW5nZSB3ZSBoYXZlIHRvIHJlbW92ZSB0aGVcbiAgICAvLyBwYXJ0IGFzIGEgbGlzdGVuZXIuXG4gICAgY29uc3Qgc2hvdWxkUmVtb3ZlTGlzdGVuZXIgPVxuICAgICAgKG5ld0xpc3RlbmVyID09PSBub3RoaW5nICYmIG9sZExpc3RlbmVyICE9PSBub3RoaW5nKSB8fFxuICAgICAgKG5ld0xpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykuY2FwdHVyZSAhPT1cbiAgICAgICAgKG9sZExpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykuY2FwdHVyZSB8fFxuICAgICAgKG5ld0xpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykub25jZSAhPT1cbiAgICAgICAgKG9sZExpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykub25jZSB8fFxuICAgICAgKG5ld0xpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykucGFzc2l2ZSAhPT1cbiAgICAgICAgKG9sZExpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykucGFzc2l2ZTtcblxuICAgIC8vIElmIHRoZSBuZXcgdmFsdWUgaXMgbm90IG5vdGhpbmcgYW5kIHdlIHJlbW92ZWQgdGhlIGxpc3RlbmVyLCB3ZSBoYXZlXG4gICAgLy8gdG8gYWRkIHRoZSBwYXJ0IGFzIGEgbGlzdGVuZXIuXG4gICAgY29uc3Qgc2hvdWxkQWRkTGlzdGVuZXIgPVxuICAgICAgbmV3TGlzdGVuZXIgIT09IG5vdGhpbmcgJiZcbiAgICAgIChvbGRMaXN0ZW5lciA9PT0gbm90aGluZyB8fCBzaG91bGRSZW1vdmVMaXN0ZW5lcik7XG5cbiAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAga2luZDogJ2NvbW1pdCBldmVudCBsaXN0ZW5lcicsXG4gICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICB2YWx1ZTogbmV3TGlzdGVuZXIsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgcmVtb3ZlTGlzdGVuZXI6IHNob3VsZFJlbW92ZUxpc3RlbmVyLFxuICAgICAgICBhZGRMaXN0ZW5lcjogc2hvdWxkQWRkTGlzdGVuZXIsXG4gICAgICAgIG9sZExpc3RlbmVyLFxuICAgICAgfSk7XG4gICAgaWYgKHNob3VsZFJlbW92ZUxpc3RlbmVyKSB7XG4gICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICB0aGlzLFxuICAgICAgICBvbGRMaXN0ZW5lciBhcyBFdmVudExpc3RlbmVyV2l0aE9wdGlvbnNcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChzaG91bGRBZGRMaXN0ZW5lcikge1xuICAgICAgLy8gQmV3YXJlOiBJRTExIGFuZCBDaHJvbWUgNDEgZG9uJ3QgbGlrZSB1c2luZyB0aGUgbGlzdGVuZXIgYXMgdGhlXG4gICAgICAvLyBvcHRpb25zIG9iamVjdC4gRmlndXJlIG91dCBob3cgdG8gZGVhbCB3LyB0aGlzIGluIElFMTEgLSBtYXliZVxuICAgICAgLy8gcGF0Y2ggYWRkRXZlbnRMaXN0ZW5lcj9cbiAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgIHRoaXMsXG4gICAgICAgIG5ld0xpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbmV3TGlzdGVuZXI7XG4gIH1cblxuICBoYW5kbGVFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlLmNhbGwodGhpcy5vcHRpb25zPy5ob3N0ID8/IHRoaXMuZWxlbWVudCwgZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAodGhpcy5fJGNvbW1pdHRlZFZhbHVlIGFzIEV2ZW50TGlzdGVuZXJPYmplY3QpLmhhbmRsZUV2ZW50KGV2ZW50KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUge0VsZW1lbnRQYXJ0fTtcbmNsYXNzIEVsZW1lbnRQYXJ0IGltcGxlbWVudHMgRGlzY29ubmVjdGFibGUge1xuICByZWFkb25seSB0eXBlID0gRUxFTUVOVF9QQVJUO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX19kaXJlY3RpdmU/OiBEaXJlY3RpdmU7XG5cbiAgLy8gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCBldmVyeSBQYXJ0IGhhcyBhIF8kY29tbWl0dGVkVmFsdWVcbiAgXyRjb21taXR0ZWRWYWx1ZTogdW5kZWZpbmVkO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRwYXJlbnQhOiBEaXNjb25uZWN0YWJsZTtcblxuICAvKiogQGludGVybmFsICovXG4gIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbj86IFNldDxEaXNjb25uZWN0YWJsZT4gPSB1bmRlZmluZWQ7XG5cbiAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWxlbWVudDogRWxlbWVudCxcbiAgICBwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlLFxuICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgdGhpcy5fJHBhcmVudCA9IHBhcmVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5fJGlzQ29ubmVjdGVkO1xuICB9XG5cbiAgXyRzZXRWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICBraW5kOiAnY29tbWl0IHRvIGVsZW1lbnQgYmluZGluZycsXG4gICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIHJlc29sdmVEaXJlY3RpdmUodGhpcywgdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogRU5EIFVTRVJTIFNIT1VMRCBOT1QgUkVMWSBPTiBUSElTIE9CSkVDVC5cbiAqXG4gKiBQcml2YXRlIGV4cG9ydHMgZm9yIHVzZSBieSBvdGhlciBMaXQgcGFja2FnZXMsIG5vdCBpbnRlbmRlZCBmb3IgdXNlIGJ5XG4gKiBleHRlcm5hbCB1c2Vycy5cbiAqXG4gKiBXZSBjdXJyZW50bHkgZG8gbm90IG1ha2UgYSBtYW5nbGVkIHJvbGx1cCBidWlsZCBvZiB0aGUgbGl0LXNzciBjb2RlLiBJbiBvcmRlclxuICogdG8ga2VlcCBhIG51bWJlciBvZiAob3RoZXJ3aXNlIHByaXZhdGUpIHRvcC1sZXZlbCBleHBvcnRzIG1hbmdsZWQgaW4gdGhlXG4gKiBjbGllbnQgc2lkZSBjb2RlLCB3ZSBleHBvcnQgYSBfJExIIG9iamVjdCBjb250YWluaW5nIHRob3NlIG1lbWJlcnMgKG9yXG4gKiBoZWxwZXIgbWV0aG9kcyBmb3IgYWNjZXNzaW5nIHByaXZhdGUgZmllbGRzIG9mIHRob3NlIG1lbWJlcnMpLCBhbmQgdGhlblxuICogcmUtZXhwb3J0IHRoZW0gZm9yIHVzZSBpbiBsaXQtc3NyLiBUaGlzIGtlZXBzIGxpdC1zc3IgYWdub3N0aWMgdG8gd2hldGhlciB0aGVcbiAqIGNsaWVudC1zaWRlIGNvZGUgaXMgYmVpbmcgdXNlZCBpbiBgZGV2YCBtb2RlIG9yIGBwcm9kYCBtb2RlLlxuICpcbiAqIFRoaXMgaGFzIGEgdW5pcXVlIG5hbWUsIHRvIGRpc2FtYmlndWF0ZSBpdCBmcm9tIHByaXZhdGUgZXhwb3J0cyBpblxuICogbGl0LWVsZW1lbnQsIHdoaWNoIHJlLWV4cG9ydHMgYWxsIG9mIGxpdC1odG1sLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBfJExIID0ge1xuICAvLyBVc2VkIGluIGxpdC1zc3JcbiAgX2JvdW5kQXR0cmlidXRlU3VmZml4OiBib3VuZEF0dHJpYnV0ZVN1ZmZpeCxcbiAgX21hcmtlcjogbWFya2VyLFxuICBfbWFya2VyTWF0Y2g6IG1hcmtlck1hdGNoLFxuICBfSFRNTF9SRVNVTFQ6IEhUTUxfUkVTVUxULFxuICBfZ2V0VGVtcGxhdGVIdG1sOiBnZXRUZW1wbGF0ZUh0bWwsXG4gIC8vIFVzZWQgaW4gdGVzdHMgYW5kIHByaXZhdGUtc3NyLXN1cHBvcnRcbiAgX1RlbXBsYXRlSW5zdGFuY2U6IFRlbXBsYXRlSW5zdGFuY2UsXG4gIF9pc0l0ZXJhYmxlOiBpc0l0ZXJhYmxlLFxuICBfcmVzb2x2ZURpcmVjdGl2ZTogcmVzb2x2ZURpcmVjdGl2ZSxcbiAgX0NoaWxkUGFydDogQ2hpbGRQYXJ0LFxuICBfQXR0cmlidXRlUGFydDogQXR0cmlidXRlUGFydCxcbiAgX0Jvb2xlYW5BdHRyaWJ1dGVQYXJ0OiBCb29sZWFuQXR0cmlidXRlUGFydCxcbiAgX0V2ZW50UGFydDogRXZlbnRQYXJ0LFxuICBfUHJvcGVydHlQYXJ0OiBQcm9wZXJ0eVBhcnQsXG4gIF9FbGVtZW50UGFydDogRWxlbWVudFBhcnQsXG59O1xuXG4vLyBBcHBseSBwb2x5ZmlsbHMgaWYgYXZhaWxhYmxlXG5jb25zdCBwb2x5ZmlsbFN1cHBvcnQgPSBERVZfTU9ERVxuICA/IGdsb2JhbC5saXRIdG1sUG9seWZpbGxTdXBwb3J0RGV2TW9kZVxuICA6IGdsb2JhbC5saXRIdG1sUG9seWZpbGxTdXBwb3J0O1xucG9seWZpbGxTdXBwb3J0Py4oVGVtcGxhdGUsIENoaWxkUGFydCk7XG5cbi8vIElNUE9SVEFOVDogZG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydHkgbmFtZSBvciB0aGUgYXNzaWdubWVudCBleHByZXNzaW9uLlxuLy8gVGhpcyBsaW5lIHdpbGwgYmUgdXNlZCBpbiByZWdleGVzIHRvIHNlYXJjaCBmb3IgbGl0LWh0bWwgdXNhZ2UuXG4oZ2xvYmFsLmxpdEh0bWxWZXJzaW9ucyA/Pz0gW10pLnB1c2goJzMuMi4xJyk7XG5pZiAoREVWX01PREUgJiYgZ2xvYmFsLmxpdEh0bWxWZXJzaW9ucy5sZW5ndGggPiAxKSB7XG4gIGlzc3VlV2FybmluZyEoXG4gICAgJ211bHRpcGxlLXZlcnNpb25zJyxcbiAgICBgTXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0IGxvYWRlZC4gYCArXG4gICAgICBgTG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBpcyBub3QgcmVjb21tZW5kZWQuYFxuICApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSB2YWx1ZSwgdXN1YWxseSBhIGxpdC1odG1sIFRlbXBsYXRlUmVzdWx0LCB0byB0aGUgY29udGFpbmVyLlxuICpcbiAqIFRoaXMgZXhhbXBsZSByZW5kZXJzIHRoZSB0ZXh0IFwiSGVsbG8sIFpvZSFcIiBpbnNpZGUgYSBwYXJhZ3JhcGggdGFnLCBhcHBlbmRpbmdcbiAqIGl0IHRvIHRoZSBjb250YWluZXIgYGRvY3VtZW50LmJvZHlgLlxuICpcbiAqIGBgYGpzXG4gKiBpbXBvcnQge2h0bWwsIHJlbmRlcn0gZnJvbSAnbGl0JztcbiAqXG4gKiBjb25zdCBuYW1lID0gXCJab2VcIjtcbiAqIHJlbmRlcihodG1sYDxwPkhlbGxvLCAke25hbWV9ITwvcD5gLCBkb2N1bWVudC5ib2R5KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZSBBbnkgW3JlbmRlcmFibGVcbiAqICAgdmFsdWVdKGh0dHBzOi8vbGl0LmRldi9kb2NzL3RlbXBsYXRlcy9leHByZXNzaW9ucy8jY2hpbGQtZXhwcmVzc2lvbnMpLFxuICogICB0eXBpY2FsbHkgYSB7QGxpbmtjb2RlIFRlbXBsYXRlUmVzdWx0fSBjcmVhdGVkIGJ5IGV2YWx1YXRpbmcgYSB0ZW1wbGF0ZSB0YWdcbiAqICAgbGlrZSB7QGxpbmtjb2RlIGh0bWx9IG9yIHtAbGlua2NvZGUgc3ZnfS5cbiAqIEBwYXJhbSBjb250YWluZXIgQSBET00gY29udGFpbmVyIHRvIHJlbmRlciB0by4gVGhlIGZpcnN0IHJlbmRlciB3aWxsIGFwcGVuZFxuICogICB0aGUgcmVuZGVyZWQgdmFsdWUgdG8gdGhlIGNvbnRhaW5lciwgYW5kIHN1YnNlcXVlbnQgcmVuZGVycyB3aWxsXG4gKiAgIGVmZmljaWVudGx5IHVwZGF0ZSB0aGUgcmVuZGVyZWQgdmFsdWUgaWYgdGhlIHNhbWUgcmVzdWx0IHR5cGUgd2FzXG4gKiAgIHByZXZpb3VzbHkgcmVuZGVyZWQgdGhlcmUuXG4gKiBAcGFyYW0gb3B0aW9ucyBTZWUge0BsaW5rY29kZSBSZW5kZXJPcHRpb25zfSBmb3Igb3B0aW9ucyBkb2N1bWVudGF0aW9uLlxuICogQHNlZVxuICoge0BsaW5rIGh0dHBzOi8vbGl0LmRldi9kb2NzL2xpYnJhcmllcy9zdGFuZGFsb25lLXRlbXBsYXRlcy8jcmVuZGVyaW5nLWxpdC1odG1sLXRlbXBsYXRlc3wgUmVuZGVyaW5nIExpdCBIVE1MIFRlbXBsYXRlc31cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbmRlciA9IChcbiAgdmFsdWU6IHVua25vd24sXG4gIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50LFxuICBvcHRpb25zPzogUmVuZGVyT3B0aW9uc1xuKTogUm9vdFBhcnQgPT4ge1xuICBpZiAoREVWX01PREUgJiYgY29udGFpbmVyID09IG51bGwpIHtcbiAgICAvLyBHaXZlIGEgY2xlYXJlciBlcnJvciBtZXNzYWdlIHRoYW5cbiAgICAvLyAgICAgVW5jYXVnaHQgVHlwZUVycm9yOiBDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIG51bGwgKHJlYWRpbmdcbiAgICAvLyAgICAgJ18kbGl0UGFydCQnKVxuICAgIC8vIHdoaWNoIHJlYWRzIGxpa2UgYW4gaW50ZXJuYWwgTGl0IGVycm9yLlxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFRoZSBjb250YWluZXIgdG8gcmVuZGVyIGludG8gbWF5IG5vdCBiZSAke2NvbnRhaW5lcn1gKTtcbiAgfVxuICBjb25zdCByZW5kZXJJZCA9IERFVl9NT0RFID8gZGVidWdMb2dSZW5kZXJJZCsrIDogMDtcbiAgY29uc3QgcGFydE93bmVyTm9kZSA9IG9wdGlvbnM/LnJlbmRlckJlZm9yZSA/PyBjb250YWluZXI7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGxldCBwYXJ0OiBDaGlsZFBhcnQgPSAocGFydE93bmVyTm9kZSBhcyBhbnkpWydfJGxpdFBhcnQkJ107XG4gIGRlYnVnTG9nRXZlbnQgJiZcbiAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgIGtpbmQ6ICdiZWdpbiByZW5kZXInLFxuICAgICAgaWQ6IHJlbmRlcklkLFxuICAgICAgdmFsdWUsXG4gICAgICBjb250YWluZXIsXG4gICAgICBvcHRpb25zLFxuICAgICAgcGFydCxcbiAgICB9KTtcbiAgaWYgKHBhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGVuZE5vZGUgPSBvcHRpb25zPy5yZW5kZXJCZWZvcmUgPz8gbnVsbDtcbiAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgKHBhcnRPd25lck5vZGUgYXMgYW55KVsnXyRsaXRQYXJ0JCddID0gcGFydCA9IG5ldyBDaGlsZFBhcnQoXG4gICAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGNyZWF0ZU1hcmtlcigpLCBlbmROb2RlKSxcbiAgICAgIGVuZE5vZGUsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBvcHRpb25zID8/IHt9XG4gICAgKTtcbiAgfVxuICBwYXJ0Ll8kc2V0VmFsdWUodmFsdWUpO1xuICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgZGVidWdMb2dFdmVudCh7XG4gICAgICBraW5kOiAnZW5kIHJlbmRlcicsXG4gICAgICBpZDogcmVuZGVySWQsXG4gICAgICB2YWx1ZSxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIG9wdGlvbnMsXG4gICAgICBwYXJ0LFxuICAgIH0pO1xuICByZXR1cm4gcGFydCBhcyBSb290UGFydDtcbn07XG5cbmlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgcmVuZGVyLnNldFNhbml0aXplciA9IHNldFNhbml0aXplcjtcbiAgcmVuZGVyLmNyZWF0ZVNhbml0aXplciA9IGNyZWF0ZVNhbml0aXplcjtcbiAgaWYgKERFVl9NT0RFKSB7XG4gICAgcmVuZGVyLl90ZXN0T25seUNsZWFyU2FuaXRpemVyRmFjdG9yeURvTm90Q2FsbE9yRWxzZSA9XG4gICAgICBfdGVzdE9ubHlDbGVhclNhbml0aXplckZhY3RvcnlEb05vdENhbGxPckVsc2U7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBUaGUgbWFpbiBMaXRFbGVtZW50IG1vZHVsZSwgd2hpY2ggZGVmaW5lcyB0aGUge0BsaW5rY29kZSBMaXRFbGVtZW50fSBiYXNlXG4gKiBjbGFzcyBhbmQgcmVsYXRlZCBBUElzLlxuICpcbiAqIExpdEVsZW1lbnQgY29tcG9uZW50cyBjYW4gZGVmaW5lIGEgdGVtcGxhdGUgYW5kIGEgc2V0IG9mIG9ic2VydmVkXG4gKiBwcm9wZXJ0aWVzLiBDaGFuZ2luZyBhbiBvYnNlcnZlZCBwcm9wZXJ0eSB0cmlnZ2VycyBhIHJlLXJlbmRlciBvZiB0aGVcbiAqIGVsZW1lbnQuXG4gKlxuICogSW1wb3J0IHtAbGlua2NvZGUgTGl0RWxlbWVudH0gYW5kIHtAbGlua2NvZGUgaHRtbH0gZnJvbSB0aGlzIG1vZHVsZSB0b1xuICogY3JlYXRlIGEgY29tcG9uZW50OlxuICpcbiAqICBgYGBqc1xuICogaW1wb3J0IHtMaXRFbGVtZW50LCBodG1sfSBmcm9tICdsaXQtZWxlbWVudCc7XG4gKlxuICogY2xhc3MgTXlFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gKlxuICogICAvLyBEZWNsYXJlIG9ic2VydmVkIHByb3BlcnRpZXNcbiAqICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICogICAgIHJldHVybiB7XG4gKiAgICAgICBhZGplY3RpdmU6IHt9XG4gKiAgICAgfVxuICogICB9XG4gKlxuICogICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICB0aGlzLmFkamVjdGl2ZSA9ICdhd2Vzb21lJztcbiAqICAgfVxuICpcbiAqICAgLy8gRGVmaW5lIHRoZSBlbGVtZW50J3MgdGVtcGxhdGVcbiAqICAgcmVuZGVyKCkge1xuICogICAgIHJldHVybiBodG1sYDxwPnlvdXIgJHthZGplY3RpdmV9IHRlbXBsYXRlIGhlcmU8L3A+YDtcbiAqICAgfVxuICogfVxuICpcbiAqIGN1c3RvbUVsZW1lbnRzLmRlZmluZSgnbXktZWxlbWVudCcsIE15RWxlbWVudCk7XG4gKiBgYGBcbiAqXG4gKiBgTGl0RWxlbWVudGAgZXh0ZW5kcyB7QGxpbmtjb2RlIFJlYWN0aXZlRWxlbWVudH0gYW5kIGFkZHMgbGl0LWh0bWxcbiAqIHRlbXBsYXRpbmcuIFRoZSBgUmVhY3RpdmVFbGVtZW50YCBjbGFzcyBpcyBwcm92aWRlZCBmb3IgdXNlcnMgdGhhdCB3YW50IHRvXG4gKiBidWlsZCB0aGVpciBvd24gY3VzdG9tIGVsZW1lbnQgYmFzZSBjbGFzc2VzIHRoYXQgZG9uJ3QgdXNlIGxpdC1odG1sLlxuICpcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5pbXBvcnQge1Byb3BlcnR5VmFsdWVzLCBSZWFjdGl2ZUVsZW1lbnR9IGZyb20gJ0BsaXQvcmVhY3RpdmUtZWxlbWVudCc7XG5pbXBvcnQge3JlbmRlciwgUmVuZGVyT3B0aW9ucywgbm9DaGFuZ2UsIFJvb3RQYXJ0fSBmcm9tICdsaXQtaHRtbCc7XG5leHBvcnQgKiBmcm9tICdAbGl0L3JlYWN0aXZlLWVsZW1lbnQnO1xuZXhwb3J0ICogZnJvbSAnbGl0LWh0bWwnO1xuXG5pbXBvcnQge0xpdFVuc3RhYmxlfSBmcm9tICdsaXQtaHRtbCc7XG5pbXBvcnQge1JlYWN0aXZlVW5zdGFibGV9IGZyb20gJ0BsaXQvcmVhY3RpdmUtZWxlbWVudCc7XG5cbi8qKlxuICogQ29udGFpbnMgdHlwZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUgdW5zdGFibGUgZGVidWcgQVBJLlxuICpcbiAqIEV2ZXJ5dGhpbmcgaW4gdGhpcyBBUEkgaXMgbm90IHN0YWJsZSBhbmQgbWF5IGNoYW5nZSBvciBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUsXG4gKiBldmVuIG9uIHBhdGNoIHJlbGVhc2VzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZVxuZXhwb3J0IG5hbWVzcGFjZSBVbnN0YWJsZSB7XG4gIC8qKlxuICAgKiBXaGVuIExpdCBpcyBydW5uaW5nIGluIGRldiBtb2RlIGFuZCBgd2luZG93LmVtaXRMaXREZWJ1Z0xvZ0V2ZW50c2AgaXMgdHJ1ZSxcbiAgICogd2Ugd2lsbCBlbWl0ICdsaXQtZGVidWcnIGV2ZW50cyB0byB3aW5kb3csIHdpdGggbGl2ZSBkZXRhaWxzIGFib3V0IHRoZSB1cGRhdGUgYW5kIHJlbmRlclxuICAgKiBsaWZlY3ljbGUuIFRoZXNlIGNhbiBiZSB1c2VmdWwgZm9yIHdyaXRpbmcgZGVidWcgdG9vbGluZyBhbmQgdmlzdWFsaXphdGlvbnMuXG4gICAqXG4gICAqIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHJ1bm5pbmcgd2l0aCB3aW5kb3cuZW1pdExpdERlYnVnTG9nRXZlbnRzIGhhcyBwZXJmb3JtYW5jZSBvdmVyaGVhZCxcbiAgICogbWFraW5nIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3JtYWxseSB2ZXJ5IGNoZWFwIChsaWtlIGEgbm8tb3AgcmVuZGVyKSBtdWNoIHNsb3dlcixcbiAgICogYmVjYXVzZSB3ZSBtdXN0IGNvcHkgZGF0YSBhbmQgZGlzcGF0Y2ggZXZlbnRzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbiAgZXhwb3J0IG5hbWVzcGFjZSBEZWJ1Z0xvZyB7XG4gICAgZXhwb3J0IHR5cGUgRW50cnkgPVxuICAgICAgfCBMaXRVbnN0YWJsZS5EZWJ1Z0xvZy5FbnRyeVxuICAgICAgfCBSZWFjdGl2ZVVuc3RhYmxlLkRlYnVnTG9nLkVudHJ5O1xuICB9XG59XG4vKlxuICogV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzXG4gKiByZXBsYWNlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIG11bmdlZCBuYW1lIGZvciBvYmplY3RbcHJvcGVydHldLiBXZSBjYW5ub3RcbiAqIGFsaWFzIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGhhdmUgdG8gdXNlIGEgc21hbGwgc2hpbSB0aGF0IGhhcyB0aGUgc2FtZVxuICogYmVoYXZpb3Igd2hlbiBub3QgY29tcGlsaW5nLlxuICovXG4vKkBfX0lOTElORV9fKi9cbmNvbnN0IEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSA8UCBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgcHJvcDogUCxcbiAgX29iajogdW5rbm93blxuKTogUCA9PiBwcm9wO1xuXG5jb25zdCBERVZfTU9ERSA9IHRydWU7XG5cbmxldCBpc3N1ZVdhcm5pbmc6IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4gdm9pZDtcblxuaWYgKERFVl9NT0RFKSB7XG4gIC8vIEVuc3VyZSB3YXJuaW5ncyBhcmUgaXNzdWVkIG9ubHkgMXgsIGV2ZW4gaWYgbXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0XG4gIC8vIGFyZSBsb2FkZWQuXG4gIGNvbnN0IGlzc3VlZFdhcm5pbmdzOiBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPiA9XG4gICAgKGdsb2JhbFRoaXMubGl0SXNzdWVkV2FybmluZ3MgPz89IG5ldyBTZXQoKSk7XG5cbiAgLy8gSXNzdWUgYSB3YXJuaW5nLCBpZiB3ZSBoYXZlbid0IGFscmVhZHkuXG4gIGlzc3VlV2FybmluZyA9IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4ge1xuICAgIHdhcm5pbmcgKz0gYCBTZWUgaHR0cHM6Ly9saXQuZGV2L21zZy8ke2NvZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLmA7XG4gICAgaWYgKCFpc3N1ZWRXYXJuaW5ncy5oYXMod2FybmluZykpIHtcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgIGlzc3VlZFdhcm5pbmdzLmFkZCh3YXJuaW5nKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQmFzZSBlbGVtZW50IGNsYXNzIHRoYXQgbWFuYWdlcyBlbGVtZW50IHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXMsIGFuZFxuICogcmVuZGVycyBhIGxpdC1odG1sIHRlbXBsYXRlLlxuICpcbiAqIFRvIGRlZmluZSBhIGNvbXBvbmVudCwgc3ViY2xhc3MgYExpdEVsZW1lbnRgIGFuZCBpbXBsZW1lbnQgYVxuICogYHJlbmRlcmAgbWV0aG9kIHRvIHByb3ZpZGUgdGhlIGNvbXBvbmVudCdzIHRlbXBsYXRlLiBEZWZpbmUgcHJvcGVydGllc1xuICogdXNpbmcgdGhlIHtAbGlua2NvZGUgTGl0RWxlbWVudC5wcm9wZXJ0aWVzIHByb3BlcnRpZXN9IHByb3BlcnR5IG9yIHRoZVxuICoge0BsaW5rY29kZSBwcm9wZXJ0eX0gZGVjb3JhdG9yLlxuICovXG5leHBvcnQgY2xhc3MgTGl0RWxlbWVudCBleHRlbmRzIFJlYWN0aXZlRWxlbWVudCB7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIHN0YXRpYyBbJ18kbGl0RWxlbWVudCQnXSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IHJlbmRlck9wdGlvbnM6IFJlbmRlck9wdGlvbnMgPSB7aG9zdDogdGhpc307XG5cbiAgcHJpdmF0ZSBfX2NoaWxkUGFydDogUm9vdFBhcnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVSZW5kZXJSb290KCkge1xuICAgIGNvbnN0IHJlbmRlclJvb3QgPSBzdXBlci5jcmVhdGVSZW5kZXJSb290KCk7XG4gICAgLy8gV2hlbiBhZG9wdGVkU3R5bGVTaGVldHMgYXJlIHNoaW1tZWQsIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlXG4gICAgLy8gc2hhZG93Um9vdCBieSBjcmVhdGVSZW5kZXJSb290LiBBZGp1c3QgdGhlIHJlbmRlckJlZm9yZSBub2RlIHNvIHRoYXRcbiAgICAvLyBhbnkgc3R5bGVzIGluIExpdCBjb250ZW50IHJlbmRlciBiZWZvcmUgYWRvcHRlZFN0eWxlU2hlZXRzLiBUaGlzIGlzXG4gICAgLy8gaW1wb3J0YW50IHNvIHRoYXQgYWRvcHRlZFN0eWxlU2hlZXRzIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHN0eWxlcyBpblxuICAgIC8vIHRoZSBzaGFkb3dSb290LlxuICAgIHRoaXMucmVuZGVyT3B0aW9ucy5yZW5kZXJCZWZvcmUgPz89IHJlbmRlclJvb3QhLmZpcnN0Q2hpbGQgYXMgQ2hpbGROb2RlO1xuICAgIHJldHVybiByZW5kZXJSb290O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGVsZW1lbnQuIFRoaXMgbWV0aG9kIHJlZmxlY3RzIHByb3BlcnR5IHZhbHVlcyB0byBhdHRyaWJ1dGVzXG4gICAqIGFuZCBjYWxscyBgcmVuZGVyYCB0byByZW5kZXIgRE9NIHZpYSBsaXQtaHRtbC4gU2V0dGluZyBwcm9wZXJ0aWVzIGluc2lkZVxuICAgKiB0aGlzIG1ldGhvZCB3aWxsICpub3QqIHRyaWdnZXIgYW5vdGhlciB1cGRhdGUuXG4gICAqIEBwYXJhbSBjaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpIHtcbiAgICAvLyBTZXR0aW5nIHByb3BlcnRpZXMgaW4gYHJlbmRlcmAgc2hvdWxkIG5vdCB0cmlnZ2VyIGFuIHVwZGF0ZS4gU2luY2VcbiAgICAvLyB1cGRhdGVzIGFyZSBhbGxvd2VkIGFmdGVyIHN1cGVyLnVwZGF0ZSwgaXQncyBpbXBvcnRhbnQgdG8gY2FsbCBgcmVuZGVyYFxuICAgIC8vIGJlZm9yZSB0aGF0LlxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZW5kZXIoKTtcbiAgICBpZiAoIXRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgdGhpcy5yZW5kZXJPcHRpb25zLmlzQ29ubmVjdGVkID0gdGhpcy5pc0Nvbm5lY3RlZDtcbiAgICB9XG4gICAgc3VwZXIudXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICB0aGlzLl9fY2hpbGRQYXJ0ID0gcmVuZGVyKHZhbHVlLCB0aGlzLnJlbmRlclJvb3QsIHRoaXMucmVuZGVyT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgYWRkZWQgdG8gdGhlIGRvY3VtZW50J3MgRE9NLlxuICAgKlxuICAgKiBJbiBgY29ubmVjdGVkQ2FsbGJhY2soKWAgeW91IHNob3VsZCBzZXR1cCB0YXNrcyB0aGF0IHNob3VsZCBvbmx5IG9jY3VyIHdoZW5cbiAgICogdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHRvIHRoZSBkb2N1bWVudC4gVGhlIG1vc3QgY29tbW9uIG9mIHRoZXNlIGlzXG4gICAqIGFkZGluZyBldmVudCBsaXN0ZW5lcnMgdG8gbm9kZXMgZXh0ZXJuYWwgdG8gdGhlIGVsZW1lbnQsIGxpa2UgYSBrZXlkb3duXG4gICAqIGV2ZW50IGhhbmRsZXIgYWRkZWQgdG8gdGhlIHdpbmRvdy5cbiAgICpcbiAgICogYGBgdHNcbiAgICogY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAqICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICogICBhZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5faGFuZGxlS2V5ZG93bik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFR5cGljYWxseSwgYW55dGhpbmcgZG9uZSBpbiBgY29ubmVjdGVkQ2FsbGJhY2soKWAgc2hvdWxkIGJlIHVuZG9uZSB3aGVuIHRoZVxuICAgKiBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZCwgaW4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrKClgLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgbGlmZWN5Y2xlXG4gICAqL1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuX19jaGlsZFBhcnQ/LnNldENvbm5lY3RlZCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyByZW1vdmVkIGZyb20gdGhlIGRvY3VtZW50J3MgRE9NLlxuICAgKlxuICAgKiBUaGlzIGNhbGxiYWNrIGlzIHRoZSBtYWluIHNpZ25hbCB0byB0aGUgZWxlbWVudCB0aGF0IGl0IG1heSBubyBsb25nZXIgYmVcbiAgICogdXNlZC4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrKClgIHNob3VsZCBlbnN1cmUgdGhhdCBub3RoaW5nIGlzIGhvbGRpbmcgYVxuICAgKiByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgKHN1Y2ggYXMgZXZlbnQgbGlzdGVuZXJzIGFkZGVkIHRvIG5vZGVzIGV4dGVybmFsXG4gICAqIHRvIHRoZSBlbGVtZW50KSwgc28gdGhhdCBpdCBpcyBmcmVlIHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICogICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgKiAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5faGFuZGxlS2V5ZG93bik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEFuIGVsZW1lbnQgbWF5IGJlIHJlLWNvbm5lY3RlZCBhZnRlciBiZWluZyBkaXNjb25uZWN0ZWQuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBsaWZlY3ljbGVcbiAgICovXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5fX2NoaWxkUGFydD8uc2V0Q29ubmVjdGVkKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VkIG9uIGVhY2ggdXBkYXRlIHRvIHBlcmZvcm0gcmVuZGVyaW5nIHRhc2tzLiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuXG4gICAqIGFueSB2YWx1ZSByZW5kZXJhYmxlIGJ5IGxpdC1odG1sJ3MgYENoaWxkUGFydGAgLSB0eXBpY2FsbHkgYVxuICAgKiBgVGVtcGxhdGVSZXN1bHRgLiBTZXR0aW5nIHByb3BlcnRpZXMgaW5zaWRlIHRoaXMgbWV0aG9kIHdpbGwgKm5vdCogdHJpZ2dlclxuICAgKiB0aGUgZWxlbWVudCB0byB1cGRhdGUuXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHByb3RlY3RlZCByZW5kZXIoKTogdW5rbm93biB7XG4gICAgcmV0dXJuIG5vQ2hhbmdlO1xuICB9XG59XG5cbi8qKlxuICogRW5zdXJlIHRoaXMgY2xhc3MgaXMgbWFya2VkIGFzIGBmaW5hbGl6ZWRgIGFzIGFuIG9wdGltaXphdGlvbiBlbnN1cmluZ1xuICogaXQgd2lsbCBub3QgbmVlZGxlc3NseSB0cnkgdG8gYGZpbmFsaXplYC5cbiAqXG4gKiBOb3RlIHRoaXMgcHJvcGVydHkgbmFtZSBpcyBhIHN0cmluZyB0byBwcmV2ZW50IGJyZWFraW5nIENsb3N1cmUgSlMgQ29tcGlsZXJcbiAqIG9wdGltaXphdGlvbnMuIFNlZSBAbGl0L3JlYWN0aXZlLWVsZW1lbnQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbihMaXRFbGVtZW50IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW1xuICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdmaW5hbGl6ZWQnLCBMaXRFbGVtZW50KVxuXSA9IHRydWU7XG5cbi8vIEluc3RhbGwgaHlkcmF0aW9uIGlmIGF2YWlsYWJsZVxuZ2xvYmFsVGhpcy5saXRFbGVtZW50SHlkcmF0ZVN1cHBvcnQ/Lih7TGl0RWxlbWVudH0pO1xuXG4vLyBBcHBseSBwb2x5ZmlsbHMgaWYgYXZhaWxhYmxlXG5jb25zdCBwb2x5ZmlsbFN1cHBvcnQgPSBERVZfTU9ERVxuICA/IGdsb2JhbFRoaXMubGl0RWxlbWVudFBvbHlmaWxsU3VwcG9ydERldk1vZGVcbiAgOiBnbG9iYWxUaGlzLmxpdEVsZW1lbnRQb2x5ZmlsbFN1cHBvcnQ7XG5wb2x5ZmlsbFN1cHBvcnQ/Lih7TGl0RWxlbWVudH0pO1xuXG4vKipcbiAqIEVORCBVU0VSUyBTSE9VTEQgTk9UIFJFTFkgT04gVEhJUyBPQkpFQ1QuXG4gKlxuICogUHJpdmF0ZSBleHBvcnRzIGZvciB1c2UgYnkgb3RoZXIgTGl0IHBhY2thZ2VzLCBub3QgaW50ZW5kZWQgZm9yIHVzZSBieVxuICogZXh0ZXJuYWwgdXNlcnMuXG4gKlxuICogV2UgY3VycmVudGx5IGRvIG5vdCBtYWtlIGEgbWFuZ2xlZCByb2xsdXAgYnVpbGQgb2YgdGhlIGxpdC1zc3IgY29kZS4gSW4gb3JkZXJcbiAqIHRvIGtlZXAgYSBudW1iZXIgb2YgKG90aGVyd2lzZSBwcml2YXRlKSB0b3AtbGV2ZWwgZXhwb3J0cyAgbWFuZ2xlZCBpbiB0aGVcbiAqIGNsaWVudCBzaWRlIGNvZGUsIHdlIGV4cG9ydCBhIF8kTEUgb2JqZWN0IGNvbnRhaW5pbmcgdGhvc2UgbWVtYmVycyAob3JcbiAqIGhlbHBlciBtZXRob2RzIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSBmaWVsZHMgb2YgdGhvc2UgbWVtYmVycyksIGFuZCB0aGVuXG4gKiByZS1leHBvcnQgdGhlbSBmb3IgdXNlIGluIGxpdC1zc3IuIFRoaXMga2VlcHMgbGl0LXNzciBhZ25vc3RpYyB0byB3aGV0aGVyIHRoZVxuICogY2xpZW50LXNpZGUgY29kZSBpcyBiZWluZyB1c2VkIGluIGBkZXZgIG1vZGUgb3IgYHByb2RgIG1vZGUuXG4gKlxuICogVGhpcyBoYXMgYSB1bmlxdWUgbmFtZSwgdG8gZGlzYW1iaWd1YXRlIGl0IGZyb20gcHJpdmF0ZSBleHBvcnRzIGluXG4gKiBsaXQtaHRtbCwgc2luY2UgdGhpcyBtb2R1bGUgcmUtZXhwb3J0cyBhbGwgb2YgbGl0LWh0bWwuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IF8kTEUgPSB7XG4gIF8kYXR0cmlidXRlVG9Qcm9wZXJ0eTogKFxuICAgIGVsOiBMaXRFbGVtZW50LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVsbFxuICApID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAoZWwgYXMgYW55KS5fJGF0dHJpYnV0ZVRvUHJvcGVydHkobmFtZSwgdmFsdWUpO1xuICB9LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgXyRjaGFuZ2VkUHJvcGVydGllczogKGVsOiBMaXRFbGVtZW50KSA9PiAoZWwgYXMgYW55KS5fJGNoYW5nZWRQcm9wZXJ0aWVzLFxufTtcblxuLy8gSU1QT1JUQU5UOiBkbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0eSBuYW1lIG9yIHRoZSBhc3NpZ25tZW50IGV4cHJlc3Npb24uXG4vLyBUaGlzIGxpbmUgd2lsbCBiZSB1c2VkIGluIHJlZ2V4ZXMgdG8gc2VhcmNoIGZvciBMaXRFbGVtZW50IHVzYWdlLlxuKGdsb2JhbFRoaXMubGl0RWxlbWVudFZlcnNpb25zID8/PSBbXSkucHVzaCgnNC4xLjEnKTtcbmlmIChERVZfTU9ERSAmJiBnbG9iYWxUaGlzLmxpdEVsZW1lbnRWZXJzaW9ucy5sZW5ndGggPiAxKSB7XG4gIGlzc3VlV2FybmluZyEoXG4gICAgJ211bHRpcGxlLXZlcnNpb25zJyxcbiAgICBgTXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0IGxvYWRlZC4gTG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBgICtcbiAgICAgIGBpcyBub3QgcmVjb21tZW5kZWQuYFxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG4vKlxuICogSU1QT1JUQU5UOiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRzaWNrbGUgYW5kIHRoZSBDbG9zdXJlIEpTIGNvbXBpbGVyLCBhbGxcbiAqIHByb3BlcnR5IGRlY29yYXRvcnMgKGJ1dCBub3QgY2xhc3MgZGVjb3JhdG9ycykgaW4gdGhpcyBmaWxlIHRoYXQgaGF2ZVxuICogYW4gQEV4cG9ydERlY29yYXRlZEl0ZW1zIGFubm90YXRpb24gbXVzdCBiZSBkZWZpbmVkIGFzIGEgcmVndWxhciBmdW5jdGlvbixcbiAqIG5vdCBhbiBhcnJvdyBmdW5jdGlvbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7Q29uc3RydWN0b3J9IGZyb20gJy4vYmFzZS5qcyc7XG5cbi8qKlxuICogQWxsb3cgZm9yIGN1c3RvbSBlbGVtZW50IGNsYXNzZXMgd2l0aCBwcml2YXRlIGNvbnN0cnVjdG9yc1xuICovXG50eXBlIEN1c3RvbUVsZW1lbnRDbGFzcyA9IE9taXQ8dHlwZW9mIEhUTUxFbGVtZW50LCAnbmV3Jz47XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUVsZW1lbnREZWNvcmF0b3IgPSB7XG4gIC8vIGxlZ2FjeVxuICAoY2xzOiBDdXN0b21FbGVtZW50Q2xhc3MpOiB2b2lkO1xuXG4gIC8vIHN0YW5kYXJkXG4gIChcbiAgICB0YXJnZXQ6IEN1c3RvbUVsZW1lbnRDbGFzcyxcbiAgICBjb250ZXh0OiBDbGFzc0RlY29yYXRvckNvbnRleHQ8Q29uc3RydWN0b3I8SFRNTEVsZW1lbnQ+PlxuICApOiB2b2lkO1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGRlZmluZXMgdGhlIGRlY29yYXRlZCBjbGFzcyBhcyBhIGN1c3RvbSBlbGVtZW50LlxuICpcbiAqIGBgYGpzXG4gKiBAY3VzdG9tRWxlbWVudCgnbXktZWxlbWVudCcpXG4gKiBjbGFzcyBNeUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAqICAgcmVuZGVyKCkge1xuICogICAgIHJldHVybiBodG1sYGA7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICogQGNhdGVnb3J5IERlY29yYXRvclxuICogQHBhcmFtIHRhZ05hbWUgVGhlIHRhZyBuYW1lIG9mIHRoZSBjdXN0b20gZWxlbWVudCB0byBkZWZpbmUuXG4gKi9cbmV4cG9ydCBjb25zdCBjdXN0b21FbGVtZW50ID1cbiAgKHRhZ05hbWU6IHN0cmluZyk6IEN1c3RvbUVsZW1lbnREZWNvcmF0b3IgPT5cbiAgKFxuICAgIGNsYXNzT3JUYXJnZXQ6IEN1c3RvbUVsZW1lbnRDbGFzcyB8IENvbnN0cnVjdG9yPEhUTUxFbGVtZW50PixcbiAgICBjb250ZXh0PzogQ2xhc3NEZWNvcmF0b3JDb250ZXh0PENvbnN0cnVjdG9yPEhUTUxFbGVtZW50Pj5cbiAgKSA9PiB7XG4gICAgaWYgKGNvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplcigoKSA9PiB7XG4gICAgICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgICAgICAgICB0YWdOYW1lLFxuICAgICAgICAgIGNsYXNzT3JUYXJnZXQgYXMgQ3VzdG9tRWxlbWVudENvbnN0cnVjdG9yXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKHRhZ05hbWUsIGNsYXNzT3JUYXJnZXQgYXMgQ3VzdG9tRWxlbWVudENvbnN0cnVjdG9yKTtcbiAgICB9XG4gIH07XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbi8qXG4gKiBJTVBPUlRBTlQ6IEZvciBjb21wYXRpYmlsaXR5IHdpdGggdHNpY2tsZSBhbmQgdGhlIENsb3N1cmUgSlMgY29tcGlsZXIsIGFsbFxuICogcHJvcGVydHkgZGVjb3JhdG9ycyAoYnV0IG5vdCBjbGFzcyBkZWNvcmF0b3JzKSBpbiB0aGlzIGZpbGUgdGhhdCBoYXZlXG4gKiBhbiBARXhwb3J0RGVjb3JhdGVkSXRlbXMgYW5ub3RhdGlvbiBtdXN0IGJlIGRlZmluZWQgYXMgYSByZWd1bGFyIGZ1bmN0aW9uLFxuICogbm90IGFuIGFycm93IGZ1bmN0aW9uLlxuICovXG5cbmltcG9ydCB7XG4gIHR5cGUgUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgdHlwZSBSZWFjdGl2ZUVsZW1lbnQsXG4gIGRlZmF1bHRDb252ZXJ0ZXIsXG4gIG5vdEVxdWFsLFxufSBmcm9tICcuLi9yZWFjdGl2ZS1lbGVtZW50LmpzJztcbmltcG9ydCB0eXBlIHtJbnRlcmZhY2V9IGZyb20gJy4vYmFzZS5qcyc7XG5cbmNvbnN0IERFVl9NT0RFID0gdHJ1ZTtcblxubGV0IGlzc3VlV2FybmluZzogKGNvZGU6IHN0cmluZywgd2FybmluZzogc3RyaW5nKSA9PiB2b2lkO1xuXG5pZiAoREVWX01PREUpIHtcbiAgLy8gRW5zdXJlIHdhcm5pbmdzIGFyZSBpc3N1ZWQgb25seSAxeCwgZXZlbiBpZiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBMaXRcbiAgLy8gYXJlIGxvYWRlZC5cbiAgY29uc3QgaXNzdWVkV2FybmluZ3M6IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+ID1cbiAgICAoZ2xvYmFsVGhpcy5saXRJc3N1ZWRXYXJuaW5ncyA/Pz0gbmV3IFNldCgpKTtcblxuICAvLyBJc3N1ZSBhIHdhcm5pbmcsIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeS5cbiAgaXNzdWVXYXJuaW5nID0gKGNvZGU6IHN0cmluZywgd2FybmluZzogc3RyaW5nKSA9PiB7XG4gICAgd2FybmluZyArPSBgIFNlZSBodHRwczovL2xpdC5kZXYvbXNnLyR7Y29kZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uYDtcbiAgICBpZiAoIWlzc3VlZFdhcm5pbmdzLmhhcyh3YXJuaW5nKSkge1xuICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgICAgaXNzdWVkV2FybmluZ3MuYWRkKHdhcm5pbmcpO1xuICAgIH1cbiAgfTtcbn1cblxuLy8gT3ZlcmxvYWRzIGZvciBwcm9wZXJ0eSBkZWNvcmF0b3Igc28gdGhhdCBUeXBlU2NyaXB0IGNhbiBpbmZlciB0aGUgY29ycmVjdFxuLy8gcmV0dXJuIHR5cGUgd2hlbiBhIGRlY29yYXRvciBpcyB1c2VkIGFzIGFuIGFjY2Vzc29yIGRlY29yYXRvciBvciBhIHNldHRlclxuLy8gZGVjb3JhdG9yLlxuZXhwb3J0IHR5cGUgUHJvcGVydHlEZWNvcmF0b3IgPSB7XG4gIC8vIGFjY2Vzc29yIGRlY29yYXRvciBzaWduYXR1cmVcbiAgPEMgZXh0ZW5kcyBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PiwgVj4oXG4gICAgdGFyZ2V0OiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yVGFyZ2V0PEMsIFY+LFxuICAgIGNvbnRleHQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICk6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JSZXN1bHQ8QywgVj47XG5cbiAgLy8gc2V0dGVyIGRlY29yYXRvciBzaWduYXR1cmVcbiAgPEMgZXh0ZW5kcyBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PiwgVj4oXG4gICAgdGFyZ2V0OiAodmFsdWU6IFYpID0+IHZvaWQsXG4gICAgY29udGV4dDogQ2xhc3NTZXR0ZXJEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICk6ICh0aGlzOiBDLCB2YWx1ZTogVikgPT4gdm9pZDtcblxuICAvLyBsZWdhY3kgZGVjb3JhdG9yIHNpZ25hdHVyZVxuICAoXG4gICAgcHJvdG9PckRlc2NyaXB0b3I6IE9iamVjdCxcbiAgICBuYW1lOiBQcm9wZXJ0eUtleSxcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgKTogYW55O1xufTtcblxuY29uc3QgbGVnYWN5UHJvcGVydHkgPSAoXG4gIG9wdGlvbnM6IFByb3BlcnR5RGVjbGFyYXRpb24gfCB1bmRlZmluZWQsXG4gIHByb3RvOiBPYmplY3QsXG4gIG5hbWU6IFByb3BlcnR5S2V5XG4pID0+IHtcbiAgY29uc3QgaGFzT3duUHJvcGVydHkgPSBwcm90by5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcbiAgKHByb3RvLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpLmNyZWF0ZVByb3BlcnR5KFxuICAgIG5hbWUsXG4gICAgaGFzT3duUHJvcGVydHkgPyB7Li4ub3B0aW9ucywgd3JhcHBlZDogdHJ1ZX0gOiBvcHRpb25zXG4gICk7XG4gIC8vIEZvciBhY2Nlc3NvcnMgKHdoaWNoIGhhdmUgYSBkZXNjcmlwdG9yIG9uIHRoZSBwcm90b3R5cGUpIHdlIG5lZWQgdG9cbiAgLy8gcmV0dXJuIGEgZGVzY3JpcHRvciwgb3RoZXJ3aXNlIFR5cGVTY3JpcHQgb3ZlcndyaXRlcyB0aGUgZGVzY3JpcHRvciB3ZVxuICAvLyBkZWZpbmUgaW4gY3JlYXRlUHJvcGVydHkoKSB3aXRoIHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9yLiBXZSBkb24ndCBkbyB0aGlzXG4gIC8vIGZvciBmaWVsZHMsIHdoaWNoIGRvbid0IGhhdmUgYSBkZXNjcmlwdG9yLCBiZWNhdXNlIHRoaXMgY291bGQgb3ZlcndyaXRlXG4gIC8vIGRlc2NyaXB0b3IgZGVmaW5lZCBieSBvdGhlciBkZWNvcmF0b3JzLlxuICByZXR1cm4gaGFzT3duUHJvcGVydHlcbiAgICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIG5hbWUpXG4gICAgOiB1bmRlZmluZWQ7XG59O1xuXG4vLyBUaGlzIGlzIGR1cGxpY2F0ZWQgZnJvbSBhIHNpbWlsYXIgdmFyaWFibGUgaW4gcmVhY3RpdmUtZWxlbWVudC50cywgYnV0XG4vLyBhY3R1YWxseSBtYWtlcyBzZW5zZSB0byBoYXZlIHRoaXMgZGVmYXVsdCBkZWZpbmVkIHdpdGggdGhlIGRlY29yYXRvciwgc29cbi8vIHRoYXQgZGlmZmVyZW50IGRlY29yYXRvcnMgY291bGQgaGF2ZSBkaWZmZXJlbnQgZGVmYXVsdHMuXG5jb25zdCBkZWZhdWx0UHJvcGVydHlEZWNsYXJhdGlvbjogUHJvcGVydHlEZWNsYXJhdGlvbiA9IHtcbiAgYXR0cmlidXRlOiB0cnVlLFxuICB0eXBlOiBTdHJpbmcsXG4gIGNvbnZlcnRlcjogZGVmYXVsdENvbnZlcnRlcixcbiAgcmVmbGVjdDogZmFsc2UsXG4gIGhhc0NoYW5nZWQ6IG5vdEVxdWFsLFxufTtcblxuLy8gVGVtcG9yYXJ5IHR5cGUsIHVudGlsIGdvb2dsZTMgaXMgb24gVHlwZVNjcmlwdCA1LjJcbnR5cGUgU3RhbmRhcmRQcm9wZXJ0eUNvbnRleHQ8QywgVj4gPSAoXG4gIHwgQ2xhc3NBY2Nlc3NvckRlY29yYXRvckNvbnRleHQ8QywgVj5cbiAgfCBDbGFzc1NldHRlckRlY29yYXRvckNvbnRleHQ8QywgVj5cbikgJiB7bWV0YWRhdGE6IG9iamVjdH07XG5cbi8qKlxuICogV3JhcHMgYSBjbGFzcyBhY2Nlc3NvciBvciBzZXR0ZXIgc28gdGhhdCBgcmVxdWVzdFVwZGF0ZSgpYCBpcyBjYWxsZWQgd2l0aCB0aGVcbiAqIHByb3BlcnR5IG5hbWUgYW5kIG9sZCB2YWx1ZSB3aGVuIHRoZSBhY2Nlc3NvciBpcyBzZXQuXG4gKi9cbmV4cG9ydCBjb25zdCBzdGFuZGFyZFByb3BlcnR5ID0gPEMgZXh0ZW5kcyBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PiwgVj4oXG4gIG9wdGlvbnM6IFByb3BlcnR5RGVjbGFyYXRpb24gPSBkZWZhdWx0UHJvcGVydHlEZWNsYXJhdGlvbixcbiAgdGFyZ2V0OiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yVGFyZ2V0PEMsIFY+IHwgKCh2YWx1ZTogVikgPT4gdm9pZCksXG4gIGNvbnRleHQ6IFN0YW5kYXJkUHJvcGVydHlDb250ZXh0PEMsIFY+XG4pOiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yUmVzdWx0PEMsIFY+IHwgKCh0aGlzOiBDLCB2YWx1ZTogVikgPT4gdm9pZCkgPT4ge1xuICBjb25zdCB7a2luZCwgbWV0YWRhdGF9ID0gY29udGV4dDtcblxuICBpZiAoREVWX01PREUgJiYgbWV0YWRhdGEgPT0gbnVsbCkge1xuICAgIGlzc3VlV2FybmluZyhcbiAgICAgICdtaXNzaW5nLWNsYXNzLW1ldGFkYXRhJyxcbiAgICAgIGBUaGUgY2xhc3MgJHt0YXJnZXR9IGlzIG1pc3NpbmcgZGVjb3JhdG9yIG1ldGFkYXRhLiBUaGlzIGAgK1xuICAgICAgICBgY291bGQgbWVhbiB0aGF0IHlvdSdyZSB1c2luZyBhIGNvbXBpbGVyIHRoYXQgc3VwcG9ydHMgZGVjb3JhdG9ycyBgICtcbiAgICAgICAgYGJ1dCBkb2Vzbid0IHN1cHBvcnQgZGVjb3JhdG9yIG1ldGFkYXRhLCBzdWNoIGFzIFR5cGVTY3JpcHQgNS4xLiBgICtcbiAgICAgICAgYFBsZWFzZSB1cGRhdGUgeW91ciBjb21waWxlci5gXG4gICAgKTtcbiAgfVxuXG4gIC8vIFN0b3JlIHRoZSBwcm9wZXJ0eSBvcHRpb25zXG4gIGxldCBwcm9wZXJ0aWVzID0gZ2xvYmFsVGhpcy5saXRQcm9wZXJ0eU1ldGFkYXRhLmdldChtZXRhZGF0YSk7XG4gIGlmIChwcm9wZXJ0aWVzID09PSB1bmRlZmluZWQpIHtcbiAgICBnbG9iYWxUaGlzLmxpdFByb3BlcnR5TWV0YWRhdGEuc2V0KG1ldGFkYXRhLCAocHJvcGVydGllcyA9IG5ldyBNYXAoKSkpO1xuICB9XG4gIHByb3BlcnRpZXMuc2V0KGNvbnRleHQubmFtZSwgb3B0aW9ucyk7XG5cbiAgaWYgKGtpbmQgPT09ICdhY2Nlc3NvcicpIHtcbiAgICAvLyBTdGFuZGFyZCBkZWNvcmF0b3JzIGNhbm5vdCBkeW5hbWljYWxseSBtb2RpZnkgdGhlIGNsYXNzLCBzbyB3ZSBjYW4ndFxuICAgIC8vIHJlcGxhY2UgYSBmaWVsZCB3aXRoIGFjY2Vzc29ycy4gVGhlIHVzZXIgbXVzdCB1c2UgdGhlIG5ldyBgYWNjZXNzb3JgXG4gICAgLy8ga2V5d29yZCBpbnN0ZWFkLlxuICAgIGNvbnN0IHtuYW1lfSA9IGNvbnRleHQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQsIHY6IFYpIHtcbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSAoXG4gICAgICAgICAgdGFyZ2V0IGFzIENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj5cbiAgICAgICAgKS5nZXQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgQyk7XG4gICAgICAgICh0YXJnZXQgYXMgQ2xhc3NBY2Nlc3NvckRlY29yYXRvclRhcmdldDxDLCBWPikuc2V0LmNhbGwoXG4gICAgICAgICAgdGhpcyBhcyB1bmtub3duIGFzIEMsXG4gICAgICAgICAgdlxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgfSxcbiAgICAgIGluaXQodGhpczogUmVhY3RpdmVFbGVtZW50LCB2OiBWKTogViB7XG4gICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLl8kY2hhbmdlUHJvcGVydHkobmFtZSwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdjtcbiAgICAgIH0sXG4gICAgfSBhcyB1bmtub3duIGFzIENsYXNzQWNjZXNzb3JEZWNvcmF0b3JSZXN1bHQ8QywgVj47XG4gIH0gZWxzZSBpZiAoa2luZCA9PT0gJ3NldHRlcicpIHtcbiAgICBjb25zdCB7bmFtZX0gPSBjb250ZXh0O1xuICAgIHJldHVybiBmdW5jdGlvbiAodGhpczogUmVhY3RpdmVFbGVtZW50LCB2YWx1ZTogVikge1xuICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzW25hbWUgYXMga2V5b2YgUmVhY3RpdmVFbGVtZW50XTtcbiAgICAgICh0YXJnZXQgYXMgKHZhbHVlOiBWKSA9PiB2b2lkKS5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZShuYW1lLCBvbGRWYWx1ZSwgb3B0aW9ucyk7XG4gICAgfSBhcyB1bmtub3duIGFzICh0aGlzOiBDLCB2YWx1ZTogVikgPT4gdm9pZDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRlY29yYXRvciBsb2NhdGlvbjogJHtraW5kfWApO1xufTtcblxuLyoqXG4gKiBBIGNsYXNzIGZpZWxkIG9yIGFjY2Vzc29yIGRlY29yYXRvciB3aGljaCBjcmVhdGVzIGEgcmVhY3RpdmUgcHJvcGVydHkgdGhhdFxuICogcmVmbGVjdHMgYSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSB2YWx1ZS4gV2hlbiBhIGRlY29yYXRlZCBwcm9wZXJ0eSBpcyBzZXRcbiAqIHRoZSBlbGVtZW50IHdpbGwgdXBkYXRlIGFuZCByZW5kZXIuIEEge0BsaW5rY29kZSBQcm9wZXJ0eURlY2xhcmF0aW9ufSBtYXlcbiAqIG9wdGlvbmFsbHkgYmUgc3VwcGxpZWQgdG8gY29uZmlndXJlIHByb3BlcnR5IGZlYXR1cmVzLlxuICpcbiAqIFRoaXMgZGVjb3JhdG9yIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHB1YmxpYyBmaWVsZHMuIEFzIHB1YmxpYyBmaWVsZHMsXG4gKiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIHByaW1hcmlseSBzZXR0YWJsZSBieSBlbGVtZW50IHVzZXJzLFxuICogZWl0aGVyIHZpYSBhdHRyaWJ1dGUgb3IgdGhlIHByb3BlcnR5IGl0c2VsZi5cbiAqXG4gKiBHZW5lcmFsbHksIHByb3BlcnRpZXMgdGhhdCBhcmUgY2hhbmdlZCBieSB0aGUgZWxlbWVudCBzaG91bGQgYmUgcHJpdmF0ZSBvclxuICogcHJvdGVjdGVkIGZpZWxkcyBhbmQgc2hvdWxkIHVzZSB0aGUge0BsaW5rY29kZSBzdGF0ZX0gZGVjb3JhdG9yLlxuICpcbiAqIEhvd2V2ZXIsIHNvbWV0aW1lcyBlbGVtZW50IGNvZGUgZG9lcyBuZWVkIHRvIHNldCBhIHB1YmxpYyBwcm9wZXJ0eS4gVGhpc1xuICogc2hvdWxkIHR5cGljYWxseSBvbmx5IGJlIGRvbmUgaW4gcmVzcG9uc2UgdG8gdXNlciBpbnRlcmFjdGlvbiwgYW5kIGFuIGV2ZW50XG4gKiBzaG91bGQgYmUgZmlyZWQgaW5mb3JtaW5nIHRoZSB1c2VyOyBmb3IgZXhhbXBsZSwgYSBjaGVja2JveCBzZXRzIGl0c1xuICogYGNoZWNrZWRgIHByb3BlcnR5IHdoZW4gY2xpY2tlZCBhbmQgZmlyZXMgYSBgY2hhbmdlZGAgZXZlbnQuIE11dGF0aW5nIHB1YmxpY1xuICogcHJvcGVydGllcyBzaG91bGQgdHlwaWNhbGx5IG5vdCBiZSBkb25lIGZvciBub24tcHJpbWl0aXZlIChvYmplY3Qgb3IgYXJyYXkpXG4gKiBwcm9wZXJ0aWVzLiBJbiBvdGhlciBjYXNlcyB3aGVuIGFuIGVsZW1lbnQgbmVlZHMgdG8gbWFuYWdlIHN0YXRlLCBhIHByaXZhdGVcbiAqIHByb3BlcnR5IGRlY29yYXRlZCB2aWEgdGhlIHtAbGlua2NvZGUgc3RhdGV9IGRlY29yYXRvciBzaG91bGQgYmUgdXNlZC4gV2hlblxuICogbmVlZGVkLCBzdGF0ZSBwcm9wZXJ0aWVzIGNhbiBiZSBpbml0aWFsaXplZCB2aWEgcHVibGljIHByb3BlcnRpZXMgdG9cbiAqIGZhY2lsaXRhdGUgY29tcGxleCBpbnRlcmFjdGlvbnMuXG4gKlxuICogYGBgdHNcbiAqIGNsYXNzIE15RWxlbWVudCB7XG4gKiAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSlcbiAqICAgY2xpY2tlZCA9IGZhbHNlO1xuICogfVxuICogYGBgXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yXG4gKiBARXhwb3J0RGVjb3JhdGVkSXRlbXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnR5KG9wdGlvbnM/OiBQcm9wZXJ0eURlY2xhcmF0aW9uKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gPEMgZXh0ZW5kcyBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PiwgVj4oXG4gICAgcHJvdG9PclRhcmdldDpcbiAgICAgIHwgb2JqZWN0XG4gICAgICB8IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj5cbiAgICAgIHwgKCh2YWx1ZTogVikgPT4gdm9pZCksXG4gICAgbmFtZU9yQ29udGV4dDpcbiAgICAgIHwgUHJvcGVydHlLZXlcbiAgICAgIHwgQ2xhc3NBY2Nlc3NvckRlY29yYXRvckNvbnRleHQ8QywgVj5cbiAgICAgIHwgQ2xhc3NTZXR0ZXJEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgKTogYW55ID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIG5hbWVPckNvbnRleHQgPT09ICdvYmplY3QnXG4gICAgICAgID8gc3RhbmRhcmRQcm9wZXJ0eTxDLCBWPihcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBwcm90b09yVGFyZ2V0IGFzXG4gICAgICAgICAgICAgIHwgQ2xhc3NBY2Nlc3NvckRlY29yYXRvclRhcmdldDxDLCBWPlxuICAgICAgICAgICAgICB8ICgodmFsdWU6IFYpID0+IHZvaWQpLFxuICAgICAgICAgICAgbmFtZU9yQ29udGV4dCBhcyBTdGFuZGFyZFByb3BlcnR5Q29udGV4dDxDLCBWPlxuICAgICAgICAgIClcbiAgICAgICAgOiBsZWdhY3lQcm9wZXJ0eShcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBwcm90b09yVGFyZ2V0IGFzIE9iamVjdCxcbiAgICAgICAgICAgIG5hbWVPckNvbnRleHQgYXMgUHJvcGVydHlLZXlcbiAgICAgICAgICApXG4gICAgKSBhcyBQcm9wZXJ0eURlY29yYXRvcjtcbiAgfTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cblxuaW1wb3J0IHtwcm9wZXJ0eX0gZnJvbSAnLi9wcm9wZXJ0eS5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVEZWNsYXJhdGlvbjxUeXBlID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGluZGljYXRlcyBpZiBhIHByb3BlcnR5IHNob3VsZCBiZSBjb25zaWRlcmVkIGNoYW5nZWQgd2hlblxuICAgKiBpdCBpcyBzZXQuIFRoZSBmdW5jdGlvbiBzaG91bGQgdGFrZSB0aGUgYG5ld1ZhbHVlYCBhbmQgYG9sZFZhbHVlYCBhbmRcbiAgICogcmV0dXJuIGB0cnVlYCBpZiBhbiB1cGRhdGUgc2hvdWxkIGJlIHJlcXVlc3RlZC5cbiAgICovXG4gIGhhc0NoYW5nZWQ/KHZhbHVlOiBUeXBlLCBvbGRWYWx1ZTogVHlwZSk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIFN0YXRlRGVjbGFyYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgSW50ZXJuYWxQcm9wZXJ0eURlY2xhcmF0aW9uPFR5cGUgPSB1bmtub3duPiA9XG4gIFN0YXRlRGVjbGFyYXRpb248VHlwZT47XG5cbi8qKlxuICogRGVjbGFyZXMgYSBwcml2YXRlIG9yIHByb3RlY3RlZCByZWFjdGl2ZSBwcm9wZXJ0eSB0aGF0IHN0aWxsIHRyaWdnZXJzXG4gKiB1cGRhdGVzIHRvIHRoZSBlbGVtZW50IHdoZW4gaXQgY2hhbmdlcy4gSXQgZG9lcyBub3QgcmVmbGVjdCBmcm9tIHRoZVxuICogY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUuXG4gKlxuICogUHJvcGVydGllcyBkZWNsYXJlZCB0aGlzIHdheSBtdXN0IG5vdCBiZSB1c2VkIGZyb20gSFRNTCBvciBIVE1MIHRlbXBsYXRpbmdcbiAqIHN5c3RlbXMsIHRoZXkncmUgc29sZWx5IGZvciBwcm9wZXJ0aWVzIGludGVybmFsIHRvIHRoZSBlbGVtZW50LiBUaGVzZVxuICogcHJvcGVydGllcyBtYXkgYmUgcmVuYW1lZCBieSBvcHRpbWl6YXRpb24gdG9vbHMgbGlrZSBjbG9zdXJlIGNvbXBpbGVyLlxuICogQGNhdGVnb3J5IERlY29yYXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhdGUob3B0aW9ucz86IFN0YXRlRGVjbGFyYXRpb24pIHtcbiAgcmV0dXJuIHByb3BlcnR5KHtcbiAgICAuLi5vcHRpb25zLFxuICAgIC8vIEFkZCBib3RoIGBzdGF0ZWAgYW5kIGBhdHRyaWJ1dGVgIGJlY2F1c2Ugd2UgZm91bmQgYSB0aGlyZCBwYXJ0eVxuICAgIC8vIGNvbnRyb2xsZXIgdGhhdCBpcyBrZXlpbmcgb2ZmIG9mIFByb3BlcnR5T3B0aW9ucy5zdGF0ZSB0byBkZXRlcm1pbmVcbiAgICAvLyB3aGV0aGVyIGEgZmllbGQgaXMgYSBwcml2YXRlIGludGVybmFsIHByb3BlcnR5IG9yIG5vdC5cbiAgICBzdGF0ZTogdHJ1ZSxcbiAgICBhdHRyaWJ1dGU6IGZhbHNlLFxuICB9KTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBwdWJsaWMgaW50ZXJmYWNlIHR5cGUgdGhhdCByZW1vdmVzIHByaXZhdGUgYW5kIHByb3RlY3RlZCBmaWVsZHMuXG4gKiBUaGlzIGFsbG93cyBhY2NlcHRpbmcgb3RoZXJ3aXNlIGluY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiB0aGUgdHlwZSAoZS5nLiBmcm9tXG4gKiBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgcGFja2FnZSBpbiBgbm9kZV9tb2R1bGVzYCkuXG4gKi9cbmV4cG9ydCB0eXBlIEludGVyZmFjZTxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS107XG59O1xuXG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUPiA9IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQ7XG59O1xuXG4vKipcbiAqIFdyYXBzIHVwIGEgZmV3IGJlc3QgcHJhY3RpY2VzIHdoZW4gcmV0dXJuaW5nIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmcm9tIGFcbiAqIGRlY29yYXRvci5cbiAqXG4gKiBNYXJrcyB0aGUgZGVmaW5lZCBwcm9wZXJ0eSBhcyBjb25maWd1cmFibGUsIGFuZCBlbnVtZXJhYmxlLCBhbmQgaGFuZGxlc1xuICogdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBhIGJ1c3RlZCBSZWZsZWN0LmRlY29yYXRlIHpvbWJpZWZpbGwgKGUuZy4gaW4gQW5ndWxhclxuICogYXBwcykuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBkZXNjID0gKFxuICBvYmo6IG9iamVjdCxcbiAgbmFtZTogUHJvcGVydHlLZXkgfCBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dDx1bmtub3duLCB1bmtub3duPixcbiAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yXG4pID0+IHtcbiAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB3ZSBrZWVwIHRoZW0gY29uZmlndXJhYmxlIGFuZCBlbnVtZXJhYmxlLlxuICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG4gIGlmIChcbiAgICAvLyBXZSBjaGVjayBmb3IgUmVmbGVjdC5kZWNvcmF0ZSBlYWNoIHRpbWUsIGluIGNhc2UgdGhlIHpvbWJpZWZpbGxcbiAgICAvLyBpcyBhcHBsaWVkIHZpYSBsYXp5IGxvYWRpbmcgc29tZSBBbmd1bGFyIGNvZGUuXG4gICAgKFJlZmxlY3QgYXMgdHlwZW9mIFJlZmxlY3QgJiB7ZGVjb3JhdGU/OiB1bmtub3dufSkuZGVjb3JhdGUgJiZcbiAgICB0eXBlb2YgbmFtZSAhPT0gJ29iamVjdCdcbiAgKSB7XG4gICAgLy8gSWYgd2UncmUgY2FsbGVkIGFzIGEgbGVnYWN5IGRlY29yYXRvciwgYW5kIFJlZmxlY3QuZGVjb3JhdGUgaXMgcHJlc2VudFxuICAgIC8vIHRoZW4gd2UgaGF2ZSBubyBndWFyYW50ZWVzIHRoYXQgdGhlIHJldHVybmVkIGRlc2NyaXB0b3Igd2lsbCBiZVxuICAgIC8vIGRlZmluZWQgb24gdGhlIGNsYXNzLCBzbyB3ZSBtdXN0IGFwcGx5IGl0IGRpcmVjdGx5IG91cnNlbHZlcy5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG5hbWUsIGRlc2NyaXB0b3IpO1xuICB9XG4gIHJldHVybiBkZXNjcmlwdG9yO1xufTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cbmltcG9ydCB0eXBlIHtSZWFjdGl2ZUVsZW1lbnR9IGZyb20gJy4uL3JlYWN0aXZlLWVsZW1lbnQuanMnO1xuaW1wb3J0IHtkZXNjLCB0eXBlIEludGVyZmFjZX0gZnJvbSAnLi9iYXNlLmpzJztcblxuY29uc3QgREVWX01PREUgPSB0cnVlO1xuXG5sZXQgaXNzdWVXYXJuaW5nOiAoY29kZTogc3RyaW5nLCB3YXJuaW5nOiBzdHJpbmcpID0+IHZvaWQ7XG5cbmlmIChERVZfTU9ERSkge1xuICAvLyBFbnN1cmUgd2FybmluZ3MgYXJlIGlzc3VlZCBvbmx5IDF4LCBldmVuIGlmIG11bHRpcGxlIHZlcnNpb25zIG9mIExpdFxuICAvLyBhcmUgbG9hZGVkLlxuICBjb25zdCBpc3N1ZWRXYXJuaW5nczogU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4gPVxuICAgIChnbG9iYWxUaGlzLmxpdElzc3VlZFdhcm5pbmdzID8/PSBuZXcgU2V0KCkpO1xuXG4gIC8vIElzc3VlIGEgd2FybmluZywgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5LlxuICBpc3N1ZVdhcm5pbmcgPSAoY29kZTogc3RyaW5nLCB3YXJuaW5nOiBzdHJpbmcpID0+IHtcbiAgICB3YXJuaW5nICs9IGNvZGVcbiAgICAgID8gYCBTZWUgaHR0cHM6Ly9saXQuZGV2L21zZy8ke2NvZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLmBcbiAgICAgIDogJyc7XG4gICAgaWYgKCFpc3N1ZWRXYXJuaW5ncy5oYXMod2FybmluZykpIHtcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgIGlzc3VlZFdhcm5pbmdzLmFkZCh3YXJuaW5nKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5RGVjb3JhdG9yID0ge1xuICAvLyBsZWdhY3lcbiAgKFxuICAgIHByb3RvOiBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PixcbiAgICBuYW1lOiBQcm9wZXJ0eUtleSxcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICAgLy8gTm90ZSBUeXBlU2NyaXB0IHJlcXVpcmVzIHRoZSByZXR1cm4gdHlwZSB0byBiZSBgdm9pZHxhbnlgXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgKTogdm9pZCB8IGFueTtcblxuICAvLyBzdGFuZGFyZFxuICA8QyBleHRlbmRzIEludGVyZmFjZTxSZWFjdGl2ZUVsZW1lbnQ+LCBWIGV4dGVuZHMgRWxlbWVudCB8IG51bGw+KFxuICAgIHZhbHVlOiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yVGFyZ2V0PEMsIFY+LFxuICAgIGNvbnRleHQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICk6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JSZXN1bHQ8QywgVj47XG59O1xuXG4vKipcbiAqIEEgcHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgY29udmVydHMgYSBjbGFzcyBwcm9wZXJ0eSBpbnRvIGEgZ2V0dGVyIHRoYXRcbiAqIGV4ZWN1dGVzIGEgcXVlcnlTZWxlY3RvciBvbiB0aGUgZWxlbWVudCdzIHJlbmRlclJvb3QuXG4gKlxuICogQHBhcmFtIHNlbGVjdG9yIEEgRE9NU3RyaW5nIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgc2VsZWN0b3JzIHRvIG1hdGNoLlxuICogQHBhcmFtIGNhY2hlIEFuIG9wdGlvbmFsIGJvb2xlYW4gd2hpY2ggd2hlbiB0cnVlIHBlcmZvcm1zIHRoZSBET00gcXVlcnkgb25seVxuICogICAgIG9uY2UgYW5kIGNhY2hlcyB0aGUgcmVzdWx0LlxuICpcbiAqIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50L3F1ZXJ5U2VsZWN0b3JcbiAqXG4gKiBgYGB0c1xuICogY2xhc3MgTXlFbGVtZW50IHtcbiAqICAgQHF1ZXJ5KCcjZmlyc3QnKVxuICogICBmaXJzdDogSFRNTERpdkVsZW1lbnQ7XG4gKlxuICogICByZW5kZXIoKSB7XG4gKiAgICAgcmV0dXJuIGh0bWxgXG4gKiAgICAgICA8ZGl2IGlkPVwiZmlyc3RcIj48L2Rpdj5cbiAqICAgICAgIDxkaXYgaWQ9XCJzZWNvbmRcIj48L2Rpdj5cbiAqICAgICBgO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5KHNlbGVjdG9yOiBzdHJpbmcsIGNhY2hlPzogYm9vbGVhbik6IFF1ZXJ5RGVjb3JhdG9yIHtcbiAgcmV0dXJuICg8QyBleHRlbmRzIEludGVyZmFjZTxSZWFjdGl2ZUVsZW1lbnQ+LCBWIGV4dGVuZHMgRWxlbWVudCB8IG51bGw+KFxuICAgIHByb3RvT3JUYXJnZXQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj4sXG4gICAgbmFtZU9yQ29udGV4dDogUHJvcGVydHlLZXkgfCBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dDxDLCBWPixcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkgPT4ge1xuICAgIGNvbnN0IGRvUXVlcnkgPSAoZWw6IEludGVyZmFjZTxSZWFjdGl2ZUVsZW1lbnQ+KTogViA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSAoZWwucmVuZGVyUm9vdD8ucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgPz8gbnVsbCkgYXMgVjtcbiAgICAgIGlmIChERVZfTU9ERSAmJiByZXN1bHQgPT09IG51bGwgJiYgY2FjaGUgJiYgIWVsLmhhc1VwZGF0ZWQpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9XG4gICAgICAgICAgdHlwZW9mIG5hbWVPckNvbnRleHQgPT09ICdvYmplY3QnXG4gICAgICAgICAgICA/IG5hbWVPckNvbnRleHQubmFtZVxuICAgICAgICAgICAgOiBuYW1lT3JDb250ZXh0O1xuICAgICAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAgICAgJycsXG4gICAgICAgICAgYEBxdWVyeSdkIGZpZWxkICR7SlNPTi5zdHJpbmdpZnkoU3RyaW5nKG5hbWUpKX0gd2l0aCB0aGUgJ2NhY2hlJyBgICtcbiAgICAgICAgICAgIGBmbGFnIHNldCBmb3Igc2VsZWN0b3IgJyR7c2VsZWN0b3J9JyBoYXMgYmVlbiBhY2Nlc3NlZCBiZWZvcmUgYCArXG4gICAgICAgICAgICBgdGhlIGZpcnN0IHVwZGF0ZSBhbmQgcmV0dXJuZWQgbnVsbC4gVGhpcyBpcyBleHBlY3RlZCBpZiB0aGUgYCArXG4gICAgICAgICAgICBgcmVuZGVyUm9vdCB0cmVlIGhhcyBub3QgYmVlbiBwcm92aWRlZCBiZWZvcmVoYW5kIChlLmcuIHZpYSBgICtcbiAgICAgICAgICAgIGBEZWNsYXJhdGl2ZSBTaGFkb3cgRE9NKS4gVGhlcmVmb3JlIHRoZSB2YWx1ZSBoYXNuJ3QgYmVlbiBjYWNoZWQuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogaWYgd2Ugd2FudCB0byBhbGxvdyB1c2VycyB0byBhc3NlcnQgdGhhdCB0aGUgcXVlcnkgd2lsbCBuZXZlclxuICAgICAgLy8gcmV0dXJuIG51bGwsIHdlIG5lZWQgYSBuZXcgb3B0aW9uIGFuZCB0byB0aHJvdyBoZXJlIGlmIHRoZSByZXN1bHRcbiAgICAgIC8vIGlzIG51bGwuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICAvLyBBY2Nlc3NvcnMgdG8gd3JhcCBmcm9tIGVpdGhlcjpcbiAgICAgIC8vICAgMS4gVGhlIGRlY29yYXRvciB0YXJnZXQsIGluIHRoZSBjYXNlIG9mIHN0YW5kYXJkIGRlY29yYXRvcnNcbiAgICAgIC8vICAgMi4gVGhlIHByb3BlcnR5IGRlc2NyaXB0b3IsIGluIHRoZSBjYXNlIG9mIGV4cGVyaW1lbnRhbCBkZWNvcmF0b3JzXG4gICAgICAvLyAgICAgIG9uIGF1dG8tYWNjZXNzb3JzLlxuICAgICAgLy8gICAzLiBGdW5jdGlvbnMgdGhhdCBhY2Nlc3Mgb3VyIG93biBjYWNoZS1rZXkgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlLFxuICAgICAgLy8gICAgICBpbiB0aGUgY2FzZSBvZiBleHBlcmltZW50YWwgZGVjb3JhdG9ycyBvbiBmaWVsZHMuXG4gICAgICBjb25zdCB7Z2V0LCBzZXR9ID1cbiAgICAgICAgdHlwZW9mIG5hbWVPckNvbnRleHQgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyBwcm90b09yVGFyZ2V0XG4gICAgICAgICAgOiBkZXNjcmlwdG9yID8/XG4gICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBrZXkgPSBERVZfTU9ERVxuICAgICAgICAgICAgICAgID8gU3ltYm9sKGAke1N0cmluZyhuYW1lT3JDb250ZXh0KX0gKEBxdWVyeSgpIGNhY2hlKWApXG4gICAgICAgICAgICAgICAgOiBTeW1ib2woKTtcbiAgICAgICAgICAgICAgdHlwZSBXaXRoQ2FjaGUgPSBSZWFjdGl2ZUVsZW1lbnQgJiB7XG4gICAgICAgICAgICAgICAgW2tleTogc3ltYm9sXTogRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzIGFzIFdpdGhDYWNoZSlba2V5XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldCh2KSB7XG4gICAgICAgICAgICAgICAgICAodGhpcyBhcyBXaXRoQ2FjaGUpW2tleV0gPSB2O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgcmV0dXJuIGRlc2MocHJvdG9PclRhcmdldCwgbmFtZU9yQ29udGV4dCwge1xuICAgICAgICBnZXQodGhpczogUmVhY3RpdmVFbGVtZW50KTogViB7XG4gICAgICAgICAgbGV0IHJlc3VsdDogViA9IGdldCEuY2FsbCh0aGlzKTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGRvUXVlcnkodGhpcyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsIHx8IHRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgICAgICAgICBzZXQhLmNhbGwodGhpcywgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIG9iamVjdCB3b3JrcyBhcyB0aGUgcmV0dXJuIHR5cGUgZm9yIGJvdGggc3RhbmRhcmQgYW5kXG4gICAgICAvLyBleHBlcmltZW50YWwgZGVjb3JhdG9ycy5cbiAgICAgIHJldHVybiBkZXNjKHByb3RvT3JUYXJnZXQsIG5hbWVPckNvbnRleHQsIHtcbiAgICAgICAgZ2V0KHRoaXM6IFJlYWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgIHJldHVybiBkb1F1ZXJ5KHRoaXMpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9KSBhcyBRdWVyeURlY29yYXRvcjtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cblxuaW1wb3J0IHR5cGUge1JlYWN0aXZlRWxlbWVudH0gZnJvbSAnLi4vcmVhY3RpdmUtZWxlbWVudC5qcyc7XG5pbXBvcnQgdHlwZSB7UXVlcnlBc3NpZ25lZE5vZGVzT3B0aW9uc30gZnJvbSAnLi9xdWVyeS1hc3NpZ25lZC1ub2Rlcy5qcyc7XG5pbXBvcnQge2Rlc2MsIHR5cGUgSW50ZXJmYWNlfSBmcm9tICcuL2Jhc2UuanMnO1xuXG5leHBvcnQgdHlwZSBRdWVyeUFzc2lnbmVkRWxlbWVudHNEZWNvcmF0b3IgPSB7XG4gIC8vIGxlZ2FjeVxuICAoXG4gICAgcHJvdG86IEludGVyZmFjZTxSZWFjdGl2ZUVsZW1lbnQ+LFxuICAgIG5hbWU6IFByb3BlcnR5S2V5LFxuICAgIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgICAvLyBOb3RlIFR5cGVTY3JpcHQgcmVxdWlyZXMgdGhlIHJldHVybiB0eXBlIHRvIGJlIGB2b2lkfGFueWBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICApOiB2b2lkIHwgYW55O1xuXG4gIC8vIHN0YW5kYXJkXG4gIDxDIGV4dGVuZHMgSW50ZXJmYWNlPFJlYWN0aXZlRWxlbWVudD4sIFYgZXh0ZW5kcyBBcnJheTxFbGVtZW50Pj4oXG4gICAgdmFsdWU6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj4sXG4gICAgY29udGV4dDogQ2xhc3NBY2Nlc3NvckRlY29yYXRvckNvbnRleHQ8QywgVj5cbiAgKTogQ2xhc3NBY2Nlc3NvckRlY29yYXRvclJlc3VsdDxDLCBWPjtcbn07XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHtAbGlua2NvZGUgcXVlcnlBc3NpZ25lZEVsZW1lbnRzfSBkZWNvcmF0b3IuIEV4dGVuZHMgdGhlXG4gKiBvcHRpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCBpbnRvXG4gKiBbSFRNTFNsb3RFbGVtZW50LmFzc2lnbmVkRWxlbWVudHNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MU2xvdEVsZW1lbnQvYXNzaWduZWRFbGVtZW50cykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlBc3NpZ25lZEVsZW1lbnRzT3B0aW9uc1xuICBleHRlbmRzIFF1ZXJ5QXNzaWduZWROb2Rlc09wdGlvbnMge1xuICAvKipcbiAgICogQ1NTIHNlbGVjdG9yIHVzZWQgdG8gZmlsdGVyIHRoZSBlbGVtZW50cyByZXR1cm5lZC4gRm9yIGV4YW1wbGUsIGEgc2VsZWN0b3JcbiAgICogb2YgYFwiLml0ZW1cImAgd2lsbCBvbmx5IGluY2x1ZGUgZWxlbWVudHMgd2l0aCB0aGUgYGl0ZW1gIGNsYXNzLlxuICAgKi9cbiAgc2VsZWN0b3I/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBjb252ZXJ0cyBhIGNsYXNzIHByb3BlcnR5IGludG8gYSBnZXR0ZXIgdGhhdFxuICogcmV0dXJucyB0aGUgYGFzc2lnbmVkRWxlbWVudHNgIG9mIHRoZSBnaXZlbiBgc2xvdGAuIFByb3ZpZGVzIGEgZGVjbGFyYXRpdmVcbiAqIHdheSB0byB1c2VcbiAqIFtgSFRNTFNsb3RFbGVtZW50LmFzc2lnbmVkRWxlbWVudHNgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTFNsb3RFbGVtZW50L2Fzc2lnbmVkRWxlbWVudHMpLlxuICpcbiAqIENhbiBiZSBwYXNzZWQgYW4gb3B0aW9uYWwge0BsaW5rY29kZSBRdWVyeUFzc2lnbmVkRWxlbWVudHNPcHRpb25zfSBvYmplY3QuXG4gKlxuICogRXhhbXBsZSB1c2FnZTpcbiAqIGBgYHRzXG4gKiBjbGFzcyBNeUVsZW1lbnQge1xuICogICBAcXVlcnlBc3NpZ25lZEVsZW1lbnRzKHsgc2xvdDogJ2xpc3QnIH0pXG4gKiAgIGxpc3RJdGVtcyE6IEFycmF5PEhUTUxFbGVtZW50PjtcbiAqICAgQHF1ZXJ5QXNzaWduZWRFbGVtZW50cygpXG4gKiAgIHVubmFtZWRTbG90RWxzITogQXJyYXk8SFRNTEVsZW1lbnQ+O1xuICpcbiAqICAgcmVuZGVyKCkge1xuICogICAgIHJldHVybiBodG1sYFxuICogICAgICAgPHNsb3QgbmFtZT1cImxpc3RcIj48L3Nsb3Q+XG4gKiAgICAgICA8c2xvdD48L3Nsb3Q+XG4gKiAgICAgYDtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogTm90ZSwgdGhlIHR5cGUgb2YgdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgYW5ub3RhdGVkIGFzIGBBcnJheTxIVE1MRWxlbWVudD5gLlxuICpcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5QXNzaWduZWRFbGVtZW50cyhcbiAgb3B0aW9ucz86IFF1ZXJ5QXNzaWduZWRFbGVtZW50c09wdGlvbnNcbik6IFF1ZXJ5QXNzaWduZWRFbGVtZW50c0RlY29yYXRvciB7XG4gIHJldHVybiAoPFYgZXh0ZW5kcyBBcnJheTxFbGVtZW50Pj4oXG4gICAgb2JqOiBvYmplY3QsXG4gICAgbmFtZTogUHJvcGVydHlLZXkgfCBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dDx1bmtub3duLCB1bmtub3duPlxuICApID0+IHtcbiAgICBjb25zdCB7c2xvdCwgc2VsZWN0b3J9ID0gb3B0aW9ucyA/PyB7fTtcbiAgICBjb25zdCBzbG90U2VsZWN0b3IgPSBgc2xvdCR7c2xvdCA/IGBbbmFtZT0ke3Nsb3R9XWAgOiAnOm5vdChbbmFtZV0pJ31gO1xuICAgIHJldHVybiBkZXNjKG9iaiwgbmFtZSwge1xuICAgICAgZ2V0KHRoaXM6IFJlYWN0aXZlRWxlbWVudCk6IFYge1xuICAgICAgICBjb25zdCBzbG90RWwgPVxuICAgICAgICAgIHRoaXMucmVuZGVyUm9vdD8ucXVlcnlTZWxlY3RvcjxIVE1MU2xvdEVsZW1lbnQ+KHNsb3RTZWxlY3Rvcik7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gc2xvdEVsPy5hc3NpZ25lZEVsZW1lbnRzKG9wdGlvbnMpID8/IFtdO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHNlbGVjdG9yID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gZWxlbWVudHNcbiAgICAgICAgICAgIDogZWxlbWVudHMuZmlsdGVyKChub2RlKSA9PiBub2RlLm1hdGNoZXMoc2VsZWN0b3IpKVxuICAgICAgICApIGFzIFY7XG4gICAgICB9LFxuICAgIH0pO1xuICB9KSBhcyBRdWVyeUFzc2lnbmVkRWxlbWVudHNEZWNvcmF0b3I7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxudHlwZSBVcGRhdGVIYW5kbGVyID0gKHByZXY/OiB1bmtub3duLCBuZXh0PzogdW5rbm93bikgPT4gdm9pZDtcblxudHlwZSBOb25VbmRlZmluZWQ8QT4gPSBBIGV4dGVuZHMgdW5kZWZpbmVkID8gbmV2ZXIgOiBBO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8VCBleHRlbmRzIG9iamVjdD4gPSB7XG4gIFtLIGluIGtleW9mIFRdLT86IE5vblVuZGVmaW5lZDxUW0tdPiBleHRlbmRzIFVwZGF0ZUhhbmRsZXIgPyBLIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG5pbnRlcmZhY2UgV2F0Y2hPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHdpbGwgb25seSBzdGFydCB3YXRjaGluZyBhZnRlciB0aGUgaW5pdGlhbCB1cGRhdGUvcmVuZGVyXG4gICAqL1xuICB3YWl0VW50aWxGaXJzdFVwZGF0ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUnVucyB3aGVuIG9ic2VydmVkIHByb3BlcnRpZXMgY2hhbmdlLCBlLmcuIEBwcm9wZXJ0eSBvciBAc3RhdGUsIGJ1dCBiZWZvcmUgdGhlIGNvbXBvbmVudCB1cGRhdGVzLiBUbyB3YWl0IGZvciBhblxuICogdXBkYXRlIHRvIGNvbXBsZXRlIGFmdGVyIGEgY2hhbmdlIG9jY3VycywgdXNlIGBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlYCBpbiB0aGUgaGFuZGxlci4gVG8gc3RhcnQgd2F0Y2hpbmcgYWZ0ZXIgdGhlXG4gKiBpbml0aWFsIHVwZGF0ZS9yZW5kZXIsIHVzZSBgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9YCBvciBgdGhpcy5oYXNVcGRhdGVkYCBpbiB0aGUgaGFuZGxlci5cbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiBAd2F0Y2goJ3Byb3BOYW1lJylcbiAqIGhhbmRsZVByb3BDaGFuZ2Uob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gKiAgIC4uLlxuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gd2F0Y2gocHJvcGVydHlOYW1lOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3B0aW9ucz86IFdhdGNoT3B0aW9ucykge1xuICBjb25zdCByZXNvbHZlZE9wdGlvbnM6IFJlcXVpcmVkPFdhdGNoT3B0aW9ucz4gPSB7XG4gICAgd2FpdFVudGlsRmlyc3RVcGRhdGU6IGZhbHNlLFxuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgcmV0dXJuIDxFbGVtQ2xhc3MgZXh0ZW5kcyBMaXRFbGVtZW50Pihwcm90bzogRWxlbUNsYXNzLCBkZWNvcmF0ZWRGbk5hbWU6IFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8RWxlbUNsYXNzPikgPT4ge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSB1cGRhdGUgaXMgYSBwcm90ZWN0ZWQgcHJvcGVydHlcbiAgICBjb25zdCB7IHVwZGF0ZSB9ID0gcHJvdG87XG4gICAgY29uc3Qgd2F0Y2hlZFByb3BlcnRpZXMgPSBBcnJheS5pc0FycmF5KHByb3BlcnR5TmFtZSkgPyBwcm9wZXJ0eU5hbWUgOiBbcHJvcGVydHlOYW1lXTtcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSB1cGRhdGUgaXMgYSBwcm90ZWN0ZWQgcHJvcGVydHlcbiAgICBwcm90by51cGRhdGUgPSBmdW5jdGlvbiAodGhpczogRWxlbUNsYXNzLCBjaGFuZ2VkUHJvcHM6IE1hcDxrZXlvZiBFbGVtQ2xhc3MsIEVsZW1DbGFzc1trZXlvZiBFbGVtQ2xhc3NdPikge1xuICAgICAgd2F0Y2hlZFByb3BlcnRpZXMuZm9yRWFjaChwcm9wZXJ0eSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHByb3BlcnR5IGFzIGtleW9mIEVsZW1DbGFzcztcbiAgICAgICAgaWYgKGNoYW5nZWRQcm9wcy5oYXMoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gY2hhbmdlZFByb3BzLmdldChrZXkpO1xuICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICAgICAgaWYgKG9sZFZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFyZXNvbHZlZE9wdGlvbnMud2FpdFVudGlsRmlyc3RVcGRhdGUgfHwgdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICAgICAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHVwZGF0ZS5jYWxsKHRoaXMsIGNoYW5nZWRQcm9wcyk7XG4gICAgfTtcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1Db250ZXh0IHtcbiAgaHJlZj86IHN0cmluZztcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICB2YXJpYWJsZXM6IFJlYWRvbmx5QXJyYXk8VmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXT4+O1xufVxuXG5leHBvcnQgY29uc3QgaXRlbUNvbnRleHRWYXJpYWJsZXMgPSBbXG4gIHtcbiAgICBpZGVudGlmaWVyOiAnY29tcGxldGlvblN0YXR1cycsXG4gICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnLFxuICAgIGJhc2VUeXBlOiAnc3RyaW5nJyxcbiAgICB2YWx1ZTogJ3Vua25vd24nLFxuICAgIHR5cGU6ICdvdXRjb21lJ1xuICB9LFxuICB7XG4gICAgaWRlbnRpZmllcjogJ251bUF0dGVtcHRzJyxcbiAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZScsXG4gICAgYmFzZVR5cGU6ICdpbnRlZ2VyJyxcbiAgICB2YWx1ZTogJzAnLFxuICAgIHR5cGU6ICdyZXNwb25zZSdcbiAgfVxuXSBhcyBWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPltdO1xuXG5leHBvcnQgY29uc3QgaXRlbUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEl0ZW1Db250ZXh0PihTeW1ib2woJ2l0ZW0nKSk7XG4iLCAiaW1wb3J0IHsgcHJvdmlkZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcbmltcG9ydCB0eXBlIHsgSW50ZXJhY3Rpb25DaGFuZ2VkRGV0YWlscywgT3V0Y29tZUNoYW5nZWREZXRhaWxzIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXZlbnQtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBSZXNwb25zZUludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHR5cGUgeyBWYXJpYWJsZURlY2xhcmF0aW9uLCBWYXJpYWJsZVZhbHVlIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IE91dGNvbWVWYXJpYWJsZSwgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgdHlwZSB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjayc7XG5pbXBvcnQgdHlwZSB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB0eXBlIHsgUXRpUmVzcG9uc2VQcm9jZXNzaW5nIH0gZnJvbSAnLi4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dFZhcmlhYmxlcyB9IGZyb20gJy4vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCBRdGlSZWdpc3RlclZhcmlhYmxlIGZyb20gJy4uL2ludGVybmFsL2V2ZW50cy9xdGktcmVnaXN0ZXItdmFyaWFibGUnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBxdGktYXNzZXNzbWVudC1pdGVtIGVsZW1lbnQgY29udGFpbnMgYWxsIHRoZSBvdGhlciBRVEkgMyBpdGVtIHN0cnVjdHVyZXMuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLmRsdG5uajg3bDB5alxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA0LjBcbiAqXG4gKiBAZGVwZW5kZW5jeSBxdGktZmVlZGJhY2tcbiAqIEBkZXBlbmRlbmN5IHF0aS1yZXNwb25zZXByb2Nlc3NpbmdcbiAqXG4gKiBAc2xvdCAtIFRoZSBkZWZhdWx0IHNsb3Qgd2hlcmUgYWxsIHRoZSBvdGhlciBRVEkgMyBpdGVtIHN0cnVjdHVyZXMgZ28uXG4gKlxuICogQGV2ZW50IHF0aS1pbnRlcmFjdGlvbi1jaGFuZ2VkIC0gRW1pdHRlZCB3aGVuIGFuIGludGVyYWN0aW9uIGlzIGNoYW5nZWQuXG4gKiBAZXZlbnQgcXRpLW91dGNvbWUtY2hhbmdlZCAtIEVtaXR0ZWQgd2hlbiBhbiBvdXRjb21lIGhhcyBjaGFuZ2VkLlxuICogQGV2ZW50IHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nIC0gRW1pdHRlZCB3aGVuIHJlc3BvbnNlLXByb2Nlc3NpbmcgaXMgY2FsbGVkLlxuICpcbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKVxuZXhwb3J0IGNsYXNzIFF0aUFzc2Vzc21lbnRJdGVtIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0aXRsZTogc3RyaW5nO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBhZGFwdGl2ZTogJ3RydWUnIHwgJ2ZhbHNlJyA9ICdmYWxzZSc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0aW1lRGVwZW5kZW50OiAndHJ1ZScgfCAnZmFsc2UnIHwgbnVsbCA9IG51bGw7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSBkaXNhYmxlZDogYm9vbGVhbjtcbiAgQHdhdGNoKCdkaXNhYmxlZCcsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZURpc2FibGVkQ2hhbmdlID0gKF86IGJvb2xlYW4sIGRpc2FibGVkOiBib29sZWFuKSA9PiB7XG4gICAgdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5kaXNhYmxlZCA9IGRpc2FibGVkKSk7XG4gIH07XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSByZWFkb25seTogYm9vbGVhbjtcbiAgQHdhdGNoKCdyZWFkb25seScsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZVJlYWRvbmx5Q2hhbmdlID0gKF86IGJvb2xlYW4sIHJlYWRvbmx5OiBib29sZWFuKSA9PlxuICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZm9yRWFjaChjaCA9PiAoY2gucmVhZG9ubHkgPSByZWFkb25seSkpO1xuXG4gIEBwcm92aWRlKHsgY29udGV4dDogaXRlbUNvbnRleHQgfSlcbiAgcHJpdmF0ZSBfY29udGV4dDogSXRlbUNvbnRleHQgPSB7XG4gICAgaWRlbnRpZmllcjogdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSxcbiAgICB2YXJpYWJsZXM6IGl0ZW1Db250ZXh0VmFyaWFibGVzXG4gIH07XG5cbiAgcHVibGljIGdldCB2YXJpYWJsZXMoKTogVmFyaWFibGVWYWx1ZTxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+W10ge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5tYXAodiA9PiAoe1xuICAgICAgaWRlbnRpZmllcjogdi5pZGVudGlmaWVyLFxuICAgICAgdmFsdWU6IHYudmFsdWUsXG4gICAgICB0eXBlOiB2LnR5cGUsXG4gICAgICAvLyBhZGQgZXh0ZXJuYWxzY29yZWQsIGEgZml4ZWQgcHJvcCB0byB0aGUgdGVzdCwgc28gdGhlIHRlc3Rjb250ZXh0IGNhbiByZWFkIGFuZCBkZWNpZGUgaG93IHRvIHNjb3JlIHRoaXMgaXRlbVxuICAgICAgLi4uKHYudHlwZSA9PT0gJ291dGNvbWUnICYmIHYuaWRlbnRpZmllciA9PT0gJ1NDT1JFJ1xuICAgICAgICA/IHsgZXh0ZXJuYWxTY29yZWQ6ICh2IGFzIE91dGNvbWVWYXJpYWJsZSkuZXh0ZXJuYWxTY29yZWQgfVxuICAgICAgICA6IHt9KVxuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFyaWFibGVzKHZhbHVlOiBWYXJpYWJsZVZhbHVlPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD5bXSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUuc29tZSh2ID0+ICEoJ2lkZW50aWZpZXInIGluIHYpKSkge1xuICAgICAgY29uc29sZS53YXJuKCd2YXJpYWJsZXMgcHJvcGVydHkgc2hvdWxkIGJlIGFuIGFycmF5IG9mIFZhcmlhYmxlRGVjbGFyYXRpb24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY29udGV4dCA9IHtcbiAgICAgIC4uLnRoaXMuX2NvbnRleHQsXG4gICAgICB2YXJpYWJsZXM6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLm1hcCh2YXJpYWJsZSA9PiB7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nVmFsdWUgPSB2YWx1ZS5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB2YXJpYWJsZS5pZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKG1hdGNoaW5nVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi52YXJpYWJsZSwgLi4ubWF0Y2hpbmdWYWx1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YXJpYWJsZTtcbiAgICAgIH0pXG4gICAgfTtcblxuICAgIHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdyZXNwb25zZScpIHtcbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb25FbGVtZW50ID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICAgIChlbDogSW50ZXJhY3Rpb24pID0+IGVsLnJlc3BvbnNlSWRlbnRpZmllciA9PT0gdmFyaWFibGUuaWRlbnRpZmllclxuICAgICAgICApO1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb25FbGVtZW50KSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb25FbGVtZW50LnZhbHVlID0gdmFyaWFibGUudmFsdWUgYXMgc3RyaW5nIHwgc3RyaW5nW107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdvdXRjb21lJykge1xuICAgICAgICB0aGlzLl9mZWVkYmFja0VsZW1lbnRzLmZvckVhY2goZmUgPT4gZmUuY2hlY2tTaG93RmVlZGJhY2sodmFyaWFibGUuaWRlbnRpZmllcikpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdGlhbENvbnRleHQ6IFJlYWRvbmx5PEl0ZW1Db250ZXh0PiA9IHsgLi4udGhpcy5fY29udGV4dCwgdmFyaWFibGVzOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcyB9O1xuICBwcml2YXRlIF9mZWVkYmFja0VsZW1lbnRzOiBRdGlGZWVkYmFja1tdID0gW107XG4gIHByaXZhdGUgX2ludGVyYWN0aW9uRWxlbWVudHM6IEludGVyYWN0aW9uW10gPSBbXTtcblxuICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7XG4gICAgdGhpcy5fZW1pdDx7IGRldGFpbDogUXRpQXNzZXNzbWVudEl0ZW0gfT4oJ3F0aS1hc3Nlc3NtZW50LWl0ZW0tY29ubmVjdGVkJywgdGhpcyk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgdXNlIHZhcmlhYmxlcyBwcm9wZXJ0eSBpbnN0ZWFkICovXG4gIHNldCByZXNwb25zZXMobXlSZXNwb25zZXM6IFJlc3BvbnNlSW50ZXJhY3Rpb25bXSkge1xuICAgIGlmIChteVJlc3BvbnNlcykge1xuICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBteVJlc3BvbnNlcykge1xuICAgICAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlID0gdGhpcy5nZXRSZXNwb25zZShyZXNwb25zZS5yZXNwb25zZUlkZW50aWZpZXIpO1xuICAgICAgICBpZiAocmVzcG9uc2VWYXJpYWJsZSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlUmVzcG9uc2VWYXJpYWJsZShyZXNwb25zZS5yZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlLnJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbiB8IHVuZGVmaW5lZCA9IHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZmluZChcbiAgICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgICApO1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICBpbnRlcmFjdGlvbi52YWx1ZSA9IHJlc3BvbnNlLnJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci12YXJpYWJsZScsIChlOiBRdGlSZWdpc3RlclZhcmlhYmxlKSA9PiB7XG4gICAgICB0aGlzLl9jb250ZXh0ID0geyAuLi50aGlzLl9jb250ZXh0LCB2YXJpYWJsZXM6IFsuLi50aGlzLl9jb250ZXh0LnZhcmlhYmxlcywgZS5kZXRhaWwudmFyaWFibGVdIH07XG4gICAgICB0aGlzLl9pbml0aWFsQ29udGV4dCA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWZlZWRiYWNrJywgKGU6IEN1c3RvbUV2ZW50PFF0aUZlZWRiYWNrPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGZlZWRiYWNrRWxlbWVudCA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy5fZmVlZGJhY2tFbGVtZW50cy5wdXNoKGZlZWRiYWNrRWxlbWVudCk7XG4gICAgICBmZWVkYmFja0VsZW1lbnQuY2hlY2tTaG93RmVlZGJhY2soZmVlZGJhY2tFbGVtZW50Lm91dGNvbWVJZGVudGlmaWVyKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIChlOiBDdXN0b21FdmVudDxudWxsPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMucHVzaChlLnRhcmdldCBhcyBJbnRlcmFjdGlvbik7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlbmQtYXR0ZW1wdCcsIChlOiBDdXN0b21FdmVudDx7IHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nOyBjb3VudEF0dGVtcHQ6IGJvb2xlYW4gfT4pID0+IHtcbiAgICAgIGNvbnN0IHsgcmVzcG9uc2VJZGVudGlmaWVyLCBjb3VudEF0dGVtcHQgfSA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgJ3RydWUnKTtcbiAgICAgIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKGNvdW50QXR0ZW1wdCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAvLyB3b3JkdCBhYW5nZXJvZXBlbiB2YW51aXQgZGUgcHJvY2Vzc2luZ3RlbXBsYXRlXG4gICAgICAncXRpLXNldC1vdXRjb21lLXZhbHVlJyxcbiAgICAgIChlOiBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PikgPT4ge1xuICAgICAgICBjb25zdCB7IG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSB9ID0gZS5kZXRhaWw7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywgdGhpcy5oYW5kbGVVcGRhdGVSZXNwb25zZVZhcmlhYmxlKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q29ycmVjdFJlc3BvbnNlKHNob3c6IGJvb2xlYW4pIHtcbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlcyA9IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbHRlcihcbiAgICAgICh2YXJpOiBSZXNwb25zZVZhcmlhYmxlIHwgT3V0Y29tZVZhcmlhYmxlKSA9PiAnY29ycmVjdFJlc3BvbnNlJyBpbiB2YXJpICYmIHZhcmkuY29ycmVjdFJlc3BvbnNlXG4gICAgKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgY29uc3QgcmVzcG9uc2VzID0gcmVzcG9uc2VWYXJpYWJsZXMubWFwKGNyID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogY3IuaWRlbnRpZmllcixcbiAgICAgICAgcmVzcG9uc2U6IGNyLmNvcnJlY3RSZXNwb25zZVxuICAgICAgfTtcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuICAgICAgY29uc3QgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgKTtcbiAgICAgIGlmIChpbnRlcmFjdGlvbikge1xuICAgICAgICBpbnRlcmFjdGlvbi5jb3JyZWN0UmVzcG9uc2UgPSBzaG93ID8gcmVzcG9uc2UucmVzcG9uc2UgOiAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJvY2Vzc1Jlc3BvbnNlKGNvdW50TnVtQXR0ZW1wdHM6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzcG9uc2VQcm9jZXNzb3IgPSB0aGlzLnF1ZXJ5U2VsZWN0b3I8UXRpUmVzcG9uc2VQcm9jZXNzaW5nPigncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnKTtcbiAgICBpZiAoIXJlc3BvbnNlUHJvY2Vzc29yKSB7XG4gICAgICAvLyBjb25zb2xlLmluZm8oJ0NsaWVudCBzaWRlIHJlc3BvbnNlIHByb2Nlc3NpbmcgdGVtcGxhdGUgbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2VQcm9jZXNzb3IucHJvY2Vzcykge1xuICAgICAgLy8gY29uc29sZS5pbmZvKCdDbGllbnQgc2lkZSByZXNwb25zZSB3ZWJjb21wb25lbnRzIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXNwb25zZVByb2Nlc3Nvci5wcm9jZXNzKCk7XG5cbiAgICBpZiAodGhpcy5hZGFwdGl2ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgLy8gaWYgYWRhcHRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50TnVtQXR0ZW1wdHMpIHtcbiAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKFxuICAgICAgICAnbnVtQXR0ZW1wdHMnLFxuICAgICAgICAoK3RoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09ICdudW1BdHRlbXB0cycpPy52YWx1ZSArIDEpLnRvU3RyaW5nKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fZW1pdCgncXRpLXJlc3BvbnNlLXByb2Nlc3NlZCcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHJlc2V0UmVzcG9uc2VzKCkge1xuICAgIHRoaXMuX2NvbnRleHQgPSB0aGlzLl9pbml0aWFsQ29udGV4dDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXNwb25zZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxSZXNwb25zZVZhcmlhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGUoaWRlbnRpZmllcikgYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPdXRjb21lKGlkZW50aWZpZXI6IHN0cmluZyk6IFJlYWRvbmx5PE91dGNvbWVWYXJpYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpIGFzIE91dGNvbWVWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgfVxuXG4gIC8vIHNhdmluZyBwcml2YXRlcyBoZXJlOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIGhhbmRsZVVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoZXZlbnQ6IEN1c3RvbUV2ZW50PFJlc3BvbnNlSW50ZXJhY3Rpb24+KSB7XG4gICAgY29uc3QgeyByZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlIH0gPSBldmVudC5kZXRhaWw7XG4gICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoaWRlbnRpZmllcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4gKHYuaWRlbnRpZmllciAhPT0gaWRlbnRpZmllciA/IHYgOiB7IC4uLnYsIHZhbHVlOiB2YWx1ZSB9KSlcbiAgICB9O1xuXG4gICAgdGhpcy5fZW1pdDxJbnRlcmFjdGlvbkNoYW5nZWREZXRhaWxzPigncXRpLWludGVyYWN0aW9uLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZUlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWVcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmFkYXB0aXZlID09PSAnZmFsc2UnKSB7XG4gICAgICAvLyBpZiBhZGFwYXRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZU91dGNvbWVWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZSA9IHRoaXMuZ2V0T3V0Y29tZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghb3V0Y29tZVZhcmlhYmxlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENhbiBub3Qgc2V0IHF0aS1vdXRjb21lLWlkZW50aWZpZXI6ICR7aWRlbnRpZmllcn0sIGl0IGlzIG5vdCBhdmFpbGFibGVgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4ge1xuICAgICAgICBpZiAodi5pZGVudGlmaWVyICE9PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi52LFxuICAgICAgICAgIHZhbHVlOiBvdXRjb21lVmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnID8gdmFsdWUgOiBbLi4udi52YWx1ZSwgdmFsdWUgYXMgc3RyaW5nXVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9O1xuICAgIHRoaXMuX2ZlZWRiYWNrRWxlbWVudHMuZm9yRWFjaChmZSA9PiBmZS5jaGVja1Nob3dGZWVkYmFjayhpZGVudGlmaWVyKSk7XG5cbiAgICB0aGlzLl9lbWl0PE91dGNvbWVDaGFuZ2VkRGV0YWlscz4oJ3F0aS1vdXRjb21lLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICBvdXRjb21lSWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgIHZhbHVlOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKT8udmFsdWVcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbXBsZXRpb25TdGF0dXMoKTogJ2NvbXBsZXRlZCcgfCAnaW5jb21wbGV0ZScgfCAnbm90X2F0dGVtcHRlZCcgfCAndW5rbm93bicge1xuICAgIGlmICh0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmV2ZXJ5KGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnY29tcGxldGVkJztcbiAgICBpZiAodGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5zb21lKGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnaW5jb21wbGV0ZSc7XG4gICAgcmV0dXJuICdub3RfYXR0ZW1wdGVkJztcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXQ8VD4obmFtZSwgZGV0YWlsID0gbnVsbCkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxUPihuYW1lLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzZXNzbWVudC1pdGVtJzogUXRpQXNzZXNzbWVudEl0ZW07XG4gIH1cbn1cbiIsICJjb25zdCB4bWwgPSBTdHJpbmcucmF3O1xuXG4vKiAgIDwhLS0gY29udmVydCBDREFUQSB0byBjb21tZW50cyAtLT5cbiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cInRleHQoKVtjb250YWlucyguLCAnQ0RBVEEnKV1cIj5cbiAgPHhzbDpjb21tZW50PlxuICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PVwiLlwiLz5cbiAgPC94c2w6Y29tbWVudD5cbjwveHNsOnRlbXBsYXRlPlxuKi9cblxuLypcbiAgPCEtLSByZW1vdmUgeG1sIGNvbW1lbnRzIC0tPlxuICA8eHNsOnRlbXBsYXRlIG1hdGNoPVwiY29tbWVudCgpXCIgLz5cbiAgKi9cblxuY29uc3QgeG1sVG9IVE1MID0geG1sYDx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPVwiMS4wXCIgeG1sbnM6eHNsPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtXCI+XG48eHNsOm91dHB1dCBtZXRob2Q9XCJodG1sXCIgdmVyc2lvbj1cIjUuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBpbmRlbnQ9XCJ5ZXNcIiAvPlxuICA8eHNsOnRlbXBsYXRlIG1hdGNoPVwiQCp8bm9kZSgpXCI+XG4gICAgPHhzbDpjb3B5PlxuICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PVwiQCp8bm9kZSgpXCIvPlxuICAgIDwveHNsOmNvcHk+XG4gIDwveHNsOnRlbXBsYXRlPlxuXG4gIDwhLS0gcmVtb3ZlIGV4aXN0aW5nIG5hbWVzcGFjZXMgLS0+XG4gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9XCIqXCI+XG4gICAgPCEtLSByZW1vdmUgZWxlbWVudCBwcmVmaXggLS0+XG4gICAgPHhzbDplbGVtZW50IG5hbWU9XCJ7bG9jYWwtbmFtZSgpfVwiPlxuICAgICAgPCEtLSBwcm9jZXNzIGF0dHJpYnV0ZXMgLS0+XG4gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD1cIkAqXCI+XG4gICAgICAgIDwhLS0gcmVtb3ZlIGF0dHJpYnV0ZSBwcmVmaXggLS0+XG4gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9XCJ7bG9jYWwtbmFtZSgpfVwiPlxuICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PVwiLlwiLz5cbiAgICAgICAgPC94c2w6YXR0cmlidXRlPlxuICAgICAgPC94c2w6Zm9yLWVhY2g+XG4gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPlxuICA8L3hzbDplbGVtZW50PlxuPC94c2w6dGVtcGxhdGU+XG48L3hzbDpzdHlsZXNoZWV0PmA7XG5cbi8vIEZ1bmN0aW9uIHRvIGV4dGVuZCBlbGVtZW50cyB3aXRoIGEgc3BlY2lmaWMgdGFnIG5hbWUgYnkgYWRkaW5nIGFuIGV4dGVuc2lvbiBzdWZmaXhcbmV4cG9ydCBmdW5jdGlvbiBleHRlbmRFbGVtZW50TmFtZSh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQsIHRhZ05hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpIHtcbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCh0YWdOYW1lKS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IG5ld1RhZ05hbWUgPSBgJHt0YWdOYW1lfS0ke2V4dGVuc2lvbn1gO1xuICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50V2l0aE5ld1RhZ05hbWUoZWxlbWVudCwgbmV3VGFnTmFtZSk7XG4gICAgZWxlbWVudC5yZXBsYWNlV2l0aChuZXdFbGVtZW50KTtcbiAgfSk7XG59XG5cbi8vIEZ1bmN0aW9uIHRvIGV4dGVuZCBhbnkgZWxlbWVudCB3aXRoIGEgc3BlY2lmaWMgY2xhc3MgcGF0dGVybiAoZS5nLiwgXCJleHRlbmQ6c3VmZml4XCIpXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3MoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50LCBjbGFzc05hbWVQYXR0ZXJuOiBzdHJpbmcpIHtcbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnKicpLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgY29uc3QgY2xhc3NMaXN0ID0gZWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgaWYgKGNsYXNzTGlzdCkge1xuICAgICAgY2xhc3NMaXN0LmZvckVhY2goY2xhc3NOYW1lID0+IHtcbiAgICAgICAgaWYgKGNsYXNzTmFtZS5zdGFydHNXaXRoKGAke2NsYXNzTmFtZVBhdHRlcm59OmApKSB7XG4gICAgICAgICAgY29uc3Qgc3VmZml4ID0gY2xhc3NOYW1lLnNsaWNlKGAke2NsYXNzTmFtZVBhdHRlcm59OmAubGVuZ3RoKTtcbiAgICAgICAgICBjb25zdCBuZXdUYWdOYW1lID0gYCR7ZWxlbWVudC5ub2RlTmFtZX0tJHtzdWZmaXh9YDtcbiAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudFdpdGhOZXdUYWdOYW1lKGVsZW1lbnQsIG5ld1RhZ05hbWUpO1xuICAgICAgICAgIGVsZW1lbnQucmVwbGFjZVdpdGgobmV3RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgZWxlbWVudCB3aXRoIGEgbmV3IHRhZyBuYW1lIGFuZCBjb3B5IGF0dHJpYnV0ZXMgYW5kIGNoaWxkcmVuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50V2l0aE5ld1RhZ05hbWUoZWxlbWVudCwgbmV3VGFnTmFtZSkge1xuICBjb25zdCBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuZXdUYWdOYW1lKTtcbiAgLy8gQ29weSBhdHRyaWJ1dGVzXG4gIGZvciAoY29uc3QgYXR0ciBvZiBlbGVtZW50LmF0dHJpYnV0ZXMpIHtcbiAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpO1xuICB9XG4gIC8vIENvcHkgY2hpbGQgbm9kZXNcbiAgd2hpbGUgKGVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTtcbiAgfVxuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGl0ZW1zRnJvbVRlc3QoeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpIHtcbiAgY29uc3QgaXRlbXM6IHsgaWRlbnRpZmllcjogc3RyaW5nOyBocmVmOiBzdHJpbmc7IGNhdGVnb3J5OiBzdHJpbmcgfVtdID0gW107XG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0tcmVmJykuZm9yRWFjaChlbCA9PiB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IGVsLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgIGNvbnN0IGhyZWYgPSBlbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICBjb25zdCBjYXRlZ29yeSA9IGVsLmdldEF0dHJpYnV0ZSgnY2F0ZWdvcnknKTtcbiAgICBpdGVtcy5wdXNoKHsgaWRlbnRpZmllciwgaHJlZiwgY2F0ZWdvcnkgfSk7XG4gIH0pO1xuICByZXR1cm4gaXRlbXM7XG59XG5cbmxldCBjdXJyZW50UmVxdWVzdDogWE1MSHR0cFJlcXVlc3QgfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRYTUwodXJsLCBjYW5jZWxQcmV2aW91c1JlcXVlc3QgPSBmYWxzZSkge1xuICBpZiAoY2FuY2VsUHJldmlvdXNSZXF1ZXN0ICYmIGN1cnJlbnRSZXF1ZXN0ICE9PSBudWxsKSB7XG4gICAgY3VycmVudFJlcXVlc3QuYWJvcnQoKTsgLy8gQWJvcnQgdGhlIG9uZ29pbmcgcmVxdWVzdCBpZiB0aGVyZSBpcyBvbmVcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxYTUxEb2N1bWVudCB8IG51bGw+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICBjdXJyZW50UmVxdWVzdCA9IHhocjsgLy8gU3RvcmUgdGhlIGN1cnJlbnQgcmVxdWVzdFxuXG4gICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7XG4gICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdkb2N1bWVudCc7XG5cbiAgICB4aHIub25sb2FkID0gKCkgPT4ge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDApIHtcbiAgICAgICAgcmVzb2x2ZSh4aHIucmVzcG9uc2VYTUwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgeGhyLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgIH07XG5cbiAgICB4aHIuc2VuZCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlWE1MKHhtbERvY3VtZW50OiBzdHJpbmcpIHtcbiAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICBjb25zdCB4bWxGcmFnbWVudCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoeG1sRG9jdW1lbnQsICd0ZXh0L3htbCcpO1xuICByZXR1cm4geG1sRnJhZ21lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0hUTUwoeG1sRnJhZ21lbnQ6IERvY3VtZW50KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gIGNvbnN0IHByb2Nlc3NvciA9IG5ldyBYU0xUUHJvY2Vzc29yKCk7XG4gIGNvbnN0IHhzbHREb2N1bWVudCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoeG1sVG9IVE1MLCAndGV4dC94bWwnKTtcbiAgcHJvY2Vzc29yLmltcG9ydFN0eWxlc2hlZXQoeHNsdERvY3VtZW50KTtcbiAgY29uc3QgaXRlbUhUTUxGcmFnbWVudCA9IHByb2Nlc3Nvci50cmFuc2Zvcm1Ub0ZyYWdtZW50KHhtbEZyYWdtZW50LCBkb2N1bWVudCk7XG4gIHJldHVybiBpdGVtSFRNTEZyYWdtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0TG9jYXRpb24oeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQsIGxvY2F0aW9uOiBzdHJpbmcpIHtcbiAgaWYgKCFsb2NhdGlvbi5lbmRzV2l0aCgnLycpKSB7XG4gICAgbG9jYXRpb24gKz0gJy8nO1xuICB9XG5cbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NyY10sW2hyZWZdLFtwcmltYXJ5LXBhdGhdJykuZm9yRWFjaChlbFdpdGhTcmMgPT4ge1xuICAgIGxldCBhdHRyOiAnc3JjJyB8ICdocmVmJyB8ICdwcmltYXJ5LXBhdGgnIHwgJycgPSAnJztcblxuICAgIGlmIChlbFdpdGhTcmMuZ2V0QXR0cmlidXRlKCdzcmMnKSkge1xuICAgICAgYXR0ciA9ICdzcmMnO1xuICAgIH1cbiAgICBpZiAoZWxXaXRoU3JjLmdldEF0dHJpYnV0ZSgnaHJlZicpKSB7XG4gICAgICBhdHRyID0gJ2hyZWYnO1xuICAgIH1cbiAgICBpZiAoZWxXaXRoU3JjLmdldEF0dHJpYnV0ZSgncHJpbWFyeS1wYXRoJykpIHtcbiAgICAgIGF0dHIgPSAncHJpbWFyeS1wYXRoJztcbiAgICB9XG4gICAgY29uc3QgYXR0clZhbHVlID0gZWxXaXRoU3JjLmdldEF0dHJpYnV0ZShhdHRyKT8udHJpbSgpO1xuXG4gICAgaWYgKCFhdHRyVmFsdWUuc3RhcnRzV2l0aCgnZGF0YTonKSAmJiAhYXR0clZhbHVlLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgY29uc3QgbmV3U3JjVmFsdWUgPSBsb2NhdGlvbiArIGVuY29kZVVSSShhdHRyVmFsdWUpO1xuICAgICAgZWxXaXRoU3JjLnNldEF0dHJpYnV0ZShhdHRyLCBuZXdTcmNWYWx1ZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRDREFUQXRvQ29tbWVudCh4bWxGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCkge1xuICBjb25zdCBjZGF0YUVsZW1lbnRzID0geG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgncXRpLWN1c3RvbS1vcGVyYXRvcltjbGFzcz1cImpzLm9yZ1wiXSA+IHF0aS1iYXNlLXZhbHVlJyk7XG4gIGNkYXRhRWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBjb25zdCBjb21tZW50VGV4dCA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoZWxlbWVudC50ZXh0Q29udGVudCk7XG4gICAgZWxlbWVudC5yZXBsYWNlQ2hpbGQoY29tbWVudFRleHQsIGVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBTdHlsZVNoZWV0cyh4bWxGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCkge1xuICAvLyByZW1vdmUgcXRpLXN0eWxlc2hlZXQgdGFnXG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zdHlsZXNoZWV0JykuZm9yRWFjaChzdHlsZXNoZWV0ID0+IHN0eWxlc2hlZXQucmVtb3ZlKCkpO1xufVxuIiwgIi8qKlxuICogQnJvd3NlciBiYXNlZCBRVEktWE1MIHRvIEhUTUwgdHJhbnNmb3JtZXIuXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIG1ldGhvZHMgdG8gbG9hZCwgcGFyc2UsIHRyYW5zZm9ybSBhbmQgc2VyaWFsaXplIFFUSSBYTUwgaXRlbXMuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIGxvYWQsIHBhcnNlLCB0cmFuc2Zvcm0gYW5kIHNlcmlhbGl6ZSBRVEkgWE1MIGl0ZW1zLlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHF0aVRyYW5zZm9ybWVyID0gcXRpVHJhbnNmb3JtSXRlbSgpO1xuICogYXdhaXQgcXRpVHJhbnNmb3JtZXIubG9hZCgncGF0aC90by94bWwvZmlsZS54bWwnKTtcbiAqIHF0aVRyYW5zZm9ybWVyLnBhdGgoJy9hc3Nlc3NtZW50SXRlbS9pdGVtQm9keScpO1xuICogY29uc3QgaHRtbCA9IHF0aVRyYW5zZm9ybWVyLmh0bWwoKTtcbiAqIGNvbnN0IHhtbCA9IHF0aVRyYW5zZm9ybWVyLnhtbCgpO1xuICogY29uc3QgaHRtbGRvYyA9IHF0aVRyYW5zZm9ybWVyLmh0bWxkb2MoKTtcbiAqIGNvbnN0IHhtbGRvYyA9IHF0aVRyYW5zZm9ybWVyLnhtbGRvYygpO1xuICpcbiAqIHF0aVRyYW5zZm9ybUl0ZW0oKS5wYXJzZShzdG9yeVhNTCkuaHRtbCgpXG4gKi9cblxuaW1wb3J0IHtcbiAgY29udmVydENEQVRBdG9Db21tZW50LFxuICBleHRlbmRFbGVtZW50TmFtZSxcbiAgZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3MsXG4gIGxvYWRYTUwsXG4gIHBhcnNlWE1MLFxuICBzZXRMb2NhdGlvbixcbiAgc3RyaXBTdHlsZVNoZWV0cyxcbiAgdG9IVE1MXG59IGZyb20gJy4vcXRpLXRyYW5zZm9ybWVycyc7XG5cbmV4cG9ydCB0eXBlIHRyYW5zZm9ybUl0ZW1BcGkgPSB7XG4gIGxvYWQ6ICh1cmk6IHN0cmluZywgY2FuY2VsUHJldmlvdXNSZXF1ZXN0PzogYm9vbGVhbikgPT4gUHJvbWlzZTx0cmFuc2Zvcm1JdGVtQXBpPjtcbiAgcGFyc2U6ICh4bWxTdHJpbmc6IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgcGF0aDogKGxvY2F0aW9uOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGZuOiAoZm46ICh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQpID0+IHZvaWQpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIHBjaUhvb2tzOiAodXJpOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGV4dGVuZEVsZW1lbnROYW1lOiAoZWxlbWVudE5hbWU6IHN0cmluZywgZXh0ZW5kOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzOiAocGFyYW0/OiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGN1c3RvbUludGVyYWN0aW9uOiAoYmFzZVJlZjogc3RyaW5nLCBiYXNlSXRlbTogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQ6ICgpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIHN0cmlwU3R5bGVTaGVldHM6ICgpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGh0bWw6ICgpID0+IHN0cmluZztcbiAgeG1sOiAoKSA9PiBzdHJpbmc7XG4gIGh0bWxEb2M6ICgpID0+IERvY3VtZW50RnJhZ21lbnQ7XG4gIHhtbERvYzogKCkgPT4gWE1MRG9jdW1lbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgcXRpVHJhbnNmb3JtSXRlbSA9ICgpID0+IHtcbiAgbGV0IHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudDtcblxuICBjb25zdCBhcGk6IHRyYW5zZm9ybUl0ZW1BcGkgPSB7XG4gICAgYXN5bmMgbG9hZCh1cmk6IHN0cmluZywgY2FuY2VsUHJldmlvdXNSZXF1ZXN0ID0gZmFsc2UpOiBQcm9taXNlPHR5cGVvZiBhcGk+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx0eXBlb2YgYXBpPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxvYWRYTUwodXJpLCBjYW5jZWxQcmV2aW91c1JlcXVlc3QpLnRoZW4oeG1sID0+IHtcbiAgICAgICAgICB4bWxGcmFnbWVudCA9IHhtbDtcbiAgICAgICAgICAvLyBzZXQgdGhlIGJhc2UgcGF0aCBmb3IgaW1hZ2VzIGFuZCBvdGhlciByZXNvdXJjZXMsXG4gICAgICAgICAgLy8geW91IHByb2JhYmx5IHdhbnQgdG8gc2V0IHRoZSBiYXNlIHBhdGggdG8gdGhlIGRvY3VtZW50IHJvb3QgZWxzZSB5b3UgY2FuIHVzZSB0aGUgcGF0aCBtZXRob2QgdG8gc2V0IGl0XG4gICAgICAgICAgYXBpLnBhdGgodXJpLnN1YnN0cmluZygwLCB1cmkubGFzdEluZGV4T2YoJy8nKSkpO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKGFwaSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBwYXJzZSh4bWxTdHJpbmc6IHN0cmluZyk6IHR5cGVvZiBhcGkge1xuICAgICAgeG1sRnJhZ21lbnQgPSBwYXJzZVhNTCh4bWxTdHJpbmcpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIHBhdGg6IChsb2NhdGlvbjogc3RyaW5nKTogdHlwZW9mIGFwaSA9PiB7XG4gICAgICBzZXRMb2NhdGlvbih4bWxGcmFnbWVudCwgbG9jYXRpb24pO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGZuKGZuOiAoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50KSA9PiB2b2lkKTogdHlwZW9mIGFwaSB7XG4gICAgICBmbih4bWxGcmFnbWVudCk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgcGNpSG9va3ModXJpOiBzdHJpbmcpOiB0eXBlb2YgYXBpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbJ2hvb2snLCAnbW9kdWxlJ107XG4gICAgICBjb25zdCBkb2N1bWVudFBhdGggPSB1cmkuc3Vic3RyaW5nKDAsIHVyaS5sYXN0SW5kZXhPZignLycpKTtcbiAgICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgY29uc3Qgc3JjQXR0cmlidXRlcyA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1snICsgYXR0cmlidXRlICsgJ10nKTtcbiAgICAgICAgc3JjQXR0cmlidXRlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgIGNvbnN0IHNyY1ZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKSE7XG4gICAgICAgICAgaWYgKCFzcmNWYWx1ZS5zdGFydHNXaXRoKCdkYXRhOicpICYmICFzcmNWYWx1ZS5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgICAgIC8vIEp1c3QgcGFzdGUgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHNyYyBsb2NhdGlvbiBhZnRlciB0aGUgZG9jdW1lbnRyb290UGF0aFxuICAgICAgICAgICAgLy8gb2xkIHBjaXMgY2FuIGhhdmUgYSAuanMsIG5ldyBwY2kncyBkb24ndFxuICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ2Jhc2UtdXJsJywgdXJpKTtcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAnbW9kdWxlJyxcbiAgICAgICAgICAgICAgZG9jdW1lbnRQYXRoICsgJy8nICsgZW5jb2RlVVJJKHNyY1ZhbHVlICsgKHNyY1ZhbHVlLmVuZHNXaXRoKCcuanMnKSA/ICcnIDogJy5qcycpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGV4dGVuZEVsZW1lbnROYW1lOiAodGFnTmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHR5cGVvZiBhcGkgPT4ge1xuICAgICAgZXh0ZW5kRWxlbWVudE5hbWUoeG1sRnJhZ21lbnQsIHRhZ05hbWUsIGV4dGVuc2lvbik7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3M6IChwYXJhbTogc3RyaW5nID0gJ2V4dGVuZCcpOiB0eXBlb2YgYXBpID0+IHtcbiAgICAgIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzKHhtbEZyYWdtZW50LCBwYXJhbSk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgY3VzdG9tSW50ZXJhY3Rpb24oYmFzZVJlZjogc3RyaW5nLCBiYXNlSXRlbTogc3RyaW5nKTogdHlwZW9mIGFwaSB7XG4gICAgICBjb25zdCBxdGlDdXN0b21JbnRlcmFjdGlvbiA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nKTtcbiAgICAgIGNvbnN0IHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0ID0gcXRpQ3VzdG9tSW50ZXJhY3Rpb24ucXVlcnlTZWxlY3Rvcignb2JqZWN0Jyk7XG5cbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnZGF0YS1iYXNlLXJlZicsIGJhc2VSZWYpO1xuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCdkYXRhLWJhc2UtaXRlbScsIGJhc2VSZWYgKyBiYXNlSXRlbSk7XG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEnLCBxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdC5nZXRBdHRyaWJ1dGUoJ2RhdGEnKSk7XG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgcXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QuZ2V0QXR0cmlidXRlKCd3aWR0aCcpKTtcbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgcXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKSk7XG5cbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnJlbW92ZUNoaWxkKHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0KTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQoKTogdHlwZW9mIGFwaSB7XG4gICAgICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQoeG1sRnJhZ21lbnQpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIHN0cmlwU3R5bGVTaGVldHMoKTogdHlwZW9mIGFwaSB7XG4gICAgICBzdHJpcFN0eWxlU2hlZXRzKHhtbEZyYWdtZW50KTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBodG1sKCkge1xuICAgICAgcmV0dXJuIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcodG9IVE1MKHhtbEZyYWdtZW50KSk7XG4gICAgfSxcbiAgICB4bWwoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHhtbEZyYWdtZW50KTtcbiAgICB9LFxuICAgIGh0bWxEb2MoKSB7XG4gICAgICByZXR1cm4gdG9IVE1MKHhtbEZyYWdtZW50KTtcbiAgICB9LFxuICAgIHhtbERvYygpOiBYTUxEb2N1bWVudCB7XG4gICAgICByZXR1cm4geG1sRnJhZ21lbnQ7IC8vIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoeG1sRnJhZ21lbnQpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGFwaTtcbn07XG4iLCAiaW1wb3J0IHsgbG9hZFhNTCwgcGFyc2VYTUwgfSBmcm9tIFwiLi9xdGktdHJhbnNmb3JtZXJzXCI7XG5cbmV4cG9ydCBjb25zdCBxdGlUcmFuc2Zvcm1NYW5pZmVzdCA9ICgpOiB7XG4gICAgbG9hZDogKHVyaTogc3RyaW5nKSA9PiBQcm9taXNlPHR5cGVvZiBhcGk+O1xuICAgIGFzc2Vzc21lbnRUZXN0OiAoKSA9PiB7IGhyZWY6IHN0cmluZzsgaWRlbnRpZmllcjogc3RyaW5nIH07XG4gIH0gPT4ge1xuICAgIGxldCB4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQ7XG4gIFxuICAgIGNvbnN0IGFwaSA9IHtcbiAgICAgIGFzeW5jIGxvYWQodXJpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx0eXBlb2YgYXBpPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgbG9hZFhNTCh1cmkpLnRoZW4oeG1sID0+IHtcbiAgICAgICAgICAgIHhtbEZyYWdtZW50ID0geG1sO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoYXBpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcGFyc2UoeG1sU3RyaW5nOiBzdHJpbmcpIHtcbiAgICAgICAgeG1sRnJhZ21lbnQgPSBwYXJzZVhNTCh4bWxTdHJpbmcpO1xuICAgICAgfSxcbiAgICAgIGFzc2Vzc21lbnRUZXN0KCkge1xuICAgICAgICBjb25zdCBlbCA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Jlc291cmNlW3R5cGU9XCJpbXNxdGlfdGVzdF94bWx2M3AwXCJdJyk7XG4gICAgICAgIHJldHVybiB7IGhyZWY6IGVsLmdldEF0dHJpYnV0ZSgnaHJlZicpLCBpZGVudGlmaWVyOiBlbC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGFwaTtcbiAgfTsiLCAiXG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBsb2FkLCBwYXJzZSBhbmQgdHJhbnNmb3JtIFFUSSB0ZXN0cy5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIG1ldGhvZHMgdG8gbG9hZCwgcGFyc2UgYW5kIHRyYW5zZm9ybSBRVEkgdGVzdHMuXG4gKiBAZXhhbXBsZVxuICogY29uc3QgcXRpVHJhbnNmb3JtZXIgPSBxdGlUcmFuc2Zvcm1UZXN0KCk7XG4gKiBhd2FpdCBxdGlUcmFuc2Zvcm1lci5sb2FkKCdodHRwczovL2V4YW1wbGUuY29tL3Rlc3QueG1sJyk7XG4gKiBjb25zdCBpdGVtcyA9IHF0aVRyYW5zZm9ybWVyLml0ZW1zKCk7XG4gKiBjb25zdCBodG1sID0gcXRpVHJhbnNmb3JtZXIuaHRtbCgpO1xuICogY29uc3QgeG1sID0gcXRpVHJhbnNmb3JtZXIueG1sKCk7XG4gKi9cblxuaW1wb3J0IHsgaXRlbXNGcm9tVGVzdCwgbG9hZFhNTCwgcGFyc2VYTUwsIHRvSFRNTCB9IGZyb20gXCIuL3F0aS10cmFuc2Zvcm1lcnNcIjtcblxuZXhwb3J0IHR5cGUgdHJhbnNmb3JtVGVzdEFwaSA9IHtcbiAgICBsb2FkOiAodXJpOiBzdHJpbmcpID0+IFByb21pc2U8dHJhbnNmb3JtVGVzdEFwaT47XG4gICAgcGFyc2U6ICh4bWxTdHJpbmc6IHN0cmluZykgPT4gdHJhbnNmb3JtVGVzdEFwaTtcbiAgICBmbjogKGZuOiAoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50KSA9PiB2b2lkKSA9PiB0cmFuc2Zvcm1UZXN0QXBpO1xuICAgIGl0ZW1zOiAoKSA9PiB7IGlkZW50aWZpZXI6IHN0cmluZzsgaHJlZjogc3RyaW5nOyBjYXRlZ29yeTogc3RyaW5nIH1bXTtcbiAgICBodG1sOiAoKSA9PiBzdHJpbmc7XG4gICAgeG1sOiAoKSA9PiBzdHJpbmc7XG4gICAgaHRtbERvYzogKCkgPT4gRG9jdW1lbnRGcmFnbWVudDtcbiAgICB4bWxEb2M6ICgpID0+IFhNTERvY3VtZW50O1xuICB9XG4gIFxuICBleHBvcnQgY29uc3QgcXRpVHJhbnNmb3JtVGVzdCA9ICgpOiB0cmFuc2Zvcm1UZXN0QXBpID0+IHtcbiAgICBsZXQgeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50O1xuICBcbiAgICBjb25zdCBhcGk6dHJhbnNmb3JtVGVzdEFwaSA9IHtcbiAgICAgIGFzeW5jIGxvYWQodXJpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx0cmFuc2Zvcm1UZXN0QXBpPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgbG9hZFhNTCh1cmkpLnRoZW4oeG1sID0+IHtcbiAgICAgICAgICAgIHhtbEZyYWdtZW50ID0geG1sO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoYXBpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcGFyc2UoeG1sU3RyaW5nOiBzdHJpbmcpIHtcbiAgICAgICAgeG1sRnJhZ21lbnQgPSBwYXJzZVhNTCh4bWxTdHJpbmcpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcbiAgICAgIGZuKGZuOiAoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHhtbEZyYWdtZW50KTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG4gICAgICBpdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1zRnJvbVRlc3QoeG1sRnJhZ21lbnQpO1xuICAgICAgfSxcbiAgICAgIGh0bWwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHRvSFRNTCh4bWxGcmFnbWVudCkpO1xuICAgICAgfSxcbiAgICAgIHhtbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh4bWxGcmFnbWVudCk7XG4gICAgICB9LFxuICAgICAgaHRtbERvYygpIHtcbiAgICAgICAgcmV0dXJuIHRvSFRNTCh4bWxGcmFnbWVudCk7XG4gICAgICB9LFxuICAgICAgeG1sRG9jKCk6IFhNTERvY3VtZW50IHtcbiAgICAgICAgcmV0dXJuIHhtbEZyYWdtZW50O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGFwaTtcbiAgfTsiLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHF0aVRyYW5zZm9ybUl0ZW0gfSBmcm9tICcuLi8uLi9xdGktdHJhbnNmb3JtZXJzJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY3VzdG9tIGVsZW1lbnQgZm9yIHJlZmVyZW5jaW5nIGFuIGFzc2Vzc21lbnQgc3RpbXVsdXMuXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnKVxuZXhwb3J0IGNsYXNzIFF0aUFzc2Vzc21lbnRTdGltdWx1c1JlZiBleHRlbmRzIExpdEVsZW1lbnQge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHN0aW11bHVzLlxuICAgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXIgPSAnJztcblxuICAvKipcbiAgICogVGhlIGhyZWYgb2YgdGhlIHN0aW11bHVzLlxuICAgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGhyZWYgPSAnJztcblxuICAvKipcbiAgICogTGlmZWN5Y2xlIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlIERPTS5cbiAgICogTG9hZHMgYW5kIGFwcGVuZHMgdGhlIHN0aW11bHVzIGlmIHRoZSAncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLWNvbm5lY3RlZCcgZXZlbnQgaXMgbm90IHByZXZlbnRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi1jb25uZWN0ZWQnLCB7IGNhbmNlbGFibGU6IHRydWUsIGJ1YmJsZXM6IHRydWUgfSk7XG4gICAgY29uc3QgaXNQcmV2ZW50ZWQgPSB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG4gICAgaWYgKGlzUHJldmVudGVkKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5jbG9zZXN0KCdxdGktYXNzZXNzbWVudC1pdGVtJyk7XG5cbiAgICAgIGNvbnN0IHN0aW11bHVzUmVmID0gaXRlbS5xdWVyeVNlbGVjdG9yKGBbZGF0YS1zdGltdWx1cy1pZHJlZj0ke3RoaXMuaWRlbnRpZmllcn1dYCk7XG4gICAgICBpZiAoc3RpbXVsdXNSZWYpIHtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdGltdWx1c1JlZihzdGltdWx1c1JlZik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFN0aW11bHVzIHdpdGggZGF0YS1zdGltdWx1cy1pZHJlZiAke3RoaXMuaWRlbnRpZmllcn0gbm90IGZvdW5kYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGFuZCBhcHBlbmRzIHRoZSBzdGltdWx1cyB0byB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBzdGltdWx1c1JlZiAtIFRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBzdGltdWx1cyB3aWxsIGJlIGFwcGVuZGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVwZGF0ZVN0aW11bHVzUmVmKHN0aW11bHVzUmVmOiBFbGVtZW50KSB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuaHJlZi5zdWJzdHJpbmcoMCwgdGhpcy5ocmVmLmxhc3RJbmRleE9mKCcvJykpO1xuICAgIGNvbnN0IHN0aW11bHVzID0gYXdhaXQgcXRpVHJhbnNmb3JtSXRlbSgpXG4gICAgICAubG9hZCh0aGlzLmhyZWYpXG4gICAgICAudGhlbihhcGkgPT4gYXBpLnBhdGgocGF0aCkuaHRtbERvYygpKTtcbiAgICBpZiAoc3RpbXVsdXMpIHsgICAgICBcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gc3RpbXVsdXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXN0aW11bHVzLWJvZHksIHF0aS1zdHlsZXNoZWV0Jyk7XG4gICAgICBzdGltdWx1c1JlZi5pbm5lckhUTUwgPSAnJztcbiAgICAgIHN0aW11bHVzUmVmLmFwcGVuZCguLi5lbGVtZW50cyk7XG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZic6IFF0aUFzc2Vzc21lbnRTdGltdWx1c1JlZjtcbiAgfVxufVxuIiwgImltcG9ydCB7IENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXIsIExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5leHBvcnQgaW50ZXJmYWNlIENob2ljZUludGVyZmFjZSB7XG4gIGlkZW50aWZpZXI6IHN0cmluZztcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRlciB0byBoYW5kbGUgYm9vbGVhbiBhdHRyaWJ1dGVzIGZvciBBUklBIHByb3BlcnRpZXMsXG4gKiBlbnN1cmluZyB0aGV5IGFyZSBzZXQgYXMgJ3RydWUnIG9yICdmYWxzZScgc3RyaW5ncy5cbiAqL1xuY29uc3QgYXJpYUJvb2xlYW5Db252ZXJ0ZXI6IENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXI8Ym9vbGVhbiwgYm9vbGVhbj4gPSB7XG4gIHRvQXR0cmlidXRlOiAodmFsdWU6IGJvb2xlYW4pID0+ICh2YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZScpLFxuICBmcm9tQXR0cmlidXRlOiAodmFsdWU6IHN0cmluZyB8IG51bGwpID0+IHZhbHVlID09PSAndHJ1ZSdcbn07XG5cbi8qKlxuICogQSBtaXhpbiB0aGF0IGFkZHMgY2hvaWNlIGZ1bmN0aW9uYWxpdHkgdG8gYSBMaXRFbGVtZW50LWJhc2VkIGNsYXNzLlxuICogSXQgZGlzcGF0Y2hlcyBldmVudHMgd2l0aCBhIGN1c3RvbSBgdHlwZWAgYW5kIGhhbmRsZXMgc2VsZWN0aW9uIGxvZ2ljLlxuICpcbiAqIEBwYXJhbSBCYXNlIC0gVGhlIGJhc2UgY2xhc3MgdG8gZXh0ZW5kLlxuICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgY2hvaWNlLCB1c2VkIGluIGV2ZW50IG5hbWVzLlxuICogQHJldHVybnMgQSBuZXcgY2xhc3MgZXh0ZW5kaW5nIHRoZSBiYXNlIGNsYXNzIHdpdGggY2hvaWNlIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZlRWxlbWVudE1peGluSW50ZXJmYWNlIHtcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICB0YWJJbmRleDogbnVtYmVyO1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHk6IGJvb2xlYW47XG4gIGludGVybmFsczogRWxlbWVudEludGVybmFscztcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gQWN0aXZlRWxlbWVudE1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oQmFzZTogVCwgdHlwZTogc3RyaW5nKSB7XG4gIGFic3RyYWN0IGNsYXNzIFF0aUNob2ljZSBleHRlbmRzIEJhc2Uge1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICAgIHB1YmxpYyBpZGVudGlmaWVyID0gJyc7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUsIGF0dHJpYnV0ZTogJ3RhYmluZGV4JyB9KVxuICAgIHB1YmxpYyB0YWJJbmRleCA9IDA7XG5cbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIHJlZmxlY3Q6IHRydWUsXG4gICAgICBhdHRyaWJ1dGU6ICdhcmlhLWRpc2FibGVkJyxcbiAgICAgIGNvbnZlcnRlcjogYXJpYUJvb2xlYW5Db252ZXJ0ZXJcbiAgICB9KVxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICByZWZsZWN0OiB0cnVlLFxuICAgICAgYXR0cmlidXRlOiAnYXJpYS1yZWFkb25seScsXG4gICAgICBjb252ZXJ0ZXI6IGFyaWFCb29sZWFuQ29udmVydGVyXG4gICAgfSlcbiAgICBwdWJsaWMgcmVhZG9ubHkgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBpbnRlcm5hbHM6IEVsZW1lbnRJbnRlcm5hbHM7XG5cbiAgICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIGhhbmRsZURpc2FibGVkQ2hhbmdlKF9vbGRWYWx1ZTogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMudGFiSW5kZXggPSBkaXNhYmxlZCA/IC0xIDogMDtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmJsdXIoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgc3VwZXIoLi4uYXJncyk7XG4gICAgICB0aGlzLmludGVybmFscyA9IHRoaXMuYXR0YWNoSW50ZXJuYWxzKCk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5fb25LZXlVcCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGljayk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGByZWdpc3Rlci0ke3R5cGV9YCwge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuX29uS2V5VXApO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2spO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoYHVucmVnaXN0ZXItJHt0eXBlfWAsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX29uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5hbHRLZXkpIHJldHVybjtcblxuICAgICAgaWYgKGV2ZW50LmNvZGUgPT09ICdTcGFjZScpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fYWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9vbkNsaWNrKCkge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgdGhpcy5fYWN0aXZhdGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hY3RpdmF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBpZGVudGlmaWVyOiBzdHJpbmcgfT4oYGFjdGl2YXRlLSR7dHlwZX1gLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHsgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gICAgfVxuICB9XG4gIHJldHVybiBRdGlDaG9pY2UgYXMgQ29uc3RydWN0b3I8QWN0aXZlRWxlbWVudE1peGluSW50ZXJmYWNlPiAmIFQ7XG59XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1pdGVtLWJvZHkuc3R5bGVzJztcbmltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAgfSBmcm9tICdsaXQnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBxdGktaXRlbS1ib2R5IG5vZGUgY29udGFpbnMgdGhlIHRleHQsIGdyYXBoaWNzLCBtZWRpYSBvYmplY3RzIGFuZCBpbnRlcmFjdGlvbnMgdGhhdCBkZXNjcmliZSB0aGUgaXRlbSdzIGNvbnRlbnQgYW5kIGluZm9ybWF0aW9uIGFib3V0IGhvdyBpdCBpcyBzdHJ1Y3R1cmVkLlxuICogQGRvY3VtZW50YXRpb24gaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5zcGhwbzZsdTZ6cWlcbiAqIEBzdGF0dXMgc3RhYmxlXG4gKiBAc2luY2UgNC4wXG4gKlxuICogQHNsb3QgLSBpdGVtIGJvZHkgY29udGVudC5cbiAqIEBzbG90IHF0aS1ydWJyaWMtYmxvY2sgLSB0aGUgcXRpIHJ1YnJpYyBibG9jayBpcyBwbGFjZWQgYWJvdmUgdGhlIGl0ZW1cbiAqXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktaXRlbS1ib2R5JylcbmV4cG9ydCBjbGFzcyBRdGlJdGVtQm9keSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInF0aS1ydWJyaWMtYmxvY2tcIj48L3Nsb3Q+PHNsb3Q+PC9zbG90PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWl0ZW0tYm9keSc6IFF0aUl0ZW1Cb2R5O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1wcm9tcHQnKVxuZXhwb3J0IGNsYXNzIFF0aVByb21wdCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAvLyBpZiBwcm9tcHRzIGFyZSBpbiBpbnRlcmFjdGlvbnMgdGhleSBzaG91bGQgaGF2ZSBhIHNsb3QsIHNvIHRoZSBwcm9tcHQgaGFzIHRvIGdvIHRoZXJlXG4gICAgLy8gaWYgcHJvbXB0IGlzIGluIHRoZSBib2R5LCB0aGVuIGp1c3QgZGlzcGxheSB0aGUgcHJvbXB0IHRoZXJlLlxuICAgIC8vIEEgYmV0dGVyIGNoZWNrIHdvdWxkIGJlIHRoZSBsYXR0ZXIsIGJ1dCBub3QgY2FuJ3QgZ2V0IHRocm91Z2ggdGhlIHNoYWRvd3Jvb3QgdG8gZmluZCB0aGUgc2xvdFxuICAgIGNvbnN0IGluSW50ZXJhY3Rpb24gPSB0aGlzLnBhcmVudEVsZW1lbnQudGFnTmFtZS5lbmRzV2l0aCgnSU5URVJBQ1RJT04nKTtcbiAgICBpZiAoaW5JbnRlcmFjdGlvbikge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncHJvbXB0Jyk7XG4gICAgfVxuICAgIC8vIGNvbnN0IHByb21wdFNsb3QgPSB0aGlzLnBhcmVudEVsZW1lbnQuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFwiW25hbWU9J3Byb21wdCddXCIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1wcm9tcHQnOiBRdGlQcm9tcHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBQcm9wZXJ0eVZhbHVlTWFwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktc3R5bGVzaGVldCcpXG5leHBvcnQgY2xhc3MgUXRpU3R5bGVzaGVldCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBwcml2YXRlIHN0eWxlRWxlbWVudDogSFRNTFN0eWxlRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlTWFwPGFueT4gfCBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBjb25zdCBsaW5rID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcblxuICAgIGlmIChsaW5rICE9PSBudWxsKSB7XG4gICAgICAvLyBGZXRjaCB0aGUgc3R5bGVzaGVldCBjb250ZW50XG4gICAgICBmZXRjaChsaW5rKVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS50ZXh0KCkpXG4gICAgICAgIC50aGVuKGNzc0NvbnRlbnQgPT4ge1xuICAgICAgICAgIC8vIE1pbmlmeSB0aGUgQ1NTIGNvbnRlbnQgYnkgcmVtb3Zpbmcgd2hpdGVzcGFjZSBhbmQgY29tbWVudHNcbiAgICAgICAgICBjb25zdCBtaW5pZmllZENzcyA9IHRoaXMubWluaWZ5Q3NzKGNzc0NvbnRlbnQpO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgPHN0eWxlPiBlbGVtZW50IHdpdGggQHNjb3BlIHN1cnJvdW5kaW5nIHRoZSBtaW5pZmllZCBDU1NcbiAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgdGhpcy5zdHlsZUVsZW1lbnQubWVkaWEgPSAnc2NyZWVuJztcbiAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9IGBAc2NvcGUgeyR7bWluaWZpZWRDc3N9fWA7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQXBwZW5kIHRoZSBzdHlsZSBlbGVtZW50IHRvIHRoZSBwYXJlbnQgZWxlbWVudCBvZiB0aGlzIGNvbXBvbmVudFxuICAgICAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnN0eWxlRWxlbWVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignTm8gcGFyZW50IGVsZW1lbnQgdG8gYXBwZW5kIHRoZSBzY29wZWQgc3R5bGVzaGVldCB0by4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgc3R5bGVzaGVldDonLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRleHRDb250ZW50ICE9PSBudWxsICYmIHRoaXMudGV4dENvbnRlbnQudHJpbSgpICE9PSAnJykge1xuICAgICAgLy8gTWluaWZ5IHRoZSBpbmxpbmUgQ1NTIGNvbnRlbnRcbiAgICAgIGNvbnN0IG1pbmlmaWVkQ3NzID0gdGhpcy5taW5pZnlDc3ModGhpcy50ZXh0Q29udGVudCk7XG5cbiAgICAgIC8vIERpcmVjdGx5IGNyZWF0ZSBhIDxzdHlsZT4gZWxlbWVudCB3aXRoIHRoZSBAc2NvcGUgc3Vycm91bmRpbmcgdGhlIG1pbmlmaWVkIGlubGluZSBzdHlsZXNcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50Lm1lZGlhID0gJ3NjcmVlbic7XG4gICAgICB0aGlzLnN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9IGBAc2NvcGUgeyR7bWluaWZpZWRDc3N9fWA7XG5cbiAgICAgIC8vIEFwcGVuZCB0aGUgc3R5bGUgZWxlbWVudCB0byB0aGUgcGFyZW50IGVsZW1lbnQgb2YgdGhpcyBjb21wb25lbnRcbiAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc3R5bGVFbGVtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTm8gcGFyZW50IGVsZW1lbnQgdG8gYXBwZW5kIHRoZSBzY29wZWQgc3R5bGVzaGVldCB0by4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1pbmlmeUNzcyhjc3NDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFJlbW92ZSBjb21tZW50cywgd2hpdGVzcGFjZSwgYW5kIG5ld2xpbmUgY2hhcmFjdGVyc1xuICAgIHJldHVybiBjc3NDb250ZW50XG4gICAgICAucmVwbGFjZSgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAnJykgLy8gUmVtb3ZlIGNvbW1lbnRzXG4gICAgICAucmVwbGFjZSgvXFxzKy9nLCAnICcpIC8vIENvbGxhcHNlIHdoaXRlc3BhY2VcbiAgICAgIC5yZXBsYWNlKC9cXHMqKFt7fTo7XSlcXHMqL2csICckMScpIC8vIFJlbW92ZSBzcGFjZXMgYXJvdW5kIHt9LCA6LCA7XG4gICAgICAudHJpbSgpOyAvLyBUcmltIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgaWYgKHRoaXMuc3R5bGVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCByZW1vdmUgc3R5bGVzaGVldDonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXN0eWxlc2hlZXQnOiBRdGlTdHlsZXNoZWV0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktdmFyaWFibGVkZWNsYXJhdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVmYXVsdFZhbHVlcyh2YXJpYWJsZTogVmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+KSB7XG4gICAgY29uc3QgaHRtbFZhbHVlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktZGVmYXVsdC12YWx1ZSA+IHF0aS12YWx1ZScpKTtcblxuICAgIGlmIChodG1sVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFZhbHVlcyA9IGh0bWxWYWx1ZXMubWFwKG4gPT4gbi5pbm5lckhUTUwudHJpbSgpKTtcbiAgICBpZiAoZGVmYXVsdFZhbHVlcy5sZW5ndGggPiAxIHx8IHZhcmlhYmxlLmNhcmRpbmFsaXR5ID09PSAnbXVsdGlwbGUnIHx8IHZhcmlhYmxlLmNhcmRpbmFsaXR5ID09PSAnb3JkZXJlZCcpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVzO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlc1swXTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktdmFyaWFibGVkZWNsYXJhdGlvbic6IFF0aVZhcmlhYmxlRGVjbGFyYXRpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBCYXNlVHlwZSwgQ2FyZGluYWxpdHkgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBPdXRjb21lVmFyaWFibGUgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3V0Y29tZS1kZWNsYXJhdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpT3V0Y29tZURlY2xhcmF0aW9uIGV4dGVuZHMgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGU7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZXh0ZXJuYWwtc2NvcmVkJyB9KSBleHRlcm5hbFNjb3JlZDogJ2h1bWFuJyB8ICdleHRlcm5hbE1hY2hpbmUnIHwgbnVsbCA9IG51bGw7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBjYXJkaW5hbGl0eTogQ2FyZGluYWxpdHk7XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHB1YmxpYyBpdGVtQ29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIHN0YXRpYyBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLml0ZW1Db250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKT8udmFsdWU7XG4gICAgcmV0dXJuIGh0bWxgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMil9YDtcbiAgfVxuXG4gIGdldCBpbnRlcnBvbGF0aW9uVGFibGUoKTogTWFwPG51bWJlciwgbnVtYmVyPiB8IG51bGwge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktaW50ZXJwb2xhdGlvbi10YWJsZScpO1xuICAgIGlmICh0YWJsZSkge1xuICAgICAgY29uc3QgZW50cmllcyA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1pbnRlcnBvbGF0aW9uLXRhYmxlLWVudHJ5JykpIHtcbiAgICAgICAgaWYgKCFlbnRyeS5nZXRBdHRyaWJ1dGUoJ3NvdXJjZS12YWx1ZScpICYmIGVudHJ5LmdldEF0dHJpYnV0ZSgndGFyZ2V0LXZhbHVlJykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdzb3VyY2UtdmFsdWUgb3IgdGFyZ2V0LXZhbHVlIGlzIG1pc3NpbmcgaW4gcXRpLWludGVycG9sYXRpb24tdGFibGUtZW50cnknKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHBhcnNlSW50KGVudHJ5LmdldEF0dHJpYnV0ZSgnc291cmNlLXZhbHVlJykpO1xuICAgICAgICBjb25zdCB0YXJnZXRWYWx1ZSA9IHBhcnNlSW50KGVudHJ5LmdldEF0dHJpYnV0ZSgndGFyZ2V0LXZhbHVlJykpO1xuICAgICAgICBpZiAoaXNOYU4oc291cmNlVmFsdWUpIHx8IGlzTmFOKHRhcmdldFZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3NvdXJjZS12YWx1ZSBvciB0YXJnZXQtdmFsdWUgaXMgbm90IGEgbnVtYmVyIGluIHF0aS1pbnRlcnBvbGF0aW9uLXRhYmxlLWVudHJ5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZW50cmllcy5zZXQoc291cmNlVmFsdWUsIHRhcmdldFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZTogT3V0Y29tZVZhcmlhYmxlID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgY2FyZGluYWxpdHk6IHRoaXMuY2FyZGluYWxpdHksXG4gICAgICBiYXNlVHlwZTogdGhpcy5iYXNlVHlwZSxcbiAgICAgIHR5cGU6ICdvdXRjb21lJyxcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgaW50ZXJwb2xhdGlvblRhYmxlOiB0aGlzLmludGVycG9sYXRpb25UYWJsZSxcbiAgICAgIGV4dGVybmFsU2NvcmVkOiB0aGlzLmV4dGVybmFsU2NvcmVkXG4gICAgfTtcbiAgICBvdXRjb21lVmFyaWFibGUudmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZXMob3V0Y29tZVZhcmlhYmxlKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1yZWdpc3Rlci12YXJpYWJsZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyB2YXJpYWJsZTogb3V0Y29tZVZhcmlhYmxlIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktb3V0Y29tZS1kZWNsYXJhdGlvbic6IFF0aU91dGNvbWVEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEJhc2VUeXBlLCBDYXJkaW5hbGl0eSB9IGZyb20gJy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpTWFwcGluZyB9IGZyb20gJy4uLy4uL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXBwaW5nL3F0aS1tYXBwaW5nJztcbmltcG9ydCB7IFF0aVZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZURlY2xhcmF0aW9uIGV4dGVuZHMgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGU7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgY2FyZGluYWxpdHk6IENhcmRpbmFsaXR5O1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwdWJsaWMgaXRlbUNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtQ29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik/LnZhbHVlO1xuICAgIHJldHVybiBodG1sYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpfWA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGU6IFJlc3BvbnNlVmFyaWFibGUgPSB7XG4gICAgICBiYXNlVHlwZTogdGhpcy5iYXNlVHlwZSxcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIGNvcnJlY3RSZXNwb25zZTogdGhpcy5jb3JyZWN0UmVzcG9uc2UsXG4gICAgICBjYXJkaW5hbGl0eTogdGhpcy5jYXJkaW5hbGl0eSB8fCAnc2luZ2xlJyxcbiAgICAgIG1hcHBpbmc6IHRoaXMubWFwcGluZyxcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgdHlwZTogJ3Jlc3BvbnNlJyxcbiAgICAgIGNhbmRpZGF0ZVJlc3BvbnNlOiBudWxsXG4gICAgfTtcbiAgICByZXNwb25zZVZhcmlhYmxlLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWVzKHJlc3BvbnNlVmFyaWFibGUpO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItdmFyaWFibGUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgdmFyaWFibGU6IHJlc3BvbnNlVmFyaWFibGUgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY29ycmVjdFJlc3BvbnNlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICBjb25zdCBjb3JyZWN0UmVzcG9uc2UgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1jb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgaWYgKGNvcnJlY3RSZXNwb25zZSkge1xuICAgICAgY29uc3QgdmFsdWVzID0gY29ycmVjdFJlc3BvbnNlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS12YWx1ZScpO1xuICAgICAgaWYgKHRoaXMuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlc1swXS50ZXh0Q29udGVudDtcbiAgICAgICAgdmFsdWVzWzBdLnJlbW92ZSgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJykge1xuICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZXNbaV0udGV4dENvbnRlbnQpO1xuICAgICAgICAgIHZhbHVlc1tpXS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgbWFwcGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktbWFwcGluZycpIGFzIFF0aU1hcHBpbmc7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uJzogUXRpUmVzcG9uc2VEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8nKVxuZXhwb3J0IGNsYXNzIFF0aUNvbXBhbmlvbk1hdGVyaWFsc0luZm8gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgLy8gc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgLy8gICBzbG90IHtcbiAgLy8gICAgIGRpc3BsYXk6IGhpZGRlbjtcbiAgLy8gICB9XG4gIC8vIGA7XG4gIC8vIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgLy8gICByZXR1cm4gaHRtbGAgPHNsb3Q+PC9zbG90PiBgO1xuICAvLyB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8nOiBRdGlDb21wYW5pb25NYXRlcmlhbHNJbmZvO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWNvbnRlbnQtYm9keScpXG5leHBvcnQgY2xhc3MgUXRpQ29udGVudEJvZHkgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG59XG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY29udGVudC1ib2R5JzogUXRpQ29udGVudEJvZHk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJ1YnJpYy1ibG9jaycpXG5leHBvcnQgY2xhc3MgUXRpUnVicmljQmxvY2sgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIG92ZXJyaWRlIGlkOyAvLyA9XCJxdGlBc3BlY3RJbmhvdWRSdWJyaWNCbG9ja1wiXG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHVzZTogJ2luc3RydWN0aW9ucycgfCAnc2NvcmluZycgfCAnbmF2aWdhdGlvbic7IC8vICA9IFwic2NvcmluZ1wiXG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHZpZXc6ICdhdXRob3InIHwgJ2NhbmRpZGF0ZScgfCAncHJvY3RvcicgfCAnc2NvcmVyJyB8ICd0ZXN0Q29uc3RydWN0b3InIHwgJ3R1dG9yJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NsYXNzJyB9KSBjbGFzc05hbWVzO1xuICBAd2F0Y2goJ2NsYXNzTmFtZXMnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIGhhbmRsZWNsYXNzTmFtZXNDaGFuZ2Uob2xkLCBkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSB0aGlzLmNsYXNzTmFtZXMuc3BsaXQoJyAnKTtcbiAgICBjbGFzc05hbWVzLmZvckVhY2goKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBzd2l0Y2ggKGNsYXNzTmFtZSkge1xuICAgICAgICBjYXNlICdxdGktcnVicmljLWRpc2NyZXRpb25hcnktcGxhY2VtZW50JzpcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktcnVicmljLWJsb2NrJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3F0aS1ydWJyaWMtaW5saW5lJzpcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICcnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gYnkgZGVmYXVsdCBwdXQgdGhpcyBpbiBhIHNsb3QgaW4gdGhlIGl0ZW0tYm9keVxuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1ydWJyaWMtYmxvY2snKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcnVicmljLWJsb2NrJzogUXRpUnVicmljQmxvY2s7XG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgZGVjaW1hbFNlcGFyYXRvciA9ICgpID0+IHtcbiAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCgpLmZvcm1hdCgwLjEpLnJlcGxhY2UoL1xcZC9nLCAnJyk7XG59O1xuXG5leHBvcnQgY29uc3QgY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQgPSAobnVtYmVyOiBudW1iZXIgfCBzdHJpbmcpID0+IHtcbiAgLy8gY2hlY2sgaWYgdHlwZSBpcyBzdHJpbmdcbiAgaWYgKHR5cGVvZiBudW1iZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bWJlcjtcbiAgfVxuICBjb25zdCBkU2VwID0gZGVjaW1hbFNlcGFyYXRvcigpO1xuICBpZiAoZFNlcCA9PT0gJy4nKSB7XG4gICAgcmV0dXJuIG51bWJlci50b0xvY2FsZVN0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudW1iZXIudG9TdHJpbmcoKS5yZXBsYWNlKCcuJywgJycpLnJlcGxhY2UoZFNlcCwgJy4nKTtcbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIElzTnVsbE9yVW5kZWZpbmVkKHZhbHVlOiB1bmtub3duKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRG91YmxlU2xhc2hlcyhzdHI6IHN0cmluZykge1xuICBjb25zdCBzaW5nbGVGb3J3YXJkU2xhc2hlcyA9IHN0clxuICAgIC5yZXBsYWNlKC8oW146XVxcLylcXC8rL2csICckMScpXG4gICAgLnJlcGxhY2UoL1xcL1xcLy9nLCAnLycpXG4gICAgLnJlcGxhY2UoJ2h0dHA6LycsICdodHRwOi8vJylcbiAgICAucmVwbGFjZSgnaHR0cHM6LycsICdodHRwczovLycpO1xuICByZXR1cm4gc2luZ2xlRm9yd2FyZFNsYXNoZXM7XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IElzTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnLi4vaW50ZXJuYWwvdXRpbHMnO1xuaW1wb3J0IHsgaXRlbUNvbnRleHQsIEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpRmVlZGJhY2sgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdzaG93LWhpZGUnIH0pXG4gIHByb3RlY3RlZCBzaG93SGlkZTogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnb3V0Y29tZS1pZGVudGlmaWVyJyB9KVxuICBwdWJsaWMgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHJvdGVjdGVkIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogZmFsc2UgfSlcbiAgcHVibGljIHNob3dTdGF0dXM6IHN0cmluZztcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfY29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxRdGlGZWVkYmFjaz4oJ3F0aS1yZWdpc3Rlci1mZWVkYmFjaycsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogdGhpc1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNoZWNrU2hvd0ZlZWRiYWNrKG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmcpIHsgICAgXG4gICAgY29uc3Qgb3V0Y29tZVZhcmlhYmxlID0gdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gb3V0Y29tZUlkZW50aWZpZXIpIHx8IG51bGw7O1xuXG4gICAgaWYgKHRoaXMub3V0Y29tZUlkZW50aWZpZXIgIT09IG91dGNvbWVJZGVudGlmaWVyIHx8ICFvdXRjb21lVmFyaWFibGUpIHJldHVybjtcbiAgICBsZXQgaXNGb3VuZCA9IGZhbHNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG91dGNvbWVWYXJpYWJsZS52YWx1ZSkpIHtcbiAgICAgIGlzRm91bmQgPSBvdXRjb21lVmFyaWFibGUudmFsdWUuaW5jbHVkZXModGhpcy5pZGVudGlmaWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNGb3VuZCA9XG4gICAgICAgICghSXNOdWxsT3JVbmRlZmluZWQodGhpcy5pZGVudGlmaWVyKSAmJlxuICAgICAgICAgICFJc051bGxPclVuZGVmaW5lZChvdXRjb21lVmFyaWFibGU/LnZhbHVlKSAmJlxuICAgICAgICAgIHRoaXMuaWRlbnRpZmllciA9PT0gb3V0Y29tZVZhcmlhYmxlLnZhbHVlKSB8fFxuICAgICAgICBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dGZWVkYmFjayhpc0ZvdW5kKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0ZlZWRiYWNrKHZhbHVlOiBib29sZWFuKSB7ICAgIFxuICAgIHRoaXMuc2hvd1N0YXR1cyA9ICh2YWx1ZSAmJiB0aGlzLnNob3dIaWRlID09PSAnc2hvdycpIHx8ICghdmFsdWUgJiYgdGhpcy5zaG93SGlkZSA9PT0gJ2hpZGUnKSA/ICdvbicgOiAnb2ZmJzsgICAgXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBQcm9wZXJ0eVZhbHVlTWFwLCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1mZWVkYmFjay1ibG9jaycpXG5leHBvcnQgY2xhc3MgUXRpRmVlZGJhY2tCbG9jayBleHRlbmRzIFF0aUZlZWRiYWNrIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgLm9uIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICAub2ZmIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCJmZWVkYmFjayAke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZU1hcDxhbnk+IHwgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tTaG93RmVlZGJhY2sodGhpcy5vdXRjb21lSWRlbnRpZmllcik7XG4gIH1cbn1cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1mZWVkYmFjay1ibG9jayc6IFF0aUZlZWRiYWNrQmxvY2s7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1mZWVkYmFjay1pbmxpbmUnKVxuZXhwb3J0IGNsYXNzIFF0aUZlZWRiYWNrSW5saW5lIGV4dGVuZHMgUXRpRmVlZGJhY2sge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuICAgIC5vZmYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCIke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1mZWVkYmFjay1pbmxpbmUnOiBRdGlGZWVkYmFja0lubGluZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpRmVlZGJhY2sgfSBmcm9tICcuLi9xdGktZmVlZGJhY2snO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1vZGFsLWZlZWRiYWNrJylcbmV4cG9ydCBjbGFzcyBRdGlNb2RhbEZlZWRiYWNrIGV4dGVuZHMgUXRpRmVlZGJhY2sge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuICAgIC5vZmYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCIke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1tb2RhbC1mZWVkYmFjayc6IFF0aU1vZGFsRmVlZGJhY2s7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtub3RoaW5nfSBmcm9tICcuLi9saXQtaHRtbC5qcyc7XG5cbi8qKlxuICogRm9yIEF0dHJpYnV0ZVBhcnRzLCBzZXRzIHRoZSBhdHRyaWJ1dGUgaWYgdGhlIHZhbHVlIGlzIGRlZmluZWQgYW5kIHJlbW92ZXNcbiAqIHRoZSBhdHRyaWJ1dGUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZC5cbiAqXG4gKiBGb3Igb3RoZXIgcGFydCB0eXBlcywgdGhpcyBkaXJlY3RpdmUgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlmRGVmaW5lZCA9IDxUPih2YWx1ZTogVCkgPT4gdmFsdWUgPz8gbm90aGluZztcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IElJbnRlcmFjdGlvbiB9IGZyb20gJy4vaW50ZXJhY3Rpb24uaW50ZXJmYWNlJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEludGVyYWN0aW9uIGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIElJbnRlcmFjdGlvbiB7XG4gIHN0YXRpYyBmb3JtQXNzb2NpYXRlZCA9IHRydWU7IC8vIEVuYWJsZSBmb3JtIGFzc29jaWF0aW9uXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncmVzcG9uc2UtaWRlbnRpZmllcicgfSkgcmVzcG9uc2VJZGVudGlmaWVyID0gJyc7XG4gIC8qKiBkaXNhYmxlZCBzaG91bGQgYmUgZXhwb3NlZCB0byB0aGUgYXR0cmlidXRlcyBhbmQgYWNjZXNzaWJsZSBhcyBwcm9wZXJ0eSAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqIHJlYWRvbmx5IHNob3VsZCBiZSBleHBvc2VkIHRvIHRoZSBhdHRyaWJ1dGVzIGFuZCBhY2Nlc3NpYmxlIGFzIHByb3BlcnR5ICovXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSkgcmVhZG9ubHkgPSBmYWxzZTtcblxuICBAc3RhdGUoKVxuICBwcm90ZWN0ZWQgX2NvcnJlY3RSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10gPSAnJztcbiAgcHJvdGVjdGVkIF9pbnRlcm5hbHM6IEVsZW1lbnRJbnRlcm5hbHM7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9pbnRlcm5hbHMgPSB0aGlzLmF0dGFjaEludGVybmFscygpO1xuICB9XG5cbiAgYWJzdHJhY3QgdmFsaWRhdGUoKTogYm9vbGVhbjtcblxuICBwdWJsaWMgcmVwb3J0VmFsaWRpdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVybmFscy5yZXBvcnRWYWxpZGl0eSgpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSAnJztcbiAgfVxuXG4gIGFic3RyYWN0IGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgYWJzdHJhY3Qgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pO1xuXG4gIHB1YmxpYyBnZXQgY29ycmVjdFJlc3BvbnNlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fY29ycmVjdFJlc3BvbnNlO1xuICB9XG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fY29ycmVjdFJlc3BvbnNlID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2VcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlUmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGlmRGVmaW5lZCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2lmLWRlZmluZWQuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUV4dGVuZGVkVGV4dEludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBAc3RhdGUoKVxuICBwcml2YXRlIF9yb3dzID0gNTtcblxuICAvKiogZXhwZWN0ZWQgbGVuZ3RoIGlzIG1hcHBlZCB0byB0aGUgcHJvcGVydHkgbWF4bGVuZ3RoIG9uIHRoZSB0ZXh0YXJlYSAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ2V4cGVjdGVkLWxlbmd0aCcgfSkgZXhwZWN0ZWRMZW5ndGg6IG51bWJlcjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BhdHRlcm4tbWFzaycgfSkgcGF0dGVybk1hc2s6IHN0cmluZztcblxuICAvKiogdGV4dCBhcHBlYXJpbmcgaW4gdGhlIGV4dGVuZGVkLXRleHQtbnRlcmFjdGlvbiBpZiBpdCBpcyBlbXB0eSAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BsYWNlaG9sZGVyLXRleHQnIH0pIHBsYWNlaG9sZGVyVGV4dDogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YS1wYXR0ZXJubWFzay1tZXNzYWdlJyB9KSBkYXRhUGF0dGVybm1hc2tNZXNzYWdlOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NsYXNzJyB9KSBjbGFzc05hbWVzO1xuICBAd2F0Y2goJ2NsYXNzTmFtZXMnKVxuICBoYW5kbGVjbGFzc05hbWVzQ2hhbmdlKG9sZCwgY2xhc3Nlczogc3RyaW5nKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcbiAgICBsZXQgcm93c1NldCA9IGZhbHNlO1xuICAgIGNsYXNzTmFtZXMuZm9yRWFjaCgoY2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChjbGFzc05hbWUuc3RhcnRzV2l0aCgncXRpLWhlaWdodC1saW5lcy0nKSkge1xuICAgICAgICBjb25zdCBuclJvd3MgPSBjbGFzc05hbWUucmVwbGFjZSgncXRpLWhlaWdodC1saW5lcy0nLCAnJyk7XG4gICAgICAgIHRoaXMuX3Jvd3MgPSBwYXJzZUludChuclJvd3MpO1xuICAgICAgICByb3dzU2V0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBJZiBubyBxdGktaGVpZ2h0LWxpbmVzIGNsYXNzIGlzIHNldCwgY2FsY3VsYXRlIHJvd3MgYmFzZWQgb24gZXhwZWN0ZWRMZW5ndGhcbiAgICBpZiAoIXJvd3NTZXQgJiYgdGhpcy5leHBlY3RlZExlbmd0aCkge1xuICAgICAgY29uc3QgZXN0aW1hdGVkUm93cyA9IE1hdGguY2VpbCh0aGlzLmV4cGVjdGVkTGVuZ3RoIC8gNTApOyAvLyAgJzUwJyBiYXNlZCBvbiBhbiBlc3RpbWF0ZSBmb3IgY2hhcmFjdGVycyBwZXIgcm93XG4gICAgICB0aGlzLl9yb3dzID0gZXN0aW1hdGVkUm93cztcbiAgICB9XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWw7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgZm9ybURhdGEuYXBwZW5kKHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCB2YWwpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldEZvcm1WYWx1ZShmb3JtRGF0YSk7XG4gICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSB2YWxpZGF0ZSgpIHtcbiAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgIGlmICghdGV4dGFyZWEpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0aGlzLnBhdHRlcm5NYXNrICYmIHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSkge1xuICAgICAgLy8gQ2xlYXIgYW55IGN1c3RvbSBlcnJvciBpbml0aWFsbHlcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eSh7fSk7XG4gICAgICB0ZXh0YXJlYS5zZXRDdXN0b21WYWxpZGl0eSgnJyk7XG4gICAgICBjb25zdCBwYXR0ZXJuU291cmNlID1cbiAgICAgICAgdGhpcy5wYXR0ZXJuTWFzay5zdGFydHNXaXRoKCdeJykgJiYgdGhpcy5wYXR0ZXJuTWFzay5lbmRzV2l0aCgnJCcpID8gdGhpcy5wYXR0ZXJuTWFzayA6IGBeJHt0aGlzLnBhdHRlcm5NYXNrfSRgO1xuXG4gICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChwYXR0ZXJuU291cmNlKTtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0ZXh0YXJlYS5jaGVja1ZhbGlkaXR5KCkgJiYgcGF0dGVybi50ZXN0KHRleHRhcmVhLnZhbHVlKTtcblxuICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIC8vIFNldCBjdXN0b20gZXJyb3IgaWYgaW52YWxpZFxuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoeyBjdXN0b21FcnJvcjogdHJ1ZSB9LCB0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpO1xuICAgICAgICB0ZXh0YXJlYS5zZXRDdXN0b21WYWxpZGl0eSh0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdGV4dGFyZWEuY2hlY2tWYWxpZGl0eSgpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KGlzVmFsaWQgPyB7fSA6IHsgY3VzdG9tRXJyb3I6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl92YWx1ZSAhPT0gJycgJiYgdGV4dGFyZWEuY2hlY2tWYWxpZGl0eSgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVwb3J0VmFsaWRpdHkoKSB7XG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKTtcbiAgICBpZiAoIXRleHRhcmVhKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBSdW4gdGhlIHZhbGlkYXRlIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGUgY3VzdG9tIHZhbGlkaXR5IHN0YXRlIGlzIHVwIHRvIGRhdGVcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGV4dGFyZWEucmVwb3J0VmFsaWRpdHkoKTtcbiAgICB9XG4gICAgcmV0dXJuIGlzVmFsaWQ7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3NzYFxuICAgICAgICAvKiBQSzogZGlzcGxheSBob3N0IGFzIGJsb2NrLCBlbHNlIGRlc2lnbiB3aWxsIGJlIGNvbGxhcHNlZCAqL1xuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIH1cbiAgICAgICAgdGV4dGFyZWEge1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIGJvcmRlcjogMDtcbiAgICAgICAgfVxuICAgICAgYFxuICAgIF07XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdFxuICAgICAgPjx0ZXh0YXJlYVxuICAgICAgICBwYXJ0PVwidGV4dGFyZWFcIlxuICAgICAgICBuYW1lPVwiJHt0aGlzLnJlc3BvbnNlSWRlbnRpZmllcn1cIlxuICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBtYXhsZW5ndGg9XCIkezUwMDB9XCJcbiAgICAgICAgQGtleWRvd249XCIke2V2ZW50ID0+IGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfVwiXG4gICAgICAgIEBrZXl1cD1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICBAY2hhbmdlPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIEBibHVyPVwiJHsoZXZlbnQ6IEZvY3VzRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICAgIH19XCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCIke2lmRGVmaW5lZCh0aGlzLnBsYWNlaG9sZGVyVGV4dCA/IHRoaXMucGxhY2Vob2xkZXJUZXh0IDogdW5kZWZpbmVkKX1cIlxuICAgICAgICByb3dzPVwiJHt0aGlzLl9yb3dzfVwiXG4gICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIlxuICAgICAgICA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCJcbiAgICAgICAgLnZhbHVlPSR7dGhpcy5fdmFsdWV9XG4gICAgICA+PC90ZXh0YXJlYT5gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRleHRDaGFuZ2VkKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIHRoaXMuc2V0RW1wdHlBdHRyaWJ1dGUoaW5wdXQudmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gaW5wdXQudmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZShpbnB1dC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRFbXB0eUF0dHJpYnV0ZSh0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZW1wdHknLCB0ZXh0ID09PSAnJyA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJzogUXRpRXh0ZW5kZWRUZXh0SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtcbiAgXyRMSCxcbiAgUGFydCxcbiAgRGlyZWN0aXZlUGFyZW50LFxuICBDb21waWxlZFRlbXBsYXRlUmVzdWx0LFxuICBNYXliZUNvbXBpbGVkVGVtcGxhdGVSZXN1bHQsXG4gIFVuY29tcGlsZWRUZW1wbGF0ZVJlc3VsdCxcbn0gZnJvbSAnLi9saXQtaHRtbC5qcyc7XG5pbXBvcnQge1xuICBEaXJlY3RpdmVSZXN1bHQsXG4gIERpcmVjdGl2ZUNsYXNzLFxuICBQYXJ0SW5mbyxcbiAgQXR0cmlidXRlUGFydEluZm8sXG59IGZyb20gJy4vZGlyZWN0aXZlLmpzJztcbnR5cGUgUHJpbWl0aXZlID0gbnVsbCB8IHVuZGVmaW5lZCB8IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBzeW1ib2wgfCBiaWdpbnQ7XG5cbmNvbnN0IHtfQ2hpbGRQYXJ0OiBDaGlsZFBhcnR9ID0gXyRMSDtcblxudHlwZSBDaGlsZFBhcnQgPSBJbnN0YW5jZVR5cGU8dHlwZW9mIENoaWxkUGFydD47XG5cbmNvbnN0IEVOQUJMRV9TSEFEWURPTV9OT1BBVENIID0gdHJ1ZTtcblxuY29uc3Qgd3JhcCA9XG4gIEVOQUJMRV9TSEFEWURPTV9OT1BBVENIICYmXG4gIHdpbmRvdy5TaGFkeURPTT8uaW5Vc2UgJiZcbiAgd2luZG93LlNoYWR5RE9NPy5ub1BhdGNoID09PSB0cnVlXG4gICAgPyB3aW5kb3cuU2hhZHlET00hLndyYXBcbiAgICA6IChub2RlOiBOb2RlKSA9PiBub2RlO1xuXG4vKipcbiAqIFRlc3RzIGlmIGEgdmFsdWUgaXMgYSBwcmltaXRpdmUgdmFsdWUuXG4gKlxuICogU2VlIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGVvZi1vcGVyYXRvclxuICovXG5leHBvcnQgY29uc3QgaXNQcmltaXRpdmUgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQcmltaXRpdmUgPT5cbiAgdmFsdWUgPT09IG51bGwgfHwgKHR5cGVvZiB2YWx1ZSAhPSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUgIT0gJ2Z1bmN0aW9uJyk7XG5cbmV4cG9ydCBjb25zdCBUZW1wbGF0ZVJlc3VsdFR5cGUgPSB7XG4gIEhUTUw6IDEsXG4gIFNWRzogMixcbiAgTUFUSE1MOiAzLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGVtcGxhdGVSZXN1bHRUeXBlID1cbiAgKHR5cGVvZiBUZW1wbGF0ZVJlc3VsdFR5cGUpW2tleW9mIHR5cGVvZiBUZW1wbGF0ZVJlc3VsdFR5cGVdO1xuXG50eXBlIElzVGVtcGxhdGVSZXN1bHQgPSB7XG4gICh2YWw6IHVua25vd24pOiB2YWwgaXMgTWF5YmVDb21waWxlZFRlbXBsYXRlUmVzdWx0O1xuICA8VCBleHRlbmRzIFRlbXBsYXRlUmVzdWx0VHlwZT4oXG4gICAgdmFsOiB1bmtub3duLFxuICAgIHR5cGU6IFRcbiAgKTogdmFsIGlzIFVuY29tcGlsZWRUZW1wbGF0ZVJlc3VsdDxUPjtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgYSB2YWx1ZSBpcyBhIFRlbXBsYXRlUmVzdWx0IG9yIGEgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzVGVtcGxhdGVSZXN1bHQ6IElzVGVtcGxhdGVSZXN1bHQgPSAoXG4gIHZhbHVlOiB1bmtub3duLFxuICB0eXBlPzogVGVtcGxhdGVSZXN1bHRUeXBlXG4pOiB2YWx1ZSBpcyBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQgPT5cbiAgdHlwZSA9PT0gdW5kZWZpbmVkXG4gICAgPyAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgKHZhbHVlIGFzIFVuY29tcGlsZWRUZW1wbGF0ZVJlc3VsdCk/LlsnXyRsaXRUeXBlJCddICE9PSB1bmRlZmluZWRcbiAgICA6ICh2YWx1ZSBhcyBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQpPy5bJ18kbGl0VHlwZSQnXSA9PT0gdHlwZTtcblxuLyoqXG4gKiBUZXN0cyBpZiBhIHZhbHVlIGlzIGEgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCA9IChcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIENvbXBpbGVkVGVtcGxhdGVSZXN1bHQgPT4ge1xuICByZXR1cm4gKHZhbHVlIGFzIENvbXBpbGVkVGVtcGxhdGVSZXN1bHQpPy5bJ18kbGl0VHlwZSQnXT8uaCAhPSBudWxsO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiBhIHZhbHVlIGlzIGEgRGlyZWN0aXZlUmVzdWx0LlxuICovXG5leHBvcnQgY29uc3QgaXNEaXJlY3RpdmVSZXN1bHQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBEaXJlY3RpdmVSZXN1bHQgPT5cbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgKHZhbHVlIGFzIERpcmVjdGl2ZVJlc3VsdCk/LlsnXyRsaXREaXJlY3RpdmUkJ10gIT09IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIERpcmVjdGl2ZSBjbGFzcyBmb3IgYSBEaXJlY3RpdmVSZXN1bHRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldERpcmVjdGl2ZUNsYXNzID0gKHZhbHVlOiB1bmtub3duKTogRGlyZWN0aXZlQ2xhc3MgfCB1bmRlZmluZWQgPT5cbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgKHZhbHVlIGFzIERpcmVjdGl2ZVJlc3VsdCk/LlsnXyRsaXREaXJlY3RpdmUkJ107XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIHBhcnQgaGFzIG9ubHkgYSBzaW5nbGUtZXhwcmVzc2lvbiB3aXRoIG5vIHN0cmluZ3MgdG9cbiAqIGludGVycG9sYXRlIGJldHdlZW4uXG4gKlxuICogT25seSBBdHRyaWJ1dGVQYXJ0IGFuZCBQcm9wZXJ0eVBhcnQgY2FuIGhhdmUgbXVsdGlwbGUgZXhwcmVzc2lvbnMuXG4gKiBNdWx0aS1leHByZXNzaW9uIHBhcnRzIGhhdmUgYSBgc3RyaW5nc2AgcHJvcGVydHkgYW5kIHNpbmdsZS1leHByZXNzaW9uXG4gKiBwYXJ0cyBkbyBub3QuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1NpbmdsZUV4cHJlc3Npb24gPSAocGFydDogUGFydEluZm8pID0+XG4gIChwYXJ0IGFzIEF0dHJpYnV0ZVBhcnRJbmZvKS5zdHJpbmdzID09PSB1bmRlZmluZWQ7XG5cbmNvbnN0IGNyZWF0ZU1hcmtlciA9ICgpID0+IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJycpO1xuXG4vKipcbiAqIEluc2VydHMgYSBDaGlsZFBhcnQgaW50byB0aGUgZ2l2ZW4gY29udGFpbmVyIENoaWxkUGFydCdzIERPTSwgZWl0aGVyIGF0IHRoZVxuICogZW5kIG9mIHRoZSBjb250YWluZXIgQ2hpbGRQYXJ0LCBvciBiZWZvcmUgdGhlIG9wdGlvbmFsIGByZWZQYXJ0YC5cbiAqXG4gKiBUaGlzIGRvZXMgbm90IGFkZCB0aGUgcGFydCB0byB0aGUgY29udGFpbmVyUGFydCdzIGNvbW1pdHRlZCB2YWx1ZS4gVGhhdCBtdXN0XG4gKiBiZSBkb25lIGJ5IGNhbGxlcnMuXG4gKlxuICogQHBhcmFtIGNvbnRhaW5lclBhcnQgUGFydCB3aXRoaW4gd2hpY2ggdG8gYWRkIHRoZSBuZXcgQ2hpbGRQYXJ0XG4gKiBAcGFyYW0gcmVmUGFydCBQYXJ0IGJlZm9yZSB3aGljaCB0byBhZGQgdGhlIG5ldyBDaGlsZFBhcnQ7IHdoZW4gb21pdHRlZCB0aGVcbiAqICAgICBwYXJ0IGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGBjb250YWluZXJQYXJ0YFxuICogQHBhcmFtIHBhcnQgUGFydCB0byBpbnNlcnQsIG9yIHVuZGVmaW5lZCB0byBjcmVhdGUgYSBuZXcgcGFydFxuICovXG5leHBvcnQgY29uc3QgaW5zZXJ0UGFydCA9IChcbiAgY29udGFpbmVyUGFydDogQ2hpbGRQYXJ0LFxuICByZWZQYXJ0PzogQ2hpbGRQYXJ0LFxuICBwYXJ0PzogQ2hpbGRQYXJ0XG4pOiBDaGlsZFBhcnQgPT4ge1xuICBjb25zdCBjb250YWluZXIgPSB3cmFwKGNvbnRhaW5lclBhcnQuXyRzdGFydE5vZGUpLnBhcmVudE5vZGUhO1xuXG4gIGNvbnN0IHJlZk5vZGUgPVxuICAgIHJlZlBhcnQgPT09IHVuZGVmaW5lZCA/IGNvbnRhaW5lclBhcnQuXyRlbmROb2RlIDogcmVmUGFydC5fJHN0YXJ0Tm9kZTtcblxuICBpZiAocGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qgc3RhcnROb2RlID0gd3JhcChjb250YWluZXIpLmluc2VydEJlZm9yZShjcmVhdGVNYXJrZXIoKSwgcmVmTm9kZSk7XG4gICAgY29uc3QgZW5kTm9kZSA9IHdyYXAoY29udGFpbmVyKS5pbnNlcnRCZWZvcmUoY3JlYXRlTWFya2VyKCksIHJlZk5vZGUpO1xuICAgIHBhcnQgPSBuZXcgQ2hpbGRQYXJ0KFxuICAgICAgc3RhcnROb2RlLFxuICAgICAgZW5kTm9kZSxcbiAgICAgIGNvbnRhaW5lclBhcnQsXG4gICAgICBjb250YWluZXJQYXJ0Lm9wdGlvbnNcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGVuZE5vZGUgPSB3cmFwKHBhcnQuXyRlbmROb2RlISkubmV4dFNpYmxpbmc7XG4gICAgY29uc3Qgb2xkUGFyZW50ID0gcGFydC5fJHBhcmVudDtcbiAgICBjb25zdCBwYXJlbnRDaGFuZ2VkID0gb2xkUGFyZW50ICE9PSBjb250YWluZXJQYXJ0O1xuICAgIGlmIChwYXJlbnRDaGFuZ2VkKSB7XG4gICAgICBwYXJ0Ll8kcmVwYXJlbnREaXNjb25uZWN0YWJsZXM/Lihjb250YWluZXJQYXJ0KTtcbiAgICAgIC8vIE5vdGUgdGhhdCBhbHRob3VnaCBgXyRyZXBhcmVudERpc2Nvbm5lY3RhYmxlc2AgdXBkYXRlcyB0aGUgcGFydCdzXG4gICAgICAvLyBgXyRwYXJlbnRgIHJlZmVyZW5jZSBhZnRlciB1bmxpbmtpbmcgZnJvbSBpdHMgY3VycmVudCBwYXJlbnQsIHRoYXRcbiAgICAgIC8vIG1ldGhvZCBvbmx5IGV4aXN0cyBpZiBEaXNjb25uZWN0YWJsZXMgYXJlIHByZXNlbnQsIHNvIHdlIG5lZWQgdG9cbiAgICAgIC8vIHVuY29uZGl0aW9uYWxseSBzZXQgaXQgaGVyZVxuICAgICAgcGFydC5fJHBhcmVudCA9IGNvbnRhaW5lclBhcnQ7XG4gICAgICAvLyBTaW5jZSB0aGUgXyRpc0Nvbm5lY3RlZCBnZXR0ZXIgaXMgc29tZXdoYXQgY29zdGx5LCBvbmx5XG4gICAgICAvLyByZWFkIGl0IG9uY2Ugd2Uga25vdyB0aGUgc3VidHJlZSBoYXMgZGlyZWN0aXZlcyB0aGF0IG5lZWRcbiAgICAgIC8vIHRvIGJlIG5vdGlmaWVkXG4gICAgICBsZXQgbmV3Q29ubmVjdGlvblN0YXRlO1xuICAgICAgaWYgKFxuICAgICAgICBwYXJ0Ll8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAobmV3Q29ubmVjdGlvblN0YXRlID0gY29udGFpbmVyUGFydC5fJGlzQ29ubmVjdGVkKSAhPT1cbiAgICAgICAgICBvbGRQYXJlbnQhLl8kaXNDb25uZWN0ZWRcbiAgICAgICkge1xuICAgICAgICBwYXJ0Ll8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQobmV3Q29ubmVjdGlvblN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuZE5vZGUgIT09IHJlZk5vZGUgfHwgcGFyZW50Q2hhbmdlZCkge1xuICAgICAgbGV0IHN0YXJ0OiBOb2RlIHwgbnVsbCA9IHBhcnQuXyRzdGFydE5vZGU7XG4gICAgICB3aGlsZSAoc3RhcnQgIT09IGVuZE5vZGUpIHtcbiAgICAgICAgY29uc3QgbjogTm9kZSB8IG51bGwgPSB3cmFwKHN0YXJ0ISkubmV4dFNpYmxpbmc7XG4gICAgICAgIHdyYXAoY29udGFpbmVyKS5pbnNlcnRCZWZvcmUoc3RhcnQhLCByZWZOb2RlKTtcbiAgICAgICAgc3RhcnQgPSBuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJ0O1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIFBhcnQuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBzZXQvdXBkYXRlIHRoZSB2YWx1ZSBvZiB1c2VyLWNyZWF0ZWRcbiAqIHBhcnRzIChpLmUuIHRob3NlIGNyZWF0ZWQgdXNpbmcgYGluc2VydFBhcnRgKTsgaXQgc2hvdWxkIG5vdCBiZSB1c2VkXG4gKiBieSBkaXJlY3RpdmVzIHRvIHNldCB0aGUgdmFsdWUgb2YgdGhlIGRpcmVjdGl2ZSdzIGNvbnRhaW5lciBwYXJ0LiBEaXJlY3RpdmVzXG4gKiBzaG91bGQgcmV0dXJuIGEgdmFsdWUgZnJvbSBgdXBkYXRlYC9gcmVuZGVyYCB0byB1cGRhdGUgdGhlaXIgcGFydCBzdGF0ZS5cbiAqXG4gKiBGb3IgZGlyZWN0aXZlcyB0aGF0IHJlcXVpcmUgc2V0dGluZyB0aGVpciBwYXJ0IHZhbHVlIGFzeW5jaHJvbm91c2x5LCB0aGV5XG4gKiBzaG91bGQgZXh0ZW5kIGBBc3luY0RpcmVjdGl2ZWAgYW5kIGNhbGwgYHRoaXMuc2V0VmFsdWUoKWAuXG4gKlxuICogQHBhcmFtIHBhcnQgUGFydCB0byBzZXRcbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBzZXRcbiAqIEBwYXJhbSBpbmRleCBGb3IgYEF0dHJpYnV0ZVBhcnRgcywgdGhlIGluZGV4IHRvIHNldFxuICogQHBhcmFtIGRpcmVjdGl2ZVBhcmVudCBVc2VkIGludGVybmFsbHk7IHNob3VsZCBub3QgYmUgc2V0IGJ5IHVzZXJcbiAqL1xuZXhwb3J0IGNvbnN0IHNldENoaWxkUGFydFZhbHVlID0gPFQgZXh0ZW5kcyBDaGlsZFBhcnQ+KFxuICBwYXJ0OiBULFxuICB2YWx1ZTogdW5rbm93bixcbiAgZGlyZWN0aXZlUGFyZW50OiBEaXJlY3RpdmVQYXJlbnQgPSBwYXJ0XG4pOiBUID0+IHtcbiAgcGFydC5fJHNldFZhbHVlKHZhbHVlLCBkaXJlY3RpdmVQYXJlbnQpO1xuICByZXR1cm4gcGFydDtcbn07XG5cbi8vIEEgc2VudGluZWwgdmFsdWUgdGhhdCBjYW4gbmV2ZXIgYXBwZWFyIGFzIGEgcGFydCB2YWx1ZSBleGNlcHQgd2hlbiBzZXQgYnlcbi8vIGxpdmUoKS4gVXNlZCB0byBmb3JjZSBhIGRpcnR5LWNoZWNrIHRvIGZhaWwgYW5kIGNhdXNlIGEgcmUtcmVuZGVyLlxuY29uc3QgUkVTRVRfVkFMVUUgPSB7fTtcblxuLyoqXG4gKiBTZXRzIHRoZSBjb21taXR0ZWQgdmFsdWUgb2YgYSBDaGlsZFBhcnQgZGlyZWN0bHkgd2l0aG91dCB0cmlnZ2VyaW5nIHRoZVxuICogY29tbWl0IHN0YWdlIG9mIHRoZSBwYXJ0LlxuICpcbiAqIFRoaXMgaXMgdXNlZnVsIGluIGNhc2VzIHdoZXJlIGEgZGlyZWN0aXZlIG5lZWRzIHRvIHVwZGF0ZSB0aGUgcGFydCBzdWNoXG4gKiB0aGF0IHRoZSBuZXh0IHVwZGF0ZSBkZXRlY3RzIGEgdmFsdWUgY2hhbmdlIG9yIG5vdC4gV2hlbiB2YWx1ZSBpcyBvbWl0dGVkLFxuICogdGhlIG5leHQgdXBkYXRlIHdpbGwgYmUgZ3VhcmFudGVlZCB0byBiZSBkZXRlY3RlZCBhcyBhIGNoYW5nZS5cbiAqXG4gKiBAcGFyYW0gcGFydFxuICogQHBhcmFtIHZhbHVlXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRDb21taXR0ZWRWYWx1ZSA9IChwYXJ0OiBQYXJ0LCB2YWx1ZTogdW5rbm93biA9IFJFU0VUX1ZBTFVFKSA9PlxuICAocGFydC5fJGNvbW1pdHRlZFZhbHVlID0gdmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbW1pdHRlZCB2YWx1ZSBvZiBhIENoaWxkUGFydC5cbiAqXG4gKiBUaGUgY29tbWl0dGVkIHZhbHVlIGlzIHVzZWQgZm9yIGNoYW5nZSBkZXRlY3Rpb24gYW5kIGVmZmljaWVudCB1cGRhdGVzIG9mXG4gKiB0aGUgcGFydC4gSXQgY2FuIGRpZmZlciBmcm9tIHRoZSB2YWx1ZSBzZXQgYnkgdGhlIHRlbXBsYXRlIG9yIGRpcmVjdGl2ZSBpblxuICogY2FzZXMgd2hlcmUgdGhlIHRlbXBsYXRlIHZhbHVlIGlzIHRyYW5zZm9ybWVkIGJlZm9yZSBiZWluZyBjb21taXR0ZWQuXG4gKlxuICogLSBgVGVtcGxhdGVSZXN1bHRgcyBhcmUgY29tbWl0dGVkIGFzIGEgYFRlbXBsYXRlSW5zdGFuY2VgXG4gKiAtIEl0ZXJhYmxlcyBhcmUgY29tbWl0dGVkIGFzIGBBcnJheTxDaGlsZFBhcnQ+YFxuICogLSBBbGwgb3RoZXIgdHlwZXMgYXJlIGNvbW1pdHRlZCBhcyB0aGUgdGVtcGxhdGUgdmFsdWUgb3IgdmFsdWUgcmV0dXJuZWQgb3JcbiAqICAgc2V0IGJ5IGEgZGlyZWN0aXZlLlxuICpcbiAqIEBwYXJhbSBwYXJ0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb21taXR0ZWRWYWx1ZSA9IChwYXJ0OiBDaGlsZFBhcnQpID0+IHBhcnQuXyRjb21taXR0ZWRWYWx1ZTtcblxuLyoqXG4gKiBSZW1vdmVzIGEgQ2hpbGRQYXJ0IGZyb20gdGhlIERPTSwgaW5jbHVkaW5nIGFueSBvZiBpdHMgY29udGVudC5cbiAqXG4gKiBAcGFyYW0gcGFydCBUaGUgUGFydCB0byByZW1vdmVcbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZVBhcnQgPSAocGFydDogQ2hpbGRQYXJ0KSA9PiB7XG4gIHBhcnQuXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZD8uKGZhbHNlLCB0cnVlKTtcbiAgbGV0IHN0YXJ0OiBDaGlsZE5vZGUgfCBudWxsID0gcGFydC5fJHN0YXJ0Tm9kZTtcbiAgY29uc3QgZW5kOiBDaGlsZE5vZGUgfCBudWxsID0gd3JhcChwYXJ0Ll8kZW5kTm9kZSEpLm5leHRTaWJsaW5nO1xuICB3aGlsZSAoc3RhcnQgIT09IGVuZCkge1xuICAgIGNvbnN0IG46IENoaWxkTm9kZSB8IG51bGwgPSB3cmFwKHN0YXJ0ISkubmV4dFNpYmxpbmc7XG4gICAgKHdyYXAoc3RhcnQhKSBhcyBDaGlsZE5vZGUpLnJlbW92ZSgpO1xuICAgIHN0YXJ0ID0gbjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNsZWFyUGFydCA9IChwYXJ0OiBDaGlsZFBhcnQpID0+IHtcbiAgcGFydC5fJGNsZWFyKCk7XG59O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG5pbXBvcnQge0Rpc2Nvbm5lY3RhYmxlLCBQYXJ0fSBmcm9tICcuL2xpdC1odG1sLmpzJztcblxuZXhwb3J0IHtcbiAgQXR0cmlidXRlUGFydCxcbiAgQm9vbGVhbkF0dHJpYnV0ZVBhcnQsXG4gIENoaWxkUGFydCxcbiAgRWxlbWVudFBhcnQsXG4gIEV2ZW50UGFydCxcbiAgUGFydCxcbiAgUHJvcGVydHlQYXJ0LFxufSBmcm9tICcuL2xpdC1odG1sLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmVDbGFzcyB7XG4gIG5ldyAocGFydDogUGFydEluZm8pOiBEaXJlY3RpdmU7XG59XG5cbi8qKlxuICogVGhpcyB1dGlsaXR5IHR5cGUgZXh0cmFjdHMgdGhlIHNpZ25hdHVyZSBvZiBhIGRpcmVjdGl2ZSBjbGFzcydzIHJlbmRlcigpXG4gKiBtZXRob2Qgc28gd2UgY2FuIHVzZSBpdCBmb3IgdGhlIHR5cGUgb2YgdGhlIGdlbmVyYXRlZCBkaXJlY3RpdmUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIERpcmVjdGl2ZVBhcmFtZXRlcnM8QyBleHRlbmRzIERpcmVjdGl2ZT4gPSBQYXJhbWV0ZXJzPENbJ3JlbmRlciddPjtcblxuLyoqXG4gKiBBIGdlbmVyYXRlZCBkaXJlY3RpdmUgZnVuY3Rpb24gZG9lc24ndCBldmFsdWF0ZSB0aGUgZGlyZWN0aXZlLCBidXQganVzdFxuICogcmV0dXJucyBhIERpcmVjdGl2ZVJlc3VsdCBvYmplY3QgdGhhdCBjYXB0dXJlcyB0aGUgYXJndW1lbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZVJlc3VsdDxDIGV4dGVuZHMgRGlyZWN0aXZlQ2xhc3MgPSBEaXJlY3RpdmVDbGFzcz4ge1xuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBbJ18kbGl0RGlyZWN0aXZlJCddOiBDO1xuICAvKiogQGludGVybmFsICovXG4gIHZhbHVlczogRGlyZWN0aXZlUGFyYW1ldGVyczxJbnN0YW5jZVR5cGU8Qz4+O1xufVxuXG5leHBvcnQgY29uc3QgUGFydFR5cGUgPSB7XG4gIEFUVFJJQlVURTogMSxcbiAgQ0hJTEQ6IDIsXG4gIFBST1BFUlRZOiAzLFxuICBCT09MRUFOX0FUVFJJQlVURTogNCxcbiAgRVZFTlQ6IDUsXG4gIEVMRU1FTlQ6IDYsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBQYXJ0VHlwZSA9ICh0eXBlb2YgUGFydFR5cGUpW2tleW9mIHR5cGVvZiBQYXJ0VHlwZV07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbGRQYXJ0SW5mbyB7XG4gIHJlYWRvbmx5IHR5cGU6IHR5cGVvZiBQYXJ0VHlwZS5DSElMRDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdHRyaWJ1dGVQYXJ0SW5mbyB7XG4gIHJlYWRvbmx5IHR5cGU6XG4gICAgfCB0eXBlb2YgUGFydFR5cGUuQVRUUklCVVRFXG4gICAgfCB0eXBlb2YgUGFydFR5cGUuUFJPUEVSVFlcbiAgICB8IHR5cGVvZiBQYXJ0VHlwZS5CT09MRUFOX0FUVFJJQlVURVxuICAgIHwgdHlwZW9mIFBhcnRUeXBlLkVWRU5UO1xuICByZWFkb25seSBzdHJpbmdzPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+O1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhZ05hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50UGFydEluZm8ge1xuICByZWFkb25seSB0eXBlOiB0eXBlb2YgUGFydFR5cGUuRUxFTUVOVDtcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFydCBhIGRpcmVjdGl2ZSBpcyBib3VuZCB0by5cbiAqXG4gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgY2hlY2tpbmcgdGhhdCBhIGRpcmVjdGl2ZSBpcyBhdHRhY2hlZCB0byBhIHZhbGlkIHBhcnQsXG4gKiBzdWNoIGFzIHdpdGggZGlyZWN0aXZlIHRoYXQgY2FuIG9ubHkgYmUgdXNlZCBvbiBhdHRyaWJ1dGUgYmluZGluZ3MuXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnRJbmZvID0gQ2hpbGRQYXJ0SW5mbyB8IEF0dHJpYnV0ZVBhcnRJbmZvIHwgRWxlbWVudFBhcnRJbmZvO1xuXG4vKipcbiAqIENyZWF0ZXMgYSB1c2VyLWZhY2luZyBkaXJlY3RpdmUgZnVuY3Rpb24gZnJvbSBhIERpcmVjdGl2ZSBjbGFzcy4gVGhpc1xuICogZnVuY3Rpb24gaGFzIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgdGhlIGRpcmVjdGl2ZSdzIHJlbmRlcigpIG1ldGhvZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGRpcmVjdGl2ZSA9XG4gIDxDIGV4dGVuZHMgRGlyZWN0aXZlQ2xhc3M+KGM6IEMpID0+XG4gICguLi52YWx1ZXM6IERpcmVjdGl2ZVBhcmFtZXRlcnM8SW5zdGFuY2VUeXBlPEM+Pik6IERpcmVjdGl2ZVJlc3VsdDxDPiA9PiAoe1xuICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgWydfJGxpdERpcmVjdGl2ZSQnXTogYyxcbiAgICB2YWx1ZXMsXG4gIH0pO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIGN1c3RvbSBkaXJlY3RpdmVzLiBVc2VycyBzaG91bGQgZXh0ZW5kIHRoaXMgY2xhc3MsXG4gKiBpbXBsZW1lbnQgYHJlbmRlcmAgYW5kL29yIGB1cGRhdGVgLCBhbmQgdGhlbiBwYXNzIHRoZWlyIHN1YmNsYXNzIHRvXG4gKiBgZGlyZWN0aXZlYC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERpcmVjdGl2ZSBpbXBsZW1lbnRzIERpc2Nvbm5lY3RhYmxlIHtcbiAgLy9AaW50ZXJuYWxcbiAgX19wYXJ0ITogUGFydDtcbiAgLy9AaW50ZXJuYWxcbiAgX19hdHRyaWJ1dGVJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvL0BpbnRlcm5hbFxuICBfX2RpcmVjdGl2ZT86IERpcmVjdGl2ZTtcblxuICAvL0BpbnRlcm5hbFxuICBfJHBhcmVudCE6IERpc2Nvbm5lY3RhYmxlO1xuXG4gIC8vIFRoZXNlIHdpbGwgb25seSBleGlzdCBvbiB0aGUgQXN5bmNEaXJlY3RpdmUgc3ViY2xhc3NcbiAgLy9AaW50ZXJuYWxcbiAgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuPzogU2V0PERpc2Nvbm5lY3RhYmxlPjtcbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgLy9AaW50ZXJuYWxcbiAgWydfJG5vdGlmeURpcmVjdGl2ZUNvbm5lY3Rpb25DaGFuZ2VkJ10/KGlzQ29ubmVjdGVkOiBib29sZWFuKTogdm9pZDtcblxuICBjb25zdHJ1Y3RvcihfcGFydEluZm86IFBhcnRJbmZvKSB7fVxuXG4gIC8vIFNlZSBjb21tZW50IGluIERpc2Nvbm5lY3RhYmxlIGludGVyZmFjZSBmb3Igd2h5IHRoaXMgaXMgYSBnZXR0ZXJcbiAgZ2V0IF8kaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuXyRwYXJlbnQuXyRpc0Nvbm5lY3RlZDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRpbml0aWFsaXplKFxuICAgIHBhcnQ6IFBhcnQsXG4gICAgcGFyZW50OiBEaXNjb25uZWN0YWJsZSxcbiAgICBhdHRyaWJ1dGVJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuX19wYXJ0ID0gcGFydDtcbiAgICB0aGlzLl8kcGFyZW50ID0gcGFyZW50O1xuICAgIHRoaXMuX19hdHRyaWJ1dGVJbmRleCA9IGF0dHJpYnV0ZUluZGV4O1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRyZXNvbHZlKHBhcnQ6IFBhcnQsIHByb3BzOiBBcnJheTx1bmtub3duPik6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZShwYXJ0LCBwcm9wcyk7XG4gIH1cblxuICBhYnN0cmFjdCByZW5kZXIoLi4ucHJvcHM6IEFycmF5PHVua25vd24+KTogdW5rbm93bjtcblxuICB1cGRhdGUoX3BhcnQ6IFBhcnQsIHByb3BzOiBBcnJheTx1bmtub3duPik6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLnJlbmRlciguLi5wcm9wcyk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBPdmVydmlldzpcbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyBkZXNpZ25lZCB0byBhZGQgc3VwcG9ydCBmb3IgYW4gYXN5bmMgYHNldFZhbHVlYCBBUEkgYW5kXG4gKiBgZGlzY29ubmVjdGVkYCBjYWxsYmFjayB0byBkaXJlY3RpdmVzIHdpdGggdGhlIGxlYXN0IGltcGFjdCBvbiB0aGUgY29yZVxuICogcnVudGltZSBvciBwYXlsb2FkIHdoZW4gdGhhdCBmZWF0dXJlIGlzIG5vdCB1c2VkLlxuICpcbiAqIFRoZSBzdHJhdGVneSBpcyB0byBpbnRyb2R1Y2UgYSBgQXN5bmNEaXJlY3RpdmVgIHN1YmNsYXNzIG9mXG4gKiBgRGlyZWN0aXZlYCB0aGF0IGNsaW1icyB0aGUgXCJwYXJlbnRcIiB0cmVlIGluIGl0cyBjb25zdHJ1Y3RvciB0byBub3RlIHdoaWNoXG4gKiBicmFuY2hlcyBvZiBsaXQtaHRtbCdzIFwibG9naWNhbCB0cmVlXCIgb2YgZGF0YSBzdHJ1Y3R1cmVzIGNvbnRhaW4gc3VjaFxuICogZGlyZWN0aXZlcyBhbmQgdGh1cyBuZWVkIHRvIGJlIGNyYXdsZWQgd2hlbiBhIHN1YnRyZWUgaXMgYmVpbmcgY2xlYXJlZCAob3JcbiAqIG1hbnVhbGx5IGRpc2Nvbm5lY3RlZCkgaW4gb3JkZXIgdG8gcnVuIHRoZSBgZGlzY29ubmVjdGVkYCBjYWxsYmFjay5cbiAqXG4gKiBUaGUgXCJub2Rlc1wiIG9mIHRoZSBsb2dpY2FsIHRyZWUgaW5jbHVkZSBQYXJ0cywgVGVtcGxhdGVJbnN0YW5jZXMgKGZvciB3aGVuIGFcbiAqIFRlbXBsYXRlUmVzdWx0IGlzIGNvbW1pdHRlZCB0byBhIHZhbHVlIG9mIGEgQ2hpbGRQYXJ0KSwgYW5kIERpcmVjdGl2ZXM7IHRoZXNlXG4gKiBhbGwgaW1wbGVtZW50IGEgY29tbW9uIGludGVyZmFjZSBjYWxsZWQgYERpc2Nvbm5lY3RhYmxlQ2hpbGRgLiBFYWNoIGhhcyBhXG4gKiBgXyRwYXJlbnRgIHJlZmVyZW5jZSB3aGljaCBpcyBzZXQgZHVyaW5nIGNvbnN0cnVjdGlvbiBpbiB0aGUgY29yZSBjb2RlLCBhbmQgYVxuICogYF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbmAgZmllbGQgd2hpY2ggaXMgaW5pdGlhbGx5IHVuZGVmaW5lZC5cbiAqXG4gKiBUaGUgc3BhcnNlIHRyZWUgY3JlYXRlZCBieSBtZWFucyBvZiB0aGUgYEFzeW5jRGlyZWN0aXZlYCBjb25zdHJ1Y3RvclxuICogY3Jhd2xpbmcgdXAgdGhlIGBfJHBhcmVudGAgdHJlZSBhbmQgcGxhY2luZyBhIGBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW5gIFNldFxuICogb24gZWFjaCBwYXJlbnQgdGhhdCBpbmNsdWRlcyBlYWNoIGNoaWxkIHRoYXQgY29udGFpbnMgYVxuICogYEFzeW5jRGlyZWN0aXZlYCBkaXJlY3RseSBvciB0cmFuc2l0aXZlbHkgdmlhIGl0cyBjaGlsZHJlbi4gSW4gb3JkZXIgdG9cbiAqIG5vdGlmeSBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZXMgYW5kIGRpc2Nvbm5lY3QgKG9yIHJlY29ubmVjdCkgYSB0cmVlLCB0aGVcbiAqIGBfJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkYCBBUEkgaXMgcGF0Y2hlZCBvbnRvIENoaWxkUGFydHMgYXMgYSBkaXJlY3RpdmVcbiAqIGNsaW1icyB0aGUgcGFyZW50IHRyZWUsIHdoaWNoIGlzIGNhbGxlZCBieSB0aGUgY29yZSB3aGVuIGNsZWFyaW5nIGEgcGFydCBpZlxuICogaXQgZXhpc3RzLiBXaGVuIGNhbGxlZCwgdGhhdCBtZXRob2QgaXRlcmF0ZXMgb3ZlciB0aGUgc3BhcnNlIHRyZWUgb2ZcbiAqIFNldDxEaXNjb25uZWN0YWJsZUNoaWxkcmVuPiBidWlsdCB1cCBieSBBc3luY0RpcmVjdGl2ZXMsIGFuZCBjYWxsc1xuICogYF8kbm90aWZ5RGlyZWN0aXZlQ29ubmVjdGlvbkNoYW5nZWRgIG9uIGFueSBkaXJlY3RpdmVzIHRoYXQgYXJlIGVuY291bnRlcmVkXG4gKiBpbiB0aGF0IHRyZWUsIHJ1bm5pbmcgdGhlIHJlcXVpcmVkIGNhbGxiYWNrcy5cbiAqXG4gKiBBIGdpdmVuIFwibG9naWNhbCB0cmVlXCIgb2YgbGl0LWh0bWwgZGF0YS1zdHJ1Y3R1cmVzIG1pZ2h0IGxvb2sgbGlrZSB0aGlzOlxuICpcbiAqICBDaGlsZFBhcnQoTjEpIF8kZEM9W0QyLFQzXVxuICogICAuX2RpcmVjdGl2ZVxuICogICAgIEFzeW5jRGlyZWN0aXZlKEQyKVxuICogICAuX3ZhbHVlIC8vIHVzZXIgdmFsdWUgd2FzIFRlbXBsYXRlUmVzdWx0XG4gKiAgICAgVGVtcGxhdGVJbnN0YW5jZShUMykgXyRkQz1bQTQsQTYsTjEwLE4xMl1cbiAqICAgICAgLl8kcGFydHNbXVxuICogICAgICAgIEF0dHJpYnV0ZVBhcnQoQTQpIF8kZEM9W0Q1XVxuICogICAgICAgICAuX2RpcmVjdGl2ZXNbXVxuICogICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQ1KVxuICogICAgICAgIEF0dHJpYnV0ZVBhcnQoQTYpIF8kZEM9W0Q3LEQ4XVxuICogICAgICAgICAuX2RpcmVjdGl2ZXNbXVxuICogICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQ3KVxuICogICAgICAgICAgIERpcmVjdGl2ZShEOCkgXyRkQz1bRDldXG4gKiAgICAgICAgICAgIC5fZGlyZWN0aXZlXG4gKiAgICAgICAgICAgICAgQXN5bmNEaXJlY3RpdmUoRDkpXG4gKiAgICAgICAgQ2hpbGRQYXJ0KE4xMCkgXyRkQz1bRDExXVxuICogICAgICAgICAuX2RpcmVjdGl2ZVxuICogICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQxMSlcbiAqICAgICAgICAgLl92YWx1ZVxuICogICAgICAgICAgIHN0cmluZ1xuICogICAgICAgIENoaWxkUGFydChOMTIpIF8kZEM9W0QxMyxOMTQsTjE2XVxuICogICAgICAgICAuX2RpcmVjdGl2ZVxuICogICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQxMylcbiAqICAgICAgICAgLl92YWx1ZSAvLyB1c2VyIHZhbHVlIHdhcyBpdGVyYWJsZVxuICogICAgICAgICAgIEFycmF5PENoaWxkUGFydD5cbiAqICAgICAgICAgICAgIENoaWxkUGFydChOMTQpIF8kZEM9W0QxNV1cbiAqICAgICAgICAgICAgICAuX3ZhbHVlXG4gKiAgICAgICAgICAgICAgICBzdHJpbmdcbiAqICAgICAgICAgICAgIENoaWxkUGFydChOMTYpIF8kZEM9W0QxNyxUMThdXG4gKiAgICAgICAgICAgICAgLl9kaXJlY3RpdmVcbiAqICAgICAgICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQxNylcbiAqICAgICAgICAgICAgICAuX3ZhbHVlIC8vIHVzZXIgdmFsdWUgd2FzIFRlbXBsYXRlUmVzdWx0XG4gKiAgICAgICAgICAgICAgICBUZW1wbGF0ZUluc3RhbmNlKFQxOCkgXyRkQz1bQTE5LEEyMSxOMjVdXG4gKiAgICAgICAgICAgICAgICAgLl8kcGFydHNbXVxuICogICAgICAgICAgICAgICAgICAgQXR0cmlidXRlUGFydChBMTkpIF8kZEM9W0QyMF1cbiAqICAgICAgICAgICAgICAgICAgICAuX2RpcmVjdGl2ZXNbXVxuICogICAgICAgICAgICAgICAgICAgICAgQXN5bmNEaXJlY3RpdmUoRDIwKVxuICogICAgICAgICAgICAgICAgICAgQXR0cmlidXRlUGFydChBMjEpIF8kZEM9WzIyLDIzXVxuICogICAgICAgICAgICAgICAgICAgIC5fZGlyZWN0aXZlc1tdXG4gKiAgICAgICAgICAgICAgICAgICAgICBBc3luY0RpcmVjdGl2ZShEMjIpXG4gKiAgICAgICAgICAgICAgICAgICAgICBEaXJlY3RpdmUoRDIzKSBfJGRDPVtEMjRdXG4gKiAgICAgICAgICAgICAgICAgICAgICAgLl9kaXJlY3RpdmVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQyNClcbiAqICAgICAgICAgICAgICAgICAgIENoaWxkUGFydChOMjUpIF8kZEM9W0QyNl1cbiAqICAgICAgICAgICAgICAgICAgICAuX2RpcmVjdGl2ZVxuICogICAgICAgICAgICAgICAgICAgICAgQXN5bmNEaXJlY3RpdmUoRDI2KVxuICogICAgICAgICAgICAgICAgICAgIC5fdmFsdWVcbiAqICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1xuICpcbiAqIEV4YW1wbGUgMTogVGhlIGRpcmVjdGl2ZSBpbiBDaGlsZFBhcnQoTjEyKSB1cGRhdGVzIGFuZCByZXR1cm5zIGBub3RoaW5nYC4gVGhlXG4gKiBDaGlsZFBhcnQgd2lsbCBfY2xlYXIoKSBpdHNlbGYsIGFuZCBzbyB3ZSBuZWVkIHRvIGRpc2Nvbm5lY3QgdGhlIFwidmFsdWVcIiBvZlxuICogdGhlIENoaWxkUGFydCAoYnV0IG5vdCBpdHMgZGlyZWN0aXZlKS4gSW4gdGhpcyBjYXNlLCB3aGVuIGBfY2xlYXIoKWAgY2FsbHNcbiAqIGBfJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkKClgLCB3ZSBkb24ndCBpdGVyYXRlIGFsbCBvZiB0aGVcbiAqIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiwgcmF0aGVyIHdlIGRvIGEgdmFsdWUtc3BlY2lmaWMgZGlzY29ubmVjdGlvbjogaS5lLlxuICogc2luY2UgdGhlIF92YWx1ZSB3YXMgYW4gQXJyYXk8Q2hpbGRQYXJ0PiAoYmVjYXVzZSBhbiBpdGVyYWJsZSBoYWQgYmVlblxuICogY29tbWl0dGVkKSwgd2UgaXRlcmF0ZSB0aGUgYXJyYXkgb2YgQ2hpbGRQYXJ0cyAoTjE0LCBOMTYpIGFuZCBydW5cbiAqIGBzZXRDb25uZWN0ZWRgIG9uIHRoZW0gKHdoaWNoIGRvZXMgcmVjdXJzZSBkb3duIHRoZSBmdWxsIHRyZWUgb2ZcbiAqIGBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW5gIGJlbG93IGl0LCBhbmQgYWxzbyByZW1vdmVzIE4xNCBhbmQgTjE2IGZyb20gTjEyJ3NcbiAqIGBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW5gKS4gT25jZSB0aGUgdmFsdWVzIGhhdmUgYmVlbiBkaXNjb25uZWN0ZWQsIHdlIHRoZW5cbiAqIGNoZWNrIHdoZXRoZXIgdGhlIENoaWxkUGFydChOMTIpJ3MgbGlzdCBvZiBgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuYCBpcyBlbXB0eVxuICogKGFuZCB3b3VsZCByZW1vdmUgaXQgZnJvbSBpdHMgcGFyZW50IFRlbXBsYXRlSW5zdGFuY2UoVDMpIGlmIHNvKSwgYnV0IHNpbmNlXG4gKiBpdCB3b3VsZCBzdGlsbCBjb250YWluIGl0cyBkaXJlY3RpdmUgRDEzLCBpdCBzdGF5cyBpbiB0aGUgZGlzY29ubmVjdGFibGVcbiAqIHRyZWUuXG4gKlxuICogRXhhbXBsZSAyOiBJbiB0aGUgY291cnNlIG9mIEV4YW1wbGUgMSwgYHNldENvbm5lY3RlZGAgd2lsbCByZWFjaFxuICogQ2hpbGRQYXJ0KE4xNik7IGluIHRoaXMgY2FzZSB0aGUgZW50aXJlIHBhcnQgaXMgYmVpbmcgZGlzY29ubmVjdGVkLCBzbyB3ZVxuICogc2ltcGx5IGl0ZXJhdGUgYWxsIG9mIE4xNidzIGBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW5gIChEMTcsVDE4KSBhbmRcbiAqIHJlY3Vyc2l2ZWx5IHJ1biBgc2V0Q29ubmVjdGVkYCBvbiB0aGVtLiBOb3RlIHRoYXQgd2Ugb25seSByZW1vdmUgY2hpbGRyZW5cbiAqIGZyb20gYF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbmAgZm9yIHRoZSB0b3AtbGV2ZWwgdmFsdWVzIGJlaW5nIGRpc2Nvbm5lY3RlZFxuICogb24gYSBjbGVhcjsgZG9pbmcgdGhpcyBib29ra2VlcGluZyBsb3dlciBpbiB0aGUgdHJlZSBpcyB3YXN0ZWZ1bCBzaW5jZSBpdCdzXG4gKiBhbGwgYmVpbmcgdGhyb3duIGF3YXkuXG4gKlxuICogRXhhbXBsZSAzOiBJZiB0aGUgTGl0RWxlbWVudCBjb250YWluaW5nIHRoZSBlbnRpcmUgdHJlZSBhYm92ZSBiZWNvbWVzXG4gKiBkaXNjb25uZWN0ZWQsIGl0IHdpbGwgcnVuIGBjaGlsZFBhcnQuc2V0Q29ubmVjdGVkKClgICh3aGljaCBjYWxsc1xuICogYGNoaWxkUGFydC5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkKClgIGlmIGl0IGV4aXN0cyk7IGluIHRoaXMgY2FzZSwgd2VcbiAqIHJlY3Vyc2l2ZWx5IHJ1biBgc2V0Q29ubmVjdGVkKClgIG92ZXIgdGhlIGVudGlyZSB0cmVlLCB3aXRob3V0IHJlbW92aW5nIGFueVxuICogY2hpbGRyZW4gZnJvbSBgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuYCwgc2luY2UgdGhpcyB0cmVlIGlzIHJlcXVpcmVkIHRvXG4gKiByZS1jb25uZWN0IHRoZSB0cmVlLCB3aGljaCBkb2VzIHRoZSBzYW1lIG9wZXJhdGlvbiwgc2ltcGx5IHBhc3NpbmdcbiAqIGBpc0Nvbm5lY3RlZDogdHJ1ZWAgZG93biB0aGUgdHJlZSwgc2lnbmFsaW5nIHdoaWNoIGNhbGxiYWNrIHRvIHJ1bi5cbiAqL1xuXG5pbXBvcnQge0F0dHJpYnV0ZVBhcnQsIENoaWxkUGFydCwgRGlzY29ubmVjdGFibGUsIFBhcnR9IGZyb20gJy4vbGl0LWh0bWwuanMnO1xuaW1wb3J0IHtpc1NpbmdsZUV4cHJlc3Npb259IGZyb20gJy4vZGlyZWN0aXZlLWhlbHBlcnMuanMnO1xuaW1wb3J0IHtEaXJlY3RpdmUsIFBhcnRJbmZvLCBQYXJ0VHlwZX0gZnJvbSAnLi9kaXJlY3RpdmUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9kaXJlY3RpdmUuanMnO1xuXG5jb25zdCBERVZfTU9ERSA9IHRydWU7XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgd2Fsa3MgZG93biB0aGUgdHJlZSBvZiBQYXJ0cy9UZW1wbGF0ZUluc3RhbmNlcy9EaXJlY3RpdmVzIHRvIHNldFxuICogdGhlIGNvbm5lY3RlZCBzdGF0ZSBvZiBkaXJlY3RpdmVzIGFuZCBydW4gYGRpc2Nvbm5lY3RlZGAvIGByZWNvbm5lY3RlZGBcbiAqIGNhbGxiYWNrcy5cbiAqXG4gKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgd2VyZSBjaGlsZHJlbiB0byBkaXNjb25uZWN0OyBmYWxzZSBvdGhlcndpc2VcbiAqL1xuY29uc3Qgbm90aWZ5Q2hpbGRyZW5Db25uZWN0ZWRDaGFuZ2VkID0gKFxuICBwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlLFxuICBpc0Nvbm5lY3RlZDogYm9vbGVhblxuKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGNoaWxkcmVuID0gcGFyZW50Ll8kZGlzY29ubmVjdGFibGVDaGlsZHJlbjtcbiAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChjb25zdCBvYmogb2YgY2hpbGRyZW4pIHtcbiAgICAvLyBUaGUgZXhpc3RlbmNlIG9mIGBfJG5vdGlmeURpcmVjdGl2ZUNvbm5lY3Rpb25DaGFuZ2VkYCBpcyB1c2VkIGFzIGEgXCJicmFuZFwiIHRvXG4gICAgLy8gZGlzYW1iaWd1YXRlIEFzeW5jRGlyZWN0aXZlcyBmcm9tIG90aGVyIERpc2Nvbm5lY3RhYmxlQ2hpbGRyZW5cbiAgICAvLyAoYXMgb3Bwb3NlZCB0byB1c2luZyBhbiBpbnN0YW5jZW9mIGNoZWNrIHRvIGtub3cgd2hlbiB0byBjYWxsIGl0KTsgdGhlXG4gICAgLy8gcmVkdW5kYW5jeSBvZiBcIkRpcmVjdGl2ZVwiIGluIHRoZSBBUEkgbmFtZSBpcyB0byBhdm9pZCBjb25mbGljdGluZyB3aXRoXG4gICAgLy8gYF8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWRgLCB3aGljaCBleGlzdHMgYENoaWxkUGFydHNgIHdoaWNoIGFyZSBhbHNvIGluXG4gICAgLy8gdGhpcyBsaXN0XG4gICAgLy8gRGlzY29ubmVjdCBEaXJlY3RpdmUgKGFuZCBhbnkgbmVzdGVkIGRpcmVjdGl2ZXMgY29udGFpbmVkIHdpdGhpbilcbiAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgIChvYmogYXMgQXN5bmNEaXJlY3RpdmUpWydfJG5vdGlmeURpcmVjdGl2ZUNvbm5lY3Rpb25DaGFuZ2VkJ10/LihcbiAgICAgIGlzQ29ubmVjdGVkLFxuICAgICAgZmFsc2VcbiAgICApO1xuICAgIC8vIERpc2Nvbm5lY3QgUGFydC9UZW1wbGF0ZUluc3RhbmNlXG4gICAgbm90aWZ5Q2hpbGRyZW5Db25uZWN0ZWRDaGFuZ2VkKG9iaiwgaXNDb25uZWN0ZWQpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBnaXZlbiBjaGlsZCBmcm9tIGl0cyBwYXJlbnQgbGlzdCBvZiBkaXNjb25uZWN0YWJsZSBjaGlsZHJlbiwgYW5kXG4gKiBpZiB0aGUgcGFyZW50IGxpc3QgYmVjb21lcyBlbXB0eSBhcyBhIHJlc3VsdCwgcmVtb3ZlcyB0aGUgcGFyZW50IGZyb20gaXRzXG4gKiBwYXJlbnQsIGFuZCBzbyBmb3J0aCB1cCB0aGUgdHJlZSB3aGVuIHRoYXQgY2F1c2VzIHN1YnNlcXVlbnQgcGFyZW50IGxpc3RzIHRvXG4gKiBiZWNvbWUgZW1wdHkuXG4gKi9cbmNvbnN0IHJlbW92ZURpc2Nvbm5lY3RhYmxlRnJvbVBhcmVudCA9IChvYmo6IERpc2Nvbm5lY3RhYmxlKSA9PiB7XG4gIGxldCBwYXJlbnQsIGNoaWxkcmVuO1xuICBkbyB7XG4gICAgaWYgKChwYXJlbnQgPSBvYmouXyRwYXJlbnQpID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjaGlsZHJlbiA9IHBhcmVudC5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4hO1xuICAgIGNoaWxkcmVuLmRlbGV0ZShvYmopO1xuICAgIG9iaiA9IHBhcmVudDtcbiAgfSB3aGlsZSAoY2hpbGRyZW4/LnNpemUgPT09IDApO1xufTtcblxuY29uc3QgYWRkRGlzY29ubmVjdGFibGVUb1BhcmVudCA9IChvYmo6IERpc2Nvbm5lY3RhYmxlKSA9PiB7XG4gIC8vIENsaW1iIHRoZSBwYXJlbnQgdHJlZSwgY3JlYXRpbmcgYSBzcGFyc2UgdHJlZSBvZiBjaGlsZHJlbiBuZWVkaW5nXG4gIC8vIGRpc2Nvbm5lY3Rpb25cbiAgZm9yIChsZXQgcGFyZW50OyAocGFyZW50ID0gb2JqLl8kcGFyZW50KTsgb2JqID0gcGFyZW50KSB7XG4gICAgbGV0IGNoaWxkcmVuID0gcGFyZW50Ll8kZGlzY29ubmVjdGFibGVDaGlsZHJlbjtcbiAgICBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyZW50Ll8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiA9IGNoaWxkcmVuID0gbmV3IFNldCgpO1xuICAgIH0gZWxzZSBpZiAoY2hpbGRyZW4uaGFzKG9iaikpIHtcbiAgICAgIC8vIE9uY2Ugd2UndmUgcmVhY2hlZCBhIHBhcmVudCB0aGF0IGFscmVhZHkgY29udGFpbnMgdGhpcyBjaGlsZCwgd2VcbiAgICAgIC8vIGNhbiBzaG9ydC1jaXJjdWl0XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2hpbGRyZW4uYWRkKG9iaik7XG4gICAgaW5zdGFsbERpc2Nvbm5lY3RBUEkocGFyZW50KTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGFuZ2VzIHRoZSBwYXJlbnQgcmVmZXJlbmNlIG9mIHRoZSBDaGlsZFBhcnQsIGFuZCB1cGRhdGVzIHRoZSBzcGFyc2UgdHJlZSBvZlxuICogRGlzY29ubmVjdGFibGUgY2hpbGRyZW4gYWNjb3JkaW5nbHkuXG4gKlxuICogTm90ZSwgdGhpcyBtZXRob2Qgd2lsbCBiZSBwYXRjaGVkIG9udG8gQ2hpbGRQYXJ0IGluc3RhbmNlcyBhbmQgY2FsbGVkIGZyb21cbiAqIHRoZSBjb3JlIGNvZGUgd2hlbiBwYXJ0cyBhcmUgbW92ZWQgYmV0d2VlbiBkaWZmZXJlbnQgcGFyZW50cy5cbiAqL1xuZnVuY3Rpb24gcmVwYXJlbnREaXNjb25uZWN0YWJsZXModGhpczogQ2hpbGRQYXJ0LCBuZXdQYXJlbnQ6IERpc2Nvbm5lY3RhYmxlKSB7XG4gIGlmICh0aGlzLl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50KHRoaXMpO1xuICAgIHRoaXMuXyRwYXJlbnQgPSBuZXdQYXJlbnQ7XG4gICAgYWRkRGlzY29ubmVjdGFibGVUb1BhcmVudCh0aGlzKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl8kcGFyZW50ID0gbmV3UGFyZW50O1xuICB9XG59XG5cbi8qKlxuICogU2V0cyB0aGUgY29ubmVjdGVkIHN0YXRlIG9uIGFueSBkaXJlY3RpdmVzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGNvbW1pdHRlZFxuICogdmFsdWUgb2YgdGhpcyBwYXJ0IChpLmUuIHdpdGhpbiBhIFRlbXBsYXRlSW5zdGFuY2Ugb3IgaXRlcmFibGUgb2ZcbiAqIENoaWxkUGFydHMpIGFuZCBydW5zIHRoZWlyIGBkaXNjb25uZWN0ZWRgL2ByZWNvbm5lY3RlZGBzLCBhcyB3ZWxsIGFzIHdpdGhpblxuICogYW55IGRpcmVjdGl2ZXMgc3RvcmVkIG9uIHRoZSBDaGlsZFBhcnQgKHdoZW4gYHZhbHVlT25seWAgaXMgZmFsc2UpLlxuICpcbiAqIGBpc0NsZWFyaW5nVmFsdWVgIHNob3VsZCBiZSBwYXNzZWQgYXMgYHRydWVgIG9uIGEgdG9wLWxldmVsIHBhcnQgdGhhdCBpc1xuICogY2xlYXJpbmcgaXRzZWxmLCBhbmQgbm90IGFzIGEgcmVzdWx0IG9mIHJlY3Vyc2l2ZWx5IGRpc2Nvbm5lY3RpbmcgZGlyZWN0aXZlc1xuICogYXMgcGFydCBvZiBhIGBjbGVhcmAgb3BlcmF0aW9uIGhpZ2hlciB1cCB0aGUgdHJlZS4gVGhpcyBib3RoIGVuc3VyZXMgdGhhdCBhbnlcbiAqIGRpcmVjdGl2ZSBvbiB0aGlzIENoaWxkUGFydCB0aGF0IHByb2R1Y2VkIGEgdmFsdWUgdGhhdCBjYXVzZWQgdGhlIGNsZWFyXG4gKiBvcGVyYXRpb24gaXMgbm90IGRpc2Nvbm5lY3RlZCwgYW5kIGFsc28gc2VydmVzIGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uXG4gKiB0byBhdm9pZCBuZWVkbGVzcyBib29ra2VlcGluZyB3aGVuIGEgc3VidHJlZSBpcyBnb2luZyBhd2F5OyB3aGVuIGNsZWFyaW5nIGFcbiAqIHN1YnRyZWUsIG9ubHkgdGhlIHRvcC1tb3N0IHBhcnQgbmVlZCB0byByZW1vdmUgaXRzZWxmIGZyb20gdGhlIHBhcmVudC5cbiAqXG4gKiBgZnJvbVBhcnRJbmRleGAgaXMgcGFzc2VkIG9ubHkgaW4gdGhlIGNhc2Ugb2YgYSBwYXJ0aWFsIGBfY2xlYXJgIHJ1bm5pbmcgYXMgYVxuICogcmVzdWx0IG9mIHRydW5jYXRpbmcgYW4gaXRlcmFibGUuXG4gKlxuICogTm90ZSwgdGhpcyBtZXRob2Qgd2lsbCBiZSBwYXRjaGVkIG9udG8gQ2hpbGRQYXJ0IGluc3RhbmNlcyBhbmQgY2FsbGVkIGZyb20gdGhlXG4gKiBjb3JlIGNvZGUgd2hlbiBwYXJ0cyBhcmUgY2xlYXJlZCBvciB0aGUgY29ubmVjdGlvbiBzdGF0ZSBpcyBjaGFuZ2VkIGJ5IHRoZVxuICogdXNlci5cbiAqL1xuZnVuY3Rpb24gbm90aWZ5Q2hpbGRQYXJ0Q29ubmVjdGVkQ2hhbmdlZChcbiAgdGhpczogQ2hpbGRQYXJ0LFxuICBpc0Nvbm5lY3RlZDogYm9vbGVhbixcbiAgaXNDbGVhcmluZ1ZhbHVlID0gZmFsc2UsXG4gIGZyb21QYXJ0SW5kZXggPSAwXG4pIHtcbiAgY29uc3QgdmFsdWUgPSB0aGlzLl8kY29tbWl0dGVkVmFsdWU7XG4gIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW47XG4gIGlmIChjaGlsZHJlbiA9PT0gdW5kZWZpbmVkIHx8IGNoaWxkcmVuLnNpemUgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGlzQ2xlYXJpbmdWYWx1ZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgLy8gSXRlcmFibGUgY2FzZTogQW55IENoaWxkUGFydHMgY3JlYXRlZCBieSB0aGUgaXRlcmFibGUgc2hvdWxkIGJlXG4gICAgICAvLyBkaXNjb25uZWN0ZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGlzIENoaWxkUGFydCdzIGRpc2Nvbm5lY3RhYmxlXG4gICAgICAvLyBjaGlsZHJlbiAoc3RhcnRpbmcgYXQgYGZyb21QYXJ0SW5kZXhgIGluIHRoZSBjYXNlIG9mIHRydW5jYXRpb24pXG4gICAgICBmb3IgKGxldCBpID0gZnJvbVBhcnRJbmRleDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5vdGlmeUNoaWxkcmVuQ29ubmVjdGVkQ2hhbmdlZCh2YWx1ZVtpXSwgZmFsc2UpO1xuICAgICAgICByZW1vdmVEaXNjb25uZWN0YWJsZUZyb21QYXJlbnQodmFsdWVbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgLy8gVGVtcGxhdGVJbnN0YW5jZSBjYXNlOiBJZiB0aGUgdmFsdWUgaGFzIGRpc2Nvbm5lY3RhYmxlIGNoaWxkcmVuICh3aWxsXG4gICAgICAvLyBvbmx5IGJlIGluIHRoZSBjYXNlIHRoYXQgaXQgaXMgYSBUZW1wbGF0ZUluc3RhbmNlKSwgd2UgZGlzY29ubmVjdCBpdFxuICAgICAgLy8gYW5kIHJlbW92ZSBpdCBmcm9tIHRoaXMgQ2hpbGRQYXJ0J3MgZGlzY29ubmVjdGFibGUgY2hpbGRyZW5cbiAgICAgIG5vdGlmeUNoaWxkcmVuQ29ubmVjdGVkQ2hhbmdlZCh2YWx1ZSBhcyBEaXNjb25uZWN0YWJsZSwgZmFsc2UpO1xuICAgICAgcmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50KHZhbHVlIGFzIERpc2Nvbm5lY3RhYmxlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5Q2hpbGRyZW5Db25uZWN0ZWRDaGFuZ2VkKHRoaXMsIGlzQ29ubmVjdGVkKTtcbiAgfVxufVxuXG4vKipcbiAqIFBhdGNoZXMgZGlzY29ubmVjdGlvbiBBUEkgb250byBDaGlsZFBhcnRzLlxuICovXG5jb25zdCBpbnN0YWxsRGlzY29ubmVjdEFQSSA9IChvYmo6IERpc2Nvbm5lY3RhYmxlKSA9PiB7XG4gIGlmICgob2JqIGFzIENoaWxkUGFydCkudHlwZSA9PSBQYXJ0VHlwZS5DSElMRCkge1xuICAgIChvYmogYXMgQ2hpbGRQYXJ0KS5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkID8/PVxuICAgICAgbm90aWZ5Q2hpbGRQYXJ0Q29ubmVjdGVkQ2hhbmdlZDtcbiAgICAob2JqIGFzIENoaWxkUGFydCkuXyRyZXBhcmVudERpc2Nvbm5lY3RhYmxlcyA/Pz0gcmVwYXJlbnREaXNjb25uZWN0YWJsZXM7XG4gIH1cbn07XG5cbi8qKlxuICogQW4gYWJzdHJhY3QgYERpcmVjdGl2ZWAgYmFzZSBjbGFzcyB3aG9zZSBgZGlzY29ubmVjdGVkYCBtZXRob2Qgd2lsbCBiZVxuICogY2FsbGVkIHdoZW4gdGhlIHBhcnQgY29udGFpbmluZyB0aGUgZGlyZWN0aXZlIGlzIGNsZWFyZWQgYXMgYSByZXN1bHQgb2ZcbiAqIHJlLXJlbmRlcmluZywgb3Igd2hlbiB0aGUgdXNlciBjYWxscyBgcGFydC5zZXRDb25uZWN0ZWQoZmFsc2UpYCBvblxuICogYSBwYXJ0IHRoYXQgd2FzIHByZXZpb3VzbHkgcmVuZGVyZWQgY29udGFpbmluZyB0aGUgZGlyZWN0aXZlIChhcyBoYXBwZW5zXG4gKiB3aGVuIGUuZy4gYSBMaXRFbGVtZW50IGRpc2Nvbm5lY3RzIGZyb20gdGhlIERPTSkuXG4gKlxuICogSWYgYHBhcnQuc2V0Q29ubmVjdGVkKHRydWUpYCBpcyBzdWJzZXF1ZW50bHkgY2FsbGVkIG9uIGFcbiAqIGNvbnRhaW5pbmcgcGFydCwgdGhlIGRpcmVjdGl2ZSdzIGByZWNvbm5lY3RlZGAgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHByaW9yXG4gKiB0byBpdHMgbmV4dCBgdXBkYXRlYC9gcmVuZGVyYCBjYWxsYmFja3MuIFdoZW4gaW1wbGVtZW50aW5nIGBkaXNjb25uZWN0ZWRgLFxuICogYHJlY29ubmVjdGVkYCBzaG91bGQgYWxzbyBiZSBpbXBsZW1lbnRlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggcmVjb25uZWN0aW9uLlxuICpcbiAqIE5vdGUgdGhhdCB1cGRhdGVzIG1heSBvY2N1ciB3aGlsZSB0aGUgZGlyZWN0aXZlIGlzIGRpc2Nvbm5lY3RlZC4gQXMgc3VjaCxcbiAqIGRpcmVjdGl2ZXMgc2hvdWxkIGdlbmVyYWxseSBjaGVjayB0aGUgYHRoaXMuaXNDb25uZWN0ZWRgIGZsYWcgZHVyaW5nXG4gKiByZW5kZXIvdXBkYXRlIHRvIGRldGVybWluZSB3aGV0aGVyIGl0IGlzIHNhZmUgdG8gc3Vic2NyaWJlIHRvIHJlc291cmNlc1xuICogdGhhdCBtYXkgcHJldmVudCBnYXJiYWdlIGNvbGxlY3Rpb24uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBc3luY0RpcmVjdGl2ZSBleHRlbmRzIERpcmVjdGl2ZSB7XG4gIC8vIEFzIG9wcG9zZWQgdG8gb3RoZXIgRGlzY29ubmVjdGFibGVzLCBBc3luY0RpcmVjdGl2ZXMgYWx3YXlzIGdldCBub3RpZmllZFxuICAvLyB3aGVuIHRoZSBSb290UGFydCBjb25uZWN0aW9uIGNoYW5nZXMsIHNvIHRoZSBwdWJsaWMgYGlzQ29ubmVjdGVkYFxuICAvLyBpcyBhIGxvY2FsbHkgc3RvcmVkIHZhcmlhYmxlIGluaXRpYWxpemVkIHZpYSBpdHMgcGFydCdzIGdldHRlciBhbmQgc3luY2VkXG4gIC8vIHZpYSBgXyRub3RpZnlEaXJlY3RpdmVDb25uZWN0aW9uQ2hhbmdlZGAuIFRoaXMgaXMgY2hlYXBlciB0aGFuIHVzaW5nXG4gIC8vIHRoZSBfJGlzQ29ubmVjdGVkIGdldHRlciwgd2hpY2ggaGFzIHRvIGxvb2sgYmFjayB1cCB0aGUgdHJlZSBlYWNoIHRpbWUuXG4gIC8qKlxuICAgKiBUaGUgY29ubmVjdGlvbiBzdGF0ZSBmb3IgdGhpcyBEaXJlY3RpdmUuXG4gICAqL1xuICBpc0Nvbm5lY3RlZCE6IGJvb2xlYW47XG5cbiAgLy8gQGludGVybmFsXG4gIG92ZXJyaWRlIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbj86IFNldDxEaXNjb25uZWN0YWJsZT4gPSB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBwYXJ0IHdpdGggaW50ZXJuYWwgZmllbGRzXG4gICAqIEBwYXJhbSBwYXJ0XG4gICAqIEBwYXJhbSBwYXJlbnRcbiAgICogQHBhcmFtIGF0dHJpYnV0ZUluZGV4XG4gICAqL1xuICBvdmVycmlkZSBfJGluaXRpYWxpemUoXG4gICAgcGFydDogUGFydCxcbiAgICBwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlLFxuICAgIGF0dHJpYnV0ZUluZGV4OiBudW1iZXIgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgc3VwZXIuXyRpbml0aWFsaXplKHBhcnQsIHBhcmVudCwgYXR0cmlidXRlSW5kZXgpO1xuICAgIGFkZERpc2Nvbm5lY3RhYmxlVG9QYXJlbnQodGhpcyk7XG4gICAgdGhpcy5pc0Nvbm5lY3RlZCA9IHBhcnQuXyRpc0Nvbm5lY3RlZDtcbiAgfVxuICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAvKipcbiAgICogQ2FsbGVkIGZyb20gdGhlIGNvcmUgY29kZSB3aGVuIGEgZGlyZWN0aXZlIGlzIGdvaW5nIGF3YXkgZnJvbSBhIHBhcnQgKGluXG4gICAqIHdoaWNoIGNhc2UgYHNob3VsZFJlbW92ZUZyb21QYXJlbnRgIHNob3VsZCBiZSB0cnVlKSwgYW5kIGZyb20gdGhlXG4gICAqIGBzZXRDaGlsZHJlbkNvbm5lY3RlZGAgaGVscGVyIGZ1bmN0aW9uIHdoZW4gcmVjdXJzaXZlbHkgY2hhbmdpbmcgdGhlXG4gICAqIGNvbm5lY3Rpb24gc3RhdGUgb2YgYSB0cmVlIChpbiB3aGljaCBjYXNlIGBzaG91bGRSZW1vdmVGcm9tUGFyZW50YCBzaG91bGRcbiAgICogYmUgZmFsc2UpLlxuICAgKlxuICAgKiBAcGFyYW0gaXNDb25uZWN0ZWRcbiAgICogQHBhcmFtIGlzQ2xlYXJpbmdEaXJlY3RpdmUgLSBUcnVlIHdoZW4gdGhlIGRpcmVjdGl2ZSBpdHNlbGYgaXMgYmVpbmdcbiAgICogICAgIHJlbW92ZWQ7IGZhbHNlIHdoZW4gdGhlIHRyZWUgaXMgYmVpbmcgZGlzY29ubmVjdGVkXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb3ZlcnJpZGUgWydfJG5vdGlmeURpcmVjdGl2ZUNvbm5lY3Rpb25DaGFuZ2VkJ10oXG4gICAgaXNDb25uZWN0ZWQ6IGJvb2xlYW4sXG4gICAgaXNDbGVhcmluZ0RpcmVjdGl2ZSA9IHRydWVcbiAgKSB7XG4gICAgaWYgKGlzQ29ubmVjdGVkICE9PSB0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICB0aGlzLmlzQ29ubmVjdGVkID0gaXNDb25uZWN0ZWQ7XG4gICAgICBpZiAoaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5yZWNvbm5lY3RlZD8uKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RlZD8uKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NsZWFyaW5nRGlyZWN0aXZlKSB7XG4gICAgICBub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQodGhpcywgaXNDb25uZWN0ZWQpO1xuICAgICAgcmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50KHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGlyZWN0aXZlJ3MgUGFydCBvdXRzaWRlIHRoZSBub3JtYWwgYHVwZGF0ZWAvYHJlbmRlcmBcbiAgICogbGlmZWN5Y2xlIG9mIGEgZGlyZWN0aXZlLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBzeW5jaHJvbm91c2x5IGZyb20gYSBkaXJlY3RpdmUncyBgdXBkYXRlYFxuICAgKiBvciBgcmVuZGVyYC5cbiAgICpcbiAgICogQHBhcmFtIGRpcmVjdGl2ZSBUaGUgZGlyZWN0aXZlIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldFxuICAgKi9cbiAgc2V0VmFsdWUodmFsdWU6IHVua25vd24pIHtcbiAgICBpZiAoaXNTaW5nbGVFeHByZXNzaW9uKHRoaXMuX19wYXJ0IGFzIHVua25vd24gYXMgUGFydEluZm8pKSB7XG4gICAgICB0aGlzLl9fcGFydC5fJHNldFZhbHVlKHZhbHVlLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhpcy5fX2F0dHJpYnV0ZUluZGV4IHdpbGwgYmUgZGVmaW5lZCBpbiB0aGlzIGNhc2UsIGJ1dFxuICAgICAgLy8gYXNzZXJ0IGl0IGluIGRldiBtb2RlXG4gICAgICBpZiAoREVWX01PREUgJiYgdGhpcy5fX2F0dHJpYnV0ZUluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCB0aGlzLl9fYXR0cmlidXRlSW5kZXggdG8gYmUgYSBudW1iZXJgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IFsuLi4odGhpcy5fX3BhcnQuXyRjb21taXR0ZWRWYWx1ZSBhcyBBcnJheTx1bmtub3duPildO1xuICAgICAgbmV3VmFsdWVzW3RoaXMuX19hdHRyaWJ1dGVJbmRleCFdID0gdmFsdWU7XG4gICAgICAodGhpcy5fX3BhcnQgYXMgQXR0cmlidXRlUGFydCkuXyRzZXRWYWx1ZShuZXdWYWx1ZXMsIHRoaXMsIDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VyIGNhbGxiYWNrcyBmb3IgaW1wbGVtZW50aW5nIGxvZ2ljIHRvIHJlbGVhc2UgYW55IHJlc291cmNlcy9zdWJzY3JpcHRpb25zXG4gICAqIHRoYXQgbWF5IGhhdmUgYmVlbiByZXRhaW5lZCBieSB0aGlzIGRpcmVjdGl2ZS4gU2luY2UgZGlyZWN0aXZlcyBtYXkgYWxzbyBiZVxuICAgKiByZS1jb25uZWN0ZWQsIGByZWNvbm5lY3RlZGAgc2hvdWxkIGFsc28gYmUgaW1wbGVtZW50ZWQgdG8gcmVzdG9yZSB0aGVcbiAgICogd29ya2luZyBzdGF0ZSBvZiB0aGUgZGlyZWN0aXZlIHByaW9yIHRvIHRoZSBuZXh0IHJlbmRlci5cbiAgICovXG4gIHByb3RlY3RlZCBkaXNjb25uZWN0ZWQoKSB7fVxuICBwcm90ZWN0ZWQgcmVjb25uZWN0ZWQoKSB7fVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuaW1wb3J0IHtub3RoaW5nLCBFbGVtZW50UGFydH0gZnJvbSAnLi4vbGl0LWh0bWwuanMnO1xuaW1wb3J0IHtkaXJlY3RpdmUsIEFzeW5jRGlyZWN0aXZlfSBmcm9tICcuLi9hc3luYy1kaXJlY3RpdmUuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgUmVmIG9iamVjdCwgd2hpY2ggaXMgY29udGFpbmVyIGZvciBhIHJlZmVyZW5jZSB0byBhbiBlbGVtZW50LlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmID0gPFQgPSBFbGVtZW50PigpID0+IG5ldyBSZWY8VD4oKTtcblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBob2xkcyBhIHJlZiB2YWx1ZS5cbiAqL1xuY2xhc3MgUmVmPFQgPSBFbGVtZW50PiB7XG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBFbGVtZW50IHZhbHVlIG9mIHRoZSByZWYsIG9yIGVsc2UgYHVuZGVmaW5lZGAgaWYgdGhlIHJlZiBpcyBub1xuICAgKiBsb25nZXIgcmVuZGVyZWQuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZT86IFQ7XG59XG5cbmV4cG9ydCB0eXBlIHtSZWZ9O1xuXG5pbnRlcmZhY2UgUmVmSW50ZXJuYWwge1xuICB2YWx1ZTogRWxlbWVudCB8IHVuZGVmaW5lZDtcbn1cblxuLy8gV2hlbiBjYWxsYmFja3MgYXJlIHVzZWQgZm9yIHJlZnMsIHRoaXMgbWFwIHRyYWNrcyB0aGUgbGFzdCB2YWx1ZSB0aGUgY2FsbGJhY2tcbi8vIHdhcyBjYWxsZWQgd2l0aCwgZm9yIGVuc3VyaW5nIGEgZGlyZWN0aXZlIGRvZXNuJ3QgY2xlYXIgdGhlIHJlZiBpZiB0aGUgcmVmXG4vLyBoYXMgYWxyZWFkeSBiZWVuIHJlbmRlcmVkIHRvIGEgbmV3IHNwb3QuIEl0IGlzIGRvdWJsZS1rZXllZCBvbiBib3RoIHRoZVxuLy8gY29udGV4dCAoYG9wdGlvbnMuaG9zdGApIGFuZCB0aGUgY2FsbGJhY2ssIHNpbmNlIHdlIGF1dG8tYmluZCBjbGFzcyBtZXRob2RzXG4vLyB0byBgb3B0aW9ucy5ob3N0YC5cbmNvbnN0IGxhc3RFbGVtZW50Rm9yQ29udGV4dEFuZENhbGxiYWNrID0gbmV3IFdlYWtNYXA8XG4gIG9iamVjdCxcbiAgV2Vha01hcDxGdW5jdGlvbiwgRWxlbWVudCB8IHVuZGVmaW5lZD5cbj4oKTtcblxuZXhwb3J0IHR5cGUgUmVmT3JDYWxsYmFjazxUID0gRWxlbWVudD4gPSBSZWY8VD4gfCAoKGVsOiBUIHwgdW5kZWZpbmVkKSA9PiB2b2lkKTtcblxuY2xhc3MgUmVmRGlyZWN0aXZlIGV4dGVuZHMgQXN5bmNEaXJlY3RpdmUge1xuICBwcml2YXRlIF9lbGVtZW50PzogRWxlbWVudDtcbiAgcHJpdmF0ZSBfcmVmPzogUmVmT3JDYWxsYmFjaztcbiAgcHJpdmF0ZSBfY29udGV4dD86IG9iamVjdDtcblxuICByZW5kZXIoX3JlZj86IFJlZk9yQ2FsbGJhY2spIHtcbiAgICByZXR1cm4gbm90aGluZztcbiAgfVxuXG4gIG92ZXJyaWRlIHVwZGF0ZShwYXJ0OiBFbGVtZW50UGFydCwgW3JlZl06IFBhcmFtZXRlcnM8dGhpc1sncmVuZGVyJ10+KSB7XG4gICAgY29uc3QgcmVmQ2hhbmdlZCA9IHJlZiAhPT0gdGhpcy5fcmVmO1xuICAgIGlmIChyZWZDaGFuZ2VkICYmIHRoaXMuX3JlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGUgcmVmIHBhc3NlZCB0byB0aGUgZGlyZWN0aXZlIGhhcyBjaGFuZ2VkO1xuICAgICAgLy8gdW5zZXQgdGhlIHByZXZpb3VzIHJlZidzIHZhbHVlXG4gICAgICB0aGlzLl91cGRhdGVSZWZWYWx1ZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAocmVmQ2hhbmdlZCB8fCB0aGlzLl9sYXN0RWxlbWVudEZvclJlZiAhPT0gdGhpcy5fZWxlbWVudCkge1xuICAgICAgLy8gV2UgZWl0aGVyIGdvdCBhIG5ldyByZWYgb3IgdGhpcyBpcyB0aGUgZmlyc3QgcmVuZGVyO1xuICAgICAgLy8gc3RvcmUgdGhlIHJlZi9lbGVtZW50ICYgdXBkYXRlIHRoZSByZWYgdmFsdWVcbiAgICAgIHRoaXMuX3JlZiA9IHJlZjtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSBwYXJ0Lm9wdGlvbnM/Lmhvc3Q7XG4gICAgICB0aGlzLl91cGRhdGVSZWZWYWx1ZSgodGhpcy5fZWxlbWVudCA9IHBhcnQuZWxlbWVudCkpO1xuICAgIH1cbiAgICByZXR1cm4gbm90aGluZztcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVJlZlZhbHVlKGVsZW1lbnQ6IEVsZW1lbnQgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgIGVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5fcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBJZiB0aGUgY3VycmVudCByZWYgd2FzIGNhbGxlZCB3aXRoIGEgcHJldmlvdXMgdmFsdWUsIGNhbGwgd2l0aFxuICAgICAgLy8gYHVuZGVmaW5lZGA7IFdlIGRvIHRoaXMgdG8gZW5zdXJlIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGluIGEgY29uc2lzdGVudFxuICAgICAgLy8gd2F5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhIHJlZiBtaWdodCBiZSBtb3ZpbmcgdXAgaW4gdGhlIHRyZWUgKGluXG4gICAgICAvLyB3aGljaCBjYXNlIGl0IHdvdWxkIG90aGVyd2lzZSBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IHZhbHVlIGJlZm9yZSB0aGVcbiAgICAgIC8vIHByZXZpb3VzIG9uZSB1bnNldHMgaXQpIGFuZCBkb3duIGluIHRoZSB0cmVlICh3aGVyZSBpdCB3b3VsZCBiZSB1bnNldFxuICAgICAgLy8gYmVmb3JlIGJlaW5nIHNldCkuIE5vdGUgdGhhdCBlbGVtZW50IGxvb2t1cCBpcyBrZXllZCBieVxuICAgICAgLy8gYm90aCB0aGUgY29udGV4dCBhbmQgdGhlIGNhbGxiYWNrLCBzaW5jZSB3ZSBhbGxvdyBwYXNzaW5nIHVuYm91bmRcbiAgICAgIC8vIGZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQgb24gb3B0aW9ucy5ob3N0LCBhbmQgd2Ugd2FudCB0byB0cmVhdFxuICAgICAgLy8gdGhlc2UgYXMgdW5pcXVlIFwiaW5zdGFuY2VzXCIgb2YgYSBmdW5jdGlvbi5cbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9jb250ZXh0ID8/IGdsb2JhbFRoaXM7XG4gICAgICBsZXQgbGFzdEVsZW1lbnRGb3JDYWxsYmFjayA9XG4gICAgICAgIGxhc3RFbGVtZW50Rm9yQ29udGV4dEFuZENhbGxiYWNrLmdldChjb250ZXh0KTtcbiAgICAgIGlmIChsYXN0RWxlbWVudEZvckNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGFzdEVsZW1lbnRGb3JDYWxsYmFjayA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIGxhc3RFbGVtZW50Rm9yQ29udGV4dEFuZENhbGxiYWNrLnNldChjb250ZXh0LCBsYXN0RWxlbWVudEZvckNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0RWxlbWVudEZvckNhbGxiYWNrLmdldCh0aGlzLl9yZWYpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fcmVmLmNhbGwodGhpcy5fY29udGV4dCwgdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICAgIGxhc3RFbGVtZW50Rm9yQ2FsbGJhY2suc2V0KHRoaXMuX3JlZiwgZWxlbWVudCk7XG4gICAgICAvLyBDYWxsIHRoZSByZWYgd2l0aCB0aGUgbmV3IGVsZW1lbnQgdmFsdWVcbiAgICAgIGlmIChlbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fcmVmLmNhbGwodGhpcy5fY29udGV4dCwgZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICh0aGlzLl9yZWYgYXMgUmVmSW50ZXJuYWwpIS52YWx1ZSA9IGVsZW1lbnQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2xhc3RFbGVtZW50Rm9yUmVmKCkge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5fcmVmID09PSAnZnVuY3Rpb24nXG4gICAgICA/IGxhc3RFbGVtZW50Rm9yQ29udGV4dEFuZENhbGxiYWNrXG4gICAgICAgICAgLmdldCh0aGlzLl9jb250ZXh0ID8/IGdsb2JhbFRoaXMpXG4gICAgICAgICAgPy5nZXQodGhpcy5fcmVmKVxuICAgICAgOiB0aGlzLl9yZWY/LnZhbHVlO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkKCkge1xuICAgIC8vIE9ubHkgY2xlYXIgdGhlIGJveCBpZiBvdXIgZWxlbWVudCBpcyBzdGlsbCB0aGUgb25lIGluIGl0IChpLmUuIGFub3RoZXJcbiAgICAvLyBkaXJlY3RpdmUgaW5zdGFuY2UgaGFzbid0IHJlbmRlcmVkIGl0cyBlbGVtZW50IHRvIGl0IGJlZm9yZSB1cyk7IHRoYXRcbiAgICAvLyBvbmx5IGhhcHBlbnMgaW4gdGhlIGV2ZW50IG9mIHRoZSBkaXJlY3RpdmUgYmVpbmcgY2xlYXJlZCAobm90IHZpYSBtYW51YWxcbiAgICAvLyBkaXNjb25uZWN0aW9uKVxuICAgIGlmICh0aGlzLl9sYXN0RWxlbWVudEZvclJlZiA9PT0gdGhpcy5fZWxlbWVudCkge1xuICAgICAgdGhpcy5fdXBkYXRlUmVmVmFsdWUodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSByZWNvbm5lY3RlZCgpIHtcbiAgICAvLyBJZiB3ZSB3ZXJlIG1hbnVhbGx5IGRpc2Nvbm5lY3RlZCwgd2UgY2FuIHNhZmVseSBwdXQgb3VyIGVsZW1lbnQgYmFjayBpblxuICAgIC8vIHRoZSBib3gsIHNpbmNlIG5vIHJlbmRlcmluZyBjb3VsZCBoYXZlIG9jY3VycmVkIHRvIGNoYW5nZSBpdHMgc3RhdGVcbiAgICB0aGlzLl91cGRhdGVSZWZWYWx1ZSh0aGlzLl9lbGVtZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIG9mIGEgUmVmIG9iamVjdCBvciBjYWxscyBhIHJlZiBjYWxsYmFjayB3aXRoIHRoZSBlbGVtZW50IGl0J3NcbiAqIGJvdW5kIHRvLlxuICpcbiAqIEEgUmVmIG9iamVjdCBhY3RzIGFzIGEgY29udGFpbmVyIGZvciBhIHJlZmVyZW5jZSB0byBhbiBlbGVtZW50LiBBIHJlZlxuICogY2FsbGJhY2sgaXMgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGFuIGVsZW1lbnQgYXMgaXRzIG9ubHkgYXJndW1lbnQuXG4gKlxuICogVGhlIHJlZiBkaXJlY3RpdmUgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIFJlZiBvYmplY3Qgb3IgY2FsbHMgdGhlIHJlZiBjYWxsYmFja1xuICogZHVyaW5nIHJlbmRlcmluZywgaWYgdGhlIHJlZmVyZW5jZWQgZWxlbWVudCBjaGFuZ2VkLlxuICpcbiAqIE5vdGU6IElmIGEgcmVmIGNhbGxiYWNrIGlzIHJlbmRlcmVkIHRvIGEgZGlmZmVyZW50IGVsZW1lbnQgcG9zaXRpb24gb3IgaXNcbiAqIHJlbW92ZWQgaW4gYSBzdWJzZXF1ZW50IHJlbmRlciwgaXQgd2lsbCBmaXJzdCBiZSBjYWxsZWQgd2l0aCBgdW5kZWZpbmVkYCxcbiAqIGZvbGxvd2VkIGJ5IGFub3RoZXIgY2FsbCB3aXRoIHRoZSBuZXcgZWxlbWVudCBpdCB3YXMgcmVuZGVyZWQgdG8gKGlmIGFueSkuXG4gKlxuICogYGBganNcbiAqIC8vIFVzaW5nIFJlZiBvYmplY3RcbiAqIGNvbnN0IGlucHV0UmVmID0gY3JlYXRlUmVmKCk7XG4gKiByZW5kZXIoaHRtbGA8aW5wdXQgJHtyZWYoaW5wdXRSZWYpfT5gLCBjb250YWluZXIpO1xuICogaW5wdXRSZWYudmFsdWUuZm9jdXMoKTtcbiAqXG4gKiAvLyBVc2luZyBjYWxsYmFja1xuICogY29uc3QgY2FsbGJhY2sgPSAoaW5wdXRFbGVtZW50KSA9PiBpbnB1dEVsZW1lbnQuZm9jdXMoKTtcbiAqIHJlbmRlcihodG1sYDxpbnB1dCAke3JlZihjYWxsYmFjayl9PmAsIGNvbnRhaW5lcik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHJlZiA9IGRpcmVjdGl2ZShSZWZEaXJlY3RpdmUpO1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHRoZSBjbGFzcyB0aGF0IHBvd2VycyB0aGlzIGRpcmVjdGl2ZS4gTmVjZXNzYXJ5IGZvciBuYW1pbmcgdGhlXG4gKiBkaXJlY3RpdmUncyByZXR1cm4gdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUge1JlZkRpcmVjdGl2ZX07XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB9XG4gIFtwYXJ0PSdjb3JyZWN0J10ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTEpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMS4xcmVtO1xuICAgIG1pbi13aWR0aDogMS4xcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0yKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDIuM3JlbTtcbiAgICBtaW4td2lkdGg6IDIuM3JlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMykgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAzLjNyZW07XG4gICAgbWluLXdpZHRoOiAzLjNyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTQpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogNC4ycmVtO1xuICAgIG1pbi13aWR0aDogNC4ycmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC02KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDYuNnJlbTtcbiAgICBtaW4td2lkdGg6IDYuNnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMTApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogOHJlbTtcbiAgICBtaW4td2lkdGg6IDhyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTE1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDEycmVtO1xuICAgIG1pbi13aWR0aDogMTJyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTIwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDE3cmVtO1xuICAgIG1pbi13aWR0aDogMTdyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTI1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDIwcmVtO1xuICAgIG1pbi13aWR0aDogMjByZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTMwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDI0cmVtO1xuICAgIG1pbi13aWR0aDogMjRyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTM1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDI4cmVtO1xuICAgIG1pbi13aWR0aDogMjhyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTQwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDMycmVtO1xuICAgIG1pbi13aWR0aDogMzJyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTQ1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDM2cmVtO1xuICAgIG1pbi13aWR0aDogMzZyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTUwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDQwcmVtO1xuICAgIG1pbi13aWR0aDogNDByZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTcyKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDU3cmVtO1xuICAgIG1pbi13aWR0aDogNTdyZW07XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgQ1NTUmVzdWx0R3JvdXAsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaWZEZWZpbmVkIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvaWYtZGVmaW5lZC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVSZWYgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZWYuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uLnN0eWxlcyc7XG5AY3VzdG9tRWxlbWVudCgncXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVRleHRFbnRyeUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ2V4cGVjdGVkLWxlbmd0aCcgfSkgZXhwZWN0ZWRMZW5ndGg6IG51bWJlcjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BhdHRlcm4tbWFzaycgfSkgcGF0dGVybk1hc2s6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BsYWNlaG9sZGVyLXRleHQnIH0pIHBsYWNlaG9sZGVyVGV4dDogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YS1wYXR0ZXJubWFzay1tZXNzYWdlJyB9KSBkYXRhUGF0dGVybm1hc2tNZXNzYWdlOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcblxuICBpbnB1dFJlZiA9IGNyZWF0ZVJlZjxIVE1MSW5wdXRFbGVtZW50PigpO1xuXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbDtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQodGhpcy5yZXNwb25zZUlkZW50aWZpZXIsIHZhbCk7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKGZvcm1EYXRhKTtcbiAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHZhbGlkYXRlKCkge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgaWYgKCFpbnB1dCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLnBhdHRlcm5NYXNrICYmIHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSkge1xuICAgICAgLy8gQ2xlYXIgYW55IGN1c3RvbSBlcnJvciBpZiB0aGUgaW5wdXQgaXMgdmFsaWRcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eSh7fSk7XG4gICAgICBpbnB1dC5zZXRDdXN0b21WYWxpZGl0eSgnJyk7IC8vIENsZWFyIHRoZSBjdXN0b20gbWVzc2FnZVxuICAgICAgY29uc3QgaXNWYWxpZCA9IGlucHV0LmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAvLyBTZXQgY3VzdG9tIGVycm9yIGlmIGludmFsaWRcbiAgICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KHsgY3VzdG9tRXJyb3I6IHRydWUgfSwgdGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKTtcbiAgICAgICAgaW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkodGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKTsgLy8gU2V0IGN1c3RvbSBtZXNzYWdlIG9ubHkgaWYgaW52YWxpZFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gaW5wdXQuY2hlY2tWYWxpZGl0eSgpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KGlzVmFsaWQgPyB7fSA6IHsgY3VzdG9tRXJyb3I6IGZhbHNlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgIT09ICcnICYmIGlucHV0LmNoZWNrVmFsaWRpdHkoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxpbnB1dFxuICAgICAgICBwYXJ0PVwiaW5wdXRcIlxuICAgICAgICBuYW1lPVwiJHt0aGlzLnJlc3BvbnNlSWRlbnRpZmllcn1cIlxuICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBAYmx1cj1cIiR7KGV2ZW50OiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICB9fVwiXG4gICAgICAgIEBrZXlkb3duPVwiJHtldmVudCA9PiBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1cIlxuICAgICAgICBAa2V5dXA9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgQGNoYW5nZT1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICB0eXBlPVwiJHt0aGlzLnBhdHRlcm5NYXNrID09ICdbMC05XSonID8gJ251bWJlcicgOiAndGV4dCd9XCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCIke2lmRGVmaW5lZCh0aGlzLnBsYWNlaG9sZGVyVGV4dCA/IHRoaXMucGxhY2Vob2xkZXJUZXh0IDogdW5kZWZpbmVkKX1cIlxuICAgICAgICAudmFsdWU9XCIke3RoaXMuX3ZhbHVlfVwiXG4gICAgICAgIHBhdHRlcm49XCIke2lmRGVmaW5lZCh0aGlzLnBhdHRlcm5NYXNrID8gdGhpcy5wYXR0ZXJuTWFzayA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgbWF4bGVuZ3RoPSR7MTAwMH1cbiAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkfVwiXG4gICAgICAgID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIlxuICAgICAgLz5cbiAgICAgIDxkaXYgcGFydD1cImNvcnJlY3RcIj4ke3RoaXMuX2NvcnJlY3RSZXNwb25zZX08L2Rpdj5cbiAgICBgO1xuICB9XG4gIHByb3RlY3RlZCB0ZXh0Q2hhbmdlZChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICB0aGlzLnNldEVtcHR5QXR0cmlidXRlKGlucHV0LnZhbHVlKTtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IGlucHV0LnZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoaW5wdXQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHJlcG9ydFZhbGlkaXR5KCkge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgaWYgKCFpbnB1dCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUnVuIHRoZSB2YWxpZGF0ZSBmdW5jdGlvbiB0byBlbnN1cmUgdGhlIGN1c3RvbSB2YWxpZGl0eSBzdGF0ZSBpcyB1cCB0byBkYXRlXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIGlucHV0LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgfVxuICAgIHJldHVybiBpc1ZhbGlkO1xuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWUgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgc2V0RW1wdHlBdHRyaWJ1dGUodGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2VtcHR5JywgdGV4dCA9PT0gJycgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbic6IFF0aVRleHRFbnRyeUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgcHJvcGVydHksIHF1ZXJ5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxuaW1wb3J0IHsgQ2hvaWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyBJSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbi5pbnRlcmZhY2UnO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5leHBvcnQgdHlwZSBDaG9pY2UgPSBIVE1MRWxlbWVudCAmIENob2ljZUludGVyZmFjZSAmIHsgaW50ZXJuYWxzOiBFbGVtZW50SW50ZXJuYWxzIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hvaWNlc0ludGVyZmFjZSBleHRlbmRzIElJbnRlcmFjdGlvbiB7XG4gIF9jaG9pY2VFbGVtZW50czogQXJyYXk8Q2hvaWNlPjtcbiAgY29ycmVjdFJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNvbnN0IENob2ljZXNNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihzdXBlckNsYXNzOiBULCBzZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIENob2ljZXNNaXhpbkVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIGltcGxlbWVudHMgQ2hvaWNlc0ludGVyZmFjZSB7XG4gICAgcHVibGljIF9jaG9pY2VFbGVtZW50czogQ2hvaWNlW10gPSBbXTtcblxuICAgIEBxdWVyeSgnI3ZhbGlkYXRpb25NZXNzYWdlJylcbiAgICBwcml2YXRlIF92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQhOiBIVE1MRWxlbWVudDtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnbWluLWNob2ljZXMnIH0pXG4gICAgcHVibGljIG1pbkNob2ljZXMgPSAwO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdtYXgtY2hvaWNlcycgfSlcbiAgICBwdWJsaWMgbWF4Q2hvaWNlcyA9IDE7XG5cbiAgICBAd2F0Y2goJ21heENob2ljZXMnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gICAgX2hhbmRsZU1heENob2ljZXNDaGFuZ2UoX29sZFZhbHVlOiBudW1iZXIsIF9uZXdWYWx1ZTogbnVtYmVyKSB7XG4gICAgICB0aGlzLl9kZXRlcm1pbmVJbnB1dFR5cGUoKTtcbiAgICB9XG5cbiAgICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIF9oYW5kbGVEaXNhYmxlZENoYW5nZSA9IChfOiBib29sZWFuLCBkaXNhYmxlZDogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaCA9PiAoY2guZGlzYWJsZWQgPSBkaXNhYmxlZCkpO1xuICAgIH07XG5cbiAgICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIF9oYW5kbGVSZWFkb25seUNoYW5nZSA9IChfOiBib29sZWFuLCByZWFkb25seTogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4gKGNob2ljZS5yZWFkb25seSA9IHJlYWRvbmx5KSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgX3ZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnO1xuXG4gICAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSA/IHRoaXMuX3ZhbHVlLmpvaW4oJywnKSA6IHRoaXMuX3ZhbHVlO1xuICAgIH1cblxuICAgIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgICBpZiAodGhpcy5tYXhDaG9pY2VzID4gMSAmJiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbC5zcGxpdCgnLCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWw7XG4gICAgICB9XG4gICAgICAvLyBBc3N1bWluZyB0aGlzLnZhbHVlIGlzIGFuIGFycmF5IG9mIHN0cmluZ3NcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSkge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICB0aGlzLl92YWx1ZS5mb3JFYWNoKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQodGhpcy5yZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zZXRGb3JtVmFsdWUoZm9ybURhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoaXMudmFsdWUgaXMgbm90IGFuIGFycmF5XG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zZXRGb3JtVmFsdWUodGhpcy5fdmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5fdXBkYXRlQ2hvaWNlU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb3JyZWN0UmVzcG9uc2UoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvcnJlY3RSZXNwb25zZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgIHRoaXMuX2NvcnJlY3RSZXNwb25zZSA9IHZhbHVlO1xuICAgICAgY29uc3QgcmVzcG9uc2VBcnJheSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4ge1xuICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5kZWxldGUoJ2NvcnJlY3QtcmVzcG9uc2UnKTtcbiAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuZGVsZXRlKCdpbmNvcnJlY3QtcmVzcG9uc2UnKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGlmIChyZXNwb25zZUFycmF5LmluY2x1ZGVzKGNob2ljZS5pZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuYWRkKCdjb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmFkZCgnaW5jb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYHJlZ2lzdGVyLSR7c2VsZWN0b3J9YCwgdGhpcy5fcmVnaXN0ZXJDaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihgdW5yZWdpc3Rlci0ke3NlbGVjdG9yfWAsIHRoaXMuX3VucmVnaXN0ZXJDaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihgYWN0aXZhdGUtJHtzZWxlY3Rvcn1gLCB0aGlzLl9jaG9pY2VFbGVtZW50U2VsZWN0ZWRIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYHJlZ2lzdGVyLSR7c2VsZWN0b3J9YCwgdGhpcy5fcmVnaXN0ZXJDaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihgdW5yZWdpc3Rlci0ke3NlbGVjdG9yfWAsIHRoaXMuX3VucmVnaXN0ZXJDaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihgYWN0aXZhdGUtJHtzZWxlY3Rvcn1gLCB0aGlzLl9jaG9pY2VFbGVtZW50U2VsZWN0ZWRIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBzZWxlY3RlZENob2ljZXMgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maWx0ZXIoY2hvaWNlID0+IHRoaXMuX2dldENob2ljZUNoZWNrZWQoY2hvaWNlKSk7XG4gICAgICBjb25zdCBzZWxlY3RlZENvdW50ID0gc2VsZWN0ZWRDaG9pY2VzLmxlbmd0aDtcbiAgICAgIGxldCBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgIGxldCB2YWxpZGl0eU1lc3NhZ2UgPSAnJztcbiAgICAgIGlmICh0aGlzLm1heENob2ljZXMgIT09IDAgJiYgc2VsZWN0ZWRDb3VudCA+IHRoaXMubWF4Q2hvaWNlcykge1xuICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIHZhbGlkaXR5TWVzc2FnZSA9IHRoaXMuZGF0YXNldC5tYXhTZWxlY3Rpb25zTWVzc2FnZSB8fCBgWW91IGNhbiBzZWxlY3QgYXQgbW9zdCAke3RoaXMubWF4Q2hvaWNlc30gY2hvaWNlcy5gO1xuICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZENvdW50IDwgdGhpcy5taW5DaG9pY2VzKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgdmFsaWRpdHlNZXNzYWdlID0gdGhpcy5kYXRhc2V0Lm1pblNlbGVjdGlvbnNNZXNzYWdlIHx8IGBZb3UgbXVzdCBzZWxlY3QgYXQgbGVhc3QgJHt0aGlzLm1pbkNob2ljZXN9IGNob2ljZXMuYDtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdGVkQ2hvaWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eShcbiAgICAgICAgICBpc1ZhbGlkID8ge30gOiB7IGN1c3RvbUVycm9yOiB0cnVlIH0sXG4gICAgICAgICAgdmFsaWRpdHlNZXNzYWdlLFxuICAgICAgICAgIHNlbGVjdGVkQ2hvaWNlc1tzZWxlY3RlZENvdW50IC0gMV0gfHwgdGhpcy5fY2hvaWNlRWxlbWVudHNbMF0gfHwgdGhpc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgcmVwb3J0VmFsaWRpdHkoKSB7XG4gICAgICBpZiAodGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5faW50ZXJuYWxzLnZhbGlkaXR5LnZhbGlkKSB7XG4gICAgICAgICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50LnRleHRDb250ZW50ID0gdGhpcy5faW50ZXJuYWxzLnZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQudGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX2ludGVybmFscy52YWxpZGl0eS52YWxpZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZWdpc3RlckNob2ljZUVsZW1lbnQoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgQ2hvaWNlO1xuICAgICAgY2hvaWNlRWxlbWVudC5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7XG5cblxuICAgICAgXG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5wdXNoKGNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5fc2V0SW5wdXRUeXBlKGNob2ljZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3VucmVnaXN0ZXJDaG9pY2VFbGVtZW50KGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIENob2ljZTtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzID0gdGhpcy5fY2hvaWNlRWxlbWVudHMuZmlsdGVyKGNob2ljZSA9PiBjaG9pY2UgIT09IGNob2ljZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2RldGVybWluZUlucHV0VHlwZSgpIHtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgdGhpcy5fc2V0SW5wdXRUeXBlKGNob2ljZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRJbnB1dFR5cGUoY2hvaWNlRWxlbWVudDogQ2hvaWNlKSB7XG4gICAgICAvLyBjaG9pY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsIHRoaXMubWF4Q2hvaWNlcyA9PT0gMSA/ICdyYWRpbycgOiAnY2hlY2tib3gnKTtcbiAgICAgIGNob2ljZUVsZW1lbnQuaW50ZXJuYWxzLnJvbGUgPSB0aGlzLm1heENob2ljZXMgPT09IDEgPyAncmFkaW8nIDogJ2NoZWNrYm94JztcbiAgICAgIGNob2ljZUVsZW1lbnQuaW50ZXJuYWxzLnN0YXRlcy5hZGQoY2hvaWNlRWxlbWVudC5pbnRlcm5hbHMucm9sZSlcbiAgICAgIC8vIGNob2ljZUVsZW1lbnQuaW50ZXJuYWxzLmFyaWFDaGVja2VkID0gJ2ZhbHNlJztcbiAgICAgIC8vIGNob2ljZUVsZW1lbnQuYXJpYVJlYWRPbmx5ID0gdGhpcy5yZWFkb25seSA9PSB0cnVlID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2Nob2ljZUVsZW1lbnRTZWxlY3RlZEhhbmRsZXIoZXZlbnQ6IEN1c3RvbUV2ZW50PHsgaWRlbnRpZmllcjogc3RyaW5nIH0+KSB7XG4gICAgICB0aGlzLl90b2dnbGVDaG9pY2VDaGVja2VkKGV2ZW50LnRhcmdldCBhcyBDaG9pY2UpO1xuICAgICAgaWYgKHRoaXMubWF4Q2hvaWNlcyA9PT0gMSkge1xuICAgICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiB7XG4gICAgICAgICAgaWYgKGNob2ljZS5pZGVudGlmaWVyICE9PSBldmVudC5kZXRhaWwuaWRlbnRpZmllcikge1xuICAgICAgICAgICAgdGhpcy5fc2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5faGFuZGxlQ2hvaWNlU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2U6IENob2ljZSwgY2hlY2tlZDogYm9vbGVhbikge1xuICAgICAgaWYgKGNob2ljZS5pbnRlcm5hbHM/LnN0YXRlcykge1xuICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmFkZCgnLS1jaGVja2VkJyk7XG4gICAgICAgICAgY2hvaWNlLmludGVybmFscy5hcmlhQ2hlY2tlZCA9ICd0cnVlJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5kZWxldGUoJy0tY2hlY2tlZCcpO1xuICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuYXJpYUNoZWNrZWQgPSAnZmFsc2UnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2U6IENob2ljZSk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmhhcygnLS1jaGVja2VkJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdG9nZ2xlQ2hvaWNlQ2hlY2tlZChjaG9pY2U6IENob2ljZSkge1xuICAgICAgY29uc3QgY2hlY2tlZCA9IHRoaXMuX2dldENob2ljZUNoZWNrZWQoY2hvaWNlKTtcbiAgICAgIHRoaXMuX3NldENob2ljZUNoZWNrZWQoY2hvaWNlLCAhY2hlY2tlZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaGFuZGxlQ2hvaWNlU2VsZWN0aW9uKCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRDaG9pY2VzID0gdGhpcy5fY2hvaWNlRWxlbWVudHMuZmlsdGVyKGNob2ljZSA9PiB0aGlzLl9nZXRDaG9pY2VDaGVja2VkKGNob2ljZSkpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRJZGVudGlmaWVycyA9IHNlbGVjdGVkQ2hvaWNlcy5tYXAoY2hvaWNlID0+IGNob2ljZS5pZGVudGlmaWVyKTtcblxuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubWF4Q2hvaWNlcyA9PT0gMSA/IHNlbGVjdGVkSWRlbnRpZmllcnNbMF0gfHwgJycgOiBzZWxlY3RlZElkZW50aWZpZXJzO1xuICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiBlYWNoIGNob2ljZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlc3BvbnNlLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3VwZGF0ZUNob2ljZVNlbGVjdGlvbigpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlQXJyYXkgPSBBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSA/IHRoaXMuX3ZhbHVlIDogW3RoaXMuX3ZhbHVlXTtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHJlc3BvbnNlQXJyYXkuaW5jbHVkZXMoY2hvaWNlLmlkZW50aWZpZXIpO1xuICAgICAgICB0aGlzLl9zZXRDaG9pY2VDaGVja2VkKGNob2ljZSwgaXNTZWxlY3RlZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIENob2ljZXNNaXhpbkVsZW1lbnQgYXMgQ29uc3RydWN0b3I8Q2hvaWNlc0ludGVyZmFjZT4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90dGV4dC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpSG90dGV4dEludGVyYWN0aW9uIGV4dGVuZHMgQ2hvaWNlc01peGluKEludGVyYWN0aW9uLCAncXRpLWhvdHRleHQnKSB7XG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uJywgJycpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nOiBRdGlIb3R0ZXh0SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtub3RoaW5nLCBUZW1wbGF0ZVJlc3VsdCwgbm9DaGFuZ2V9IGZyb20gJy4uL2xpdC1odG1sLmpzJztcbmltcG9ydCB7ZGlyZWN0aXZlLCBEaXJlY3RpdmUsIFBhcnRJbmZvLCBQYXJ0VHlwZX0gZnJvbSAnLi4vZGlyZWN0aXZlLmpzJztcblxuY29uc3QgSFRNTF9SRVNVTFQgPSAxO1xuXG5leHBvcnQgY2xhc3MgVW5zYWZlSFRNTERpcmVjdGl2ZSBleHRlbmRzIERpcmVjdGl2ZSB7XG4gIHN0YXRpYyBkaXJlY3RpdmVOYW1lID0gJ3Vuc2FmZUhUTUwnO1xuICBzdGF0aWMgcmVzdWx0VHlwZSA9IEhUTUxfUkVTVUxUO1xuXG4gIHByaXZhdGUgX3ZhbHVlOiB1bmtub3duID0gbm90aGluZztcbiAgcHJpdmF0ZSBfdGVtcGxhdGVSZXN1bHQ/OiBUZW1wbGF0ZVJlc3VsdDtcblxuICBjb25zdHJ1Y3RvcihwYXJ0SW5mbzogUGFydEluZm8pIHtcbiAgICBzdXBlcihwYXJ0SW5mbyk7XG4gICAgaWYgKHBhcnRJbmZvLnR5cGUgIT09IFBhcnRUeXBlLkNISUxEKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke1xuICAgICAgICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBVbnNhZmVIVE1MRGlyZWN0aXZlKS5kaXJlY3RpdmVOYW1lXG4gICAgICAgIH0oKSBjYW4gb25seSBiZSB1c2VkIGluIGNoaWxkIGJpbmRpbmdzYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIodmFsdWU6IHN0cmluZyB8IHR5cGVvZiBub3RoaW5nIHwgdHlwZW9mIG5vQ2hhbmdlIHwgdW5kZWZpbmVkIHwgbnVsbCkge1xuICAgIGlmICh2YWx1ZSA9PT0gbm90aGluZyB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZVJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiAodGhpcy5fdmFsdWUgPSB2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gbm9DaGFuZ2UpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtcbiAgICAgICAgICAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgVW5zYWZlSFRNTERpcmVjdGl2ZSkuZGlyZWN0aXZlTmFtZVxuICAgICAgICB9KCkgY2FsbGVkIHdpdGggYSBub24tc3RyaW5nIHZhbHVlYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLl92YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RlbXBsYXRlUmVzdWx0O1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIGNvbnN0IHN0cmluZ3MgPSBbdmFsdWVdIGFzIHVua25vd24gYXMgVGVtcGxhdGVTdHJpbmdzQXJyYXk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAoc3RyaW5ncyBhcyBhbnkpLnJhdyA9IHN0cmluZ3M7XG4gICAgLy8gV0FSTklORzogaW1wZXJzb25hdGluZyBhIFRlbXBsYXRlUmVzdWx0IGxpa2UgdGhpcyBpcyBleHRyZW1lbHlcbiAgICAvLyBkYW5nZXJvdXMuIFRoaXJkLXBhcnR5IGRpcmVjdGl2ZXMgc2hvdWxkIG5vdCBkbyB0aGlzLlxuICAgIHJldHVybiAodGhpcy5fdGVtcGxhdGVSZXN1bHQgPSB7XG4gICAgICAvLyBDYXN0IHRvIGEga25vd24gc2V0IG9mIGludGVnZXJzIHRoYXQgc2F0aXNmeSBSZXN1bHRUeXBlIHNvIHRoYXQgd2VcbiAgICAgIC8vIGRvbid0IGhhdmUgdG8gZXhwb3J0IFJlc3VsdFR5cGUgYW5kIHBvc3NpYmx5IGVuY291cmFnZSB0aGlzIHBhdHRlcm4uXG4gICAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgWydfJGxpdFR5cGUkJ106ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBVbnNhZmVIVE1MRGlyZWN0aXZlKVxuICAgICAgICAucmVzdWx0VHlwZSBhcyAxIHwgMixcbiAgICAgIHN0cmluZ3MsXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVuZGVycyB0aGUgcmVzdWx0IGFzIEhUTUwsIHJhdGhlciB0aGFuIHRleHQuXG4gKlxuICogVGhlIHZhbHVlcyBgdW5kZWZpbmVkYCwgYG51bGxgLCBhbmQgYG5vdGhpbmdgLCB3aWxsIGFsbCByZXN1bHQgaW4gbm8gY29udGVudFxuICogKGVtcHR5IHN0cmluZykgYmVpbmcgcmVuZGVyZWQuXG4gKlxuICogTm90ZSwgdGhpcyBpcyB1bnNhZmUgdG8gdXNlIHdpdGggYW55IHVzZXItcHJvdmlkZWQgaW5wdXQgdGhhdCBoYXNuJ3QgYmVlblxuICogc2FuaXRpemVkIG9yIGVzY2FwZWQsIGFzIGl0IG1heSBsZWFkIHRvIGNyb3NzLXNpdGUtc2NyaXB0aW5nXG4gKiB2dWxuZXJhYmlsaXRpZXMuXG4gKi9cbmV4cG9ydCBjb25zdCB1bnNhZmVIVE1MID0gZGlyZWN0aXZlKFVuc2FmZUhUTUxEaXJlY3RpdmUpO1xuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbmludGVyZmFjZSBPcHRpb25UeXBlIHtcbiAgdGV4dENvbnRlbnQ6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgc2VsZWN0ZWQ6IGJvb2xlYW47XG59XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpSW5saW5lQ2hvaWNlSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHN0YXRpYyBvdmVycmlkZSBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgIH1cbiAgICAgICAgc2xvdCB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICB9XG4gICAgICAgIFtyb2xlPSdtZW51J10ge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICB6LWluZGV4OiAxMDAwO1xuICAgICAgICB9XG4gICAgICAgIC5hbmNob3Ige1xuICAgICAgICAgIC8qIGFuY2hvci1uYW1lOiAtLWluZm9ib3g7ICovXG4gICAgICAgICAgd2lkdGg6IGZpdC1jb250ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLnBvc2l0aW9uZWRFbGVtZW50IHtcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgLyogcG9zaXRpb24tYW5jaG9yOiAtLWluZm9ib3g7ICovXG4gICAgICAgICAgLyogdG9wOiBhbmNob3IoYm90dG9tKTsgKi9cbiAgICAgICAgfVxuICAgICAgYFxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlucHV0V2lkdGhDbGFzcyA9IFtcbiAgICAnJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTInLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMScsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0zJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTQnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtNicsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0xMCcsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0xNScsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0yMCcsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC03MidcbiAgXTtcblxuICBAc3RhdGUoKSBvcHRpb25zOiBPcHRpb25UeXBlW10gPSBbXTtcblxuICBAc3RhdGUoKSBjb3JyZWN0T3B0aW9uOiBzdHJpbmcgPSAnJztcblxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdkYXRhLXByb21wdCcsIHR5cGU6IFN0cmluZyB9KVxuICBkYXRhUHJvbXB0OiBzdHJpbmcgPSAnc2VsZWN0JztcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2VsZWN0IHBhcnQ9XCJzZWxlY3RcIiBAY2hhbmdlPVwiJHt0aGlzLmNob2ljZVNlbGVjdGVkfVwiID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIiA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCI+XG4gICAgICAgICR7dGhpcy5vcHRpb25zLm1hcChcbiAgICAgICAgICBvcHRpb24gPT4gaHRtbGBcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIke29wdGlvbi52YWx1ZX1cIiA/c2VsZWN0ZWQ9XCIke29wdGlvbi5zZWxlY3RlZH1cIj4ke3Vuc2FmZUhUTUwob3B0aW9uLnRleHRDb250ZW50KX08L29wdGlvbj5cbiAgICAgICAgICBgXG4gICAgICAgICl9XG4gICAgICA8L3NlbGVjdD5cblxuICAgICAgJHt1bnNhZmVIVE1MKHRoaXMuY29ycmVjdE9wdGlvbil9XG4gICAgYDtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdvbi1kcm9wZG93bi1zZWxlY3RlZCcsIHRoaXMuY2hvaWNlU2VsZWN0ZWQpO1xuICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWlubGluZS1jaG9pY2UnKSk7XG4gICAgdGhpcy5vcHRpb25zID0gW1xuICAgICAge1xuICAgICAgICB0ZXh0Q29udGVudDogdGhpcy5kYXRhUHJvbXB0LFxuICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIC4uLmNob2ljZXMubWFwKGNob2ljZSA9PiAoe1xuICAgICAgICB0ZXh0Q29udGVudDogY2hvaWNlLmlubmVySFRNTCxcbiAgICAgICAgdmFsdWU6IGNob2ljZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXG4gICAgICB9KSlcbiAgICBdO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdvbi1kcm9wZG93bi1zZWxlY3RlZCcsIHRoaXMuY2hvaWNlU2VsZWN0ZWQpO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQob3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCk7XG4gICAgcmV0dXJuIHNlbGVjdGVkT3B0aW9uID8gc2VsZWN0ZWRPcHRpb24udmFsdWUgIT09ICcnIDogZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcCgob3B0aW9uLCBpKSA9PiAoeyAuLi5vcHRpb24sIHNlbGVjdGVkOiBpID09PSAwIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMub3B0aW9ucy5tYXAob3B0aW9uID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gb3B0aW9uLnZhbHVlKSB7XG4gICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9uO1xuICAgIH0pO1xuICB9XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkKS52YWx1ZTtcbiAgfVxuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9uID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29ycmVjdE9wdGlvbiA9IGA8c3BhbiBwYXJ0PVwiY29ycmVjdC1vcHRpb25cIj4ke1xuICAgICAgdGhpcy5vcHRpb25zLmZpbmQob3B0aW9uID0+IHZhbHVlID09PSBvcHRpb24udmFsdWUpLnRleHRDb250ZW50XG4gICAgfTwvc3Bhbj5gO1xuICB9XG5cbiAgcHVibGljIGNob2ljZVNlbGVjdGVkKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uVmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50KS52YWx1ZTtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnMubWFwKG9wdGlvbiA9PiAoeyAuLi5vcHRpb24sIHNlbGVjdGVkOiBvcHRpb24udmFsdWUgPT09IHNlbGVjdGVkT3B0aW9uVmFsdWUgfSkpO1xuICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHNlbGVjdGVkT3B0aW9uVmFsdWUpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uJzogUXRpSW5saW5lQ2hvaWNlSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICIvKipcbiAqIE1peGluIHRoYXQgcHJvdmlkZXMgc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIGEgTGl0RWxlbWVudC5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIExpdEVsZW1lbnQgc3ViY2xhc3MuXG4gKiBAcGFyYW0ge1R9IHN1cGVyQ2xhc3MgLSBUaGUgc3VwZXJjbGFzcyB0byBleHRlbmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBUaGUgQ1NTIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudHMgdG8gc2h1ZmZsZS5cbiAqIEByZXR1cm5zIHtDb25zdHJ1Y3RvcjxTaHVmZmxlSW50ZXJmYWNlPiAmIFR9IC0gVGhlIGV4dGVuZGVkIGNsYXNzIHdpdGggc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogYWRkcyBhIHNodWZmbGUgcHJvcGVydHkgdG8gdGhlIGNsYXNzIHdpdGggYW4gYXR0cmlidXRlIGNvbnZlcnRlclxuICpcbiAqIHF0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktbWF0Y2gtaW50ZXJhY3Rpb25cbiAqL1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5kZWNsYXJlIGNsYXNzIFNodWZmbGVJbnRlcmZhY2Uge31cbmV4cG9ydCBjb25zdCBTaHVmZmxlTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oc3VwZXJDbGFzczogVCwgc2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTaHVmZmxlRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIHByaXZhdGUgX3NodWZmbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8vIERlZmluZSB0aGUgcHJvcGVydHkgd2l0aCB0aGUgY3VzdG9tIGNvbnZlcnRlclxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZWZsZWN0OiB0cnVlLFxuICAgICAgY29udmVydGVyOiBzdHJpbmdUb0Jvb2xlYW5Db252ZXJ0ZXJcbiAgICB9KVxuICAgIHNldCBzaHVmZmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX3NodWZmbGU7XG4gICAgICB0aGlzLl9zaHVmZmxlID0gdmFsdWU7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fc2h1ZmZsZUNob2ljZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3Jlc2V0U2h1ZmZsZUNob2ljZXMoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgnc2h1ZmZsZScsIG9sZFZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXQgc2h1ZmZsZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaHVmZmxlO1xuICAgIH1cblxuICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIC8vIENhbGwgX3Jlc2V0U2h1ZmZsZUNob2ljZXMgaW5pdGlhbGx5IHRvIHNldCB0aGUgQ1NTIG9yZGVyIHRvIGluaXRpYWwuXG4gICAgICAvLyBJZiBzaHVmZmxlIGlzIHRydWUsIF9zaHVmZmxlQ2hvaWNlcyB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHZpYSB0aGUgc2V0dGVyLlxuICAgICAgaWYgKHRoaXMuc2h1ZmZsZSkge1xuICAgICAgICB0aGlzLl9zaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVzZXRTaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3NodWZmbGVDaG9pY2VzKCkge1xuICAgICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihzZWxlY3RvcikpO1xuICAgICAgY29uc3QgZml4ZWRFbGVtZW50czogQXJyYXk8eyBlbGVtZW50OiBIVE1MRWxlbWVudDsgaW5kZXg6IG51bWJlciB9PiA9IFtdO1xuICAgICAgY29uc3Qgbm9uRml4ZWRFbGVtZW50czogQXJyYXk8SFRNTEVsZW1lbnQ+ID0gW107XG5cbiAgICAgIC8vIFNlcGFyYXRlIGZpeGVkIGFuZCBub24tZml4ZWQgZWxlbWVudHNcbiAgICAgIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoY2hvaWNlLmhhc0F0dHJpYnV0ZSgnZml4ZWQnKSkge1xuICAgICAgICAgIGZpeGVkRWxlbWVudHMucHVzaCh7IGVsZW1lbnQ6IGNob2ljZSwgaW5kZXg6IGluZGV4IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vbkZpeGVkRWxlbWVudHMucHVzaChjaG9pY2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgdGhlcmUgYXJlIDEgb3IgZmV3ZXIgbm9uLWZpeGVkIGVsZW1lbnRzLCB0aHJvdyBhbiBlcnJvciAobm8gc2h1ZmZsZSBwb3NzaWJsZSlcbiAgICAgIGlmIChub25GaXhlZEVsZW1lbnRzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU2h1ZmZsaW5nIGlzIG5vdCBwb3NzaWJsZSB3aXRoIGZld2VyIHRoYW4gMiBub24tZml4ZWQgZWxlbWVudHMuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGlzU2h1ZmZsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IG1heEF0dGVtcHRzID0gMTA7IC8vIE1heCBhdHRlbXB0cyB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzXG4gICAgICBsZXQgYXR0ZW1wdCA9IDA7XG5cbiAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIG9yZGVyIGZvciBjb21wYXJpc29uXG4gICAgICBjb25zdCBvcmlnaW5hbE9yZGVyID0gWy4uLm5vbkZpeGVkRWxlbWVudHNdO1xuXG4gICAgICAvLyBTaHVmZmxlIHVudGlsIHRoZSByZXN1bHQgaXMgZGlmZmVyZW50IG9yIG1heEF0dGVtcHRzIGlzIHJlYWNoZWRcbiAgICAgIHdoaWxlICghaXNTaHVmZmxlZCAmJiBhdHRlbXB0IDwgbWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgYXR0ZW1wdCsrO1xuXG4gICAgICAgIC8vIFNodWZmbGUgbm9uLWZpeGVkIGVsZW1lbnRzXG4gICAgICAgIGZvciAobGV0IGkgPSBub25GaXhlZEVsZW1lbnRzLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICBjb25zdCBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICAgICAgW25vbkZpeGVkRWxlbWVudHNbaV0sIG5vbkZpeGVkRWxlbWVudHNbal1dID0gW25vbkZpeGVkRWxlbWVudHNbal0sIG5vbkZpeGVkRWxlbWVudHNbaV1dO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNodWZmbGVkIHJlc3VsdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgb3JkZXJcbiAgICAgICAgaXNTaHVmZmxlZCA9ICFub25GaXhlZEVsZW1lbnRzLmV2ZXJ5KChjaG9pY2UsIGluZGV4KSA9PiBjaG9pY2UgPT09IG9yaWdpbmFsT3JkZXJbaW5kZXhdKTtcblxuICAgICAgICBpZiAoaXNTaHVmZmxlZCkgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNTaHVmZmxlZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBzaHVmZmxlIHRoZSBjaG9pY2VzIGFmdGVyIG11bHRpcGxlIGF0dGVtcHRzLicpO1xuICAgICAgfVxuXG4gICAgICAvLyBBc3NpZ24gb3JkZXIgdG8gZWFjaCBlbGVtZW50XG4gICAgICBsZXQgb3JkZXIgPSAxO1xuICAgICAgY2hvaWNlcy5mb3JFYWNoKChjaG9pY2U6IEhUTUxFbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoY2hvaWNlLmhhc0F0dHJpYnV0ZSgnZml4ZWQnKSkge1xuICAgICAgICAgIGNob2ljZS5zdHlsZS5zZXRQcm9wZXJ0eSgnb3JkZXInLCBTdHJpbmcob3JkZXIrKykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5vbkZpeGVkQ2hvaWNlID0gbm9uRml4ZWRFbGVtZW50cy5zaGlmdCgpO1xuICAgICAgICAgIG5vbkZpeGVkQ2hvaWNlIS5zdHlsZS5zZXRQcm9wZXJ0eSgnb3JkZXInLCBTdHJpbmcob3JkZXIrKykpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXNldFNodWZmbGVDaG9pY2VzKCkge1xuICAgICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgICAgIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlLCBpbmRleCkgPT4ge1xuICAgICAgICBjaG9pY2Uuc3R5bGUuc2V0UHJvcGVydHkoJ29yZGVyJywgJ2luaXRpYWwnKTsgLy8gY2hvaWNlLnN0eWxlLm9yZGVyID0gJ2luaXRpYWwnO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBTaHVmZmxlRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxTaHVmZmxlSW50ZXJmYWNlPiAmIFQ7XG59O1xuXG5jb25zdCBzdHJpbmdUb0Jvb2xlYW5Db252ZXJ0ZXIgPSB7XG4gIGZyb21BdHRyaWJ1dGUodmFsdWU6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICd0cnVlJztcbiAgfSxcbiAgdG9BdHRyaWJ1dGUodmFsdWU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHJldHVybiB2YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH1cbn07XG4iLCAiLyoqXG4gKiBNaXhpbiB0aGF0IHByb3ZpZGVzIHNodWZmbGluZyBmdW5jdGlvbmFsaXR5IGZvciBhIExpdEVsZW1lbnQuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSBMaXRFbGVtZW50IHN1YmNsYXNzLlxuICogQHBhcmFtIHtUfSBzdXBlckNsYXNzIC0gVGhlIHN1cGVyY2xhc3MgdG8gZXh0ZW5kLlxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gVGhlIENTUyBzZWxlY3RvciBmb3IgdGhlIGVsZW1lbnRzIHRvIHNodWZmbGUuXG4gKiBAcmV0dXJucyB7Q29uc3RydWN0b3I8U2h1ZmZsZUludGVyZmFjZT4gJiBUfSAtIFRoZSBleHRlbmRlZCBjbGFzcyB3aXRoIHNodWZmbGluZyBmdW5jdGlvbmFsaXR5LlxuICpcbiAqIGFkZHMgYSBzaHVmZmxlIHByb3BlcnR5IHRvIHRoZSBjbGFzcyB3aXRoIGFuIGF0dHJpYnV0ZSBjb252ZXJ0ZXJcbiAqXG4gKiBxdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvblxuICogcXRpLWNob2ljZS1pbnRlcmFjdGlvblxuICogcXRpLW1hdGNoLWludGVyYWN0aW9uXG4gKi9cbmltcG9ydCB7IFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpU2ltcGxlQ2hvaWNlIH0gZnJvbSAnLi4vLi4vcXRpLXNpbXBsZS1jaG9pY2UnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbnR5cGUgTGFiZWxUeXBlID0gJ3F0aS1sYWJlbHMtZGVjaW1hbCcgfCAncXRpLWxhYmVscy1sb3dlci1hbHBoYScgfCAncXRpLWxhYmVscy11cHBlci1hbHBoYSc7XG50eXBlIExhYmVsU3VmZml4VHlwZSA9ICdxdGktbGFiZWxzLXN1ZmZpeC1wZXJpb2QnIHwgJ3F0aS1sYWJlbHMtc3VmZml4LXBhcmVudGhlc2lzJztcblxuZGVjbGFyZSBjbGFzcyBWb2NhYnVsYXJ5SW50ZXJmYWNlIHt9XG5cbmV4cG9ydCBjb25zdCBWb2NhYnVsYXJ5TWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oc3VwZXJDbGFzczogVCwgc2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBWb2NhYnVsYXJ5RWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIHByaXZhdGUgX2NsYXNzZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBfYWxsTGFiZWxzID0gWydxdGktbGFiZWxzLWRlY2ltYWwnLCAncXRpLWxhYmVscy1sb3dlci1hbHBoYScsICdxdGktbGFiZWxzLXVwcGVyLWFscGhhJ107XG4gICAgcHJpdmF0ZSBfYWxsTGFiZWxTdWZmaXhlcyA9IFsncXRpLWxhYmVscy1zdWZmaXgtcGVyaW9kJywgJ3F0aS1sYWJlbHMtc3VmZml4LXBhcmVudGhlc2lzJ10gYXMgTGFiZWxTdWZmaXhUeXBlW107XG4gICAgLy8gRGVmaW5lIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBjdXN0b20gY29udmVydGVyXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIHJlZmxlY3Q6IHRydWVcbiAgICB9KVxuICAgIHNldCBjbGFzcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fY2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgICB0aGlzLl9jbGFzc2VzID0gdmFsdWUuc3BsaXQoJyAnKTtcblxuICAgICAgdGhpcy5fYWRkTGFiZWxzKCk7XG4gICAgICAvLyB0aGlzLnJlcXVlc3RVcGRhdGUoJ2NsYXNzJywgb2xkVmFsdWUpO1xuICAgIH1cbiAgICBnZXQgY2xhc3MoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLl9jbGFzc2VzPy5qb2luKCcgJykgfHwgJyc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlcyk6IHZvaWQge1xuICAgICAgc3VwZXIudXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgICAgaWYgKF9jaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3NodWZmbGUnKSkge1xuICAgICAgICB0aGlzLl9hZGRMYWJlbHMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9hZGRMYWJlbHMoKSB7XG4gICAgICBjb25zdCBjbGFzc0NvbnRhaW5zTGFiZWwgPSB0aGlzLl9jbGFzc2VzLnNvbWUoXG4gICAgICAgIGNscyA9PiB0aGlzLl9hbGxMYWJlbHMuaW5jbHVkZXMoY2xzKSB8fCB0aGlzLl9hbGxMYWJlbFN1ZmZpeGVzLmluY2x1ZGVzKGNscyBhcyBMYWJlbFN1ZmZpeFR5cGUpXG4gICAgICApO1xuICAgICAgY29uc3QgaXNOdW1iZXIgPSB2YWx1ZSA9PiB7XG4gICAgICAgIHJldHVybiAhaXNOYU4oK3ZhbHVlKTtcbiAgICAgIH07XG4gICAgICBpZiAoY2xhc3NDb250YWluc0xhYmVsKSB7XG4gICAgICAgIGNvbnN0IGNob2ljZUVsZW1lbnRzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpLm1hcChjID0+IGMgYXMgUXRpU2ltcGxlQ2hvaWNlKTtcbiAgICAgICAgY29uc3QgY2hvaWNlcyA9IGNob2ljZUVsZW1lbnRzXG4gICAgICAgICAgLm1hcCgoY2hvaWNlOiBIVE1MRWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IGVsOiBjaG9pY2UsIG9yZGVyOiBpc051bWJlcihjaG9pY2Uuc3R5bGUub3JkZXIpID8gK2Nob2ljZS5zdHlsZS5vcmRlciA6IGluZGV4ICsgMSB9O1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKVxuICAgICAgICAgIC5tYXAoY2hvaWNlID0+IGNob2ljZS5lbCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hvaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIChjaG9pY2VzW2ldIGFzIFF0aVNpbXBsZUNob2ljZSkubWFya2VyID0gdGhpcy5fZ2V0TGFiZWwoaSArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgX2dldExhYmVsKGluZGV4OiBudW1iZXIpIHtcbiAgICAgIGxldCBsYXN0TGFiZWwgPSB0aGlzLl9jbGFzc2VzLmZpbHRlcihjID0+IHRoaXMuX2FsbExhYmVscy5pbmNsdWRlcyhjKSkucG9wKCkgYXMgTGFiZWxUeXBlO1xuICAgICAgY29uc3QgbGFzdExhYmVsU3VmZml4ID0gdGhpcy5fY2xhc3Nlcy5maWx0ZXIoYyA9PiB0aGlzLl9hbGxMYWJlbFN1ZmZpeGVzLmluY2x1ZGVzKGMgYXMgTGFiZWxTdWZmaXhUeXBlKSkucG9wKCk7XG5cbiAgICAgIGlmICghbGFzdExhYmVsICYmIGxhc3RMYWJlbFN1ZmZpeCkge1xuICAgICAgICAvLyBhIHN1ZmZpeCB3aXRob3V0IGEgbGFiZWwgaXMgc3RyYW5nZSBzbyBhZGQgcXRpLWxhYmVscy11cHBlci1hbHBoYVxuICAgICAgICBsYXN0TGFiZWwgPSAncXRpLWxhYmVscy11cHBlci1hbHBoYSc7XG4gICAgICB9XG4gICAgICBsZXQgbGFiZWwgPSAnJztcbiAgICAgIHN3aXRjaCAobGFzdExhYmVsKSB7XG4gICAgICAgIGNhc2UgJ3F0aS1sYWJlbHMtZGVjaW1hbCc6XG4gICAgICAgICAgbGFiZWwgPSBgJHtpbmRleH1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdxdGktbGFiZWxzLWxvd2VyLWFscGhhJzpcbiAgICAgICAgICBsYWJlbCA9IGAke1N0cmluZy5mcm9tQ2hhckNvZGUoOTcgKyBpbmRleCAtIDEpfWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3F0aS1sYWJlbHMtdXBwZXItYWxwaGEnOlxuICAgICAgICAgIGxhYmVsID0gYCR7U3RyaW5nLmZyb21DaGFyQ29kZSg2NSArIGluZGV4IC0gMSl9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0TGFiZWxTdWZmaXggPT09ICdxdGktbGFiZWxzLXN1ZmZpeC1wZXJpb2QnKSB7XG4gICAgICAgIGxhYmVsICs9ICcuJztcbiAgICAgIH0gZWxzZSBpZiAobGFzdExhYmVsU3VmZml4ID09PSAncXRpLWxhYmVscy1zdWZmaXgtcGFyZW50aGVzaXMnKSB7XG4gICAgICAgIGxhYmVsICs9IGApYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsYWJlbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFZvY2FidWxhcnlFbGVtZW50IGFzIENvbnN0cnVjdG9yPFZvY2FidWxhcnlJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICBbcGFydD0nc2xvdCddIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiB2YXIoLS1xdGktZ2FwLXNpemUpO1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgfVxuXG4gIDo6c2xvdHRlZChxdGktc2ltcGxlLWNob2ljZSkge1xuICAgIGZsZXg6IDAgMFxuICAgICAgY2FsYygoMTAwJSAtICh2YXIoLS1xdGktZ2FwLXNpemUpICogdmFyKC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZykpKSAvIHZhcigtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmcpKSAhaW1wb3J0YW50O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDtcbiAgfVxuXG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy0xKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogMTtcbiAgfVxuXG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy0yKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogMjtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtc3RhY2tpbmctMykgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmc6IDM7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTQpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiA0O1xuICB9XG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy01KSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogNTtcbiAgfVxuICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgfVxuYDtcbiIsICJpbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBDaG9pY2VzSW50ZXJmYWNlLCBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgU2h1ZmZsZU1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvc2h1ZmZsZS9zaHVmZmxlLW1peGluJztcbmltcG9ydCB7IFZvY2FidWxhcnlNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL3ZvY2FidWxhcnkvdm9jYWJ1bGFyeS1taXhpbic7XG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi5zdHlsZXMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktY2hvaWNlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlDaG9pY2VJbnRlcmFjdGlvblxuICBleHRlbmRzIFZvY2FidWxhcnlNaXhpbihcbiAgICBTaHVmZmxlTWl4aW4oQ2hvaWNlc01peGluKEludGVyYWN0aW9uLCAncXRpLXNpbXBsZS1jaG9pY2UnKSwgJ3F0aS1zaW1wbGUtY2hvaWNlJyksXG4gICAgJ3F0aS1zaW1wbGUtY2hvaWNlJ1xuICApXG4gIGltcGxlbWVudHMgQ2hvaWNlc0ludGVyZmFjZVxue1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+PHNsb3QgcGFydD1cInNsb3RcIj48L3Nsb3Q+XG4gICAgICA8ZGl2IHJvbGU9XCJhbGVydFwiIGlkPVwidmFsaWRhdGlvbk1lc3NhZ2VcIj48L2Rpdj5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24nOiBRdGlDaG9pY2VJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpUnVsZSwgUXRpUnVsZUJhc2UgfSBmcm9tICcuLic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3V0Y29tZS1wcm9jZXNzaW5nJylcbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lUHJvY2Vzc2luZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgY29uc3QgbG9naWMgPSBuZXcgUXRpT3V0Y29tZVByb2Nlc3NpbmdQcm9jZXNzb3IoKTtcbiAgICBjb25zdCBydWxlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlSdWxlW107XG4gICAgbG9naWMucHJvY2VzcyhydWxlcyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW91dGNvbWUtcHJvY2Vzc2luZyc6IFF0aU91dGNvbWVQcm9jZXNzaW5nO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lUHJvY2Vzc2luZ1Byb2Nlc3NvciB7XG4gIHB1YmxpYyBwcm9jZXNzKHJ1bGVzOiBRdGlSdWxlQmFzZVtdKSB7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICBydWxlLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbWF0Y2hDb3JyZWN0ID0gYDxxdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5cbiAgPHF0aS1yZXNwb25zZS1jb25kaXRpb24+XG4gICAgPHF0aS1yZXNwb25zZS1pZj5cbiAgICAgIDxxdGktbWF0Y2g+XG4gICAgICAgIDxxdGktdmFyaWFibGUgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktdmFyaWFibGU+XG4gICAgICAgIDxxdGktY29ycmVjdCBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS1jb3JyZWN0PlxuICAgICAgPC9xdGktbWF0Y2g+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4xPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWlmPlxuICAgIDxxdGktcmVzcG9uc2UtZWxzZT5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjA8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtZWxzZT5cbiAgPC9xdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuPC9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5gO1xuXG5leHBvcnQgY29uc3QgbWFwUmVzcG9uc2UgPSBgPHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nPlxuICA8cXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbiAgICA8cXRpLXJlc3BvbnNlLWlmPlxuICAgICAgPHF0aS1pcy1udWxsPlxuICAgICAgICA8cXRpLXZhcmlhYmxlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLXZhcmlhYmxlPlxuICAgICAgPC9xdGktaXMtbnVsbD5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjAuMDwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1pZj5cbiAgICA8cXRpLXJlc3BvbnNlLWVsc2U+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLW1hcC1yZXNwb25zZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj4gPC9xdGktbWFwLXJlc3BvbnNlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtZWxzZT5cbiAgPC9xdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuPC9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5gO1xuXG5leHBvcnQgY29uc3QgbWFwUmVzcG9uc2VQb2ludCA9IGA8cXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+XG4gIDxxdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuICAgIDxxdGktcmVzcG9uc2UtaWY+XG4gICAgICA8cXRpLWlzLW51bGw+XG4gICAgICAgIDxxdGktdmFyaWFibGUgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktdmFyaWFibGU+XG4gICAgICA8L3F0aS1pcy1udWxsPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MDwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1pZj5cbiAgICA8cXRpLXJlc3BvbnNlLWVsc2U+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLW1hcC1yZXNwb25zZS1wb2ludCBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS1tYXAtcmVzcG9uc2UtcG9pbnQ+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1lbHNlPlxuICA8L3F0aS1yZXNwb25zZS1jb25kaXRpb24+XG48L3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nPmA7XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50LCBQcm9wZXJ0eVZhbHVlTWFwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IG1hcFJlc3BvbnNlLCBtYXBSZXNwb25zZVBvaW50LCBtYXRjaENvcnJlY3QgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC90ZW1wbGF0ZS1zdHJpbmdzJztcbmltcG9ydCB7IHR5cGUgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nJylcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF0aVJlc3BvbnNlUHJvY2Vzc2luZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgY29uc3QgcnVsZXMgPSBbLi4udGhpcy5jaGlsZHJlbl0gYXMgUXRpUnVsZVtdO1xuXG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICBydWxlLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZU1hcDxhbnk+IHwgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPik6IHZvaWQge1xuICAgIGlmICh0aGlzLmdldEF0dHJpYnV0ZSgndGVtcGxhdGUnKSkge1xuICAgICAgY29uc3Qgc3BsaXR0ZWRUZW1wbGF0ZU5hbWUgPSB0aGlzLmdldEF0dHJpYnV0ZSgndGVtcGxhdGUnKSEuc3BsaXQoJy8nKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlTmFtZSA9IHNwbGl0dGVkVGVtcGxhdGVOYW1lW3NwbGl0dGVkVGVtcGxhdGVOYW1lLmxlbmd0aCAtIDFdLnJlcGxhY2UoJy54bWwnLCAnJyk7XG4gICAgICB0aGlzLmlubmVySFRNTCA9ICcnO1xuICAgICAgc3dpdGNoICh0ZW1wbGF0ZU5hbWUpIHtcbiAgICAgICAgY2FzZSAnbWFwX3Jlc3BvbnNlJzoge1xuICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy5mcmFnbWVudEZyb21TdHJpbmcobWFwUmVzcG9uc2UpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdtYXBfcmVzcG9uc2VfcG9pbnQnOiB7XG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLmZyYWdtZW50RnJvbVN0cmluZyhtYXBSZXNwb25zZVBvaW50KS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbWF0Y2hfY29ycmVjdCc6XG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLmZyYWdtZW50RnJvbVN0cmluZyhtYXRjaENvcnJlY3QpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZyYWdtZW50RnJvbVN0cmluZyhzdHJIVE1MOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoc3RySFRNTCk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnOiBRdGlSZXNwb25zZVByb2Nlc3Npbmc7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcnVsZScpXG5leHBvcnQgY2xhc3MgUXRpUnVsZSBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBRdGlSdWxlQmFzZSB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdGlSdWxlQmFzZSB7XG4gIHByb2Nlc3MoKTogYW55O1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcnVsZSc6IFF0aVJ1bGU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBPdXRjb21lVmFyaWFibGUgfSBmcm9tICdAY2l0b2xhYi9xdGktY29tcG9uZW50cy9xdGktY29tcG9uZW50cyc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdXRpbHMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbi8qKlxuICogVGhlIGxvb2t1cE91dGNvbWVWYWx1ZSBydWxlIHNldHMgdGhlIHZhbHVlIG9mIGFuIG91dGNvbWUgdmFyaWFibGUgdG8gdGhlIHZhbHVlIG9idGFpbmVkXG4gKiBieSBsb29raW5nIHVwIHRoZSB2YWx1ZSBvZiB0aGUgYXNzb2NpYXRlZCBleHByZXNzaW9uIGluIHRoZSBsb29rdXBUYWJsZSBhc3NvY2lhdGVkXG4gKiB3aXRoIHRoZSBvdXRjb21lJ3MgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdGlMb29rdXBPdXRjb21lVmFsdWUgZXh0ZW5kcyBRdGlSdWxlIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBnZXQgY2hpbGRFeHByZXNzaW9uKCk6IFF0aUV4cHJlc3Npb248c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxzdHJpbmc+O1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHByb2Nlc3MoKTogbnVtYmVyIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGUgPSB0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKS5nZXRWYXJpYWJsZShpZGVudGlmaWVyKSBhcyBPdXRjb21lVmFyaWFibGU7XG4gICAgbGV0IHZhbHVlO1xuICAgIGlmIChvdXRjb21lVmFyaWFibGUuaW50ZXJwb2xhdGlvblRhYmxlKSB7XG4gICAgICB2YWx1ZSA9IG91dGNvbWVWYXJpYWJsZS5pbnRlcnBvbGF0aW9uVGFibGUuZ2V0KHBhcnNlSW50KHRoaXMuY2hpbGRFeHByZXNzaW9uLmNhbGN1bGF0ZSgpKSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ2xvb2t1cE91dGNvbWVWYWx1ZTogdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfT4oJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIG91dGNvbWVJZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICAgICAgdmFsdWU6IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0KHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZScsIFF0aUxvb2t1cE91dGNvbWVWYWx1ZSk7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZSc6IFF0aUxvb2t1cE91dGNvbWVWYWx1ZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUNvbmRpdGlvbiBleHRlbmRzIFF0aVJ1bGUge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgcHJvY2VzcygpIHtcbiAgICBjb25zdCBicmFuY2hlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlFeHByZXNzaW9uPGFueT5bXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhbmNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJyYW5jaCA9IGJyYW5jaGVzW2ldO1xuXG4gICAgICBpZiAoYnJhbmNoLmNhbGN1bGF0ZSgpKSB7XG4gICAgICAgIChicmFuY2ggYXMgdW5rbm93biBhcyBRdGlSdWxlKS5wcm9jZXNzKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1jb25kaXRpb24nLCBRdGlSZXNwb25zZUNvbmRpdGlvbik7XG4iLCAiaW1wb3J0IHsgY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC91dGlscyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uLCBRdGlFeHByZXNzaW9uQmFzZSB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUsIFF0aVJ1bGVCYXNlIH0gZnJvbSAnLi4vcXRpLXJ1bGUnO1xuXG5leHBvcnQgY2xhc3MgUXRpU2V0T3V0Y29tZVZhbHVlIGV4dGVuZHMgUXRpUnVsZSB7XG4gIHB1YmxpYyBvdmVycmlkZSBwcm9jZXNzKCkge1xuICAgIGNvbnN0IG91dGNvbWVJZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcblxuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248c3RyaW5nPjtcblxuICAgIGNvbnN0IHJ1bGUgPSBuZXcgUXRpU2V0T3V0Y29tZVZhbHVlUnVsZShleHByZXNzaW9uKTtcbiAgICBjb25zdCB2YWx1ZSA9IHJ1bGUucHJvY2VzcygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLXNldC1vdXRjb21lLXZhbHVlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgdmFsdWU6IEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgICA/IHZhbHVlLm1hcCgodjogc3RyaW5nKSA9PiBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCh2KSlcbiAgICAgICAgICAgIDogY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQodmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXRpU2V0T3V0Y29tZVZhbHVlUnVsZTxUPiBpbXBsZW1lbnRzIFF0aVJ1bGVCYXNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHByZXNzaW9uOiBRdGlFeHByZXNzaW9uQmFzZTxUPikge31cblxuICBwcm9jZXNzKCk6IGFueSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmV4cHJlc3Npb24gPyB0aGlzLmV4cHJlc3Npb24uY2FsY3VsYXRlKCkgOiBudWxsO1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2Fybignc2V0T3V0Y29tZVZhbHVlOiB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCBRdGlTZXRPdXRjb21lVmFsdWUpO1xuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlRWxzZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3ViUnVsZXMoKTogUXRpUnVsZVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuY2hpbGRyZW5dIGFzIFF0aVJ1bGVbXTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIGNvbnN0IHN1YlJ1bGVzID0gdGhpcy5nZXRTdWJSdWxlcygpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViUnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN1YlJ1bGUgPSBzdWJSdWxlc1tpXTtcbiAgICAgIHN1YlJ1bGUucHJvY2VzcygpO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1lbHNlJywgUXRpUmVzcG9uc2VFbHNlKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uLy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcbmltcG9ydCB7IFF0aVJlc3BvbnNlRWxzZSB9IGZyb20gJy4uL3F0aS1yZXNwb25zZS1lbHNlJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlSWYgZXh0ZW5kcyBRdGlSZXNwb25zZUVsc2Uge1xuICBwdWJsaWMgb3ZlcnJpZGUgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj47XG4gICAgY29uc3QgcmVzdWx0ID0gZXhwcmVzc2lvbi5jYWxjdWxhdGUoKSBhcyBib29sZWFuO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0U3ViUnVsZXMoKTogUXRpUnVsZVtdIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY2hpbGRyZW5baV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXJlc3BvbnNlLWlmJywgUXRpUmVzcG9uc2VJZik7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlSZXNwb25zZUlmIH0gZnJvbSAnLi4vcXRpLXJlc3BvbnNlLWlmJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlRWxzZUlmIGV4dGVuZHMgUXRpUmVzcG9uc2VJZiB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAke3N1cGVyLnJlbmRlcigpfWA7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtZWxzZS1pZicsIFF0aVJlc3BvbnNlRWxzZUlmKTtcbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUsIFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgaXRlbUNvbnRleHQsIEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpTXVsdGlwbGUgfSBmcm9tICcuL3F0aS1tdWx0aXBsZS9xdGktbXVsdGlwbGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF0aUV4cHJlc3Npb25CYXNlPFQ+IHtcbiAgLy8gZ2V0IGFzc2Vzc21lbnRJdGVtKCk6IFF0aUFzc2Vzc21lbnRJdGVtO1xuXG4gIC8vIGdldFZhcmlhYmxlcygpOiBWYXJpYWJsZURlY2xhcmF0aW9uPG51bWJlciB8IHN0cmluZyB8IChudW1iZXIgfCBzdHJpbmcpW10gfCBudWxsPltdO1xuICBjYWxjdWxhdGUoKTogUmVhZG9ubHk8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBRdGlFeHByZXNzaW9uPFQ+IGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIFF0aUV4cHJlc3Npb25CYXNlPFQ+IHtcbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIHJlc3VsdDogYW55O1xuXG4gIC8vIGhpZGUgdGhlIHNsb3Qgd2l0aCBjc3NcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICBzbG90IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8cHJlPiR7SlNPTi5zdHJpbmdpZnkodGhpcy5yZXN1bHQsIG51bGwsIDIpfTwvcHJlPlxuICAgICAgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCk6IFJlYWRvbmx5PFQ+IHtcbiAgICB0aGlzLnJlc3VsdCA9IHRoaXMuZ2V0UmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFJlc3VsdCgpOiBSZWFkb25seTxUPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcm90ZWN0ZWQgY29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIGdldFZhcmlhYmxlcyA9ICgpOiBWYXJpYWJsZURlY2xhcmF0aW9uPG51bWJlciB8IHN0cmluZyB8IChudW1iZXIgfCBzdHJpbmcpW10gfCBudWxsPltdID0+XG4gICAgLy8gRklYTUU6IGlmIHRoaXMgaXRzZWxmIGlzIG11bHRpcGxlLCB0aGlzIHdpbGwgbmV2ZXIgZW50ZXIgdGhlIHF0aS1tdWx0aXBsZSBzd2l0Y2hcbiAgICAvLyBTZWUgdGhpcyBleGFtcGxlIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS8xRWRUZWNoL3F0aS1leGFtcGxlcy9ibG9iL21hc3Rlci9xdGl2My1leGFtcGxlcy9wYWNrYWdpbmcvaXRlbXMvRXhhbXBsZTA1LWZlZWRiYWNrQmxvY2stYWRhcHRpdmUueG1sXG5cbiAgICBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pXG4gICAgICAubWFwKChlOiBFbGVtZW50KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjYXNlICdxdGktYmFzZS12YWx1ZSc6IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGJhc2VUeXBlOiBlLmdldEF0dHJpYnV0ZSgnYmFzZS10eXBlJyksXG4gICAgICAgICAgICAgIHZhbHVlOiBlLnRleHRDb250ZW50LnRyaW0oKSxcbiAgICAgICAgICAgICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnXG4gICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS12YXJpYWJsZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHx8IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS1tdWx0aXBsZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IG11bHRpcGxlID0gZSBhcyBRdGlNdWx0aXBsZTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG11bHRpcGxlLmdldFJlc3VsdCgpO1xuICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJycsXG4gICAgICAgICAgICAgICAgYmFzZVR5cGU6IHZhbHVlc1swXS5iYXNlVHlwZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVzLm1hcCh2ID0+IHYudmFsdWUpLFxuICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAnbXVsdGlwbGUnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdyZXNwb25zZSdcbiAgICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS1jb3JyZWN0Jzoge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlOiBSZXNwb25zZVZhcmlhYmxlID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB8fCBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYmFzZVR5cGU6IHJlc3BvbnNlVmFyaWFibGUuYmFzZVR5cGUsXG4gICAgICAgICAgICAgIHZhbHVlOiByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZSxcbiAgICAgICAgICAgICAgY2FyZGluYWxpdHk6IHJlc3BvbnNlVmFyaWFibGUuY2FyZGluYWxpdHlcbiAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgLy8gYWRkZWQgZm9yIHVzZSBvZiBxdGktZXF1YWwtcm91bmRlZFxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IGUgYXMgUXRpRXhwcmVzc2lvbjxudW1iZXI+O1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGV4cHJlc3Npb24uZ2V0UmVzdWx0KCk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYmFzZVR5cGU6ICdpbnRlZ2VyJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZSdcbiAgICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdkZWZhdWx0IG5vdCBzdWZmaWNpZW50Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKHYgPT4gdiAhPT0gbnVsbCk7XG59XG4iLCAiaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgY2FsY3VsYXRlKCk6IFJlYWRvbmx5PGJvb2xlYW4+IHtcbiAgICB0aGlzLnJlc3VsdCA9IHRoaXMuZ2V0UmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGdldFJlc3VsdCgpOiBSZWFkb25seTxib29sZWFuPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUPiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5leHBvcnQgY2xhc3MgUXRpQW5kIGV4dGVuZHMgcXRpQW5kTWl4aW4oUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFF0aUNvbmRpdGlvbkV4cHJlc3Npb24+KSB7XG4gIHB1YmxpYyBjYWxjdWxhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlQ2hpbGRyZW4oQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuIGFzIHVua25vd24gYXMgUXRpRXhwcmVzc2lvbjxhbnk+W10pKTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBNb2NrUXRpRXhwcmVzc2lvbjxUPiA9IHsgY2FsY3VsYXRlOiAoKSA9PiBUIH07XG50eXBlIE1vY2tDb25zdHJ1Y3RvciA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IHt9O1xuZXhwb3J0IGZ1bmN0aW9uIHF0aUFuZE1peGluPFRCYXNlIGV4dGVuZHMgTW9ja0NvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICByZXR1cm4gY2xhc3MgTW9ja1F0aUFuZCBleHRlbmRzIEJhc2Uge1xuICAgIHB1YmxpYyBjYWxjdWxhdGVDaGlsZHJlbihjaGlsZHJlbjogQXJyYXk8TW9ja1F0aUV4cHJlc3Npb248YW55Pj4pIHtcbiAgICAgIC8vIGNoaWxkcmVuIGNhbiBiZSBhIG1peCBvZiBxdGktZXhwcmVzc2lvbiBhbmQgcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uXG4gICAgICBjb25zdCB2YWx1ZXMgPSBjaGlsZHJlbi5tYXAoYyA9PiB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IGMgYXMgTW9ja1F0aUV4cHJlc3Npb248YW55PjtcbiAgICAgICAgaWYgKCFjb25kaXRpb24uY2FsY3VsYXRlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVsZW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgUXRpQ29uZGl0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmRpdGlvbi5jYWxjdWxhdGUoKTtcbiAgICAgICAgbGV0IHZhbCA9IGZhbHNlO1xuICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB2YWx1ZSB0byBib29sZWFuIGFuZCByZXR1cm4gbnVsbCBpZiBub3QgcG9zc2libGVcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgdmFsID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICB2YWwgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWwgaW4gcXRpLW9yLCBleHBlY3RlZCBib29sZWFuJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB2YWwgPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlcy5ldmVyeShlID0+IHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBlID09PSAnYm9vbGVhbicgJiYgZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBRdGlBbmQgfSBmcm9tICcuL3F0aS1hbmQnO1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktYW5kJywgUXRpQW5kKTtcblxuZXhwb3J0ICogZnJvbSAnLi9xdGktYW5kJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFuZCc6IFF0aUFuZDtcbiAgfVxufVxuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQmFzZVR5cGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aUJhc2VWYWx1ZSBleHRlbmRzIFF0aUV4cHJlc3Npb248c3RyaW5nPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGUgPSAnc3RyaW5nJztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktYmFzZS12YWx1ZScsIFF0aUJhc2VWYWx1ZSk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpQ29udGFpbnMgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBmb3Igb3RoZXIgdHlwZXMgdGhhbiBkaXJlY3RlZFBhaXJcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSA9PT0gJ211bHRpcGxlJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMiA9IHZhbHVlMi52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICAgICAgY29uc3QgZW51bWVyYWJsZSA9IHByb2plY3Rpb24xLmZpbHRlcih4ID0+IHByb2plY3Rpb24yLmluY2x1ZGVzKHgpKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBlbnVtZXJhYmxlLmxlbmd0aCA+IDA7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB2YWx1ZTEuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMi5iYXNlVHlwZSA9PT0gJ2RpcmVjdGVkUGFpcicgJiZcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ID09PSAnc2luZ2xlJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbjIgPSB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgICAgIHJldHVybiBwcm9qZWN0aW9uMi5pbmNsdWRlcyhwcm9qZWN0aW9uMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICd1bnN1cHBvcnRlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgY29udGFpbnMsIG9ubHkgYmFzZVR5cGU6IGRpcmVjdGVkUGFpciBhbmQgY2FyZGluYWxpdHk6IG11bHRpcGxlIGlzIHN1cHBvcnRlZCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIGNvbnRhaW5zJyk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1jb250YWlucycsIFF0aUNvbnRhaW5zKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUNvcnJlY3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIGdldCBpbnRlcnByZXRhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ2ludGVycHJldGF0aW9uJykgfHwgJyc7XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZTogUmVzcG9uc2VWYXJpYWJsZSA9IHRoaXMuY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgICBpZiAocmVzcG9uc2VWYXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgIHJldHVybiByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZS5sZW5ndGggPiAwID8gcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2VbMF0gOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1jb3JyZWN0JywgUXRpQ29ycmVjdCk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlFcXVhbFJvdW5kZWQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHJvdW5kaW5nTW9kZTogJ2RlY2ltYWxQbGFjZXMnIHwgJ3NpZ25pZmljYW50RmlndXJlcycgPSAnc2lnbmlmaWNhbnRGaWd1cmVzJztcblxuICBnZXQgZmlndXJlcygpIHtcbiAgICBjb25zdCBhdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpZ3VyZXMnKTtcbiAgICBpZiAoIWF0dHIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgYXR0cmlidXRlIGlzIG1pc3NpbmcnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBmaWd1cmVzID0gcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpZ3VyZXMnKSB8fCAnMCcpO1xuICAgIGlmIChpc05hTihmaWd1cmVzKSkge1xuICAgICAgY29uc29sZS5lcnJvcignZmlndXJlcyBhdHRyaWJ1dGUgaXMgbm90IGEgbnVtYmVyJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGZpZ3VyZXMgPCAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGF0dHJpYnV0ZSBpcyBuZWdhdGl2ZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChmaWd1cmVzIDwgMSAmJiB0aGlzLnJvdW5kaW5nTW9kZSA9PT0gJ3NpZ25pZmljYW50RmlndXJlcycpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAxIGZvciBSb3VuZGluZ01vZGUgc2lnbmlmaWNhbnRGaWd1cmVzJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZpZ3VyZXM7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodGhpcy5yb3VuZGluZ01vZGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgdmFsdWUyLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMS52YWx1ZSkgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTIudmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgZXF1YWwnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh2YWx1ZXNbMF0uYmFzZVR5cGUpIHtcbiAgICAgICAgY2FzZSAnaW50ZWdlcic6XG4gICAgICAgIGNhc2UgJ2Zsb2F0Jzoge1xuICAgICAgICAgIGNvbnN0IGZsb2F0MSA9IHBhcnNlRmxvYXQodmFsdWUxLnZhbHVlIGFzIHN0cmluZyk7XG4gICAgICAgICAgY29uc3QgZmxvYXQyID0gcGFyc2VGbG9hdCh2YWx1ZTIudmFsdWUgYXMgc3RyaW5nKTtcblxuICAgICAgICAgIGlmICghaXNOYU4oZmxvYXQxKSAmJiAhaXNOYU4oZmxvYXQyKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucm91bmRpbmdNb2RlID09PSAnc2lnbmlmaWNhbnRGaWd1cmVzJykge1xuICAgICAgICAgICAgICByZXR1cm4gZmxvYXQxLnRvUHJlY2lzaW9uKHRoaXMuZmlndXJlcykgPT09IGZsb2F0Mi50b1ByZWNpc2lvbih0aGlzLmZpZ3VyZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGZsb2F0MSAqIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpKSAvIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpID09PVxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoZmxvYXQyICogTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcykpIC8gTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcylcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgdmFsdWUgY2Fubm90IGJlIGNhc3RlZCB0byBudW1lcmljIHZhbHVlIGluIGVxdWFsUm91bmRlZCBvcGVyYXRvcjogJHtmbG9hdDF9LCAke2Zsb2F0Mn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHZhbHVlcyBvdGhlciB0aGFuIGZsb2F0IGFuZCBpbnQgY2Fubm90IGJlIHVzZWQgaW4gZXF1YWxSb3VuZGVkIG9wZXJhdG9yLmApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aS1lcXVhbC1yb3VuZGVkJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZXF1YWwtcm91bmRlZCcsIFF0aUVxdWFsUm91bmRlZCk7XG4iLCAiaW1wb3J0IHsgQmFzZVR5cGUgfSBmcm9tICcuLi8uLic7XG5cbmV4cG9ydCBjbGFzcyBTY29yaW5nSGVscGVyIHtcbiAgcHVibGljIHN0YXRpYyBjb21wYXJlU2luZ2xlVmFsdWVzKHZhbHVlMTogUmVhZG9ubHk8c3RyaW5nPiwgdmFsdWUyOiBSZWFkb25seTxzdHJpbmc+LCBiYXNlVHlwZTogQmFzZVR5cGUpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGJhc2VUeXBlKSB7XG4gICAgICBjYXNlICdpZGVudGlmaWVyJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJldHVybiB2YWx1ZTEgPT09IHZhbHVlMjtcbiAgICAgIGNhc2UgJ2ludGVnZXInOiB7XG4gICAgICAgIGNvbnN0IGludDEgPSBwYXJzZUludCh2YWx1ZTEsIDEwKTtcbiAgICAgICAgY29uc3QgaW50MiA9IHBhcnNlSW50KHZhbHVlMiwgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKGludDEpICYmICFpc05hTihpbnQyKSkge1xuICAgICAgICAgIHJldHVybiBpbnQxID09PSBpbnQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCBjb252ZXJ0ICR7dmFsdWUxfSBhbmQvb3IgJHt2YWx1ZTJ9IHRvIGludC5gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Zsb2F0Jzoge1xuICAgICAgICBjb25zdCBmbG9hdDEgPSBwYXJzZUZsb2F0KHZhbHVlMSk7XG4gICAgICAgIGNvbnN0IGZsb2F0MiA9IHBhcnNlRmxvYXQodmFsdWUyKTtcbiAgICAgICAgaWYgKCFpc05hTihmbG9hdDEpICYmICFpc05hTihmbG9hdDIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZsb2F0MSA9PT0gZmxvYXQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGNvdWxkbid0IGNvbnZlcnQgJHt2YWx1ZTF9IGFuZC9vciAke3ZhbHVlMn0gdG8gZmxvYXQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdwYWlyJzpcbiAgICAgIGNhc2UgJ2RpcmVjdGVkUGFpcic6IHtcbiAgICAgICAgY29uc3QgcGFpcjEgPSB2YWx1ZTEuc3BsaXQoJyAnKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IHBhaXIyID0gdmFsdWUyLnNwbGl0KCcgJykuc29ydCgpO1xuICAgICAgICBpZiAocGFpcjEubGVuZ3RoID09PSAyICYmIHBhaXIyLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGlmIChiYXNlVHlwZSA9PT0gJ3BhaXInKSB7XG4gICAgICAgICAgICBwYWlyMS5zb3J0KCk7XG4gICAgICAgICAgICBwYWlyMi5zb3J0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYWlyMS5qb2luKCcgJykgPT09IHBhaXIyLmpvaW4oJyAnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBjb21wYXJlZCB0d28gcGFpciBidXQgb25lIG9mIHRoZSB2YWx1ZXMgZG9lcyBub3QgaGF2ZSAyIHZhbHVlczogMTogJHt2YWx1ZTF9IDI6ICR7dmFsdWUyfWApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlFcXVhbCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgdG9sZXJhbmNlTW9kZTogJ2V4YWN0JyB8ICdyZWxhdGl2ZScgfCAnYWJzb2x1dGUnID0gJ2V4YWN0JztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodGhpcy50b2xlcmFuY2VNb2RlICE9PSAnZXhhY3QnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3RvbGVyYW5jZU1vZGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIHZhbHVlMi5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTEudmFsdWUpIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUyLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIGVxdWFsJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXModmFsdWUxLnZhbHVlIGFzIHN0cmluZywgdmFsdWUyLnZhbHVlIGFzIHN0cmluZywgdmFsdWUxLmJhc2VUeXBlKTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpLWVxdWFsJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZXF1YWwnLCBRdGlFcXVhbCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpR3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlID4gK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGd0Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZ3QnLCBRdGlHdCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpR3RlIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA+PSArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgZ3RlJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRlJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZ3RlJywgUXRpR3RlKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUlzTnVsbCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBpZiAoIXZhcmlhYmxlcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGVzWzBdLnZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJztcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIE51bGwnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1pcy1udWxsJywgUXRpSXNOdWxsKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlMdCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUgJiYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2ludGVnZXInIHx8IHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JykpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTEudmFsdWUgPCArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgbHQnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gbHQnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sdCcsIFF0aUx0KTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuXG4vLyBQSzogRm9yIHRoZSBjb250YWlucyB3ZSBhc3N1bWUgdGhlIGV4cHJlc3Npb25zIHRvIGNhbGN1bGF0ZSBhcmUgYWxsIGRpcmVjdGVkUGFpcnNcbi8vIEkgZG9uJ3Qga25vdyBpdCB0aGlzIGluIFFUSSBpcyBhbHdheXMgdGhlIGNhc2UgaG93ZXZlcj9cbmV4cG9ydCBjbGFzcyBRdGlMdGUgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlIDw9ICt2YWx1ZTIudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBsdGUnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBsdGUnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sdGUnLCBRdGlMdGUpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJ3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU1hcFJlc3BvbnNlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVzcG9uc2U6IFJlc3BvbnNlVmFyaWFibGUgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQociA9PiByLmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik7XG4gICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgY29uc29sZS53YXJuKGBSZXNwb25zZSAke3RoaXMuaWRlbnRpZmllcn0gY2FuIG5vdCBiZSBmb3VuZGApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1hcHBpbmcgPSByZXNwb25zZS5tYXBwaW5nO1xuICAgIGNvbnN0IGNhbmRpZGF0ZVJlc3BvbnNlcyA9ICFBcnJheS5pc0FycmF5KHJlc3BvbnNlLnZhbHVlKSA/IFtyZXNwb25zZS52YWx1ZV0gOiByZXNwb25zZS52YWx1ZTtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZVJlc3BvbnNlIG9mIGNhbmRpZGF0ZVJlc3BvbnNlcykge1xuICAgICAgY29uc3QgbWFwcGVkVmFsdWUgPSBtYXBwaW5nLm1hcEVudHJpZXMuZmluZChlbnRyeSA9PiB7XG4gICAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoZW50cnkubWFwS2V5LCBjYW5kaWRhdGVSZXNwb25zZSwgcmVzcG9uc2UuYmFzZVR5cGUpO1xuICAgICAgfSk7XG4gICAgICBpZiAoIShtYXBwZWRWYWx1ZSA9PSBudWxsIHx8IG1hcHBlZFZhbHVlLm1hcHBlZFZhbHVlID09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmVzdWx0ICs9IG1hcHBlZFZhbHVlLm1hcHBlZFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IG1hcHBpbmcuZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWFwcGluZy5sb3dlckJvdW5kICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IE1hdGgubWF4KG1hcHBpbmcubG93ZXJCb3VuZCwgcmVzdWx0KTtcbiAgICB9XG4gICAgaWYgKG1hcHBpbmcudXBwZXJCb3VuZCAhPSBudWxsKSB7XG4gICAgICByZXN1bHQgPSBNYXRoLm1pbihtYXBwaW5nLnVwcGVyQm91bmQsIHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWFwLXJlc3BvbnNlJywgUXRpTWFwUmVzcG9uc2UpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlNYXBwaW5nIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2RlZmF1bHQtdmFsdWUnLCB0eXBlOiBOdW1iZXIgfSkgZGVmYXVsdFZhbHVlOiBudW1iZXIgPSAwO1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdsb3dlci1ib3VuZCcsIHR5cGU6IE51bWJlciB9KSBsb3dlckJvdW5kOiBudW1iZXI7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3VwcGVyLWJvdW5kJywgdHlwZTogTnVtYmVyIH0pIHVwcGVyQm91bmQ6IG51bWJlcjtcblxuICBwdWJsaWMgZ2V0IG1hcEVudHJpZXMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktbWFwLWVudHJ5JykpLm1hcChlbCA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXBLZXk6IGVsLmdldEF0dHJpYnV0ZSgnbWFwLWtleScpLFxuICAgICAgICBtYXBwZWRWYWx1ZTogK2VsLmdldEF0dHJpYnV0ZSgnbWFwcGVkLXZhbHVlJylcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWFwcGluZycsIFF0aU1hcHBpbmcpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgU2NvcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlcic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTWF0Y2ggZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgLy9QSyA6IEZJWE1FLlxuICAvLyBUaGlzIHdhcyBhIGxpdHRsZSBleHBlcmltZW50IGlmIHdlIGNvdWxkIGNhbGwgdGhlIG1hdGNoIGZ1bmN0aW9uIGFzIGEgc3RhdGljIGZ1bmN0aW9uLFxuICAvLyBUaGlzIGNhbiBiZSB1c2VkIGZvciBhbGwga2luZCBvZiB0aGluZ3MsIGJ1dCBub3cgZXNwZWNpYWxseSBmb3IgdXNlIGluXG4gIC8vIHF0aS1yZXNwb25zZS1jb25kaXRpb24tc2NyaXB0XG4gIC8vIGluIHdoaWNoIHdlIHBhc3MgdGhlIGV4cHJlc3Npb25zIGFzIHB1cmUgZnVuY3Rpb25zLCBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuXG4gIC8vIFNBRExZLCB0aGUgZ2V0VmFyaWFibGVzIHRocm93cyByb2V0IGluIGRlIGV0ZW4uLiB3ZWV0IG5vZyBuaWV0IHByZWNpZXMgaG9lIGRlemUgd2Vya3QuXG4gIC8vIE1hYXIgaWsgZ2EgZXJpbiBkdWlrZW4uXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlVG9NYXAgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCBjb3JyZWN0VmFsdWVJbmZvID0gdmFsdWVzWzFdO1xuICAgICAgcmV0dXJuIFF0aU1hdGNoLm1hdGNoKHZhbHVlVG9NYXAsIGNvcnJlY3RWYWx1ZUluZm8pO1xuICAgIH1cblxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIG1hdGNoJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIG1hdGNoKHZhbHVlVG9NYXA6IFJlc3BvbnNlVmFyaWFibGUsIGNvcnJlY3RWYWx1ZUluZm86IFJlc3BvbnNlVmFyaWFibGUpIHtcbiAgICBzd2l0Y2ggKGNvcnJlY3RWYWx1ZUluZm8uY2FyZGluYWxpdHkpIHtcbiAgICAgIGNhc2UgJ3NpbmdsZSc6IHtcbiAgICAgICAgaWYgKHZhbHVlVG9NYXAudmFsdWUgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgQXJyYXkuaXNBcnJheShjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG1hdGNoJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoXG4gICAgICAgICAgdmFsdWVUb01hcC52YWx1ZT8udG9TdHJpbmcoKSxcbiAgICAgICAgICBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdvcmRlcmVkJzoge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgIUFycmF5LmlzQXJyYXkoY29ycmVjdFZhbHVlSW5mby52YWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVUb01hcC52YWx1ZS5sZW5ndGggIT09IGNvcnJlY3RWYWx1ZUluZm8udmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVUb01hcC52YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyhcbiAgICAgICAgICAgIGNvcnJlY3RWYWx1ZUluZm8udmFsdWVbaV0sXG4gICAgICAgICAgICB2YWx1ZVRvTWFwLnZhbHVlW2ldLFxuICAgICAgICAgICAgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ211bHRpcGxlJzoge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgIUFycmF5LmlzQXJyYXkoY29ycmVjdFZhbHVlSW5mby52YWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVUb01hcC52YWx1ZS5sZW5ndGggIT09IGNvcnJlY3RWYWx1ZUluZm8udmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbnN3ZXJJbmRleCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgY29ycmVjdEFuc3dlciBvZiBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSB7XG4gICAgICAgICAgbGV0IG1hdGNoaW5nVmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICAgIGNvbnN0IGFyciA9IFsuLi52YWx1ZVRvTWFwLnZhbHVlXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IG12IG9mIGFycikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKGNvcnJlY3RBbnN3ZXIsIG12LCBjb3JyZWN0VmFsdWVJbmZvLmJhc2VUeXBlKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgbWF0Y2hpbmdWYWx1ZSA9IG12O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1hdGNoaW5nVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIChhcnIgYXMgc3RyaW5nW10pLnNwbGljZShhcnIuaW5kZXhPZihtYXRjaGluZ1ZhbHVlKSwgMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYW5zd2VySW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbWF0Y2gnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tYXRjaCcsIFF0aU1hdGNoKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlNZW1iZXIgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4gfCBudWxsPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG5cbiAgICBpZiAoISh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIG1lbWJlciBvcGVyYXRvciB0YWtlcyB0d28gc3ViLWV4cHJlc3Npb25zJyk7XG4gICAgfVxuXG4gICAgY29uc3QgW3ZhbHVlMSwgdmFsdWUyXSA9IHZhbHVlcztcblxuICAgIGlmICghKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlKSkge1xuICAgICAgY29uc29sZS53YXJuKCdXaGljaCBtdXN0IGJvdGggaGF2ZSB0aGUgc2FtZSBiYXNlLXR5cGUnKTtcbiAgICB9XG4gICAgaWYgKCEodmFsdWUyLmNhcmRpbmFsaXR5ID09PSAnbXVsdGlwbGUnIHx8IHZhbHVlMi5jYXJkaW5hbGl0eSA9PT0gJ29yZGVyZWQnKSkge1xuICAgICAgY29uc29sZS53YXJuKCdhbmQgdGhlIHNlY29uZCBtdXN0IGJlIGEgbXVsdGlwbGUgb3Igb3JkZXJlZCBjb250YWluZXInKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JyB8fCB2YWx1ZTIuYmFzZVR5cGUgPT09ICdmbG9hdCcpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIG1lbWJlciBvcGVyYXRvciBzaG91bGQgbm90IGJlIHVzZWQgb24gc3ViLWV4cHJlc3Npb25zIHdpdGggYSBiYXNlLXR5cGUgb2YgZmxvYXQnKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2R1cmF0aW9uJyB8fCB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkdXJhdGlvbicpIHtcbiAgICAgIGNvbnNvbGUud2FybignSXQgbXVzdCBub3QgYmUgdXNlZCBvbiBzdWItZXhwcmVzc2lvbnMgd2l0aCBhIGJhc2UtdHlwZSBvZiBkdXJhdGlvbicpO1xuICAgIH1cblxuICAgIC8vIElmIGVpdGhlciBzdWItZXhwcmVzc2lvbiBpcyBOVUxMIHRoZW4gdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0b3IgaXMgTlVMTFxuICAgIGlmICh2YWx1ZTEudmFsdWUgPT09IG51bGwgfHwgdmFsdWUyLnZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVzdWx0IGlzIGEgc2luZ2xlIGJvb2xlYW4gd2l0aCBhIHZhbHVlIG9mICd0cnVlJyBpZiB0aGUgdmFsdWUgZ2l2ZW4gYnkgdGhlIGZpcnN0IHN1Yi1leHByZXNzaW9uIGlzIGluIHRoZSBjb250YWluZXIgZGVmaW5lZCBieSB0aGUgc2Vjb25kIHN1Yi1leHByZXNzaW9uLlxuICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZztcbiAgICBjb25zdCBwcm9qZWN0aW9uMiA9IHZhbHVlMi52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICByZXR1cm4gcHJvamVjdGlvbjIuaW5jbHVkZXMocHJvamVjdGlvbjEpO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW1lbWJlcicsIFF0aU1lbWJlcik7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSwgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aU11bHRpcGxlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPltdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogUmVzcG9uc2VWYXJpYWJsZVtdIHtcbiAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBpZiAodmFyaWFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIG11bHRpcGxlJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YXJpYWJsZSBvZiB2YXJpYWJsZXMpIHtcbiAgICAgIGlmICh2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ211bHRpcGxlJyAmJiB2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbXVsdGlwbGUnKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnN0IHZhbHVlcyA9IHZhcmlhYmxlcy5tYXAodiA9PiB2LnZhbHVlKTtcbiAgICAvLyBjb25zb2xlLmxvZyh2YXJpYWJsZXMpO1xuICAgIC8vIGNvbnN0IGZsYXR0ZW5lZEFycmF5ID0gdmFsdWVzLnJlZHVjZSgoYWNjOiBzdHJpbmdbXSwgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiB7XG4gICAgLy8gICByZXR1cm4gYWNjLmNvbmNhdChBcnJheS5pc0FycmF5KHZhbHVlKSA/IFsuLi52YWx1ZV0gOiB2YWx1ZSk7XG4gICAgLy8gfSwgW10pO1xuICAgIC8vIHJldHVybiBmbGF0dGVuZWRBcnJheTtcblxuICAgIHJldHVybiB2YXJpYWJsZXM7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbXVsdGlwbGUnLCBRdGlNdWx0aXBsZSk7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTm90IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAke3N1cGVyLnJlbmRlcigpfWA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj47XG4gICAgY29uc3QgcmVzdWx0ID0gZXhwcmVzc2lvbi5jYWxjdWxhdGUoKSBhcyBib29sZWFuO1xuICAgIHJldHVybiAhcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW5vdCcsIFF0aU5vdCk7XG4iLCAiaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpT3IgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgIGNvbnN0IHZhbHVlcyA9IEFycmF5LmZyb20odGhpcy5jaGlsZHJlbikubWFwKGMgPT4ge1xuICAgICAgY29uc3QgY29uZGl0aW9uID0gYyBhcyBRdGlFeHByZXNzaW9uPGFueT47XG4gICAgICBpZiAoIWNvbmRpdGlvbi5jYWxjdWxhdGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVsZW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgUXRpQ29uZGl0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmRpdGlvbi5jYWxjdWxhdGUoKTtcbiAgICAgIGxldCB2YWwgPSBmYWxzZTtcbiAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHZhbHVlIHRvIGJvb2xlYW4gYW5kIHJldHVybiBudWxsIGlmIG5vdCBwb3NzaWJsZVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgICAgICB2YWwgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgdmFsID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWwgaW4gcXRpLW9yLCBleHBlY3RlZCBib29sZWFuJyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIHZhbCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXMuc29tZShlID0+IHtcbiAgICAgIHJldHVybiB0eXBlb2YgZSA9PT0gJ2Jvb2xlYW4nICYmIGU7XG4gICAgfSk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktb3InLCBRdGlPcik7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aU9yZGVyZWQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPFJlc3BvbnNlVmFyaWFibGVbXT4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IFJlc3BvbnNlVmFyaWFibGVbXSB7XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgaWYgKHZhcmlhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBtdWx0aXBsZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFyaWFibGUgb2YgdmFyaWFibGVzKSB7XG4gICAgICBpZiAodmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdvcmRlcmVkJyAmJiB2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgb3JkZXJlZCcpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YXJpYWJsZXM7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktb3JkZXJlZCcsIFF0aU9yZGVyZWQpO1xuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICdzcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi8uLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlQcmludGVkVmFyaWFibGUgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIGNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpPy52YWx1ZTtcbiAgICByZXR1cm4gaHRtbGAke0pTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKX1gO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpOiBWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpIHx8IG51bGw7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wcmludGVkLXZhcmlhYmxlJywgUXRpUHJpbnRlZFZhcmlhYmxlKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlQcm9kdWN0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBjb25zdCBwcm9kdWN0ID0gdmFsdWVzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZS5iYXNlVHlwZSA9PSAnZmxvYXQnIHx8IGN1cnJlbnRWYWx1ZS5iYXNlVHlwZSA9PSAnaW50ZWdlcicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3IgKiBwYXJzZUludChjdXJyZW50VmFsdWUudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBjYW4gbm90IGNvbnZlcnQgdG8gbnVtYmVyYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgaGFzIGFub3RoZXIgYmFzZVR5cGUgJHtjdXJyZW50VmFsdWUuYmFzZVR5cGV9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfSwgMSk7XG4gICAgcmV0dXJuIHByb2R1Y3Q7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcHJvZHVjdCcsIFF0aVByb2R1Y3QpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlTdHJpbmdNYXRjaCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Nhc2Utc2Vuc2l0aXZlJyB9KSBjYXNlU2Vuc2l0aXZlID0gJ3RydWUnO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICB2YWx1ZTIuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUxLnZhbHVlKSB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBzdHJpbmctbWF0Y2gnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgdjEgPSB0aGlzLmNhc2VTZW5zaXRpdmUgPT09ICd0cnVlJyA/IHZhbHVlMS52YWx1ZSA6ICh2YWx1ZTEudmFsdWUgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgdjIgPSB0aGlzLmNhc2VTZW5zaXRpdmUgPT09ICd0cnVlJyA/IHZhbHVlMi52YWx1ZSA6ICh2YWx1ZTIudmFsdWUgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyh2MSBhcyBzdHJpbmcsIHYyIGFzIHN0cmluZywgdmFsdWUxLmJhc2VUeXBlKTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpLXN0cmluZy1tYXRjaCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXN0cmluZy1tYXRjaCcsIFF0aVN0cmluZ01hdGNoKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uLCBRdGlFeHByZXNzaW9uQmFzZSB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVN1bSBleHRlbmRzIFF0aUV4cHJlc3Npb248bnVtYmVyPiB7XG4gIHByaXZhdGUgX2V4cHJlc3Npb246IFF0aVN1bUV4cHJlc3Npb247XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZXhwcmVzc2lvbiA9IG5ldyBRdGlTdW1FeHByZXNzaW9uKEFycmF5LmZyb20odGhpcy5jaGlsZHJlbiBhcyB1bmtub3duIGFzIFF0aUV4cHJlc3Npb25CYXNlPG51bWJlcj5bXSkpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZXhwcmVzc2lvbi5jYWxjdWxhdGUoKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF0aVN1bUV4cHJlc3Npb24gaW1wbGVtZW50cyBRdGlFeHByZXNzaW9uQmFzZTxudW1iZXI+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHByZXNzaW9uczogUXRpRXhwcmVzc2lvbkJhc2U8bnVtYmVyPltdKSB7fVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5leHByZXNzaW9ucy5tYXAoYyA9PiB7XG4gICAgICBpZiAoIWMuY2FsY3VsYXRlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFbGVtZW50IGRvZXNuJ3QgaW1wbGVtZW50IFF0aUNvbmRpdGlvbkV4cHJlc3Npb25cIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBjLmNhbGN1bGF0ZSgpO1xuICAgICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWx1ZSBpbiBxdGktc3VtLCBleHBlY3RlZCBudW1iZXInKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc3VtJywgUXRpU3VtKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpVmFyaWFibGUgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKS52YWx1ZVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktdmFyaWFibGUnLCBRdGlWYXJpYWJsZSk7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IElNU3BjaSwgTW9kdWxlUmVzb2x1dGlvbkNvbmZpZywgUXRpVmFyaWFibGVKU09OIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5kZWNsYXJlIGNvbnN0IHJlcXVpcmVqczogYW55O1xuZGVjbGFyZSBjb25zdCBkZWZpbmU6IGFueTtcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVBvcnRhYmxlQ3VzdG9tSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHByaXZhdGUgaW50ZXJ2YWxJZDogYW55O1xuICBwcml2YXRlIHJhd1Jlc3BvbnNlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBwY2k6IElNU3BjaTx1bmtub3duPjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pXG4gIHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnbW9kdWxlJyB9KVxuICBtb2R1bGU6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2N1c3RvbS1pbnRlcmFjdGlvbi10eXBlLWlkZW50aWZpZXInIH0pXG4gIGN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXI6IHN0cmluZztcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9lcnJvck1lc3NhZ2U6IHN0cmluZyA9IG51bGw7XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UXRpVmFyaWFibGVKU09OKGlucHV0OiBRdGlWYXJpYWJsZUpTT04pOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgZm9yIChjb25zdCB0b3BMZXZlbEtleSBpbiBpbnB1dCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgaWYgKGlucHV0Lmhhc093blByb3BlcnR5KHRvcExldmVsS2V5KSkge1xuICAgICAgICBjb25zdCBuZXN0ZWRPYmplY3QgPSBpbnB1dFt0b3BMZXZlbEtleSBhcyAnbGlzdCcgfCAnYmFzZSddO1xuICAgICAgICBpZiAobmVzdGVkT2JqZWN0KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBuZXN0ZWRLZXkgaW4gbmVzdGVkT2JqZWN0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgICAgICBpZiAobmVzdGVkT2JqZWN0Lmhhc093blByb3BlcnR5KG5lc3RlZEtleSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBuZXN0ZWRPYmplY3RbbmVzdGVkS2V5IGFzIGtleW9mIHR5cGVvZiBuZXN0ZWRPYmplY3RdO1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKFN0cmluZyk7IC8vIENvbnZlcnQgZWFjaCBlbGVtZW50IGluIHRoZSBhcnJheSB0byBzdHJpbmdcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7IC8vIENvbnZlcnQgdGhlIHNpbmdsZSB2YWx1ZSB0byBzdHJpbmdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRDaGVja2luZygpOiB2b2lkIHtcbiAgICAvLyBiZWNhdXNlIHRoZSBwY2kgZG9lc24ndCBoYXZlIGEgbWV0aG9kIHRvIGNoZWNrIGZvciBjaGFuZ2VzIHdlJ2xsIHVzZSBhbiBpbnRlcnZhbFxuICAgIC8vIHRvIGNoZWNrIGlmIHRoZSByZXNwb25zZSBoYXMgY2hhbmdlZC4gSWYgY2hhbmdlZCB3ZSdsbCBzYXZlIHRoZSByZXNwb25zZVxuICAgIHRoaXMuaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5wY2kuZ2V0UmVzcG9uc2UoKTtcbiAgICAgIGNvbnN0IG5ld1Jlc3BvbnNlID0gdGhpcy5wY2kuZ2V0UmVzcG9uc2UoKTtcbiAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpO1xuICAgICAgaWYgKHN0cmluZ2lmaWVkICE9PSB0aGlzLnJhd1Jlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMucmF3UmVzcG9uc2UgPSBzdHJpbmdpZmllZDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmNvbnZlcnRRdGlWYXJpYWJsZUpTT04obmV3UmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LCAyMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wQ2hlY2tpbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW50ZXJ2YWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxJZCk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7IC8vIEZPUiBOT1dcbiAgfVxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIC8vIE9ubHkgc2V0IHN0YXRlIGlzIHN1cHBvcnRlZCBpbiBhIFBDSVxuICB9XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucmF3UmVzcG9uc2U7XG4gIH1cblxuICBnZXRUQU9Db25maWcobm9kZSkge1xuICAgIGNvbnN0IGEgPSBub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3Byb3BlcnRpZXMnKTtcbiAgICBsZXQgY29uZmlnID0ge307XG5cbiAgICBjb25zdCBnZXRQcm9wZXJ0eVZhbHVlID0gZWwgPT4ge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSB7fTtcbiAgICAgIGNvbnN0IGtleSA9IGVsLmdldEF0dHJpYnV0ZSgna2V5Jyk7XG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShlbC5jaGlsZHJlbik7XG4gICAgICAgIGNvbnN0IGFsbEtleSA9IGNoaWxkcmVuLm1hcCgoYzogSFRNTEVsZW1lbnQpID0+IGMuZ2V0QXR0cmlidXRlKCdrZXknKSk7XG4gICAgICAgIGNvbnN0IGlzQXJyYXkgPSBhbGxLZXkubGVuZ3RoID4gMCAmJiAhYWxsS2V5LmZpbmQoayA9PiAhTnVtYmVyLmlzSW50ZWdlcigraykpO1xuICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgIHByb3BlcnR5W2tleV0gPSBjaGlsZHJlbi5tYXAoYyA9PiBnZXRDaGlsZFByb3BlcnRpZXMoYykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BlcnR5W2tleV0gPSBlbC50ZXh0Q29udGVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3BlcnR5O1xuICAgIH07XG5cbiAgICBjb25zdCBnZXRDaGlsZFByb3BlcnRpZXMgPSAoZWwpOiB7fSB8IHZvaWQgPT4ge1xuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIGxldCBwcm9wZXJ0aWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWwuY2hpbGRyZW4pIHtcbiAgICAgICAgICBwcm9wZXJ0aWVzID0geyAuLi5wcm9wZXJ0aWVzLCAuLi5nZXRQcm9wZXJ0eVZhbHVlKGNoaWxkKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnRpZXMgb2YgYSkge1xuICAgICAgY29uc3Qga2V5ID0gcHJvcGVydGllcy5nZXRBdHRyaWJ1dGUoJ2tleScpO1xuICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgY29uZmlnID0geyAuLi5jb25maWcsIC4uLmdldENoaWxkUHJvcGVydGllcyhwcm9wZXJ0aWVzKSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gICAgY29uc29sZS5sb2coJ0NhbiBub3QgZmluZCBxdGktY3VzdG9tLWludGVyYWN0aW9uIGNvbmZpZycpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmVnaXN0ZXIocGNpOiBJTVNwY2k8dW5rbm93bj4pIHtcbiAgICB0aGlzLnBjaSA9IHBjaTtcblxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnBhcmVudEVsZW1lbnQudGFnTmFtZSA9PT0gJ1FUSS1DVVNUT00tSU5URVJBQ1RJT04nID8gJ1RBTycgOiAnSU1TJztcbiAgICBjb25zdCBkb206IEhUTUxFbGVtZW50ID1cbiAgICAgIHR5cGUgPT0gJ0lNUycgPyB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1pbnRlcmFjdGlvbi1tYXJrdXAnKSA6IHRoaXMucXVlcnlTZWxlY3RvcignbWFya3VwJyk7XG4gICAgZG9tLmNsYXNzTGlzdC5hZGQoJ3F0aS1jdXN0b21JbnRlcmFjdGlvbicpO1xuXG4gICAgaWYgKHR5cGUgPT0gJ1RBTycgJiYgdGhpcy5xdWVyeVNlbGVjdG9yKCdwcm9wZXJ0aWVzJykpIHtcbiAgICAgICh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3Byb3BlcnRpZXMnKSBhcyBIVE1MRWxlbWVudCkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IGFueSA9XG4gICAgICB0eXBlID09ICdJTVMnXG4gICAgICAgID8ge1xuICAgICAgICAgICAgcHJvcGVydGllczogdGhpcy5kYXRhc2V0LFxuICAgICAgICAgICAgb25yZWFkeTogKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnb25yZWFkeScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgOiB0aGlzLmdldFRBT0NvbmZpZyh0aGlzKTtcbiAgICBpZiAodHlwZSA9PSAnSU1TJykge1xuICAgICAgcGNpLmdldEluc3RhbmNlKGRvbSwgY29uZmlnLCB1bmRlZmluZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAocGNpIGFzIGFueSkuaW5pdGlhbGl6ZSh0aGlzLmN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXIsIGRvbS5maXJzdEVsZW1lbnRDaGlsZCwgY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT0gJ1RBTycpIHtcbiAgICAgIGNvbnN0IGxpbmtzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ2xpbmsnKSkubWFwKGFjYyA9PiBhY2MuZ2V0QXR0cmlidXRlKCdocmVmJykpO1xuICAgICAgbGlua3MuZm9yRWFjaChsaW5rID0+IHtcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICBzdHlsZXMucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgICBzdHlsZXMudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgICAgIHN0eWxlcy5tZWRpYSA9ICdzY3JlZW4nO1xuICAgICAgICBzdHlsZXMuaHJlZiA9IGxpbms7XG4gICAgICAgIGRvbS5hcHBlbmRDaGlsZChzdHlsZXMpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc3RhcnRDaGVja2luZygpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGRlZmluZSgncXRpQ3VzdG9tSW50ZXJhY3Rpb25Db250ZXh0JywgKCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVnaXN0ZXI6IGN0eEEgPT4ge1xuICAgICAgICAgIHRoaXMucmVnaXN0ZXIoY3R4QSk7XG4gICAgICAgIH0sXG4gICAgICAgIG5vdGlmeVJlYWR5OiAoKSA9PiB7XG4gICAgICAgICAgLyogb25seSB1c2VkIGluIHRoZSBUQU8gdmVyc2lvbiAqL1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5idWlsZFJlcXVpcmVDb25maWcoKTtcbiAgICBjb25zdCByZXF1aXJlUENJID0gcmVxdWlyZWpzLmNvbmZpZyhjb25maWcpO1xuICAgIHJlcXVpcmVQQ0koWydyZXF1aXJlJ10sIHJlcXVpcmUgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1keW5hbWljLXJlcXVpcmVcbiAgICAgIHJlcXVpcmUoW3RoaXMubW9kdWxlXSk7XG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHJlcXVpcmVqcy51bmRlZih0aGlzLmN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXIpO1xuICAgIC8vIENsZWFyIHRoZSBtb2R1bGVzIGluIHRoZSBjb250ZXh0XG4gICAgY29uc3QgY29udGV4dCA9IHJlcXVpcmVqcy5zLmNvbnRleHRzO1xuICAgIGRlbGV0ZSBjb250ZXh0W3RoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcl07XG4gICAgdGhpcy5zdG9wQ2hlY2tpbmcoKTtcbiAgfVxuXG4gIGJ1aWxkUmVxdWlyZUNvbmZpZygpIHtcbiAgICAvLyBTZXQgUmVxdWlyZUpTIHBhdGhzIGFuZCBzaGltIGNvbmZpZ3VyYXRpb24gaWYgYXZhaWxhYmxlXG4gICAgY29uc3QgY29uZmlnOiBNb2R1bGVSZXNvbHV0aW9uQ29uZmlnID0ge1xuICAgICAgY29udGV4dDogdGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyLFxuICAgICAgY2F0Y2hFcnJvcjogdHJ1ZSxcbiAgICAgIHBhdGhzOiB3aW5kb3dbJ3JlcXVpcmVQYXRocyddIHx8IHt9LFxuICAgICAgc2hpbTogd2luZG93WydyZXF1aXJlU2hpbSddIHx8IHt9XG4gICAgfTtcbiAgICAvLyBDaGVjayBpZiBSZXF1aXJlSlMgaXMgYXZhaWxhYmxlLCBpZiBub3QsIHNldCBhbiBlcnJvciBtZXNzYWdlXG4gICAgaWYgKCFnbG9iYWxUaGlzLnJlcXVpcmUpIHtcbiAgICAgIHRoaXMuX2Vycm9yTWVzc2FnZSA9IGBSZXF1aXJlSlMgbm90IGZvdW5kLiBQbGVhc2UgbG9hZCBpdCB2aWEgQ0ROOiBodHRwczovL2NkbmpzLmNvbS9saWJyYXJpZXMvcmVxdWlyZS5qc2A7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLWJhc2UtdXJsJyk7XG4gICAgY29uc3QgaW50ZXJhY3Rpb25Nb2R1bGVzID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktaW50ZXJhY3Rpb24tbW9kdWxlcycpO1xuXG4gICAgaWYgKGludGVyYWN0aW9uTW9kdWxlcykge1xuICAgICAgY29uc3QgbW9kdWxlcyA9IGludGVyYWN0aW9uTW9kdWxlcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktaW50ZXJhY3Rpb24tbW9kdWxlJyk7XG4gICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG4gICAgICAgIGNvbnN0IG1vZHVsZUlkID0gbW9kdWxlLmdldEF0dHJpYnV0ZSgnaWQnKTtcbiAgICAgICAgY29uc3QgcHJpbWFyeVBhdGggPSBtb2R1bGUuZ2V0QXR0cmlidXRlKCdwcmltYXJ5LXBhdGgnKTtcbiAgICAgICAgY29uc3QgZmFsbGJhY2tQYXRoID0gbW9kdWxlLmdldEF0dHJpYnV0ZSgnZmFsbGJhY2stcGF0aCcpO1xuXG4gICAgICAgIGlmIChtb2R1bGVJZCAmJiBwcmltYXJ5UGF0aCkge1xuICAgICAgICAgIC8vIFNldCB0aGUgcGF0aHMgdXNpbmcgUmVxdWlyZUpTJ3MgZmFsbGJhY2sgYXJyYXlcbiAgICAgICAgICBjb25zdCBwYXRocyA9IGZhbGxiYWNrUGF0aFxuICAgICAgICAgICAgPyB0aGlzLmNvbWJpbmVSZXF1aXJlUmVzb2x2ZVBhdGhzKFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGgocHJpbWFyeVBhdGgsIGJhc2VVcmwpLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGgoZmFsbGJhY2tQYXRoLCBiYXNlVXJsKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGgocHJpbWFyeVBhdGgsIGJhc2VVcmwpO1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUGF0aCA9IGNvbmZpZy5wYXRoc1ttb2R1bGVJZF0gfHwgW107XG4gICAgICAgICAgY29uZmlnLnBhdGhzW21vZHVsZUlkXSA9IHRoaXMuY29tYmluZVJlcXVpcmVSZXNvbHZlUGF0aHMoZXhpc3RpbmdQYXRoLCBwYXRocyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgY29tYmluZVJlcXVpcmVSZXNvbHZlUGF0aHMocGF0aDE6IHN0cmluZyB8IHN0cmluZ1tdLCBwYXRoMjogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBjb25zdCBwYXRoMUFycmF5ID0gQXJyYXkuaXNBcnJheShwYXRoMSkgPyBwYXRoMSA6IFtwYXRoMV07XG4gICAgY29uc3QgcGF0aDJBcnJheSA9IEFycmF5LmlzQXJyYXkocGF0aDIpID8gcGF0aDIgOiBbcGF0aDJdO1xuICAgIHJldHVybiBwYXRoMUFycmF5LmNvbmNhdChwYXRoMkFycmF5KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRG91YmxlU2xhc2hlcyhzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IHNpbmdsZUZvcndhcmRTbGFzaGVzID0gc3RyXG4gICAgICAucmVwbGFjZSgvKFteOl1cXC8pXFwvKy9nLCAnJDEnKVxuICAgICAgLnJlcGxhY2UoL1xcL1xcLy9nLCAnLycpXG4gICAgICAucmVwbGFjZSgnaHR0cDovJywgJ2h0dHA6Ly8nKVxuICAgICAgLnJlcGxhY2UoJ2h0dHBzOi8nLCAnaHR0cHM6Ly8nKTtcbiAgICByZXR1cm4gc2luZ2xlRm9yd2FyZFNsYXNoZXM7XG4gIH1cblxuICBsb2FkQ29uZmlnID0gYXN5bmMgKHVybDogc3RyaW5nLCBiYXNlVXJsPzogc3RyaW5nKTogUHJvbWlzZTxNb2R1bGVSZXNvbHV0aW9uQ29uZmlnPiA9PiB7XG4gICAgdXJsID0gdGhpcy5yZW1vdmVEb3VibGVTbGFzaGVzKHVybCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcXVpcmVDb25maWcgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgaWYgKHJlcXVpcmVDb25maWcub2spIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgcmVxdWlyZUNvbmZpZy5qc29uKCk7XG4gICAgICAgIGNvbnN0IG1vZHVsZUNvbmcgPSBjb25maWcgYXMgTW9kdWxlUmVzb2x1dGlvbkNvbmZpZztcbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGVJZCBpbiBtb2R1bGVDb25nLnBhdGhzKSB7XG4gICAgICAgICAgaWYgKGJhc2VVcmwpIHtcbiAgICAgICAgICAgIG1vZHVsZUNvbmcucGF0aHNbbW9kdWxlSWRdID0gdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChtb2R1bGVDb25nLnBhdGhzW21vZHVsZUlkXSwgYmFzZVVybCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtb2R1bGVDb25nO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgZ2V0UmVzb2x2YWJsZVBhdGhTdHJpbmcgPSAocGF0aDogc3RyaW5nLCBiYXNlUGF0aD86IHN0cmluZykgPT4ge1xuICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLmpzJC8sICcnKTtcbiAgICByZXR1cm4gcGF0aD8udG9Mb2NhbGVMb3dlckNhc2UoKS5zdGFydHNXaXRoKCdodHRwJykgfHwgIWJhc2VQYXRoXG4gICAgICA/IHBhdGhcbiAgICAgIDogdGhpcy5yZW1vdmVEb3VibGVTbGFzaGVzKGAke2Jhc2VQYXRofS8ke3BhdGh9YCk7XG4gIH07XG5cbiAgZ2V0UmVzb2x2YWJsZVBhdGggPSAocGF0aDogc3RyaW5nIHwgc3RyaW5nW10sIGJhc2VQYXRoPzogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGF0aClcbiAgICAgID8gcGF0aC5tYXAocCA9PiB0aGlzLmdldFJlc29sdmFibGVQYXRoU3RyaW5nKHAsIGJhc2VQYXRoKSlcbiAgICAgIDogdGhpcy5nZXRSZXNvbHZhYmxlUGF0aFN0cmluZyhwYXRoLCBiYXNlUGF0aCk7XG4gIH07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD4ke3RoaXMuX2Vycm9yTWVzc2FnZSAmJlxuICAgICAgaHRtbGA8ZGl2IHN0eWxlPVwiY29sb3I6cmVkXCI+XG4gICAgICAgIDxoMT5FcnJvcjwvaDE+XG4gICAgICAgICR7dGhpcy5fZXJyb3JNZXNzYWdlfVxuICAgICAgPC9kaXY+YH1gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24nOiBRdGlQb3J0YWJsZUN1c3RvbUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiZXhwb3J0IGNsYXNzIFRvdWNoRHJhZ0FuZERyb3Age1xuICBwcml2YXRlIHRvdWNoU3RhcnRUaW1lID0gMDsgLy8gVGltZXN0YW1wIG9mIHRoZSBmaXJzdCB0b3VjaFxuICBwcml2YXRlIHRvdWNoU3RhcnRQb2ludCA9IG51bGw7IC8vIFBvaW50IG9mIHRoZSBmaXJzdCB0b3VjaFxuICBwcml2YXRlIGxhc3RDbGlja1RpbWUgPSAwOyAvLyBUaW1lc3RhbXAgb2YgdGhlIHByZXZpb3VzIGNsaWNrXG4gIHByaXZhdGUgaXNEcmFnZ2FibGUgPSBmYWxzZTsgLy8gV2hldGhlciBhIGRyYWdnYWJsZSBlbGVtZW50IGlzIGFjdGl2ZVxuICBwcml2YXRlIGRyYWdTb3VyY2U6IEhUTUxFbGVtZW50ID0gbnVsbDsgLy8gVGhlIHNvdXJjZSBlbGVtZW50IGJlaW5nIGRyYWdnZWRcbiAgcHJpdmF0ZSBkcmFnQ2xvbmU6IEhUTUxFbGVtZW50ID0gbnVsbDsgLy8gQ2xvbmUgb2YgZHJhZyBzb3VyY2UgZm9yIHZpc3VhbCBmZWVkYmFja1xuICBwcml2YXRlIHRvdWNoRW5kVHJpZ2dlcmVkID0gZmFsc2U7IC8vIEZsYWcgZm9yIHRvdWNoRW5kIGV2ZW50XG4gIHByaXZhdGUgaXNEcmFnZ2luZyA9IGZhbHNlOyAvLyBXaGV0aGVyIGEgZHJhZyBvcGVyYXRpb24gaXMgb25nb2luZ1xuICBwcml2YXRlIGluaXRpYWxUcmFuc2Zvcm0gPSAnJzsgLy8gT3JpZ2luYWwgdHJhbnNmb3JtIHN0eWxlXG4gIHByaXZhdGUgaGFzRGlzcGF0Y2hlZERyYWdTdGFydCA9IGZhbHNlOyAvLyBGbGFnIHRvIGVuc3VyZSBkcmFnc3RhcnQgZXZlbnQgaXMgZGlzcGF0Y2hlZCBvbmNlXG4gIHByaXZhdGUgcm9vdE5vZGU6IE5vZGUgPSBudWxsOyAvLyBSb290IG5vZGUgZm9yIGJvdW5kYXJ5IGNhbGN1bGF0aW9uc1xuXG4gIHByaXZhdGUgZm9jdXNlZEVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gbnVsbDsgLy8gVG8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudGx5IGZvY3VzZWQgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgcHJpdmF0ZSBmb2N1c2FibGVEcm9wWm9uZXM6IEhUTUxFbGVtZW50W10gPSBbXTsgLy8gQWxsIGRyb3B6b25lcyBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvblxuICBwcml2YXRlIGN1cnJlbnREcm9wWm9uZUluZGV4ID0gLTE7IC8vIEluZGV4IGZvciB0YWJiaW5nIHRocm91Z2ggZHJvcCB6b25lc1xuXG4gIHByaXZhdGUgZGF0YVRyYW5zZmVyID0ge1xuICAgIGRhdGE6IHt9LFxuICAgIHNldERhdGEodHlwZSwgdmFsKSB7XG4gICAgICB0aGlzLmRhdGFbdHlwZV0gPSB2YWw7XG4gICAgfSxcbiAgICBnZXREYXRhKHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFbdHlwZV07XG4gICAgfSxcbiAgICBlZmZlY3RBbGxvd2VkOiAnbW92ZSdcbiAgfTtcbiAgcHJpdmF0ZSBjbG9uZU9mZnNldCA9IHsgeDogMCwgeTogMCB9OyAvLyBPZmZzZXQgZm9yIHBvc2l0aW9uaW5nIHRoZSBkcmFnIGNsb25lXG5cbiAgcHJpdmF0ZSBsYXN0VGFyZ2V0ID0gbnVsbDsgLy8gTGFzdCB0b3VjaCB0YXJnZXRcbiAgcHJpdmF0ZSBjdXJyZW50RHJvcFRhcmdldCA9IG51bGw7IC8vIEN1cnJlbnQgZHJvcHBhYmxlIGVsZW1lbnRcbiAgcHJpdmF0ZSBhbGxvd0NsaWNrID0gdHJ1ZTsgLy8gRmxhZyB0byBhbGxvdyBvciBwcmV2ZW50IGNsaWNrXG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBUb3VjaERyYWdBbmREcm9wO1xuXG4gIGNvcHlTdHlsZXNGb3JEcmFnQ2xvbmUgPSB0cnVlO1xuICBkcmFnT25DbGlja0VuYWJsZWQgPSBmYWxzZTtcbiAgdXNlRHJhZ0Nsb25lID0gZmFsc2U7IC8vIFNldCB0byB0cnVlIHRvIGRyYWcgd2l0aCBhIGNsb25lOyBzZXQgdG8gZmFsc2UgdG8gZHJhZyB0aGUgb3JpZ2luYWwgZWxlbWVudFxuXG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX0RSQUdfRElTVEFOQ0UgPSA1OyAvLyBNaW5pbXVtIHBpeGVsIG1vdmVtZW50IHRvIHN0YXJ0IGRyYWdnaW5nXG4gIHByaXZhdGUgcmVhZG9ubHkgRFJBR19DTE9ORV9PUEFDSVRZID0gMTsgLy8gT3BhY2l0eSBvZiB0aGUgZHJhZyBjbG9uZSBlbGVtZW50XG4gIGluaXRpYWxUcmFuc2l0aW9uOiBzdHJpbmc7XG4gIC8vIGRyb3BwYWJsZXM6IEVsZW1lbnRbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAoVG91Y2hEcmFnQW5kRHJvcC5pbnN0YW5jZSkge1xuICAgICAgcmV0dXJuIFRvdWNoRHJhZ0FuZERyb3AuaW5zdGFuY2U7XG4gICAgfVxuICAgIFRvdWNoRHJhZ0FuZERyb3AuaW5zdGFuY2UgPSB0aGlzO1xuXG4gICAgLy8gQWRkIGV2ZW50IGxpc3RlbmVycyBmb3IgdG91Y2ggYW5kIG1vdXNlIGludGVyYWN0aW9uc1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuaGFuZGxlVG91Y2hNb3ZlLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5oYW5kbGVUb3VjaE1vdmUuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlVG91Y2hFbmQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5oYW5kbGVUb3VjaEVuZC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5oYW5kbGVUb3VjaENhbmNlbC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5RG93bi5iaW5kKHRoaXMpKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuaGFuZGxlS2V5VXAuYmluZCh0aGlzKSk7XG4gIH1cblxuICBhZGREcmFnZ2FibGVFbGVtZW50cyhkcmFnZ2FibGVzOiBFbGVtZW50W10pIHtcbiAgICBkcmFnZ2FibGVzLmZvckVhY2goZWwgPT4ge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7IC8vIE1ha2UgZHJhZ2dhYmxlIGVsZW1lbnRzIGZvY3VzYWJsZVxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IGVsIGFzIEhUTUxFbGVtZW50KSk7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gKHRoaXMuZm9jdXNlZEVsZW1lbnQgPSBudWxsKSk7XG5cbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gYWRkRHJvcHBhYmxlRWxlbWVudHMoZHJvcHBhYmxlczogRWxlbWVudFtdKSB7XG4gIC8vICAgLy8gdGhpcy5kcm9wcGFibGVzID0gZHJvcHBhYmxlcztcbiAgLy8gICBkcm9wcGFibGVzLmZvckVhY2goZWwgPT4ge1xuICAvLyAgICAgZWwuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7IC8vIE1ha2UgZHJhZ2dhYmxlIGVsZW1lbnRzIGZvY3VzYWJsZVxuICAvLyAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IGVsIGFzIEhUTUxFbGVtZW50KSk7XG4gIC8vICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gKHRoaXMuZm9jdXNlZEVsZW1lbnQgPSBudWxsKSk7XG5cbiAgLy8gICAgIC8vIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgLy8gICAgIC8vIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaFN0YXJ0KGUpIHtcbiAgICB0aGlzLnRvdWNoU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuZ2V0RXZlbnRDb29yZGluYXRlcyhlKTtcbiAgICB0aGlzLnRvdWNoU3RhcnRQb2ludCA9IHsgeCwgeSB9O1xuICAgIHRoaXMuZHJhZ1NvdXJjZSA9IGUuY3VycmVudFRhcmdldDtcbiAgICB0aGlzLmlzRHJhZ2dhYmxlID0gdHJ1ZTtcblxuICAgIC8vIEdldCB0aGUgcm9vdCBub2RlXG4gICAgdGhpcy5yb290Tm9kZSA9IHRoaXMuZHJhZ1NvdXJjZS5nZXRSb290Tm9kZSgpO1xuXG4gICAgaWYgKHRoaXMuZHJhZ09uQ2xpY2tFbmFibGVkKSB7XG4gICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5jcmVhdGVEcmFnQ2xvbmUoZSwgeyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH0pO1xuICAgIH1cblxuICAgIGlmICghdGhpcy51c2VEcmFnQ2xvbmUpIHtcbiAgICAgIC8vIFNhdmUgaW5pdGlhbCB0cmFuc2Zvcm1cbiAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRyYWdTb3VyY2UpO1xuICAgICAgdGhpcy5pbml0aWFsVHJhbnNmb3JtID0gY29tcHV0ZWRTdHlsZS50cmFuc2Zvcm0gPT09ICdub25lJyA/ICcnIDogY29tcHV0ZWRTdHlsZS50cmFuc2Zvcm07XG5cbiAgICAgIC8vIFNhdmUgdGhlIG9yaWdpbmFsIHRyYW5zaXRpb24gc3R5bGVcbiAgICAgIHRoaXMuaW5pdGlhbFRyYW5zaXRpb24gPSBjb21wdXRlZFN0eWxlLnRyYW5zaXRpb24gfHwgJyc7XG5cbiAgICAgIC8vIERpc2FibGUgdHJhbnNpdGlvbnNcbiAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgY2xvbmUgb2Zmc2V0XG4gICAgICBjb25zdCByZWN0ID0gdGhpcy5kcmFnU291cmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGhpcy5jbG9uZU9mZnNldC54ID0geCAtIHJlY3QubGVmdDtcbiAgICAgIHRoaXMuY2xvbmVPZmZzZXQueSA9IHkgLSByZWN0LnRvcDtcblxuICAgICAgLy8gU2V0IGhpZ2hlciB6LWluZGV4IHRvIGJyaW5nIGl0IG9uIHRvcFxuICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnpJbmRleCA9ICc5OTk5JztcbiAgICAgIC8vIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnOyAvLyBTbyBpdCBkb2Vzbid0IGJsb2NrIGV2ZW50c1xuICAgICAgdGhpcy5kcmFnU291cmNlLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaE1vdmUoZSkge1xuICAgIGlmICh0aGlzLmlzRHJhZ2dhYmxlICYmIHRoaXMuZHJhZ1NvdXJjZSkge1xuICAgICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmdldEV2ZW50Q29vcmRpbmF0ZXMoZSk7XG4gICAgICBjb25zdCBjdXJyZW50VG91Y2ggPSB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfTtcblxuICAgICAgaWYgKHRoaXMuY2FsY3VsYXRlRHJhZ0Rpc3RhbmNlKGN1cnJlbnRUb3VjaCkgPj0gdGhpcy5NSU5fRFJBR19ESVNUQU5DRSkge1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJzsgLy8gU28gaXQgZG9lc24ndCBibG9jayBldmVudHNcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jcmVhdGVEcmFnQ2xvbmUoZSwgY3VycmVudFRvdWNoKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURyYWdDbG9uZShlLCBjdXJyZW50VG91Y2g6IHsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSkge1xuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy51c2VEcmFnQ2xvbmUpIHtcbiAgICAgIC8vIEV4aXN0aW5nIGNvZGUgZm9yIGNyZWF0aW5nIGFuZCBoYW5kbGluZyB0aGUgZHJhZyBjbG9uZVxuICAgICAgaWYgKCF0aGlzLmRyYWdDbG9uZSkge1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUub3BhY2l0eSA9IHRoaXMuRFJBR19DTE9ORV9PUEFDSVRZLnRvU3RyaW5nKCk7XG4gICAgICAgIHRoaXMuZHJhZ0Nsb25lID0gdGhpcy5kcmFnU291cmNlLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBpZiAodGhpcy5jb3B5U3R5bGVzRm9yRHJhZ0Nsb25lKSB7XG4gICAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRyYWdTb3VyY2UpO1xuICAgICAgICAgIGZvciAoY29uc3Qgc3R5bGUgb2YgY29tcHV0ZWRTdHlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlW3N0eWxlXSA9IGNvbXB1dGVkU3R5bGVzLmdldFByb3BlcnR5VmFsdWUoc3R5bGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1vdmUgdGhlIGRyYWcgY2xvbmUgdG8gdGhlIHJvb3Qgbm9kZVxuICAgICAgICBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICAvLyBBcHBlbmQgdG8gdGhlIGhvc3Qgb2YgdGhlIHNoYWRvdyByb290XG4gICAgICAgICAgdGhpcy5yb290Tm9kZS5ob3N0LmFwcGVuZENoaWxkKHRoaXMuZHJhZ0Nsb25lKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuZHJhZ0Nsb25lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlQ2xvbmVQb3NpdGlvbihjdXJyZW50VG91Y2gpO1xuICAgICAgICB0aGlzLnNldERyYWdDbG9uZVN0eWxlcyhjdXJyZW50VG91Y2gpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ3N0YXJ0Jyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlRHJhZ0Nsb25lUG9zaXRpb24oY3VycmVudFRvdWNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIGRyYWdnaW5nIHRoZSBvcmlnaW5hbCBlbGVtZW50IHVzaW5nIENTUyB0cmFuc2Zvcm1zXG4gICAgICBpZiAodGhpcy50b3VjaFN0YXJ0UG9pbnQpIHtcbiAgICAgICAgY29uc3QgZGVsdGFYID0gY3VycmVudFRvdWNoLmNsaWVudFggLSB0aGlzLnRvdWNoU3RhcnRQb2ludC54O1xuICAgICAgICBjb25zdCBkZWx0YVkgPSBjdXJyZW50VG91Y2guY2xpZW50WSAtIHRoaXMudG91Y2hTdGFydFBvaW50Lnk7XG5cbiAgICAgICAgLy8gQXBwbHkgYm91bmRhcmllc1xuICAgICAgICAvLyBjb25zdCB7IGJvdW5kZWREZWx0YVgsIGJvdW5kZWREZWx0YVkgfSA9IHRoaXMuYXBwbHlUcmFuc2Zvcm1Cb3VuZGFyaWVzKGRlbHRhWCwgZGVsdGFZKTtcbiAgICAgICAgLy8gdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RoaXMuaW5pdGlhbFRyYW5zZm9ybX0gdHJhbnNsYXRlKCR7Ym91bmRlZERlbHRhWH1weCwgJHtib3VuZGVkRGVsdGFZfXB4KWA7XG5cbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RoaXMuaW5pdGlhbFRyYW5zZm9ybX0gdHJhbnNsYXRlKCR7ZGVsdGFYfXB4LCAke2RlbHRhWX1weClgO1xuXG4gICAgICAgIGlmICghdGhpcy5oYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0KSB7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuZHJhZ1NvdXJjZSwgJ2RyYWdzdGFydCcpO1xuICAgICAgICAgIHRoaXMuaGFzRGlzcGF0Y2hlZERyYWdTdGFydCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkcm9wVGFyZ2V0ID0gdGhpcy5maW5kRHJvcFRhcmdldChlKTtcblxuICAgIGlmIChkcm9wVGFyZ2V0ICE9PSB0aGlzLmxhc3RUYXJnZXQpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudChkcm9wVGFyZ2V0LCAnZHJhZ2VudGVyJyk7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5sYXN0VGFyZ2V0LCAnZHJhZ2xlYXZlJyk7XG4gICAgICB0aGlzLmxhc3RUYXJnZXQgPSBkcm9wVGFyZ2V0O1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudERyb3BUYXJnZXQgPSBkcm9wVGFyZ2V0O1xuICAgIGlmICh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0KSB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQoZHJvcFRhcmdldCwgJ2RyYWdvdmVyJyk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoRW5kKGUpIHtcbiAgICB0aGlzLnRvdWNoRW5kVHJpZ2dlcmVkID0gdHJ1ZTtcbiAgICB0aGlzLmlzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgbGV0IGRyb3BGb3VuZCA9IGZhbHNlO1xuXG4gICAgLy8gY29uc29sZS5sb2coJ2Ryb3BGb3VuZCcsIGRyb3BGb3VuZCk7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50RHJvcFRhcmdldCkge1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuY3VycmVudERyb3BUYXJnZXQsICdkcm9wJyk7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ2VuZCcpO1xuICAgICAgZHJvcEZvdW5kID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgY29uc3QgZHJhZ0VuZEV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdkcmFnZW5kJywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgICAgZHJhZ0VuZEV2ZW50WydkYXRhVHJhbnNmZXInXSA9IHsgZHJvcEVmZmVjdDogJ25vbmUnIH07XG4gICAgICB0aGlzLmRyYWdTb3VyY2U/LmRpc3BhdGNoRXZlbnQoZHJhZ0VuZEV2ZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc2V0RHJhZ1N0YXRlKGRyb3BGb3VuZCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoQ2FuY2VsKGUpIHtcbiAgICB0aGlzLnJlc2V0RHJhZ1N0YXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGZpbmREcm9wVGFyZ2V0KGV2ZW50KSB7XG4gICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmdldEV2ZW50Q29vcmRpbmF0ZXMoZXZlbnQpO1xuICAgIHJldHVybiB0aGlzLmdldERyb3BUYXJnZXRBdFBvaW50KGRvY3VtZW50LCB4LCB5KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RHJvcFRhcmdldEF0UG9pbnQocm9vdDogRG9jdW1lbnRPclNoYWRvd1Jvb3QsIHg6IG51bWJlciwgeTogbnVtYmVyLCBkZXB0aDogbnVtYmVyID0gMCk6IEVsZW1lbnQgfCBudWxsIHtcbiAgICAvLyBMaW1pdCB0aGUgcmVjdXJzaW9uIGRlcHRoXG4gICAgY29uc3QgTUFYX0RFUFRIID0gMjtcbiAgICBpZiAoZGVwdGggPiBNQVhfREVQVEgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSByb290LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZHJvcHpvbmUnKSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gVHJhdmVyc2UgdXAgdGhlIERPTSB0cmVlIHRvIGZpbmQgYW4gYW5jZXN0b3Igd2l0aCAnZHJvcHpvbmUnIGF0dHJpYnV0ZVxuICAgIGxldCBjdXJyZW50RWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQpIHtcbiAgICAgIGlmIChjdXJyZW50RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Ryb3B6b25lJykpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50O1xuICAgICAgfVxuICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBlbGVtZW50IGhhcyBhIFNoYWRvdyBET00gYW5kIGRlcHRoIGxpbWl0IG5vdCByZWFjaGVkLCB0cmF2ZXJzZSBpdFxuICAgIGlmIChlbGVtZW50LnNoYWRvd1Jvb3QgJiYgZGVwdGggPCBNQVhfREVQVEgpIHtcbiAgICAgIGNvbnN0IHNoYWRvd0VsZW1lbnQgPSB0aGlzLmdldERyb3BUYXJnZXRBdFBvaW50KGVsZW1lbnQuc2hhZG93Um9vdCwgeCwgeSwgZGVwdGggKyAxKTtcbiAgICAgIGlmIChzaGFkb3dFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBzaGFkb3dFbGVtZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vIGVsZW1lbnQgd2l0aCAnZHJvcHpvbmUnIGZvdW5kXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUtleURvd24oZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICh0aGlzLmZvY3VzZWRFbGVtZW50KSB7XG4gICAgICBpZiAoZS5rZXkgPT09ICcgJyAmJiAhdGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgIC8vIFNwYWNlYmFyIHByZXNzZWQgdG8gc3RhcnQgZHJhZ2dpbmdcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmlzRHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kcmFnU291cmNlID0gdGhpcy5mb2N1c2VkRWxlbWVudDtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcblxuICAgICAgICAvLyBTdG9yZSB0aGUgZHJvcCB6b25lcyBmb3IgbmF2aWdhdGlvblxuICAgICAgICB0aGlzLmNvbGxlY3REcm9wWm9uZXMoKTtcblxuICAgICAgICAvLyBUcmlnZ2VyIGRyYWdzdGFydCBldmVudFxuICAgICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ3N0YXJ0Jyk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnVGFiJyAmJiB0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgLy8gVGFiIGtleSB0byBuYXZpZ2F0ZSB0aHJvdWdoIGRyb3Agem9uZXNcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdmVUb05leHREcm9wWm9uZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlS2V5VXAoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChlLmtleSA9PT0gJyAnICYmIHRoaXMuaXNEcmFnZ2luZyAmJiB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0KSB7XG4gICAgICAvLyBTcGFjZWJhciBwcmVzc2VkIGFnYWluIHRvIGRyb3AgdGhlIGVsZW1lbnRcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0LCAnZHJvcCcpO1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuZHJhZ1NvdXJjZSwgJ2RyYWdlbmQnKTtcbiAgICAgIHRoaXMucmVzZXREcmFnU3RhdGUodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0RHJvcFpvbmVzKCkge1xuICAgIC8vIENvbGxlY3QgYWxsIGVsZW1lbnRzIHdpdGggZHJvcHpvbmUgYXR0cmlidXRlXG4gICAgdGhpcy5mb2N1c2FibGVEcm9wWm9uZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkcm9wem9uZV0nKSkgYXMgSFRNTEVsZW1lbnRbXTsgLy8gQXJyYXkuZnJvbSh0aGlzLmRyb3BwYWJsZXMpO1xuICAgIHRoaXMuY3VycmVudERyb3Bab25lSW5kZXggPSAtMTsgLy8gUmVzZXQgbmF2aWdhdGlvbiBpbmRleFxuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlVG9OZXh0RHJvcFpvbmUoKSB7XG4gICAgaWYgKHRoaXMuZm9jdXNhYmxlRHJvcFpvbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgLy8gVXBkYXRlIGluZGV4IGZvciB0aGUgbmV4dCBkcm9wIHpvbmVcbiAgICB0aGlzLmN1cnJlbnREcm9wWm9uZUluZGV4ID0gKHRoaXMuY3VycmVudERyb3Bab25lSW5kZXggKyAxKSAlIHRoaXMuZm9jdXNhYmxlRHJvcFpvbmVzLmxlbmd0aDtcblxuICAgIC8vIEZvY3VzIHRoZSBuZXh0IGRyb3Agem9uZVxuICAgIGNvbnN0IG5leHREcm9wWm9uZSA9IHRoaXMuZm9jdXNhYmxlRHJvcFpvbmVzW3RoaXMuY3VycmVudERyb3Bab25lSW5kZXhdO1xuICAgIG5leHREcm9wWm9uZS5mb2N1cygpO1xuXG4gICAgLy8gVXBkYXRlIGN1cnJlbnQgZHJvcCB0YXJnZXRcbiAgICB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0ID0gbmV4dERyb3Bab25lO1xuXG4gICAgLy8gRGlzcGF0Y2ggZHJhZ2VudGVyIGV2ZW50XG4gICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KG5leHREcm9wWm9uZSwgJ2RyYWdlbnRlcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFdmVudENvb3JkaW5hdGVzKGV2ZW50LCBwYWdlID0gZmFsc2UpIHtcbiAgICBjb25zdCB0b3VjaCA9IGV2ZW50LnRvdWNoZXMgPyBldmVudC50b3VjaGVzWzBdIDogZXZlbnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHBhZ2UgPyB0b3VjaC5wYWdlWCA6IHRvdWNoLmNsaWVudFgsXG4gICAgICB5OiBwYWdlID8gdG91Y2gucGFnZVkgOiB0b3VjaC5jbGllbnRZXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlQ2xvbmVQb3NpdGlvbih0b3VjaCkge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmRyYWdTb3VyY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5jbG9uZU9mZnNldC54ID0gdG91Y2guY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICB0aGlzLmNsb25lT2Zmc2V0LnkgPSB0b3VjaC5jbGllbnRZIC0gcmVjdC50b3A7XG4gIH1cblxuICBwcml2YXRlIHNldERyYWdDbG9uZVN0eWxlcyh0b3VjaCkge1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS50b3AgPSBgJHt0b3VjaC5jbGllbnRZIC0gdGhpcy5jbG9uZU9mZnNldC55fXB4YDtcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS5sZWZ0ID0gYCR7dG91Y2guY2xpZW50WCAtIHRoaXMuY2xvbmVPZmZzZXQueH1weGA7XG4gICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS56SW5kZXggPSAnOTk5OTk5JztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRHJhZ0Nsb25lUG9zaXRpb24odG91Y2gpIHtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudG91Y2hFbmRUcmlnZ2VyZWQgfHwgIXRoaXMuZHJhZ0Nsb25lKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG5ld0xlZnQgPSB0b3VjaC5jbGllbnRYIC0gdGhpcy5jbG9uZU9mZnNldC54O1xuICAgICAgY29uc3QgbmV3VG9wID0gdG91Y2guY2xpZW50WSAtIHRoaXMuY2xvbmVPZmZzZXQueTtcblxuICAgICAgLy8gQXBwbHkgYm91bmRhcmllc1xuICAgICAgY29uc3QgeyBuZXdMZWZ0OiBib3VuZGVkTGVmdCwgbmV3VG9wOiBib3VuZGVkVG9wIH0gPSB0aGlzLmFwcGx5Qm91bmRhcmllcyhuZXdMZWZ0LCBuZXdUb3AsIHRoaXMuZHJhZ0Nsb25lKTtcblxuICAgICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUubGVmdCA9IGAke2JvdW5kZWRMZWZ0fXB4YDtcbiAgICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnRvcCA9IGAke2JvdW5kZWRUb3B9cHhgO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVRyYW5zZm9ybUJvdW5kYXJpZXMoZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyKSB7XG4gICAgLy8gR2V0IHRoZSBib3VuZGFyaWVzIG9mIHRoZSByb290IG5vZGVcbiAgICBsZXQgYm91bmRhcnlSZWN0OiBET01SZWN0O1xuICAgIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgYm91bmRhcnlSZWN0ID0gdGhpcy5yb290Tm9kZS5ob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gdmlld3BvcnRcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IG5ldyBET01SZWN0KDAsIDAsIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9ucyBhbmQgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnRcbiAgICBjb25zdCBlbGVtZW50UmVjdCA9IHRoaXMuZHJhZ1NvdXJjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBlbGVtZW50V2lkdGggPSBlbGVtZW50UmVjdC53aWR0aDtcbiAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gZWxlbWVudFJlY3QuaGVpZ2h0O1xuXG4gICAgLy8gQ2FsY3VsYXRlIHBvdGVudGlhbCBuZXcgcG9zaXRpb25cbiAgICBjb25zdCBuZXdMZWZ0ID0gZWxlbWVudFJlY3QubGVmdCArIGRlbHRhWDtcbiAgICBjb25zdCBuZXdUb3AgPSBlbGVtZW50UmVjdC50b3AgKyBkZWx0YVk7XG5cbiAgICAvLyBMaW1pdCB0aGUgbmV3IHBvc2l0aW9uIHdpdGhpbiB0aGUgYm91bmRhcmllc1xuICAgIGNvbnN0IGJvdW5kZWRMZWZ0ID0gTWF0aC5tYXgoYm91bmRhcnlSZWN0LmxlZnQsIE1hdGgubWluKG5ld0xlZnQsIGJvdW5kYXJ5UmVjdC5yaWdodCAtIGVsZW1lbnRXaWR0aCkpO1xuICAgIGNvbnN0IGJvdW5kZWRUb3AgPSBNYXRoLm1heChib3VuZGFyeVJlY3QudG9wLCBNYXRoLm1pbihuZXdUb3AsIGJvdW5kYXJ5UmVjdC5ib3R0b20gLSBlbGVtZW50SGVpZ2h0KSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGJvdW5kZWQgZGVsdGEgdmFsdWVzXG4gICAgY29uc3QgYm91bmRlZERlbHRhWCA9IGJvdW5kZWRMZWZ0IC0gZWxlbWVudFJlY3QubGVmdDtcbiAgICBjb25zdCBib3VuZGVkRGVsdGFZID0gYm91bmRlZFRvcCAtIGVsZW1lbnRSZWN0LnRvcDtcblxuICAgIHJldHVybiB7IGJvdW5kZWREZWx0YVgsIGJvdW5kZWREZWx0YVkgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlCb3VuZGFyaWVzKG5ld0xlZnQ6IG51bWJlciwgbmV3VG9wOiBudW1iZXIsIGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgLy8gR2V0IHRoZSBib3VuZGFyaWVzIG9mIHRoZSByb290IG5vZGVcbiAgICBsZXQgYm91bmRhcnlSZWN0OiBET01SZWN0O1xuICAgIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgYm91bmRhcnlSZWN0ID0gdGhpcy5yb290Tm9kZS5ob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gdmlld3BvcnRcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IG5ldyBET01SZWN0KDAsIDAsIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZWxlbWVudFxuICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBlbGVtZW50V2lkdGggPSBlbGVtZW50UmVjdC53aWR0aDtcbiAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gZWxlbWVudFJlY3QuaGVpZ2h0O1xuXG4gICAgLy8gTGltaXQgdGhlIG5ld0xlZnQgYW5kIG5ld1RvcCB3aXRoaW4gdGhlIGJvdW5kYXJpZXNcbiAgICBjb25zdCBib3VuZGVkTGVmdCA9IE1hdGgubWF4KGJvdW5kYXJ5UmVjdC5sZWZ0LCBNYXRoLm1pbihuZXdMZWZ0LCBib3VuZGFyeVJlY3QucmlnaHQgLSBlbGVtZW50V2lkdGgpKTtcbiAgICBjb25zdCBib3VuZGVkVG9wID0gTWF0aC5tYXgoYm91bmRhcnlSZWN0LnRvcCwgTWF0aC5taW4obmV3VG9wLCBib3VuZGFyeVJlY3QuYm90dG9tIC0gZWxlbWVudEhlaWdodCkpO1xuXG4gICAgcmV0dXJuIHsgbmV3TGVmdDogYm91bmRlZExlZnQsIG5ld1RvcDogYm91bmRlZFRvcCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVEcmFnRGlzdGFuY2UodG91Y2gpOiBudW1iZXIge1xuICAgIGNvbnN0IHhEaXN0ID0gTWF0aC5hYnModG91Y2guY2xpZW50WCAtIHRoaXMudG91Y2hTdGFydFBvaW50LngpO1xuICAgIGNvbnN0IHlEaXN0ID0gTWF0aC5hYnModG91Y2guY2xpZW50WSAtIHRoaXMudG91Y2hTdGFydFBvaW50LnkpO1xuICAgIHJldHVybiB4RGlzdCArIHlEaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaEN1c3RvbUV2ZW50KGVsZW1lbnQsIGV2ZW50VHlwZSwgYnViYmxlID0gdHJ1ZSkge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50VHlwZSwgeyBidWJibGVzOiBidWJibGUsIGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgZXZlbnRbJ2RhdGFUcmFuc2ZlciddID0gdGhpcy5kYXRhVHJhbnNmZXI7XG4gICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXREcmFnU3RhdGUoZHJvcEZvdW5kOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICBpZiAodGhpcy51c2VEcmFnQ2xvbmUpIHtcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLm9wYWNpdHkgPSAnMS4wJztcbiAgICAgICAgdGhpcy5kcmFnQ2xvbmU/LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5kcmFnQ2xvbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBzdHlsZXNcbiAgICAgICAgaWYgKCFkcm9wRm91bmQpIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnpJbmRleCA9ICcnO1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnO1xuICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9uIHN0eWxlXG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2l0aW9uID0gdGhpcy5pbml0aWFsVHJhbnNpdGlvbjtcblxuICAgICAgICAvLyBSZXNldCB0aGUgb3JpZ2luYWwgdHJhbnNpdGlvbiBwcm9wZXJ0eVxuICAgICAgICB0aGlzLmluaXRpYWxUcmFuc2l0aW9uID0gJyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgdGhpcy5kcmFnU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmRyYWdDbG9uZSA9IG51bGw7XG4gICAgdGhpcy5pc0RyYWdnYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMudG91Y2hTdGFydFRpbWUgPSAwO1xuICAgIHRoaXMudG91Y2hTdGFydFBvaW50ID0gbnVsbDtcbiAgICB0aGlzLnRvdWNoRW5kVHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgdGhpcy5kYXRhVHJhbnNmZXIgPSB7XG4gICAgICBkYXRhOiB7fSxcbiAgICAgIHNldERhdGEodHlwZSwgdmFsKSB7XG4gICAgICAgIHRoaXMuZGF0YVt0eXBlXSA9IHZhbDtcbiAgICAgIH0sXG4gICAgICBnZXREYXRhKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVt0eXBlXTtcbiAgICAgIH0sXG4gICAgICBlZmZlY3RBbGxvd2VkOiAnbW92ZSdcbiAgICB9O1xuICAgIHRoaXMuY2xvbmVPZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICB0aGlzLmxhc3RUYXJnZXQgPSBudWxsO1xuICAgIHRoaXMuY3VycmVudERyb3BUYXJnZXQgPSBudWxsO1xuICAgIHRoaXMuYWxsb3dDbGljayA9IHRydWU7XG4gICAgdGhpcy5pbml0aWFsVHJhbnNmb3JtID0gJyc7XG4gICAgdGhpcy5oYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0ID0gZmFsc2U7XG5cbiAgICB0aGlzLnJvb3ROb2RlID0gbnVsbDtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZGVjbGFyZSBjbGFzcyBEcm9wcGFibGVzSW50ZXJmYWNlIHt9XG5cbmV4cG9ydCBjb25zdCBEcm9wcGFibGVzTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4gIHVzZVNoYWRvd1Jvb3Q6IGJvb2xlYW4sXG4gIGRyb3BwYWJsZXNTZWxlY3Rvcjogc3RyaW5nXG4pID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgRHJvcHBhYmxlc0VsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIHtcbiAgICBwcml2YXRlIG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9KSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuaXNNYXRjaFRhYnVsYXIoKSkgcmV0dXJuO1xuICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk7XG5cbiAgICAgIGNvbnN0IGRyb3BwYWJsZXMgPSB0aGlzLmdldERyb3BwYWJsZUVsZW1lbnRzKCk7XG4gICAgICB0aGlzLmluaXRpYWxpemVFdmVudEhhbmRsZXJzKCk7XG4gICAgICBkcm9wcGFibGVzLmZvckVhY2goZHJvcHBhYmxlID0+IHtcbiAgICAgICAgdGhpcy5wcmVwYXJlRHJvcHBhYmxlKGRyb3BwYWJsZSk7XG4gICAgICAgIHRoaXMub2JzZXJ2ZURyb3BwYWJsZUF0dHJpYnV0ZXMoZHJvcHBhYmxlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNNYXRjaFRhYnVsYXIoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ3F0aS1tYXRjaC10YWJ1bGFyJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREcm9wcGFibGVFbGVtZW50cygpOiBFbGVtZW50W10ge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICAgIHVzZVNoYWRvd1Jvb3QgPyB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpIDogdGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplRXZlbnRIYW5kbGVycygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJhZ292ZXJIYW5kbGVyID0gdGhpcy5kcmFnb3ZlckhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuZHJhZ2xlYXZlSGFuZGxlciA9IHRoaXMuZHJhZ2xlYXZlSGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5kcmFnZW50ZXJIYW5kbGVyID0gdGhpcy5kcmFnZW50ZXJIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmRyb3BIYW5kbGVyID0gdGhpcy5kcm9wSGFuZGxlci5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJlcGFyZURyb3BwYWJsZShkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5zZXRBdHRyaWJ1dGUoJ2Ryb3B6b25lJywgJ21vdmUnKTtcbiAgICAgIGRyb3BwYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCB0aGlzLmRyYWdsZWF2ZUhhbmRsZXIpO1xuICAgICAgdGhpcy5hdHRhY2hFdmVudExpc3RlbmVycyhkcm9wcGFibGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb2JzZXJ2ZURyb3BwYWJsZUF0dHJpYnV0ZXMoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25zID0+IHtcbiAgICAgICAgbXV0YXRpb25zLmZvckVhY2goKHsgYXR0cmlidXRlTmFtZSB9KSA9PiB7XG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgPT09ICdkaXNhYmxlZCcpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlRHJvcHBhYmxlSGFuZGxlcnMoZHJvcHBhYmxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoZHJvcHBhYmxlLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVEcm9wcGFibGVIYW5kbGVycyhkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGRpc2FibGVkID0gZHJvcHBhYmxlLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhdHRhY2hFdmVudExpc3RlbmVycyhkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuZHJhZ292ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCB0aGlzLmRyYWdlbnRlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLmRyb3BIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZUV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5kcmFnb3ZlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMuZHJhZ2VudGVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuZHJvcEhhbmRsZXIpO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuaXNNYXRjaFRhYnVsYXIoKSkgcmV0dXJuO1xuICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMub2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRyYWdlbnRlckhhbmRsZXIoZXY6IERyYWdFdmVudCk6IHZvaWQge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRyYWdvdmVySGFuZGxlcihldjogRHJhZ0V2ZW50KTogYm9vbGVhbiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5hY3RpdmF0ZURyb3BwYWJsZShldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgIGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ21vdmUnO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWN0aXZhdGVEcm9wcGFibGUoZHJvcHBhYmxlOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgnYWN0aXZlJywgJycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZHJvcEhhbmRsZXIoZXY6IERyYWdFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGRyb3BwYWJsZSA9IGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCBpZGVudGlmaWVyID0gZXYuZGF0YVRyYW5zZmVyLmdldERhdGEoJ3RleHQnKTtcbiAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IHRoaXMuZmluZERyYWdnYWJsZShpZGVudGlmaWVyKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuaXNWYWxpZERyb3AoZHJvcHBhYmxlLCBkcmFnZ2FibGUpKTtcblxuICAgICAgaWYgKCFkcmFnZ2FibGUpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChkcmFnZ2FibGUgJiYgIXRoaXMuaXNWYWxpZERyb3AoZHJvcHBhYmxlLCBkcmFnZ2FibGUpKSB7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLm1vdmVEcmFnZ2FibGVUb0Ryb3BwYWJsZShkcmFnZ2FibGUsIGRyb3BwYWJsZSk7XG4gICAgICB0aGlzLmRlYWN0aXZhdGVEcm9wcGFibGUoZHJvcHBhYmxlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmREcmFnZ2FibGUoaWRlbnRpZmllcjogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgIGlmICghaWRlbnRpZmllcikgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoYFtpZGVudGlmaWVyPSR7aWRlbnRpZmllcn1dYCkgfHwgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYFtpZGVudGlmaWVyPSR7aWRlbnRpZmllcn1dYClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1ZhbGlkRHJvcChkcm9wcGFibGU6IEhUTUxFbGVtZW50LCBkcmFnZ2FibGU6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gZHJhZ2dhYmxlLnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgIT09IGRyb3BwYWJsZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG1vdmVEcmFnZ2FibGVUb0Ryb3BwYWJsZShkcmFnZ2FibGU6IEhUTUxFbGVtZW50LCBkcm9wcGFibGU6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBtb3ZlRWxlbWVudCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICBkcm9wcGFibGUuYXBwZW5kQ2hpbGQoZHJhZ2dhYmxlKTtcblxuICAgICAgICAvLyBjaGVja01heEFzc29jaWF0aW9ucyBhbmQgc2F2ZVJlc3BvbnNlIGFyZSBkZWZpbmVkL292ZXJyaWRkZW4gaW4gYSBtaXhpblxuICAgICAgICB0aGlzWydjaGVja01heEFzc29jaWF0aW9ucyddKCk7XG4gICAgICAgIHRoaXNbJ3NhdmVSZXNwb25zZSddKG51bGwpOyAvL1xuICAgICAgfTtcblxuICAgICAgaWYgKCFkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIG1vdmVFbGVtZW50KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24obW92ZUVsZW1lbnQpO1xuICAgICAgYXdhaXQgdHJhbnNpdGlvbi5maW5pc2hlZDtcblxuICAgICAgLy8gdGhpc1snY2hlY2tNYXhBc3NvY2lhdGlvbnMnXSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVhY3RpdmF0ZURyb3BwYWJsZShkcm9wcGFibGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlQXR0cmlidXRlKCdhY3RpdmUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRyYWdsZWF2ZUhhbmRsZXIoZXY6IERyYWdFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZURyb3BwYWJsZShldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgIGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gRHJvcHBhYmxlc0VsZW1lbnQgYXMgQ29uc3RydWN0b3I8RHJvcHBhYmxlc0ludGVyZmFjZT4gJiBUO1xufTtcbiIsICIvLyBUSElTIElTIEEgTUlYSU4sIFRISVMgSVMgQSBNSVhJTlxuLy8gVVNFIExJS0UgVEhJU1xuLy8gYGBgY2xhc3MgRHJvcExpc3QgZXh0ZW5kcyBGbGlwcGFibGVzKExpdEVsZW1lbnQpIHtgYGBcbi8vIG1peGluIHdoaWNoIGFuaW1hdGVzIGNoaWxkcmVuIHdpdGggRkxJUFxuLy8gYSBjb21iaW5hdGlvbiBiZXR3ZWVuIHRoaXMgZGlyZWN0aXZlOlxuLy8gaHR0cHM6Ly9uZy1ydW4uY29tL2VkaXQvOU1HcjVkWVdBMjBBaUp0cHk1YXo/b3Blbj1hcHAlMkZhcHAuY29tcG9uZW50Lmh0bWxcbi8vIGFuZCBhIHR1dG9yaWFsIGhvdyB0byBtYWtlIGEgbWl4aW5cbi8vIGh0dHBzOi8vbGl0LmRldi9kb2NzL2NvbXBvc2l0aW9uL21peGlucy9cblxuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgRmxpcHBhYmxlc0ludGVyZmFjZSB7XG4gIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQ7XG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQ7XG59XG5cbi8vIGp1c3QgYSBjb252ZXJzaW9uIG9mIGEgYW5ndWxhciBGTElQIGRpcmVjdGl2ZSwgbWFkZSBhcyBhIE1peGluXG4vLyBodHRwczovL25nLXJ1bi5jb20vZWRpdC85TUdyNWRZV0EyMEFpSnRweTVhej9vcGVuPWFwcCUyRmFwcC5jb21wb25lbnQuaHRtbFxuZXhwb3J0IGNvbnN0IEZsaXBwYWJsZXNNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihcbiAgc3VwZXJDbGFzczogVCxcbiAgZHJvcHBhYmxlc1NlbDogc3RyaW5nLFxuICBkcmFnZ2FibGVzU2VsOiBzdHJpbmdcbikgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBGbGlwcGFibGVzRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIC8vIHByaXZhdGUgc3RhdGUgPSBuZXcgTWFwPEVsZW1lbnQsIGFueT4oKTtcbiAgICAvLyBwcml2YXRlIG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuICAgIC8vIGZsaXBwYWJsZXNTZWxlY3Rvcjogc3RyaW5nO1xuICAgIC8vIG92ZXJyaWRlIGFzeW5jIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpIHtcbiAgICAvLyAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7IC8vIHBrOiB0aGlzIGlzIHRoZSBrZXkgdG8gY2FsY3VsYXRlIGNvcnJlY3QgcHJvcG9ydGlvbnNcbiAgICAvLyAgIGNvbnN0IGRyYWdnYWJsZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbChkcmFnZ2FibGVzU2VsKSk7XG4gICAgLy8gICBkcmFnZ2FibGVzLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAvLyAgICAgY29uc3QgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gICAgIHRoaXMuc3RhdGUuc2V0KGVsZW0sIHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIC8vICAgfSk7XG4gICAgLy8gICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5hbmltYXRlTWUpO1xuICAgIC8vICAgY29uc3QgZHJvcHBhYmxlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWwpKTtcbiAgICAvLyAgIGRyb3BwYWJsZXMuZm9yRWFjaCgoZHJhZ2dhYmxlKSA9PiB7XG4gICAgLy8gICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShkcmFnZ2FibGUsIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuICAgIC8vICAgfSk7XG4gICAgLy8gICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcywgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG4gICAgLy8gICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICAvLyB9XG4gICAgLy8gcHJpdmF0ZSBhbmltYXRlTWUgPSAoKSA9PiB7XG4gICAgLy8gICB0aGlzLnN0YXRlLmZvckVhY2goKHZhbHVlLCBlbGVtKSA9PiB7XG4gICAgLy8gICAgIGNvbnN0IHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0gPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIC8vICAgICBpZiAodGhpcy5zdGF0ZS5nZXQoZWxlbSkgPT0gbnVsbCkge1xuICAgIC8vICAgICAgIHRoaXMuc3RhdGUuc2V0KGVsZW0sIHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIGNvbnN0IGNhY2hlID0gdGhpcy5zdGF0ZS5nZXQoZWxlbSk7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhWCA9IGNhY2hlLmxlZnQgLSBsZWZ0O1xuICAgIC8vICAgICBjb25zdCBkZWx0YVkgPSBjYWNoZS50b3AgLSB0b3A7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhVyA9IGNhY2hlLndpZHRoIC8gd2lkdGg7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhSCA9IGNhY2hlLmhlaWdodCAvIGhlaWdodDtcbiAgICAvLyAgICAgdGhpcy5zdGF0ZS5zZXQoZWxlbSwgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgLy8gICAgIGNvbnN0IHsgZHVyYXRpb24sIGVhc2luZyB9ID0geyBkdXJhdGlvbjogMzUwLCBlYXNpbmc6ICdjdWJpYy1iZXppZXIoMC4yNiwgMC44NiwgMC40NCwgMC45ODUpJyB9O1xuICAgIC8vICAgICBlbGVtLmFuaW1hdGUoXG4gICAgLy8gICAgICAgW1xuICAgIC8vICAgICAgICAge1xuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICd0b3AgbGVmdCcsXG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybTogYFxuICAgIC8vIHRyYW5zbGF0ZSgke2RlbHRhWH1weCwgJHtkZWx0YVl9cHgpXG4gICAgLy8gc2NhbGUoJHtkZWx0YVd9LCAke2RlbHRhSH0pXG4gICAgLy8gYCxcbiAgICAvLyAgICAgICAgICAgLy8gd2lkdGg6IGNhY2hlLndpZHRoLFxuICAgIC8vICAgICAgICAgICAvLyBoZWlnaHQ6IGNhY2hlLmhlaWdodCsgJ3B4JyxcbiAgICAvLyAgICAgICAgICAgLy8gb3BhY2l0eTogY2FjaGUub3BhY2l0eSxcbiAgICAvLyAgICAgICAgIH0sXG4gICAgLy8gICAgICAgICB7XG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybU9yaWdpbjogJ3RvcCBsZWZ0JyxcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtOiAnbm9uZScsXG4gICAgLy8gICAgICAgICB9LFxuICAgIC8vICAgICAgIF0sXG4gICAgLy8gICAgICAge1xuICAgIC8vICAgICAgICAgZHVyYXRpb24sXG4gICAgLy8gICAgICAgICBlYXNpbmcsXG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICApO1xuICAgIC8vICAgfSk7XG4gICAgLy8gfTtcbiAgICAvLyBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAvLyAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAvLyB9XG4gIH1cbiAgcmV0dXJuIEZsaXBwYWJsZXNFbGVtZW50IGFzIENvbnN0cnVjdG9yPEZsaXBwYWJsZXNJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiLy8gQHdhdGNoIGRlY29yYXRvclxuLy9cbi8vIFJ1bnMgd2hlbiBhbiBvYnNlcnZlZCBwcm9wZXJ0eSBjaGFuZ2VzLCBlLmcuIEBwcm9wZXJ0eSBvciBAc3RhdGUsIGJ1dCBiZWZvcmUgdGhlIGNvbXBvbmVudCB1cGRhdGVzLlxuLy9cbi8vIFRvIHdhaXQgZm9yIGFuIHVwZGF0ZSB0byBjb21wbGV0ZSBhZnRlciBhIGNoYW5nZSBvY2N1cnMsIHVzZSBgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZWAgaW4gdGhlIGhhbmRsZXIuIFRvIHN0YXJ0XG4vLyB3YXRjaGluZyBhZnRlciB0aGUgaW5pdGlhbCB1cGRhdGUvcmVuZGVyLCB1c2UgYHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfWAgb3IgYHRoaXMuaGFzVXBkYXRlZGAgaW4gdGhlIGhhbmRsZXIuXG4vL1xuLy8gVXNhZ2U6XG4vL1xuLy8gIEB3YXRjaCgncHJvcE5hbWUnKVxuLy8gIGhhbmRsZVByb3BDaGFuZ2Uob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4vLyAgICAuLi5cbi8vICB9XG5cbmltcG9ydCB0eXBlIHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbnR5cGUgVXBkYXRlSGFuZGxlciA9IChwcmV2PzogdW5rbm93biwgbmV4dD86IHVua25vd24pID0+IHZvaWQ7XG5cbnR5cGUgTm9uVW5kZWZpbmVkPEE+ID0gQSBleHRlbmRzIHVuZGVmaW5lZCA/IG5ldmVyIDogQTtcblxudHlwZSBVcGRhdGVIYW5kbGVyRnVuY3Rpb25LZXlzPFQgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuICBbSyBpbiBrZXlvZiBUXS0/OiBOb25VbmRlZmluZWQ8VFtLXT4gZXh0ZW5kcyBVcGRhdGVIYW5kbGVyID8gSyA6IG5ldmVyO1xufVtrZXlvZiBUXTtcblxuaW50ZXJmYWNlIExpdmVRdWVyeU9wdGlvbnMge1xuICAvKipcbiAgICogSWYgdHJ1ZSwgd2lsbCBvbmx5IHN0YXJ0IHdhdGNoaW5nIGFmdGVyIHRoZSBpbml0aWFsIHVwZGF0ZS9yZW5kZXJcbiAgICovXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaXZlUXVlcnkocXVlcnlTZWxlY3Rvcjogc3RyaW5nLCBvcHRpb25zPzogTGl2ZVF1ZXJ5T3B0aW9ucykge1xuICBsZXQgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG4gIGNvbnN0IHJlc29sdmVkT3B0aW9uczogUmVxdWlyZWQ8TGl2ZVF1ZXJ5T3B0aW9ucz4gPSB7XG4gICAgLi4ub3B0aW9uc1xuICB9O1xuICByZXR1cm4gPEVsZW1DbGFzcyBleHRlbmRzIExpdEVsZW1lbnQ+KFxuICAgIHByb3RvOiBFbGVtQ2xhc3MsXG4gICAgZGVjb3JhdGVkRm5OYW1lOiBVcGRhdGVIYW5kbGVyRnVuY3Rpb25LZXlzPEVsZW1DbGFzcz5cbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3QgeyBjb25uZWN0ZWRDYWxsYmFjaywgZGlzY29ubmVjdGVkQ2FsbGJhY2sgfSA9IHByb3RvO1xuXG4gICAgcHJvdG8uY29ubmVjdGVkQ2FsbGJhY2sgPSBmdW5jdGlvbiAodGhpczogRWxlbUNsYXNzKSB7XG4gICAgICBjb25uZWN0ZWRDYWxsYmFjay5jYWxsKHRoaXMpO1xuICAgICAgY29uc3QgY2FsbGJhY2sgPSAobXV0YXRpb25MaXN0OiBNdXRhdGlvblJlY29yZFtdKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzVG9XYXRjaCA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5U2VsZWN0b3IpKTtcbiAgICAgICAgZm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbkxpc3QpIHtcbiAgICAgICAgICBjb25zdCBhZGRlZE5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5hZGRlZE5vZGVzKS5tYXAoZSA9PiBlIGFzIEVsZW1lbnQpO1xuICAgICAgICAgIGNvbnN0IHJlbW92ZWROb2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24uYWRkZWROb2RlcykubWFwKGUgPT4gZSBhcyBFbGVtZW50KTtcbiAgICAgICAgICBpZiAobXV0YXRpb24udHlwZSA9PT0gJ2NoaWxkTGlzdCcgJiYgYWRkZWROb2Rlcy5maW5kKG4gPT4gZWxlbWVudHNUb1dhdGNoLmluY2x1ZGVzKG4pKSkge1xuICAgICAgICAgICAgKHRoaXNbZGVjb3JhdGVkRm5OYW1lXSBhcyB1bmtub3duIGFzIFVwZGF0ZUhhbmRsZXIpKGFkZGVkTm9kZXMsIHJlbW92ZWROb2Rlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjayk7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pO1xuXG4gICAgICBjb25zdCBlbGVtZW50c0FkZGVkID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5U2VsZWN0b3IpID8/IFtdO1xuICAgICAgKHRoaXNbZGVjb3JhdGVkRm5OYW1lXSBhcyB1bmtub3duIGFzIFVwZGF0ZUhhbmRsZXIpKEFycmF5LmZyb20oZWxlbWVudHNBZGRlZCksIFtdKTtcbiAgICB9O1xuXG4gICAgcHJvdG8uZGlzY29ubmVjdGVkQ2FsbGJhY2sgPSBmdW5jdGlvbiAodGhpczogRWxlbUNsYXNzKSB7XG4gICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjay5jYWxsKHRoaXMpO1xuICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH07XG4gIH07XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBJSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRHJvcHBhYmxlc01peGluIH0gZnJvbSAnLi9kcm9wcGFibGVzLW1peGluJztcbmltcG9ydCB7IEZsaXBwYWJsZXNNaXhpbiB9IGZyb20gJy4vZmxpcHBhYmxlcy1taXhpbic7XG5cbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgbGl2ZVF1ZXJ5IH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy9saXZlLXF1ZXJ5JztcbmltcG9ydCB7IFRvdWNoRHJhZ0FuZERyb3AgfSBmcm9tICcuL2RyYWctZHJvcC1hcGknO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmludGVyZmFjZSBJbnRlcmFjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICBjb3B5U3R5bGVzRHJhZ0Nsb25lOiBib29sZWFuO1xuICBkcmFnQ2FuQmVQbGFjZWRCYWNrOiBib29sZWFuO1xuICBkcmFnT25DbGljazogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihcbiAgc3VwZXJDbGFzczogVCxcbiAgZHJhZ2dhYmxlc1NlbGVjdG9yOiBzdHJpbmcsXG4gIHVzZVNoYWRvd1Jvb3RGb3JEcm9wcGFibGVzOiBib29sZWFuLFxuICBkcm9wcGFibGVzU2VsZWN0b3I6IHN0cmluZ1xuKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIERyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50IGV4dGVuZHMgRmxpcHBhYmxlc01peGluKFxuICAgIERyb3BwYWJsZXNNaXhpbihzdXBlckNsYXNzLCB1c2VTaGFkb3dSb290Rm9yRHJvcHBhYmxlcywgZHJvcHBhYmxlc1NlbGVjdG9yKSxcbiAgICBkcm9wcGFibGVzU2VsZWN0b3IsXG4gICAgZHJhZ2dhYmxlc1NlbGVjdG9yXG4gICkge1xuICAgIHByb3RlY3RlZCBkcmFnZ2FibGVzID0gbmV3IE1hcDxIVE1MRWxlbWVudCwgeyBwYXJlbnQ6IEhUTUxFbGVtZW50OyBpbmRleDogbnVtYmVyIH0+KCk7XG4gICAgcHJvdGVjdGVkIGRyb3BwYWJsZXM6IEhUTUxFbGVtZW50W10gPSBbXTtcbiAgICBkcmFnRHJvcEFwaTogVG91Y2hEcmFnQW5kRHJvcDtcblxuICAgIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogZmFsc2UsIHR5cGU6IE9iamVjdCB9KSBjb25maWd1cmF0aW9uOiBJbnRlcmFjdGlvbkNvbmZpZ3VyYXRpb24gPSB7XG4gICAgICBjb3B5U3R5bGVzRHJhZ0Nsb25lOiB0cnVlLFxuICAgICAgZHJhZ0NhbkJlUGxhY2VkQmFjazogdHJ1ZSxcbiAgICAgIGRyYWdPbkNsaWNrOiBmYWxzZVxuICAgIH07XG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlLCBhdHRyaWJ1dGU6ICdtaW4tYXNzb2NpYXRpb25zJyB9KSBtaW5Bc3NvY2lhdGlvbnMgPSAxO1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSwgYXR0cmlidXRlOiAnbWF4LWFzc29jaWF0aW9ucycgfSkgbWF4QXNzb2NpYXRpb25zID0gMTtcblxuICAgIEBsaXZlUXVlcnkoZHJhZ2dhYmxlc1NlbGVjdG9yKVxuICAgIGhhbmRsZURyYWdnYWJsZXNDaGFuZ2UoZHJhZ3NBZGRlZDogSFRNTEVsZW1lbnRbXSwgZHJhZ3NSZW1vdmVkOiBFbGVtZW50W10pIHtcbiAgICAgIGlmICh0aGlzLmlzTWF0Y2hUYWJ1bGFyKCkpIHJldHVybjtcbiAgICAgIGNvbnN0IG5ld0RyYWdnYWJsZXMgPSB0aGlzLmZpbHRlckV4aXN0aW5nRHJhZ2dhYmxlcyhkcmFnc0FkZGVkKTtcblxuICAgICAgaWYgKG5ld0RyYWdnYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmFkZE5ld0RyYWdnYWJsZXMobmV3RHJhZ2dhYmxlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk6IHZvaWQge1xuICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk7XG4gICAgICB0aGlzLmluaXRpYWxpemVEcm9wcGFibGVzKCk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5pbml0aWFsaXplRHJhZ0Ryb3BBcGkoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVEcmFnRHJvcEFwaSgpIHtcbiAgICAgIHRoaXMuZHJhZ0Ryb3BBcGkgPSBuZXcgVG91Y2hEcmFnQW5kRHJvcCgpO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8RHJhZ0Ryb3BJbnRlcmFjdGlvbkVsZW1lbnQ+KCdxdGktcmVnaXN0ZXItaW50ZXJhY3Rpb24nLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHRoaXNcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc01hdGNoVGFidWxhcigpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbHRlckV4aXN0aW5nRHJhZ2dhYmxlcyhkcmFnZ2FibGVzOiBIVE1MRWxlbWVudFtdKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgICByZXR1cm4gZHJhZ2dhYmxlcy5maWx0ZXIoZCA9PiAhdGhpcy5kcmFnZ2FibGVzLmhhcyhkKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGROZXdEcmFnZ2FibGVzKGRyYWdnYWJsZXM6IEhUTUxFbGVtZW50W10pOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJhZ0Ryb3BBcGkuYWRkRHJhZ2dhYmxlRWxlbWVudHMoZHJhZ2dhYmxlcyk7XG4gICAgICBkcmFnZ2FibGVzLmZvckVhY2goZHJhZ2dhYmxlID0+IHRoaXMuc3RvcmVEcmFnZ2FibGUoZHJhZ2dhYmxlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdG9yZURyYWdnYWJsZShkcmFnZ2FibGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICBjb25zdCBpbmRleCA9IEFycmF5LmZyb20oZHJhZ2dhYmxlLnBhcmVudE5vZGUuY2hpbGRyZW4pLmluZGV4T2YoZHJhZ2dhYmxlKTtcbiAgICAgIHRoaXMuZHJhZ2dhYmxlcy5zZXQoZHJhZ2dhYmxlLCB7XG4gICAgICAgIHBhcmVudDogZHJhZ2dhYmxlLnBhcmVudEVsZW1lbnQsXG4gICAgICAgIGluZGV4XG4gICAgICB9KTtcbiAgICAgIGRyYWdnYWJsZS5zdHlsZS52aWV3VHJhbnNpdGlvbk5hbWUgPSBgZHJhZy0ke2luZGV4fS0ke3RoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgY3J5cHRvLnJhbmRvbVVVSUQoKX1gO1xuICAgICAgZHJhZ2dhYmxlLnNldEF0dHJpYnV0ZSgncXRpLWRyYWdnYWJsZScsICd0cnVlJyk7XG4gICAgICBkcmFnZ2FibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgdGhpcy5oYW5kbGVEcmFnU3RhcnQpO1xuICAgICAgZHJhZ2dhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCB0aGlzLmhhbmRsZURyYWdFbmQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZURyb3BwYWJsZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyb3BwYWJsZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICB1c2VTaGFkb3dSb290Rm9yRHJvcHBhYmxlc1xuICAgICAgICAgID8gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKVxuICAgICAgICAgIDogdGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVEcmFnU3RhcnQgPSAoZXY6IERyYWdFdmVudCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGV2LmRhdGFUcmFuc2Zlci5zZXREYXRhKCd0ZXh0JywgdGFyZ2V0LmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpKTtcbiAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RyYWdnaW5nJywgJycpO1xuICAgICAgdGhpcy5hY3RpdmF0ZURyb3BwYWJsZXMoKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBoYW5kbGVEcmFnRW5kID0gYXN5bmMgKGV2OiBEcmFnRXZlbnQpID0+IHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmRlYWN0aXZhdGVEcm9wcGFibGVzKCk7XG4gICAgICBjb25zdCBkcmFnZ2FibGUgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgZHJhZ2dhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnZHJhZ2dpbmcnKTtcbiAgICAgIGNvbnN0IHdhc0Ryb3BwZWQgPSBhd2FpdCB0aGlzLndhc0Ryb3BwZWQoZXYpO1xuICAgICAgaWYgKCF3YXNEcm9wcGVkKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uZHJhZ0NhbkJlUGxhY2VkQmFjaykge1xuICAgICAgICAgIHRoaXMucmVzdG9yZUluaXRpYWxEcmFnZ2FibGVQb3NpdGlvbihkcmFnZ2FibGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgYWN0aXZhdGVEcm9wcGFibGVzKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcm9wcGFibGVzLmZvckVhY2goZCA9PiBkLnNldEF0dHJpYnV0ZSgnZW5hYmxlZCcsICcnKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWFjdGl2YXRlRHJvcHBhYmxlcygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcy5mb3JFYWNoKGQgPT4gZC5yZW1vdmVBdHRyaWJ1dGUoJ2VuYWJsZWQnKSk7XG4gICAgfVxuXG4gICAgLy8gTUg6IFRoaXMgbWV0aG9kIGlzIGp1c3QgdG8gbWFrZSBzdXJlIHRoaXMgY2FuIGJlIHRlc3RlZC5cbiAgICAvLyBiZWNhdXNlIEkgY2FuJ3QgZ2V0IHRoZSBkcm9wRWZmZWN0IHRvIGJlICdtb3ZlJyBpbiB0aGUgdGVzdFxuICAgIHByaXZhdGUgY2hlY2tGb3JNb3ZlVGVzdEl0ZW0gPSAoZXY6IERyYWdFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgaWYgKCFldi5kYXRhVHJhbnNmZXIuaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIGxldCBoYXNNb3ZlVGVzdEl0ZW0gPSBmYWxzZTtcblxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIGRhdGFUcmFuc2ZlciBpdGVtc1xuICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20oZXYuZGF0YVRyYW5zZmVyLml0ZW1zKTtcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IGl0ZW1zLmxlbmd0aDtcblxuICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gaXRlbXMsIHJlc29sdmUgaW1tZWRpYXRlbHlcbiAgICAgICAgaWYgKHBlbmRpbmcgPT09IDApIHtcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgIGlmIChpdGVtLmtpbmQgPT09ICdzdHJpbmcnICYmIGl0ZW0udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICBpdGVtLmdldEFzU3RyaW5nKGRhdGEgPT4ge1xuICAgICAgICAgICAgICBpZiAoZGF0YSA9PT0gJ21vdmUtdGVzdCcpIHtcbiAgICAgICAgICAgICAgICBoYXNNb3ZlVGVzdEl0ZW0gPSB0cnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgcHJvbWlzZSBhZnRlciBwcm9jZXNzaW5nIGFsbCBpdGVtc1xuICAgICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoaGFzTW92ZVRlc3RJdGVtKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBpdGVtIGlzIG5vdCAnc3RyaW5nJywgc3RpbGwgY291bnQgZG93biBwZW5kaW5nXG4gICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgICAgICByZXNvbHZlKGhhc01vdmVUZXN0SXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGFzeW5jIHdhc0Ryb3BwZWQoZXY6IERyYWdFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgY29uc3QgaGFzTW92ZVRlc3RJdGVtID0gYXdhaXQgdGhpcy5jaGVja0Zvck1vdmVUZXN0SXRlbShldik7XG4gICAgICByZXR1cm4gZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgIT09ICdub25lJyB8fCBoYXNNb3ZlVGVzdEl0ZW07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3YXNNb3ZlZChldjogRHJhZ0V2ZW50KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPT09ICdtb3ZlJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlc3RvcmVJbml0aWFsRHJhZ2dhYmxlUG9zaXRpb24oZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgeyBwYXJlbnQsIGluZGV4IH0gPSB0aGlzLmRyYWdnYWJsZXMuZ2V0KGRyYWdnYWJsZSk7XG4gICAgICBjb25zdCB0YXJnZXRJbmRleCA9IE1hdGgubWluKGluZGV4LCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoKTtcblxuICAgICAgY29uc3QgbW92ZURyYWdnYWJsZSA9IChkcmFnZ2FibGU6IEhUTUxFbGVtZW50LCBwYXJlbnQ6IEhUTUxFbGVtZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gTWF0aC5taW4oaW5kZXgsIHBhcmVudC5jaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGRyYWdnYWJsZSwgcGFyZW50LmNoaWxkcmVuW3RhcmdldEluZGV4XSk7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgdGhpcy5jaGVja01heEFzc29jaWF0aW9ucygpO1xuICAgICAgfTtcblxuICAgICAgLy8gRmFsbGJhY2sgaWYgdmlldyB0cmFuc2l0aW9ucyBhcmUgbm90IHN1cHBvcnRlZFxuICAgICAgaWYgKCFkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIG1vdmVEcmFnZ2FibGUoZHJhZ2dhYmxlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2UgdmlldyB0cmFuc2l0aW9ucyBpZiBzdXBwb3J0ZWRcbiAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKCgpID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICAgICAgICBtb3ZlRHJhZ2dhYmxlKGRyYWdnYWJsZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICB9KTtcbiAgICAgIC8vIHRyYW5zaXRpb24uZmluaXNoZWQudGhlbigoKSA9PiB7XG4gICAgICAvLyAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2l0aW9uID0gJyc7XG4gICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2hlY2tNYXhBc3NvY2lhdGlvbnMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyb3BwYWJsZXMuZm9yRWFjaCgoZCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgbWF4TWF0Y2ggPSArKGQuZ2V0QXR0cmlidXRlKCdtYXRjaC1tYXgnKSB8fCAxKTtcbiAgICAgICAgY29uc3QgY3VycmVudEFzc29jaWF0aW9ucyA9IGQucXVlcnlTZWxlY3RvckFsbCgnW3F0aS1kcmFnZ2FibGU9XCJ0cnVlXCJdJykubGVuZ3RoO1xuICAgICAgICBjb25zdCBkaXNhYmxlRHJvcHBhYmxlID0gY3VycmVudEFzc29jaWF0aW9ucyA+PSBtYXhNYXRjaDtcbiAgICAgICAgaWYgKGRpc2FibGVEcm9wcGFibGUpIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVEcm9wcGFibGUoZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lbmFibGVEcm9wcGFibGUoZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGlzYWJsZURyb3BwYWJsZShkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpO1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnZHJvcHpvbmUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVuYWJsZURyb3BwYWJsZShkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdkcm9wem9uZScsICdtb3ZlJyk7XG4gICAgfVxuXG4gICAgZ2V0IHZhbHVlKCk6IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbGxlY3RSZXNwb25zZURhdGEoKTtcbiAgICB9XG5cbiAgICBzZXQgdmFsdWUodmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgICBpZiAodGhpcy5pc01hdGNoVGFidWxhcigpKSByZXR1cm47XG5cbiAgICAgIHRoaXMucmVzZXREcm9wcGFibGVzKCk7XG4gICAgICB2YWx1ZT8uZm9yRWFjaChlbnRyeSA9PiB0aGlzLnBsYWNlUmVzcG9uc2UoZW50cnkpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBsYWNlUmVzcG9uc2UocmVzcG9uc2U6IHN0cmluZyk6IHZvaWQge1xuICAgICAgY29uc3QgW2Ryb3BJZCwgLi4uZHJhZ0lkc10gPSByZXNwb25zZS5zcGxpdCgnICcpLnJldmVyc2UoKTtcbiAgICAgIGNvbnN0IGRyb3BwYWJsZSA9IHRoaXMuZmluZERyb3BwYWJsZUJ5SWQoZHJvcElkKTtcbiAgICAgIGRyYWdJZHMuZm9yRWFjaChkcmFnSWQgPT4gdGhpcy5wbGFjZURyYWdnYWJsZUluRHJvcHBhYmxlKGRyYWdJZCwgZHJvcHBhYmxlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kRHJvcHBhYmxlQnlJZChpZGVudGlmaWVyOiBzdHJpbmcpOiBFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLmRyb3BwYWJsZXMuZmluZChkcm9wID0+IGRyb3AuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgPT09IGlkZW50aWZpZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcGxhY2VEcmFnZ2FibGVJbkRyb3BwYWJsZShkcmFnSWQ6IHN0cmluZywgZHJvcHBhYmxlOiBFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBkcmFnZ2FibGUgPSB0aGlzLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGBbaWRlbnRpZmllcj0ke2RyYWdJZH1dYCk7XG4gICAgICBpZiAoIWRyb3BwYWJsZSB8fCAhZHJhZ2dhYmxlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCBmaW5kIGRyYWdnYWJsZSBvciBkcm9wcGFibGUgd2l0aCB0aGUgZ2l2ZW4gaWRlbnRpZmllcjogJHtkcmFnSWR9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vdmVFbGVtZW50ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIGRyb3BwYWJsZS5hcHBlbmRDaGlsZChkcmFnZ2FibGUpO1xuICAgICAgICB0aGlzLmNoZWNrTWF4QXNzb2NpYXRpb25zKCk7XG4gICAgICB9O1xuXG4gICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgbW92ZUVsZW1lbnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKG1vdmVFbGVtZW50KTtcbiAgICAgICAgYXdhaXQgdHJhbnNpdGlvbi5maW5pc2hlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHZhbGlkQXNzb2NpYXRpb25zID0gdGhpcy5nZXRWYWxpZEFzc29jaWF0aW9ucygpO1xuICAgICAgcmV0dXJuIHRoaXMubWluQXNzb2NpYXRpb25zIDw9IDAgfHwgdGhpcy5taW5Bc3NvY2lhdGlvbnMgPD0gdmFsaWRBc3NvY2lhdGlvbnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRWYWxpZEFzc29jaWF0aW9ucygpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuZHJvcHBhYmxlcy5maWx0ZXIoZCA9PiBkLmNoaWxkRWxlbWVudENvdW50ID4gMCkubGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBzYXZlUmVzcG9uc2UoKTogdm9pZCB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuY29sbGVjdFJlc3BvbnNlRGF0YSgpO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbnRlcmFjdGlvbi1yZXNwb25zZScsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICAgIHJlc3BvbnNlXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbGxlY3RSZXNwb25zZURhdGEoKTogc3RyaW5nW10ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLmRyb3BwYWJsZXNcbiAgICAgICAgLm1hcChkcm9wcGFibGUgPT4ge1xuICAgICAgICAgIGNvbnN0IGRyYWdnYWJsZXNJbkRyb3BwYWJsZSA9IGRyb3BwYWJsZS5xdWVyeVNlbGVjdG9yQWxsKCdbcXRpLWRyYWdnYWJsZT1cInRydWVcIl0nKTtcbiAgICAgICAgICBjb25zdCBpZGVudGlmaWVycyA9IEFycmF5LmZyb20oZHJhZ2dhYmxlc0luRHJvcHBhYmxlKS5tYXAoZCA9PiBkLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpKTtcbiAgICAgICAgICBjb25zdCBkcm9wcGFibGVJZGVudGlmaWVyID0gZHJvcHBhYmxlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgICAgICAgIHJldHVybiBpZGVudGlmaWVycy5tYXAoaWQgPT4gYCR7aWR9ICR7ZHJvcHBhYmxlSWRlbnRpZmllcn1gKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmZsYXQoKTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG5cbiAgICByZXNldChzYXZlID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgdGhpcy5yZXNldERyb3BwYWJsZXMoKTtcbiAgICAgIGlmIChzYXZlKSB0aGlzLnNhdmVSZXNwb25zZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVzZXREcm9wcGFibGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgbW92ZURyYWdnYWJsZSA9IChkcmFnZ2FibGU6IEhUTUxFbGVtZW50LCBwYXJlbnQ6IEhUTUxFbGVtZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihpbmRleCwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZHJhZ2dhYmxlLCBwYXJlbnQuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdKTtcbiAgICAgIH07XG5cbiAgICAgIGlmICghZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICAvLyBGYWxsYmFjayBpZiB2aWV3IHRyYW5zaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkXG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlcy5mb3JFYWNoKCh7IHBhcmVudCwgaW5kZXggfSwgZHJhZ2dhYmxlKSA9PiB7XG4gICAgICAgICAgbW92ZURyYWdnYWJsZShkcmFnZ2FibGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2UgdmlldyB0cmFuc2l0aW9ucyBpZiBzdXBwb3J0ZWRcbiAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKCgpID0+IHtcbiAgICAgICAgdGhpcy5kcmFnZ2FibGVzLmZvckVhY2goKHsgcGFyZW50LCBpbmRleCB9LCBkcmFnZ2FibGUpID0+IHtcbiAgICAgICAgICBtb3ZlRHJhZ2dhYmxlKGRyYWdnYWJsZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHRyYW5zaXRpb24uZmluaXNoZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIERyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50IGFzIENvbnN0cnVjdG9yPElJbnRlcmFjdGlvbj4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIDpob3N0IHtcbiAgICBkaXNwbGF5OiBibG9jazsgLyogbmVjZXNzYXJ5IHRvIGNhbGN1bGF0ZSBzY2FsaW5nIHBvc2l0aW9uICovXG4gIH1cbiAgc2xvdFtuYW1lPSdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJ10ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICAgIGdhcDogMC41cmVtO1xuICB9XG5cbiAgOmhvc3Q6OnBhcnQoYXNzb2NpYWJsZXMtY29udGFpbmVyKSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgICAgMTgwZGVnLFxuICAgICAgcmdiKDAgMCAwIC8gMCUpIGNhbGMoNTAlIC0gMXB4KSxcbiAgICAgIHZhcigtLXF0aS1ib3JkZXItY29sb3ItZ3JheSkgY2FsYyg1MCUpLFxuICAgICAgcmdiKDAgMCAwIC8gMCUpIGNhbGMoNTAlICsgMXB4KVxuICAgICk7XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgQ1NTUmVzdWx0R3JvdXAsIExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuXG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlIH0gZnJvbSAnLi4vcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSc7XG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi5zdHlsZXMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpQXNzb2NpYXRlSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oXG4gIEludGVyYWN0aW9uLFxuICAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScsXG4gIHRydWUsXG4gICcuZGwnXG4pIHtcbiAgQHN0YXRlKCkgcHJpdmF0ZSBfY2hpbGRyZW5NYXA6IEVsZW1lbnRbXSA9IFtdO1xuXG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuICAvLyBkcmFnRHJvcEFwaTogVG91Y2hEcmFnQW5kRHJvcDtcblxuICBwcml2YXRlIF9yZWdpc3RlckNob2ljZUhhbmRsZXI6IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9yZWdpc3RlckNob2ljZUhhbmRsZXIgPSB0aGlzLl9yZWdpc3RlckNob2ljZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncmVnaXN0ZXItcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScsIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlSGFuZGxlcik7XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckNob2ljZShldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICBjb25zdCBjaG9pY2UgPSBldmVudC50YXJnZXQgYXMgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZTtcbiAgICB0aGlzLl9jaGlsZHJlbk1hcC5wdXNoKGNob2ljZSk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8c2xvdCBuYW1lPVwicXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZVwiPjwvc2xvdD5cbiAgICAgIDxkaXYgcGFydD1cImRyb3AtY29udGFpbmVyXCI+XG4gICAgICAgICR7dGhpcy5fY2hpbGRyZW5NYXAubGVuZ3RoID4gMCAmJlxuICAgICAgICBBcnJheS5mcm9tKEFycmF5KE1hdGguY2VpbCh0aGlzLl9jaGlsZHJlbk1hcC5sZW5ndGggLyAyKSkua2V5cygpKS5tYXAoXG4gICAgICAgICAgKF8sIGluZGV4KSA9PlxuICAgICAgICAgICAgaHRtbGA8ZGl2IHBhcnQ9XCJhc3NvY2lhYmxlcy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBuYW1lPVwibGVmdCR7aW5kZXh9XCIgcGFydD1cImRyb3AtbGlzdFwiIGNsYXNzPVwiZGxcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2luZGV4fV9sZWZ0XCI+PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgbmFtZT1cInJpZ2h0JHtpbmRleH1cIiBwYXJ0PVwiZHJvcC1saXN0XCIgY2xhc3M9XCJkbFwiIGlkZW50aWZpZXI9XCJkcm9wbGlzdCR7aW5kZXh9X3JpZ2h0XCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gXG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5gO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlZ2lzdGVyLXF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLCB0aGlzLl9yZWdpc3RlckNob2ljZUhhbmRsZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nOiBRdGlBc3NvY2lhdGVJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyByZW1vdmVEb3VibGVTbGFzaGVzIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdXRpbHMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWN1c3RvbS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpQ3VzdG9tSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIC8vIFRoaXMgY3VzdG9tLWludGVyYWN0aW9uIHN1cHBvcnQgdGhlIENFUyBBUEkgd2hpY2ggaXMgdXNlIGluIEZBQ0VUXG4gIC8vXG4gIC8vIEl0IHdvcmtzIGxpa2UgdGhpczpcbiAgLy8gMS4gVGhlIENJIG1hbmlmZXN0IGlzIGZldGNoZWRcbiAgLy8gMi4gQW4gaWZyYW1lIGlzIGNyZWF0ZWQgYW5kIHRoZSBmaXJzdCBzdHlsZSBhbmQgZmlyc3Qgc2NyaXB0IGZyb20gdGhlIG1hbmlmZXN0IGFyZSBsb2FkZWRcbiAgLy8gMy4gVGhlIGZpcnN0IHNjcmlwdCBpcyBib290c3RyYXAuanMgd2hpY2ggYWxzbyBjcmVhdGVzIGFuIGlmcmFtZSBhbmQgbG9hZHMgdGhlIGZpcnN0IG1lZGlhIGZyb20gdGhlIG1hbmlmZXN0XG4gIC8vIDQuIENvbW11bmljYXRpb24gaXMgZG9uZSB2aWEgdGhlIENFUyBBUEkgYnV0IGJlY2F1c2UgdGhlIGlmcmFtZSBpcyBub3QgYWxsb3dlZCB0byBhY2Nlc3MgdGhlIGdsb2JhbCBDRVMgb2JqZWN0IHdlIG5lZWQgdG8gdXNlIHdpbmRvdy5wb3N0TWVzc2FnZVxuXG4gIC8vIFRvIGFjaGlldmUgdGhpcyB3ZSBjaGFuZ2UgdGhlIHBhY2thZ2UgYnkgcmVwbGFjaW5nIHRoZSBib290c3RyYXAuanMgd2l0aCBvdXIgb3duIGFuZCBpbmplY3QgYSBwcm94eSBDRVMgQVBJIHRoYXQgY29tbXVuaWNhdGVzIHZpYSBwb3N0TWVzc2FnZVxuICAvLyBCZWNhdXNlIHdlIGFsc28gd2FudCB0byBydW4gdGhpcyBpbiBzdG9yeWJvb2ssIHdlIGNhbm5vdCB1c2Ugd2luZG93LnRvcCBiZWNhdXNlIHRvIHNlbmQgbWVzc2FnZXMgdGhlcmUsIGJlY2F1c2UgaW4gY2FzZSBvZiBzdG9yeWJvb2sgdGhhdCBpcyBub3QgdGhlIHRvcCB3aW5kb3cuXG4gIC8vIFNvIHdlIHNlbmQgbWVzc2FnZXMgdG8gYWxsIHBhcmVudCB3aW5kb3dzXG4gIHByaXZhdGUgcmF3UmVzcG9uc2U6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuaGFuZGxlUG9zdE1lc3NhZ2UgPSB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlLmJpbmQodGhpcyk7XG4gIH1cblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pXG4gIHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YScgfSlcbiAgZGF0YTogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YS1iYXNlLWl0ZW0nIH0pXG4gIGJhc2VJdGVtVXJsOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhLWJhc2UtcmVmJyB9KVxuICBiYXNlUmVmVXJsOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdpZCcgfSlcbiAgaWQ6IHN0cmluZztcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9lcnJvck1lc3NhZ2U6IHN0cmluZyA9IG51bGw7XG4gIG1hbmlmZXN0OiB7XG4gICAgc2NyaXB0OiBzdHJpbmdbXTtcbiAgICBzdHlsZTogc3RyaW5nW107XG4gICAgbWVkaWE6IHN0cmluZ1tdO1xuICB9O1xuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBjb25zdCB1cmlUb01hbmlmZXN0ID0gdGhpcy5kYXRhLnN0YXJ0c1dpdGgoJ2h0dHAnKVxuICAgICAgPyB0aGlzLmRhdGFcbiAgICAgIDogcmVtb3ZlRG91YmxlU2xhc2hlcyh0aGlzLmJhc2VJdGVtVXJsICsgJy8nICsgdGhpcy5kYXRhKTtcbiAgICAvLyBmZXRjaCB0aGUganNvbiBmaWxlIGxvY2F0ZWQgYXQgdGhlIGRhdGEgYXR0cmlidXRlXG4gICAgZmV0Y2godXJpVG9NYW5pZmVzdClcbiAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSlcbiAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLm1hbmlmZXN0ID0gZGF0YTtcbiAgICAgICAgdGhpcy5zZXR1cENFUygpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSBlcnI7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIE1IOiBDaGFuZ2VkIHRoZSBkZWZhdWx0IGJvb3RzdHJhcC5qcyB0byB1c2UgdGhlIG5ldyBDRVMgQVBJXG4gIC8vIEJlY2F1c2UgdGhlIG9sZCBvbmUgdXNlcyB0aGUgZ2xvYmFsIENFUyBvYmplY3QgdGhhdCBpcyBub3QgYWxsb3dlZCB0byBiZSBhY2Nlc3NlZCB3aGVuIHRoZSBDSVxuICAvLyBpcyBlbWJlZGRlZCBpbiBhbiBpZnJhbWUgYW5kIGNvbWluZyBmcm9tIGFub3RoZXIgZG9tYWluXG4gIC8vIFRoZXJlZm9yIHdlIG5lZWQgdG8gdXNlIHRoZSBuZXcgQ0VTIEFQSSB0byBjb21tdW5pY2F0ZXMgdmlhIHRoZSBicm9hZGNhc3QgQVBJXG4gIHNldHVwQ0VTKCkge1xuICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcjcGNpQ29udGFpbmVyJykgYXMgSFRNTElGcmFtZUVsZW1lbnQsXG4gICAgICBpZnJhbWVXaW4gPSBpZnJhbWUuY29udGVudFdpbmRvdyB8fCBpZnJhbWUsXG4gICAgICBpZnJhbWVEb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50O1xuXG4gICAgLy8gY29uc3QgY2hhbm5lbCA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKCdjZXNfY2hhbm5lbCcpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5oYW5kbGVQb3N0TWVzc2FnZSk7XG4gICAgaWZyYW1lRG9jLm9wZW4oKTtcbiAgICBpZnJhbWVEb2Mud3JpdGUoYFxuICAgICAgPGh0bWw+XG4gICAgICAgIDxoZWFkPlxuICAgICAgICAgIDxsaW5rIGhyZWY9JyR7cmVtb3ZlRG91YmxlU2xhc2hlcyhgJHt0aGlzLmJhc2VSZWZVcmx9LyR7dGhpcy5tYW5pZmVzdC5zdHlsZVswXX1gKX0nIHJlbD1cInN0eWxlc2hlZXRcIiAvPlxuICAgICAgICAgIDxzY3JpcHQgc3JjPScke3JlbW92ZURvdWJsZVNsYXNoZXMoYCR7dGhpcy5iYXNlUmVmVXJsfS8ke3RoaXMubWFuaWZlc3Quc2NyaXB0WzBdfWApfSc+PC9zY3JpcHQ+XG4gICAgICAgIDwvaGVhZD5cbiAgICAgICAgPGJvZHk+PC9ib2R5PlxuICAgICAgPC9odG1sPlxuICAgICAgYCk7XG5cbiAgICBpZnJhbWVEb2MuY2xvc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SUZyYW1lcygpIHtcbiAgICBjb25zdCBpZnJhbWVzSW5TaGFkb3dSb290ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpO1xuICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJyk7XG5cbiAgICBjb25zdCBvdXRlcklGcmFtZXMgPSBbLi4uaWZyYW1lc0luU2hhZG93Um9vdCwgLi4uaWZyYW1lXTtcbiAgICBmb3IgKGNvbnN0IGlmcmFtZSBvZiBvdXRlcklGcmFtZXMpIHtcbiAgICAgIGNvbnN0IGlmcmFtZVNyYyA9IGlmcmFtZS5zcmM7XG4gICAgICBjb25zdCBpc1NhbWVPcmlnaW4gPSBuZXcgVVJMKGlmcmFtZVNyYywgd2luZG93LmxvY2F0aW9uLmhyZWYpLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcbiAgICAgIGlmIChpc1NhbWVPcmlnaW4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBvdXRlckRvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQgfHwgaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgaWYgKG91dGVyRG9jKSB7XG4gICAgICAgICAgICB0aGlzLmdldElubmVySUZyYW1lcyhvdXRlckRvYywgb3V0ZXJJRnJhbWVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhY2Nlc3NpbmcgbmVzdGVkIGlmcmFtZTonLCBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBnZXQgb25seSB1bmlxdWUgaWZyYW1lc1xuICAgIG91dGVySUZyYW1lcy5mb3JFYWNoKChpZnJhbWUsIGluZGV4KSA9PiB7XG4gICAgICBpZiAob3V0ZXJJRnJhbWVzLmluZGV4T2YoaWZyYW1lKSAhPT0gaW5kZXgpIHtcbiAgICAgICAgb3V0ZXJJRnJhbWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dGVySUZyYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5uZXJJRnJhbWVzKGlmcmFtZURvY3VtZW50OiBEb2N1bWVudCwgaWZyYW1lcyA9IFtdKSB7XG4gICAgLy8gR2V0IGFsbCBpZnJhbWVzIGluIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gICAgY29uc3QgY3VycmVudElmcmFtZXMgPSBpZnJhbWVEb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTtcblxuICAgIGN1cnJlbnRJZnJhbWVzLmZvckVhY2goaWZyYW1lID0+IHtcbiAgICAgIC8vIEFkZCB0aGUgY3VycmVudCBpZnJhbWUgdG8gdGhlIGxpc3RcbiAgICAgIGlmcmFtZXMucHVzaChpZnJhbWUpO1xuXG4gICAgICAvLyBSZWN1cnNpdmVseSBnZXQgaWZyYW1lcyB3aXRoaW4gdGhlIGN1cnJlbnQgaWZyYW1lXG4gICAgICAvLyBDaGVjayBpZiB0aGUgaWZyYW1lIHNyYyBpcyBmcm9tIHRoZSBzYW1lIG9yaWdpblxuICAgICAgY29uc3QgaWZyYW1lU3JjID0gaWZyYW1lLnNyYztcbiAgICAgIGNvbnN0IGlzU2FtZU9yaWdpbiA9IG5ldyBVUkwoaWZyYW1lU3JjLCB3aW5kb3cubG9jYXRpb24uaHJlZikub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuXG4gICAgICBpZiAoaXNTYW1lT3JpZ2luKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbmVzdGVkRG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICB0aGlzLmdldElubmVySUZyYW1lcyhuZXN0ZWREb2MsIGlmcmFtZXMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWNjZXNzaW5nIG5lc3RlZCBpZnJhbWU6JywgZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU2tpcHBlZCBjcm9zcy1vcmlnaW4gaWZyYW1lOicsIGlmcmFtZVNyYyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaWZyYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgcG9zdFRvV2luZG93QW5kSWZyYW1lcyh0eXBlOiBzdHJpbmcsIGRhdGE6IGFueSkge1xuICAgIHdpbmRvdy5wb3N0TWVzc2FnZSh7IHR5cGUsIGRhdGEgfSwgJyonKTtcbiAgICBjb25zdCBpZnJhbWVzID0gdGhpcy5nZXRJRnJhbWVzKCk7XG4gICAgZm9yIChjb25zdCBpZnJhbWUgb2YgaWZyYW1lcykge1xuICAgICAgaWYgKGlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgIGlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHsgdHlwZSwgZGF0YSB9LCAnKicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVBvc3RNZXNzYWdlKGV2ZW50OiBNZXNzYWdlRXZlbnQpIHtcbiAgICBjb25zdCB7IHR5cGUsIGRhdGEgfSA9IGV2ZW50LmRhdGE7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzZXRSZXNwb25zZSc6XG4gICAgICAgIHRoaXMucmF3UmVzcG9uc2UgPSBkYXRhO1xuICAgICAgICB0aGlzLnNhdmVSZXNwb25zZShkYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdnZXRSZXNwb25zZSc6IHtcbiAgICAgICAgdGhpcy5wb3N0VG9XaW5kb3dBbmRJZnJhbWVzKCdyZXNwb25zZURhdGEnLCB0aGlzLnJhd1Jlc3BvbnNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdnZXRNZWRpYSc6IHtcbiAgICAgICAgY29uc3QgbWVkaWFEYXRhID0gdGhpcy5tYW5pZmVzdC5tZWRpYS5tYXAobWVkaWEgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9IG1lZGlhLnN0YXJ0c1dpdGgoJ2h0dHAnKSA/IG1lZGlhIDogcmVtb3ZlRG91YmxlU2xhc2hlcyh0aGlzLmJhc2VSZWZVcmwgKyAnLycgKyBtZWRpYSk7XG4gICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucG9zdFRvV2luZG93QW5kSWZyYW1lcygnbWVkaWFEYXRhJywgbWVkaWFEYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzZXRTdGFnZUhlaWdodCc6XG4gICAgICAgIGNvbnNvbGUubG9nKCdzZXRTdGFnZUhlaWdodCBub3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmF3UmVzcG9uc2UgIT09ICcnO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5yYXdSZXNwb25zZTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnJhd1Jlc3BvbnNlID0gdmFsO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlKTtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxpZnJhbWVcbiAgICAgICAgd2lkdGg9JHt0aGlzLmdldEF0dHJpYnV0ZSgnd2lkdGgnKX1cbiAgICAgICAgaGVpZ2h0PSR7dGhpcy5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpfVxuICAgICAgICBmcmFtZWJvcmRlcj1cIjBcIlxuICAgICAgICB0aXRsZT1cInBjaUNvbnRhaW5lclwiXG4gICAgICAgIGlkPVwicGNpQ29udGFpbmVyXCJcbiAgICAgID5cbiAgICAgIDwvaWZyYW1lPlxuICAgICAgJHt0aGlzLl9lcnJvck1lc3NhZ2UgJiZcbiAgICAgIGh0bWxgPGRpdiBzdHlsZT1cImNvbG9yOnJlZFwiPlxuICAgICAgICA8aDE+RXJyb3I8L2gxPlxuICAgICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZX1cbiAgICAgIDwvZGl2PmB9YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY3VzdG9tLWludGVyYWN0aW9uJzogUXRpQ3VzdG9tSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5AY3VzdG9tRWxlbWVudCgncXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlFbmRBdHRlbXB0SW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY291bnQtYXR0ZW1wdCcgfSlcbiAgcHVibGljIGNvdW50QXR0ZW1wdDogc3RyaW5nID0gJ3RydWUnO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgdGl0bGU6ICdlbmQgYXR0ZW1wdCc7XG5cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgLy8gbm90IGltcGxlbWVudGVkIGJ5IGRlc2lnblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAvLyBub3QgaW1wbGVtZW50ZWQgYnkgZGVzaWduXG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGJ1dHRvbiA/ZGlzYWJsZWQ9JHt0aGlzLmRpc2FibGVkfSBwYXJ0PVwiYnV0dG9uXCIgQGNsaWNrPSR7dGhpcy5lbmRBdHRlbXB0fT4ke3RoaXMudGl0bGV9PC9idXR0b24+YDtcbiAgfVxuICBwdWJsaWMgZW5kQXR0ZW1wdChlOiBFdmVudCkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgnZW5kLWF0dGVtcHQnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllciwgY291bnRBdHRlbXB0OiB0aGlzLmNvdW50QXR0ZW1wdCA9PT0gJ3RydWUnIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24nOiBRdGlFbmRBdHRlbXB0SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4nO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHYXBNYXRjaEludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKEludGVyYWN0aW9uLCAncXRpLWdhcC10ZXh0JywgZmFsc2UsICdxdGktZ2FwJykge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMC41cmVtO1xuICAgICAgfVxuXG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtdG9wKSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1sZWZ0KSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtcmlnaHQpIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICAgICAgfVxuICAgICAgLyogW3BhcnQ9J2Ryb3BzJ10gLCAqL1xuICAgICAgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgZ2FwOiAwLjVyZW07XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+IDwvc2xvdD48c2xvdCBwYXJ0PVwiZHJhZ3NcIiBuYW1lPVwicXRpLWdhcC10ZXh0XCI+PC9zbG90PiA8c2xvdCBwYXJ0PVwiZHJvcHNcIj48L3Nsb3Q+YDtcbiAgfVxuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgbGV0IG1hdGNoZXM6IHsgdGV4dDogc3RyaW5nOyBnYXA6IHN0cmluZyB9W10gPSBbXTtcbiAgICBjb25zdCByZXNwb25zZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuXG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICBtYXRjaGVzID0gcmVzcG9uc2UubWFwKHggPT4ge1xuICAgICAgICBjb25zdCBzcGxpdCA9IHguc3BsaXQoJyAnKTtcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogc3BsaXRbMF0sIGdhcDogc3BsaXRbMV0gfTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGdhcHMgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1nYXAnKTtcbiAgICBnYXBzLmZvckVhY2goKGdhcCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBnYXAuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICBjb25zdCB0ZXh0SWRlbnRpZmllciA9IG1hdGNoZXMuZmluZCh4ID0+IHguZ2FwID09PSBpZGVudGlmaWVyKT8udGV4dDtcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoYHF0aS1nYXAtdGV4dFtpZGVudGlmaWVyPVwiJHt0ZXh0SWRlbnRpZmllcn1cIl1gKT8udGV4dENvbnRlbnQudHJpbSgpO1xuICAgICAgaWYgKHRleHRJZGVudGlmaWVyICYmIHRleHQpIHtcbiAgICAgICAgaWYgKCFnYXAubmV4dEVsZW1lbnRTaWJsaW5nPy5jbGFzc0xpc3QuY29udGFpbnMoJ2NvcnJlY3Qtb3B0aW9uJykpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0U3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICB0ZXh0U3Bhbi5jbGFzc0xpc3QuYWRkKCdjb3JyZWN0LW9wdGlvbicpO1xuICAgICAgICAgIHRleHRTcGFuLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICAgICAgICBnYXAuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIHRleHRTcGFuKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChnYXAubmV4dEVsZW1lbnRTaWJsaW5nPy5jbGFzc0xpc3QuY29udGFpbnMoJ2NvcnJlY3Qtb3B0aW9uJykpIHtcbiAgICAgICAgZ2FwLm5leHRFbGVtZW50U2libGluZy5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uJzogUXRpR2FwTWF0Y2hJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG5pbXBvcnQge0NoaWxkUGFydCwgbm9DaGFuZ2V9IGZyb20gJy4uL2xpdC1odG1sLmpzJztcbmltcG9ydCB7ZGlyZWN0aXZlLCBEaXJlY3RpdmUsIFBhcnRJbmZvLCBQYXJ0VHlwZX0gZnJvbSAnLi4vZGlyZWN0aXZlLmpzJztcbmltcG9ydCB7XG4gIGluc2VydFBhcnQsXG4gIGdldENvbW1pdHRlZFZhbHVlLFxuICByZW1vdmVQYXJ0LFxuICBzZXRDb21taXR0ZWRWYWx1ZSxcbiAgc2V0Q2hpbGRQYXJ0VmFsdWUsXG59IGZyb20gJy4uL2RpcmVjdGl2ZS1oZWxwZXJzLmpzJztcblxuZXhwb3J0IHR5cGUgS2V5Rm48VD4gPSAoaXRlbTogVCwgaW5kZXg6IG51bWJlcikgPT4gdW5rbm93bjtcbmV4cG9ydCB0eXBlIEl0ZW1UZW1wbGF0ZTxUPiA9IChpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiB1bmtub3duO1xuXG4vLyBIZWxwZXIgZm9yIGdlbmVyYXRpbmcgYSBtYXAgb2YgYXJyYXkgaXRlbSB0byBpdHMgaW5kZXggb3ZlciBhIHN1YnNldFxuLy8gb2YgYW4gYXJyYXkgKHVzZWQgdG8gbGF6aWx5IGdlbmVyYXRlIGBuZXdLZXlUb0luZGV4TWFwYCBhbmRcbi8vIGBvbGRLZXlUb0luZGV4TWFwYClcbmNvbnN0IGdlbmVyYXRlTWFwID0gKGxpc3Q6IHVua25vd25bXSwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpID0+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDx1bmtub3duLCBudW1iZXI+KCk7XG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgIG1hcC5zZXQobGlzdFtpXSwgaSk7XG4gIH1cbiAgcmV0dXJuIG1hcDtcbn07XG5cbmNsYXNzIFJlcGVhdERpcmVjdGl2ZSBleHRlbmRzIERpcmVjdGl2ZSB7XG4gIHByaXZhdGUgX2l0ZW1LZXlzPzogdW5rbm93bltdO1xuXG4gIGNvbnN0cnVjdG9yKHBhcnRJbmZvOiBQYXJ0SW5mbykge1xuICAgIHN1cGVyKHBhcnRJbmZvKTtcbiAgICBpZiAocGFydEluZm8udHlwZSAhPT0gUGFydFR5cGUuQ0hJTEQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVwZWF0KCkgY2FuIG9ubHkgYmUgdXNlZCBpbiB0ZXh0IGV4cHJlc3Npb25zJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VmFsdWVzQW5kS2V5czxUPihcbiAgICBpdGVtczogSXRlcmFibGU8VD4sXG4gICAga2V5Rm5PclRlbXBsYXRlOiBLZXlGbjxUPiB8IEl0ZW1UZW1wbGF0ZTxUPixcbiAgICB0ZW1wbGF0ZT86IEl0ZW1UZW1wbGF0ZTxUPlxuICApIHtcbiAgICBsZXQga2V5Rm46IEtleUZuPFQ+IHwgdW5kZWZpbmVkO1xuICAgIGlmICh0ZW1wbGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZW1wbGF0ZSA9IGtleUZuT3JUZW1wbGF0ZTtcbiAgICB9IGVsc2UgaWYgKGtleUZuT3JUZW1wbGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBrZXlGbiA9IGtleUZuT3JUZW1wbGF0ZSBhcyBLZXlGbjxUPjtcbiAgICB9XG4gICAgY29uc3Qga2V5cyA9IFtdO1xuICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICBrZXlzW2luZGV4XSA9IGtleUZuID8ga2V5Rm4oaXRlbSwgaW5kZXgpIDogaW5kZXg7XG4gICAgICB2YWx1ZXNbaW5kZXhdID0gdGVtcGxhdGUhKGl0ZW0sIGluZGV4KTtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZXMsXG4gICAgICBrZXlzLFxuICAgIH07XG4gIH1cblxuICByZW5kZXI8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+LCB0ZW1wbGF0ZTogSXRlbVRlbXBsYXRlPFQ+KTogQXJyYXk8dW5rbm93bj47XG4gIHJlbmRlcjxUPihcbiAgICBpdGVtczogSXRlcmFibGU8VD4sXG4gICAga2V5Rm46IEtleUZuPFQ+IHwgSXRlbVRlbXBsYXRlPFQ+LFxuICAgIHRlbXBsYXRlOiBJdGVtVGVtcGxhdGU8VD5cbiAgKTogQXJyYXk8dW5rbm93bj47XG4gIHJlbmRlcjxUPihcbiAgICBpdGVtczogSXRlcmFibGU8VD4sXG4gICAga2V5Rm5PclRlbXBsYXRlOiBLZXlGbjxUPiB8IEl0ZW1UZW1wbGF0ZTxUPixcbiAgICB0ZW1wbGF0ZT86IEl0ZW1UZW1wbGF0ZTxUPlxuICApIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0VmFsdWVzQW5kS2V5cyhpdGVtcywga2V5Rm5PclRlbXBsYXRlLCB0ZW1wbGF0ZSkudmFsdWVzO1xuICB9XG5cbiAgb3ZlcnJpZGUgdXBkYXRlPFQ+KFxuICAgIGNvbnRhaW5lclBhcnQ6IENoaWxkUGFydCxcbiAgICBbaXRlbXMsIGtleUZuT3JUZW1wbGF0ZSwgdGVtcGxhdGVdOiBbXG4gICAgICBJdGVyYWJsZTxUPixcbiAgICAgIEtleUZuPFQ+IHwgSXRlbVRlbXBsYXRlPFQ+LFxuICAgICAgSXRlbVRlbXBsYXRlPFQ+LFxuICAgIF1cbiAgKSB7XG4gICAgLy8gT2xkIHBhcnQgJiBrZXkgbGlzdHMgYXJlIHJldHJpZXZlZCBmcm9tIHRoZSBsYXN0IHVwZGF0ZSAod2hpY2ggbWF5XG4gICAgLy8gYmUgcHJpbWVkIGJ5IGh5ZHJhdGlvbilcbiAgICBjb25zdCBvbGRQYXJ0cyA9IGdldENvbW1pdHRlZFZhbHVlKFxuICAgICAgY29udGFpbmVyUGFydFxuICAgICkgYXMgQXJyYXk8Q2hpbGRQYXJ0IHwgbnVsbD47XG4gICAgY29uc3Qge3ZhbHVlczogbmV3VmFsdWVzLCBrZXlzOiBuZXdLZXlzfSA9IHRoaXMuX2dldFZhbHVlc0FuZEtleXMoXG4gICAgICBpdGVtcyxcbiAgICAgIGtleUZuT3JUZW1wbGF0ZSxcbiAgICAgIHRlbXBsYXRlXG4gICAgKTtcblxuICAgIC8vIFdlIGNoZWNrIHRoYXQgb2xkUGFydHMsIHRoZSBjb21taXR0ZWQgdmFsdWUsIGlzIGFuIEFycmF5IGFzIGFuXG4gICAgLy8gaW5kaWNhdG9yIHRoYXQgdGhlIHByZXZpb3VzIHZhbHVlIGNhbWUgZnJvbSBhIHJlcGVhdCgpIGNhbGwuIElmXG4gICAgLy8gb2xkUGFydHMgaXMgbm90IGFuIEFycmF5IHRoZW4gdGhpcyBpcyB0aGUgZmlyc3QgcmVuZGVyIGFuZCB3ZSByZXR1cm5cbiAgICAvLyBhbiBhcnJheSBmb3IgbGl0LWh0bWwncyBhcnJheSBoYW5kbGluZyB0byByZW5kZXIsIGFuZCByZW1lbWJlciB0aGVcbiAgICAvLyBrZXlzLlxuICAgIGlmICghQXJyYXkuaXNBcnJheShvbGRQYXJ0cykpIHtcbiAgICAgIHRoaXMuX2l0ZW1LZXlzID0gbmV3S2V5cztcbiAgICAgIHJldHVybiBuZXdWYWx1ZXM7XG4gICAgfVxuXG4gICAgLy8gSW4gU1NSIGh5ZHJhdGlvbiBpdCdzIHBvc3NpYmxlIGZvciBvbGRQYXJ0cyB0byBiZSBhbiBhcnJheSBidXQgZm9yIHVzXG4gICAgLy8gdG8gbm90IGhhdmUgaXRlbSBrZXlzIGJlY2F1c2UgdGhlIHVwZGF0ZSgpIGhhc24ndCBydW4geWV0LiBXZSBzZXQgdGhlXG4gICAgLy8ga2V5cyB0byBhbiBlbXB0eSBhcnJheS4gVGhpcyB3aWxsIGNhdXNlIGFsbCBvbGRLZXkvbmV3S2V5IGNvbXBhcmlzb25zXG4gICAgLy8gdG8gZmFpbCBhbmQgZXhlY3V0aW9uIHRvIGZhbGwgdG8gdGhlIGxhc3QgbmVzdGVkIGJyYWNoIGJlbG93IHdoaWNoXG4gICAgLy8gcmV1c2VzIHRoZSBvbGRQYXJ0LlxuICAgIGNvbnN0IG9sZEtleXMgPSAodGhpcy5faXRlbUtleXMgPz89IFtdKTtcblxuICAgIC8vIE5ldyBwYXJ0IGxpc3Qgd2lsbCBiZSBidWlsdCB1cCBhcyB3ZSBnbyAoZWl0aGVyIHJldXNlZCBmcm9tXG4gICAgLy8gb2xkIHBhcnRzIG9yIGNyZWF0ZWQgZm9yIG5ldyBrZXlzIGluIHRoaXMgdXBkYXRlKS4gVGhpcyBpc1xuICAgIC8vIHNhdmVkIGluIHRoZSBhYm92ZSBjYWNoZSBhdCB0aGUgZW5kIG9mIHRoZSB1cGRhdGUuXG4gICAgY29uc3QgbmV3UGFydHM6IENoaWxkUGFydFtdID0gW107XG5cbiAgICAvLyBNYXBzIGZyb20ga2V5IHRvIGluZGV4IGZvciBjdXJyZW50IGFuZCBwcmV2aW91cyB1cGRhdGU7IHRoZXNlXG4gICAgLy8gYXJlIGdlbmVyYXRlZCBsYXppbHkgb25seSB3aGVuIG5lZWRlZCBhcyBhIHBlcmZvcm1hbmNlXG4gICAgLy8gb3B0aW1pemF0aW9uLCBzaW5jZSB0aGV5IGFyZSBvbmx5IHJlcXVpcmVkIGZvciBtdWx0aXBsZVxuICAgIC8vIG5vbi1jb250aWd1b3VzIGNoYW5nZXMgaW4gdGhlIGxpc3QsIHdoaWNoIGFyZSBsZXNzIGNvbW1vbi5cbiAgICBsZXQgbmV3S2V5VG9JbmRleE1hcCE6IE1hcDx1bmtub3duLCBudW1iZXI+O1xuICAgIGxldCBvbGRLZXlUb0luZGV4TWFwITogTWFwPHVua25vd24sIG51bWJlcj47XG5cbiAgICAvLyBIZWFkIGFuZCB0YWlsIHBvaW50ZXJzIHRvIG9sZCBwYXJ0cyBhbmQgbmV3IHZhbHVlc1xuICAgIGxldCBvbGRIZWFkID0gMDtcbiAgICBsZXQgb2xkVGFpbCA9IG9sZFBhcnRzLmxlbmd0aCAtIDE7XG4gICAgbGV0IG5ld0hlYWQgPSAwO1xuICAgIGxldCBuZXdUYWlsID0gbmV3VmFsdWVzLmxlbmd0aCAtIDE7XG5cbiAgICAvLyBPdmVydmlldyBvZiBPKG4pIHJlY29uY2lsaWF0aW9uIGFsZ29yaXRobSAoZ2VuZXJhbCBhcHByb2FjaFxuICAgIC8vIGJhc2VkIG9uIGlkZWFzIGZvdW5kIGluIGl2aSwgdnVlLCBzbmFiYmRvbSwgZXRjLik6XG4gICAgLy9cbiAgICAvLyAqIFdlIHN0YXJ0IHdpdGggdGhlIGxpc3Qgb2Ygb2xkIHBhcnRzIGFuZCBuZXcgdmFsdWVzIChhbmRcbiAgICAvLyAgIGFycmF5cyBvZiB0aGVpciByZXNwZWN0aXZlIGtleXMpLCBoZWFkL3RhaWwgcG9pbnRlcnMgaW50b1xuICAgIC8vICAgZWFjaCwgYW5kIHdlIGJ1aWxkIHVwIHRoZSBuZXcgbGlzdCBvZiBwYXJ0cyBieSB1cGRhdGluZ1xuICAgIC8vICAgKGFuZCB3aGVuIG5lZWRlZCwgbW92aW5nKSBvbGQgcGFydHMgb3IgY3JlYXRpbmcgbmV3IG9uZXMuXG4gICAgLy8gICBUaGUgaW5pdGlhbCBzY2VuYXJpbyBtaWdodCBsb29rIGxpa2UgdGhpcyAoZm9yIGJyZXZpdHkgb2ZcbiAgICAvLyAgIHRoZSBkaWFncmFtcywgdGhlIG51bWJlcnMgaW4gdGhlIGFycmF5IHJlZmxlY3Qga2V5c1xuICAgIC8vICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBvbGQgcGFydHMgb3IgbmV3IHZhbHVlcywgYWx0aG91Z2gga2V5c1xuICAgIC8vICAgYW5kIHBhcnRzL3ZhbHVlcyBhcmUgYWN0dWFsbHkgc3RvcmVkIGluIHBhcmFsbGVsIGFycmF5c1xuICAgIC8vICAgaW5kZXhlZCB1c2luZyB0aGUgc2FtZSBoZWFkL3RhaWwgcG9pbnRlcnMpOlxuICAgIC8vXG4gICAgLy8gICAgICBvbGRIZWFkIHYgICAgICAgICAgICAgICAgIHYgb2xkVGFpbFxuICAgIC8vICAgb2xkS2V5czogIFswLCAxLCAyLCAzLCA0LCA1LCA2XVxuICAgIC8vICAgbmV3UGFydHM6IFsgLCAgLCAgLCAgLCAgLCAgLCAgXVxuICAgIC8vICAgbmV3S2V5czogIFswLCAyLCAxLCA0LCAzLCA3LCA2XSA8LSByZWZsZWN0cyB0aGUgdXNlcidzIG5ld1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtIG9yZGVyXG4gICAgLy8gICAgICBuZXdIZWFkIF4gICAgICAgICAgICAgICAgIF4gbmV3VGFpbFxuICAgIC8vXG4gICAgLy8gKiBJdGVyYXRlIG9sZCAmIG5ldyBsaXN0cyBmcm9tIGJvdGggc2lkZXMsIHVwZGF0aW5nLFxuICAgIC8vICAgc3dhcHBpbmcsIG9yIHJlbW92aW5nIHBhcnRzIGF0IHRoZSBoZWFkL3RhaWwgbG9jYXRpb25zXG4gICAgLy8gICB1bnRpbCBuZWl0aGVyIGhlYWQgbm9yIHRhaWwgY2FuIG1vdmUuXG4gICAgLy9cbiAgICAvLyAqIEV4YW1wbGUgYmVsb3c6IGtleXMgYXQgaGVhZCBwb2ludGVycyBtYXRjaCwgc28gdXBkYXRlIG9sZFxuICAgIC8vICAgcGFydCAwIGluLXBsYWNlIChubyBuZWVkIHRvIG1vdmUgaXQpIGFuZCByZWNvcmQgcGFydCAwIGluXG4gICAgLy8gICB0aGUgYG5ld1BhcnRzYCBsaXN0LiBUaGUgbGFzdCB0aGluZyB3ZSBkbyBpcyBhZHZhbmNlIHRoZVxuICAgIC8vICAgYG9sZEhlYWRgIGFuZCBgbmV3SGVhZGAgcG9pbnRlcnMgKHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZVxuICAgIC8vICAgbmV4dCBkaWFncmFtKS5cbiAgICAvL1xuICAgIC8vICAgICAgb2xkSGVhZCB2ICAgICAgICAgICAgICAgICB2IG9sZFRhaWxcbiAgICAvLyAgIG9sZEtleXM6ICBbMCwgMSwgMiwgMywgNCwgNSwgNl1cbiAgICAvLyAgIG5ld1BhcnRzOiBbMCwgICwgICwgICwgICwgICwgIF0gPC0gaGVhZHMgbWF0Y2hlZDogdXBkYXRlIDBcbiAgICAvLyAgIG5ld0tleXM6ICBbMCwgMiwgMSwgNCwgMywgNywgNl0gICAgYW5kIGFkdmFuY2UgYm90aCBvbGRIZWFkXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgbmV3SGVhZFxuICAgIC8vICAgICAgbmV3SGVhZCBeICAgICAgICAgICAgICAgICBeIG5ld1RhaWxcbiAgICAvL1xuICAgIC8vICogRXhhbXBsZSBiZWxvdzogaGVhZCBwb2ludGVycyBkb24ndCBtYXRjaCwgYnV0IHRhaWxcbiAgICAvLyAgIHBvaW50ZXJzIGRvLCBzbyB1cGRhdGUgcGFydCA2IGluIHBsYWNlIChubyBuZWVkIHRvIG1vdmVcbiAgICAvLyAgIGl0KSwgYW5kIHJlY29yZCBwYXJ0IDYgaW4gdGhlIGBuZXdQYXJ0c2AgbGlzdC4gTGFzdCxcbiAgICAvLyAgIGFkdmFuY2UgdGhlIGBvbGRUYWlsYCBhbmQgYG9sZEhlYWRgIHBvaW50ZXJzLlxuICAgIC8vXG4gICAgLy8gICAgICAgICBvbGRIZWFkIHYgICAgICAgICAgICAgIHYgb2xkVGFpbFxuICAgIC8vICAgb2xkS2V5czogIFswLCAxLCAyLCAzLCA0LCA1LCA2XVxuICAgIC8vICAgbmV3UGFydHM6IFswLCAgLCAgLCAgLCAgLCAgLCA2XSA8LSB0YWlscyBtYXRjaGVkOiB1cGRhdGUgNlxuICAgIC8vICAgbmV3S2V5czogIFswLCAyLCAxLCA0LCAzLCA3LCA2XSAgICBhbmQgYWR2YW5jZSBib3RoIG9sZFRhaWxcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBuZXdUYWlsXG4gICAgLy8gICAgICAgICBuZXdIZWFkIF4gICAgICAgICAgICAgIF4gbmV3VGFpbFxuICAgIC8vXG4gICAgLy8gKiBJZiBuZWl0aGVyIGhlYWQgbm9yIHRhaWwgbWF0Y2g7IG5leHQgY2hlY2sgaWYgb25lIG9mIHRoZVxuICAgIC8vICAgb2xkIGhlYWQvdGFpbCBpdGVtcyB3YXMgcmVtb3ZlZC4gV2UgZmlyc3QgbmVlZCB0byBnZW5lcmF0ZVxuICAgIC8vICAgdGhlIHJldmVyc2UgbWFwIG9mIG5ldyBrZXlzIHRvIGluZGV4IChgbmV3S2V5VG9JbmRleE1hcGApLFxuICAgIC8vICAgd2hpY2ggaXMgZG9uZSBvbmNlIGxhemlseSBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbixcbiAgICAvLyAgIHNpbmNlIHdlIG9ubHkgaGl0IHRoaXMgY2FzZSBpZiBtdWx0aXBsZSBub24tY29udGlndW91c1xuICAgIC8vICAgY2hhbmdlcyB3ZXJlIG1hZGUuIE5vdGUgdGhhdCBmb3IgY29udGlndW91cyByZW1vdmFsXG4gICAgLy8gICBhbnl3aGVyZSBpbiB0aGUgbGlzdCwgdGhlIGhlYWQgYW5kIHRhaWxzIHdvdWxkIGFkdmFuY2VcbiAgICAvLyAgIGZyb20gZWl0aGVyIGVuZCBhbmQgcGFzcyBlYWNoIG90aGVyIGJlZm9yZSB3ZSBnZXQgdG8gdGhpc1xuICAgIC8vICAgY2FzZSBhbmQgcmVtb3ZhbHMgd291bGQgYmUgaGFuZGxlZCBpbiB0aGUgZmluYWwgd2hpbGUgbG9vcFxuICAgIC8vICAgd2l0aG91dCBuZWVkaW5nIHRvIGdlbmVyYXRlIHRoZSBtYXAuXG4gICAgLy9cbiAgICAvLyAqIEV4YW1wbGUgYmVsb3c6IFRoZSBrZXkgYXQgYG9sZFRhaWxgIHdhcyByZW1vdmVkIChubyBsb25nZXJcbiAgICAvLyAgIGluIHRoZSBgbmV3S2V5VG9JbmRleE1hcGApLCBzbyByZW1vdmUgdGhhdCBwYXJ0IGZyb20gdGhlXG4gICAgLy8gICBET00gYW5kIGFkdmFuY2UganVzdCB0aGUgYG9sZFRhaWxgIHBvaW50ZXIuXG4gICAgLy9cbiAgICAvLyAgICAgICAgIG9sZEhlYWQgdiAgICAgICAgICAgdiBvbGRUYWlsXG4gICAgLy8gICBvbGRLZXlzOiAgWzAsIDEsIDIsIDMsIDQsIDUsIDZdXG4gICAgLy8gICBuZXdQYXJ0czogWzAsICAsICAsICAsICAsICAsIDZdIDwtIDUgbm90IGluIG5ldyBtYXA6IHJlbW92ZVxuICAgIC8vICAgbmV3S2V5czogIFswLCAyLCAxLCA0LCAzLCA3LCA2XSAgICA1IGFuZCBhZHZhbmNlIG9sZFRhaWxcbiAgICAvLyAgICAgICAgIG5ld0hlYWQgXiAgICAgICAgICAgXiBuZXdUYWlsXG4gICAgLy9cbiAgICAvLyAqIE9uY2UgaGVhZCBhbmQgdGFpbCBjYW5ub3QgbW92ZSwgYW55IG1pc21hdGNoZXMgYXJlIGR1ZSB0b1xuICAgIC8vICAgZWl0aGVyIG5ldyBvciBtb3ZlZCBpdGVtczsgaWYgYSBuZXcga2V5IGlzIGluIHRoZSBwcmV2aW91c1xuICAgIC8vICAgXCJvbGQga2V5IHRvIG9sZCBpbmRleFwiIG1hcCwgbW92ZSB0aGUgb2xkIHBhcnQgdG8gdGhlIG5ld1xuICAgIC8vICAgbG9jYXRpb24sIG90aGVyd2lzZSBjcmVhdGUgYW5kIGluc2VydCBhIG5ldyBwYXJ0LiBOb3RlXG4gICAgLy8gICB0aGF0IHdoZW4gbW92aW5nIGFuIG9sZCBwYXJ0IHdlIG51bGwgaXRzIHBvc2l0aW9uIGluIHRoZVxuICAgIC8vICAgb2xkUGFydHMgYXJyYXkgaWYgaXQgbGllcyBiZXR3ZWVuIHRoZSBoZWFkIGFuZCB0YWlsIHNvIHdlXG4gICAgLy8gICBrbm93IHRvIHNraXAgaXQgd2hlbiB0aGUgcG9pbnRlcnMgZ2V0IHRoZXJlLlxuICAgIC8vXG4gICAgLy8gKiBFeGFtcGxlIGJlbG93OiBuZWl0aGVyIGhlYWQgbm9yIHRhaWwgbWF0Y2gsIGFuZCBuZWl0aGVyXG4gICAgLy8gICB3ZXJlIHJlbW92ZWQ7IHNvIGZpbmQgdGhlIGBuZXdIZWFkYCBrZXkgaW4gdGhlXG4gICAgLy8gICBgb2xkS2V5VG9JbmRleE1hcGAsIGFuZCBtb3ZlIHRoYXQgb2xkIHBhcnQncyBET00gaW50byB0aGVcbiAgICAvLyAgIG5leHQgaGVhZCBwb3NpdGlvbiAoYmVmb3JlIGBvbGRQYXJ0c1tvbGRIZWFkXWApLiBMYXN0LFxuICAgIC8vICAgbnVsbCB0aGUgcGFydCBpbiB0aGUgYG9sZFBhcnRgIGFycmF5IHNpbmNlIGl0IHdhc1xuICAgIC8vICAgc29tZXdoZXJlIGluIHRoZSByZW1haW5pbmcgb2xkUGFydHMgc3RpbGwgdG8gYmUgc2Nhbm5lZFxuICAgIC8vICAgKGJldHdlZW4gdGhlIGhlYWQgYW5kIHRhaWwgcG9pbnRlcnMpIHNvIHRoYXQgd2Uga25vdyB0b1xuICAgIC8vICAgc2tpcCB0aGF0IG9sZCBwYXJ0IG9uIGZ1dHVyZSBpdGVyYXRpb25zLlxuICAgIC8vXG4gICAgLy8gICAgICAgICBvbGRIZWFkIHYgICAgICAgIHYgb2xkVGFpbFxuICAgIC8vICAgb2xkS2V5czogIFswLCAxLCAtLCAzLCA0LCA1LCA2XVxuICAgIC8vICAgbmV3UGFydHM6IFswLCAyLCAgLCAgLCAgLCAgLCA2XSA8LSBzdHVjazogdXBkYXRlICYgbW92ZSAyXG4gICAgLy8gICBuZXdLZXlzOiAgWzAsIDIsIDEsIDQsIDMsIDcsIDZdICAgIGludG8gcGxhY2UgYW5kIGFkdmFuY2VcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhZFxuICAgIC8vICAgICAgICAgbmV3SGVhZCBeICAgICAgICAgICBeIG5ld1RhaWxcbiAgICAvL1xuICAgIC8vICogTm90ZSB0aGF0IGZvciBtb3Zlcy9pbnNlcnRpb25zIGxpa2UgdGhlIG9uZSBhYm92ZSwgYSBwYXJ0XG4gICAgLy8gICBpbnNlcnRlZCBhdCB0aGUgaGVhZCBwb2ludGVyIGlzIGluc2VydGVkIGJlZm9yZSB0aGVcbiAgICAvLyAgIGN1cnJlbnQgYG9sZFBhcnRzW29sZEhlYWRdYCwgYW5kIGEgcGFydCBpbnNlcnRlZCBhdCB0aGVcbiAgICAvLyAgIHRhaWwgcG9pbnRlciBpcyBpbnNlcnRlZCBiZWZvcmUgYG5ld1BhcnRzW25ld1RhaWwrMV1gLiBUaGVcbiAgICAvLyAgIHNlZW1pbmcgYXN5bW1ldHJ5IGxpZXMgaW4gdGhlIGZhY3QgdGhhdCBuZXcgcGFydHMgYXJlXG4gICAgLy8gICBtb3ZlZCBpbnRvIHBsYWNlIG91dHNpZGUgaW4sIHNvIHRvIHRoZSByaWdodCBvZiB0aGUgaGVhZFxuICAgIC8vICAgcG9pbnRlciBhcmUgb2xkIHBhcnRzLCBhbmQgdG8gdGhlIHJpZ2h0IG9mIHRoZSB0YWlsXG4gICAgLy8gICBwb2ludGVyIGFyZSBuZXcgcGFydHMuXG4gICAgLy9cbiAgICAvLyAqIFdlIGFsd2F5cyByZXN0YXJ0IGJhY2sgZnJvbSB0aGUgdG9wIG9mIHRoZSBhbGdvcml0aG0sXG4gICAgLy8gICBhbGxvd2luZyBtYXRjaGluZyBhbmQgc2ltcGxlIHVwZGF0ZXMgaW4gcGxhY2UgdG9cbiAgICAvLyAgIGNvbnRpbnVlLi4uXG4gICAgLy9cbiAgICAvLyAqIEV4YW1wbGUgYmVsb3c6IHRoZSBoZWFkIHBvaW50ZXJzIG9uY2UgYWdhaW4gbWF0Y2gsIHNvXG4gICAgLy8gICBzaW1wbHkgdXBkYXRlIHBhcnQgMSBhbmQgcmVjb3JkIGl0IGluIHRoZSBgbmV3UGFydHNgXG4gICAgLy8gICBhcnJheS4gIExhc3QsIGFkdmFuY2UgYm90aCBoZWFkIHBvaW50ZXJzLlxuICAgIC8vXG4gICAgLy8gICAgICAgICBvbGRIZWFkIHYgICAgICAgIHYgb2xkVGFpbFxuICAgIC8vICAgb2xkS2V5czogIFswLCAxLCAtLCAzLCA0LCA1LCA2XVxuICAgIC8vICAgbmV3UGFydHM6IFswLCAyLCAxLCAgLCAgLCAgLCA2XSA8LSBoZWFkcyBtYXRjaGVkOiB1cGRhdGUgMVxuICAgIC8vICAgbmV3S2V5czogIFswLCAyLCAxLCA0LCAzLCA3LCA2XSAgICBhbmQgYWR2YW5jZSBib3RoIG9sZEhlYWRcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBuZXdIZWFkXG4gICAgLy8gICAgICAgICAgICBuZXdIZWFkIF4gICAgICAgIF4gbmV3VGFpbFxuICAgIC8vXG4gICAgLy8gKiBBcyBtZW50aW9uZWQgYWJvdmUsIGl0ZW1zIHRoYXQgd2VyZSBtb3ZlZCBhcyBhIHJlc3VsdCBvZlxuICAgIC8vICAgYmVpbmcgc3R1Y2sgKHRoZSBmaW5hbCBlbHNlIGNsYXVzZSBpbiB0aGUgY29kZSBiZWxvdykgYXJlXG4gICAgLy8gICBtYXJrZWQgd2l0aCBudWxsLCBzbyB3ZSBhbHdheXMgYWR2YW5jZSBvbGQgcG9pbnRlcnMgb3ZlclxuICAgIC8vICAgdGhlc2Ugc28gd2UncmUgY29tcGFyaW5nIHRoZSBuZXh0IGFjdHVhbCBvbGQgdmFsdWUgb25cbiAgICAvLyAgIGVpdGhlciBlbmQuXG4gICAgLy9cbiAgICAvLyAqIEV4YW1wbGUgYmVsb3c6IGBvbGRIZWFkYCBpcyBudWxsIChhbHJlYWR5IHBsYWNlZCBpblxuICAgIC8vICAgbmV3UGFydHMpLCBzbyBhZHZhbmNlIGBvbGRIZWFkYC5cbiAgICAvL1xuICAgIC8vICAgICAgICAgICAgb2xkSGVhZCB2ICAgICB2IG9sZFRhaWxcbiAgICAvLyAgIG9sZEtleXM6ICBbMCwgMSwgLSwgMywgNCwgNSwgNl0gPC0gb2xkIGhlYWQgYWxyZWFkeSB1c2VkOlxuICAgIC8vICAgbmV3UGFydHM6IFswLCAyLCAxLCAgLCAgLCAgLCA2XSAgICBhZHZhbmNlIG9sZEhlYWRcbiAgICAvLyAgIG5ld0tleXM6ICBbMCwgMiwgMSwgNCwgMywgNywgNl1cbiAgICAvLyAgICAgICAgICAgICAgIG5ld0hlYWQgXiAgICAgXiBuZXdUYWlsXG4gICAgLy9cbiAgICAvLyAqIE5vdGUgaXQncyBub3QgY3JpdGljYWwgdG8gbWFyayBvbGQgcGFydHMgYXMgbnVsbCB3aGVuIHRoZXlcbiAgICAvLyAgIGFyZSBtb3ZlZCBmcm9tIGhlYWQgdG8gdGFpbCBvciB0YWlsIHRvIGhlYWQsIHNpbmNlIHRoZXlcbiAgICAvLyAgIHdpbGwgYmUgb3V0c2lkZSB0aGUgcG9pbnRlciByYW5nZSBhbmQgbmV2ZXIgdmlzaXRlZCBhZ2Fpbi5cbiAgICAvL1xuICAgIC8vICogRXhhbXBsZSBiZWxvdzogSGVyZSB0aGUgb2xkIHRhaWwga2V5IG1hdGNoZXMgdGhlIG5ldyBoZWFkXG4gICAgLy8gICBrZXksIHNvIHRoZSBwYXJ0IGF0IHRoZSBgb2xkVGFpbGAgcG9zaXRpb24gYW5kIG1vdmUgaXRzXG4gICAgLy8gICBET00gdG8gdGhlIG5ldyBoZWFkIHBvc2l0aW9uIChiZWZvcmUgYG9sZFBhcnRzW29sZEhlYWRdYCkuXG4gICAgLy8gICBMYXN0LCBhZHZhbmNlIGBvbGRUYWlsYCBhbmQgYG5ld0hlYWRgIHBvaW50ZXJzLlxuICAgIC8vXG4gICAgLy8gICAgICAgICAgICAgICBvbGRIZWFkIHYgIHYgb2xkVGFpbFxuICAgIC8vICAgb2xkS2V5czogIFswLCAxLCAtLCAzLCA0LCA1LCA2XVxuICAgIC8vICAgbmV3UGFydHM6IFswLCAyLCAxLCA0LCAgLCAgLCA2XSA8LSBvbGQgdGFpbCBtYXRjaGVzIG5ld1xuICAgIC8vICAgbmV3S2V5czogIFswLCAyLCAxLCA0LCAzLCA3LCA2XSAgIGhlYWQ6IHVwZGF0ZSAmIG1vdmUgNCxcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlIG9sZFRhaWwgJiBuZXdIZWFkXG4gICAgLy8gICAgICAgICAgICAgICBuZXdIZWFkIF4gICAgIF4gbmV3VGFpbFxuICAgIC8vXG4gICAgLy8gKiBFeGFtcGxlIGJlbG93OiBPbGQgYW5kIG5ldyBoZWFkIGtleXMgbWF0Y2gsIHNvIHVwZGF0ZSB0aGVcbiAgICAvLyAgIG9sZCBoZWFkIHBhcnQgaW4gcGxhY2UsIGFuZCBhZHZhbmNlIHRoZSBgb2xkSGVhZGAgYW5kXG4gICAgLy8gICBgbmV3SGVhZGAgcG9pbnRlcnMuXG4gICAgLy9cbiAgICAvLyAgICAgICAgICAgICAgIG9sZEhlYWQgdiBvbGRUYWlsXG4gICAgLy8gICBvbGRLZXlzOiAgWzAsIDEsIC0sIDMsIDQsIDUsIDZdXG4gICAgLy8gICBuZXdQYXJ0czogWzAsIDIsIDEsIDQsIDMsICAgLDZdIDwtIGhlYWRzIG1hdGNoOiB1cGRhdGUgM1xuICAgIC8vICAgbmV3S2V5czogIFswLCAyLCAxLCA0LCAzLCA3LCA2XSAgICBhbmQgYWR2YW5jZSBvbGRIZWFkICZcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhZFxuICAgIC8vICAgICAgICAgICAgICAgICAgbmV3SGVhZCBeICBeIG5ld1RhaWxcbiAgICAvL1xuICAgIC8vICogT25jZSB0aGUgbmV3IG9yIG9sZCBwb2ludGVycyBtb3ZlIHBhc3QgZWFjaCBvdGhlciB0aGVuIGFsbFxuICAgIC8vICAgd2UgaGF2ZSBsZWZ0IGlzIGFkZGl0aW9ucyAoaWYgb2xkIGxpc3QgZXhoYXVzdGVkKSBvclxuICAgIC8vICAgcmVtb3ZhbHMgKGlmIG5ldyBsaXN0IGV4aGF1c3RlZCkuIFRob3NlIGFyZSBoYW5kbGVkIGluIHRoZVxuICAgIC8vICAgZmluYWwgd2hpbGUgbG9vcHMgYXQgdGhlIGVuZC5cbiAgICAvL1xuICAgIC8vICogRXhhbXBsZSBiZWxvdzogYG9sZEhlYWRgIGV4Y2VlZGVkIGBvbGRUYWlsYCwgc28gd2UncmUgZG9uZVxuICAgIC8vICAgd2l0aCB0aGUgbWFpbiBsb29wLiAgQ3JlYXRlIHRoZSByZW1haW5pbmcgcGFydCBhbmQgaW5zZXJ0XG4gICAgLy8gICBpdCBhdCB0aGUgbmV3IGhlYWQgcG9zaXRpb24sIGFuZCB0aGUgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICAgIC8vXG4gICAgLy8gICAgICAgICAgICAgICAgICAgKG9sZEhlYWQgPiBvbGRUYWlsKVxuICAgIC8vICAgb2xkS2V5czogIFswLCAxLCAtLCAzLCA0LCA1LCA2XVxuICAgIC8vICAgbmV3UGFydHM6IFswLCAyLCAxLCA0LCAzLCA3ICw2XSA8LSBjcmVhdGUgYW5kIGluc2VydCA3XG4gICAgLy8gICBuZXdLZXlzOiAgWzAsIDIsIDEsIDQsIDMsIDcsIDZdXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBuZXdIZWFkIF4gbmV3VGFpbFxuICAgIC8vXG4gICAgLy8gKiBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBpZi9lbHNlIGNsYXVzZXMgaXMgbm90XG4gICAgLy8gICBpbXBvcnRhbnQgdG8gdGhlIGFsZ29yaXRobSwgYXMgbG9uZyBhcyB0aGUgbnVsbCBjaGVja3NcbiAgICAvLyAgIGNvbWUgZmlyc3QgKHRvIGVuc3VyZSB3ZSdyZSBhbHdheXMgd29ya2luZyBvbiB2YWxpZCBvbGRcbiAgICAvLyAgIHBhcnRzKSBhbmQgdGhhdCB0aGUgZmluYWwgZWxzZSBjbGF1c2UgY29tZXMgbGFzdCAoc2luY2VcbiAgICAvLyAgIHRoYXQncyB3aGVyZSB0aGUgZXhwZW5zaXZlIG1vdmVzIG9jY3VyKS4gVGhlIG9yZGVyIG9mXG4gICAgLy8gICByZW1haW5pbmcgY2xhdXNlcyBpcyBqdXN0IGEgc2ltcGxlIGd1ZXNzIGF0IHdoaWNoIGNhc2VzXG4gICAgLy8gICB3aWxsIGJlIG1vc3QgY29tbW9uLlxuICAgIC8vXG4gICAgLy8gKiBOb3RlLCB3ZSBjb3VsZCBjYWxjdWxhdGUgdGhlIGxvbmdlc3RcbiAgICAvLyAgIGluY3JlYXNpbmcgc3Vic2VxdWVuY2UgKExJUykgb2Ygb2xkIGl0ZW1zIGluIG5ldyBwb3NpdGlvbixcbiAgICAvLyAgIGFuZCBvbmx5IG1vdmUgdGhvc2Ugbm90IGluIHRoZSBMSVMgc2V0LiBIb3dldmVyIHRoYXQgY29zdHNcbiAgICAvLyAgIE8obmxvZ24pIHRpbWUgYW5kIGFkZHMgYSBiaXQgbW9yZSBjb2RlLCBhbmQgb25seSBoZWxwc1xuICAgIC8vICAgbWFrZSByYXJlIHR5cGVzIG9mIG11dGF0aW9ucyByZXF1aXJlIGZld2VyIG1vdmVzLiBUaGVcbiAgICAvLyAgIGFib3ZlIGhhbmRsZXMgcmVtb3ZlcywgYWRkcywgcmV2ZXJzYWwsIHN3YXBzLCBhbmQgc2luZ2xlXG4gICAgLy8gICBtb3ZlcyBvZiBjb250aWd1b3VzIGl0ZW1zIGluIGxpbmVhciB0aW1lLCBpbiB0aGUgbWluaW11bVxuICAgIC8vICAgbnVtYmVyIG9mIG1vdmVzLiBBcyB0aGUgbnVtYmVyIG9mIG11bHRpcGxlIG1vdmVzIHdoZXJlIExJU1xuICAgIC8vICAgbWlnaHQgaGVscCBhcHByb2FjaGVzIGEgcmFuZG9tIHNodWZmbGUsIHRoZSBMSVNcbiAgICAvLyAgIG9wdGltaXphdGlvbiBiZWNvbWVzIGxlc3MgaGVscGZ1bCwgc28gaXQgc2VlbXMgbm90IHdvcnRoXG4gICAgLy8gICB0aGUgY29kZSBhdCB0aGlzIHBvaW50LiBDb3VsZCByZWNvbnNpZGVyIGlmIGEgY29tcGVsbGluZ1xuICAgIC8vICAgY2FzZSBhcmlzZXMuXG5cbiAgICB3aGlsZSAob2xkSGVhZCA8PSBvbGRUYWlsICYmIG5ld0hlYWQgPD0gbmV3VGFpbCkge1xuICAgICAgaWYgKG9sZFBhcnRzW29sZEhlYWRdID09PSBudWxsKSB7XG4gICAgICAgIC8vIGBudWxsYCBtZWFucyBvbGQgcGFydCBhdCBoZWFkIGhhcyBhbHJlYWR5IGJlZW4gdXNlZFxuICAgICAgICAvLyBiZWxvdzsgc2tpcFxuICAgICAgICBvbGRIZWFkKys7XG4gICAgICB9IGVsc2UgaWYgKG9sZFBhcnRzW29sZFRhaWxdID09PSBudWxsKSB7XG4gICAgICAgIC8vIGBudWxsYCBtZWFucyBvbGQgcGFydCBhdCB0YWlsIGhhcyBhbHJlYWR5IGJlZW4gdXNlZFxuICAgICAgICAvLyBiZWxvdzsgc2tpcFxuICAgICAgICBvbGRUYWlsLS07XG4gICAgICB9IGVsc2UgaWYgKG9sZEtleXNbb2xkSGVhZF0gPT09IG5ld0tleXNbbmV3SGVhZF0pIHtcbiAgICAgICAgLy8gT2xkIGhlYWQgbWF0Y2hlcyBuZXcgaGVhZDsgdXBkYXRlIGluIHBsYWNlXG4gICAgICAgIG5ld1BhcnRzW25ld0hlYWRdID0gc2V0Q2hpbGRQYXJ0VmFsdWUoXG4gICAgICAgICAgb2xkUGFydHNbb2xkSGVhZF0hLFxuICAgICAgICAgIG5ld1ZhbHVlc1tuZXdIZWFkXVxuICAgICAgICApO1xuICAgICAgICBvbGRIZWFkKys7XG4gICAgICAgIG5ld0hlYWQrKztcbiAgICAgIH0gZWxzZSBpZiAob2xkS2V5c1tvbGRUYWlsXSA9PT0gbmV3S2V5c1tuZXdUYWlsXSkge1xuICAgICAgICAvLyBPbGQgdGFpbCBtYXRjaGVzIG5ldyB0YWlsOyB1cGRhdGUgaW4gcGxhY2VcbiAgICAgICAgbmV3UGFydHNbbmV3VGFpbF0gPSBzZXRDaGlsZFBhcnRWYWx1ZShcbiAgICAgICAgICBvbGRQYXJ0c1tvbGRUYWlsXSEsXG4gICAgICAgICAgbmV3VmFsdWVzW25ld1RhaWxdXG4gICAgICAgICk7XG4gICAgICAgIG9sZFRhaWwtLTtcbiAgICAgICAgbmV3VGFpbC0tO1xuICAgICAgfSBlbHNlIGlmIChvbGRLZXlzW29sZEhlYWRdID09PSBuZXdLZXlzW25ld1RhaWxdKSB7XG4gICAgICAgIC8vIE9sZCBoZWFkIG1hdGNoZXMgbmV3IHRhaWw7IHVwZGF0ZSBhbmQgbW92ZSB0byBuZXcgdGFpbFxuICAgICAgICBuZXdQYXJ0c1tuZXdUYWlsXSA9IHNldENoaWxkUGFydFZhbHVlKFxuICAgICAgICAgIG9sZFBhcnRzW29sZEhlYWRdISxcbiAgICAgICAgICBuZXdWYWx1ZXNbbmV3VGFpbF1cbiAgICAgICAgKTtcbiAgICAgICAgaW5zZXJ0UGFydChjb250YWluZXJQYXJ0LCBuZXdQYXJ0c1tuZXdUYWlsICsgMV0sIG9sZFBhcnRzW29sZEhlYWRdISk7XG4gICAgICAgIG9sZEhlYWQrKztcbiAgICAgICAgbmV3VGFpbC0tO1xuICAgICAgfSBlbHNlIGlmIChvbGRLZXlzW29sZFRhaWxdID09PSBuZXdLZXlzW25ld0hlYWRdKSB7XG4gICAgICAgIC8vIE9sZCB0YWlsIG1hdGNoZXMgbmV3IGhlYWQ7IHVwZGF0ZSBhbmQgbW92ZSB0byBuZXcgaGVhZFxuICAgICAgICBuZXdQYXJ0c1tuZXdIZWFkXSA9IHNldENoaWxkUGFydFZhbHVlKFxuICAgICAgICAgIG9sZFBhcnRzW29sZFRhaWxdISxcbiAgICAgICAgICBuZXdWYWx1ZXNbbmV3SGVhZF1cbiAgICAgICAgKTtcbiAgICAgICAgaW5zZXJ0UGFydChjb250YWluZXJQYXJ0LCBvbGRQYXJ0c1tvbGRIZWFkXSEsIG9sZFBhcnRzW29sZFRhaWxdISk7XG4gICAgICAgIG9sZFRhaWwtLTtcbiAgICAgICAgbmV3SGVhZCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG5ld0tleVRvSW5kZXhNYXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIExhemlseSBnZW5lcmF0ZSBrZXktdG8taW5kZXggbWFwcywgdXNlZCBmb3IgcmVtb3ZhbHMgJlxuICAgICAgICAgIC8vIG1vdmVzIGJlbG93XG4gICAgICAgICAgbmV3S2V5VG9JbmRleE1hcCA9IGdlbmVyYXRlTWFwKG5ld0tleXMsIG5ld0hlYWQsIG5ld1RhaWwpO1xuICAgICAgICAgIG9sZEtleVRvSW5kZXhNYXAgPSBnZW5lcmF0ZU1hcChvbGRLZXlzLCBvbGRIZWFkLCBvbGRUYWlsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5ld0tleVRvSW5kZXhNYXAuaGFzKG9sZEtleXNbb2xkSGVhZF0pKSB7XG4gICAgICAgICAgLy8gT2xkIGhlYWQgaXMgbm8gbG9uZ2VyIGluIG5ldyBsaXN0OyByZW1vdmVcbiAgICAgICAgICByZW1vdmVQYXJ0KG9sZFBhcnRzW29sZEhlYWRdISk7XG4gICAgICAgICAgb2xkSGVhZCsrO1xuICAgICAgICB9IGVsc2UgaWYgKCFuZXdLZXlUb0luZGV4TWFwLmhhcyhvbGRLZXlzW29sZFRhaWxdKSkge1xuICAgICAgICAgIC8vIE9sZCB0YWlsIGlzIG5vIGxvbmdlciBpbiBuZXcgbGlzdDsgcmVtb3ZlXG4gICAgICAgICAgcmVtb3ZlUGFydChvbGRQYXJ0c1tvbGRUYWlsXSEpO1xuICAgICAgICAgIG9sZFRhaWwtLTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBbnkgbWlzbWF0Y2hlcyBhdCB0aGlzIHBvaW50IGFyZSBkdWUgdG8gYWRkaXRpb25zIG9yXG4gICAgICAgICAgLy8gbW92ZXM7IHNlZSBpZiB3ZSBoYXZlIGFuIG9sZCBwYXJ0IHdlIGNhbiByZXVzZSBhbmQgbW92ZVxuICAgICAgICAgIC8vIGludG8gcGxhY2VcbiAgICAgICAgICBjb25zdCBvbGRJbmRleCA9IG9sZEtleVRvSW5kZXhNYXAuZ2V0KG5ld0tleXNbbmV3SGVhZF0pO1xuICAgICAgICAgIGNvbnN0IG9sZFBhcnQgPSBvbGRJbmRleCAhPT0gdW5kZWZpbmVkID8gb2xkUGFydHNbb2xkSW5kZXhdIDogbnVsbDtcbiAgICAgICAgICBpZiAob2xkUGFydCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gTm8gb2xkIHBhcnQgZm9yIHRoaXMgdmFsdWU7IGNyZWF0ZSBhIG5ldyBvbmUgYW5kXG4gICAgICAgICAgICAvLyBpbnNlcnQgaXRcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhcnQgPSBpbnNlcnRQYXJ0KGNvbnRhaW5lclBhcnQsIG9sZFBhcnRzW29sZEhlYWRdISk7XG4gICAgICAgICAgICBzZXRDaGlsZFBhcnRWYWx1ZShuZXdQYXJ0LCBuZXdWYWx1ZXNbbmV3SGVhZF0pO1xuICAgICAgICAgICAgbmV3UGFydHNbbmV3SGVhZF0gPSBuZXdQYXJ0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBSZXVzZSBvbGQgcGFydFxuICAgICAgICAgICAgbmV3UGFydHNbbmV3SGVhZF0gPSBzZXRDaGlsZFBhcnRWYWx1ZShvbGRQYXJ0LCBuZXdWYWx1ZXNbbmV3SGVhZF0pO1xuICAgICAgICAgICAgaW5zZXJ0UGFydChjb250YWluZXJQYXJ0LCBvbGRQYXJ0c1tvbGRIZWFkXSEsIG9sZFBhcnQpO1xuICAgICAgICAgICAgLy8gVGhpcyBtYXJrcyB0aGUgb2xkIHBhcnQgYXMgaGF2aW5nIGJlZW4gdXNlZCwgc28gdGhhdFxuICAgICAgICAgICAgLy8gaXQgd2lsbCBiZSBza2lwcGVkIGluIHRoZSBmaXJzdCB0d28gY2hlY2tzIGFib3ZlXG4gICAgICAgICAgICBvbGRQYXJ0c1tvbGRJbmRleCBhcyBudW1iZXJdID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV3SGVhZCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEFkZCBwYXJ0cyBmb3IgYW55IHJlbWFpbmluZyBuZXcgdmFsdWVzXG4gICAgd2hpbGUgKG5ld0hlYWQgPD0gbmV3VGFpbCkge1xuICAgICAgLy8gRm9yIGFsbCByZW1haW5pbmcgYWRkaXRpb25zLCB3ZSBpbnNlcnQgYmVmb3JlIGxhc3QgbmV3XG4gICAgICAvLyB0YWlsLCBzaW5jZSBvbGQgcG9pbnRlcnMgYXJlIG5vIGxvbmdlciB2YWxpZFxuICAgICAgY29uc3QgbmV3UGFydCA9IGluc2VydFBhcnQoY29udGFpbmVyUGFydCwgbmV3UGFydHNbbmV3VGFpbCArIDFdKTtcbiAgICAgIHNldENoaWxkUGFydFZhbHVlKG5ld1BhcnQsIG5ld1ZhbHVlc1tuZXdIZWFkXSk7XG4gICAgICBuZXdQYXJ0c1tuZXdIZWFkKytdID0gbmV3UGFydDtcbiAgICB9XG4gICAgLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgdW51c2VkIG9sZCBwYXJ0c1xuICAgIHdoaWxlIChvbGRIZWFkIDw9IG9sZFRhaWwpIHtcbiAgICAgIGNvbnN0IG9sZFBhcnQgPSBvbGRQYXJ0c1tvbGRIZWFkKytdO1xuICAgICAgaWYgKG9sZFBhcnQgIT09IG51bGwpIHtcbiAgICAgICAgcmVtb3ZlUGFydChvbGRQYXJ0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTYXZlIG9yZGVyIG9mIG5ldyBwYXJ0cyBmb3IgbmV4dCByb3VuZFxuICAgIHRoaXMuX2l0ZW1LZXlzID0gbmV3S2V5cztcbiAgICAvLyBEaXJlY3RseSBzZXQgcGFydCB2YWx1ZSwgYnlwYXNzaW5nIGl0J3MgZGlydHktY2hlY2tpbmdcbiAgICBzZXRDb21taXR0ZWRWYWx1ZShjb250YWluZXJQYXJ0LCBuZXdQYXJ0cyk7XG4gICAgcmV0dXJuIG5vQ2hhbmdlO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwZWF0RGlyZWN0aXZlRm4ge1xuICA8VD4oXG4gICAgaXRlbXM6IEl0ZXJhYmxlPFQ+LFxuICAgIGtleUZuT3JUZW1wbGF0ZTogS2V5Rm48VD4gfCBJdGVtVGVtcGxhdGU8VD4sXG4gICAgdGVtcGxhdGU/OiBJdGVtVGVtcGxhdGU8VD5cbiAgKTogdW5rbm93bjtcbiAgPFQ+KGl0ZW1zOiBJdGVyYWJsZTxUPiwgdGVtcGxhdGU6IEl0ZW1UZW1wbGF0ZTxUPik6IHVua25vd247XG4gIDxUPihcbiAgICBpdGVtczogSXRlcmFibGU8VD4sXG4gICAga2V5Rm46IEtleUZuPFQ+IHwgSXRlbVRlbXBsYXRlPFQ+LFxuICAgIHRlbXBsYXRlOiBJdGVtVGVtcGxhdGU8VD5cbiAgKTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBBIGRpcmVjdGl2ZSB0aGF0IHJlcGVhdHMgYSBzZXJpZXMgb2YgdmFsdWVzICh1c3VhbGx5IGBUZW1wbGF0ZVJlc3VsdHNgKVxuICogZ2VuZXJhdGVkIGZyb20gYW4gaXRlcmFibGUsIGFuZCB1cGRhdGVzIHRob3NlIGl0ZW1zIGVmZmljaWVudGx5IHdoZW4gdGhlXG4gKiBpdGVyYWJsZSBjaGFuZ2VzIGJhc2VkIG9uIHVzZXItcHJvdmlkZWQgYGtleXNgIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGl0ZW0uXG4gKlxuICogTm90ZSB0aGF0IGlmIGEgYGtleUZuYCBpcyBwcm92aWRlZCwgc3RyaWN0IGtleS10by1ET00gbWFwcGluZyBpcyBtYWludGFpbmVkLFxuICogbWVhbmluZyBwcmV2aW91cyBET00gZm9yIGEgZ2l2ZW4ga2V5IGlzIG1vdmVkIGludG8gdGhlIG5ldyBwb3NpdGlvbiBpZlxuICogbmVlZGVkLCBhbmQgRE9NIHdpbGwgbmV2ZXIgYmUgcmV1c2VkIHdpdGggdmFsdWVzIGZvciBkaWZmZXJlbnQga2V5cyAobmV3IERPTVxuICogd2lsbCBhbHdheXMgYmUgY3JlYXRlZCBmb3IgbmV3IGtleXMpLiBUaGlzIGlzIGdlbmVyYWxseSB0aGUgbW9zdCBlZmZpY2llbnRcbiAqIHdheSB0byB1c2UgYHJlcGVhdGAgc2luY2UgaXQgcGVyZm9ybXMgbWluaW11bSB1bm5lY2Vzc2FyeSB3b3JrIGZvciBpbnNlcnRpb25zXG4gKiBhbmQgcmVtb3ZhbHMuXG4gKlxuICogVGhlIGBrZXlGbmAgdGFrZXMgdHdvIHBhcmFtZXRlcnMsIHRoZSBpdGVtIGFuZCBpdHMgaW5kZXgsIGFuZCByZXR1cm5zIGEgdW5pcXVlIGtleSB2YWx1ZS5cbiAqXG4gKiBgYGBqc1xuICogaHRtbGBcbiAqICAgPG9sPlxuICogICAgICR7cmVwZWF0KHRoaXMuaXRlbXMsIChpdGVtKSA9PiBpdGVtLmlkLCAoaXRlbSwgaW5kZXgpID0+IHtcbiAqICAgICAgIHJldHVybiBodG1sYDxsaT4ke2luZGV4fTogJHtpdGVtLm5hbWV9PC9saT5gO1xuICogICAgIH0pfVxuICogICA8L29sPlxuICogYFxuICogYGBgXG4gKlxuICogKipJbXBvcnRhbnQqKjogSWYgcHJvdmlkaW5nIGEgYGtleUZuYCwga2V5cyAqbXVzdCogYmUgdW5pcXVlIGZvciBhbGwgaXRlbXMgaW4gYVxuICogZ2l2ZW4gY2FsbCB0byBgcmVwZWF0YC4gVGhlIGJlaGF2aW9yIHdoZW4gdHdvIG9yIG1vcmUgaXRlbXMgaGF2ZSB0aGUgc2FtZSBrZXlcbiAqIGlzIHVuZGVmaW5lZC5cbiAqXG4gKiBJZiBubyBga2V5Rm5gIGlzIHByb3ZpZGVkLCB0aGlzIGRpcmVjdGl2ZSB3aWxsIHBlcmZvcm0gc2ltaWxhciB0byBtYXBwaW5nXG4gKiBpdGVtcyB0byB2YWx1ZXMsIGFuZCBET00gd2lsbCBiZSByZXVzZWQgYWdhaW5zdCBwb3RlbnRpYWxseSBkaWZmZXJlbnQgaXRlbXMuXG4gKi9cbmV4cG9ydCBjb25zdCByZXBlYXQgPSBkaXJlY3RpdmUoUmVwZWF0RGlyZWN0aXZlKSBhcyBSZXBlYXREaXJlY3RpdmVGbjtcblxuLyoqXG4gKiBUaGUgdHlwZSBvZiB0aGUgY2xhc3MgdGhhdCBwb3dlcnMgdGhpcyBkaXJlY3RpdmUuIE5lY2Vzc2FyeSBmb3IgbmFtaW5nIHRoZVxuICogZGlyZWN0aXZlJ3MgcmV0dXJuIHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIHtSZXBlYXREaXJlY3RpdmV9O1xuIiwgImltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi8uLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpb25Ib3RzcG90cyhcbiAgc2hhcGU6IHN0cmluZyxcbiAgY29vcmRzTnVtYmVyOiBudW1iZXJbXSxcbiAgaW1nOiBIVE1MSW1hZ2VFbGVtZW50LFxuICBob3RzcG90OiBRdGlIb3RzcG90Q2hvaWNlXG4pIHtcbiAgc3dpdGNoIChzaGFwZSkge1xuICAgIGNhc2UgJ2NpcmNsZSc6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXNdID0gY29vcmRzTnVtYmVyO1xuICAgICAgICBjb25zdCBjZW50ZXJYUGVyID0gKGNlbnRlclggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBjZW50ZXJZUGVyID0gKGNlbnRlclkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmFkaXVzUGVyID0gKHJhZGl1cyAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGNlbnRlclhQZXIgLSByYWRpdXNQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gY2VudGVyWVBlciAtIHJhZGl1c1BlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gNCAqIHJhZGl1c1BlciArICdweCc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUuYm9yZGVyUmFkaXVzID0gYDk5OTlweGA7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3JlY3QnOlxuICAgICAge1xuICAgICAgICBjb25zdCBbbGVmdFgsIHRvcFksIHJpZ2h0WCwgYm90dG9tWV0gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgIGNvbnN0IGxlZnRYUGVyID0gKGxlZnRYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgdG9wWVBlciA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHJpZ2h0WFBlciA9IChyaWdodFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBib3R0b21ZUGVyID0gKGJvdHRvbVkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gbGVmdFhQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gdG9wWVBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IHJpZ2h0WFBlciAtIGxlZnRYUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLmhlaWdodCA9IGJvdHRvbVlQZXIgLSB0b3BZUGVyICsgJyUnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdwb2x5JzpcbiAgICAgIHtcbiAgICAgICAgLy8gZnJvbSBhLGIsYyxkLGUsZiA9PiBbe3g6YSwgeTpifSx7eDpjLCB5OmR9LHt4OmUsIHk6Zn1dXG4gICAgICAgIGNvbnN0IHBvbHljb29yZHMgPSBjb29yZHNOdW1iZXIucmVkdWNlKChhY2MsIGN1cnJlbnRWYWx1ZSwgY3VycmVudEluZGV4LCBwb2x5QykgPT4ge1xuICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggJSAyID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0VmFsID0gYWNjLnBvcCgpO1xuICAgICAgICAgICAgYWNjW2FjYy5sZW5ndGhdID0geyB4OiBsYXN0VmFsLCB5OiBwb2x5Q1tjdXJyZW50SW5kZXhdIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgYm91bmRpbmcgYm94IGJ5IGZpbmRpbmcgdGhlIG1heCBheCBtaW4gY29vcmRpbmF0ZXMgb2YgeCBhbmQgeVxuICAgICAgICBjb25zdCBsZWZ0WCA9IE1hdGgubWluKC4uLnBvbHljb29yZHMubWFwKHBvaW50ID0+IHBvaW50LngpKTtcbiAgICAgICAgY29uc3QgcmlnaHRYID0gTWF0aC5tYXgoLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueCkpO1xuICAgICAgICBjb25zdCB0b3BZID0gTWF0aC5taW4oLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueSkpO1xuICAgICAgICBjb25zdCBib3R0b21ZID0gTWF0aC5tYXgoLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueSkpO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgcmVsYXRpdmUgZGlzdGFuY2UgY2F1c2Ugd2Ugd2FudCB0byB1c2UgcGVyY2VudGFnZXNcbiAgICAgICAgY29uc3QgbGVmdFhQZXIgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCB0b3BZUGVyID0gKHRvcFkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmlnaHRYUGVyID0gKHJpZ2h0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IGJvdHRvbVlQZXIgPSAoYm90dG9tWSAvIGltZy5oZWlnaHQpICogMTAwO1xuXG4gICAgICAgIC8vIHNldCB0aGUgaG90c3BvdCBvbiB4LHkgYW5kIHNldCB0aGUgd2lkdGggYW5kIGhlaWdodCBpbiBwZXJjZW50YWdlc1xuICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDAgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSByaWdodFhQZXIgLSBsZWZ0WFBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS5oZWlnaHQgPSBib3R0b21ZUGVyIC0gdG9wWVBlciArICclJztcblxuICAgICAgICAvLyBhbGwgdGhlIHBvbHlnb24gcG9pbnRzIHNob3VsZCBiZSBjb3JyZWN0ZWQgY2F1c2VkIHRoZXkgYXJlIGZyb21cbiAgICAgICAgLy8gaW1hZ2UgMCwwIHBvaW50LCBhbmQgc2hvdWxkIGJlIGZyb20gdGhlIGhvdHNwb3QgcG9pbnQgd2hpY2ggYWxyZWFkeVxuICAgICAgICAvLyBoYXMgYmVlbiBvZmZzZXR0ZWQgZnJvbSB0aGUgaW1hZ2UgaW4gdGhlIHByZXZpb3VzIGZldyBsaW5lcyBvZiBjb2RlXG4gICAgICAgIC8vIGFsc28gdGhlIHBvaW50cyBoYXZlIGEgcmVsYXRpdmUgZGlzdGFuY2UgdG8gdGhlIGltYWdlLCBidXQgbm93IGhhdmVcbiAgICAgICAgLy8gdG8gaGF2ZSBhIHJlbGF0aXZlIGRpc3RhbmNlIGZyb20gdGhlIHdpZHRoIG9mIHRoZSBob3RzcG90XG4gICAgICAgIGNvbnN0IHBvbHlnb25EYXRhID0gcG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gKHtcbiAgICAgICAgICB4OiAoKHBvaW50LnggLSBsZWZ0WCkgLyAocmlnaHRYIC0gbGVmdFgpKSAqIDEwMCxcbiAgICAgICAgICB5OiAoKHBvaW50LnkgLSB0b3BZKSAvIChib3R0b21ZIC0gdG9wWSkpICogMTAwXG4gICAgICAgIH0pKTtcblxuICAgICAgICAvLyBjcmVhdGUgY2xpcCBwYXRoIGNvb3JkaW5hdGUgc3R5bGUgaW4gcGVyY2VudGFnZXNcbiAgICAgICAgY29uc3QgcG9seUQgPSBwb2x5Z29uRGF0YS5tYXAocCA9PiBNYXRoLnJvdW5kKHAueCkgKyAnJSAnICsgTWF0aC5yb3VuZChwLnkpICsgJyUnKS5qb2luKCcsJyk7XG5cbiAgICAgICAgLy8gNTAlIDAlLCAxMDAlIDUwJSwgNTAlIDEwMCUsIDAlIDUwJVxuICAgICAgICBob3RzcG90LnN0eWxlLmNsaXBQYXRoID0gYHBvbHlnb24oJHtwb2x5RH0pYDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBzdmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcXVlcnksIHF1ZXJ5QXNzaWduZWRFbGVtZW50cywgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBpZkRlZmluZWQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLmpzJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdC5qcyc7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHcmFwaGljQXNzb2NpYXRlSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBob3RzcG90cztcbiAgc3RhcnRQb2ludCA9IG51bGw7XG4gIGVuZFBvaW50ID0gbnVsbDtcbiAgQHN0YXRlKCkgX2xpbmVzID0gW107XG4gIEBzdGF0ZSgpIHN0YXJ0Q29vcmQ6IHsgeDogYW55OyB5OiBhbnkgfTtcbiAgQHN0YXRlKCkgbW91c2VDb29yZDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICBAcXVlcnkoJ3N2ZycpIHN2Z0NvbnRhaW5lcjtcbiAgQHF1ZXJ5QXNzaWduZWRFbGVtZW50cyh7IHNlbGVjdG9yOiAnaW1nJyB9KSBnckltYWdlO1xuXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgLy8gcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChxdGktYXNzb2NpYWJsZS1ob3RzcG90KSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgfVxuICAgICAgbGluZS1jb250YWluZXIge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgICAgc3ZnIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDBweDtcbiAgICAgICAgbGVmdDogMHB4O1xuICAgICAgfVxuICAgIGBcbiAgXTtcbiAgc3ZnOiBTVkdTVkdFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9saW5lcyA9IFtdO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9saW5lcy5sZW5ndGggPiAwO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdGhpcy5fbGluZXMgPSB2YWw7XG4gICAgfVxuICB9XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xpbmVzO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8bGluZS1jb250YWluZXI+XG4gICAgICAgIDxzdmdcbiAgICAgICAgICB3aWR0aD0ke2lmRGVmaW5lZCh0aGlzLmdySW1hZ2VbMF0/LndpZHRoKX1cbiAgICAgICAgICBoZWlnaHQ9JHtpZkRlZmluZWQodGhpcy5nckltYWdlWzBdPy5oZWlnaHQpfVxuICAgICAgICAgIHZpZXdib3g9XCIwIDAgJHt0aGlzLmdySW1hZ2VbMF0/LndpZHRofSAke3RoaXMuZ3JJbWFnZVswXT8uaGVpZ2h0fVwiXG4gICAgICAgID5cbiAgICAgICAgICAke3JlcGVhdChcbiAgICAgICAgICAgIHRoaXMuX2xpbmVzLFxuICAgICAgICAgICAgbGluZSA9PiBsaW5lLFxuICAgICAgICAgICAgKGxpbmUsIGluZGV4KSA9PiBzdmdgXG4gICAgICAgICAgICAgIDxsaW5lXG4gICAgICAgICAgICAgICAgcGFydD1cImxpbmVcIlxuICAgICAgICAgICAgICAgIHgxPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVswXSArICddJykuc3R5bGUubGVmdCl9XG4gICAgICAgICAgICAgICAgeTE9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzBdICsgJ10nKS5zdHlsZS50b3ApfVxuICAgICAgICAgICAgICAgIHgyPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVsxXSArICddJykuc3R5bGUubGVmdCl9XG4gICAgICAgICAgICAgICAgeTI9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzFdICsgJ10nKS5zdHlsZS50b3ApfVxuICAgICAgICAgICAgICAgIHN0cm9rZT1cInJlZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiXG4gICAgICAgICAgICAgICAgQGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbGluZXMgPSB0aGlzLl9saW5lcy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX2xpbmVzKTtcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgYFxuICAgICAgICAgICl9XG4gICAgICAgICAgJHt0aGlzLnN0YXJ0UG9pbnQgJiZcbiAgICAgICAgICBzdmdgPGxpbmVcbiAgICAgICAgICAgIHBhcnQ9XCJwb2ludFwiXG4gICAgICAgICAgICB4MT0ke3RoaXMuc3RhcnRDb29yZC54fVxuICAgICAgICAgICAgeTE9JHt0aGlzLnN0YXJ0Q29vcmQueX1cbiAgICAgICAgICAgIHgyPSR7dGhpcy5tb3VzZUNvb3JkLnh9XG4gICAgICAgICAgICB5Mj0ke3RoaXMubW91c2VDb29yZC55fVxuICAgICAgICAgICAgc3Ryb2tlPVwicmVkXCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIlxuICAgICAgICAgIC8+YH1cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvbGluZS1jb250YWluZXI+YDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG4gICAgcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGUpOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoZSk7XG5cbiAgICB0aGlzLmhvdHNwb3RzID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktYXNzb2NpYWJsZS1ob3RzcG90Jyk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBldmVudCA9PiB7XG4gICAgICB0aGlzLm1vdXNlQ29vcmQgPSB7XG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFggLSB0aGlzLmdySW1hZ2VbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSAtIHRoaXMuZ3JJbWFnZVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLmhvdHNwb3RzLmZvckVhY2goaG90c3BvdCA9PiB7XG4gICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVswXSArICdweCc7XG4gICAgICBob3RzcG90LnN0eWxlLnRvcCA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzFdICsgJ3B4JztcblxuICAgICAgaG90c3BvdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0UG9pbnQpIHtcbiAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgICB0aGlzLnN0YXJ0Q29vcmQgPSB7XG4gICAgICAgICAgICB4OiB0aGlzLnN0YXJ0UG9pbnQuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzBdLFxuICAgICAgICAgICAgeTogdGhpcy5zdGFydFBvaW50LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVsxXVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZW5kUG9pbnQpIHtcbiAgICAgICAgICB0aGlzLmVuZFBvaW50ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgICAgdGhpcy5fbGluZXMgPSBbXG4gICAgICAgICAgICAuLi50aGlzLl9saW5lcyxcbiAgICAgICAgICAgIHRoaXMuc3RhcnRQb2ludC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSArICcgJyArIHRoaXMuZW5kUG9pbnQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJylcbiAgICAgICAgICBdO1xuICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX2xpbmVzKTtcbiAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZW5kUG9pbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic6IFF0aUdyYXBoaWNBc3NvY2lhdGVJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHcmFwaGljR2FwTWF0Y2hJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihcbiAgSW50ZXJhY3Rpb24sXG4gICdxdGktZ2FwLWltZycsXG4gIGZhbHNlLFxuICAncXRpLWFzc29jaWFibGUtaG90c3BvdCdcbikge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB9XG4gICAgc2xvdFtuYW1lPSdxdGktZ2FwLWltZyddIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBnYXA6IDFyZW07XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDxzbG90IG5hbWU9XCJxdGktZ2FwLWltZ1wiPjwvc2xvdD5gO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PG51bGw+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcblxuICAgIC8vIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgICBzd2l0Y2ggKHNoYXBlKSB7XG4gICAgICBjYXNlICdjaXJjbGUnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgW2NlbnRlclgsIGNlbnRlclksIHJhZGl1c10gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gY2VudGVyWCAtIHJhZGl1cyArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSBjZW50ZXJZIC0gcmFkaXVzICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gaG90c3BvdC5zdHlsZS5oZWlnaHQgPSAyICogcmFkaXVzICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmVjdCc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBbbGVmdFgsIHRvcFksIHJpZ2h0WCwgYm90dG9tWV0gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gbGVmdFggKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gdG9wWSArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IHJpZ2h0WCAtIGxlZnRYICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLmhlaWdodCA9IGJvdHRvbVkgLSB0b3BZICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1ob3RzcG90JywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbic6IFF0aUdyYXBoaWNHYXBNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IENob2ljZSwgQ2hvaWNlc01peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLm1peGluJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcG9zaXRpb25Ib3RzcG90cyB9IGZyb20gJy4uL2ludGVybmFsL2hvdHNwb3RzL2hvdHNwb3QnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgSG90c3BvdENob2ljZSA9IENob2ljZSAmIHsgb3JkZXI6IG51bWJlciB9O1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdyYXBoaWNPcmRlckludGVyYWN0aW9uIGV4dGVuZHMgQ2hvaWNlc01peGluKEludGVyYWN0aW9uLCAncXRpLWhvdHNwb3QtY2hvaWNlJykge1xuICBjaG9pY2VPcmRlcmluZzogYm9vbGVhbjtcblxuICAvLyBkbyBub3Qgc2VsZWN0ICggaGlnaGxpZ2h0IGJsdWUsIHRoZSBpbWFnZSlcbiAgLy8gdGFyZ2V0IHRoZSBtYWluIHNsb3QgbWFrZSBpdCByZWxhdGl2ZSBhbmQgZml0IHdpdGggdGhlIGNvbnRlblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIHNsb3Q6bm90KFtuYW1lPSdwcm9tcHQnXSkge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIHF0aS1ob3RzcG90LWNob2ljZSByZWxhdGl2ZSB0byB0aGUgc2xvdCAqL1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgd2lkdGg6IGZpdC1jb250ZW50OyAvKiBob3RzcG90cyBub3Qgc3RyZXRjaGluZyBmdXJ0aGVyIGlmIGltYWdlIGlzIGF0IG1heCBzaXplICovXG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIC8qIGltYWdlIG5vdCBzZWxlY3RhYmxlIGFueW1vcmUgKi9cbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPCEtLSBzbG90IGZvciB0aGUgcHJvbXB0IC0tPlxuICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPCEtLSBzbG90IGZvciB0aGUgaW1hZ2UgYW5kIGhvdHNwb3RzIC0tPlxuICAgIGA7XG4gIH1cblxuICBwcml2YXRlIHNldEhvdHNwb3RPcmRlcihlOiBDdXN0b21FdmVudDx7IGlkZW50aWZpZXI6IHN0cmluZzsgY2hlY2tlZDogYm9vbGVhbiB9Pik6IHZvaWQge1xuICAgIGNvbnN0IHsgaWRlbnRpZmllciB9ID0gZS5kZXRhaWw7XG5cbiAgICBjb25zdCBob3RzcG90ID0gdGhpcy5fY2hvaWNlRWxlbWVudHMuZmluZChlbCA9PiBlbC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSA9PT0gaWRlbnRpZmllcikgYXMgSG90c3BvdENob2ljZTtcblxuICAgIGNvbnN0IG1heFNlbGVjdGlvbiA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmxlbmd0aDtcbiAgICBpZiAoIXRoaXMuY2hvaWNlT3JkZXJpbmcpIHtcbiAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSB0cnVlO1xuICAgICAgaWYgKGhvdHNwb3Qub3JkZXIgPT0gbnVsbCkge1xuICAgICAgICBpZiAoKHRoaXMuX2Nob2ljZUVsZW1lbnRzIGFzIEhvdHNwb3RDaG9pY2VbXSkuZmlsdGVyKGkgPT4gaS5vcmRlciA+IDApLmxlbmd0aCA+PSBtYXhTZWxlY3Rpb24pIHtcbiAgICAgICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuOyAvLyBkb24ndCBkbyBhbnl0aGluZyBpZiB1c2VyIGFscmVhZHkgc2VsZWN0ZWQgNSBpbWFnZXMuXG4gICAgICAgIH1cbiAgICAgICAgaG90c3BvdC5vcmRlciA9ICh0aGlzLl9jaG9pY2VFbGVtZW50cyBhcyBIb3RzcG90Q2hvaWNlW10pLmZpbHRlcihpID0+ICEhaS5vcmRlcikubGVuZ3RoICsgMTtcbiAgICAgICAgdGhpcy5jaG9pY2VPcmRlcmluZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAodGhpcy5fY2hvaWNlRWxlbWVudHMgYXMgSG90c3BvdENob2ljZVtdKS5mb3JFYWNoKGhvdHNwb3QgPT4ge1xuICAgICAgICAgIGlmIChob3RzcG90Lm9yZGVyID4gaG90c3BvdC5vcmRlcikge1xuICAgICAgICAgICAgaG90c3BvdC5vcmRlci0tO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaG90c3BvdDtcbiAgICAgICAgfSk7XG4gICAgICAgIGhvdHNwb3Qub3JkZXIgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGhpcy5jaG9pY2VPcmRlcmluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG5cbiAgICBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignYWN0aXZhdGUtcXRpLWhvdHNwb3QtY2hvaWNlJywgdGhpcy5zZXRIb3RzcG90T3JkZXIpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncmVnaXN0ZXItcXRpLWhvdHNwb3QtY2hvaWNlJywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWN0aXZhdGUtcXRpLWhvdHNwb3QtY2hvaWNlJywgdGhpcy5zZXRIb3RzcG90T3JkZXIpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVnaXN0ZXItcXRpLWhvdHNwb3QtY2hvaWNlJywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbic6IFF0aUdyYXBoaWNPcmRlckludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgcG9zaXRpb25Ib3RzcG90cyB9IGZyb20gJy4uL2ludGVybmFsL2hvdHNwb3RzL2hvdHNwb3QnO1xuaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ob3RzcG90LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlIb3RzcG90SW50ZXJhY3Rpb24gZXh0ZW5kcyBDaG9pY2VzTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktaG90c3BvdC1jaG9pY2UnKSB7XG4gIC8vIGRvIG5vdCBzZWxlY3QgKCBoaWdobGlnaHQgYmx1ZSwgdGhlIGltYWdlKVxuICAvLyB0YXJnZXQgdGhlIG1haW4gc2xvdCBtYWtlIGl0IHJlbGF0aXZlIGFuZCBmaXQgd2l0aCB0aGUgY29udGVuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgc2xvdDpub3QoW25hbWU9J3Byb21wdCddKSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogcXRpLWhvdHNwb3QtY2hvaWNlIHJlbGF0aXZlIHRvIHRoZSBzbG90ICovXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7IC8qIGhvdHNwb3RzIG5vdCBzdHJldGNoaW5nIGZ1cnRoZXIgaWYgaW1hZ2UgaXMgYXQgbWF4IHNpemUgKi9cbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChpbWcpIHtcbiAgICAgICAgLyogaW1hZ2Ugbm90IHNlbGVjdGFibGUgYW55bW9yZSAqL1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgIC8qIHdpZHRoOjEwMCU7ICovXG4gICAgICB9XG4gICAgYFxuICBdO1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPCEtLSBzbG90IGZvciB0aGUgcHJvbXB0IC0tPlxuICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPCEtLSBzbG90IGZvciB0aGUgaW1hZ2UgYW5kIGhvdHNwb3RzIC0tPlxuICAgIGA7XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIoZTogQ3VzdG9tRXZlbnQ8UXRpSG90c3BvdENob2ljZT4pOiB2b2lkIHtcbiAgICBjb25zdCBpbWcgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgY29uc3QgaG90c3BvdCA9IGUudGFyZ2V0IGFzIFF0aUhvdHNwb3RDaG9pY2U7XG4gICAgY29uc3QgY29vcmRzID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpO1xuICAgIGNvbnN0IHNoYXBlID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ3NoYXBlJyk7XG4gICAgY29uc3QgY29vcmRzTnVtYmVyID0gY29vcmRzLnNwbGl0KCcsJykubWFwKHMgPT4gcGFyc2VJbnQocykpO1xuXG4gICAgcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItY2hvaWNlJywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaG90c3BvdC1pbnRlcmFjdGlvbic6IFF0aUhvdHNwb3RJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEFjdGl2ZUVsZW1lbnRNaXhpbiB9IGZyb20gJy4vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuXG4vKiBcbnF0aS1tYXRjaC1pbnRlcmFjdGlvblxucXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvblxuKi9cbkBjdXN0b21FbGVtZW50KCdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbi8vIHRzbGludDpkaXNhYmxlOiBpbmRlbnRcbmV4cG9ydCBjbGFzcyBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlIGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJykge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICB9XG4gICAgc2xvdCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICBzbG90W25hbWU9J3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnXSB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG4gIGA7XG5cbiAgLyoqIHRoZSBtaW5pbWFsIG51bWJlciBvZiBzZWxlY3Rpb25zIGEgY2FuZGlkYXRlIG11c3QgbWFrZSAqL1xuICBAcHJvcGVydHkoe1xuICAgIHR5cGU6IE51bWJlcixcbiAgICBhdHRyaWJ1dGU6ICdtYXRjaC1taW4nXG4gIH0pXG4gIHB1YmxpYyBtYXRjaE1pbjogbnVtYmVyID0gMDtcblxuICAvKiogdGhlIG1heGltdW0gbnVtYmVyIG9mIHNlbGVjdGlvbnMgYSBjYW5kaWRhdGUgbXVzdCBtYWtlLCB0aGUgb3RoZXIgb3B0aW9ucyB3aWxsIGJlIGRpc2FibGVkIHdoZW4gbWF4IG9wdGlvbnMgaXMgY2hlY2tlZCAqL1xuICBAcHJvcGVydHkoe1xuICAgIHR5cGU6IE51bWJlcixcbiAgICBhdHRyaWJ1dGU6ICdtYXRjaC1tYXgnXG4gIH0pXG4gIHB1YmxpYyBtYXRjaE1heDogbnVtYmVyID0gMTtcblxuICBAcHJvcGVydHkoe1xuICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgYXR0cmlidXRlOiAnZml4ZWQnXG4gIH0pXG4gIHB1YmxpYyBmaXhlZCA9IGZhbHNlO1xuXG4gIC8vIHBrOiBUaGlzIG5lZWRzIHNvbWUgZXhwbGFuYXRpb25cbiAgLy8gaW4gdGhlIGFzc29jaWF0ZSBpbnRlcmFjdGlvbiB0aGVyZSBpcyBhIHNwZWNpYWwgc2xvdCBmb3IgdGhlc2UgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZXNcbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3BhcnQnLCAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpO1xuICB9XG5cbiAgLy8gcGs6IFRoaXMgbmVlZHMgc29tZSBleHBsYW5hdGlvblxuICAvLyBpbiBxdGktbWF0Y2gtaW50ZXJhY3Rpb24sIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UgaXMgdXNlZCB0byBkZW5vdGUgdGhlXG4gIC8vIGRyYWdnYWJsZSwgYnV0IGFsc28gdGhlIGRyb3BwYWJsZS4gV0VJUkQuLiBidXQgbGV0cyBkZWFsIHdpdGggaXQuXG4gIC8vIFNvIHdlIGhhdmUgYSBzbG90IGZvciB3aGVuZXZlciBhbm90aGVyIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UgaXMgZHJvcHBlZCBpbiBoZXJlLlxuICAvLyBBbmQgd2UgaGF2ZSBzbG90IGZvciBjb250ZW50IGxpa2UgaW4gdGhpcyBhc3NvY2lhdGUgaW50ZXJhY3Rpb25cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNsb3QgcGFydD1cInNsb3RcIj48L3Nsb3Q+XG4gICAgICA8c2xvdCBwYXJ0PVwiZHJvcHNsb3RcIiBuYW1lPVwicXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZVwiPjwvc2xvdD5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnOiBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0Jztcbi8vIGltcG9ydCBjb21wb25lbnRTdHlsZXMgZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3N0eWxlcy9jb21wb25lbnQuc3R5bGVzJztcblxuLyogJHtjb21wb25lbnRTdHlsZXN9ICovXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIHNsb3Qge1xuICAgIC8qIHNsb3Qgd2hlcmUgdGhlICovXG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGdhcDogMC41cmVtO1xuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyAvKiBwcmV2ZW50cyB0aGUgZHJhZyBhbmQgZHJvcCBjb250YWluZXIgc2xvdHMgaGF2aW5nIHRoZSBzYW1lIGhlaWdodCAqL1xuICB9XG4gIDpob3N0KC5xdGktY2hvaWNlcy10b3ApIHNsb3Qge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLWJvdHRvbSkgc2xvdCB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlO1xuICB9XG4gIDpob3N0KC5xdGktY2hvaWNlcy1sZWZ0KSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICB9XG4gIDpob3N0KC5xdGktY2hvaWNlcy1yaWdodCkgc2xvdCB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICB9XG4gIHNsb3RbbmFtZT0ncHJvbXB0J10ge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG4gIDo6c2xvdHRlZChxdGktc2ltcGxlLW1hdGNoLXNldCkge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGUgZHJhZyBhbmQgZHJvcCBjb250YWluZXIgc2xvdHMgaGF2ZSB0aGUgc2FtZSB3aWR0aCAqL1xuICAgIGZsZXg6IDE7XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgQ1NTUmVzdWx0R3JvdXAsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VJbnRlcmFjdGlvbiB9IGZyb20gJy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0Jztcbi8vIGltcG9ydCB7IFRvdWNoRHJhZ0FuZERyb3AgfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AnO1xuaW1wb3J0ICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCB7IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24uc3R5bGVzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5pbnRlcmZhY2UgQ29sdW1uIHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUm93IHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBpc0NoZWNrZWQ6IGJvb2xlYW47XG59XG5cbkBjdXN0b21FbGVtZW50KCdxdGktbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aU1hdGNoSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oXG4gIEludGVyYWN0aW9uLFxuICAncXRpLXNpbXBsZS1tYXRjaC1zZXQ6Zmlyc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyxcbiAgZmFsc2UsXG4gICdxdGktc2ltcGxlLW1hdGNoLXNldDpsYXN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSdcbikge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICByb3dzOiBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlW107XG4gIGNvbHM6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2VbXTtcbiAgbGFzdENoZWNrZWRSYWRpbzogSFRNTElucHV0RWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIEBzdGF0ZSgpIF9yZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10gPSBbXTtcbiAgLy8gZHJhZ0Ryb3BBcGk6IFRvdWNoRHJhZ0FuZERyb3A7XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKSkgcmV0dXJuIHN1cGVyLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgIGVsc2UgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlIGFzIHN0cmluZ1tdO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZ1tdKSB7XG4gICAgaWYgKCF0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKSkgc3VwZXIudmFsdWUgPSB2YWw7XG4gICAgZWxzZSB0aGlzLl9yZXNwb25zZSA9IHZhbDtcbiAgfVxuICBAc3RhdGUoKSBjb3JyZWN0T3B0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdyZXNwb25zZS1pZGVudGlmaWVyJyB9KSByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZyA9ICcnO1xuXG4gIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpID0gbmV3IFRvdWNoRHJhZ0FuZERyb3AoKTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpLmFkZERyYWdnYWJsZUVsZW1lbnRzKFxuICAgIC8vICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgIC8vICk7XG4gICAgLy8gdGhpcy5kcmFnRHJvcEFwaS5hZGREcm9wcGFibGVFbGVtZW50cyhcbiAgICAvLyAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6bGFzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgIC8vICk7XG4gICAgdGhpcy5yb3dzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlPihcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6Zmlyc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbiAgICApO1xuICAgIHRoaXMuY29scyA9IEFycmF5LmZyb208UXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZT4oXG4gICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0Omxhc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbiAgICApO1xuXG4gICAgdGhpcy52YWx1ZSA9IFtdO1xuICB9XG5cbiAgaGFuZGxlUmFkaW9DbGljayA9IGUgPT4ge1xuICAgIGNvbnN0IHJhZGlvID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBpZiAodGhpcy5sYXN0Q2hlY2tlZFJhZGlvID09PSByYWRpbykge1xuICAgICAgcmFkaW8uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gbnVsbDtcbiAgICAgIHRoaXMuaGFuZGxlUmFkaW9DaGFuZ2UoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IHJhZGlvO1xuICAgIH1cbiAgfTtcblxuICBoYW5kbGVSYWRpb0NoYW5nZSA9IGUgPT4ge1xuICAgIGNvbnN0IGNoZWNrYm94ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCB2YWx1ZSA9IGNoZWNrYm94LnZhbHVlO1xuICAgIGNvbnN0IG5hbWUgPSBjaGVja2JveC5uYW1lO1xuICAgIGNvbnN0IHR5cGUgPSBjaGVja2JveC50eXBlO1xuXG4gICAgaWYgKGNoZWNrYm94LmNoZWNrZWQpIHtcbiAgICAgIGlmICghdGhpcy52YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gW3ZhbHVlXTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIodiA9PiB2LmluZGV4T2YobmFtZSkgPT09IC0xKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gWy4uLnRoaXMudmFsdWUsIHZhbHVlXTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IGNoZWNrYm94O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSk7XG4gICAgICB0aGlzLmxhc3RDaGVja2VkUmFkaW8gPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxSZXNwb25zZUludGVyYWN0aW9uPigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSA/IFsuLi50aGlzLnZhbHVlXSA6IHRoaXMudmFsdWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9O1xuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UocmVzcG9uc2VWYWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAocmVzcG9uc2VWYWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2VWYWx1ZSkpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbnMgPSByZXNwb25zZVZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSB7XG4gICAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PiA8c2xvdD48L3Nsb3Q+YDtcbiAgICB9XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHRhYmxlPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgJHt0aGlzLmNvbHMubWFwKChjb2wsIGkpID0+IGh0bWxgPHRoIHBhcnQ9XCJyLWhlYWRlclwiPiR7dW5zYWZlSFRNTChjb2wuaW5uZXJIVE1MKX08L3RoPmApfVxuICAgICAgICA8L3RyPlxuXG4gICAgICAgICR7dGhpcy5yb3dzLm1hcChcbiAgICAgICAgICAocm93LCBySW5kZXgpID0+XG4gICAgICAgICAgICBodG1sYDx0cj5cbiAgICAgICAgICAgICAgPHRkIHBhcnQ9XCJjLWhlYWRlclwiPiR7dW5zYWZlSFRNTChyb3cuaW5uZXJIVE1MKX08L3RkPlxuICAgICAgICAgICAgICAke3RoaXMuY29scy5tYXAoKGNvbCwgY0luZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93SWQgPSByb3cuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sSWQgPSBjb2wuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBgJHtyb3dJZH0gJHtjb2xJZH1gO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSW5Sb3dDb3VudCA9IHRoaXMudmFsdWUuZmlsdGVyKHYgPT4gdi5zcGxpdCgnICcpWzBdID09PSByb3dJZCkubGVuZ3RoIHx8IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IHRoaXMudmFsdWUuaW5jbHVkZXModmFsdWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBgcmIgJHtjaGVja2VkID8gJ3JiLWNoZWNrZWQnIDogJyd9ICR7dGhpcy5jb3JyZWN0T3B0aW9ucy5pbmNsdWRlcyh2YWx1ZSkgPyAncmItY29ycmVjdCcgOiAnJ31gO1xuICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgaWYgbWF0Y2ggbWF4IGlzIGdyZWF0ZXIgdGhhbiAxIGFuZCBtYXggaXMgcmVhY2hlZFxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc2FibGUgPVxuICAgICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICA6IHJvdy5tYXRjaE1heCA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICA6IHNlbGVjdGVkSW5Sb3dDb3VudCA+PSByb3cubWF0Y2hNYXggJiYgIWNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxgPHRkPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9JHtyb3cubWF0Y2hNYXggPT09IDEgPyAncmFkaW8nIDogYGNoZWNrYm94YH1cbiAgICAgICAgICAgICAgICAgICAgcGFydD0ke3BhcnR9XG4gICAgICAgICAgICAgICAgICAgIG5hbWU9JHtyb3dJZH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9JHt2YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgLmRpc2FibGVkPSR7ZGlzYWJsZX1cbiAgICAgICAgICAgICAgICAgICAgQGNoYW5nZT0ke2UgPT4gdGhpcy5oYW5kbGVSYWRpb0NoYW5nZShlKX1cbiAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7ZSA9PiAocm93Lm1hdGNoTWF4ID09PSAxID8gdGhpcy5oYW5kbGVSYWRpb0NsaWNrKGUpIDogbnVsbCl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvdGQ+YDtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L3RyPmBcbiAgICAgICAgKX1cbiAgICAgIDwvdGFibGU+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1tZWRpYS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpTWVkaWFJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgcHJpdmF0ZSBfdmFsdWUgPSAwO1xuICByZXNldCgpIHtcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gICAgLy8gbWF5YmUgY2hlY2sgaWYgdGhlIG1lZGlhIGhhcyBiZWVuIHBsYXllZD9cbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlLnRvU3RyaW5nKCk7XG4gIH1cblxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGNvbnN0IGlzTnVtYmVyID0gIWlzTmFOKHBhcnNlSW50KHZhbC50b1N0cmluZygpKSk7XG4gICAgaWYgKGlzTnVtYmVyKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHBhcnNlSW50KHZhbC50b1N0cmluZygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5JbnRlcmFjdGlvbi5wcm9wZXJ0aWVzLFxuICAgICAgLi4ue1xuICAgICAgICBzdGVwOiB7XG4gICAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICAgIGF0dHJpYnV0ZTogJ3N0ZXAnLFxuICAgICAgICAgIGRlZmF1bHQ6IDEwXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtjc3NgYF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAvLyBnZXQgYXVkaW8sIHZpZGVvIG9mIG9iamVjdCB0YWcuXG4gICAgY29uc3QgbWVkaWFPYmplY3QgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2F1ZGlvJykgfHwgdGhpcy5xdWVyeVNlbGVjdG9yKCd2aWRlbycpIHx8IHRoaXMucXVlcnlTZWxlY3Rvcignb2JqZWN0Jyk7XG4gICAgaWYgKG1lZGlhT2JqZWN0KSB7XG4gICAgICAvLyBsaXN0ZW4gdG8gZW5kZWQgZXZlbnRcbiAgICAgIG1lZGlhT2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgKCkgPT4ge1xuICAgICAgICAvLyBzZXQgdmFsdWUgdG8gMFxuICAgICAgICAvLyBjaGVjayBpZiB0aGlzLnZhbHVlIGlzIGEgbnVtYmVyXG4gICAgICAgIHRoaXMuX3ZhbHVlKys7XG4gICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMudmFsdWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1tZWRpYS1pbnRlcmFjdGlvbic6IFF0aU1lZGlhSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgdW5zYWZlSFRNTCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3Vuc2FmZS1odG1sLmpzJztcbmltcG9ydCB7IERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4nO1xuaW1wb3J0IHsgU2h1ZmZsZU1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvc2h1ZmZsZS9zaHVmZmxlLW1peGluJzsgLy8gSW1wb3J0IHRoZSBtaXhpblxuaW1wb3J0IHsgUXRpU2ltcGxlQ2hvaWNlIH0gZnJvbSAnLi4vcXRpLXNpbXBsZS1jaG9pY2UnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3JkZXItaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aU9yZGVySW50ZXJhY3Rpb24gZXh0ZW5kcyBTaHVmZmxlTWl4aW4oXG4gIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihJbnRlcmFjdGlvbiwgYHF0aS1zaW1wbGUtY2hvaWNlYCwgdHJ1ZSwgJ2Ryb3AtbGlzdCcpLFxuICAncXRpLXNpbXBsZS1jaG9pY2UnXG4pIHtcbiAgY2hpbGRyZW5NYXA6IEVsZW1lbnRbXTtcblxuICBAc3RhdGUoKSBuckNob2ljZXM6IG51bWJlciA9IDA7XG4gIEBzdGF0ZSgpIGNvcnJlY3RSZXNwb25zZXM6IHN0cmluZ1tdID0gW107XG4gIEBzdGF0ZSgpIHNob3dDb3JyZWN0UmVzcG9uc2VzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIG9yaWVudGF0aW9uIG9mIGNob2ljZXMgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIHB1YmxpYyBvcmllbnRhdGlvbjogJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJztcblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIFtwYXJ0PSdkcmFncyddIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICB9XG5cbiAgICAgIFtwYXJ0PSdkcm9wcyddIHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC1hdXRvLWZsb3c6IGNvbHVtbjtcbiAgICAgICAgZ3JpZC1hdXRvLWNvbHVtbnM6IDFmcjtcbiAgICAgIH1cblxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSdob3Jpem9udGFsJ10pIFtwYXJ0PSdkcmFncyddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0naG9yaXpvbnRhbCddKSBbcGFydD0nZHJvcHMnXSB7XG4gICAgICAgIGdyaWQtYXV0by1mbG93OiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J3ZlcnRpY2FsJ10pIFtwYXJ0PSdkcmFncyddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0ndmVydGljYWwnXSkgW3BhcnQ9J2Ryb3BzJ10ge1xuICAgICAgICBncmlkLWF1dG8tZmxvdzogcm93O1xuICAgICAgfVxuXG4gICAgICBbcGFydD0nZHJvcC1saXN0J10ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgZmxleDogMTtcbiAgICAgIH1cblxuICAgICAgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZ2FwOiAwLjVyZW07XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtdG9wKSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLWJvdHRvbSkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlO1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLWxlZnQpIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtcmlnaHQpIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gICAgaWYgKHRoaXMubnJDaG9pY2VzIDwgY2hvaWNlcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubnJDaG9pY2VzID0gY2hvaWNlcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj4gPC9zbG90PlxuICAgICAgPGRpdiBwYXJ0PVwiY29udGFpbmVyXCI+XG4gICAgICAgIDxzbG90IHBhcnQ9XCJkcmFnc1wiPiA8L3Nsb3Q+XG4gICAgICAgIDxkaXYgcGFydD1cImRyb3BzXCI+XG4gICAgICAgICAgJHtBcnJheS5mcm9tKEFycmF5KHRoaXMubnJDaG9pY2VzKSkubWFwKFxuICAgICAgICAgICAgKF8sIGkpID0+XG4gICAgICAgICAgICAgIGh0bWxgPGRyb3AtbGlzdCBwYXJ0PVwiZHJvcC1saXN0XCIgaWRlbnRpZmllcj1cImRyb3BsaXN0JHtpfVwiPjwvZHJvcC1saXN0PiR7dGhpcy5zaG93Q29ycmVjdFJlc3BvbnNlcyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuY29ycmVjdFJlc3BvbnNlcy5sZW5ndGggPiBpXG4gICAgICAgICAgICAgICAgICA/IHVuc2FmZUhUTUwoYDxzcGFuIHBhcnQ9J2NvcnJlY3QtcmVzcG9uc2UnPiR7dGhpcy5jb3JyZWN0UmVzcG9uc2VzW2ldfTwvc3Bhbj5gKVxuICAgICAgICAgICAgICAgICAgOiAnJ31gXG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICB9XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICB0aGlzLnNob3dDb3JyZWN0UmVzcG9uc2VzID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29ycmVjdFJlc3BvbnNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlcyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuXG4gICAgICByZXNwb25zZXMuZm9yRWFjaCgocmVzcG9uc2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGxldCBzaW1wbGVDaG9pY2UgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoYHF0aS1zaW1wbGUtY2hvaWNlW2lkZW50aWZpZXI9XCIke3Jlc3BvbnNlfVwiXWApO1xuICAgICAgICBpZiAoIXNpbXBsZUNob2ljZSkge1xuICAgICAgICAgIHNpbXBsZUNob2ljZSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGBxdGktc2ltcGxlLWNob2ljZVtpZGVudGlmaWVyPVwiJHtyZXNwb25zZX1cIl1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHQgPSBzaW1wbGVDaG9pY2U/LnRleHRDb250ZW50LnRyaW0oKTtcbiAgICAgICAgdGhpcy5jb3JyZWN0UmVzcG9uc2VzID0gWy4uLnRoaXMuY29ycmVjdFJlc3BvbnNlcywgdGV4dF07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dDb3JyZWN0UmVzcG9uc2VzID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIHNvbWUgaW50ZXJhY3Rpb25zIGhhdmUgYSBkaWZmZXJlbnQgd2F5IG9mIGdldHRpbmcgdGhlIHJlc3BvbnNlXG4gIC8vIHRoaXMgaXMgY2FsbGVkIGZyb20gdGhlIGRyYWcgYW5kIGRyb3AgbWl4aW4gY2xhc3NcbiAgLy8geW91IGhhdmUgdG8gaW1wbGVtZW50IHlvdXIgb3duIGdldFJlc3BvbnNlIG1ldGhvZCBpbiB0aGUgc3VwZXJjbGFzc1xuICAvLyBjYXVzZSB0aGV5IGFyZSBkaWZmZXJlbnQgZm9yIHNvbWUgaW50ZXJhY3Rpb25zLlxuICAvLyBNSDogaXMgdGhpcyBmdW5jdGlvbiBjYWxsZWQ/IFNob3VsZG4ndCB3ZSB1c2UgZ2V0VmFsdWU/XG4gIHByb3RlY3RlZCBnZXRSZXNwb25zZSgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZHJvcHBhYmxlcyA9IEFycmF5LmZyb208UXRpU2ltcGxlQ2hvaWNlPih0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnZHJvcC1saXN0JykpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBkcm9wcGFibGVzLm1hcChkcm9wcGFibGUgPT4ge1xuICAgICAgY29uc3QgZHJhZ3NJbkRyb3BwYWJsZSA9IGRyb3BwYWJsZS5xdWVyeVNlbGVjdG9yQWxsKCdbcXRpLWRyYWdnYWJsZT1cInRydWVcIl0nKTtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXJzID0gQXJyYXkuZnJvbShkcmFnc0luRHJvcHBhYmxlKS5tYXAoZCA9PiBkLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpKTtcbiAgICAgIHJldHVybiBbLi4uaWRlbnRpZmllcnNdLmpvaW4oJyAnKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKSB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk7XG4gICAgdGhpcy5jaGlsZHJlbk1hcCA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgICB0aGlzLmNoaWxkcmVuTWFwLmZvckVhY2goZWwgPT4gZWwuc2V0QXR0cmlidXRlKCdwYXJ0JywgJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1vcmRlci1pbnRlcmFjdGlvbic6IFF0aU9yZGVySW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgY2xhc3MgUXRpU1Bvc2l0aW9uT2JqZWN0SW50ZXJhY3Rpb24gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGN1cnNvcjogbW92ZTtcbiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICAgICAgfVxuICAgIGBcbiAgXTtcbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uJywgUXRpU1Bvc2l0aW9uT2JqZWN0SW50ZXJhY3Rpb24pO1xuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXBvc2l0aW9uLW9iamVjdC1zdGFnZScpXG5leHBvcnQgY2xhc3MgUXRpUG9zaXRpb25PYmplY3RTdGFnZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBjaG9pY2VPcmRlcmluZzogYm9vbGVhbjtcbiAgc3RhcnRYOiBhbnk7XG4gIHN0YXJ0WTogYW55O1xuICBkcmFnRWxlbWVudDogYW55O1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlbW92ZU1vdmVMaXN0ZW5lciA9IHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIgPSB0aGlzLmRyYWdFbGVtZW50SGFuZGxlci5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLy8gRGVmaW5lIGEgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSBtb3VzZW1vdmUgZXZlbnQgb24gdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gIGRyYWdFbGVtZW50SGFuZGxlcihldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIHRoZSBtb3VzZSBoYXMgbW92ZWQgc2luY2UgdGhlIGxhc3QgZXZlbnRcbiAgICBjb25zdCBkZWx0YVggPSBldmVudC5jbGllbnRYIC0gdGhpcy5zdGFydFg7XG4gICAgY29uc3QgZGVsdGFZID0gZXZlbnQuY2xpZW50WSAtIHRoaXMuc3RhcnRZO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgICB0aGlzLmRyYWdFbGVtZW50LnN0eWxlLmxlZnQgPSB0aGlzLmRyYWdFbGVtZW50Lm9mZnNldExlZnQgKyBkZWx0YVggKyAncHgnO1xuICAgIHRoaXMuZHJhZ0VsZW1lbnQuc3R5bGUudG9wID0gdGhpcy5kcmFnRWxlbWVudC5vZmZzZXRUb3AgKyBkZWx0YVkgKyAncHgnO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgbW91c2VcbiAgICB0aGlzLnN0YXJ0WCA9IGV2ZW50LmNsaWVudFg7XG4gICAgdGhpcy5zdGFydFkgPSBldmVudC5jbGllbnRZO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGEpOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoYSk7XG5cbiAgICAvLyBHZXQgdGhlIGRyYWdnYWJsZSBhbmQgZHJvcCB6b25lIGVsZW1lbnRzXG4gICAgdGhpcy5kcmFnRWxlbWVudCA9IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbj5pbWcnKTtcbiAgICAvLyBjb25zdCBjYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbnZhcycpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB2YXJpYWJsZXMgZm9yIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgICB0aGlzLnN0YXJ0WCA9IDA7XG4gICAgdGhpcy5zdGFydFkgPSAwO1xuXG4gICAgLy8gQWRkIGEgbW91c2Vkb3duIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuZHJhZ0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAvLyBTYXZlIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgbW91c2VcbiAgICAgIHRoaXMuc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcbiAgICAgIHRoaXMuc3RhcnRZID0gZXZlbnQuY2xpZW50WTtcblxuICAgICAgLy8gQWRkIGEgbW91c2Vtb3ZlIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBkb2N1bWVudFxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIsIHRydWUpO1xuICAgIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLnJlbW92ZU1vdmVMaXN0ZW5lcik7XG4gIH1cblxuICByZW1vdmVNb3ZlTGlzdGVuZXIoZXZlbnQpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciwgdHJ1ZSk7XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UnOiBRdGlQb3NpdGlvbk9iamVjdFN0YWdlO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbmltcG9ydCB7QXR0cmlidXRlUGFydCwgbm9DaGFuZ2V9IGZyb20gJy4uL2xpdC1odG1sLmpzJztcbmltcG9ydCB7XG4gIGRpcmVjdGl2ZSxcbiAgRGlyZWN0aXZlLFxuICBEaXJlY3RpdmVQYXJhbWV0ZXJzLFxuICBQYXJ0SW5mbyxcbiAgUGFydFR5cGUsXG59IGZyb20gJy4uL2RpcmVjdGl2ZS5qcyc7XG5cbi8qKlxuICogQSBrZXktdmFsdWUgc2V0IG9mIENTUyBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMuXG4gKlxuICogVGhlIGtleSBzaG91bGQgYmUgZWl0aGVyIGEgdmFsaWQgQ1NTIHByb3BlcnR5IG5hbWUgc3RyaW5nLCBsaWtlXG4gKiBgJ2JhY2tncm91bmQtY29sb3InYCwgb3IgYSB2YWxpZCBKYXZhU2NyaXB0IGNhbWVsIGNhc2UgcHJvcGVydHkgbmFtZVxuICogZm9yIENTU1N0eWxlRGVjbGFyYXRpb24gbGlrZSBgYmFja2dyb3VuZENvbG9yYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHlsZUluZm8ge1xuICBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbDtcbn1cblxuY29uc3QgaW1wb3J0YW50ID0gJ2ltcG9ydGFudCc7XG4vLyBUaGUgbGVhZGluZyBzcGFjZSBpcyBpbXBvcnRhbnRcbmNvbnN0IGltcG9ydGFudEZsYWcgPSAnICEnICsgaW1wb3J0YW50O1xuLy8gSG93IG1hbnkgY2hhcmFjdGVycyB0byByZW1vdmUgZnJvbSBhIHZhbHVlLCBhcyBhIG5lZ2F0aXZlIG51bWJlclxuY29uc3QgZmxhZ1RyaW0gPSAwIC0gaW1wb3J0YW50RmxhZy5sZW5ndGg7XG5cbmNsYXNzIFN0eWxlTWFwRGlyZWN0aXZlIGV4dGVuZHMgRGlyZWN0aXZlIHtcbiAgcHJpdmF0ZSBfcHJldmlvdXNTdHlsZVByb3BlcnRpZXM/OiBTZXQ8c3RyaW5nPjtcblxuICBjb25zdHJ1Y3RvcihwYXJ0SW5mbzogUGFydEluZm8pIHtcbiAgICBzdXBlcihwYXJ0SW5mbyk7XG4gICAgaWYgKFxuICAgICAgcGFydEluZm8udHlwZSAhPT0gUGFydFR5cGUuQVRUUklCVVRFIHx8XG4gICAgICBwYXJ0SW5mby5uYW1lICE9PSAnc3R5bGUnIHx8XG4gICAgICAocGFydEluZm8uc3RyaW5ncz8ubGVuZ3RoIGFzIG51bWJlcikgPiAyXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdUaGUgYHN0eWxlTWFwYCBkaXJlY3RpdmUgbXVzdCBiZSB1c2VkIGluIHRoZSBgc3R5bGVgIGF0dHJpYnV0ZSAnICtcbiAgICAgICAgICAnYW5kIG11c3QgYmUgdGhlIG9ubHkgcGFydCBpbiB0aGUgYXR0cmlidXRlLidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKHN0eWxlSW5mbzogUmVhZG9ubHk8U3R5bGVJbmZvPikge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzdHlsZUluZm8pLnJlZHVjZSgoc3R5bGUsIHByb3ApID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gc3R5bGVJbmZvW3Byb3BdO1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgfVxuICAgICAgLy8gQ29udmVydCBwcm9wZXJ0eSBuYW1lcyBmcm9tIGNhbWVsLWNhc2UgdG8gZGFzaC1jYXNlLCBpLmUuOlxuICAgICAgLy8gIGBiYWNrZ3JvdW5kQ29sb3JgIC0+IGBiYWNrZ3JvdW5kLWNvbG9yYFxuICAgICAgLy8gVmVuZG9yLXByZWZpeGVkIG5hbWVzIG5lZWQgYW4gZXh0cmEgYC1gIGFwcGVuZGVkIHRvIGZyb250OlxuICAgICAgLy8gIGB3ZWJraXRBcHBlYXJhbmNlYCAtPiBgLXdlYmtpdC1hcHBlYXJhbmNlYFxuICAgICAgLy8gRXhjZXB0aW9uIGlzIGFueSBwcm9wZXJ0eSBuYW1lIGNvbnRhaW5pbmcgYSBkYXNoLCBpbmNsdWRpbmdcbiAgICAgIC8vIGN1c3RvbSBwcm9wZXJ0aWVzOyB3ZSBhc3N1bWUgdGhlc2UgYXJlIGFscmVhZHkgZGFzaC1jYXNlZCBpLmUuOlxuICAgICAgLy8gIGAtLW15LWJ1dHRvbi1jb2xvcmAgLS0+IGAtLW15LWJ1dHRvbi1jb2xvcmBcbiAgICAgIHByb3AgPSBwcm9wLmluY2x1ZGVzKCctJylcbiAgICAgICAgPyBwcm9wXG4gICAgICAgIDogcHJvcFxuICAgICAgICAgICAgLnJlcGxhY2UoLyg/Ol4od2Via2l0fG1venxtc3xvKXwpKD89W0EtWl0pL2csICctJCYnKVxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gc3R5bGUgKyBgJHtwcm9wfToke3ZhbHVlfTtgO1xuICAgIH0sICcnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHVwZGF0ZShwYXJ0OiBBdHRyaWJ1dGVQYXJ0LCBbc3R5bGVJbmZvXTogRGlyZWN0aXZlUGFyYW1ldGVyczx0aGlzPikge1xuICAgIGNvbnN0IHtzdHlsZX0gPSBwYXJ0LmVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAodGhpcy5fcHJldmlvdXNTdHlsZVByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcHJldmlvdXNTdHlsZVByb3BlcnRpZXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHN0eWxlSW5mbykpO1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKHN0eWxlSW5mbyk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIG9sZCBwcm9wZXJ0aWVzIHRoYXQgbm8gbG9uZ2VyIGV4aXN0IGluIHN0eWxlSW5mb1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0aGlzLl9wcmV2aW91c1N0eWxlUHJvcGVydGllcykge1xuICAgICAgLy8gSWYgdGhlIG5hbWUgaXNuJ3QgaW4gc3R5bGVJbmZvIG9yIGl0J3MgbnVsbC91bmRlZmluZWRcbiAgICAgIGlmIChzdHlsZUluZm9bbmFtZV0gPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9wcmV2aW91c1N0eWxlUHJvcGVydGllcyEuZGVsZXRlKG5hbWUpO1xuICAgICAgICBpZiAobmFtZS5pbmNsdWRlcygnLScpKSB7XG4gICAgICAgICAgc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAoc3R5bGUgYXMgYW55KVtuYW1lXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgb3IgdXBkYXRlIHByb3BlcnRpZXNcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gc3R5bGVJbmZvKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHN0eWxlSW5mb1tuYW1lXTtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzU3R5bGVQcm9wZXJ0aWVzLmFkZChuYW1lKTtcbiAgICAgICAgY29uc3QgaXNJbXBvcnRhbnQgPVxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuZW5kc1dpdGgoaW1wb3J0YW50RmxhZyk7XG4gICAgICAgIGlmIChuYW1lLmluY2x1ZGVzKCctJykgfHwgaXNJbXBvcnRhbnQpIHtcbiAgICAgICAgICBzdHlsZS5zZXRQcm9wZXJ0eShcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBpc0ltcG9ydGFudFxuICAgICAgICAgICAgICA/ICh2YWx1ZSBhcyBzdHJpbmcpLnNsaWNlKDAsIGZsYWdUcmltKVxuICAgICAgICAgICAgICA6ICh2YWx1ZSBhcyBzdHJpbmcpLFxuICAgICAgICAgICAgaXNJbXBvcnRhbnQgPyBpbXBvcnRhbnQgOiAnJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAoc3R5bGUgYXMgYW55KVtuYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub0NoYW5nZTtcbiAgfVxufVxuXG4vKipcbiAqIEEgZGlyZWN0aXZlIHRoYXQgYXBwbGllcyBDU1MgcHJvcGVydGllcyB0byBhbiBlbGVtZW50LlxuICpcbiAqIGBzdHlsZU1hcGAgY2FuIG9ubHkgYmUgdXNlZCBpbiB0aGUgYHN0eWxlYCBhdHRyaWJ1dGUgYW5kIG11c3QgYmUgdGhlIG9ubHlcbiAqIGV4cHJlc3Npb24gaW4gdGhlIGF0dHJpYnV0ZS4gSXQgdGFrZXMgdGhlIHByb3BlcnR5IG5hbWVzIGluIHRoZVxuICoge0BsaW5rIFN0eWxlSW5mbyBzdHlsZUluZm99IG9iamVjdCBhbmQgYWRkcyB0aGUgcHJvcGVydGllcyB0byB0aGUgaW5saW5lXG4gKiBzdHlsZSBvZiB0aGUgZWxlbWVudC5cbiAqXG4gKiBQcm9wZXJ0eSBuYW1lcyB3aXRoIGRhc2hlcyAoYC1gKSBhcmUgYXNzdW1lZCB0byBiZSB2YWxpZCBDU1NcbiAqIHByb3BlcnR5IG5hbWVzIGFuZCBzZXQgb24gdGhlIGVsZW1lbnQncyBzdHlsZSBvYmplY3QgdXNpbmcgYHNldFByb3BlcnR5KClgLlxuICogTmFtZXMgd2l0aG91dCBkYXNoZXMgYXJlIGFzc3VtZWQgdG8gYmUgY2FtZWxDYXNlZCBKYXZhU2NyaXB0IHByb3BlcnR5IG5hbWVzXG4gKiBhbmQgc2V0IG9uIHRoZSBlbGVtZW50J3Mgc3R5bGUgb2JqZWN0IHVzaW5nIHByb3BlcnR5IGFzc2lnbm1lbnQsIGFsbG93aW5nIHRoZVxuICogc3R5bGUgb2JqZWN0IHRvIHRyYW5zbGF0ZSBKYXZhU2NyaXB0LXN0eWxlIG5hbWVzIHRvIENTUyBwcm9wZXJ0eSBuYW1lcy5cbiAqXG4gKiBGb3IgZXhhbXBsZSBgc3R5bGVNYXAoe2JhY2tncm91bmRDb2xvcjogJ3JlZCcsICdib3JkZXItdG9wJzogJzVweCcsICctLXNpemUnOlxuICogJzAnfSlgIHNldHMgdGhlIGBiYWNrZ3JvdW5kLWNvbG9yYCwgYGJvcmRlci10b3BgIGFuZCBgLS1zaXplYCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSBzdHlsZUluZm9cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbGl0LmRldi9kb2NzL3RlbXBsYXRlcy9kaXJlY3RpdmVzLyNzdHlsZW1hcCBzdHlsZU1hcCBjb2RlIHNhbXBsZXMgb24gTGl0LmRldn1cbiAqL1xuZXhwb3J0IGNvbnN0IHN0eWxlTWFwID0gZGlyZWN0aXZlKFN0eWxlTWFwRGlyZWN0aXZlKTtcblxuLyoqXG4gKiBUaGUgdHlwZSBvZiB0aGUgY2xhc3MgdGhhdCBwb3dlcnMgdGhpcyBkaXJlY3RpdmUuIE5lY2Vzc2FyeSBmb3IgbmFtaW5nIHRoZVxuICogZGlyZWN0aXZlJ3MgcmV0dXJuIHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIHtTdHlsZU1hcERpcmVjdGl2ZX07XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdC5qcyc7XG5pbXBvcnQgeyBzdHlsZU1hcCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3N0eWxlLW1hcC5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVNlbGVjdFBvaW50SW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cbiAgICAgIHBvaW50LWNvbnRhaW5lciB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21heC1jaG9pY2VzJ1xuICB9KVxuICBwdWJsaWMgbWF4Q2hvaWNlczogbnVtYmVyID0gSW5maW5pdHk7XG5cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWluLWNob2ljZXMnXG4gIH0pXG4gIHB1YmxpYyBtaW5DaG9pY2VzOiBudW1iZXIgPSAwO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX3BvaW50czogc3RyaW5nW10gPSBbXTtcblxuICAvLyBSZWZlcmVuY2UgdG8gdGhlIGltYWdlIGVsZW1lbnRcbiAgcHJpdmF0ZSBfaW1nRWxlbWVudDogSFRNTEltYWdlRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8vIEV4dHJhY3RlZCBjbGljayBoYW5kbGVyIG1ldGhvZFxuICBwcml2YXRlIF9vbkltYWdlQ2xpY2sgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBpZiAodGhpcy5fcG9pbnRzLmxlbmd0aCA8IHRoaXMubWF4Q2hvaWNlcykge1xuICAgICAgY29uc3QgeCA9IGV2ZW50Lm9mZnNldFg7XG4gICAgICBjb25zdCB5ID0gZXZlbnQub2Zmc2V0WTtcblxuICAgICAgdGhpcy5fcG9pbnRzID0gWy4uLnRoaXMuX3BvaW50cywgYCR7eH0gJHt5fWBdO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fcG9pbnRzKTtcbiAgICB9XG4gIH07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHBvaW50LWNvbnRhaW5lcj5cbiAgICAgICAgJHtyZXBlYXQoXG4gICAgICAgICAgdGhpcy5fcG9pbnRzLFxuICAgICAgICAgIHBvaW50ID0+IHBvaW50LFxuICAgICAgICAgIChwb2ludCwgaW5kZXgpID0+IGh0bWxgXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHBhcnQ9XCJwb2ludFwiXG4gICAgICAgICAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKScsXG4gICAgICAgICAgICAgICAgbGVmdDogYCR7cG9pbnQuc3BsaXQoJyAnKVswXX1weGAsXG4gICAgICAgICAgICAgICAgdG9wOiBgJHtwb2ludC5zcGxpdCgnICcpWzFdfXB4YFxuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbW92ZSBwb2ludCBhdCAke3BvaW50fVwiXG4gICAgICAgICAgICAgIEBjbGljaz0keyhlOiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcG9pbnRzID0gdGhpcy5fcG9pbnRzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX3BvaW50cyk7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgYFxuICAgICAgICApfVxuICAgICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8L3BvaW50LWNvbnRhaW5lcj5gO1xuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fcG9pbnRzID0gW107XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcG9pbnRzLmxlbmd0aCA+PSB0aGlzLm1pbkNob2ljZXMgJiYgdGhpcy5fcG9pbnRzLmxlbmd0aCA8PSB0aGlzLm1heENob2ljZXM7XG4gIH1cblxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuX3BvaW50cyA9IEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbCA6IFt2YWxdO1xuICB9XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3BvaW50cztcbiAgfVxuXG4gIG92ZXJyaWRlIGZpcnN0VXBkYXRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pbWdFbGVtZW50ID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKTtcblxuICAgIGlmICh0aGlzLl9pbWdFbGVtZW50KSB7XG4gICAgICAvLyBBdHRhY2ggdGhlIGNsaWNrIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBpbWFnZSBlbGVtZW50XG4gICAgICB0aGlzLl9pbWdFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25JbWFnZUNsaWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKCdObyA8aW1nPiBlbGVtZW50IGZvdW5kIGluIDxxdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uPicpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBpZiAodGhpcy5faW1nRWxlbWVudCkge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBjbGljayBldmVudCBsaXN0ZW5lciBmcm9tIHRoZSBpbWFnZSBlbGVtZW50XG4gICAgICB0aGlzLl9pbWdFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25JbWFnZUNsaWNrKTtcbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbic6IFF0aVNlbGVjdFBvaW50SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIG5vdGhpbmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHF1ZXJ5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIFNsaWRlckludGVyYWN0aW9uLlR5cGUgKHF0aS1zbGlkZXItaW50ZXJhY3Rpb24pIHByZXNlbnRzIHRoZSBjYW5kaWRhdGUgd2l0aCBhIGNvbnRyb2wgZm9yIHNlbGVjdGluZyBhIG51bWVyaWNhbCB2YWx1ZSBiZXR3ZWVuIGEgbG93ZXIgYW5kIHVwcGVyIGJvdW5kLlxuICogQGRvY3VtZW50YXRpb24gaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5zNjF4Y3JqNHFjeWpcbiAqIEBzdGF0dXMgc3RhYmxlXG4gKiBAc2luY2UgNi4wXG4gKlxuICogQGV2ZW50IHF0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbiAtIGVtaXR0ZWQgd2hlbiB0aGUgaW50ZXJhY3Rpb24gd2FudHMgdG8gcmVnaXN0ZXIgaXRzZWxmXG4gKiBAZXZlbnQgcXRpLWludGVyYWN0aW9uLXJlc3BvbnNlIC0gZW1pdHRlZCB3aGVuIHRoZSBpbnRlcmFjdGlvbiBjaGFuZ2VzXG4gKlxuICogQGNzc3Byb3AgLS1zaG93LXZhbHVlIC0gc2hvd3MgdGhlIGN1cnJlbnQgdmFsdWUgd2hpbGUgc2xpZGluZ1xuICogQGNzc3Byb3AgLS1zaG93LXRpY2tzIC0gc2hvd3MgdGhlIHRpY2tzIGFjY29yZGluZyB0byBzdGVwc1xuICogQGNzc3Byb3AgLS1zaG93LWJvdW5kcyAtIHNob3dzIHZhbHVlIGZvciBsb3dlciBhbmQgdXBwZXIgYm91bmRhcnlcbiAqXG4gKiBAY3NzcGFydCBzbGlkZXIgLS0gc2xpZGVyIGlubHVkaW5nLCBib3VuZHMgYW5kIHRpY2tzIGFuZCB2YWx1ZSwgdXNlIGl0IGZvciBwYWRkaW5ncyBhbmQgbWFyZ2luc1xuICogQGNzc3BhcnQgYm91bmRzIC0tIGRpdiBmb3IgYm91bmRzLCBjb250YWluaW5nIHR3byBkaXZzIGZvciB3aXRoIG1pbiwgYW5kIG1heCBib3VuZHMgdmFsdWVcbiAqIEBjc3NwYXJ0IHRpY2tzIC0tIGRpdiBmb3IgdGlja3MsIHVzZSBsaW5lYWlyIGdyYWRpZW50IGFuZCBleHBvc2VkIGNzcyB2YXJpYWJsZXMgZm9yIHN0eWxpbmdcbiAqIEBjc3NwYXJ0IHJhaWwgLS0gZGl2IGZvciByYWlsLCBzdHlsZSBhY2NvcmRpbmcgdG8gbmVlZHNcbiAqIEBjc3NwYXJ0IGtub2IgLS0gZGl2LCBzaG91bGQgYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGVcbiAqIEBjc3NwYXJ0IHZhbHVlIC0tIGRpdiwgY29udGFpbmluZyB2YWx1ZVxuICpcbiAqIEBzbG90IC0gVGhlIGRlZmF1bHQgc2xvdCB3aGVyZSA8cXRpLXNpbXBsZS1jaG9pY2U+IG11c3QgYmUgcGxhY2VkLlxuICogQHNsb3QgcHJvbXB0IC0gc2xvdCB3aGVyZSB0aGUgcHJvbXB0IGlzIHBsYWNlZC5cbiAqL1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXNsaWRlci1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpU2xpZGVySW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHByaXZhdGUgX3ZhbHVlID0gMDtcbiAgY3NMaXZlOiBDU1NTdHlsZURlY2xhcmF0aW9uO1xuXG4gIEBxdWVyeSgnI2tub2InKVxuICBwcml2YXRlIF9rbm9iOiBIVE1MRWxlbWVudDtcblxuICBAcXVlcnkoJyNyYWlsJylcbiAgcHJpdmF0ZSBfcmFpbDogSFRNTEVsZW1lbnQ7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiwgYXR0cmlidXRlOiAnc3RlcC1sYWJlbCcgfSkgc3RlcExhYmVsID0gZmFsc2U7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSByZXZlcnNlID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfbWluOiBudW1iZXI7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnbG93ZXItYm91bmQnIH0pIHNldCBtaW4odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21pbiA9IHZhbHVlO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1taW4nLCBgJHt0aGlzLl9taW59YCk7XG4gIH1cbiAgZ2V0IG1pbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cblxuICBwcml2YXRlIF9tYXg6IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICd1cHBlci1ib3VuZCcgfSkgc2V0IG1heCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4ID0gdmFsdWU7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1tYXgnLCBgJHt0aGlzLl9tYXh9YCk7XG4gIH1cbiAgZ2V0IG1heCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9tYXg7XG4gIH1cblxuICBwcml2YXRlIF9zdGVwOiBudW1iZXI7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnc3RlcCcgfSkgc2V0IHN0ZXAodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3N0ZXAgPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLXN0ZXAnLCBgJHt0aGlzLl9zdGVwfWApO1xuICB9XG4gIGdldCBzdGVwKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3N0ZXA7XG4gIH1cblxuICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlRGlzYWJsZWRDaGFuZ2UgPSAob2xkLCBkaXNhYmxlZCkgPT4ge307XG5cbiAgQHdhdGNoKCdyZWFkb25seScsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZVJlYWRvbmx5Q2hhbmdlID0gKG9sZCwgcmVhZG9ubHkpID0+IHt9O1xuXG4gIHJlc2V0KCkge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlLnRvU3RyaW5nKCk7XG4gIH1cblxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGNvbnN0IGlzTnVtYmVyID0gIWlzTmFOKHBhcnNlSW50KHZhbC50b1N0cmluZygpKSk7XG4gICAgaWYgKGlzTnVtYmVyKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHBhcnNlSW50KHZhbC50b1N0cmluZygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gc3RhdGljIHNoYWRvd1Jvb3RPcHRpb25zOiBTaGFkb3dSb290SW5pdCA9IHsgLi4uTGl0RWxlbWVudC5zaGFkb3dSb290T3B0aW9ucywgZGVsZWdhdGVzRm9jdXM6IHRydWUsIG1vZGU6ICdvcGVuJyB9O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLyogdGhlIGNvbXB1dGVkIHN0eWxlIGlzIGEgbGl2ZSBwcm9wZXJ0eSwgd2UgdXNlIHRoaXMgdG8gZ2V0IGNzcyB2YXJpYWJsZXNcbiAgICBzZWUgcmVuZGVyIHRlbXBsYXRlICovXG4gICAgdGhpcy5jc0xpdmUgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMpO1xuICB9XG5cbiAgc2V0IHJlc3BvbnNlKG15UmVzcG9uc2U6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobXlSZXNwb25zZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1F0aVNsaWRlckludGVyYWN0aW9uOiByZXNwb25zZSBpcyBhbiBhcnJheSwgYnV0IHNob3VsZCBiZSBhIHNpbmdsZSB2YWx1ZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSW50KG15UmVzcG9uc2UpO1xuICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdRdGlTbGlkZXJJbnRlcmFjdGlvbjogcmVzcG9uc2UgaXMgbm90IGEgbnVtYmVyJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW2Nzc2BgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgLy8gY29udmVydCB0aGUgdmFsdWUsIHdoaWNoIGlzIHRoZSByZWFsIHNsaWRlciB2YWx1ZSB0byBhIHBlcmNlbnRhZ2UgZm9yIHRoZSBkb20uXG4gICAgaWYgKHRoaXMuX3ZhbHVlIDwgdGhpcy5taW4pIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5taW47XG4gICAgfVxuICAgIGlmICh0aGlzLl92YWx1ZSA+IHRoaXMubWF4KSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHRoaXMubWF4O1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZVBlcmNlbnRhZ2UgPSAoKHRoaXMuX3ZhbHVlIC0gdGhpcy5taW4pIC8gKHRoaXMubWF4IC0gdGhpcy5taW4pKSAqIDEwMDtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLXZhbHVlLXBlcmNlbnRhZ2UnLCBgJHt2YWx1ZVBlcmNlbnRhZ2V9JWApO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbm93JywgdGhpcy52YWx1ZS50b1N0cmluZygpKTtcblxuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8ZGl2IGlkPVwic2xpZGVyXCIgcGFydD1cInNsaWRlclwiPlxuICAgICAgICAke3RoaXMuY3NMaXZlLmdldFByb3BlcnR5VmFsdWUoJy0tc2hvdy1ib3VuZHMnKSA9PSAndHJ1ZSdcbiAgICAgICAgICA/IGh0bWxgPGRpdiBpZD1cImJvdW5kc1wiIHBhcnQ9XCJib3VuZHNcIj5cbiAgICAgICAgICAgICAgPGRpdj4ke3RoaXMuX21pbn08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdj4ke3RoaXMuX21heH08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PmBcbiAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICR7dGhpcy5jc0xpdmUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaG93LXRpY2tzJykgPT0gJ3RydWUnID8gaHRtbGA8ZGl2IGlkPVwidGlja3NcIiBwYXJ0PVwidGlja3NcIj48L2Rpdj5gIDogbm90aGluZ31cbiAgICAgICAgPGRpdiBpZD1cInJhaWxcIiBwYXJ0PVwicmFpbFwiIEBtb3VzZWRvd249JHt0aGlzLl9vbk1vdXNlRG93bn0gQHRvdWNoc3RhcnQ9JHt0aGlzLl9vblRvdWNoTW92ZX0+XG4gICAgICAgICAgPGRpdiBpZD1cImtub2JcIiBwYXJ0PVwia25vYlwiPlxuICAgICAgICAgICAgJHt0aGlzLmNzTGl2ZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXNob3ctdmFsdWUnKSA9PSAndHJ1ZSdcbiAgICAgICAgICAgICAgPyBodG1sYDxkaXYgaWQ9XCJ2YWx1ZVwiIHBhcnQ9XCJ2YWx1ZVwiPiR7dGhpcy52YWx1ZX08L2Rpdj5gXG4gICAgICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnN0ZXAgPSAxO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnc2xpZGVyJyk7XG4gIH1cblxuICBwcml2YXRlIF9vblRvdWNoTW92ZShldmVudCkge1xuICAgIGNvbnN0IGhhbmRsZVRvdWNoTW92ZSA9IGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHsgeCB9ID0gdGhpcy5nZXRQb3NpdGlvbkZyb21FdmVudChldmVudCk7XG4gICAgICBjb25zdCBkaWZmWCA9IHggLSB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgIHRoaXMuY2FsY3VsYXRlVmFsdWUoZGlmZlgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoRW5kID0gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgaGFuZGxlVG91Y2hFbmQpO1xuXG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgaGFuZGxlVG91Y2hFbmQpO1xuXG4gICAgY29uc3QgeyB4IH0gPSB0aGlzLmdldFBvc2l0aW9uRnJvbUV2ZW50KGV2ZW50KTtcbiAgICBjb25zdCBkaWZmWCA9IHggLSB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uTW91c2VEb3duKGV2ZW50KSB7XG4gICAgY29uc3QgaGFuZGxlTW91c2VNb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAvLyBpZiB0aGUgcXRpLXNsaWRlci1pbnRlcmFjdGlvbiBoYXMgYW4gYWJzb2x1dGUgbGVmdCBwb3NpdGlvbiBhbmQgYm9keSBpcyBzY3JvbGxlZCBhIGJpdCwgdGFrZSBhY2NvdW50IGZvciB0aGF0XG4gICAgICBjb25zdCBkaWZmWCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG5cbiAgICAgIHRoaXMuY2FsY3VsYXRlVmFsdWUoZGlmZlgpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZVVwID0gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBoYW5kbGVNb3VzZVVwKTtcblxuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy52YWx1ZS50b1N0cmluZygpKTtcbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlTW91c2VVcCk7XG5cbiAgICAvLyBpZiB0aGUgcXRpLXNsaWRlci1pbnRlcmFjdGlvbiBoYXMgYW4gYWJzb2x1dGUgbGVmdCBwb3NpdGlvbiBhbmQgYm9keSBpcyBzY3JvbGxlZCBhIGJpdCwgdGFrZSBhY2NvdW50IGZvciB0aGF0XG4gICAgY29uc3QgZGlmZlggPSBldmVudC5wYWdlWCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuXG4gICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIC8qKiBjYWxjdWxhdGVWYWx1ZSBnZXRzIHggcG9zaXRpb24gYW5kIGNvbXBhcmVzIHRoaXMgd2l0aCB0aGUgdG90YWwgd2lkdGggaW4gcGl4ZWxzICovXG4gIHByaXZhdGUgY2FsY3VsYXRlVmFsdWUoZGlmZlg6IG51bWJlcikge1xuICAgIGNvbnN0IHZhbHVlTm93ID0gdGhpcy5taW4gKyAoKHRoaXMubWF4IC0gdGhpcy5taW4pICogZGlmZlgpIC8gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICBjb25zdCByb3VuZGVkU3RlcFZhbHVlID0gdGhpcy5taW4gKyBNYXRoLnJvdW5kKCh2YWx1ZU5vdyAtIHRoaXMubWluKSAvIHRoaXMuX3N0ZXApICogdGhpcy5fc3RlcDtcbiAgICB0aGlzLl92YWx1ZSA9IHJvdW5kZWRTdGVwVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGdldFBvc2l0aW9uRnJvbUV2ZW50KGU6IGFueSk6IHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICB9IHtcbiAgICBsZXQgX3RvdWNoTW92ZTtcbiAgICBpZiAoZS50eXBlID09ICd0b3VjaHN0YXJ0JyB8fCBlLnR5cGUgPT0gJ3RvdWNobW92ZScgfHwgZS50eXBlID09ICd0b3VjaGVuZCcgfHwgZS50eXBlID09ICd0b3VjaGNhbmNlbCcpIHtcbiAgICAgIGNvbnN0IGV2dCA9IHR5cGVvZiBlLm9yaWdpbmFsRXZlbnQgPT09ICd1bmRlZmluZWQnID8gZSA6IGUub3JpZ2luYWxFdmVudDtcbiAgICAgIGNvbnN0IHRvdWNoID0gZXZ0LnRvdWNoZXNbMF0gfHwgZXZ0LmNoYW5nZWRUb3VjaGVzWzBdO1xuICAgICAgX3RvdWNoTW92ZSA9IHtcbiAgICAgICAgeDogdG91Y2gucGFnZVgsXG4gICAgICAgIHk6IHRvdWNoLnBhZ2VZXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBlLnR5cGUgPT0gJ21vdXNlZG93bicgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2V1cCcgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2Vtb3ZlJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZW92ZXInIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlb3V0JyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZWVudGVyJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZWxlYXZlJ1xuICAgICkge1xuICAgICAgX3RvdWNoTW92ZSA9IHtcbiAgICAgICAgeDogZS5jbGllbnRYLFxuICAgICAgICB5OiBlLmNsaWVudFlcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBfdG91Y2hNb3ZlO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zbGlkZXItaW50ZXJhY3Rpb24nOiBRdGlTbGlkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENhbGN1bGF0ZSB9IGZyb20gJy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuXG4vKipcbiAqIGh0dHBzOi8vd3d3Lmltc2dsb2JhbC5vcmcvc3BlYy9xdGkvdjNwMC9pbXBsI2guZmkyOXE4ZHViamd3XG4gKiA8cXRpLWN1c3RvbS1vcGVyYXRvciBjbGFzcz1cImpzLm9yZ1wiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwic3RyaW5nXCI+PCFbQ0RBVEFbXG4gICAgICAgICAgY29uc29sZS5sb2coY29udGV4dC52YXJpYWJsZXMpO1xuICAgICAgICAgIHJldHVybiAnQidcbiAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdxdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24nKS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgXV0+PC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLWN1c3RvbS1vcGVyYXRvcj5cbiAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jdXN0b20tb3BlcmF0b3InKVxuZXhwb3J0IGNsYXNzIFF0aUN1c3RvbU9wZXJhdG9yIGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIENhbGN1bGF0ZSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgcHJpdmF0ZSBvcGVyYXRvckZ1bmN0aW9uOiBGdW5jdGlvbjtcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfY29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdCBAc2xvdGNoYW5nZT0ke3RoaXMuaGFuZGxlU2xvdENoYW5nZX0+PC9zbG90PmA7XG4gIH1cblxuICBoYW5kbGVTbG90Q2hhbmdlKGV2ZW50OiBFdmVudCkge1xuICAgIC8vIGV4cGVjdGluZyA8WyFDREFUQVsgLi4uIF1dPiBpcyBjb252ZXJ0ZWQgaW50byA8IS0tIC4uLiAtLT4gd2l0aCBxdGktdHJhbnNmb3JtOiBjRGF0YVRvQ29tbWVudFxuICAgIGNvbnN0IGNvbW1lbnROb2RlID0gQXJyYXkuZnJvbSh0aGlzLmZpcnN0RWxlbWVudENoaWxkPy5jaGlsZE5vZGVzID8/IFtdKS5maW5kKFxuICAgICAgbm9kZSA9PiBub2RlLm5vZGVUeXBlID09PSBOb2RlLkNPTU1FTlRfTk9ERVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub3BlcmF0b3JGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbignY29udGV4dCcsICdmbicsICdpdGVtJywgY29tbWVudE5vZGUudGV4dENvbnRlbnQgPz8gJycpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2N1c3RvbS1vcGVyYXRvciBjb250YWlucyBpbnZhbGlkIGphdmFzY3JpcHQgY29kZScsIGUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKSB7XG4gICAgY29uc3QgZm4gPSB7XG4gICAgICB2YXJpYWJsZTogKHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICAgICAgICB0aGlzLl9jb250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gcmVzcG9uc2VJZGVudGlmaWVyKT8udmFsdWUgPz8gJycsXG4gICAgICBjb3JyZWN0OiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcpID0+XG4gICAgICAgICh0aGlzLl9jb250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gcmVzcG9uc2VJZGVudGlmaWVyKSBhcyBSZXNwb25zZVZhcmlhYmxlKVxuICAgICAgICAgID8uY29ycmVjdFJlc3BvbnNlID8/ICcnXG4gICAgfTtcbiAgICBjb25zdCBpdGVtID0ge1xuICAgICAgZ2V0VmFyaWFibGU6ICh2YXJpYWJsZUlkZW50aWZpZXI6IHN0cmluZykgPT5cbiAgICAgICAgdGhpcy5fY29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHZhcmlhYmxlSWRlbnRpZmllciksXG4gICAgICB1cGRhdGVPdXRjb21lVmFyaWFibGU6IChvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pID0+IHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLXNldC1vdXRjb21lLXZhbHVlJywge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIG91dGNvbWVJZGVudGlmaWVyLFxuICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgdXBkYXRlUmVzcG9uc2VWYXJpYWJsZTogKHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nLCByZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10pID0+IHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudDx7IHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nOyByZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10gfT4oJ3F0aS1pbnRlcmFjdGlvbi1yZXNwb25zZScsIHtcbiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHJlc3BvbnNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMub3BlcmF0b3JGdW5jdGlvbih0aGlzLl9jb250ZXh0LCBmbiwgaXRlbSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWN1c3RvbS1vcGVyYXRvcic6IFF0aUN1c3RvbU9wZXJhdG9yO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktYXNzb2NpYWJsZS1ob3RzcG90JylcbmV4cG9ydCBjbGFzcyBRdGlBc3NvY2lhYmxlSG90c3BvdCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1yZWdpc3Rlci1ob3RzcG90Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2VcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInF0aS1nYXAtaW1nXCI+PC9zbG90PiBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnOiBRdGlBc3NvY2lhYmxlSG90c3BvdDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAnKVxuZXhwb3J0IGNsYXNzIFF0aUdhcCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIHRhYmluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSAwO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInF0aS1nYXAtdGV4dFwiPjwvc2xvdD5gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAnOiBRdGlHYXA7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ2FwLWltZycpXG5leHBvcnQgY2xhc3MgUXRpR2FwSW1nIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncXRpLWdhcC1pbWcnKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwLWltZyc6IFF0aUdhcEltZztcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEFjdGl2ZUVsZW1lbnRNaXhpbiB9IGZyb20gJy4vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcC10ZXh0JylcbmV4cG9ydCBjbGFzcyBRdGlHYXBUZXh0IGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktZ2FwLXRleHQnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIHRhYmluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSAwO1xuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncXRpLWdhcC10ZXh0Jyk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdhcC10ZXh0JzogUXRpR2FwVGV4dDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEFjdGl2ZUVsZW1lbnRNaXhpbiB9IGZyb20gJy4vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuXG4vLyB0eXBlIHNoYXBlID0geyBzaGFwZTogJ3JlY3QnIHwgJ2NpcmNsZScgfCAncG9seSc7IGNvb3JkczogbnVtYmVyW10gfTtcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ob3RzcG90LWNob2ljZScpXG5leHBvcnQgY2xhc3MgUXRpSG90c3BvdENob2ljZSBleHRlbmRzIEFjdGl2ZUVsZW1lbnRNaXhpbihMaXRFbGVtZW50LCAncXRpLWhvdHNwb3QtY2hvaWNlJykge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB9XG4gIGA7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2FyaWEtb3JkZXJ2YWx1ZScsIHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSBvcmRlcjogbnVtYmVyO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaG90c3BvdC1jaG9pY2UnOiBRdGlIb3RzcG90Q2hvaWNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBBY3RpdmVFbGVtZW50TWl4aW4gfSBmcm9tICcuL2ludGVybmFsL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ob3R0ZXh0JylcbmV4cG9ydCBjbGFzcyBRdGlIb3R0ZXh0IGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktaG90dGV4dCcpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8ZGl2IHBhcnQ9XCJjaFwiPjxkaXYgcGFydD1cImNoYVwiPjwvZGl2PjwvZGl2PlxuICAgICAgPHNsb3Q+PC9zbG90PiBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3R0ZXh0JzogUXRpSG90dGV4dDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1pbmxpbmUtY2hvaWNlJylcbmV4cG9ydCBjbGFzcyBRdGlJbmxpbmVDaG9pY2UgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIG92ZXJyaWRlIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNzc2BcbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgfVxuICAgICAgYFxuICAgIF07XG4gIH1cblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25TZWxlY3RJbmxpbmVDaG9pY2UpO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktaW5saW5lLWNob2ljZS1yZWdpc3RlcicsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25TZWxlY3RJbmxpbmVDaG9pY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdD48L3Nsb3Q+IGA7XG4gIH1cblxuICBwcml2YXRlIF9vblNlbGVjdElubGluZUNob2ljZSgpIHtcbiAgICAvLyBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLXNlbGVjdCcsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaW5saW5lLWNob2ljZSc6IFF0aUlubGluZUNob2ljZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEFjdGl2ZUVsZW1lbnRNaXhpbiB9IGZyb20gJy4vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuXG4vKipcbiAqIHF0aS1vcmRlci1pbnRlcmFjdGlvblxuICogcXRpLWNob2ljZS1pbnRlcmFjdGlvblxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLXNpbXBsZS1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aVNpbXBsZUNob2ljZSBleHRlbmRzIEFjdGl2ZUVsZW1lbnRNaXhpbihMaXRFbGVtZW50LCAncXRpLXNpbXBsZS1jaG9pY2UnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICB9XG4gICAgc2xvdCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIH1cbiAgICBbcGFydD0nY2gnXSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgfVxuICBgO1xuXG4gIC8vIHByb3BlcnR5IGxhYmVsXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiBmYWxzZSB9KVxuICBwdWJsaWMgbWFya2VyOiBzdHJpbmc7XG5cblxuICBnZXQgY2hlY2tlZCgpIHtcbiAgICByZXR1cm4gdGhpc1snaW50ZXJuYWxzJ10uc3RhdGVzLmhhcygnLS1jaGVja2VkJyk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBwYXJ0PVwiY2hcIj5cbiAgICAgICAgPGRpdiBwYXJ0PVwiY2hhXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgICR7dGhpcy5tYXJrZXIgPyBodG1sYDxkaXYgaWQ9XCJsYWJlbFwiPiR7dGhpcy5tYXJrZXJ9PC9kaXY+YCA6IG5vdGhpbmd9XG4gICAgICA8c2xvdCBwYXJ0PVwic2xvdFwiPjwvc2xvdD4gYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc2ltcGxlLWNob2ljZSc6IFF0aVNpbXBsZUNob2ljZTtcbiAgfVxufVxuIiwgIi8qIG9ubHkgZXhwb3J0ZWQgdG8gb3ZlcnJpZGUgb3IgZXh0ZW5kIGZvciBzcGVjaWZpYyBwdXJwb3NlcyAqL1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcm5hbC9ldmVudC10eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVybmFsL2V2ZW50cyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvdmFyaWFibGVzJztcbi8qIG9ubHkgZXhwb3J0ZWQgdG8gb3ZlcnJpZGUgb3IgZXh0ZW5kIGZvciBzcGVjaWZpYyBwdXJwb3NlcyAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYvcXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWl0ZW0tYm9keS9xdGktaXRlbS1ib2R5JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXByb21wdC9xdGktcHJvbXB0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXN0eWxlc2hlZXQvcXRpLXN0eWxlc2hlZXQnO1xuLyogc3RhcnQgcmVzcG9uc2UgYW5kIG91dGNvbWUgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uL3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbi9xdGktcmVzcG9uc2UtZGVjbGFyYXRpb24nO1xuLyogZW5kIHJlc3BvbnNlIGFuZCBvdXRjb21lICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mbyc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1ydWJyaWMtYmxvY2svcXRpLWNvbnRlbnQtYm9keSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1ydWJyaWMtYmxvY2svcXRpLXJ1YnJpYy1ibG9jayc7XG4vKiBzdGFydCBmZWVkYmFjayAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrLWJsb2NrL3F0aS1mZWVkYmFjay1ibG9jayc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2staW5saW5lL3F0aS1mZWVkYmFjay1pbmxpbmUnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrL3F0aS1tb2RhbC1mZWVkYmFjayc7XG4vKiBlbmQgZmVlZGJhY2sgKi9cbi8qIHN0YXJ0IHRleHRlbnRyeWludGVyYWN0aW9uICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbi9xdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbic7XG4vKiBlbmQgdGV4dGVudHJ5aW50ZXJhY3Rpb24gKi9cbi8qIHN0YXJ0IGhvdHRleHQgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uJztcbi8qIGVuZCBob3R0ZXh0ICovXG4vKiBzdGFydCBpbmxpbmVjaG9pY2UgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uJztcbi8qIGVuZCBpbmxpbmVjaG9pY2UgKi9cbi8qIHN0YXJ0IGNob2ljZWludGVyYWN0aW9uICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktY2hvaWNlLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGNob2ljZWludGVyYWN0aW9uICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1vdXRjb21lLXByb2Nlc3NpbmcvcXRpLW91dGNvbWUtcHJvY2Vzc2luZyc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nJztcbi8qIHN0YXJ0IGN1c3RvbSBpbnRlcmFjdGlvbnMgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbic7XG4vKiBlbmQgY3VzdG9tIGludGVyYWN0aW9ucyAqL1xuLyogc3RhcnQgb25seSBwcmV2aWV3IGl0ZW1zICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbi9xdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90c3BvdC1pbnRlcmFjdGlvbi9xdGktaG90c3BvdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbi9xdGktbWVkaWEtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uL3F0aS1vcmRlci1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktc2xpZGVyLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24nO1xuLyogZW5kIG9ubHkgcHJldmlldyBpdGVtcyAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1jdXN0b20tb3BlcmF0b3IvcXRpLWN1c3RvbS1vcGVyYXRvcic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYWJsZS1ob3RzcG90JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1nYXAnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1pbWcnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC10ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90dGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtY2hvaWNlJztcblxuY29uc29sZS5sb2coXG4gICclY0NcdTAwQkZUTyVjTGFiJWM6IHF0aS1jb21wb25lbnRzIGxvYWRlZCcsXG4gICdmb250LXdlaWdodDpib2xkOyBjb2xvcjpncmVlbicsXG4gICdmb250LWZhbWlseTogXCJQVCBTYW5zXCIsIGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOmdyZWVuOyBmb250LXNpemU6IHNtYWxsZXI7dmVydGljYWwtYWxpZ246IHN1YicsXG4gICdmb250LXdlaWdodDp1bnNldCdcbik7XG5cbi8vIGNzcyBmb3IgZm9udCBwdC1zYW5zIGFuZCBzdWJzY3JpcHQgYW5kIGdyZWVuXG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUFzc2Vzc21lbnRJdGVtIH0gZnJvbSAnLi4vcXRpLWNvbXBvbmVudHMnO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF0aUl0ZW1JbnRlcmZhY2Uge1xuICBpZGVudGlmaWVyPzogc3RyaW5nO1xuICBocmVmPzogc3RyaW5nO1xuICB4bWxEb2M6IERvY3VtZW50RnJhZ21lbnQ7XG4gIGFzc2Vzc21lbnRJdGVtOiBRdGlBc3Nlc3NtZW50SXRlbSB8IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBRdGlJdGVtTWl4aW48VCBleHRlbmRzIENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihCYXNlOiBUKSB7XG4gIGNsYXNzIFF0aUl0ZW1DbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgcmVmbGVjdDogdHJ1ZSB9KSBpZGVudGlmaWVyPzogc3RyaW5nO1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBocmVmPzogc3RyaW5nO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogT2JqZWN0LCBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gICAgeG1sRG9jITogRG9jdW1lbnRGcmFnbWVudDsgLy8gdGhlIFhNTERvY3VtZW50XG5cbiAgICBwcm90ZWN0ZWQgY3JlYXRlUmVuZGVyUm9vdCgpOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZ2V0IGFzc2Vzc21lbnRJdGVtKCk6IFF0aUFzc2Vzc21lbnRJdGVtIHwgbnVsbCB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJSb290Py5xdWVyeVNlbGVjdG9yKCdxdGktYXNzZXNzbWVudC1pdGVtJyk7XG4gICAgfVxuXG4gICAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktaXRlbS1jb25uZWN0ZWQnLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHsgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLCBocmVmOiB0aGlzLmhyZWYgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gaHRtbGAke3RoaXMueG1sRG9jfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBRdGlJdGVtQ2xhc3MgYXMgQ29uc3RydWN0b3I8UXRpSXRlbUludGVyZmFjZT4gJiBUO1xufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUl0ZW1NaXhpbiB9IGZyb20gJy4vcXRpLWl0ZW0ubWl4aW4nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWl0ZW0nKVxuZXhwb3J0IGNsYXNzIFF0aUl0ZW0gZXh0ZW5kcyBRdGlJdGVtTWl4aW4oTGl0RWxlbWVudCkge31cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWl0ZW0nOiBRdGlJdGVtO1xuICB9XG59IiwgImltcG9ydCB7IFF0aUFzc2Vzc21lbnRJdGVtIH0gZnJvbSAnLi4vcXRpLWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgcXRpVHJhbnNmb3JtSXRlbSwgcXRpVHJhbnNmb3JtVGVzdCB9IGZyb20gJy4uL3F0aS10cmFuc2Zvcm1lcnMnO1xuaW1wb3J0IHsgcXRpVHJhbnNmb3JtTWFuaWZlc3QgfSBmcm9tICcuLi9xdGktdHJhbnNmb3JtZXJzL3F0aS10cmFuc2Zvcm0tbWFuaWZlc3QnO1xuXG5leHBvcnQgdHlwZSBNYW5pZmVzdEluZm8gPSB7XG4gIHRlc3RJZGVudGlmaWVyOiBzdHJpbmc7XG4gIHRlc3RIVE1MRG9jOiBEb2N1bWVudEZyYWdtZW50O1xuICB0ZXN0VVJJOiBzdHJpbmc7XG4gIHRlc3RVUkw6IHN0cmluZztcbiAgaXRlbXM6IHtcbiAgICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgaHJlZjogc3RyaW5nO1xuICAgIGNhdGVnb3J5OiBzdHJpbmc7XG4gIH1bXTtcbn07XG5cbi8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gZW5zdXJlIHBhY2thZ2UgVVJJcyBlbmQgd2l0aCBhICcvJ1xuLy8gY29uc3Qgbm9ybWFsaXplVXJpID0gKHVyaTogc3RyaW5nKSA9PiAodXJpLmVuZHNXaXRoKCcvJykgPyB1cmkgOiBgJHt1cml9L2ApO1xuXG4vLyBGZXRjaGVzIGFzc2Vzc21lbnQgZGF0YSBmcm9tIHRoZSBtYW5pZmVzdFxuZXhwb3J0IGNvbnN0IGdldE1hbmlmZXN0SW5mbyA9IGFzeW5jIChtYW5pZmVzdFVSTDogc3RyaW5nKTogUHJvbWlzZTxNYW5pZmVzdEluZm8+ID0+IHtcbiAgY29uc3QgYmFzZVVSSSA9IG1hbmlmZXN0VVJMLnN1YnN0cmluZygwLCBtYW5pZmVzdFVSTC5sYXN0SW5kZXhPZignLycpKTtcblxuICBjb25zdCB0ZXN0ID0gYXdhaXQgcXRpVHJhbnNmb3JtTWFuaWZlc3QoKVxuICAgIC5sb2FkKGAke21hbmlmZXN0VVJMfWApXG4gICAgLnRoZW4oYXBpID0+IGFwaS5hc3Nlc3NtZW50VGVzdCgpKTtcblxuICBjb25zdCB0ZXN0SFRNTERvYyA9IGF3YWl0IHF0aVRyYW5zZm9ybVRlc3QoKVxuICAgIC5sb2FkKGAke2Jhc2VVUkl9LyR7dGVzdC5ocmVmfWApXG4gICAgLnRoZW4oYXBpID0+IGFwaS5odG1sRG9jKCkpO1xuXG4gIGNvbnN0IGl0ZW1zID0gYXdhaXQgcXRpVHJhbnNmb3JtVGVzdCgpXG4gICAgLmxvYWQoYCR7YmFzZVVSSX0vJHt0ZXN0LmhyZWZ9YClcbiAgICAudGhlbihhcGkgPT4gYXBpLml0ZW1zKCkpO1xuXG4gIGNvbnN0IHRlc3RVUkwgPSBgJHtiYXNlVVJJfS8ke3Rlc3QuaHJlZn1gO1xuICBjb25zdCB0ZXN0VVJJID0gYCR7YmFzZVVSSX0vJHt0ZXN0LmhyZWYuc3Vic3RyaW5nKDAsIHRlc3QuaHJlZi5sYXN0SW5kZXhPZignLycpKX1gO1xuXG4gIHJldHVybiB7XG4gICAgdGVzdEhUTUxEb2MsXG4gICAgdGVzdFVSSSxcbiAgICB0ZXN0VVJMLFxuICAgIGl0ZW1zLFxuICAgIHRlc3RJZGVudGlmaWVyOiB0ZXN0LmlkZW50aWZpZXJcbiAgfTtcbn07XG5cbi8vIEZldGNoZXMgYSBzaW5nbGUgaXRlbSBieSBVUklcbmV4cG9ydCBjb25zdCBnZXRJdGVtQnlVcmkgPSBhc3luYyAoaXRlbVVyaTogc3RyaW5nKTogUHJvbWlzZTxRdGlBc3Nlc3NtZW50SXRlbT4gPT5cbiAgcXRpVHJhbnNmb3JtSXRlbSgpXG4gICAgLmxvYWQoaXRlbVVyaSlcbiAgICAudGhlbihhcGkgPT4gYXBpLmh0bWxEb2MoKS5maXJzdEVsZW1lbnRDaGlsZCBhcyBRdGlBc3Nlc3NtZW50SXRlbSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpRE0sSUFBT0EsSUFBUCxjQUNJQyxNQUFBQTtFQWFSLFlBQ0VDLElBQ0FDLElBQ0FDLEtBQUFBO0FBRUFDLFVBQU0sbUJBQW1CLEVBQUNDLFNBQUFBLE1BQWVDLFVBQUFBLEtBQVUsQ0FBQSxHQUNuREMsS0FBS04sVUFBVUEsSUFDZk0sS0FBS0wsV0FBV0EsSUFDaEJLLEtBQUtKLFlBQVlBLE9BQUFBLE9BQUFBLE1BQUFBO0VBQ2xCO0FBQUE7OztBQ25CRyxTQUFVSyxFQUFzQ0MsSUFBQUE7QUFDcEQsU0FBT0E7QUFDVDs7O0lDckJhQyxXQUFBQTtFQXNCWCxZQUNFQyxJQUNBQyxJQUNBQyxJQUNBQyxJQUFBQTs7QUFLQSxRQXZCTUMsS0FBU0QsWUFBQUEsT0FFVEMsS0FBUUMsV0FBQUEsT0FF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QUUsaUJBQXNDOyIsCiAgIm5hbWVzIjogWyJDb250ZXh0UmVxdWVzdEV2ZW50IiwgIkV2ZW50IiwgImNvbnRleHQiLCAiY2FsbGJhY2siLCAic3Vic2NyaWJlIiwgInN1cGVyIiwgImJ1YmJsZXMiLCAiY29tcG9zZWQiLCAidGhpcyIsICJjcmVhdGVDb250ZXh0IiwgImtleSIsICJDb250ZXh0Q29uc3VtZXIiLCAiaG9zdCIsICJjb250ZXh0T3JPcHRpb25zIiwgImNhbGxiYWNrIiwgInN1YnNjcmliZSIsICJ0aGlzIiwgInByb3ZpZGVkIiwgInZhbHVlIiwgIl9jYWxsYmFjayIsICJ1bnN1YnNjcmliZSIsICJyZXF1ZXN0VXBkYXRlIiwgImNvbnRleHQiLCAib3B0aW9ucyIsICJhZGRDb250cm9sbGVyIiwgImhvc3RDb25uZWN0ZWQiLCAiZGlzcGF0Y2hSZXF1ZXN0IiwgImhvc3REaXNjb25uZWN0ZWQiLCAiZGlzcGF0Y2hFdmVudCIsICJDb250ZXh0UmVxdWVzdEV2ZW50IiwgIlZhbHVlTm90aWZpZXIiLCAidmFsdWUiLCAidGhpcyIsICJfdmFsdWUiLCAidiIsICJzZXRWYWx1ZSIsICJmb3JjZSIsICJ1cGRhdGUiLCAiT2JqZWN0IiwgImlzIiwgInVwZGF0ZU9ic2VydmVycyIsICJkZWZhdWx0VmFsdWUiLCAic3Vic2NyaXB0aW9ucyIsICJNYXAiLCAiY2FsbGJhY2siLCAiZGlzcG9zZXIiLCAiY29uc3VtZXJIb3N0IiwgInN1YnNjcmliZSIsICJoYXMiLCAic2V0IiwgImRlbGV0ZSIsICJnZXQiLCAiY2xlYXJDYWxsYmFja3MiLCAiY2xlYXIiLCAiQ29udGV4dFByb3ZpZGVyRXZlbnQiLCAiRXZlbnQiLCAiY29udGV4dCIsICJzdXBlciIsICJidWJibGVzIiwgImNvbXBvc2VkIiwgInRoaXMiLCAiQ29udGV4dFByb3ZpZGVyIiwgIlZhbHVlTm90aWZpZXIiLCAiaG9zdCIsICJjb250ZXh0T3JPcHRpb25zIiwgImluaXRpYWxWYWx1ZSIsICJvbkNvbnRleHRSZXF1ZXN0IiwgImV2IiwgImNvbnN1bWVySG9zdCIsICJjb21wb3NlZFBhdGgiLCAic3RvcFByb3BhZ2F0aW9uIiwgImFkZENhbGxiYWNrIiwgImNhbGxiYWNrIiwgInN1YnNjcmliZSIsICJvblByb3ZpZGVyUmVxdWVzdCIsICJjaGlsZFByb3ZpZGVySG9zdCIsICJzZWVuIiwgIlNldCIsICJzdWJzY3JpcHRpb25zIiwgImhhcyIsICJhZGQiLCAiZGlzcGF0Y2hFdmVudCIsICJDb250ZXh0UmVxdWVzdEV2ZW50IiwgImF0dGFjaExpc3RlbmVycyIsICJhZGRDb250cm9sbGVyIiwgImFkZEV2ZW50TGlzdGVuZXIiLCAiaG9zdENvbm5lY3RlZCIsICJwcm92aWRlIiwgImNvbnRleHQiLCAicHJvdG9PclRhcmdldCIsICJuYW1lT3JDb250ZXh0IiwgImNvbnRyb2xsZXJNYXAiLCAiV2Vha01hcCIsICJhZGRJbml0aWFsaXplciIsICJzZXQiLCAidGhpcyIsICJDb250ZXh0UHJvdmlkZXIiLCAiZ2V0IiwgImNhbGwiLCAidmFsdWUiLCAic2V0VmFsdWUiLCAiY29uc3RydWN0b3IiLCAiZWxlbWVudCIsICJkZXNjcmlwdG9yIiwgIk9iamVjdCIsICJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCAibmV3RGVzY3JpcHRvciIsICJ2YWx1ZU1hcCIsICJjb25maWd1cmFibGUiLCAiZW51bWVyYWJsZSIsICJvbGRTZXR0ZXIiLCAiZGVmaW5lUHJvcGVydHkiLCAiY29uc3VtZSIsICJjb250ZXh0IiwgInN1YnNjcmliZSIsICJwcm90b09yVGFyZ2V0IiwgIm5hbWVPckNvbnRleHQiLCAiYWRkSW5pdGlhbGl6ZXIiLCAiQ29udGV4dENvbnN1bWVyIiwgInRoaXMiLCAiY2FsbGJhY2siLCAidmFsdWUiLCAic2V0IiwgImNhbGwiLCAiY29uc3RydWN0b3IiLCAiZWxlbWVudCIsICJfYSIsICJfYSIsICJjdXN0b21FbGVtZW50cyIsICJnbG9iYWwiLCAiZ2xvYmFsVGhpcyIsICJzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHMiLCAiU2hhZG93Um9vdCIsICJTaGFkeUNTUyIsICJuYXRpdmVTaGFkb3ciLCAiRG9jdW1lbnQiLCAicHJvdG90eXBlIiwgIkNTU1N0eWxlU2hlZXQiLCAiY29uc3RydWN0aW9uVG9rZW4iLCAiU3ltYm9sIiwgImNzc1RhZ0NhY2hlIiwgIldlYWtNYXAiLCAiQ1NTUmVzdWx0IiwgImNzc1RleHQiLCAic3RyaW5ncyIsICJzYWZlVG9rZW4iLCAidGhpcyIsICJFcnJvciIsICJfc3RyaW5ncyIsICJzdHlsZVNoZWV0IiwgIl9zdHlsZVNoZWV0IiwgImNhY2hlYWJsZSIsICJsZW5ndGgiLCAiZ2V0IiwgInJlcGxhY2VTeW5jIiwgInNldCIsICJ0b1N0cmluZyIsICJ1bnNhZmVDU1MiLCAidmFsdWUiLCAiU3RyaW5nIiwgImNzcyIsICJ2YWx1ZXMiLCAicmVkdWNlIiwgImFjYyIsICJ2IiwgImlkeCIsICJhZG9wdFN0eWxlcyIsICJyZW5kZXJSb290IiwgInN0eWxlcyIsICJhZG9wdGVkU3R5bGVTaGVldHMiLCAibWFwIiwgInMiLCAic3R5bGUiLCAiZG9jdW1lbnQiLCAiY3JlYXRlRWxlbWVudCIsICJub25jZSIsICJzZXRBdHRyaWJ1dGUiLCAidGV4dENvbnRlbnQiLCAiYXBwZW5kQ2hpbGQiLCAiZ2V0Q29tcGF0aWJsZVN0eWxlIiwgInNoZWV0IiwgInJ1bGUiLCAiY3NzUnVsZXMiLCAiaXMiLCAiZGVmaW5lUHJvcGVydHkiLCAiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwgImdldE93blByb3BlcnR5TmFtZXMiLCAiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwgImdldFByb3RvdHlwZU9mIiwgIk9iamVjdCIsICJnbG9iYWwiLCAiZ2xvYmFsVGhpcyIsICJjdXN0b21FbGVtZW50cyIsICJ0cnVzdGVkVHlwZXMiLCAiZW1wdHlTdHJpbmdGb3JCb29sZWFuQXR0cmlidXRlIiwgImVtcHR5U2NyaXB0IiwgInBvbHlmaWxsU3VwcG9ydCIsICJyZWFjdGl2ZUVsZW1lbnRQb2x5ZmlsbFN1cHBvcnQiLCAiSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSIsICJwcm9wIiwgIl9vYmoiLCAiZGVmYXVsdENvbnZlcnRlciIsICJ2YWx1ZSIsICJ0eXBlIiwgIkJvb2xlYW4iLCAiQXJyYXkiLCAiSlNPTiIsICJzdHJpbmdpZnkiLCAiZnJvbVZhbHVlIiwgIk51bWJlciIsICJwYXJzZSIsICJlIiwgIm5vdEVxdWFsIiwgIm9sZCIsICJkZWZhdWx0UHJvcGVydHlEZWNsYXJhdGlvbiIsICJhdHRyaWJ1dGUiLCAiU3RyaW5nIiwgImNvbnZlcnRlciIsICJyZWZsZWN0IiwgImhhc0NoYW5nZWQiLCAiU3ltYm9sIiwgIm1ldGFkYXRhIiwgImxpdFByb3BlcnR5TWV0YWRhdGEiLCAiV2Vha01hcCIsICJSZWFjdGl2ZUVsZW1lbnQiLCAiSFRNTEVsZW1lbnQiLCAiaW5pdGlhbGl6ZXIiLCAidGhpcyIsICJfX3ByZXBhcmUiLCAiX2luaXRpYWxpemVycyIsICJwdXNoIiwgIm9ic2VydmVkQXR0cmlidXRlcyIsICJmaW5hbGl6ZSIsICJfX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAiLCAia2V5cyIsICJuYW1lIiwgIm9wdGlvbnMiLCAic3RhdGUiLCAiZWxlbWVudFByb3BlcnRpZXMiLCAic2V0IiwgIm5vQWNjZXNzb3IiLCAia2V5IiwgImRlc2NyaXB0b3IiLCAiZ2V0UHJvcGVydHlEZXNjcmlwdG9yIiwgInByb3RvdHlwZSIsICJnZXQiLCAidiIsICJjYWxsIiwgIm9sZFZhbHVlIiwgInJlcXVlc3RVcGRhdGUiLCAiY29uZmlndXJhYmxlIiwgImVudW1lcmFibGUiLCAiaGFzT3duUHJvcGVydHkiLCAic3VwZXJDdG9yIiwgIk1hcCIsICJmaW5hbGl6ZWQiLCAicHJvcHMiLCAicHJvcGVydGllcyIsICJwcm9wS2V5cyIsICJwIiwgImNyZWF0ZVByb3BlcnR5IiwgImF0dHIiLCAiX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkiLCAiZWxlbWVudFN0eWxlcyIsICJmaW5hbGl6ZVN0eWxlcyIsICJzdHlsZXMiLCAiaXNBcnJheSIsICJTZXQiLCAiZmxhdCIsICJJbmZpbml0eSIsICJyZXZlcnNlIiwgInMiLCAidW5zaGlmdCIsICJnZXRDb21wYXRpYmxlU3R5bGUiLCAidG9Mb3dlckNhc2UiLCAiY29uc3RydWN0b3IiLCAic3VwZXIiLCAiX19pbnN0YW5jZVByb3BlcnRpZXMiLCAiaXNVcGRhdGVQZW5kaW5nIiwgImhhc1VwZGF0ZWQiLCAiX19yZWZsZWN0aW5nUHJvcGVydHkiLCAiX19pbml0aWFsaXplIiwgIl9fdXBkYXRlUHJvbWlzZSIsICJQcm9taXNlIiwgInJlcyIsICJlbmFibGVVcGRhdGluZyIsICJfJGNoYW5nZWRQcm9wZXJ0aWVzIiwgIl9fc2F2ZUluc3RhbmNlUHJvcGVydGllcyIsICJmb3JFYWNoIiwgImkiLCAiY29udHJvbGxlciIsICJfX2NvbnRyb2xsZXJzIiwgImFkZCIsICJyZW5kZXJSb290IiwgImlzQ29ubmVjdGVkIiwgImhvc3RDb25uZWN0ZWQiLCAiZGVsZXRlIiwgImluc3RhbmNlUHJvcGVydGllcyIsICJzaXplIiwgImNyZWF0ZVJlbmRlclJvb3QiLCAic2hhZG93Um9vdCIsICJhdHRhY2hTaGFkb3ciLCAic2hhZG93Um9vdE9wdGlvbnMiLCAiYWRvcHRTdHlsZXMiLCAiY29ubmVjdGVkQ2FsbGJhY2siLCAiYyIsICJfcmVxdWVzdGVkVXBkYXRlIiwgImRpc2Nvbm5lY3RlZENhbGxiYWNrIiwgImhvc3REaXNjb25uZWN0ZWQiLCAiX29sZCIsICJfJGF0dHJpYnV0ZVRvUHJvcGVydHkiLCAiYXR0clZhbHVlIiwgInRvQXR0cmlidXRlIiwgInJlbW92ZUF0dHJpYnV0ZSIsICJzZXRBdHRyaWJ1dGUiLCAiY3RvciIsICJwcm9wTmFtZSIsICJnZXRQcm9wZXJ0eU9wdGlvbnMiLCAiZnJvbUF0dHJpYnV0ZSIsICJfJGNoYW5nZVByb3BlcnR5IiwgIl9fZW5xdWV1ZVVwZGF0ZSIsICJoYXMiLCAiX19yZWZsZWN0aW5nUHJvcGVydGllcyIsICJyZWplY3QiLCAicmVzdWx0IiwgInNjaGVkdWxlVXBkYXRlIiwgInBlcmZvcm1VcGRhdGUiLCAid3JhcHBlZCIsICJzaG91bGRVcGRhdGUiLCAiY2hhbmdlZFByb3BlcnRpZXMiLCAid2lsbFVwZGF0ZSIsICJob3N0VXBkYXRlIiwgInVwZGF0ZSIsICJfX21hcmtVcGRhdGVkIiwgIl8kZGlkVXBkYXRlIiwgIl9jaGFuZ2VkUHJvcGVydGllcyIsICJob3N0VXBkYXRlZCIsICJmaXJzdFVwZGF0ZWQiLCAidXBkYXRlZCIsICJ1cGRhdGVDb21wbGV0ZSIsICJnZXRVcGRhdGVDb21wbGV0ZSIsICJfX3Byb3BlcnR5VG9BdHRyaWJ1dGUiLCAibW9kZSIsICJyZWFjdGl2ZUVsZW1lbnRWZXJzaW9ucyIsICJnbG9iYWwiLCAiZ2xvYmFsVGhpcyIsICJ0cnVzdGVkVHlwZXMiLCAicG9saWN5IiwgImNyZWF0ZVBvbGljeSIsICJjcmVhdGVIVE1MIiwgInMiLCAiYm91bmRBdHRyaWJ1dGVTdWZmaXgiLCAibWFya2VyIiwgIk1hdGgiLCAicmFuZG9tIiwgInRvRml4ZWQiLCAic2xpY2UiLCAibWFya2VyTWF0Y2giLCAibm9kZU1hcmtlciIsICJkIiwgImRvY3VtZW50IiwgImNyZWF0ZVRyZWVXYWxrZXIiLCAiY3JlYXRlTWFya2VyIiwgImNyZWF0ZUNvbW1lbnQiLCAiaXNQcmltaXRpdmUiLCAidmFsdWUiLCAiaXNBcnJheSIsICJBcnJheSIsICJpc0l0ZXJhYmxlIiwgIlN5bWJvbCIsICJpdGVyYXRvciIsICJTUEFDRV9DSEFSIiwgInRleHRFbmRSZWdleCIsICJjb21tZW50RW5kUmVnZXgiLCAiY29tbWVudDJFbmRSZWdleCIsICJ0YWdFbmRSZWdleCIsICJSZWdFeHAiLCAic2luZ2xlUXVvdGVBdHRyRW5kUmVnZXgiLCAiZG91YmxlUXVvdGVBdHRyRW5kUmVnZXgiLCAicmF3VGV4dEVsZW1lbnQiLCAidGFnIiwgInR5cGUiLCAic3RyaW5ncyIsICJ2YWx1ZXMiLCAiXyRsaXRUeXBlJCIsICJodG1sIiwgInN2ZyIsICJtYXRobWwiLCAibm9DaGFuZ2UiLCAiZm9yIiwgIm5vdGhpbmciLCAidGVtcGxhdGVDYWNoZSIsICJXZWFrTWFwIiwgIndhbGtlciIsICJ0cnVzdEZyb21UZW1wbGF0ZVN0cmluZyIsICJ0c2EiLCAic3RyaW5nRnJvbVRTQSIsICJoYXNPd25Qcm9wZXJ0eSIsICJFcnJvciIsICJnZXRUZW1wbGF0ZUh0bWwiLCAibCIsICJsZW5ndGgiLCAiYXR0ck5hbWVzIiwgInJhd1RleHRFbmRSZWdleCIsICJyZWdleCIsICJpIiwgImF0dHJOYW1lIiwgIm1hdGNoIiwgImF0dHJOYW1lRW5kSW5kZXgiLCAibGFzdEluZGV4IiwgImV4ZWMiLCAidGVzdCIsICJlbmQiLCAic3RhcnRzV2l0aCIsICJwdXNoIiwgIlRlbXBsYXRlIiwgImNvbnN0cnVjdG9yIiwgIm9wdGlvbnMiLCAibm9kZSIsICJ0aGlzIiwgInBhcnRzIiwgIm5vZGVJbmRleCIsICJhdHRyTmFtZUluZGV4IiwgInBhcnRDb3VudCIsICJlbCIsICJjcmVhdGVFbGVtZW50IiwgImN1cnJlbnROb2RlIiwgImNvbnRlbnQiLCAid3JhcHBlciIsICJmaXJzdENoaWxkIiwgInJlcGxhY2VXaXRoIiwgImNoaWxkTm9kZXMiLCAibmV4dE5vZGUiLCAibm9kZVR5cGUiLCAiaGFzQXR0cmlidXRlcyIsICJuYW1lIiwgImdldEF0dHJpYnV0ZU5hbWVzIiwgImVuZHNXaXRoIiwgInJlYWxOYW1lIiwgInN0YXRpY3MiLCAiZ2V0QXR0cmlidXRlIiwgInNwbGl0IiwgIm0iLCAiaW5kZXgiLCAiY3RvciIsICJQcm9wZXJ0eVBhcnQiLCAiQm9vbGVhbkF0dHJpYnV0ZVBhcnQiLCAiRXZlbnRQYXJ0IiwgIkF0dHJpYnV0ZVBhcnQiLCAicmVtb3ZlQXR0cmlidXRlIiwgInRhZ05hbWUiLCAidGV4dENvbnRlbnQiLCAiZW1wdHlTY3JpcHQiLCAiYXBwZW5kIiwgImRhdGEiLCAiaW5kZXhPZiIsICJfb3B0aW9ucyIsICJpbm5lckhUTUwiLCAicmVzb2x2ZURpcmVjdGl2ZSIsICJwYXJ0IiwgInBhcmVudCIsICJhdHRyaWJ1dGVJbmRleCIsICJjdXJyZW50RGlyZWN0aXZlIiwgIl9fZGlyZWN0aXZlcyIsICJfX2RpcmVjdGl2ZSIsICJuZXh0RGlyZWN0aXZlQ29uc3RydWN0b3IiLCAiXyRpbml0aWFsaXplIiwgIl8kcmVzb2x2ZSIsICJUZW1wbGF0ZUluc3RhbmNlIiwgInRlbXBsYXRlIiwgIl8kcGFydHMiLCAiXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuIiwgIl8kdGVtcGxhdGUiLCAiXyRwYXJlbnQiLCAicGFyZW50Tm9kZSIsICJfJGlzQ29ubmVjdGVkIiwgImZyYWdtZW50IiwgImNyZWF0aW9uU2NvcGUiLCAiaW1wb3J0Tm9kZSIsICJwYXJ0SW5kZXgiLCAidGVtcGxhdGVQYXJ0IiwgIkNoaWxkUGFydCIsICJuZXh0U2libGluZyIsICJFbGVtZW50UGFydCIsICJfJHNldFZhbHVlIiwgIl9faXNDb25uZWN0ZWQiLCAic3RhcnROb2RlIiwgImVuZE5vZGUiLCAiXyRjb21taXR0ZWRWYWx1ZSIsICJfJHN0YXJ0Tm9kZSIsICJfJGVuZE5vZGUiLCAiaXNDb25uZWN0ZWQiLCAiZGlyZWN0aXZlUGFyZW50IiwgIl8kY2xlYXIiLCAiX2NvbW1pdFRleHQiLCAiX2NvbW1pdFRlbXBsYXRlUmVzdWx0IiwgIl9jb21taXROb2RlIiwgIl9jb21taXRJdGVyYWJsZSIsICJpbnNlcnRCZWZvcmUiLCAiX2luc2VydCIsICJjcmVhdGVUZXh0Tm9kZSIsICJyZXN1bHQiLCAiXyRnZXRUZW1wbGF0ZSIsICJoIiwgIl91cGRhdGUiLCAiaW5zdGFuY2UiLCAiX2Nsb25lIiwgImdldCIsICJzZXQiLCAiaXRlbVBhcnRzIiwgIml0ZW1QYXJ0IiwgIml0ZW0iLCAic3RhcnQiLCAiZnJvbSIsICJfJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkIiwgIm4iLCAicmVtb3ZlIiwgImVsZW1lbnQiLCAiZmlsbCIsICJTdHJpbmciLCAidmFsdWVJbmRleCIsICJub0NvbW1pdCIsICJjaGFuZ2UiLCAidiIsICJfY29tbWl0VmFsdWUiLCAic2V0QXR0cmlidXRlIiwgInRvZ2dsZUF0dHJpYnV0ZSIsICJzdXBlciIsICJuZXdMaXN0ZW5lciIsICJvbGRMaXN0ZW5lciIsICJzaG91bGRSZW1vdmVMaXN0ZW5lciIsICJjYXB0dXJlIiwgIm9uY2UiLCAicGFzc2l2ZSIsICJzaG91bGRBZGRMaXN0ZW5lciIsICJyZW1vdmVFdmVudExpc3RlbmVyIiwgImFkZEV2ZW50TGlzdGVuZXIiLCAiZXZlbnQiLCAiY2FsbCIsICJob3N0IiwgImhhbmRsZUV2ZW50IiwgIl8kTEgiLCAiX2JvdW5kQXR0cmlidXRlU3VmZml4IiwgIl9tYXJrZXIiLCAiX21hcmtlck1hdGNoIiwgIl9IVE1MX1JFU1VMVCIsICJfZ2V0VGVtcGxhdGVIdG1sIiwgIl9UZW1wbGF0ZUluc3RhbmNlIiwgIl9pc0l0ZXJhYmxlIiwgIl9yZXNvbHZlRGlyZWN0aXZlIiwgIl9DaGlsZFBhcnQiLCAiX0F0dHJpYnV0ZVBhcnQiLCAiX0Jvb2xlYW5BdHRyaWJ1dGVQYXJ0IiwgIl9FdmVudFBhcnQiLCAiX1Byb3BlcnR5UGFydCIsICJfRWxlbWVudFBhcnQiLCAicG9seWZpbGxTdXBwb3J0IiwgImxpdEh0bWxQb2x5ZmlsbFN1cHBvcnQiLCAibGl0SHRtbFZlcnNpb25zIiwgInJlbmRlciIsICJjb250YWluZXIiLCAicGFydE93bmVyTm9kZSIsICJyZW5kZXJCZWZvcmUiLCAiTGl0RWxlbWVudCIsICJSZWFjdGl2ZUVsZW1lbnQiLCAiY29uc3RydWN0b3IiLCAidGhpcyIsICJyZW5kZXJPcHRpb25zIiwgImhvc3QiLCAiX19jaGlsZFBhcnQiLCAiY3JlYXRlUmVuZGVyUm9vdCIsICJyZW5kZXJSb290IiwgInN1cGVyIiwgInJlbmRlckJlZm9yZSIsICJmaXJzdENoaWxkIiwgImNoYW5nZWRQcm9wZXJ0aWVzIiwgInZhbHVlIiwgInJlbmRlciIsICJoYXNVcGRhdGVkIiwgImlzQ29ubmVjdGVkIiwgInVwZGF0ZSIsICJjb25uZWN0ZWRDYWxsYmFjayIsICJzZXRDb25uZWN0ZWQiLCAiZGlzY29ubmVjdGVkQ2FsbGJhY2siLCAibm9DaGFuZ2UiLCAiZ2xvYmFsVGhpcyIsICJsaXRFbGVtZW50SHlkcmF0ZVN1cHBvcnQiLCAicG9seWZpbGxTdXBwb3J0IiwgImxpdEVsZW1lbnRQb2x5ZmlsbFN1cHBvcnQiLCAiZ2xvYmFsVGhpcyIsICJsaXRFbGVtZW50VmVyc2lvbnMiLCAicHVzaCIsICJjdXN0b21FbGVtZW50IiwgInRhZ05hbWUiLCAiY2xhc3NPclRhcmdldCIsICJjb250ZXh0IiwgImFkZEluaXRpYWxpemVyIiwgImN1c3RvbUVsZW1lbnRzIiwgImRlZmluZSIsICJkZWZhdWx0UHJvcGVydHlEZWNsYXJhdGlvbiIsICJhdHRyaWJ1dGUiLCAidHlwZSIsICJTdHJpbmciLCAiY29udmVydGVyIiwgImRlZmF1bHRDb252ZXJ0ZXIiLCAicmVmbGVjdCIsICJoYXNDaGFuZ2VkIiwgIm5vdEVxdWFsIiwgInN0YW5kYXJkUHJvcGVydHkiLCAib3B0aW9ucyIsICJ0YXJnZXQiLCAiY29udGV4dCIsICJraW5kIiwgIm1ldGFkYXRhIiwgInByb3BlcnRpZXMiLCAiZ2xvYmFsVGhpcyIsICJsaXRQcm9wZXJ0eU1ldGFkYXRhIiwgImdldCIsICJzZXQiLCAiTWFwIiwgIm5hbWUiLCAidiIsICJvbGRWYWx1ZSIsICJjYWxsIiwgInRoaXMiLCAicmVxdWVzdFVwZGF0ZSIsICJfJGNoYW5nZVByb3BlcnR5IiwgInZhbHVlIiwgIkVycm9yIiwgInByb3BlcnR5IiwgInByb3RvT3JUYXJnZXQiLCAibmFtZU9yQ29udGV4dCIsICJwcm90byIsICJoYXNPd25Qcm9wZXJ0eSIsICJjb25zdHJ1Y3RvciIsICJjcmVhdGVQcm9wZXJ0eSIsICJ3cmFwcGVkIiwgIk9iamVjdCIsICJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCAic3RhdGUiLCAib3B0aW9ucyIsICJwcm9wZXJ0eSIsICJhdHRyaWJ1dGUiLCAiZGVzYyIsICJvYmoiLCAibmFtZSIsICJkZXNjcmlwdG9yIiwgImNvbmZpZ3VyYWJsZSIsICJlbnVtZXJhYmxlIiwgIlJlZmxlY3QiLCAiZGVjb3JhdGUiLCAiT2JqZWN0IiwgImRlZmluZVByb3BlcnR5IiwgInF1ZXJ5IiwgInNlbGVjdG9yIiwgImNhY2hlIiwgInByb3RvT3JUYXJnZXQiLCAibmFtZU9yQ29udGV4dCIsICJkZXNjcmlwdG9yIiwgImRvUXVlcnkiLCAiZWwiLCAicmVuZGVyUm9vdCIsICJxdWVyeVNlbGVjdG9yIiwgImdldCIsICJzZXQiLCAia2V5IiwgIlN5bWJvbCIsICJ0aGlzIiwgInYiLCAiZGVzYyIsICJyZXN1bHQiLCAiY2FsbCIsICJoYXNVcGRhdGVkIiwgInF1ZXJ5QXNzaWduZWRFbGVtZW50cyIsICJvcHRpb25zIiwgIm9iaiIsICJuYW1lIiwgInNsb3QiLCAic2VsZWN0b3IiLCAic2xvdFNlbGVjdG9yIiwgImRlc2MiLCAiZ2V0IiwgInNsb3RFbCIsICJ0aGlzIiwgInJlbmRlclJvb3QiLCAicXVlcnlTZWxlY3RvciIsICJlbGVtZW50cyIsICJhc3NpZ25lZEVsZW1lbnRzIiwgImZpbHRlciIsICJub2RlIiwgIm1hdGNoZXMiLCAiciIsICJfIiwgImUiLCAidiIsICJpIiwgIl9hIiwgIm4iLCAidCIsICJfYSIsICJ4bWwiLCAiYXR0cmlidXRlcyIsICJ4bWwiLCAieG1sIiwgInIiLCAibiIsICJ0IiwgIm4iLCAiaSIsICJyIiwgInQiLCAiciIsICJ0IiwgInIiLCAidCIsICJyIiwgIm4iLCAidCIsICJfYSIsICJfYiIsICJ2IiwgImkiLCAibiIsICJyIiwgInQiLCAiX2EiLCAiX2IiLCAidiIsICJpIiwgIm4iLCAiciIsICJ0IiwgInIiLCAidCIsICJyIiwgInQiLCAiciIsICJpIiwgIm4iLCAidCIsICJyIiwgInYiLCAibiIsICJpIiwgInQiLCAiaSIsICJ0IiwgImkiLCAidCIsICJpZkRlZmluZWQiLCAidmFsdWUiLCAibm90aGluZyIsICJyIiwgIm4iLCAiaSIsICJvIiwgInIiLCAibiIsICJ0IiwgIl9DaGlsZFBhcnQiLCAiQ2hpbGRQYXJ0IiwgIl8kTEgiLCAiaXNTaW5nbGVFeHByZXNzaW9uIiwgInBhcnQiLCAic3RyaW5ncyIsICJjcmVhdGVNYXJrZXIiLCAiZG9jdW1lbnQiLCAiY3JlYXRlQ29tbWVudCIsICJpbnNlcnRQYXJ0IiwgImNvbnRhaW5lclBhcnQiLCAicmVmUGFydCIsICJjb250YWluZXIiLCAiXyRzdGFydE5vZGUiLCAicGFyZW50Tm9kZSIsICJyZWZOb2RlIiwgIl8kZW5kTm9kZSIsICJzdGFydE5vZGUiLCAiaW5zZXJ0QmVmb3JlIiwgImVuZE5vZGUiLCAiQ2hpbGRQYXJ0IiwgIm9wdGlvbnMiLCAibmV4dFNpYmxpbmciLCAib2xkUGFyZW50IiwgIl8kcGFyZW50IiwgInBhcmVudENoYW5nZWQiLCAibmV3Q29ubmVjdGlvblN0YXRlIiwgIl8kcmVwYXJlbnREaXNjb25uZWN0YWJsZXMiLCAiXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZCIsICJfJGlzQ29ubmVjdGVkIiwgInN0YXJ0IiwgIm4iLCAic2V0Q2hpbGRQYXJ0VmFsdWUiLCAidmFsdWUiLCAiZGlyZWN0aXZlUGFyZW50IiwgIl8kc2V0VmFsdWUiLCAiUkVTRVRfVkFMVUUiLCAic2V0Q29tbWl0dGVkVmFsdWUiLCAiXyRjb21taXR0ZWRWYWx1ZSIsICJnZXRDb21taXR0ZWRWYWx1ZSIsICJyZW1vdmVQYXJ0IiwgImVuZCIsICJyZW1vdmUiLCAiUGFydFR5cGUiLCAiQVRUUklCVVRFIiwgIkNISUxEIiwgIlBST1BFUlRZIiwgIkJPT0xFQU5fQVRUUklCVVRFIiwgIkVWRU5UIiwgIkVMRU1FTlQiLCAiZGlyZWN0aXZlIiwgImMiLCAidmFsdWVzIiwgIl8kbGl0RGlyZWN0aXZlJCIsICJEaXJlY3RpdmUiLCAiX3BhcnRJbmZvIiwgIl8kaXNDb25uZWN0ZWQiLCAidGhpcyIsICJfJHBhcmVudCIsICJwYXJ0IiwgInBhcmVudCIsICJhdHRyaWJ1dGVJbmRleCIsICJfX3BhcnQiLCAiX19hdHRyaWJ1dGVJbmRleCIsICJwcm9wcyIsICJ1cGRhdGUiLCAiX3BhcnQiLCAicmVuZGVyIiwgIm5vdGlmeUNoaWxkcmVuQ29ubmVjdGVkQ2hhbmdlZCIsICJwYXJlbnQiLCAiaXNDb25uZWN0ZWQiLCAiY2hpbGRyZW4iLCAiXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuIiwgIm9iaiIsICJyZW1vdmVEaXNjb25uZWN0YWJsZUZyb21QYXJlbnQiLCAiXyRwYXJlbnQiLCAiZGVsZXRlIiwgInNpemUiLCAiYWRkRGlzY29ubmVjdGFibGVUb1BhcmVudCIsICJTZXQiLCAiaGFzIiwgImFkZCIsICJpbnN0YWxsRGlzY29ubmVjdEFQSSIsICJyZXBhcmVudERpc2Nvbm5lY3RhYmxlcyIsICJuZXdQYXJlbnQiLCAidGhpcyIsICJub3RpZnlDaGlsZFBhcnRDb25uZWN0ZWRDaGFuZ2VkIiwgImlzQ2xlYXJpbmdWYWx1ZSIsICJmcm9tUGFydEluZGV4IiwgInZhbHVlIiwgIl8kY29tbWl0dGVkVmFsdWUiLCAiQXJyYXkiLCAiaXNBcnJheSIsICJpIiwgImxlbmd0aCIsICJ0eXBlIiwgIlBhcnRUeXBlIiwgIkNISUxEIiwgIl8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQiLCAiXyRyZXBhcmVudERpc2Nvbm5lY3RhYmxlcyIsICJBc3luY0RpcmVjdGl2ZSIsICJEaXJlY3RpdmUiLCAiY29uc3RydWN0b3IiLCAicGFydCIsICJhdHRyaWJ1dGVJbmRleCIsICJzdXBlciIsICJfJGluaXRpYWxpemUiLCAiXyRpc0Nvbm5lY3RlZCIsICJpc0NsZWFyaW5nRGlyZWN0aXZlIiwgInJlY29ubmVjdGVkIiwgImRpc2Nvbm5lY3RlZCIsICJpc1NpbmdsZUV4cHJlc3Npb24iLCAiX19wYXJ0IiwgIl8kc2V0VmFsdWUiLCAibmV3VmFsdWVzIiwgIl9fYXR0cmlidXRlSW5kZXgiLCAiY3JlYXRlUmVmIiwgIlJlZiIsICJsYXN0RWxlbWVudEZvckNvbnRleHRBbmRDYWxsYmFjayIsICJXZWFrTWFwIiwgInJlZiIsICJkaXJlY3RpdmUiLCAiQXN5bmNEaXJlY3RpdmUiLCAiX3JlZiIsICJub3RoaW5nIiwgInBhcnQiLCAicmVmQ2hhbmdlZCIsICJ0aGlzIiwgIl91cGRhdGVSZWZWYWx1ZSIsICJ1bmRlZmluZWQiLCAiX2xhc3RFbGVtZW50Rm9yUmVmIiwgIl9lbGVtZW50IiwgIl9jb250ZXh0IiwgIm9wdGlvbnMiLCAiaG9zdCIsICJlbGVtZW50IiwgImlzQ29ubmVjdGVkIiwgImNvbnRleHQiLCAiZ2xvYmFsVGhpcyIsICJsYXN0RWxlbWVudEZvckNhbGxiYWNrIiwgImdldCIsICJzZXQiLCAiY2FsbCIsICJ2YWx1ZSIsICJkaXNjb25uZWN0ZWQiLCAicmVjb25uZWN0ZWQiLCAiaSIsICJlIiwgIm8iLCAibiIsICJyIiwgInQiLCAiXyIsICJfYSIsICJlIiwgIm4iLCAidCIsICJVbnNhZmVIVE1MRGlyZWN0aXZlIiwgIkRpcmVjdGl2ZSIsICJwYXJ0SW5mbyIsICJzdXBlciIsICJ0aGlzIiwgIl92YWx1ZSIsICJub3RoaW5nIiwgInR5cGUiLCAiUGFydFR5cGUiLCAiQ0hJTEQiLCAiRXJyb3IiLCAiY29uc3RydWN0b3IiLCAiZGlyZWN0aXZlTmFtZSIsICJ2YWx1ZSIsICJfdGVtcGxhdGVSZXN1bHQiLCAibm9DaGFuZ2UiLCAic3RyaW5ncyIsICJyYXciLCAiXyRsaXRUeXBlJCIsICJyZXN1bHRUeXBlIiwgInZhbHVlcyIsICJ1bnNhZmVIVE1MIiwgImRpcmVjdGl2ZSIsICJpIiwgIm8iLCAiciIsICJuIiwgInQiLCAiaSIsICJqIiwgIm4iLCAiX2EiLCAiYyIsICJhIiwgImIiLCAiaSIsICJuIiwgImkiLCAibiIsICJ0IiwgInIiLCAiaSIsICJ0IiwgInIiLCAiaSIsICJ0IiwgInIiLCAidCIsICJuIiwgImkiLCAidiIsICJyIiwgImkiLCAiaSIsICJyIiwgImUiLCAidiIsICJpIiwgImMiLCAiZSIsICJuIiwgIngiLCAidiIsICJuIiwgIm4iLCAiciIsICJuIiwgInIiLCAibiIsICJfYSIsICJpIiwgImMiLCAiZSIsICJyIiwgIl9hIiwgIl9iIiwgInYiLCAibiIsICJ2MiIsICJuIiwgImMiLCAiYSIsICJiIiwgInYiLCAiZSIsICJwIiwgImEiLCAiYyIsICJrIiwgInJlcXVpcmUiLCAibiIsICJyIiwgInQiLCAiZSIsICJ4IiwgInkiLCAiX2EiLCAiX2EiLCAibiIsICJfYSIsICJlIiwgIm4iLCAiZCIsICJkcmFnZ2FibGUiLCAicGFyZW50IiwgImluZGV4IiwgInRhcmdldEluZGV4IiwgIm4iLCAiaSIsICJfIiwgInIiLCAidCIsICJpZnJhbWUiLCAiZSIsICJuIiwgInIiLCAidCIsICJlIiwgIm4iLCAidCIsICJ4IiwgIl9hIiwgIl9iIiwgImkiLCAidCIsICJnZW5lcmF0ZU1hcCIsICJsaXN0IiwgInN0YXJ0IiwgImVuZCIsICJtYXAiLCAiTWFwIiwgImkiLCAic2V0IiwgInJlcGVhdCIsICJkaXJlY3RpdmUiLCAiRGlyZWN0aXZlIiwgInBhcnRJbmZvIiwgInN1cGVyIiwgInR5cGUiLCAiUGFydFR5cGUiLCAiQ0hJTEQiLCAiRXJyb3IiLCAiaXRlbXMiLCAia2V5Rm5PclRlbXBsYXRlIiwgInRlbXBsYXRlIiwgImtleUZuIiwgImtleXMiLCAidmFsdWVzIiwgImluZGV4IiwgIml0ZW0iLCAidGhpcyIsICJfZ2V0VmFsdWVzQW5kS2V5cyIsICJjb250YWluZXJQYXJ0IiwgIm9sZFBhcnRzIiwgImdldENvbW1pdHRlZFZhbHVlIiwgIm5ld1ZhbHVlcyIsICJuZXdLZXlzIiwgIkFycmF5IiwgImlzQXJyYXkiLCAiX2l0ZW1LZXlzIiwgIm9sZEtleXMiLCAibmV3UGFydHMiLCAibmV3S2V5VG9JbmRleE1hcCIsICJvbGRLZXlUb0luZGV4TWFwIiwgIm9sZEhlYWQiLCAib2xkVGFpbCIsICJsZW5ndGgiLCAibmV3SGVhZCIsICJuZXdUYWlsIiwgInNldENoaWxkUGFydFZhbHVlIiwgImluc2VydFBhcnQiLCAiaGFzIiwgIm9sZEluZGV4IiwgImdldCIsICJvbGRQYXJ0IiwgIm5ld1BhcnQiLCAicmVtb3ZlUGFydCIsICJzZXRDb21taXR0ZWRWYWx1ZSIsICJub0NoYW5nZSIsICJwIiwgIl9hIiwgIl9iIiwgIm8iLCAiYyIsICJlIiwgIl8iLCAiaSIsICJzIiwgInIiLCAidCIsICJlIiwgInMiLCAiaSIsICJ0IiwgImUiLCAiaSIsICJob3RzcG90IiwgInMiLCAidCIsICJlIiwgInMiLCAiaSIsICJ0IiwgInIiLCAiaSIsICJuIiwgInQiLCAiaSIsICJlIiwgInYiLCAiaSIsICJvIiwgInIiLCAibiIsICJ0IiwgImkiLCAidCIsICJfIiwgImkiLCAibyIsICJkIiwgInIiLCAibiIsICJ0IiwgInIiLCAiaSIsICJyIiwgImEiLCAiaSIsICJ0IiwgImltcG9ydGFudCIsICJpbXBvcnRhbnRGbGFnIiwgInN0eWxlTWFwIiwgImRpcmVjdGl2ZSIsICJEaXJlY3RpdmUiLCAicGFydEluZm8iLCAic3VwZXIiLCAidHlwZSIsICJQYXJ0VHlwZSIsICJBVFRSSUJVVEUiLCAibmFtZSIsICJzdHJpbmdzIiwgImxlbmd0aCIsICJFcnJvciIsICJzdHlsZUluZm8iLCAiT2JqZWN0IiwgImtleXMiLCAicmVkdWNlIiwgInN0eWxlIiwgInByb3AiLCAidmFsdWUiLCAiaW5jbHVkZXMiLCAicmVwbGFjZSIsICJ0b0xvd2VyQ2FzZSIsICJwYXJ0IiwgImVsZW1lbnQiLCAidGhpcyIsICJfcHJldmlvdXNTdHlsZVByb3BlcnRpZXMiLCAiU2V0IiwgInJlbmRlciIsICJkZWxldGUiLCAicmVtb3ZlUHJvcGVydHkiLCAiYWRkIiwgImlzSW1wb3J0YW50IiwgImVuZHNXaXRoIiwgInNldFByb3BlcnR5IiwgInNsaWNlIiwgIm5vQ2hhbmdlIiwgIngiLCAieSIsICJjIiwgIm8iLCAiZSIsICJfIiwgImkiLCAibiIsICJyIiwgInQiLCAiZXZlbnQiLCAieCIsICJkaWZmWCIsICJlIiwgImkiLCAibiIsICJ0IiwgInIiLCAiX2EiLCAiX2IiLCAiZSIsICJ2IiwgInQiLCAiciIsICJpIiwgInQiLCAiciIsICJpIiwgIm4iLCAidCIsICJyIiwgImkiLCAibiIsICJ0IiwgInIiLCAiaSIsICJuIiwgInQiLCAiciIsICJpIiwgIm4iLCAidCIsICJyIiwgImkiLCAidCIsICJyIiwgImkiLCAibiIsICJ0IiwgInIiLCAiaSIsICJuIiwgInQiLCAiX2EiLCAibiIsICJyIiwgInQiXQp9Cg==
7851
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL0BsaXQvY29udGV4dC9zcmMvbGliL2NvbnRleHQtcmVxdWVzdC1ldmVudC50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9jb250ZXh0L3NyYy9saWIvY3JlYXRlLWNvbnRleHQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvY29udGV4dC9zcmMvbGliL2NvbnRyb2xsZXJzL2NvbnRleHQtY29uc3VtZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvY29udGV4dC9zcmMvbGliL3ZhbHVlLW5vdGlmaWVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L2NvbnRleHQvc3JjL2xpYi9jb250cm9sbGVycy9jb250ZXh0LXByb3ZpZGVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L2NvbnRleHQvc3JjL2xpYi9kZWNvcmF0b3JzL3Byb3ZpZGUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvY29udGV4dC9zcmMvbGliL2RlY29yYXRvcnMvY29uc3VtZS50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC1sYWJzL3Nzci1kb20tc2hpbS9zcmMvbGliL2VsZW1lbnQtaW50ZXJuYWxzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0LWxhYnMvc3NyLWRvbS1zaGltL3NyYy9pbmRleC50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3NyYy9jc3MtdGFnLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvc3JjL3JlYWN0aXZlLWVsZW1lbnQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL3NyYy9saXQtaHRtbC50cyIsICIuLi9ub2RlX21vZHVsZXMvbGl0LWVsZW1lbnQvc3JjL2xpdC1lbGVtZW50LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvc3JjL2RlY29yYXRvcnMvY3VzdG9tLWVsZW1lbnQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9zcmMvZGVjb3JhdG9ycy9wcm9wZXJ0eS50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3NyYy9kZWNvcmF0b3JzL3N0YXRlLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvc3JjL2RlY29yYXRvcnMvYmFzZS50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3NyYy9kZWNvcmF0b3JzL3F1ZXJ5LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvc3JjL2RlY29yYXRvcnMvcXVlcnktYXNzaWduZWQtZWxlbWVudHMudHMiLCAiLi4vc3JjL2xpYi9kZWNvcmF0b3JzL3dhdGNoLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0udHMiLCAiLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL3F0aS10cmFuc2Zvcm1lcnMudHMiLCAiLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL3F0aS10cmFuc2Zvcm0taXRlbS50cyIsICIuLi9zcmMvbGliL3F0aS10cmFuc2Zvcm1lcnMvcXRpLXRyYW5zZm9ybS1tYW5pZmVzdC50cyIsICIuLi9zcmMvbGliL3F0aS10cmFuc2Zvcm1lcnMvcXRpLXRyYW5zZm9ybS10ZXN0LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pdGVtLWJvZHkvcXRpLWl0ZW0tYm9keS5zdHlsZXMudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHkudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcHJvbXB0L3F0aS1wcm9tcHQudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktc3R5bGVzaGVldC9xdGktc3R5bGVzaGVldC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1ydWJyaWMtYmxvY2svcXRpLWNvbnRlbnQtYm9keS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1ydWJyaWMtYmxvY2svcXRpLXJ1YnJpYy1ibG9jay50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3V0aWxzLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2stYmxvY2svcXRpLWZlZWRiYWNrLWJsb2NrLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1pbmxpbmUvcXRpLWZlZWRiYWNrLWlubGluZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlLWhlbHBlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL3NyYy9kaXJlY3RpdmUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL3NyYy9hc3luYy1kaXJlY3RpdmUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL3NyYy9kaXJlY3RpdmVzL3JlZi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLm1peGluLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvdm9jYWJ1bGFyeS92b2NhYnVsYXJ5LW1peGluLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi9xdGktY2hvaWNlLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdGVtcGxhdGUtc3RyaW5ncy50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXJ1bGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktbG9va3VwLW91dGNvbWUtdmFsdWUvcXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbi9xdGktcmVzcG9uc2UtY29uZGl0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXNldC1vdXRjb21lLXZhbHVlL3F0aS1zZXQtb3V0Y29tZS12YWx1ZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1lbHNlL3F0aS1yZXNwb25zZS1lbHNlLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLWVsc2UvcXRpLXJlc3BvbnNlLWlmL3F0aS1yZXNwb25zZS1pZi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1lbHNlL3F0aS1yZXNwb25zZS1pZi9xdGktcmVzcG9uc2UtZWxzZS1pZi9xdGktcmVzcG9uc2UtZWxzZS1pZi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWFuZC9xdGktYW5kLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWFuZC9pbmRleC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1iYXNldmFsdWUvcXRpLWJhc2V2YWx1ZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1jb250YWlucy9xdGktY29udGFpbnMudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktY29ycmVjdC9xdGktY29ycmVjdC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1lcXVhbC1yb3VuZGVkL3F0aS1lcXVhbC1yb3VuZGVkLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWVxdWFsL3F0aS1lcXVhbC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1ndC9xdGktZ3QudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZ3RlL3F0aS1ndGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktaXMtbnVsbC9xdGktaXMtbnVsbC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1sdC9xdGktbHQudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbHRlL3F0aS1sdGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwLXJlc3BvbnNlL3F0aS1tYXAtcmVzcG9uc2UudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwcGluZy9xdGktbWFwcGluZy50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXRjaC9xdGktbWF0Y2gudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWVtYmVyL3F0aS1tZW1iZXIudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbXVsdGlwbGUvcXRpLW11bHRpcGxlLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW5vdC9xdGktbm90LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW9yL3F0aS1vci50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1vcmRlcmVkL3F0aS1vcmRlcmVkLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXByaW50ZWQtdmFyaWFibGUvcXRpLXByaW50ZWQtdmFyaWFibGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktcHJvZHVjdC9xdGktcHJvZHVjdC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1zdHJpbmctbWF0Y2gvcXRpLXN0cmluZy1tYXRjaC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1zdW0vcXRpLXN1bS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS12YXJpYWJsZS9xdGktdmFyaWFibGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtYXBpLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcm9wcGFibGVzLW1peGluLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9mbGlwcGFibGVzLW1peGluLnRzIiwgIi4uL3NyYy9saWIvZGVjb3JhdG9ycy9saXZlLXF1ZXJ5LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uLnN0eWxlcy50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbi9xdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlcy9yZXBlYXQudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uLnN0eWxlcy50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbi9xdGktbWVkaWEtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uL3F0aS1vcmRlci1pbnRlcmFjdGlvbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlcy9zdHlsZS1tYXAudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1jdXN0b20tb3BlcmF0b3IvcXRpLWN1c3RvbS1vcGVyYXRvci50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYWJsZS1ob3RzcG90LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1pbWcudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC10ZXh0LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWNob2ljZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90dGV4dC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2ltcGxlLWNob2ljZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL2luZGV4LnRzIiwgIi4uL3NyYy9saWIvcXRpLWl0ZW0vcXRpLWl0ZW0ubWl4aW4udHMiLCAiLi4vc3JjL2xpYi9xdGktaXRlbS9xdGktaXRlbS50cyIsICIuLi9zcmMvbGliL3F0aS1sb2FkZXIvcXRpLWxvYWRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbmltcG9ydCB7Q29udGV4dFR5cGUsIENvbnRleHR9IGZyb20gJy4vY3JlYXRlLWNvbnRleHQuanMnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudEV2ZW50TWFwIHtcbiAgICAvKipcbiAgICAgKiBBICdjb250ZXh0LXJlcXVlc3QnIGV2ZW50IGNhbiBiZSBlbWl0dGVkIGJ5IGFueSBlbGVtZW50IHdoaWNoIGRlc2lyZXNcbiAgICAgKiBhIGNvbnRleHQgdmFsdWUgdG8gYmUgaW5qZWN0ZWQgYnkgYW4gZXh0ZXJuYWwgcHJvdmlkZXIuXG4gICAgICovXG4gICAgJ2NvbnRleHQtcmVxdWVzdCc6IENvbnRleHRSZXF1ZXN0RXZlbnQ8Q29udGV4dDx1bmtub3duLCB1bmtub3duPj47XG4gIH1cbn1cblxuLyoqXG4gKiBBIGNhbGxiYWNrIHdoaWNoIGlzIHByb3ZpZGVkIGJ5IGEgY29udGV4dCByZXF1ZXN0ZXIgYW5kIGlzIGNhbGxlZCB3aXRoIHRoZSB2YWx1ZSBzYXRpc2Z5aW5nIHRoZSByZXF1ZXN0LlxuICogVGhpcyBjYWxsYmFjayBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGJ5IGNvbnRleHQgcHJvdmlkZXJzIGFzIHRoZSByZXF1ZXN0ZWQgdmFsdWUgaXMgY2hhbmdlZC5cbiAqL1xuZXhwb3J0IHR5cGUgQ29udGV4dENhbGxiYWNrPFZhbHVlVHlwZT4gPSAoXG4gIHZhbHVlOiBWYWx1ZVR5cGUsXG4gIHVuc3Vic2NyaWJlPzogKCkgPT4gdm9pZFxuKSA9PiB2b2lkO1xuXG4vKipcbiAqIEludGVyZmFjZSBkZWZpbml0aW9uIGZvciBhIENvbnRleHRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGV4dFJlcXVlc3Q8QyBleHRlbmRzIENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4+IHtcbiAgcmVhZG9ubHkgY29udGV4dDogQztcbiAgcmVhZG9ubHkgY2FsbGJhY2s6IENvbnRleHRDYWxsYmFjazxDb250ZXh0VHlwZTxDPj47XG4gIHJlYWRvbmx5IHN1YnNjcmliZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gZXZlbnQgZmlyZWQgYnkgYSBjb250ZXh0IHJlcXVlc3RlciB0byBzaWduYWwgaXQgZGVzaXJlcyBhIHNwZWNpZmllZCBjb250ZXh0IHdpdGggdGhlIGdpdmVuIGtleS5cbiAqXG4gKiBBIHByb3ZpZGVyIHNob3VsZCBpbnNwZWN0IHRoZSBgY29udGV4dGAgcHJvcGVydHkgb2YgdGhlIGV2ZW50IHRvIGRldGVybWluZSBpZiBpdCBoYXMgYSB2YWx1ZSB0aGF0IGNhblxuICogc2F0aXNmeSB0aGUgcmVxdWVzdCwgY2FsbGluZyB0aGUgYGNhbGxiYWNrYCB3aXRoIHRoZSByZXF1ZXN0ZWQgdmFsdWUgaWYgc28uXG4gKlxuICogSWYgdGhlIHJlcXVlc3RlZCBjb250ZXh0IGV2ZW50IGNvbnRhaW5zIGEgdHJ1dGh5IGBzdWJzY3JpYmVgIHZhbHVlLCB0aGVuIGEgcHJvdmlkZXIgY2FuIGNhbGwgdGhlIGNhbGxiYWNrXG4gKiBtdWx0aXBsZSB0aW1lcyBpZiB0aGUgdmFsdWUgaXMgY2hhbmdlZCwgaWYgdGhpcyBpcyB0aGUgY2FzZSB0aGUgcHJvdmlkZXIgc2hvdWxkIHBhc3MgYW4gYHVuc3Vic2NyaWJlYFxuICogbWV0aG9kIHRvIHRoZSBjYWxsYmFjayB3aGljaCBjb25zdW1lcnMgY2FuIGludm9rZSB0byBpbmRpY2F0ZSB0aGV5IG5vIGxvbmdlciB3aXNoIHRvIHJlY2VpdmUgdGhlc2UgdXBkYXRlcy5cbiAqXG4gKiBJZiBubyBgc3Vic2NyaWJlYCB2YWx1ZSBpcyBwcmVzZW50IGluIHRoZSBldmVudCwgdGhlbiB0aGUgcHJvdmlkZXIgY2FuIGFzc3VtZSB0aGF0IHRoaXMgaXMgYSAnb25lIHRpbWUnXG4gKiByZXF1ZXN0IGZvciB0aGUgY29udGV4dCBhbmQgY2FuIHRoZXJlZm9yZSBub3QgdHJhY2sgdGhlIGNvbnN1bWVyLlxuICovXG5leHBvcnQgY2xhc3MgQ29udGV4dFJlcXVlc3RFdmVudDxDIGV4dGVuZHMgQ29udGV4dDx1bmtub3duLCB1bmtub3duPj5cbiAgZXh0ZW5kcyBFdmVudFxuICBpbXBsZW1lbnRzIENvbnRleHRSZXF1ZXN0PEM+XG57XG4gIHJlYWRvbmx5IGNvbnRleHQ6IEM7XG4gIHJlYWRvbmx5IGNhbGxiYWNrOiBDb250ZXh0Q2FsbGJhY2s8Q29udGV4dFR5cGU8Qz4+O1xuICByZWFkb25seSBzdWJzY3JpYmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBrZXkgdG8gcmVxdWVzdFxuICAgKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRoYXQgc2hvdWxkIGJlIGludm9rZWQgd2hlbiB0aGUgY29udGV4dCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGlzIGF2YWlsYWJsZVxuICAgKiBAcGFyYW0gc3Vic2NyaWJlIHdoZW4sIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gc3Vic2NyaWJlIHRvIGZ1dHVyZSB1cGRhdGVzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBjb250ZXh0OiBDLFxuICAgIGNhbGxiYWNrOiBDb250ZXh0Q2FsbGJhY2s8Q29udGV4dFR5cGU8Qz4+LFxuICAgIHN1YnNjcmliZT86IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIoJ2NvbnRleHQtcmVxdWVzdCcsIHtidWJibGVzOiB0cnVlLCBjb21wb3NlZDogdHJ1ZX0pO1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuc3Vic2NyaWJlID0gc3Vic2NyaWJlID8/IGZhbHNlO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbi8qKlxuICogVGhlIENvbnRleHQgdHlwZSBkZWZpbmVzIGEgdHlwZSBicmFuZCB0byBhc3NvY2lhdGUgYSBrZXkgdmFsdWUgd2l0aCB0aGUgY29udGV4dCB2YWx1ZSB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHQ8S2V5VHlwZSwgVmFsdWVUeXBlPiA9IEtleVR5cGUgJiB7X19jb250ZXh0X186IFZhbHVlVHlwZX07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIENvbnRleHQgaW5zdGVhZFxuICovXG5leHBvcnQgdHlwZSBDb250ZXh0S2V5PEtleVR5cGUsIFZhbHVlVHlwZT4gPSBDb250ZXh0PEtleVR5cGUsIFZhbHVlVHlwZT47XG5cbi8qKlxuICogQSBoZWxwZXIgdHlwZSB3aGljaCBjYW4gZXh0cmFjdCBhIENvbnRleHQgdmFsdWUgdHlwZSBmcm9tIGEgQ29udGV4dCB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHRUeXBlPEtleSBleHRlbmRzIENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4+ID1cbiAgS2V5IGV4dGVuZHMgQ29udGV4dDx1bmtub3duLCBpbmZlciBWYWx1ZVR5cGU+ID8gVmFsdWVUeXBlIDogbmV2ZXI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHR5cGVkIENvbnRleHQuXG4gKlxuICogQ29udGV4dHMgYXJlIGNvbXBhcmVkIHdpdGggc3RyaWN0IGVxdWFsaXR5LlxuICpcbiAqIElmIHlvdSB3YW50IHR3byBzZXBhcmF0ZSBgY3JlYXRlQ29udGV4dCgpYCBjYWxscyB0byByZWZlcmVyIHRvIHRoZSBzYW1lXG4gKiBjb250ZXh0LCB0aGVuIHVzZSBhIGtleSB0aGF0IHdpbGwgYnkgZXF1YWwgdW5kZXIgc3RyaWN0IGVxdWFsaXR5IGxpa2UgYVxuICogc3RyaW5nIGZvciBgU3ltYm9sLmZvcigpYDpcbiAqXG4gKiBgYGB0c1xuICogLy8gdHJ1ZVxuICogY3JlYXRlQ29udGV4dCgnbXktY29udGV4dCcpID09PSBjcmVhdGVDb250ZXh0KCdteS1jb250ZXh0JylcbiAqIC8vIHRydWVcbiAqIGNyZWF0ZUNvbnRleHQoU3ltYm9sLmZvcignbXktY29udGV4dCcpKSA9PT0gY3JlYXRlQ29udGV4dChTeW1ib2wuZm9yKCdteS1jb250ZXh0JykpXG4gKiBgYGBcbiAqXG4gKiBJZiB5b3Ugd2FudCBhIGNvbnRleHQgdG8gYmUgdW5pcXVlIHNvIHRoYXQgaXQncyBndWFyYW50ZWVkIHRvIG5vdCBjb2xsaWRlXG4gKiB3aXRoIG90aGVyIGNvbnRleHRzLCB1c2UgYSBrZXkgdGhhdCdzIHVuaXF1ZSB1bmRlciBzdHJpY3QgZXF1YWxpdHksIGxpa2VcbiAqIGEgYFN5bWJvbCgpYCBvciBvYmplY3QuOlxuICpcbiAqIGBgYFxuICogLy8gZmFsc2VcbiAqIGNyZWF0ZUNvbnRleHQoe30pID09PSBjcmVhdGVDb250ZXh0KHt9KVxuICogLy8gZmFsc2VcbiAqIGNyZWF0ZUNvbnRleHQoU3ltYm9sKCdteS1jb250ZXh0JykpID09PSBjcmVhdGVDb250ZXh0KFN5bWJvbCgnbXktY29udGV4dCcpKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGtleSBhIGNvbnRleHQga2V5IHZhbHVlXG4gKiBAdGVtcGxhdGUgVmFsdWVUeXBlIHRoZSB0eXBlIG9mIHZhbHVlIHRoYXQgY2FuIGJlIHByb3ZpZGVkIGJ5IHRoaXMgY29udGV4dC5cbiAqIEByZXR1cm5zIHRoZSBjb250ZXh0IGtleSB2YWx1ZSBjYXN0IHRvIGBDb250ZXh0PEssIFZhbHVlVHlwZT5gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250ZXh0PFZhbHVlVHlwZSwgSyA9IHVua25vd24+KGtleTogSykge1xuICByZXR1cm4ga2V5IGFzIENvbnRleHQ8SywgVmFsdWVUeXBlPjtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29udGV4dENhbGxiYWNrLFxuICBDb250ZXh0UmVxdWVzdEV2ZW50LFxufSBmcm9tICcuLi9jb250ZXh0LXJlcXVlc3QtZXZlbnQuanMnO1xuaW1wb3J0IHR5cGUge0NvbnRleHQsIENvbnRleHRUeXBlfSBmcm9tICcuLi9jcmVhdGUtY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJlYWN0aXZlQ29udHJvbGxlcixcbiAgUmVhY3RpdmVDb250cm9sbGVySG9zdCxcbn0gZnJvbSAnQGxpdC9yZWFjdGl2ZS1lbGVtZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBPcHRpb25zPEMgZXh0ZW5kcyBDb250ZXh0PHVua25vd24sIHVua25vd24+PiB7XG4gIGNvbnRleHQ6IEM7XG4gIGNhbGxiYWNrPzogKHZhbHVlOiBDb250ZXh0VHlwZTxDPiwgZGlzcG9zZT86ICgpID0+IHZvaWQpID0+IHZvaWQ7XG4gIHN1YnNjcmliZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBSZWFjdGl2ZUNvbnRyb2xsZXIgd2hpY2ggYWRkcyBjb250ZXh0IGNvbnN1bWluZyBiZWhhdmlvciB0byBhIGN1c3RvbVxuICogZWxlbWVudCBieSBkaXNwYXRjaGluZyBgY29udGV4dC1yZXF1ZXN0YCBldmVudHMuXG4gKlxuICogV2hlbiB0aGUgaG9zdCBlbGVtZW50IGlzIGNvbm5lY3RlZCB0byB0aGUgZG9jdW1lbnQgaXQgd2lsbCBlbWl0IGFcbiAqIGBjb250ZXh0LXJlcXVlc3RgIGV2ZW50IHdpdGggaXRzIGNvbnRleHQga2V5LiBXaGVuIHRoZSBjb250ZXh0IHJlcXVlc3RcbiAqIGlzIHNhdGlzZmllZCB0aGUgY29udHJvbGxlciB3aWxsIGludm9rZSB0aGUgY2FsbGJhY2ssIGlmIHByZXNlbnQsIGFuZFxuICogdHJpZ2dlciBhIGhvc3QgdXBkYXRlIHNvIGl0IGNhbiByZXNwb25kIHRvIHRoZSBuZXcgdmFsdWUuXG4gKlxuICogSXQgd2lsbCBhbHNvIGNhbGwgdGhlIGRpc3Bvc2UgbWV0aG9kIGdpdmVuIGJ5IHRoZSBwcm92aWRlciB3aGVuIHRoZVxuICogaG9zdCBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRleHRDb25zdW1lcjxcbiAgQyBleHRlbmRzIENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4sXG4gIEhvc3RFbGVtZW50IGV4dGVuZHMgUmVhY3RpdmVDb250cm9sbGVySG9zdCAmIEhUTUxFbGVtZW50LFxuPiBpbXBsZW1lbnRzIFJlYWN0aXZlQ29udHJvbGxlclxue1xuICBwcm90ZWN0ZWQgaG9zdDogSG9zdEVsZW1lbnQ7XG4gIHByaXZhdGUgY29udGV4dDogQztcbiAgcHJpdmF0ZSBjYWxsYmFjaz86ICh2YWx1ZTogQ29udGV4dFR5cGU8Qz4sIGRpc3Bvc2U/OiAoKSA9PiB2b2lkKSA9PiB2b2lkO1xuICBwcml2YXRlIHN1YnNjcmliZSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcHJvdmlkZWQgPSBmYWxzZTtcblxuICB2YWx1ZT86IENvbnRleHRUeXBlPEM+ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGhvc3Q6IEhvc3RFbGVtZW50LCBvcHRpb25zOiBPcHRpb25zPEM+KTtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBuZXcgQ29udGV4dENvbnN1bWVyKGhvc3QsIG9wdGlvbnMpICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvc3Q6IEhvc3RFbGVtZW50LFxuICAgIGNvbnRleHQ6IEMsXG4gICAgY2FsbGJhY2s/OiAodmFsdWU6IENvbnRleHRUeXBlPEM+LCBkaXNwb3NlPzogKCkgPT4gdm9pZCkgPT4gdm9pZCxcbiAgICBzdWJzY3JpYmU/OiBib29sZWFuXG4gICk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvc3Q6IEhvc3RFbGVtZW50LFxuICAgIGNvbnRleHRPck9wdGlvbnM6IEMgfCBPcHRpb25zPEM+LFxuICAgIGNhbGxiYWNrPzogKHZhbHVlOiBDb250ZXh0VHlwZTxDPiwgZGlzcG9zZT86ICgpID0+IHZvaWQpID0+IHZvaWQsXG4gICAgc3Vic2NyaWJlPzogYm9vbGVhblxuICApIHtcbiAgICB0aGlzLmhvc3QgPSBob3N0O1xuICAgIC8vIFRoaXMgaXMgYSBwb3RlbnRpYWxseSBmcmFnaWxlIGR1Y2stdHlwZS4gSXQgbWVhbnMgYSBjb250ZXh0IG9iamVjdCBjYW4ndFxuICAgIC8vIGhhdmUgYSBwcm9wZXJ0eSBuYW1lIGNvbnRleHQgYW5kIGJlIHVzZWQgaW4gcG9zaXRpb25hbCBhcmd1bWVudCBmb3JtLlxuICAgIGlmICgoY29udGV4dE9yT3B0aW9ucyBhcyBPcHRpb25zPEM+KS5jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb250ZXh0T3JPcHRpb25zIGFzIE9wdGlvbnM8Qz47XG4gICAgICB0aGlzLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgICB0aGlzLmNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcbiAgICAgIHRoaXMuc3Vic2NyaWJlID0gb3B0aW9ucy5zdWJzY3JpYmUgPz8gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRPck9wdGlvbnMgYXMgQztcbiAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgIHRoaXMuc3Vic2NyaWJlID0gc3Vic2NyaWJlID8/IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmhvc3QuYWRkQ29udHJvbGxlcih0aGlzKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmU/OiAoKSA9PiB2b2lkO1xuXG4gIGhvc3RDb25uZWN0ZWQoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaFJlcXVlc3QoKTtcbiAgfVxuXG4gIGhvc3REaXNjb25uZWN0ZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudW5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaFJlcXVlc3QoKSB7XG4gICAgdGhpcy5ob3N0LmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ29udGV4dFJlcXVlc3RFdmVudCh0aGlzLmNvbnRleHQsIHRoaXMuX2NhbGxiYWNrLCB0aGlzLnN1YnNjcmliZSlcbiAgICApO1xuICB9XG5cbiAgLy8gVGhpcyBmdW5jdGlvbiBtdXN0IGhhdmUgc3RhYmxlIGlkZW50aXR5IHRvIHByb3Blcmx5IGRlZHVwZSBpbiBDb250ZXh0Um9vdFxuICAvLyBpZiB0aGlzIGVsZW1lbnQgY29ubmVjdHMgbXVsdGlwbGUgdGltZXMuXG4gIHByaXZhdGUgX2NhbGxiYWNrOiBDb250ZXh0Q2FsbGJhY2s8Q29udGV4dFR5cGU8Qz4+ID0gKHZhbHVlLCB1bnN1YnNjcmliZSkgPT4ge1xuICAgIC8vIHNvbWUgcHJvdmlkZXJzIHdpbGwgcGFzcyBhbiB1bnN1YnNjcmliZSBmdW5jdGlvbiBpbmRpY2F0aW5nIHRoZXkgbWF5IHByb3ZpZGUgZnV0dXJlIHZhbHVlc1xuICAgIGlmICh0aGlzLnVuc3Vic2NyaWJlKSB7XG4gICAgICAvLyBpZiB0aGUgdW5zdWJzY3JpYmUgZnVuY3Rpb24gY2hhbmdlcyB0aGlzIGltcGxpZXMgd2UgaGF2ZSBjaGFuZ2VkIHByb3ZpZGVyXG4gICAgICBpZiAodGhpcy51bnN1YnNjcmliZSAhPT0gdW5zdWJzY3JpYmUpIHtcbiAgICAgICAgLy8gY2xlYW51cCB0aGUgb2xkIHByb3ZpZGVyXG4gICAgICAgIHRoaXMucHJvdmlkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgICAgLy8gaWYgd2UgZG9uJ3Qgc3VwcG9ydCBzdWJzY3JpcHRpb24sIGltbWVkaWF0ZWx5IHVuc3Vic2NyaWJlXG4gICAgICBpZiAoIXRoaXMuc3Vic2NyaWJlKSB7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzdG9yZSB0aGUgdmFsdWUgc28gdGhhdCBpdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIGNvbnRyb2xsZXJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgLy8gc2NoZWR1bGUgYW4gdXBkYXRlIGluIGNhc2UgdGhpcyB2YWx1ZSBpcyB1c2VkIGluIGEgdGVtcGxhdGVcbiAgICB0aGlzLmhvc3QucmVxdWVzdFVwZGF0ZSgpO1xuXG4gICAgLy8gb25seSBpbnZva2UgY2FsbGJhY2sgaWYgd2UgYXJlIGVpdGhlciBleHBlY3RpbmcgdXBkYXRlcyBvciBoYXZlIG5vdCB5ZXRcbiAgICAvLyBiZWVuIHByb3ZpZGVkIGEgdmFsdWVcbiAgICBpZiAoIXRoaXMucHJvdmlkZWQgfHwgdGhpcy5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMucHJvdmlkZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5jYWxsYmFjayh2YWx1ZSwgdW5zdWJzY3JpYmUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudW5zdWJzY3JpYmUgPSB1bnN1YnNjcmliZTtcbiAgfTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtDb250ZXh0Q2FsbGJhY2t9IGZyb20gJy4vY29udGV4dC1yZXF1ZXN0LWV2ZW50LmpzJztcblxuLyoqXG4gKiBBIGRpc3Bvc2VyIGZ1bmN0aW9uXG4gKi9cbnR5cGUgRGlzcG9zZXIgPSAoKSA9PiB2b2lkO1xuXG5pbnRlcmZhY2UgQ2FsbGJhY2tJbmZvIHtcbiAgZGlzcG9zZXI6IERpc3Bvc2VyO1xuICBjb25zdW1lckhvc3Q6IEVsZW1lbnQ7XG59XG5cbi8qKlxuICogQSBzaW1wbGUgY2xhc3Mgd2hpY2ggc3RvcmVzIGEgdmFsdWUsIGFuZCB0cmlnZ2VycyByZWdpc3RlcmVkIGNhbGxiYWNrcyB3aGVuXG4gKiB0aGUgdmFsdWUgaXMgY2hhbmdlZCB2aWEgaXRzIHNldHRlci5cbiAqXG4gKiBBbiBpbXBsZW1lbnRvciBtaWdodCB1c2Ugb3RoZXIgb2JzZXJ2YWJsZSBwYXR0ZXJucyBzdWNoIGFzIE1vYlggb3IgUmVkdXggdG9cbiAqIGdldCBiZWhhdmlvciBsaWtlIHRoaXMuIEJ1dCB0aGlzIGlzIGEgcHJldHR5IG1pbmltYWwgYXBwcm9hY2ggdGhhdCB3aWxsXG4gKiBsaWtlbHkgd29yayBmb3IgYSBudW1iZXIgb2YgdXNlIGNhc2VzLlxuICovXG5leHBvcnQgY2xhc3MgVmFsdWVOb3RpZmllcjxUPiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IE1hcDxcbiAgICBDb250ZXh0Q2FsbGJhY2s8VD4sXG4gICAgQ2FsbGJhY2tJbmZvXG4gID4oKTtcbiAgcHJpdmF0ZSBfdmFsdWUhOiBUO1xuICBnZXQgdmFsdWUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2OiBUKSB7XG4gICAgdGhpcy5zZXRWYWx1ZSh2KTtcbiAgfVxuXG4gIHNldFZhbHVlKHY6IFQsIGZvcmNlID0gZmFsc2UpIHtcbiAgICBjb25zdCB1cGRhdGUgPSBmb3JjZSB8fCAhT2JqZWN0LmlzKHYsIHRoaXMuX3ZhbHVlKTtcbiAgICB0aGlzLl92YWx1ZSA9IHY7XG4gICAgaWYgKHVwZGF0ZSkge1xuICAgICAgdGhpcy51cGRhdGVPYnNlcnZlcnMoKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihkZWZhdWx0VmFsdWU/OiBUKSB7XG4gICAgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZU9ic2VydmVycyA9ICgpOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IFtjYWxsYmFjaywge2Rpc3Bvc2VyfV0gb2YgdGhpcy5zdWJzY3JpcHRpb25zKSB7XG4gICAgICBjYWxsYmFjayh0aGlzLl92YWx1ZSwgZGlzcG9zZXIpO1xuICAgIH1cbiAgfTtcblxuICBhZGRDYWxsYmFjayhcbiAgICBjYWxsYmFjazogQ29udGV4dENhbGxiYWNrPFQ+LFxuICAgIGNvbnN1bWVySG9zdDogRWxlbWVudCxcbiAgICBzdWJzY3JpYmU/OiBib29sZWFuXG4gICk6IHZvaWQge1xuICAgIGlmICghc3Vic2NyaWJlKSB7XG4gICAgICAvLyBqdXN0IGNhbGwgdGhlIGNhbGxiYWNrIG9uY2UgYW5kIHdlJ3JlIGRvbmVcbiAgICAgIGNhbGxiYWNrKHRoaXMudmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc3Vic2NyaXB0aW9ucy5oYXMoY2FsbGJhY2spKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuc2V0KGNhbGxiYWNrLCB7XG4gICAgICAgIGRpc3Bvc2VyOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmRlbGV0ZShjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbnN1bWVySG9zdCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7ZGlzcG9zZXJ9ID0gdGhpcy5zdWJzY3JpcHRpb25zLmdldChjYWxsYmFjaykhO1xuICAgIGNhbGxiYWNrKHRoaXMudmFsdWUsIGRpc3Bvc2VyKTtcbiAgfVxuXG4gIGNsZWFyQ2FsbGJhY2tzKCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5jbGVhcigpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbmltcG9ydCB7Q29udGV4dFJlcXVlc3RFdmVudH0gZnJvbSAnLi4vY29udGV4dC1yZXF1ZXN0LWV2ZW50LmpzJztcbmltcG9ydCB7VmFsdWVOb3RpZmllcn0gZnJvbSAnLi4vdmFsdWUtbm90aWZpZXIuanMnO1xuaW1wb3J0IHR5cGUge0NvbnRleHQsIENvbnRleHRUeXBlfSBmcm9tICcuLi9jcmVhdGUtY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJlYWN0aXZlQ29udHJvbGxlcixcbiAgUmVhY3RpdmVDb250cm9sbGVySG9zdCxcbn0gZnJvbSAnQGxpdC9yZWFjdGl2ZS1lbGVtZW50JztcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRFdmVudE1hcCB7XG4gICAgLyoqXG4gICAgICogQSAnY29udGV4dC1wcm92aWRlcicgZXZlbnQgY2FuIGJlIGVtaXR0ZWQgYnkgYW55IGVsZW1lbnQgd2hpY2ggaG9zdHNcbiAgICAgKiBhIGNvbnRleHQgcHJvdmlkZXIgdG8gaW5kaWNhdGUgaXQgaXMgYXZhaWxhYmxlIGZvciB1c2UuXG4gICAgICovXG4gICAgJ2NvbnRleHQtcHJvdmlkZXInOiBDb250ZXh0UHJvdmlkZXJFdmVudDxDb250ZXh0PHVua25vd24sIHVua25vd24+PjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29udGV4dFByb3ZpZGVyRXZlbnQ8XG4gIEMgZXh0ZW5kcyBDb250ZXh0PHVua25vd24sIHVua25vd24+LFxuPiBleHRlbmRzIEV2ZW50IHtcbiAgcmVhZG9ubHkgY29udGV4dDogQztcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgd2hpY2ggdGhpcyBwcm92aWRlciBjYW4gcHJvdmlkZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29udGV4dDogQykge1xuICAgIHN1cGVyKCdjb250ZXh0LXByb3ZpZGVyJywge2J1YmJsZXM6IHRydWUsIGNvbXBvc2VkOiB0cnVlfSk7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbnM8QyBleHRlbmRzIENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4+IHtcbiAgY29udGV4dDogQztcbiAgaW5pdGlhbFZhbHVlPzogQ29udGV4dFR5cGU8Qz47XG59XG5cbnR5cGUgUmVhY3RpdmVFbGVtZW50SG9zdCA9IFBhcnRpYWw8UmVhY3RpdmVDb250cm9sbGVySG9zdD4gJiBIVE1MRWxlbWVudDtcblxuLyoqXG4gKiBBIFJlYWN0aXZlQ29udHJvbGxlciB3aGljaCBhZGRzIGNvbnRleHQgcHJvdmlkZXIgYmVoYXZpb3IgdG8gYVxuICogY3VzdG9tIGVsZW1lbnQuXG4gKlxuICogVGhpcyBjb250cm9sbGVyIHNpbXBseSBsaXN0ZW5zIHRvIHRoZSBgY29udGV4dC1yZXF1ZXN0YCBldmVudCB3aGVuXG4gKiB0aGUgaG9zdCBpcyBjb25uZWN0ZWQgdG8gdGhlIERPTSBhbmQgcmVnaXN0ZXJzIHRoZSByZWNlaXZlZCBjYWxsYmFja3NcbiAqIGFnYWluc3QgaXRzIG9ic2VydmFibGUgQ29udGV4dCBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBUaGUgY29udHJvbGxlciBtYXkgYWxzbyBiZSBhdHRhY2hlZCB0byBhbnkgSFRNTCBlbGVtZW50IGluIHdoaWNoIGNhc2UgaXQnc1xuICogdXAgdG8gdGhlIHVzZXIgdG8gY2FsbCBob3N0Q29ubmVjdGVkKCkgd2hlbiBhdHRhY2hlZCB0byB0aGUgRE9NLiBUaGlzIGlzXG4gKiBkb25lIGF1dG9tYXRpY2FsbHkgZm9yIGFueSBjdXN0b20gZWxlbWVudHMgaW1wbGVtZW50aW5nXG4gKiBSZWFjdGl2ZUNvbnRyb2xsZXJIb3N0LlxuICovXG5leHBvcnQgY2xhc3MgQ29udGV4dFByb3ZpZGVyPFxuICAgIFQgZXh0ZW5kcyBDb250ZXh0PHVua25vd24sIHVua25vd24+LFxuICAgIEhvc3RFbGVtZW50IGV4dGVuZHMgUmVhY3RpdmVFbGVtZW50SG9zdCA9IFJlYWN0aXZlRWxlbWVudEhvc3QsXG4gID5cbiAgZXh0ZW5kcyBWYWx1ZU5vdGlmaWVyPENvbnRleHRUeXBlPFQ+PlxuICBpbXBsZW1lbnRzIFJlYWN0aXZlQ29udHJvbGxlclxue1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaG9zdDogSG9zdEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dDogVDtcblxuICBjb25zdHJ1Y3Rvcihob3N0OiBIb3N0RWxlbWVudCwgb3B0aW9uczogT3B0aW9uczxUPik7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgbmV3IENvbnRleHRQcm92aWRlcihob3N0LCBvcHRpb25zKSAqL1xuICBjb25zdHJ1Y3Rvcihob3N0OiBIb3N0RWxlbWVudCwgY29udGV4dDogVCwgaW5pdGlhbFZhbHVlPzogQ29udGV4dFR5cGU8VD4pO1xuICBjb25zdHJ1Y3RvcihcbiAgICBob3N0OiBIb3N0RWxlbWVudCxcbiAgICBjb250ZXh0T3JPcHRpb25zOiBUIHwgT3B0aW9uczxUPixcbiAgICBpbml0aWFsVmFsdWU/OiBDb250ZXh0VHlwZTxUPlxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIChjb250ZXh0T3JPcHRpb25zIGFzIE9wdGlvbnM8VD4pLmNvbnRleHQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IChjb250ZXh0T3JPcHRpb25zIGFzIE9wdGlvbnM8VD4pLmluaXRpYWxWYWx1ZVxuICAgICAgICA6IGluaXRpYWxWYWx1ZVxuICAgICk7XG4gICAgdGhpcy5ob3N0ID0gaG9zdDtcbiAgICBpZiAoKGNvbnRleHRPck9wdGlvbnMgYXMgT3B0aW9uczxUPikuY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNvbnRleHQgPSAoY29udGV4dE9yT3B0aW9ucyBhcyBPcHRpb25zPFQ+KS5jb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0T3JPcHRpb25zIGFzIFQ7XG4gICAgfVxuICAgIHRoaXMuYXR0YWNoTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5ob3N0LmFkZENvbnRyb2xsZXI/Lih0aGlzKTtcbiAgfVxuXG4gIG9uQ29udGV4dFJlcXVlc3QgPSAoXG4gICAgZXY6IENvbnRleHRSZXF1ZXN0RXZlbnQ8Q29udGV4dDx1bmtub3duLCB1bmtub3duPj5cbiAgKTogdm9pZCA9PiB7XG4gICAgLy8gT25seSBjYWxsIHRoZSBjYWxsYmFjayBpZiB0aGUgY29udGV4dCBtYXRjaGVzLlxuICAgIC8vIEFsc28sIGluIGNhc2UgYW4gZWxlbWVudCBpcyBhIGNvbnN1bWVyIEFORCBhIHByb3ZpZGVyXG4gICAgLy8gb2YgdGhlIHNhbWUgY29udGV4dCwgd2Ugd2FudCB0byBhdm9pZCB0aGUgZWxlbWVudCB0byBzZWxmLXJlZ2lzdGVyLlxuICAgIC8vIFRoZSBjaGVjayBvbiBjb21wb3NlZFBhdGggKGFzIG9wcG9zZWQgdG8gZXYudGFyZ2V0KSBpcyB0byBjb3ZlciBjYXNlc1xuICAgIC8vIHdoZXJlIHRoZSBjb25zdW1lciBpcyBpbiB0aGUgc2hhZG93RG9tIG9mIHRoZSBwcm92aWRlciAoaW4gd2hpY2ggY2FzZSxcbiAgICAvLyBldmVudC50YXJnZXQgPT09IHRoaXMuaG9zdCBiZWNhdXNlIG9mIGV2ZW50IHJldGFyZ2V0aW5nKS5cbiAgICBjb25zdCBjb25zdW1lckhvc3QgPSBldi5jb21wb3NlZFBhdGgoKVswXSBhcyBFbGVtZW50O1xuICAgIGlmIChldi5jb250ZXh0ICE9PSB0aGlzLmNvbnRleHQgfHwgY29uc3VtZXJIb3N0ID09PSB0aGlzLmhvc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5hZGRDYWxsYmFjayhldi5jYWxsYmFjaywgY29uc3VtZXJIb3N0LCBldi5zdWJzY3JpYmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBXaGVuIHdlIGdldCBhIHByb3ZpZGVyIHJlcXVlc3QgZXZlbnQsIHRoYXQgbWVhbnMgYSBjaGlsZCBvZiB0aGlzIGVsZW1lbnRcbiAgICogaGFzIGp1c3Qgd29rZW4gdXAuIElmIGl0J3MgYSBwcm92aWRlciBvZiBvdXIgY29udGV4dCwgdGhlbiB3ZSBtYXkgbmVlZCB0b1xuICAgKiByZS1wYXJlbnQgb3VyIHN1YnNjcmlwdGlvbnMsIGJlY2F1c2UgaXMgYSBtb3JlIHNwZWNpZmljIHByb3ZpZGVyIHRoYW4gdXNcbiAgICogZm9yIGl0cyBzdWJ0cmVlLlxuICAgKi9cbiAgb25Qcm92aWRlclJlcXVlc3QgPSAoXG4gICAgZXY6IENvbnRleHRQcm92aWRlckV2ZW50PENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4+XG4gICk6IHZvaWQgPT4ge1xuICAgIC8vIElnbm9yZSBldmVudHMgd2hlbiB0aGUgY29udGV4dCBkb2Vzbid0IG1hdGNoLlxuICAgIC8vIEFsc28sIGluIGNhc2UgYW4gZWxlbWVudCBpcyBhIGNvbnN1bWVyIEFORCBhIHByb3ZpZGVyXG4gICAgLy8gb2YgdGhlIHNhbWUgY29udGV4dCBpdCBzaG91bGRuJ3QgcHJvdmlkZSB0byBpdHNlbGYuXG4gICAgLy8gV2UgdXNlIGNvbXBvc2VkUGF0aCAoYXMgb3Bwb3NlZCB0byBldi50YXJnZXQpIHRvIGNvdmVyIGNhc2VzXG4gICAgLy8gd2hlcmUgdGhlIGNvbnN1bWVyIGlzIGluIHRoZSBzaGFkb3dEb20gb2YgdGhlIHByb3ZpZGVyIChpbiB3aGljaCBjYXNlLFxuICAgIC8vIGV2ZW50LnRhcmdldCA9PT0gdGhpcy5ob3N0IGJlY2F1c2Ugb2YgZXZlbnQgcmV0YXJnZXRpbmcpLlxuICAgIGNvbnN0IGNoaWxkUHJvdmlkZXJIb3N0ID0gZXYuY29tcG9zZWRQYXRoKClbMF0gYXMgRWxlbWVudDtcbiAgICBpZiAoZXYuY29udGV4dCAhPT0gdGhpcy5jb250ZXh0IHx8IGNoaWxkUHJvdmlkZXJIb3N0ID09PSB0aGlzLmhvc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUmUtcGFyZW50IGFsbCBvZiBvdXIgc3Vic2NyaXB0aW9ucyBpbiBjYXNlIHRoaXMgbmV3IGNoaWxkIHByb3ZpZGVyXG4gICAgLy8gc2hvdWxkIHRha2UgdGhlbSBvdmVyLlxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHVua25vd24+KCk7XG4gICAgZm9yIChjb25zdCBbY2FsbGJhY2ssIHtjb25zdW1lckhvc3R9XSBvZiB0aGlzLnN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIC8vIFByZXZlbnQgaW5maW5pdGUgbG9vcHMgaW4gdGhlIGNhc2Ugd2hlcmUgYSBvbmUgaG9zdCBlbGVtZW50XG4gICAgICAvLyBpcyBwcm92aWRpbmcgdGhlIHNhbWUgY29udGV4dCBtdWx0aXBsZSB0aW1lcy5cbiAgICAgIC8vXG4gICAgICAvLyBXaGlsZSBub3JtYWxseSBpdCdzIGEgbm8tb3AgdG8gYXR0ZW1wdCB0byByZS1wYXJlbnQgYSBzdWJzY3JpcHRpb25cbiAgICAgIC8vIHRoYXQgYWxyZWFkeSBoYXMgaXRzIHByb3BlciBwYXJlbnQsIGluIHRoZSBjYXNlIHdoZXJlIHRoZXJlJ3MgbW9yZVxuICAgICAgLy8gdGhhbiBvbmUgVmFsdWVQcm92aWRlciBmb3IgdGhlIHNhbWUgY29udGV4dCBvbiB0aGUgc2FtZSBob3N0RWxlbWVudCxcbiAgICAgIC8vIHRoZXkgd2lsbCBlYWNoIGNhbGwgdGhlIGNvbnN1bWVyLCBhbmQgc2luY2UgdGhleSB3aWxsIGVhY2ggaGF2ZSB0aGVpclxuICAgICAgLy8gb3duIGRpc3Bvc2UgZnVuY3Rpb24sIGEgd2VsbCBiZWhhdmVkIGNvbnN1bWVyIHdpbGwgbm90aWNlIHRoZSBjaGFuZ2VcbiAgICAgIC8vIGluIGRpc3Bvc2UgZnVuY3Rpb24gYW5kIGNhbGwgdGhlaXIgb2xkIG9uZS5cbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIHdpbGwgY2F1c2UgdGhlIHN1YnNjcmlwdGlvbnMgdG8gdGhyYXNoLCBidXQgd29yc2UsIHdpdGhvdXQgdGhpc1xuICAgICAgLy8gc2V0IGNoZWNrIGhlcmUsIHdlIGNhbiBlbmQgdXAgaW4gYW4gaW5maW5pdGUgbG9vcCwgYXMgd2UgYWRkIGFuZCByZW1vdmVcbiAgICAgIC8vIHRoZSBzYW1lIHN1YnNjcmlwdGlvbnMgb250byB0aGUgZW5kIG9mIHRoZSBtYXAgb3ZlciBhbmQgb3Zlci5cbiAgICAgIGlmIChzZWVuLmhhcyhjYWxsYmFjaykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzZWVuLmFkZChjYWxsYmFjayk7XG4gICAgICBjb25zdW1lckhvc3QuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IENvbnRleHRSZXF1ZXN0RXZlbnQodGhpcy5jb250ZXh0LCBjYWxsYmFjaywgdHJ1ZSlcbiAgICAgICk7XG4gICAgfVxuICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9O1xuXG4gIHByaXZhdGUgYXR0YWNoTGlzdGVuZXJzKCkge1xuICAgIHRoaXMuaG9zdC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0LXJlcXVlc3QnLCB0aGlzLm9uQ29udGV4dFJlcXVlc3QpO1xuICAgIHRoaXMuaG9zdC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0LXByb3ZpZGVyJywgdGhpcy5vblByb3ZpZGVyUmVxdWVzdCk7XG4gIH1cblxuICBob3N0Q29ubmVjdGVkKCk6IHZvaWQge1xuICAgIC8vIGVtaXQgYW4gZXZlbnQgdG8gc2lnbmFsIGEgcHJvdmlkZXIgaXMgYXZhaWxhYmxlIGZvciB0aGlzIGNvbnRleHRcbiAgICB0aGlzLmhvc3QuZGlzcGF0Y2hFdmVudChuZXcgQ29udGV4dFByb3ZpZGVyRXZlbnQodGhpcy5jb250ZXh0KSk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtSZWFjdGl2ZUVsZW1lbnR9IGZyb20gJ0BsaXQvcmVhY3RpdmUtZWxlbWVudCc7XG5pbXBvcnQge0NvbnRleHR9IGZyb20gJy4uL2NyZWF0ZS1jb250ZXh0LmpzJztcbmltcG9ydCB7Q29udGV4dFByb3ZpZGVyfSBmcm9tICcuLi9jb250cm9sbGVycy9jb250ZXh0LXByb3ZpZGVyLmpzJztcblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cblxuLyoqXG4gKiBBIHByb3BlcnR5IGRlY29yYXRvciB0aGF0IGFkZHMgYSBDb250ZXh0UHJvdmlkZXIgY29udHJvbGxlciB0byB0aGUgY29tcG9uZW50XG4gKiBtYWtpbmcgaXQgcmVzcG9uZCB0byBhbnkgYGNvbnRleHQtcmVxdWVzdGAgZXZlbnRzIGZyb20gaXRzIGNoaWxkcmVuIGNvbnN1bWVyLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IEEgQ29udGV4dCBpZGVudGlmaWVyIHZhbHVlIGNyZWF0ZWQgdmlhIGBjcmVhdGVDb250ZXh0YFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7cHJvdmlkZX0gZnJvbSAnQGxpdC9jb250ZXh0JztcbiAqIGltcG9ydCB7TG9nZ2VyfSBmcm9tICdteS1sb2dnaW5nLWxpYnJhcnknO1xuICogaW1wb3J0IHtsb2dnZXJDb250ZXh0fSBmcm9tICcuL2xvZ2dlci1jb250ZXh0LmpzJztcbiAqXG4gKiBjbGFzcyBNeUVsZW1lbnQge1xuICogICBAcHJvdmlkZSh7Y29udGV4dDogbG9nZ2VyQ29udGV4dH0pXG4gKiAgIGxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcbiAqIH1cbiAqIGBgYFxuICogQGNhdGVnb3J5IERlY29yYXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZTxWYWx1ZVR5cGU+KHtcbiAgY29udGV4dDogY29udGV4dCxcbn06IHtcbiAgY29udGV4dDogQ29udGV4dDx1bmtub3duLCBWYWx1ZVR5cGU+O1xufSk6IFByb3ZpZGVEZWNvcmF0b3I8VmFsdWVUeXBlPiB7XG4gIHJldHVybiAoKFxuICAgIHByb3RvT3JUYXJnZXQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8UmVhY3RpdmVFbGVtZW50LCBWYWx1ZVR5cGU+LFxuICAgIG5hbWVPckNvbnRleHQ6XG4gICAgICB8IFByb3BlcnR5S2V5XG4gICAgICB8IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0PFJlYWN0aXZlRWxlbWVudCwgVmFsdWVUeXBlPlxuICApID0+IHtcbiAgICAvLyBNYXAgb2YgaW5zdGFuY2VzIHRvIGNvbnRyb2xsZXJzXG4gICAgY29uc3QgY29udHJvbGxlck1hcCA9IG5ldyBXZWFrTWFwPFxuICAgICAgUmVhY3RpdmVFbGVtZW50LFxuICAgICAgQ29udGV4dFByb3ZpZGVyPENvbnRleHQ8dW5rbm93biwgVmFsdWVUeXBlPj5cbiAgICA+KCk7XG4gICAgaWYgKHR5cGVvZiBuYW1lT3JDb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgLy8gU3RhbmRhcmQgZGVjb3JhdG9ycyBicmFuY2hcbiAgICAgIG5hbWVPckNvbnRleHQuYWRkSW5pdGlhbGl6ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBjb250cm9sbGVyTWFwLnNldCh0aGlzLCBuZXcgQ29udGV4dFByb3ZpZGVyKHRoaXMsIHtjb250ZXh0fSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBnZXQodGhpczogUmVhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIHByb3RvT3JUYXJnZXQuZ2V0LmNhbGwodGhpcyk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQsIHZhbHVlOiBWYWx1ZVR5cGUpIHtcbiAgICAgICAgICBjb250cm9sbGVyTWFwLmdldCh0aGlzKT8uc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgIHJldHVybiBwcm90b09yVGFyZ2V0LnNldC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgaW5pdCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQsIHZhbHVlOiBWYWx1ZVR5cGUpIHtcbiAgICAgICAgICBjb250cm9sbGVyTWFwLmdldCh0aGlzKT8uc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV4cGVyaW1lbnRhbCBkZWNvcmF0b3JzIGJyYW5jaFxuICAgICAgKHByb3RvT3JUYXJnZXQuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuYWRkSW5pdGlhbGl6ZXIoXG4gICAgICAgIChlbGVtZW50OiBSZWFjdGl2ZUVsZW1lbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICBjb250cm9sbGVyTWFwLnNldChlbGVtZW50LCBuZXcgQ29udGV4dFByb3ZpZGVyKGVsZW1lbnQsIHtjb250ZXh0fSkpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgLy8gcHJveHkgYW55IGV4aXN0aW5nIHNldHRlciBmb3IgdGhpcyBwcm9wZXJ0eSBhbmQgdXNlIGl0IHRvXG4gICAgICAvLyBub3RpZnkgdGhlIGNvbnRyb2xsZXIgb2YgYW4gdXBkYXRlZCB2YWx1ZVxuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgIHByb3RvT3JUYXJnZXQsXG4gICAgICAgIG5hbWVPckNvbnRleHRcbiAgICAgICk7XG4gICAgICBsZXQgbmV3RGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgICAgaWYgKGRlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB2YWx1ZU1hcCA9IG5ldyBXZWFrTWFwPFJlYWN0aXZlRWxlbWVudCwgVmFsdWVUeXBlPigpO1xuICAgICAgICBuZXdEZXNjcmlwdG9yID0ge1xuICAgICAgICAgIGdldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZU1hcC5nZXQodGhpcyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQodGhpczogUmVhY3RpdmVFbGVtZW50LCB2YWx1ZTogVmFsdWVUeXBlKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyTWFwLmdldCh0aGlzKSEuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgdmFsdWVNYXAuc2V0KHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb2xkU2V0dGVyID0gZGVzY3JpcHRvci5zZXQ7XG4gICAgICAgIG5ld0Rlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgLi4uZGVzY3JpcHRvcixcbiAgICAgICAgICBzZXQodGhpczogUmVhY3RpdmVFbGVtZW50LCB2YWx1ZTogVmFsdWVUeXBlKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyTWFwLmdldCh0aGlzKSEuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgb2xkU2V0dGVyPy5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvT3JUYXJnZXQsIG5hbWVPckNvbnRleHQsIG5ld0Rlc2NyaXB0b3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSkgYXMgUHJvdmlkZURlY29yYXRvcjxWYWx1ZVR5cGU+O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHB1YmxpYyBpbnRlcmZhY2UgdHlwZSB0aGF0IHJlbW92ZXMgcHJpdmF0ZSBhbmQgcHJvdGVjdGVkIGZpZWxkcy5cbiAqIFRoaXMgYWxsb3dzIGFjY2VwdGluZyBvdGhlcndpc2UgY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiB0aGUgdHlwZSAoZS5nLiBmcm9tXG4gKiBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgcGFja2FnZSBpbiBgbm9kZV9tb2R1bGVzYCkuXG4gKi9cbnR5cGUgSW50ZXJmYWNlPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXTtcbn07XG5cbnR5cGUgUHJvdmlkZURlY29yYXRvcjxDb250ZXh0VHlwZT4gPSB7XG4gIC8vIGxlZ2FjeVxuICA8XG4gICAgSyBleHRlbmRzIFByb3BlcnR5S2V5LFxuICAgIFByb3RvIGV4dGVuZHMgSW50ZXJmYWNlPE9taXQ8UmVhY3RpdmVFbGVtZW50LCAncmVuZGVyUm9vdCc+PixcbiAgPihcbiAgICBwcm90b09yRGVzY3JpcHRvcjogUHJvdG8sXG4gICAgbmFtZT86IEtcbiAgKTogRmllbGRNdXN0TWF0Y2hDb250ZXh0VHlwZTxQcm90bywgSywgQ29udGV4dFR5cGU+O1xuXG4gIC8vIHN0YW5kYXJkXG4gIDxcbiAgICBDIGV4dGVuZHMgSW50ZXJmYWNlPE9taXQ8UmVhY3RpdmVFbGVtZW50LCAncmVuZGVyUm9vdCc+PixcbiAgICBWIGV4dGVuZHMgQ29udGV4dFR5cGUsXG4gID4oXG4gICAgdmFsdWU6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj4sXG4gICAgY29udGV4dDogQ2xhc3NBY2Nlc3NvckRlY29yYXRvckNvbnRleHQ8QywgVj5cbiAgKTogdm9pZDtcbn07XG5cbi8vIE5vdGUgVHlwZVNjcmlwdCByZXF1aXJlcyB0aGUgcmV0dXJuIHR5cGUgb2YgYSBkZWNvcmF0b3IgdG8gYmUgYHZvaWQgfCBhbnlgXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxudHlwZSBEZWNvcmF0b3JSZXR1cm4gPSB2b2lkIHwgYW55O1xuXG50eXBlIEZpZWxkTXVzdE1hdGNoQ29udGV4dFR5cGU8T2JqLCBLZXkgZXh0ZW5kcyBQcm9wZXJ0eUtleSwgQ29udGV4dFR5cGU+ID1cbiAgLy8gRmlyc3Qgd2UgY2hlY2sgd2hldGhlciB0aGUgb2JqZWN0IGhhcyB0aGUgcHJvcGVydHkgYXMgYSByZXF1aXJlZCBmaWVsZFxuICBPYmogZXh0ZW5kcyBSZWNvcmQ8S2V5LCBpbmZlciBQcm92aWRpbmdUeXBlPlxuICAgID8gLy8gT2ssIGl0IGRvZXMsIGp1c3QgY2hlY2sgd2hldGhlciBpdCdzIG9rIHRvIGFzc2lnbiB0aGVcbiAgICAgIC8vIHByb3ZpZGVkIHR5cGUgdG8gdGhlIGNvbnN1bWluZyBmaWVsZFxuICAgICAgW1Byb3ZpZGluZ1R5cGVdIGV4dGVuZHMgW0NvbnRleHRUeXBlXVxuICAgICAgPyBEZWNvcmF0b3JSZXR1cm5cbiAgICAgIDoge1xuICAgICAgICAgIG1lc3NhZ2U6ICdwcm92aWRpbmcgZmllbGQgbm90IGFzc2lnbmFibGUgdG8gY29udGV4dCc7XG4gICAgICAgICAgY29udGV4dDogQ29udGV4dFR5cGU7XG4gICAgICAgICAgcHJvdmlkZWQ6IFByb3ZpZGluZ1R5cGU7XG4gICAgICAgIH1cbiAgICA6IC8vIE5leHQgd2UgY2hlY2sgd2hldGhlciB0aGUgb2JqZWN0IGhhcyB0aGUgcHJvcGVydHkgYXMgYW4gb3B0aW9uYWwgZmllbGRcbiAgICAgIE9iaiBleHRlbmRzIFBhcnRpYWw8UmVjb3JkPEtleSwgaW5mZXIgUHJvdmlkaW5nPj5cbiAgICAgID8gLy8gQ2hlY2sgYXNzaWduYWJpbGl0eSBhZ2Fpbi4gTm90ZSB0aGF0IHdlIGhhdmUgdG8gaW5jbHVkZSB1bmRlZmluZWRcbiAgICAgICAgLy8gaGVyZSBvbiB0aGUgcHJvdmlkaW5nIHR5cGUgYmVjYXVzZSBpdCdzIG9wdGlvbmFsLlxuICAgICAgICBbUHJvdmlkaW5nIHwgdW5kZWZpbmVkXSBleHRlbmRzIFtDb250ZXh0VHlwZV1cbiAgICAgICAgPyBEZWNvcmF0b3JSZXR1cm5cbiAgICAgICAgOiB7XG4gICAgICAgICAgICBtZXNzYWdlOiAncHJvdmlkaW5nIGZpZWxkIG5vdCBhc3NpZ25hYmxlIHRvIGNvbnRleHQnO1xuICAgICAgICAgICAgY29udGV4dDogQ29udGV4dFR5cGU7XG4gICAgICAgICAgICBjb25zdW1pbmc6IFByb3ZpZGluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICA6IC8vIE9rLCB0aGUgZmllbGQgaXNuJ3QgcHJlc2VudCwgc28gZWl0aGVyIHNvbWVvbmUncyB1c2luZyBwcm92aWRlXG4gICAgICAgIC8vIG1hbnVhbGx5LCBpLmUuIG5vdCBhcyBhIGRlY29yYXRvciAobWF5YmUgZG9uJ3QgZG8gdGhhdCEgYnV0IGlmIHlvdSBkbyxcbiAgICAgICAgLy8geW91J3JlIG9uIHlvdXIgb3duIGZvciB5b3VyIHR5cGUgY2hlY2tpbmcsIHNvcnJ5KSwgb3IgdGhlIGZpZWxkIGlzXG4gICAgICAgIC8vIHByaXZhdGUsIGluIHdoaWNoIGNhc2Ugd2UgY2FuJ3QgY2hlY2sgaXQuXG4gICAgICAgIERlY29yYXRvclJldHVybjtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtSZWFjdGl2ZUVsZW1lbnR9IGZyb20gJ0BsaXQvcmVhY3RpdmUtZWxlbWVudCc7XG5pbXBvcnQge0NvbnRleHRDb25zdW1lcn0gZnJvbSAnLi4vY29udHJvbGxlcnMvY29udGV4dC1jb25zdW1lci5qcyc7XG5pbXBvcnQge0NvbnRleHR9IGZyb20gJy4uL2NyZWF0ZS1jb250ZXh0LmpzJztcblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cblxuLyoqXG4gKiBBIHByb3BlcnR5IGRlY29yYXRvciB0aGF0IGFkZHMgYSBDb250ZXh0Q29uc3VtZXIgY29udHJvbGxlciB0byB0aGUgY29tcG9uZW50XG4gKiB3aGljaCB3aWxsIHRyeSBhbmQgcmV0cmlldmUgYSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IHZpYSB0aGUgQ29udGV4dCBBUEkuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgQSBDb250ZXh0IGlkZW50aWZpZXIgdmFsdWUgY3JlYXRlZCB2aWEgYGNyZWF0ZUNvbnRleHRgXG4gKiBAcGFyYW0gc3Vic2NyaWJlIEFuIG9wdGlvbmFsIGJvb2xlYW4gd2hpY2ggd2hlbiB0cnVlIGFsbG93cyB0aGUgdmFsdWUgdG8gYmUgdXBkYXRlZFxuICogICBtdWx0aXBsZSB0aW1lcy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2NvbnN1bWV9IGZyb20gJ0BsaXQvY29udGV4dCc7XG4gKiBpbXBvcnQge2xvZ2dlckNvbnRleHQsIExvZ2dlcn0gZnJvbSAnY29tbXVuaXR5LXByb3RvY29scy9sb2dnZXInO1xuICpcbiAqIGNsYXNzIE15RWxlbWVudCB7XG4gKiAgIEBjb25zdW1lKHtjb250ZXh0OiBsb2dnZXJDb250ZXh0fSlcbiAqICAgbG9nZ2VyPzogTG9nZ2VyO1xuICpcbiAqICAgZG9UaGluZygpIHtcbiAqICAgICB0aGlzLmxvZ2dlciEubG9nKCd0aGluZyB3YXMgZG9uZScpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN1bWU8VmFsdWVUeXBlPih7XG4gIGNvbnRleHQsXG4gIHN1YnNjcmliZSxcbn06IHtcbiAgY29udGV4dDogQ29udGV4dDx1bmtub3duLCBWYWx1ZVR5cGU+O1xuICBzdWJzY3JpYmU/OiBib29sZWFuO1xufSk6IENvbnN1bWVEZWNvcmF0b3I8VmFsdWVUeXBlPiB7XG4gIHJldHVybiAoKFxuICAgIHByb3RvT3JUYXJnZXQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8UmVhY3RpdmVFbGVtZW50LCBWYWx1ZVR5cGU+LFxuICAgIG5hbWVPckNvbnRleHQ6XG4gICAgICB8IFByb3BlcnR5S2V5XG4gICAgICB8IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0PFJlYWN0aXZlRWxlbWVudCwgVmFsdWVUeXBlPlxuICApID0+IHtcbiAgICBpZiAodHlwZW9mIG5hbWVPckNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBTdGFuZGFyZCBkZWNvcmF0b3JzIGJyYW5jaFxuICAgICAgbmFtZU9yQ29udGV4dC5hZGRJbml0aWFsaXplcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIG5ldyBDb250ZXh0Q29uc3VtZXIodGhpcywge1xuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgY2FsbGJhY2s6ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgcHJvdG9PclRhcmdldC5zZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV4cGVyaW1lbnRhbCBkZWNvcmF0b3JzIGJyYW5jaFxuICAgICAgKHByb3RvT3JUYXJnZXQuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuYWRkSW5pdGlhbGl6ZXIoXG4gICAgICAgIChlbGVtZW50OiBSZWFjdGl2ZUVsZW1lbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICBuZXcgQ29udGV4dENvbnN1bWVyKGVsZW1lbnQsIHtcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICBjYWxsYmFjazogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgIChlbGVtZW50IGFzIGFueSlbbmFtZU9yQ29udGV4dF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9KSBhcyBDb25zdW1lRGVjb3JhdG9yPFZhbHVlVHlwZT47XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcHVibGljIGludGVyZmFjZSB0eXBlIHRoYXQgcmVtb3ZlcyBwcml2YXRlIGFuZCBwcm90ZWN0ZWQgZmllbGRzLlxuICogVGhpcyBhbGxvd3MgYWNjZXB0aW5nIG90aGVyd2lzZSBpbmNvbXBhdGlibGUgdmVyc2lvbnMgb2YgdGhlIHR5cGUgKGUuZy4gZnJvbVxuICogbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIHBhY2thZ2UgaW4gYG5vZGVfbW9kdWxlc2ApLlxuICovXG50eXBlIEludGVyZmFjZTxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS107XG59O1xuXG50eXBlIENvbnN1bWVEZWNvcmF0b3I8VmFsdWVUeXBlPiA9IHtcbiAgLy8gbGVnYWN5XG4gIDxcbiAgICBLIGV4dGVuZHMgUHJvcGVydHlLZXksXG4gICAgUHJvdG8gZXh0ZW5kcyBJbnRlcmZhY2U8T21pdDxSZWFjdGl2ZUVsZW1lbnQsICdyZW5kZXJSb290Jz4+LFxuICA+KFxuICAgIHByb3RvT3JEZXNjcmlwdG9yOiBQcm90byxcbiAgICBuYW1lPzogS1xuICApOiBGaWVsZE11c3RNYXRjaFByb3ZpZGVkVHlwZTxQcm90bywgSywgVmFsdWVUeXBlPjtcblxuICAvLyBzdGFuZGFyZFxuICA8XG4gICAgQyBleHRlbmRzIEludGVyZmFjZTxPbWl0PFJlYWN0aXZlRWxlbWVudCwgJ3JlbmRlclJvb3QnPj4sXG4gICAgViBleHRlbmRzIFZhbHVlVHlwZSxcbiAgPihcbiAgICB2YWx1ZTogQ2xhc3NBY2Nlc3NvckRlY29yYXRvclRhcmdldDxDLCBWPixcbiAgICBjb250ZXh0OiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dDxDLCBWPlxuICApOiB2b2lkO1xufTtcblxuLy8gTm90ZSBUeXBlU2NyaXB0IHJlcXVpcmVzIHRoZSByZXR1cm4gdHlwZSBvZiBhIGRlY29yYXRvciB0byBiZSBgdm9pZCB8IGFueWBcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG50eXBlIERlY29yYXRvclJldHVybiA9IHZvaWQgfCBhbnk7XG5cbnR5cGUgRmllbGRNdXN0TWF0Y2hQcm92aWRlZFR5cGU8T2JqLCBLZXkgZXh0ZW5kcyBQcm9wZXJ0eUtleSwgUHJvdmlkZWRUeXBlPiA9XG4gIC8vIEZpcnN0IHdlIGNoZWNrIHdoZXRoZXIgdGhlIG9iamVjdCBoYXMgdGhlIHByb3BlcnR5IGFzIGEgcmVxdWlyZWQgZmllbGRcbiAgT2JqIGV4dGVuZHMgUmVjb3JkPEtleSwgaW5mZXIgQ29uc3VtaW5nVHlwZT5cbiAgICA/IC8vIE9rLCBpdCBkb2VzLCBqdXN0IGNoZWNrIHdoZXRoZXIgaXQncyBvayB0byBhc3NpZ24gdGhlXG4gICAgICAvLyBwcm92aWRlZCB0eXBlIHRvIHRoZSBjb25zdW1pbmcgZmllbGRcbiAgICAgIFtQcm92aWRlZFR5cGVdIGV4dGVuZHMgW0NvbnN1bWluZ1R5cGVdXG4gICAgICA/IERlY29yYXRvclJldHVyblxuICAgICAgOiB7XG4gICAgICAgICAgbWVzc2FnZTogJ3Byb3ZpZGVkIHR5cGUgbm90IGFzc2lnbmFibGUgdG8gY29uc3VtaW5nIGZpZWxkJztcbiAgICAgICAgICBwcm92aWRlZDogUHJvdmlkZWRUeXBlO1xuICAgICAgICAgIGNvbnN1bWluZzogQ29uc3VtaW5nVHlwZTtcbiAgICAgICAgfVxuICAgIDogLy8gTmV4dCB3ZSBjaGVjayB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eSBhcyBhbiBvcHRpb25hbCBmaWVsZFxuICAgICAgT2JqIGV4dGVuZHMgUGFydGlhbDxSZWNvcmQ8S2V5LCBpbmZlciBDb25zdW1pbmdUeXBlPj5cbiAgICAgID8gLy8gQ2hlY2sgYXNzaWduYWJpbGl0eSBhZ2Fpbi4gTm90ZSB0aGF0IHdlIGhhdmUgdG8gaW5jbHVkZSB1bmRlZmluZWRcbiAgICAgICAgLy8gaGVyZSBvbiB0aGUgY29uc3VtaW5nIHR5cGUgYmVjYXVzZSBpdCdzIG9wdGlvbmFsLlxuICAgICAgICBbUHJvdmlkZWRUeXBlXSBleHRlbmRzIFtDb25zdW1pbmdUeXBlIHwgdW5kZWZpbmVkXVxuICAgICAgICA/IERlY29yYXRvclJldHVyblxuICAgICAgICA6IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdwcm92aWRlZCB0eXBlIG5vdCBhc3NpZ25hYmxlIHRvIGNvbnN1bWluZyBmaWVsZCc7XG4gICAgICAgICAgICBwcm92aWRlZDogUHJvdmlkZWRUeXBlO1xuICAgICAgICAgICAgY29uc3VtaW5nOiBDb25zdW1pbmdUeXBlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgIDogLy8gT2ssIHRoZSBmaWVsZCBpc24ndCBwcmVzZW50LCBzbyBlaXRoZXIgc29tZW9uZSdzIHVzaW5nIGNvbnN1bWVcbiAgICAgICAgLy8gbWFudWFsbHksIGkuZS4gbm90IGFzIGEgZGVjb3JhdG9yIChtYXliZSBkb24ndCBkbyB0aGF0ISBidXQgaWYgeW91IGRvLFxuICAgICAgICAvLyB5b3UncmUgb24geW91ciBvd24gZm9yIHlvdXIgdHlwZSBjaGVja2luZywgc29ycnkpLCBvciB0aGUgZmllbGQgaXNcbiAgICAgICAgLy8gcHJpdmF0ZSwgaW4gd2hpY2ggY2FzZSB3ZSBjYW4ndCBjaGVjayBpdC5cbiAgICAgICAgRGVjb3JhdG9yUmV0dXJuO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG50eXBlIEFSSUFBdHRyaWJ1dGVNYXAgPSB7XG4gIFtLIGluIGtleW9mIEFSSUFNaXhpbl06IHN0cmluZztcbn07XG5cbi8qKlxuICogTWFwIG9mIEFSSUFNaXhpbiBwcm9wZXJ0aWVzIHRvIGF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGFyaWFNaXhpbkF0dHJpYnV0ZXM6IEFSSUFBdHRyaWJ1dGVNYXAgPSB7XG4gIGFyaWFBdG9taWM6ICdhcmlhLWF0b21pYycsXG4gIGFyaWFBdXRvQ29tcGxldGU6ICdhcmlhLWF1dG9jb21wbGV0ZScsXG4gIGFyaWFCcmFpbGxlTGFiZWw6ICdhcmlhLWJyYWlsbGVsYWJlbCcsXG4gIGFyaWFCcmFpbGxlUm9sZURlc2NyaXB0aW9uOiAnYXJpYS1icmFpbGxlcm9sZWRlc2NyaXB0aW9uJyxcbiAgYXJpYUJ1c3k6ICdhcmlhLWJ1c3knLFxuICBhcmlhQ2hlY2tlZDogJ2FyaWEtY2hlY2tlZCcsXG4gIGFyaWFDb2xDb3VudDogJ2FyaWEtY29sY291bnQnLFxuICBhcmlhQ29sSW5kZXg6ICdhcmlhLWNvbGluZGV4JyxcbiAgYXJpYUNvbFNwYW46ICdhcmlhLWNvbHNwYW4nLFxuICBhcmlhQ3VycmVudDogJ2FyaWEtY3VycmVudCcsXG4gIGFyaWFEZXNjcmlwdGlvbjogJ2FyaWEtZGVzY3JpcHRpb24nLFxuICBhcmlhRGlzYWJsZWQ6ICdhcmlhLWRpc2FibGVkJyxcbiAgYXJpYUV4cGFuZGVkOiAnYXJpYS1leHBhbmRlZCcsXG4gIGFyaWFIYXNQb3B1cDogJ2FyaWEtaGFzcG9wdXAnLFxuICBhcmlhSGlkZGVuOiAnYXJpYS1oaWRkZW4nLFxuICBhcmlhSW52YWxpZDogJ2FyaWEtaW52YWxpZCcsXG4gIGFyaWFLZXlTaG9ydGN1dHM6ICdhcmlhLWtleXNob3J0Y3V0cycsXG4gIGFyaWFMYWJlbDogJ2FyaWEtbGFiZWwnLFxuICBhcmlhTGV2ZWw6ICdhcmlhLWxldmVsJyxcbiAgYXJpYUxpdmU6ICdhcmlhLWxpdmUnLFxuICBhcmlhTW9kYWw6ICdhcmlhLW1vZGFsJyxcbiAgYXJpYU11bHRpTGluZTogJ2FyaWEtbXVsdGlsaW5lJyxcbiAgYXJpYU11bHRpU2VsZWN0YWJsZTogJ2FyaWEtbXVsdGlzZWxlY3RhYmxlJyxcbiAgYXJpYU9yaWVudGF0aW9uOiAnYXJpYS1vcmllbnRhdGlvbicsXG4gIGFyaWFQbGFjZWhvbGRlcjogJ2FyaWEtcGxhY2Vob2xkZXInLFxuICBhcmlhUG9zSW5TZXQ6ICdhcmlhLXBvc2luc2V0JyxcbiAgYXJpYVByZXNzZWQ6ICdhcmlhLXByZXNzZWQnLFxuICBhcmlhUmVhZE9ubHk6ICdhcmlhLXJlYWRvbmx5JyxcbiAgYXJpYVJlcXVpcmVkOiAnYXJpYS1yZXF1aXJlZCcsXG4gIGFyaWFSb2xlRGVzY3JpcHRpb246ICdhcmlhLXJvbGVkZXNjcmlwdGlvbicsXG4gIGFyaWFSb3dDb3VudDogJ2FyaWEtcm93Y291bnQnLFxuICBhcmlhUm93SW5kZXg6ICdhcmlhLXJvd2luZGV4JyxcbiAgYXJpYVJvd1NwYW46ICdhcmlhLXJvd3NwYW4nLFxuICBhcmlhU2VsZWN0ZWQ6ICdhcmlhLXNlbGVjdGVkJyxcbiAgYXJpYVNldFNpemU6ICdhcmlhLXNldHNpemUnLFxuICBhcmlhU29ydDogJ2FyaWEtc29ydCcsXG4gIGFyaWFWYWx1ZU1heDogJ2FyaWEtdmFsdWVtYXgnLFxuICBhcmlhVmFsdWVNaW46ICdhcmlhLXZhbHVlbWluJyxcbiAgYXJpYVZhbHVlTm93OiAnYXJpYS12YWx1ZW5vdycsXG4gIGFyaWFWYWx1ZVRleHQ6ICdhcmlhLXZhbHVldGV4dCcsXG4gIHJvbGU6ICdyb2xlJyxcbn07XG5cbnR5cGUgRWxlbWVudEludGVybmFsc0ludGVyZmFjZSA9IEVsZW1lbnRJbnRlcm5hbHM7XG5cbi8vIFNoaW0gdGhlIGdsb2JhbCBlbGVtZW50IGludGVybmFscyBvYmplY3Rcbi8vIE1ldGhvZHMgc2hvdWxkIGJlIGZpbmUgYXMgbm9vcHMgYW5kIHByb3BlcnRpZXMgY2FuIGdlbmVyYWxseVxuLy8gYmUgd2hpbGUgb24gdGhlIHNlcnZlci5cbmV4cG9ydCBjb25zdCBFbGVtZW50SW50ZXJuYWxzU2hpbSA9IGNsYXNzIEVsZW1lbnRJbnRlcm5hbHNcbiAgaW1wbGVtZW50cyBFbGVtZW50SW50ZXJuYWxzSW50ZXJmYWNlXG57XG4gIGFyaWFBdG9taWMgPSAnJztcbiAgYXJpYUF1dG9Db21wbGV0ZSA9ICcnO1xuICBhcmlhQnJhaWxsZUxhYmVsID0gJyc7XG4gIGFyaWFCcmFpbGxlUm9sZURlc2NyaXB0aW9uID0gJyc7XG4gIGFyaWFCdXN5ID0gJyc7XG4gIGFyaWFDaGVja2VkID0gJyc7XG4gIGFyaWFDb2xDb3VudCA9ICcnO1xuICBhcmlhQ29sSW5kZXggPSAnJztcbiAgYXJpYUNvbFNwYW4gPSAnJztcbiAgYXJpYUN1cnJlbnQgPSAnJztcbiAgYXJpYURlc2NyaXB0aW9uID0gJyc7XG4gIGFyaWFEaXNhYmxlZCA9ICcnO1xuICBhcmlhRXhwYW5kZWQgPSAnJztcbiAgYXJpYUhhc1BvcHVwID0gJyc7XG4gIGFyaWFIaWRkZW4gPSAnJztcbiAgYXJpYUludmFsaWQgPSAnJztcbiAgYXJpYUtleVNob3J0Y3V0cyA9ICcnO1xuICBhcmlhTGFiZWwgPSAnJztcbiAgYXJpYUxldmVsID0gJyc7XG4gIGFyaWFMaXZlID0gJyc7XG4gIGFyaWFNb2RhbCA9ICcnO1xuICBhcmlhTXVsdGlMaW5lID0gJyc7XG4gIGFyaWFNdWx0aVNlbGVjdGFibGUgPSAnJztcbiAgYXJpYU9yaWVudGF0aW9uID0gJyc7XG4gIGFyaWFQbGFjZWhvbGRlciA9ICcnO1xuICBhcmlhUG9zSW5TZXQgPSAnJztcbiAgYXJpYVByZXNzZWQgPSAnJztcbiAgYXJpYVJlYWRPbmx5ID0gJyc7XG4gIGFyaWFSZXF1aXJlZCA9ICcnO1xuICBhcmlhUm9sZURlc2NyaXB0aW9uID0gJyc7XG4gIGFyaWFSb3dDb3VudCA9ICcnO1xuICBhcmlhUm93SW5kZXggPSAnJztcbiAgYXJpYVJvd1NwYW4gPSAnJztcbiAgYXJpYVNlbGVjdGVkID0gJyc7XG4gIGFyaWFTZXRTaXplID0gJyc7XG4gIGFyaWFTb3J0ID0gJyc7XG4gIGFyaWFWYWx1ZU1heCA9ICcnO1xuICBhcmlhVmFsdWVNaW4gPSAnJztcbiAgYXJpYVZhbHVlTm93ID0gJyc7XG4gIGFyaWFWYWx1ZVRleHQgPSAnJztcbiAgcm9sZSA9ICcnO1xuICBfX2hvc3Q6IEhUTUxFbGVtZW50O1xuICBnZXQgc2hhZG93Um9vdCgpIHtcbiAgICAvLyBHcmFiIHRoZSBzaGFkb3cgcm9vdCBpbnN0YW5jZSBmcm9tIHRoZSBFbGVtZW50IHNoaW1cbiAgICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgc2hhZG93IHJvb3QgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgIC8vIHRvIHRoZSBpbnRlcm5hbHMgaW5zdGFuY2UgZXZlbiBpZiB0aGUgbW9kZSBpcyAnY2xvc2VkJ1xuICAgIHJldHVybiAodGhpcy5fX2hvc3QgYXMgSFRNTEVsZW1lbnQgJiB7X19zaGFkb3dSb290OiBTaGFkb3dSb290fSlcbiAgICAgIC5fX3NoYWRvd1Jvb3Q7XG4gIH1cbiAgY29uc3RydWN0b3IoX2hvc3Q6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fX2hvc3QgPSBfaG9zdDtcbiAgfVxuICBjaGVja1ZhbGlkaXR5KCkge1xuICAgIC8vIFRPRE8oYXVndXN0amspIENvbnNpZGVyIGFjdHVhbGx5IGltcGxlbWVudGluZyBsb2dpYy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvaXNzdWVzLzM3NDBcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnYEVsZW1lbnRJbnRlcm5hbHMuY2hlY2tWYWxpZGl0eSgpYCB3YXMgY2FsbGVkIG9uIHRoZSBzZXJ2ZXIuJyArXG4gICAgICAgICdUaGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyB0cnVlLidcbiAgICApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGZvcm0gPSBudWxsO1xuICBsYWJlbHMgPSBbXSBhcyB1bmtub3duIGFzIE5vZGVMaXN0T2Y8SFRNTExhYmVsRWxlbWVudD47XG4gIHJlcG9ydFZhbGlkaXR5KCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHNldEZvcm1WYWx1ZSgpOiB2b2lkIHt9XG4gIHNldFZhbGlkaXR5KCk6IHZvaWQge31cbiAgc3RhdGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG4gIHZhbGlkaXR5ID0ge30gYXMgVmFsaWRpdHlTdGF0ZTtcbiAgd2lsbFZhbGlkYXRlID0gdHJ1ZTtcbn07XG5cbmNvbnN0IEVsZW1lbnRJbnRlcm5hbHNTaGltV2l0aFJlYWxUeXBlID1cbiAgRWxlbWVudEludGVybmFsc1NoaW0gYXMgb2JqZWN0IGFzIHR5cGVvZiBFbGVtZW50SW50ZXJuYWxzO1xuZXhwb3J0IHtFbGVtZW50SW50ZXJuYWxzU2hpbVdpdGhSZWFsVHlwZSBhcyBFbGVtZW50SW50ZXJuYWxzfTtcblxuZXhwb3J0IGNvbnN0IEhZRFJBVEVfSU5URVJOQUxTX0FUVFJfUFJFRklYID0gJ2h5ZHJhdGUtaW50ZXJuYWxzLSc7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5pbXBvcnQge0VsZW1lbnRJbnRlcm5hbHNTaGltfSBmcm9tICcuL2xpYi9lbGVtZW50LWludGVybmFscy5qcyc7XG5cbmV4cG9ydCB7XG4gIGFyaWFNaXhpbkF0dHJpYnV0ZXMsXG4gIEVsZW1lbnRJbnRlcm5hbHMsXG4gIEhZRFJBVEVfSU5URVJOQUxTX0FUVFJfUFJFRklYLFxufSBmcm9tICcuL2xpYi9lbGVtZW50LWludGVybmFscy5qcyc7XG5cbmNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgV2Vha01hcDxcbiAgSW5zdGFuY2VUeXBlPHR5cGVvZiBIVE1MRWxlbWVudFNoaW0+LFxuICBNYXA8c3RyaW5nLCBzdHJpbmc+XG4+KCk7XG5jb25zdCBhdHRyaWJ1dGVzRm9yRWxlbWVudCA9IChcbiAgZWxlbWVudDogSW5zdGFuY2VUeXBlPHR5cGVvZiBIVE1MRWxlbWVudFNoaW0+XG4pID0+IHtcbiAgbGV0IGF0dHJzID0gYXR0cmlidXRlcy5nZXQoZWxlbWVudCk7XG4gIGlmIChhdHRycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXR0cmlidXRlcy5zZXQoZWxlbWVudCwgKGF0dHJzID0gbmV3IE1hcCgpKSk7XG4gIH1cbiAgcmV0dXJuIGF0dHJzO1xufTtcblxuLy8gVGhlIHR5cGluZ3MgYXJvdW5kIHRoZSBleHBvcnRzIGJlbG93IGFyZSBhIGxpdHRsZSBmdW5reTpcbi8vXG4vLyAxLiBXZSB3YW50IHRoZSBgbmFtZWAgb2YgdGhlIHNoaW0gY2xhc3NlcyB0byBtYXRjaCB0aGUgcmVhbCBvbmVzIGF0IHJ1bnRpbWUsXG4vLyAgICBoZW5jZSBlLmcuIGBjbGFzcyBFbGVtZW50YC5cbi8vIDIuIFdlIGNhbid0IHNoYWRvdyB0aGUgZ2xvYmFsIHR5cGVzIHdpdGggYSBzaW1wbGUgY2xhc3MgZGVjbGFyYXRpb24sIGJlY2F1c2Vcbi8vICAgIHRoZW4gd2UgY2FuJ3QgcmVmZXJlbmNlIHRoZSBnbG9iYWwgdHlwZXMgZm9yIGNhc3RpbmcsIGhlbmNlIGUuZy5cbi8vICAgIGBjb25zdCBFbGVtZW50U2hpbSA9IGNsYXNzIEVsZW1lbnRgLlxuLy8gMy4gV2Ugd2FudCB0byBleHBvcnQgdGhlIGNsYXNzZXMgdHlwZWQgYXMgdGhlIHJlYWwgb25lcywgaGVuY2UgZS5nLlxuLy8gICAgYGNvbnN0IEVsZW1lbnRTaGltV2l0aFJlYWxUeXBlID0gRWxlbWVudFNoaW0gYXMgb2JqZWN0IGFzIHR5cGVvZiBFbGVtZW50O2AuXG4vLyA0LiBXZSB3YW50IHRoZSBleHBvcnRlZCBuYW1lcyB0byBtYXRjaCB0aGUgcmVhbCBvbmVzLCBoZW5jZSBlLmcuXG4vLyAgICBgZXhwb3J0IHtFbGVtZW50U2hpbVdpdGhSZWFsVHlwZSBhcyBFbGVtZW50fWAuXG5jb25zdCBFbGVtZW50U2hpbSA9IGNsYXNzIEVsZW1lbnQge1xuICBnZXQgYXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShhdHRyaWJ1dGVzRm9yRWxlbWVudCh0aGlzKSkubWFwKChbbmFtZSwgdmFsdWVdKSA9PiAoe1xuICAgICAgbmFtZSxcbiAgICAgIHZhbHVlLFxuICAgIH0pKTtcbiAgfVxuICBwcml2YXRlIF9fc2hhZG93Um9vdE1vZGU6IG51bGwgfCBTaGFkb3dSb290TW9kZSA9IG51bGw7XG4gIHByb3RlY3RlZCBfX3NoYWRvd1Jvb3Q6IG51bGwgfCBTaGFkb3dSb290ID0gbnVsbDtcbiAgcHJvdGVjdGVkIF9faW50ZXJuYWxzOiBudWxsIHwgRWxlbWVudEludGVybmFscyA9IG51bGw7XG5cbiAgZ2V0IHNoYWRvd1Jvb3QoKSB7XG4gICAgaWYgKHRoaXMuX19zaGFkb3dSb290TW9kZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX3NoYWRvd1Jvb3Q7XG4gIH1cbiAgZ2V0IGxvY2FsTmFtZSgpIHtcbiAgICByZXR1cm4gKHRoaXMuY29uc3RydWN0b3IgYXMgTmFtZWRDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yKS5fX2xvY2FsTmFtZTtcbiAgfVxuICBnZXQgdGFnTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbE5hbWU/LnRvVXBwZXJDYXNlKCk7XG4gIH1cbiAgc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBFbXVsYXRlIGJyb3dzZXIgYmVoYXZpb3IgdGhhdCBzaWxlbnRseSBjYXN0cyBhbGwgdmFsdWVzIHRvIHN0cmluZy4gRS5nLlxuICAgIC8vIGA0MmAgYmVjb21lcyBgXCI0MlwiYCBhbmQgYHt9YCBiZWNvbWVzIGBcIltvYmplY3QgT2JqZWN0XVwiXCJgLlxuICAgIGF0dHJpYnV0ZXNGb3JFbGVtZW50KHRoaXMpLnNldChuYW1lLCBTdHJpbmcodmFsdWUpKTtcbiAgfVxuICByZW1vdmVBdHRyaWJ1dGUobmFtZTogc3RyaW5nKSB7XG4gICAgYXR0cmlidXRlc0ZvckVsZW1lbnQodGhpcykuZGVsZXRlKG5hbWUpO1xuICB9XG4gIHRvZ2dsZUF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIGZvcmNlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIC8vIFN0ZXBzIHJlZmVyZW5jZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1lbGVtZW50LXRvZ2dsZWF0dHJpYnV0ZVxuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgLy8gU3RlcCA1XG4gICAgICBpZiAoZm9yY2UgPT09IHVuZGVmaW5lZCB8fCAhZm9yY2UpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RlcCA0XG4gICAgICBpZiAoZm9yY2UgPT09IHVuZGVmaW5lZCB8fCBmb3JjZSkge1xuICAgICAgICAvLyBTdGVwIDQuMVxuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCAnJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU3RlcCA0LjJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBTdGVwIDZcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBoYXNBdHRyaWJ1dGUobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXNGb3JFbGVtZW50KHRoaXMpLmhhcyhuYW1lKTtcbiAgfVxuICBhdHRhY2hTaGFkb3coaW5pdDogU2hhZG93Um9vdEluaXQpOiBTaGFkb3dSb290IHtcbiAgICBjb25zdCBzaGFkb3dSb290ID0ge2hvc3Q6IHRoaXN9IGFzIG9iamVjdCBhcyBTaGFkb3dSb290O1xuICAgIHRoaXMuX19zaGFkb3dSb290TW9kZSA9IGluaXQubW9kZTtcbiAgICBpZiAoaW5pdCAmJiBpbml0Lm1vZGUgPT09ICdvcGVuJykge1xuICAgICAgdGhpcy5fX3NoYWRvd1Jvb3QgPSBzaGFkb3dSb290O1xuICAgIH1cbiAgICByZXR1cm4gc2hhZG93Um9vdDtcbiAgfVxuICBhdHRhY2hJbnRlcm5hbHMoKTogRWxlbWVudEludGVybmFscyB7XG4gICAgaWYgKHRoaXMuX19pbnRlcm5hbHMgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBleGVjdXRlICdhdHRhY2hJbnRlcm5hbHMnIG9uICdIVE1MRWxlbWVudCc6IGAgK1xuICAgICAgICAgIGBFbGVtZW50SW50ZXJuYWxzIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgd2FzIGFscmVhZHkgYXR0YWNoZWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgaW50ZXJuYWxzID0gbmV3IEVsZW1lbnRJbnRlcm5hbHNTaGltKHRoaXMgYXMgdW5rbm93biBhcyBIVE1MRWxlbWVudCk7XG4gICAgdGhpcy5fX2ludGVybmFscyA9IGludGVybmFscztcbiAgICByZXR1cm4gaW50ZXJuYWxzIGFzIEVsZW1lbnRJbnRlcm5hbHM7XG4gIH1cbiAgZ2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHZhbHVlID0gYXR0cmlidXRlc0ZvckVsZW1lbnQodGhpcykuZ2V0KG5hbWUpO1xuICAgIHJldHVybiB2YWx1ZSA/PyBudWxsO1xuICB9XG59O1xuY29uc3QgRWxlbWVudFNoaW1XaXRoUmVhbFR5cGUgPSBFbGVtZW50U2hpbSBhcyBvYmplY3QgYXMgdHlwZW9mIEVsZW1lbnQ7XG5leHBvcnQge0VsZW1lbnRTaGltV2l0aFJlYWxUeXBlIGFzIEVsZW1lbnR9O1xuXG5jb25zdCBIVE1MRWxlbWVudFNoaW0gPSBjbGFzcyBIVE1MRWxlbWVudCBleHRlbmRzIEVsZW1lbnRTaGltIHt9O1xuY29uc3QgSFRNTEVsZW1lbnRTaGltV2l0aFJlYWxUeXBlID1cbiAgSFRNTEVsZW1lbnRTaGltIGFzIG9iamVjdCBhcyB0eXBlb2YgSFRNTEVsZW1lbnQ7XG5leHBvcnQge0hUTUxFbGVtZW50U2hpbVdpdGhSZWFsVHlwZSBhcyBIVE1MRWxlbWVudH07XG5cbmludGVyZmFjZSBDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yIHtcbiAgbmV3ICgpOiBIVE1MRWxlbWVudDtcbiAgb2JzZXJ2ZWRBdHRyaWJ1dGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBOYW1lZEN1c3RvbUhUTUxFbGVtZW50Q29uc3RydWN0b3JcbiAgZXh0ZW5kcyBDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yIHtcbiAgX19sb2NhbE5hbWU6IHN0cmluZztcbn1cblxudHlwZSBDdXN0b21FbGVtZW50UmVnaXN0cmF0aW9uID0ge1xuICBjdG9yOiB7bmV3ICgpOiBIVE1MRWxlbWVudH07XG4gIG9ic2VydmVkQXR0cmlidXRlczogc3RyaW5nW107XG59O1xuXG5jb25zdCBDdXN0b21FbGVtZW50UmVnaXN0cnlTaGltID0gY2xhc3MgQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBfX2RlZmluaXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRSZWdpc3RyYXRpb24+KCk7XG5cbiAgZGVmaW5lKG5hbWU6IHN0cmluZywgY3RvcjogQ3VzdG9tSFRNTEVsZW1lbnRDb25zdHJ1Y3Rvcikge1xuICAgIGlmICh0aGlzLl9fZGVmaW5pdGlvbnMuaGFzKG5hbWUpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGAnQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5JyBhbHJlYWR5IGhhcyBcIiR7bmFtZX1cIiBkZWZpbmVkLiBgICtcbiAgICAgICAgICAgIGBUaGlzIG1heSBoYXZlIGJlZW4gY2F1c2VkIGJ5IGxpdmUgcmVsb2FkIG9yIGhvdCBtb2R1bGUgYCArXG4gICAgICAgICAgICBgcmVwbGFjZW1lbnQgaW4gd2hpY2ggY2FzZSBpdCBjYW4gYmUgc2FmZWx5IGlnbm9yZWQuXFxuYCArXG4gICAgICAgICAgICBgTWFrZSBzdXJlIHRvIHRlc3QgeW91ciBhcHBsaWNhdGlvbiB3aXRoIGEgcHJvZHVjdGlvbiBidWlsZCBhcyBgICtcbiAgICAgICAgICAgIGByZXBlYXQgcmVnaXN0cmF0aW9ucyB3aWxsIHRocm93IGluIHByb2R1Y3Rpb24uYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gZXhlY3V0ZSAnZGVmaW5lJyBvbiAnQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5JzogYCArXG4gICAgICAgICAgICBgdGhlIG5hbWUgXCIke25hbWV9XCIgaGFzIGFscmVhZHkgYmVlbiB1c2VkIHdpdGggdGhpcyByZWdpc3RyeWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUHJvdmlkZSB0YWdOYW1lIGFuZCBsb2NhbE5hbWUgZm9yIHRoZSBjb21wb25lbnQuXG4gICAgKGN0b3IgYXMgTmFtZWRDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yKS5fX2xvY2FsTmFtZSA9IG5hbWU7XG4gICAgdGhpcy5fX2RlZmluaXRpb25zLnNldChuYW1lLCB7XG4gICAgICBjdG9yLFxuICAgICAgLy8gTm90ZSBpdCdzIGltcG9ydGFudCB3ZSByZWFkIGBvYnNlcnZlZEF0dHJpYnV0ZXNgIGluIGNhc2UgaXQgaXMgYSBnZXR0ZXJcbiAgICAgIC8vIHdpdGggc2lkZS1lZmZlY3RzLCBhcyBpcyB0aGUgY2FzZSBpbiBMaXQsIHdoZXJlIGl0IHRyaWdnZXJzIGNsYXNzXG4gICAgICAvLyBmaW5hbGl6YXRpb24uXG4gICAgICAvL1xuICAgICAgLy8gVE9ETyhhb21hcmtzKSBUbyBiZSBzcGVjIGNvbXBsaWFudCwgd2Ugc2hvdWxkIGFsc28gY2FwdHVyZSB0aGVcbiAgICAgIC8vIHJlZ2lzdHJhdGlvbi10aW1lIGxpZmVjeWNsZSBtZXRob2RzIGxpa2UgYGNvbm5lY3RlZENhbGxiYWNrYC4gRm9yIHRoZW1cbiAgICAgIC8vIHRvIGJlIGFjdHVhbGx5IGFjY2Vzc2libGUgdG8gZS5nLiB0aGUgTGl0IFNTUiBlbGVtZW50IHJlbmRlcmVyLCB0aG91Z2gsXG4gICAgICAvLyB3ZSdkIG5lZWQgdG8gaW50cm9kdWNlIGEgbmV3IEFQSSBmb3IgYWNjZXNzaW5nIHRoZW0gKHNpbmNlIGBnZXRgIG9ubHlcbiAgICAgIC8vIHJldHVybnMgdGhlIGNvbnN0cnVjdG9yKS5cbiAgICAgIG9ic2VydmVkQXR0cmlidXRlczogY3Rvci5vYnNlcnZlZEF0dHJpYnV0ZXMgPz8gW10sXG4gICAgfSk7XG4gIH1cblxuICBnZXQobmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IHRoaXMuX19kZWZpbml0aW9ucy5nZXQobmFtZSk7XG4gICAgcmV0dXJuIGRlZmluaXRpb24/LmN0b3I7XG4gIH1cbn07XG5jb25zdCBDdXN0b21FbGVtZW50UmVnaXN0cnlTaGltV2l0aFJlYWxUeXBlID1cbiAgQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5U2hpbSBhcyBvYmplY3QgYXMgdHlwZW9mIEN1c3RvbUVsZW1lbnRSZWdpc3RyeTtcbmV4cG9ydCB7Q3VzdG9tRWxlbWVudFJlZ2lzdHJ5U2hpbVdpdGhSZWFsVHlwZSBhcyBDdXN0b21FbGVtZW50UmVnaXN0cnl9O1xuXG5leHBvcnQgY29uc3QgY3VzdG9tRWxlbWVudHMgPSBuZXcgQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5U2hpbVdpdGhSZWFsVHlwZSgpO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG5jb25zdCBOT0RFX01PREUgPSBmYWxzZTtcblxuLy8gQWxsb3dzIG1pbmlmaWVycyB0byByZW5hbWUgcmVmZXJlbmNlcyB0byBnbG9iYWxUaGlzXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgYnJvd3NlciBzdXBwb3J0cyBgYWRvcHRlZFN0eWxlU2hlZXRzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0czogYm9vbGVhbiA9XG4gIGdsb2JhbC5TaGFkb3dSb290ICYmXG4gIChnbG9iYWwuU2hhZHlDU1MgPT09IHVuZGVmaW5lZCB8fCBnbG9iYWwuU2hhZHlDU1MubmF0aXZlU2hhZG93KSAmJlxuICAnYWRvcHRlZFN0eWxlU2hlZXRzJyBpbiBEb2N1bWVudC5wcm90b3R5cGUgJiZcbiAgJ3JlcGxhY2UnIGluIENTU1N0eWxlU2hlZXQucHJvdG90eXBlO1xuXG4vKipcbiAqIEEgQ1NTUmVzdWx0IG9yIG5hdGl2ZSBDU1NTdHlsZVNoZWV0LlxuICpcbiAqIEluIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBjb25zdHJ1Y3RpYmxlIENTUyBzdHlsZSBzaGVldHMsIENTU1N0eWxlU2hlZXRcbiAqIG9iamVjdCBjYW4gYmUgdXNlZCBmb3Igc3R5bGluZyBhbG9uZyBzaWRlIENTU1Jlc3VsdCBmcm9tIHRoZSBgY3NzYFxuICogdGVtcGxhdGUgdGFnLlxuICovXG5leHBvcnQgdHlwZSBDU1NSZXN1bHRPck5hdGl2ZSA9IENTU1Jlc3VsdCB8IENTU1N0eWxlU2hlZXQ7XG5cbmV4cG9ydCB0eXBlIENTU1Jlc3VsdEFycmF5ID0gQXJyYXk8Q1NTUmVzdWx0T3JOYXRpdmUgfCBDU1NSZXN1bHRBcnJheT47XG5cbi8qKlxuICogQSBzaW5nbGUgQ1NTUmVzdWx0LCBDU1NTdHlsZVNoZWV0LCBvciBhbiBhcnJheSBvciBuZXN0ZWQgYXJyYXlzIG9mIHRob3NlLlxuICovXG5leHBvcnQgdHlwZSBDU1NSZXN1bHRHcm91cCA9IENTU1Jlc3VsdE9yTmF0aXZlIHwgQ1NTUmVzdWx0QXJyYXk7XG5cbmNvbnN0IGNvbnN0cnVjdGlvblRva2VuID0gU3ltYm9sKCk7XG5cbmNvbnN0IGNzc1RhZ0NhY2hlID0gbmV3IFdlYWtNYXA8VGVtcGxhdGVTdHJpbmdzQXJyYXksIENTU1N0eWxlU2hlZXQ+KCk7XG5cbi8qKlxuICogQSBjb250YWluZXIgZm9yIGEgc3RyaW5nIG9mIENTUyB0ZXh0LCB0aGF0IG1heSBiZSB1c2VkIHRvIGNyZWF0ZSBhIENTU1N0eWxlU2hlZXQuXG4gKlxuICogQ1NTUmVzdWx0IGlzIHRoZSByZXR1cm4gdmFsdWUgb2YgYGNzc2AtdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWxzIGFuZFxuICogYHVuc2FmZUNTUygpYC4gSW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgQ1NTUmVzdWx0cyBhcmUgb25seSBjcmVhdGVkIHZpYSB0aGVcbiAqIGBjc3NgIHRhZyBhbmQgYHVuc2FmZUNTUygpYCwgQ1NTUmVzdWx0IGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseS5cbiAqL1xuZXhwb3J0IGNsYXNzIENTU1Jlc3VsdCB7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIFsnXyRjc3NSZXN1bHQkJ10gPSB0cnVlO1xuICByZWFkb25seSBjc3NUZXh0OiBzdHJpbmc7XG4gIHByaXZhdGUgX3N0eWxlU2hlZXQ/OiBDU1NTdHlsZVNoZWV0O1xuICBwcml2YXRlIF9zdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIGNzc1RleHQ6IHN0cmluZyxcbiAgICBzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHVuZGVmaW5lZCxcbiAgICBzYWZlVG9rZW46IHN5bWJvbFxuICApIHtcbiAgICBpZiAoc2FmZVRva2VuICE9PSBjb25zdHJ1Y3Rpb25Ub2tlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ1NTUmVzdWx0IGlzIG5vdCBjb25zdHJ1Y3RhYmxlLiBVc2UgYHVuc2FmZUNTU2Agb3IgYGNzc2AgaW5zdGVhZC4nXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmNzc1RleHQgPSBjc3NUZXh0O1xuICAgIHRoaXMuX3N0cmluZ3MgPSBzdHJpbmdzO1xuICB9XG5cbiAgLy8gVGhpcyBpcyBhIGdldHRlciBzbyB0aGF0IGl0J3MgbGF6eS4gSW4gcHJhY3RpY2UsIHRoaXMgbWVhbnMgc3R5bGVzaGVldHNcbiAgLy8gYXJlIG5vdCBjcmVhdGVkIHVudGlsIHRoZSBmaXJzdCBlbGVtZW50IGluc3RhbmNlIGlzIG1hZGUuXG4gIGdldCBzdHlsZVNoZWV0KCk6IENTU1N0eWxlU2hlZXQgfCB1bmRlZmluZWQge1xuICAgIC8vIElmIGBzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHNgIGlzIHRydWUgdGhlbiB3ZSBhc3N1bWUgQ1NTU3R5bGVTaGVldCBpc1xuICAgIC8vIGNvbnN0cnVjdGFibGUuXG4gICAgbGV0IHN0eWxlU2hlZXQgPSB0aGlzLl9zdHlsZVNoZWV0O1xuICAgIGNvbnN0IHN0cmluZ3MgPSB0aGlzLl9zdHJpbmdzO1xuICAgIGlmIChzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHMgJiYgc3R5bGVTaGVldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjYWNoZWFibGUgPSBzdHJpbmdzICE9PSB1bmRlZmluZWQgJiYgc3RyaW5ncy5sZW5ndGggPT09IDE7XG4gICAgICBpZiAoY2FjaGVhYmxlKSB7XG4gICAgICAgIHN0eWxlU2hlZXQgPSBjc3NUYWdDYWNoZS5nZXQoc3RyaW5ncyk7XG4gICAgICB9XG4gICAgICBpZiAoc3R5bGVTaGVldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICh0aGlzLl9zdHlsZVNoZWV0ID0gc3R5bGVTaGVldCA9IG5ldyBDU1NTdHlsZVNoZWV0KCkpLnJlcGxhY2VTeW5jKFxuICAgICAgICAgIHRoaXMuY3NzVGV4dFxuICAgICAgICApO1xuICAgICAgICBpZiAoY2FjaGVhYmxlKSB7XG4gICAgICAgICAgY3NzVGFnQ2FjaGUuc2V0KHN0cmluZ3MsIHN0eWxlU2hlZXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHlsZVNoZWV0O1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jc3NUZXh0O1xuICB9XG59XG5cbnR5cGUgQ29uc3RydWN0YWJsZUNTU1Jlc3VsdCA9IENTU1Jlc3VsdCAmIHtcbiAgbmV3IChcbiAgICBjc3NUZXh0OiBzdHJpbmcsXG4gICAgc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCB1bmRlZmluZWQsXG4gICAgc2FmZVRva2VuOiBzeW1ib2xcbiAgKTogQ1NTUmVzdWx0O1xufTtcblxuY29uc3QgdGV4dEZyb21DU1NSZXN1bHQgPSAodmFsdWU6IENTU1Jlc3VsdEdyb3VwIHwgbnVtYmVyKSA9PiB7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIGlmICgodmFsdWUgYXMgQ1NTUmVzdWx0KVsnXyRjc3NSZXN1bHQkJ10gPT09IHRydWUpIHtcbiAgICByZXR1cm4gKHZhbHVlIGFzIENTU1Jlc3VsdCkuY3NzVGV4dDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBWYWx1ZSBwYXNzZWQgdG8gJ2NzcycgZnVuY3Rpb24gbXVzdCBiZSBhICdjc3MnIGZ1bmN0aW9uIHJlc3VsdDogYCArXG4gICAgICAgIGAke3ZhbHVlfS4gVXNlICd1bnNhZmVDU1MnIHRvIHBhc3Mgbm9uLWxpdGVyYWwgdmFsdWVzLCBidXQgdGFrZSBjYXJlIGAgK1xuICAgICAgICBgdG8gZW5zdXJlIHBhZ2Ugc2VjdXJpdHkuYFxuICAgICk7XG4gIH1cbn07XG5cbi8qKlxuICogV3JhcCBhIHZhbHVlIGZvciBpbnRlcnBvbGF0aW9uIGluIGEge0BsaW5rY29kZSBjc3N9IHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsLlxuICpcbiAqIFRoaXMgaXMgdW5zYWZlIGJlY2F1c2UgdW50cnVzdGVkIENTUyB0ZXh0IGNhbiBiZSB1c2VkIHRvIHBob25lIGhvbWVcbiAqIG9yIGV4ZmlsdHJhdGUgZGF0YSB0byBhbiBhdHRhY2tlciBjb250cm9sbGVkIHNpdGUuIFRha2UgY2FyZSB0byBvbmx5IHVzZVxuICogdGhpcyB3aXRoIHRydXN0ZWQgaW5wdXQuXG4gKi9cbmV4cG9ydCBjb25zdCB1bnNhZmVDU1MgPSAodmFsdWU6IHVua25vd24pID0+XG4gIG5ldyAoQ1NTUmVzdWx0IGFzIENvbnN0cnVjdGFibGVDU1NSZXN1bHQpKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSksXG4gICAgdW5kZWZpbmVkLFxuICAgIGNvbnN0cnVjdGlvblRva2VuXG4gICk7XG5cbi8qKlxuICogQSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExpdEVsZW1lbnQnc1xuICoge0BsaW5rY29kZSBMaXRFbGVtZW50LnN0eWxlc30gcHJvcGVydHkgdG8gc2V0IGVsZW1lbnQgc3R5bGVzLlxuICpcbiAqIEZvciBzZWN1cml0eSByZWFzb25zLCBvbmx5IGxpdGVyYWwgc3RyaW5nIHZhbHVlcyBhbmQgbnVtYmVyIG1heSBiZSB1c2VkIGluXG4gKiBlbWJlZGRlZCBleHByZXNzaW9ucy4gVG8gaW5jb3Jwb3JhdGUgbm9uLWxpdGVyYWwgdmFsdWVzIHtAbGlua2NvZGUgdW5zYWZlQ1NTfVxuICogbWF5IGJlIHVzZWQgaW5zaWRlIGFuIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBjb25zdCBjc3MgPSAoXG4gIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5LFxuICAuLi52YWx1ZXM6IChDU1NSZXN1bHRHcm91cCB8IG51bWJlcilbXVxuKTogQ1NTUmVzdWx0ID0+IHtcbiAgY29uc3QgY3NzVGV4dCA9XG4gICAgc3RyaW5ncy5sZW5ndGggPT09IDFcbiAgICAgID8gc3RyaW5nc1swXVxuICAgICAgOiB2YWx1ZXMucmVkdWNlKFxuICAgICAgICAgIChhY2MsIHYsIGlkeCkgPT4gYWNjICsgdGV4dEZyb21DU1NSZXN1bHQodikgKyBzdHJpbmdzW2lkeCArIDFdLFxuICAgICAgICAgIHN0cmluZ3NbMF1cbiAgICAgICAgKTtcbiAgcmV0dXJuIG5ldyAoQ1NTUmVzdWx0IGFzIENvbnN0cnVjdGFibGVDU1NSZXN1bHQpKFxuICAgIGNzc1RleHQsXG4gICAgc3RyaW5ncyxcbiAgICBjb25zdHJ1Y3Rpb25Ub2tlblxuICApO1xufTtcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBnaXZlbiBzdHlsZXMgdG8gYSBgc2hhZG93Um9vdGAuIFdoZW4gU2hhZG93IERPTSBpc1xuICogYXZhaWxhYmxlIGJ1dCBgYWRvcHRlZFN0eWxlU2hlZXRzYCBpcyBub3QsIHN0eWxlcyBhcmUgYXBwZW5kZWQgdG8gdGhlXG4gKiBgc2hhZG93Um9vdGAgdG8gW21pbWljIHNwZWMgYmVoYXZpb3JdKGh0dHBzOi8vd2ljZy5naXRodWIuaW8vY29uc3RydWN0LXN0eWxlc2hlZXRzLyN1c2luZy1jb25zdHJ1Y3RlZC1zdHlsZXNoZWV0cykuXG4gKiBOb3RlLCB3aGVuIHNoaW1taW5nIGlzIHVzZWQsIGFueSBzdHlsZXMgdGhhdCBhcmUgc3Vic2VxdWVudGx5IHBsYWNlZCBpbnRvXG4gKiB0aGUgc2hhZG93Um9vdCBzaG91bGQgYmUgcGxhY2VkICpiZWZvcmUqIGFueSBzaGltbWVkIGFkb3B0ZWQgc3R5bGVzLiBUaGlzXG4gKiB3aWxsIG1hdGNoIHNwZWMgYmVoYXZpb3IgdGhhdCBnaXZlcyBhZG9wdGVkIHNoZWV0cyBwcmVjZWRlbmNlIG92ZXIgc3R5bGVzIGluXG4gKiBzaGFkb3dSb290LlxuICovXG5leHBvcnQgY29uc3QgYWRvcHRTdHlsZXMgPSAoXG4gIHJlbmRlclJvb3Q6IFNoYWRvd1Jvb3QsXG4gIHN0eWxlczogQXJyYXk8Q1NTUmVzdWx0T3JOYXRpdmU+XG4pID0+IHtcbiAgaWYgKHN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0cykge1xuICAgIChyZW5kZXJSb290IGFzIFNoYWRvd1Jvb3QpLmFkb3B0ZWRTdHlsZVNoZWV0cyA9IHN0eWxlcy5tYXAoKHMpID0+XG4gICAgICBzIGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldCA/IHMgOiBzLnN0eWxlU2hlZXQhXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHMgb2Ygc3R5bGVzKSB7XG4gICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uc3Qgbm9uY2UgPSAoZ2xvYmFsIGFzIGFueSlbJ2xpdE5vbmNlJ107XG4gICAgICBpZiAobm9uY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbm9uY2UpO1xuICAgICAgfVxuICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSAocyBhcyBDU1NSZXN1bHQpLmNzc1RleHQ7XG4gICAgICByZW5kZXJSb290LmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IGNzc1Jlc3VsdEZyb21TdHlsZVNoZWV0ID0gKHNoZWV0OiBDU1NTdHlsZVNoZWV0KSA9PiB7XG4gIGxldCBjc3NUZXh0ID0gJyc7XG4gIGZvciAoY29uc3QgcnVsZSBvZiBzaGVldC5jc3NSdWxlcykge1xuICAgIGNzc1RleHQgKz0gcnVsZS5jc3NUZXh0O1xuICB9XG4gIHJldHVybiB1bnNhZmVDU1MoY3NzVGV4dCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29tcGF0aWJsZVN0eWxlID1cbiAgc3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzIHx8XG4gIChOT0RFX01PREUgJiYgZ2xvYmFsLkNTU1N0eWxlU2hlZXQgPT09IHVuZGVmaW5lZClcbiAgICA/IChzOiBDU1NSZXN1bHRPck5hdGl2ZSkgPT4gc1xuICAgIDogKHM6IENTU1Jlc3VsdE9yTmF0aXZlKSA9PlxuICAgICAgICBzIGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldCA/IGNzc1Jlc3VsdEZyb21TdHlsZVNoZWV0KHMpIDogcztcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBVc2UgdGhpcyBtb2R1bGUgaWYgeW91IHdhbnQgdG8gY3JlYXRlIHlvdXIgb3duIGJhc2UgY2xhc3MgZXh0ZW5kaW5nXG4gKiB7QGxpbmsgUmVhY3RpdmVFbGVtZW50fS5cbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbmltcG9ydCB7XG4gIGdldENvbXBhdGlibGVTdHlsZSxcbiAgYWRvcHRTdHlsZXMsXG4gIENTU1Jlc3VsdEdyb3VwLFxuICBDU1NSZXN1bHRPck5hdGl2ZSxcbn0gZnJvbSAnLi9jc3MtdGFnLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgUmVhY3RpdmVDb250cm9sbGVyLFxuICBSZWFjdGl2ZUNvbnRyb2xsZXJIb3N0LFxufSBmcm9tICcuL3JlYWN0aXZlLWNvbnRyb2xsZXIuanMnO1xuXG4vLyBJbiB0aGUgTm9kZSBidWlsZCwgdGhpcyBpbXBvcnQgd2lsbCBiZSBpbmplY3RlZCBieSBSb2xsdXA6XG4vLyBpbXBvcnQge0hUTUxFbGVtZW50LCBjdXN0b21FbGVtZW50c30gZnJvbSAnQGxpdC1sYWJzL3Nzci1kb20tc2hpbSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vY3NzLXRhZy5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIFJlYWN0aXZlQ29udHJvbGxlcixcbiAgUmVhY3RpdmVDb250cm9sbGVySG9zdCxcbn0gZnJvbSAnLi9yZWFjdGl2ZS1jb250cm9sbGVyLmpzJztcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBgcmVhZG9ubHlgIG1vZGlmaWVyIGZyb20gcHJvcGVydGllcyBpbiB0aGUgdW5pb24gSy5cbiAqXG4gKiBUaGlzIGlzIGEgc2FmZXIgd2F5IHRvIGNhc3QgYSB2YWx1ZSB0byBhIHR5cGUgd2l0aCBhIG11dGFibGUgdmVyc2lvbiBvZiBhXG4gKiByZWFkb25seSBmaWVsZCwgdGhhbiBjYXN0aW5nIHRvIGFuIGludGVyZmFjZSB3aXRoIHRoZSBmaWVsZCByZS1kZWNsYXJlZFxuICogYmVjYXVzZSBpdCBwcmVzZXJ2ZXMgdGhlIHR5cGUgb2YgYWxsIHRoZSBmaWVsZHMgYW5kIHdhcm5zIG9uIHR5cG9zLlxuICovXG50eXBlIE11dGFibGU8VCwgSyBleHRlbmRzIGtleW9mIFQ+ID0gT21pdDxULCBLPiAmIHtcbiAgLXJlYWRvbmx5IFtQIGluIGtleW9mIFBpY2s8VCwgSz5dOiBQIGV4dGVuZHMgSyA/IFRbUF0gOiBuZXZlcjtcbn07XG5cbi8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiBBZGQgYGhhc093bmAgaGVyZSB3aGVuIHdlIHNoaXAgRVMyMDIyXG5jb25zdCB7XG4gIGlzLFxuICBkZWZpbmVQcm9wZXJ0eSxcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMsXG4gIGdldFByb3RvdHlwZU9mLFxufSA9IE9iamVjdDtcblxuY29uc3QgTk9ERV9NT0RFID0gZmFsc2U7XG5cbi8vIExldHMgYSBtaW5pZmllciByZXBsYWNlIGdsb2JhbFRoaXMgcmVmZXJlbmNlcyB3aXRoIGEgbWluaWZpZWQgbmFtZVxuY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcztcblxuaWYgKE5PREVfTU9ERSkge1xuICBnbG9iYWwuY3VzdG9tRWxlbWVudHMgPz89IGN1c3RvbUVsZW1lbnRzO1xufVxuXG5jb25zdCBERVZfTU9ERSA9IHRydWU7XG5cbmxldCBpc3N1ZVdhcm5pbmc6IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4gdm9pZDtcblxuY29uc3QgdHJ1c3RlZFR5cGVzID0gKGdsb2JhbCBhcyB1bmtub3duIGFzIHt0cnVzdGVkVHlwZXM/OiB7ZW1wdHlTY3JpcHQ6ICcnfX0pXG4gIC50cnVzdGVkVHlwZXM7XG5cbi8vIFRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBodHRwczovL2NyYnVnLmNvbS85OTMyNjhcbi8vIEN1cnJlbnRseSwgYW55IGF0dHJpYnV0ZSBzdGFydGluZyB3aXRoIFwib25cIiBpcyBjb25zaWRlcmVkIHRvIGJlIGFcbi8vIFRydXN0ZWRTY3JpcHQgc291cmNlLiBTdWNoIGJvb2xlYW4gYXR0cmlidXRlcyBtdXN0IGJlIHNldCB0byB0aGUgZXF1aXZhbGVudFxuLy8gdHJ1c3RlZCBlbXB0eVNjcmlwdCB2YWx1ZS5cbmNvbnN0IGVtcHR5U3RyaW5nRm9yQm9vbGVhbkF0dHJpYnV0ZSA9IHRydXN0ZWRUeXBlc1xuICA/ICh0cnVzdGVkVHlwZXMuZW1wdHlTY3JpcHQgYXMgdW5rbm93biBhcyAnJylcbiAgOiAnJztcblxuY29uc3QgcG9seWZpbGxTdXBwb3J0ID0gREVWX01PREVcbiAgPyBnbG9iYWwucmVhY3RpdmVFbGVtZW50UG9seWZpbGxTdXBwb3J0RGV2TW9kZVxuICA6IGdsb2JhbC5yZWFjdGl2ZUVsZW1lbnRQb2x5ZmlsbFN1cHBvcnQ7XG5cbmlmIChERVZfTU9ERSkge1xuICAvLyBFbnN1cmUgd2FybmluZ3MgYXJlIGlzc3VlZCBvbmx5IDF4LCBldmVuIGlmIG11bHRpcGxlIHZlcnNpb25zIG9mIExpdFxuICAvLyBhcmUgbG9hZGVkLlxuICBjb25zdCBpc3N1ZWRXYXJuaW5nczogU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4gPSAoZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzID8/PVxuICAgIG5ldyBTZXQoKSk7XG5cbiAgLy8gSXNzdWUgYSB3YXJuaW5nLCBpZiB3ZSBoYXZlbid0IGFscmVhZHkuXG4gIGlzc3VlV2FybmluZyA9IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4ge1xuICAgIHdhcm5pbmcgKz0gYCBTZWUgaHR0cHM6Ly9saXQuZGV2L21zZy8ke2NvZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLmA7XG4gICAgaWYgKCFpc3N1ZWRXYXJuaW5ncy5oYXMod2FybmluZykpIHtcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgIGlzc3VlZFdhcm5pbmdzLmFkZCh3YXJuaW5nKTtcbiAgICB9XG4gIH07XG5cbiAgaXNzdWVXYXJuaW5nKFxuICAgICdkZXYtbW9kZScsXG4gICAgYExpdCBpcyBpbiBkZXYgbW9kZS4gTm90IHJlY29tbWVuZGVkIGZvciBwcm9kdWN0aW9uIWBcbiAgKTtcblxuICAvLyBJc3N1ZSBwb2x5ZmlsbCBzdXBwb3J0IHdhcm5pbmcuXG4gIGlmIChnbG9iYWwuU2hhZHlET00/LmluVXNlICYmIHBvbHlmaWxsU3VwcG9ydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaXNzdWVXYXJuaW5nKFxuICAgICAgJ3BvbHlmaWxsLXN1cHBvcnQtbWlzc2luZycsXG4gICAgICBgU2hhZG93IERPTSBpcyBiZWluZyBwb2x5ZmlsbGVkIHZpYSBcXGBTaGFkeURPTVxcYCBidXQgYCArXG4gICAgICAgIGB0aGUgXFxgcG9seWZpbGwtc3VwcG9ydFxcYCBtb2R1bGUgaGFzIG5vdCBiZWVuIGxvYWRlZC5gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnRhaW5zIHR5cGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHVuc3RhYmxlIGRlYnVnIEFQSS5cbiAqXG4gKiBFdmVyeXRoaW5nIGluIHRoaXMgQVBJIGlzIG5vdCBzdGFibGUgYW5kIG1heSBjaGFuZ2Ugb3IgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLFxuICogZXZlbiBvbiBwYXRjaCByZWxlYXNlcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbmV4cG9ydCBuYW1lc3BhY2UgUmVhY3RpdmVVbnN0YWJsZSB7XG4gIC8qKlxuICAgKiBXaGVuIExpdCBpcyBydW5uaW5nIGluIGRldiBtb2RlIGFuZCBgd2luZG93LmVtaXRMaXREZWJ1Z0xvZ0V2ZW50c2AgaXMgdHJ1ZSxcbiAgICogd2Ugd2lsbCBlbWl0ICdsaXQtZGVidWcnIGV2ZW50cyB0byB3aW5kb3csIHdpdGggbGl2ZSBkZXRhaWxzIGFib3V0IHRoZSB1cGRhdGUgYW5kIHJlbmRlclxuICAgKiBsaWZlY3ljbGUuIFRoZXNlIGNhbiBiZSB1c2VmdWwgZm9yIHdyaXRpbmcgZGVidWcgdG9vbGluZyBhbmQgdmlzdWFsaXphdGlvbnMuXG4gICAqXG4gICAqIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHJ1bm5pbmcgd2l0aCB3aW5kb3cuZW1pdExpdERlYnVnTG9nRXZlbnRzIGhhcyBwZXJmb3JtYW5jZSBvdmVyaGVhZCxcbiAgICogbWFraW5nIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3JtYWxseSB2ZXJ5IGNoZWFwIChsaWtlIGEgbm8tb3AgcmVuZGVyKSBtdWNoIHNsb3dlcixcbiAgICogYmVjYXVzZSB3ZSBtdXN0IGNvcHkgZGF0YSBhbmQgZGlzcGF0Y2ggZXZlbnRzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbiAgZXhwb3J0IG5hbWVzcGFjZSBEZWJ1Z0xvZyB7XG4gICAgZXhwb3J0IHR5cGUgRW50cnkgPSBVcGRhdGU7XG4gICAgZXhwb3J0IGludGVyZmFjZSBVcGRhdGUge1xuICAgICAga2luZDogJ3VwZGF0ZSc7XG4gICAgfVxuICB9XG59XG5cbmludGVyZmFjZSBEZWJ1Z0xvZ2dpbmdXaW5kb3cge1xuICAvLyBFdmVuIGluIGRldiBtb2RlLCB3ZSBnZW5lcmFsbHkgZG9uJ3Qgd2FudCB0byBlbWl0IHRoZXNlIGV2ZW50cywgYXMgdGhhdCdzXG4gIC8vIGFub3RoZXIgbGV2ZWwgb2YgY29zdCwgc28gb25seSBlbWl0IHRoZW0gd2hlbiBERVZfTU9ERSBpcyB0cnVlIF9hbmRfIHdoZW5cbiAgLy8gd2luZG93LmVtaXRMaXREZWJ1Z0V2ZW50cyBpcyB0cnVlLlxuICBlbWl0TGl0RGVidWdMb2dFdmVudHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFVzZWZ1bCBmb3IgdmlzdWFsaXppbmcgYW5kIGxvZ2dpbmcgaW5zaWdodHMgaW50byB3aGF0IHRoZSBMaXQgdGVtcGxhdGUgc3lzdGVtIGlzIGRvaW5nLlxuICpcbiAqIENvbXBpbGVkIG91dCBvZiBwcm9kIG1vZGUgYnVpbGRzLlxuICovXG5jb25zdCBkZWJ1Z0xvZ0V2ZW50ID0gREVWX01PREVcbiAgPyAoZXZlbnQ6IFJlYWN0aXZlVW5zdGFibGUuRGVidWdMb2cuRW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEVtaXQgPSAoZ2xvYmFsIGFzIHVua25vd24gYXMgRGVidWdMb2dnaW5nV2luZG93KVxuICAgICAgICAuZW1pdExpdERlYnVnTG9nRXZlbnRzO1xuICAgICAgaWYgKCFzaG91bGRFbWl0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGdsb2JhbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8UmVhY3RpdmVVbnN0YWJsZS5EZWJ1Z0xvZy5FbnRyeT4oJ2xpdC1kZWJ1ZycsIHtcbiAgICAgICAgICBkZXRhaWw6IGV2ZW50LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIDogdW5kZWZpbmVkO1xuXG4vKlxuICogV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzXG4gKiByZXBsYWNlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIG11bmdlZCBuYW1lIGZvciBvYmplY3RbcHJvcGVydHldLiBXZSBjYW5ub3RcbiAqIGFsaWFzIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGhhdmUgdG8gdXNlIGEgc21hbGwgc2hpbSB0aGF0IGhhcyB0aGUgc2FtZVxuICogYmVoYXZpb3Igd2hlbiBub3QgY29tcGlsaW5nLlxuICovXG4vKkBfX0lOTElORV9fKi9cbmNvbnN0IEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSA8UCBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgcHJvcDogUCxcbiAgX29iajogdW5rbm93blxuKTogUCA9PiBwcm9wO1xuXG4vKipcbiAqIENvbnZlcnRzIHByb3BlcnR5IHZhbHVlcyB0byBhbmQgZnJvbSBhdHRyaWJ1dGUgdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXI8VHlwZSA9IHVua25vd24sIFR5cGVIaW50ID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogQ2FsbGVkIHRvIGNvbnZlcnQgYW4gYXR0cmlidXRlIHZhbHVlIHRvIGEgcHJvcGVydHlcbiAgICogdmFsdWUuXG4gICAqL1xuICBmcm9tQXR0cmlidXRlPyh2YWx1ZTogc3RyaW5nIHwgbnVsbCwgdHlwZT86IFR5cGVIaW50KTogVHlwZTtcblxuICAvKipcbiAgICogQ2FsbGVkIHRvIGNvbnZlcnQgYSBwcm9wZXJ0eSB2YWx1ZSB0byBhbiBhdHRyaWJ1dGVcbiAgICogdmFsdWUuXG4gICAqXG4gICAqIEl0IHJldHVybnMgdW5rbm93biBpbnN0ZWFkIG9mIHN0cmluZywgdG8gYmUgY29tcGF0aWJsZSB3aXRoXG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL3RydXN0ZWQtdHlwZXMgKGFuZCBzaW1pbGFyIGVmZm9ydHMpLlxuICAgKi9cbiAgdG9BdHRyaWJ1dGU/KHZhbHVlOiBUeXBlLCB0eXBlPzogVHlwZUhpbnQpOiB1bmtub3duO1xufVxuXG50eXBlIEF0dHJpYnV0ZUNvbnZlcnRlcjxUeXBlID0gdW5rbm93biwgVHlwZUhpbnQgPSB1bmtub3duPiA9XG4gIHwgQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlcjxUeXBlPlxuICB8ICgodmFsdWU6IHN0cmluZyB8IG51bGwsIHR5cGU/OiBUeXBlSGludCkgPT4gVHlwZSk7XG5cbi8qKlxuICogRGVmaW5lcyBvcHRpb25zIGZvciBhIHByb3BlcnR5IGFjY2Vzc29yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnR5RGVjbGFyYXRpb248VHlwZSA9IHVua25vd24sIFR5cGVIaW50ID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogV2hlbiBzZXQgdG8gYHRydWVgLCBpbmRpY2F0ZXMgdGhlIHByb3BlcnR5IGlzIGludGVybmFsIHByaXZhdGUgc3RhdGUuIFRoZVxuICAgKiBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIHNldCBieSB1c2Vycy4gV2hlbiB1c2luZyBUeXBlU2NyaXB0LCB0aGlzIHByb3BlcnR5XG4gICAqIHNob3VsZCBiZSBtYXJrZWQgYXMgYHByaXZhdGVgIG9yIGBwcm90ZWN0ZWRgLCBhbmQgaXQgaXMgYWxzbyBhIGNvbW1vblxuICAgKiBwcmFjdGljZSB0byB1c2UgYSBsZWFkaW5nIGBfYCBpbiB0aGUgbmFtZS4gVGhlIHByb3BlcnR5IGlzIG5vdCBhZGRlZCB0b1xuICAgKiBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGhvdyBhbmQgd2hldGhlciB0aGUgcHJvcGVydHkgYmVjb21lcyBhbiBvYnNlcnZlZCBhdHRyaWJ1dGUuXG4gICAqIElmIHRoZSB2YWx1ZSBpcyBgZmFsc2VgLCB0aGUgcHJvcGVydHkgaXMgbm90IGFkZGVkIHRvIGBvYnNlcnZlZEF0dHJpYnV0ZXNgLlxuICAgKiBJZiB0cnVlIG9yIGFic2VudCwgdGhlIGxvd2VyY2FzZWQgcHJvcGVydHkgbmFtZSBpcyBvYnNlcnZlZCAoZS5nLiBgZm9vQmFyYFxuICAgKiBiZWNvbWVzIGBmb29iYXJgKS4gSWYgYSBzdHJpbmcsIHRoZSBzdHJpbmcgdmFsdWUgaXMgb2JzZXJ2ZWQgKGUuZ1xuICAgKiBgYXR0cmlidXRlOiAnZm9vLWJhcidgKS5cbiAgICovXG4gIHJlYWRvbmx5IGF0dHJpYnV0ZT86IGJvb2xlYW4gfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgcHJvcGVydHkuIFRoaXMgaXMgdXNlZCBvbmx5IGFzIGEgaGludCBmb3IgdGhlXG4gICAqIGBjb252ZXJ0ZXJgIHRvIGRldGVybWluZSBob3cgdG8gY29udmVydCB0aGUgYXR0cmlidXRlXG4gICAqIHRvL2Zyb20gYSBwcm9wZXJ0eS5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBUeXBlSGludDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGhvdyB0byBjb252ZXJ0IHRoZSBhdHRyaWJ1dGUgdG8vZnJvbSBhIHByb3BlcnR5LiBJZiB0aGlzIHZhbHVlXG4gICAqIGlzIGEgZnVuY3Rpb24sIGl0IGlzIHVzZWQgdG8gY29udmVydCB0aGUgYXR0cmlidXRlIHZhbHVlIGEgdGhlIHByb3BlcnR5XG4gICAqIHZhbHVlLiBJZiBpdCdzIGFuIG9iamVjdCwgaXQgY2FuIGhhdmUga2V5cyBmb3IgYGZyb21BdHRyaWJ1dGVgIGFuZFxuICAgKiBgdG9BdHRyaWJ1dGVgLiBJZiBubyBgdG9BdHRyaWJ1dGVgIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGFuZFxuICAgKiBgcmVmbGVjdGAgaXMgc2V0IHRvIGB0cnVlYCwgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHNldCBkaXJlY3RseSB0byB0aGVcbiAgICogYXR0cmlidXRlLiBBIGRlZmF1bHQgYGNvbnZlcnRlcmAgaXMgdXNlZCBpZiBub25lIGlzIHByb3ZpZGVkOyBpdCBzdXBwb3J0c1xuICAgKiBgQm9vbGVhbmAsIGBTdHJpbmdgLCBgTnVtYmVyYCwgYE9iamVjdGAsIGFuZCBgQXJyYXlgLiBOb3RlLFxuICAgKiB3aGVuIGEgcHJvcGVydHkgY2hhbmdlcyBhbmQgdGhlIGNvbnZlcnRlciBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgYXR0cmlidXRlLFxuICAgKiB0aGUgcHJvcGVydHkgaXMgbmV2ZXIgdXBkYXRlZCBhZ2FpbiBhcyBhIHJlc3VsdCBvZiB0aGUgYXR0cmlidXRlIGNoYW5naW5nLFxuICAgKiBhbmQgdmljZSB2ZXJzYS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnZlcnRlcj86IEF0dHJpYnV0ZUNvbnZlcnRlcjxUeXBlLCBUeXBlSGludD47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIHJlZmxlY3QgdG8gYW4gYXR0cmlidXRlLlxuICAgKiBJZiBgdHJ1ZWAsIHdoZW4gdGhlIHByb3BlcnR5IGlzIHNldCwgdGhlIGF0dHJpYnV0ZSBpcyBzZXQgdXNpbmcgdGhlXG4gICAqIGF0dHJpYnV0ZSBuYW1lIGRldGVybWluZWQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBmb3IgdGhlIGBhdHRyaWJ1dGVgXG4gICAqIHByb3BlcnR5IG9wdGlvbiBhbmQgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBjb252ZXJ0ZWQgdXNpbmcgdGhlIHJ1bGVzXG4gICAqIGZyb20gdGhlIGBjb252ZXJ0ZXJgIHByb3BlcnR5IG9wdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHJlZmxlY3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgaW5kaWNhdGVzIGlmIGEgcHJvcGVydHkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgY2hhbmdlZCB3aGVuXG4gICAqIGl0IGlzIHNldC4gVGhlIGZ1bmN0aW9uIHNob3VsZCB0YWtlIHRoZSBgbmV3VmFsdWVgIGFuZCBgb2xkVmFsdWVgIGFuZFxuICAgKiByZXR1cm4gYHRydWVgIGlmIGFuIHVwZGF0ZSBzaG91bGQgYmUgcmVxdWVzdGVkLlxuICAgKi9cbiAgaGFzQ2hhbmdlZD8odmFsdWU6IFR5cGUsIG9sZFZhbHVlOiBUeXBlKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYW4gYWNjZXNzb3Igd2lsbCBiZSBjcmVhdGVkIGZvciB0aGlzIHByb3BlcnR5LiBCeVxuICAgKiBkZWZhdWx0LCBhbiBhY2Nlc3NvciB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgdGhpcyBwcm9wZXJ0eSB0aGF0IHJlcXVlc3RzIGFuXG4gICAqIHVwZGF0ZSB3aGVuIHNldC4gSWYgdGhpcyBmbGFnIGlzIGB0cnVlYCwgbm8gYWNjZXNzb3Igd2lsbCBiZSBjcmVhdGVkLCBhbmRcbiAgICogaXQgd2lsbCBiZSB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGNhbGxcbiAgICogYHRoaXMucmVxdWVzdFVwZGF0ZShwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlKWAgdG8gcmVxdWVzdCBhbiB1cGRhdGUgd2hlblxuICAgKiB0aGUgcHJvcGVydHkgY2hhbmdlcy5cbiAgICovXG4gIHJlYWRvbmx5IG5vQWNjZXNzb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcHJvcGVydHkgaXMgd3JhcHBpbmcgYWNjZXNzb3JzLiBUaGlzIGlzIHNldCBieSBgQHByb3BlcnR5YFxuICAgKiB0byBjb250cm9sIHRoZSBpbml0aWFsIHZhbHVlIGNoYW5nZSBhbmQgcmVmbGVjdGlvbiBsb2dpYy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICB3cmFwcGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBNYXAgb2YgcHJvcGVydGllcyB0byBQcm9wZXJ0eURlY2xhcmF0aW9uIG9wdGlvbnMuIEZvciBlYWNoIHByb3BlcnR5IGFuXG4gKiBhY2Nlc3NvciBpcyBtYWRlLCBhbmQgdGhlIHByb3BlcnR5IGlzIHByb2Nlc3NlZCBhY2NvcmRpbmcgdG8gdGhlXG4gKiBQcm9wZXJ0eURlY2xhcmF0aW9uIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvcGVydHlEZWNsYXJhdGlvbnMge1xuICByZWFkb25seSBba2V5OiBzdHJpbmddOiBQcm9wZXJ0eURlY2xhcmF0aW9uO1xufVxuXG50eXBlIFByb3BlcnR5RGVjbGFyYXRpb25NYXAgPSBNYXA8UHJvcGVydHlLZXksIFByb3BlcnR5RGVjbGFyYXRpb24+O1xuXG50eXBlIEF0dHJpYnV0ZU1hcCA9IE1hcDxzdHJpbmcsIFByb3BlcnR5S2V5PjtcblxuLyoqXG4gKiBBIE1hcCBvZiBwcm9wZXJ0eSBrZXlzIHRvIHZhbHVlcy5cbiAqXG4gKiBUYWtlcyBhbiBvcHRpb25hbCB0eXBlIHBhcmFtZXRlciBULCB3aGljaCB3aGVuIHNwZWNpZmllZCBhcyBhIG5vbi1hbnksXG4gKiBub24tdW5rbm93biB0eXBlLCB3aWxsIG1ha2UgdGhlIE1hcCBtb3JlIHN0cm9uZ2x5LXR5cGVkLCBhc3NvY2lhdGluZyB0aGUgbWFwXG4gKiBrZXlzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZSB0eXBlIG9uIFQuXG4gKlxuICogVXNlIGBQcm9wZXJ0eVZhbHVlczx0aGlzPmAgd2hlbiBvdmVycmlkaW5nIFJlYWN0aXZlRWxlbWVudC51cGRhdGUoKSBhbmRcbiAqIG90aGVyIGxpZmVjeWNsZSBtZXRob2RzIGluIG9yZGVyIHRvIGdldCBzdHJvbmdlciB0eXBlLWNoZWNraW5nIG9uIGtleXNcbiAqIGFuZCB2YWx1ZXMuXG4gKi9cbi8vIFRoaXMgdHlwZSBpcyBjb25kaXRpb25hbCBzbyB0aGF0IGlmIHRoZSBwYXJhbWV0ZXIgVCBpcyBub3Qgc3BlY2lmaWVkLCBvclxuLy8gaXMgYGFueWAsIHRoZSB0eXBlIHdpbGwgaW5jbHVkZSBgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPmAuIFNpbmNlIFQgaXMgbm90XG4vLyBnaXZlbiBpbiB0aGUgdXNlcyBvZiBQcm9wZXJ0eVZhbHVlcyBpbiB0aGlzIGZpbGUsIGFsbCB1c2VzIGhlcmUgZmFsbGJhY2sgdG9cbi8vIG1lYW5pbmcgYE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj5gLCBidXQgaWYgYSBkZXZlbG9wZXIgdXNlc1xuLy8gYFByb3BlcnR5VmFsdWVzPHRoaXM+YCAob3IgYW55IG90aGVyIHZhbHVlIGZvciBUKSB0aGV5IHdpbGwgZ2V0IGFcbi8vIHN0cm9uZ2x5LXR5cGVkIE1hcCB0eXBlLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIFByb3BlcnR5VmFsdWVzPFQgPSBhbnk+ID0gVCBleHRlbmRzIG9iamVjdFxuICA/IFByb3BlcnR5VmFsdWVNYXA8VD5cbiAgOiBNYXA8UHJvcGVydHlLZXksIHVua25vd24+O1xuXG4vKipcbiAqIERvIG5vdCB1c2UsIGluc3RlYWQgcHJlZmVyIHtAbGlua2NvZGUgUHJvcGVydHlWYWx1ZXN9LlxuICovXG4vLyBUaGlzIHR5cGUgbXVzdCBiZSBleHBvcnRlZCBzdWNoIHRoYXQgSmF2YVNjcmlwdCBnZW5lcmF0ZWQgYnkgdGhlIEdvb2dsZVxuLy8gQ2xvc3VyZSBDb21waWxlciBjYW4gaW1wb3J0IGEgdHlwZSByZWZlcmVuY2UuXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnR5VmFsdWVNYXA8VD4gZXh0ZW5kcyBNYXA8UHJvcGVydHlLZXksIHVua25vd24+IHtcbiAgZ2V0PEsgZXh0ZW5kcyBrZXlvZiBUPihrOiBLKTogVFtLXSB8IHVuZGVmaW5lZDtcbiAgc2V0PEsgZXh0ZW5kcyBrZXlvZiBUPihrZXk6IEssIHZhbHVlOiBUW0tdKTogdGhpcztcbiAgaGFzPEsgZXh0ZW5kcyBrZXlvZiBUPihrOiBLKTogYm9vbGVhbjtcbiAgZGVsZXRlPEsgZXh0ZW5kcyBrZXlvZiBUPihrOiBLKTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb252ZXJ0ZXI6IENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXIgPSB7XG4gIHRvQXR0cmlidXRlKHZhbHVlOiB1bmtub3duLCB0eXBlPzogdW5rbm93bik6IHVua25vd24ge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBCb29sZWFuOlxuICAgICAgICB2YWx1ZSA9IHZhbHVlID8gZW1wdHlTdHJpbmdGb3JCb29sZWFuQXR0cmlidXRlIDogbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9iamVjdDpcbiAgICAgIGNhc2UgQXJyYXk6XG4gICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgcGFzcyB0aGlzIHRocm91Z2hcbiAgICAgICAgLy8gdG8gYWxsb3cgcmVtb3Zpbmcvbm8gY2hhbmdlIGJlaGF2aW9yLlxuICAgICAgICB2YWx1ZSA9IHZhbHVlID09IG51bGwgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxuICBmcm9tQXR0cmlidXRlKHZhbHVlOiBzdHJpbmcgfCBudWxsLCB0eXBlPzogdW5rbm93bikge1xuICAgIGxldCBmcm9tVmFsdWU6IHVua25vd24gPSB2YWx1ZTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgQm9vbGVhbjpcbiAgICAgICAgZnJvbVZhbHVlID0gdmFsdWUgIT09IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBOdW1iZXI6XG4gICAgICAgIGZyb21WYWx1ZSA9IHZhbHVlID09PSBudWxsID8gbnVsbCA6IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPYmplY3Q6XG4gICAgICBjYXNlIEFycmF5OlxuICAgICAgICAvLyBEbyAqbm90KiBnZW5lcmF0ZSBleGNlcHRpb24gd2hlbiBpbnZhbGlkIEpTT04gaXMgc2V0IGFzIGVsZW1lbnRzXG4gICAgICAgIC8vIGRvbid0IG5vcm1hbGx5IGNvbXBsYWluIG9uIGJlaW5nIG1pcy1jb25maWd1cmVkLlxuICAgICAgICAvLyBUT0RPKHNvcnZlbGwpOiBEbyBnZW5lcmF0ZSBleGNlcHRpb24gaW4gKmRldiBtb2RlKi5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBBc3NlcnQgdG8gYWRoZXJlIHRvIEJhemVsJ3MgXCJtdXN0IHR5cGUgYXNzZXJ0IEpTT04gcGFyc2VcIiBydWxlLlxuICAgICAgICAgIGZyb21WYWx1ZSA9IEpTT04ucGFyc2UodmFsdWUhKSBhcyB1bmtub3duO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZnJvbVZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGZyb21WYWx1ZTtcbiAgfSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFzQ2hhbmdlZCB7XG4gICh2YWx1ZTogdW5rbm93biwgb2xkOiB1bmtub3duKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDaGFuZ2UgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBkaWZmZXJlbnQgZnJvbSBgb2xkVmFsdWVgLlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBmb3IgYSBwcm9wZXJ0eSdzIGBoYXNDaGFuZ2VkYCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vdEVxdWFsOiBIYXNDaGFuZ2VkID0gKHZhbHVlOiB1bmtub3duLCBvbGQ6IHVua25vd24pOiBib29sZWFuID0+XG4gICFpcyh2YWx1ZSwgb2xkKTtcblxuY29uc3QgZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb246IFByb3BlcnR5RGVjbGFyYXRpb24gPSB7XG4gIGF0dHJpYnV0ZTogdHJ1ZSxcbiAgdHlwZTogU3RyaW5nLFxuICBjb252ZXJ0ZXI6IGRlZmF1bHRDb252ZXJ0ZXIsXG4gIHJlZmxlY3Q6IGZhbHNlLFxuICBoYXNDaGFuZ2VkOiBub3RFcXVhbCxcbn07XG5cbi8qKlxuICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGRldiBtb2RlIHdhcm5pbmcgY2F0ZWdvcmllcy5cbiAqL1xuZXhwb3J0IHR5cGUgV2FybmluZ0tpbmQgPVxuICB8ICdjaGFuZ2UtaW4tdXBkYXRlJ1xuICB8ICdtaWdyYXRpb24nXG4gIHwgJ2FzeW5jLXBlcmZvcm0tdXBkYXRlJztcblxuZXhwb3J0IHR5cGUgSW5pdGlhbGl6ZXIgPSAoZWxlbWVudDogUmVhY3RpdmVFbGVtZW50KSA9PiB2b2lkO1xuXG4vLyBUZW1wb3JhcnksIHVudGlsIGdvb2dsZTMgaXMgb24gVHlwZVNjcmlwdCA1LjJcbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFN5bWJvbENvbnN0cnVjdG9yIHtcbiAgICByZWFkb25seSBtZXRhZGF0YTogdW5pcXVlIHN5bWJvbDtcbiAgfVxufVxuXG4vLyBFbnN1cmUgbWV0YWRhdGEgaXMgZW5hYmxlZC4gVHlwZVNjcmlwdCBkb2VzIG5vdCBwb2x5ZmlsbFxuLy8gU3ltYm9sLm1ldGFkYXRhLCBzbyB3ZSBtdXN0IGVuc3VyZSB0aGF0IGl0IGV4aXN0cy5cbihTeW1ib2wgYXMge21ldGFkYXRhOiBzeW1ib2x9KS5tZXRhZGF0YSA/Pz0gU3ltYm9sKCdtZXRhZGF0YScpO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIC8vIFRoaXMgaXMgcHVibGljIGdsb2JhbCBBUEksIGRvIG5vdCBjaGFuZ2UhXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby12YXJcbiAgdmFyIGxpdFByb3BlcnR5TWV0YWRhdGE6IFdlYWtNYXA8XG4gICAgb2JqZWN0LFxuICAgIE1hcDxQcm9wZXJ0eUtleSwgUHJvcGVydHlEZWNsYXJhdGlvbj5cbiAgPjtcbn1cblxuLy8gTWFwIGZyb20gYSBjbGFzcydzIG1ldGFkYXRhIG9iamVjdCB0byBwcm9wZXJ0eSBvcHRpb25zXG4vLyBOb3RlIHRoYXQgd2UgbXVzdCB1c2UgbnVsbGlzaC1jb2FsZXNjaW5nIGFzc2lnbm1lbnQgc28gdGhhdCB3ZSBvbmx5IHVzZSBvbmVcbi8vIG1hcCBldmVuIGlmIHdlIGxvYWQgbXVsdGlwbGUgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZS5cbmdsb2JhbC5saXRQcm9wZXJ0eU1ldGFkYXRhID8/PSBuZXcgV2Vha01hcDxcbiAgb2JqZWN0LFxuICBNYXA8UHJvcGVydHlLZXksIFByb3BlcnR5RGVjbGFyYXRpb24+XG4+KCk7XG5cbi8qKlxuICogQmFzZSBlbGVtZW50IGNsYXNzIHdoaWNoIG1hbmFnZXMgZWxlbWVudCBwcm9wZXJ0aWVzIGFuZCBhdHRyaWJ1dGVzLiBXaGVuXG4gKiBwcm9wZXJ0aWVzIGNoYW5nZSwgdGhlIGB1cGRhdGVgIG1ldGhvZCBpcyBhc3luY2hyb25vdXNseSBjYWxsZWQuIFRoaXMgbWV0aG9kXG4gKiBzaG91bGQgYmUgc3VwcGxpZWQgYnkgc3ViY2xhc3NlcyB0byByZW5kZXIgdXBkYXRlcyBhcyBkZXNpcmVkLlxuICogQG5vSW5oZXJpdERvY1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVhY3RpdmVFbGVtZW50XG4gIC8vIEluIHRoZSBOb2RlIGJ1aWxkLCB0aGlzIGBleHRlbmRzYCBjbGF1c2Ugd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoXG4gIC8vIGAoZ2xvYmFsVGhpcy5IVE1MRWxlbWVudCA/PyBIVE1MRWxlbWVudClgLlxuICAvL1xuICAvLyBUaGlzIHdheSwgd2Ugd2lsbCBmaXJzdCBwcmVmZXIgYW55IGdsb2JhbCBgSFRNTEVsZW1lbnRgIHBvbHlmaWxsIHRoYXQgdGhlXG4gIC8vIHVzZXIgaGFzIGFzc2lnbmVkLCBhbmQgdGhlbiBmYWxsIGJhY2sgdG8gdGhlIGBIVE1MRWxlbWVudGAgc2hpbSB3aGljaCBoYXNcbiAgLy8gYmVlbiBpbXBvcnRlZCAoc2VlIG5vdGUgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUgYWJvdXQgaG93IHRoaXMgaW1wb3J0IGlzXG4gIC8vIGdlbmVyYXRlZCBieSBSb2xsdXApLiBOb3RlIHRoYXQgdGhlIGBIVE1MRWxlbWVudGAgdmFyaWFibGUgaGFzIGJlZW5cbiAgLy8gc2hhZG93ZWQgYnkgdGhpcyBpbXBvcnQsIHNvIGl0IG5vIGxvbmdlciByZWZlcnMgdG8gdGhlIGdsb2JhbC5cbiAgZXh0ZW5kcyBIVE1MRWxlbWVudFxuICBpbXBsZW1lbnRzIFJlYWN0aXZlQ29udHJvbGxlckhvc3RcbntcbiAgLy8gTm90ZTogdGhlc2UgYXJlIHBhdGNoZWQgaW4gb25seSBpbiBERVZfTU9ERS5cbiAgLyoqXG4gICAqIFJlYWQgb3Igc2V0IGFsbCB0aGUgZW5hYmxlZCB3YXJuaW5nIGNhdGVnb3JpZXMgZm9yIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgb25seSB1c2VkIGluIGRldmVsb3BtZW50IGJ1aWxkcy5cbiAgICpcbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IGRldi1tb2RlXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlZFdhcm5pbmdzPzogV2FybmluZ0tpbmRbXTtcblxuICAvKipcbiAgICogRW5hYmxlIHRoZSBnaXZlbiB3YXJuaW5nIGNhdGVnb3J5IGZvciB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBvbmx5IGV4aXN0cyBpbiBkZXZlbG9wbWVudCBidWlsZHMsIHNvIGl0IHNob3VsZCBiZSBhY2Nlc3NlZFxuICAgKiB3aXRoIGEgZ3VhcmQgbGlrZTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gRW5hYmxlIGZvciBhbGwgUmVhY3RpdmVFbGVtZW50IHN1YmNsYXNzZXNcbiAgICogUmVhY3RpdmVFbGVtZW50LmVuYWJsZVdhcm5pbmc/LignbWlncmF0aW9uJyk7XG4gICAqXG4gICAqIC8vIEVuYWJsZSBmb3Igb25seSBNeUVsZW1lbnQgYW5kIHN1YmNsYXNzZXNcbiAgICogTXlFbGVtZW50LmVuYWJsZVdhcm5pbmc/LignbWlncmF0aW9uJyk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgZGV2LW1vZGVcbiAgICovXG4gIHN0YXRpYyBlbmFibGVXYXJuaW5nPzogKHdhcm5pbmdLaW5kOiBXYXJuaW5nS2luZCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogRGlzYWJsZSB0aGUgZ2l2ZW4gd2FybmluZyBjYXRlZ29yeSBmb3IgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogVGhpcyBtZXRob2Qgb25seSBleGlzdHMgaW4gZGV2ZWxvcG1lbnQgYnVpbGRzLCBzbyBpdCBzaG91bGQgYmUgYWNjZXNzZWRcbiAgICogd2l0aCBhIGd1YXJkIGxpa2U6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIERpc2FibGUgZm9yIGFsbCBSZWFjdGl2ZUVsZW1lbnQgc3ViY2xhc3Nlc1xuICAgKiBSZWFjdGl2ZUVsZW1lbnQuZGlzYWJsZVdhcm5pbmc/LignbWlncmF0aW9uJyk7XG4gICAqXG4gICAqIC8vIERpc2FibGUgZm9yIG9ubHkgTXlFbGVtZW50IGFuZCBzdWJjbGFzc2VzXG4gICAqIE15RWxlbWVudC5kaXNhYmxlV2FybmluZz8uKCdtaWdyYXRpb24nKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSBkZXYtbW9kZVxuICAgKi9cbiAgc3RhdGljIGRpc2FibGVXYXJuaW5nPzogKHdhcm5pbmdLaW5kOiBXYXJuaW5nS2luZCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhbiBpbml0aWFsaXplciBmdW5jdGlvbiB0byB0aGUgY2xhc3MgdGhhdCBpcyBjYWxsZWQgZHVyaW5nIGluc3RhbmNlXG4gICAqIGNvbnN0cnVjdGlvbi5cbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgZm9yIGNvZGUgdGhhdCBydW5zIGFnYWluc3QgYSBgUmVhY3RpdmVFbGVtZW50YFxuICAgKiBzdWJjbGFzcywgc3VjaCBhcyBhIGRlY29yYXRvciwgdGhhdCBuZWVkcyB0byBkbyB3b3JrIGZvciBlYWNoXG4gICAqIGluc3RhbmNlLCBzdWNoIGFzIHNldHRpbmcgdXAgYSBgUmVhY3RpdmVDb250cm9sbGVyYC5cbiAgICpcbiAgICogYGBgdHNcbiAgICogY29uc3QgbXlEZWNvcmF0b3IgPSAodGFyZ2V0OiB0eXBlb2YgUmVhY3RpdmVFbGVtZW50LCBrZXk6IHN0cmluZykgPT4ge1xuICAgKiAgIHRhcmdldC5hZGRJbml0aWFsaXplcigoaW5zdGFuY2U6IFJlYWN0aXZlRWxlbWVudCkgPT4ge1xuICAgKiAgICAgLy8gVGhpcyBpcyBydW4gZHVyaW5nIGNvbnN0cnVjdGlvbiBvZiB0aGUgZWxlbWVudFxuICAgKiAgICAgbmV3IE15Q29udHJvbGxlcihpbnN0YW5jZSk7XG4gICAqICAgfSk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIERlY29yYXRpbmcgYSBmaWVsZCB3aWxsIHRoZW4gY2F1c2UgZWFjaCBpbnN0YW5jZSB0byBydW4gYW4gaW5pdGlhbGl6ZXJcbiAgICogdGhhdCBhZGRzIGEgY29udHJvbGxlcjpcbiAgICpcbiAgICogYGBgdHNcbiAgICogY2xhc3MgTXlFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gICAqICAgQG15RGVjb3JhdG9yIGZvbztcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogSW5pdGlhbGl6ZXJzIGFyZSBzdG9yZWQgcGVyLWNvbnN0cnVjdG9yLiBBZGRpbmcgYW4gaW5pdGlhbGl6ZXIgdG8gYVxuICAgKiBzdWJjbGFzcyBkb2VzIG5vdCBhZGQgaXQgdG8gYSBzdXBlcmNsYXNzLiBTaW5jZSBpbml0aWFsaXplcnMgYXJlIHJ1biBpblxuICAgKiBjb25zdHJ1Y3RvcnMsIGluaXRpYWxpemVycyB3aWxsIHJ1biBpbiBvcmRlciBvZiB0aGUgY2xhc3MgaGllcmFyY2h5LFxuICAgKiBzdGFydGluZyB3aXRoIHN1cGVyY2xhc3NlcyBhbmQgcHJvZ3Jlc3NpbmcgdG8gdGhlIGluc3RhbmNlJ3MgY2xhc3MuXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqL1xuICBzdGF0aWMgYWRkSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyKSB7XG4gICAgdGhpcy5fX3ByZXBhcmUoKTtcbiAgICAodGhpcy5faW5pdGlhbGl6ZXJzID8/PSBbXSkucHVzaChpbml0aWFsaXplcik7XG4gIH1cblxuICBzdGF0aWMgX2luaXRpYWxpemVycz86IEluaXRpYWxpemVyW107XG5cbiAgLypcbiAgICogRHVlIHRvIGNsb3N1cmUgY29tcGlsZXIgRVM2IGNvbXBpbGF0aW9uIGJ1Z3MsIEBub2NvbGxhcHNlIGlzIHJlcXVpcmVkIG9uXG4gICAqIGFsbCBzdGF0aWMgbWV0aG9kcyBhbmQgcHJvcGVydGllcyB3aXRoIGluaXRpYWxpemVycy4gIFJlZmVyZW5jZTpcbiAgICogLSBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvaXNzdWVzLzE3NzZcbiAgICovXG5cbiAgLyoqXG4gICAqIE1hcHMgYXR0cmlidXRlIG5hbWVzIHRvIHByb3BlcnRpZXM7IGZvciBleGFtcGxlIGBmb29iYXJgIGF0dHJpYnV0ZSB0b1xuICAgKiBgZm9vQmFyYCBwcm9wZXJ0eS4gQ3JlYXRlZCBsYXppbHkgb24gdXNlciBzdWJjbGFzc2VzIHdoZW4gZmluYWxpemluZyB0aGVcbiAgICogY2xhc3MuXG4gICAqIEBub2NvbGxhcHNlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXA6IEF0dHJpYnV0ZU1hcDtcblxuICAvKipcbiAgICogTWFya3MgY2xhc3MgYXMgaGF2aW5nIGJlZW4gZmluYWxpemVkLCB3aGljaCBpbmNsdWRlcyBjcmVhdGluZyBwcm9wZXJ0aWVzXG4gICAqIGZyb20gYHN0YXRpYyBwcm9wZXJ0aWVzYCwgYnV0IGRvZXMgKm5vdCogaW5jbHVkZSBhbGwgcHJvcGVydGllcyBjcmVhdGVkXG4gICAqIGZyb20gZGVjb3JhdG9ycy5cbiAgICogQG5vY29sbGFwc2VcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgZmluYWxpemVkOiB0cnVlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBNZW1vaXplZCBsaXN0IG9mIGFsbCBlbGVtZW50IHByb3BlcnRpZXMsIGluY2x1ZGluZyBhbnkgc3VwZXJjbGFzc1xuICAgKiBwcm9wZXJ0aWVzLiBDcmVhdGVkIGxhemlseSBvbiB1c2VyIHN1YmNsYXNzZXMgd2hlbiBmaW5hbGl6aW5nIHRoZSBjbGFzcy5cbiAgICpcbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IHByb3BlcnRpZXNcbiAgICovXG4gIHN0YXRpYyBlbGVtZW50UHJvcGVydGllczogUHJvcGVydHlEZWNsYXJhdGlvbk1hcDtcblxuICAvKipcbiAgICogVXNlci1zdXBwbGllZCBvYmplY3QgdGhhdCBtYXBzIHByb3BlcnR5IG5hbWVzIHRvIGBQcm9wZXJ0eURlY2xhcmF0aW9uYFxuICAgKiBvYmplY3RzIGNvbnRhaW5pbmcgb3B0aW9ucyBmb3IgY29uZmlndXJpbmcgcmVhY3RpdmUgcHJvcGVydGllcy4gV2hlblxuICAgKiBhIHJlYWN0aXZlIHByb3BlcnR5IGlzIHNldCB0aGUgZWxlbWVudCB3aWxsIHVwZGF0ZSBhbmQgcmVuZGVyLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0IHByb3BlcnRpZXMgYXJlIHB1YmxpYyBmaWVsZHMsIGFuZCBhcyBzdWNoLCB0aGV5IHNob3VsZCBiZVxuICAgKiBjb25zaWRlcmVkIGFzIHByaW1hcmlseSBzZXR0YWJsZSBieSBlbGVtZW50IHVzZXJzLCBlaXRoZXIgdmlhIGF0dHJpYnV0ZSBvclxuICAgKiB0aGUgcHJvcGVydHkgaXRzZWxmLlxuICAgKlxuICAgKiBHZW5lcmFsbHksIHByb3BlcnRpZXMgdGhhdCBhcmUgY2hhbmdlZCBieSB0aGUgZWxlbWVudCBzaG91bGQgYmUgcHJpdmF0ZSBvclxuICAgKiBwcm90ZWN0ZWQgZmllbGRzIGFuZCBzaG91bGQgdXNlIHRoZSBgc3RhdGU6IHRydWVgIG9wdGlvbi4gUHJvcGVydGllc1xuICAgKiBtYXJrZWQgYXMgYHN0YXRlYCBkbyBub3QgcmVmbGVjdCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZVxuICAgKlxuICAgKiBIb3dldmVyLCBzb21ldGltZXMgZWxlbWVudCBjb2RlIGRvZXMgbmVlZCB0byBzZXQgYSBwdWJsaWMgcHJvcGVydHkuIFRoaXNcbiAgICogc2hvdWxkIHR5cGljYWxseSBvbmx5IGJlIGRvbmUgaW4gcmVzcG9uc2UgdG8gdXNlciBpbnRlcmFjdGlvbiwgYW5kIGFuIGV2ZW50XG4gICAqIHNob3VsZCBiZSBmaXJlZCBpbmZvcm1pbmcgdGhlIHVzZXI7IGZvciBleGFtcGxlLCBhIGNoZWNrYm94IHNldHMgaXRzXG4gICAqIGBjaGVja2VkYCBwcm9wZXJ0eSB3aGVuIGNsaWNrZWQgYW5kIGZpcmVzIGEgYGNoYW5nZWRgIGV2ZW50LiBNdXRhdGluZ1xuICAgKiBwdWJsaWMgcHJvcGVydGllcyBzaG91bGQgdHlwaWNhbGx5IG5vdCBiZSBkb25lIGZvciBub24tcHJpbWl0aXZlIChvYmplY3Qgb3JcbiAgICogYXJyYXkpIHByb3BlcnRpZXMuIEluIG90aGVyIGNhc2VzIHdoZW4gYW4gZWxlbWVudCBuZWVkcyB0byBtYW5hZ2Ugc3RhdGUsIGFcbiAgICogcHJpdmF0ZSBwcm9wZXJ0eSBzZXQgd2l0aCB0aGUgYHN0YXRlOiB0cnVlYCBvcHRpb24gc2hvdWxkIGJlIHVzZWQuIFdoZW5cbiAgICogbmVlZGVkLCBzdGF0ZSBwcm9wZXJ0aWVzIGNhbiBiZSBpbml0aWFsaXplZCB2aWEgcHVibGljIHByb3BlcnRpZXMgdG9cbiAgICogZmFjaWxpdGF0ZSBjb21wbGV4IGludGVyYWN0aW9ucy5cbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IHByb3BlcnRpZXNcbiAgICovXG4gIHN0YXRpYyBwcm9wZXJ0aWVzOiBQcm9wZXJ0eURlY2xhcmF0aW9ucztcblxuICAvKipcbiAgICogTWVtb2l6ZWQgbGlzdCBvZiBhbGwgZWxlbWVudCBzdHlsZXMuXG4gICAqIENyZWF0ZWQgbGF6aWx5IG9uIHVzZXIgc3ViY2xhc3NlcyB3aGVuIGZpbmFsaXppbmcgdGhlIGNsYXNzLlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgc3R5bGVzXG4gICAqL1xuICBzdGF0aWMgZWxlbWVudFN0eWxlczogQXJyYXk8Q1NTUmVzdWx0T3JOYXRpdmU+ID0gW107XG5cbiAgLyoqXG4gICAqIEFycmF5IG9mIHN0eWxlcyB0byBhcHBseSB0byB0aGUgZWxlbWVudC4gVGhlIHN0eWxlcyBzaG91bGQgYmUgZGVmaW5lZFxuICAgKiB1c2luZyB0aGUge0BsaW5rY29kZSBjc3N9IHRhZyBmdW5jdGlvbiwgdmlhIGNvbnN0cnVjdGlibGUgc3R5bGVzaGVldHMsIG9yXG4gICAqIGltcG9ydGVkIGZyb20gbmF0aXZlIENTUyBtb2R1bGUgc2NyaXB0cy5cbiAgICpcbiAgICogTm90ZSBvbiBDb250ZW50IFNlY3VyaXR5IFBvbGljeTpcbiAgICpcbiAgICogRWxlbWVudCBzdHlsZXMgYXJlIGltcGxlbWVudGVkIHdpdGggYDxzdHlsZT5gIHRhZ3Mgd2hlbiB0aGUgYnJvd3NlciBkb2Vzbid0XG4gICAqIHN1cHBvcnQgYWRvcHRlZCBTdHlsZVNoZWV0cy4gVG8gdXNlIHN1Y2ggYDxzdHlsZT5gIHRhZ3Mgd2l0aCB0aGUgc3R5bGUtc3JjXG4gICAqIENTUCBkaXJlY3RpdmUsIHRoZSBzdHlsZS1zcmMgdmFsdWUgbXVzdCBlaXRoZXIgaW5jbHVkZSAndW5zYWZlLWlubGluZScgb3JcbiAgICogYG5vbmNlLTxiYXNlNjQtdmFsdWU+YCB3aXRoIGA8YmFzZTY0LXZhbHVlPmAgcmVwbGFjZWQgYmUgYSBzZXJ2ZXItZ2VuZXJhdGVkXG4gICAqIG5vbmNlLlxuICAgKlxuICAgKiBUbyBwcm92aWRlIGEgbm9uY2UgdG8gdXNlIG9uIGdlbmVyYXRlZCBgPHN0eWxlPmAgZWxlbWVudHMsIHNldFxuICAgKiBgd2luZG93LmxpdE5vbmNlYCB0byBhIHNlcnZlci1nZW5lcmF0ZWQgbm9uY2UgaW4geW91ciBwYWdlJ3MgSFRNTCwgYmVmb3JlXG4gICAqIGxvYWRpbmcgYXBwbGljYXRpb24gY29kZTpcbiAgICpcbiAgICogYGBgaHRtbFxuICAgKiA8c2NyaXB0PlxuICAgKiAgIC8vIEdlbmVyYXRlZCBhbmQgdW5pcXVlIHBlciByZXF1ZXN0OlxuICAgKiAgIHdpbmRvdy5saXROb25jZSA9ICdhMWIyYzNkNCc7XG4gICAqIDwvc2NyaXB0PlxuICAgKiBgYGBcbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IHN0eWxlc1xuICAgKi9cbiAgc3RhdGljIHN0eWxlcz86IENTU1Jlc3VsdEdyb3VwO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhdHRyaWJ1dGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZ2lzdGVyZWQgcHJvcGVydGllcy5cbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IGF0dHJpYnV0ZXNcbiAgICovXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIC8vIEVuc3VyZSB3ZSd2ZSBjcmVhdGVkIGFsbCBwcm9wZXJ0aWVzXG4gICAgdGhpcy5maW5hbGl6ZSgpO1xuICAgIC8vIHRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwIGlzIG9ubHkgdW5kZWZpbmVkIGFmdGVyIGZpbmFsaXplKCkgaW5cbiAgICAvLyBSZWFjdGl2ZUVsZW1lbnQgaXRzZWxmLiBSZWFjdGl2ZUVsZW1lbnQub2JzZXJ2ZWRBdHRyaWJ1dGVzIGlzIG9ubHlcbiAgICAvLyBhY2Nlc3NlZCB3aXRoIFJlYWN0aXZlRWxlbWVudCBhcyB0aGUgcmVjZWl2ZXIgd2hlbiBhIHN1YmNsYXNzIG9yIG1peGluXG4gICAgLy8gY2FsbHMgc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwICYmIFsuLi50aGlzLl9fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcC5rZXlzKCldXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX19pbnN0YW5jZVByb3BlcnRpZXM/OiBQcm9wZXJ0eVZhbHVlcyA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHByb3BlcnR5IGFjY2Vzc29yIG9uIHRoZSBlbGVtZW50IHByb3RvdHlwZSBpZiBvbmUgZG9lcyBub3QgZXhpc3RcbiAgICogYW5kIHN0b3JlcyBhIHtAbGlua2NvZGUgUHJvcGVydHlEZWNsYXJhdGlvbn0gZm9yIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZVxuICAgKiBnaXZlbiBvcHRpb25zLiBUaGUgcHJvcGVydHkgc2V0dGVyIGNhbGxzIHRoZSBwcm9wZXJ0eSdzIGBoYXNDaGFuZ2VkYFxuICAgKiBwcm9wZXJ0eSBvcHRpb24gb3IgdXNlcyBhIHN0cmljdCBpZGVudGl0eSBjaGVjayB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3RcbiAgICogdG8gcmVxdWVzdCBhbiB1cGRhdGUuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIG1heSBiZSBvdmVycmlkZGVuIHRvIGN1c3RvbWl6ZSBwcm9wZXJ0aWVzOyBob3dldmVyLFxuICAgKiB3aGVuIGRvaW5nIHNvLCBpdCdzIGltcG9ydGFudCB0byBjYWxsIGBzdXBlci5jcmVhdGVQcm9wZXJ0eWAgdG8gZW5zdXJlXG4gICAqIHRoZSBwcm9wZXJ0eSBpcyBzZXR1cCBjb3JyZWN0bHkuIFRoaXMgbWV0aG9kIGNhbGxzXG4gICAqIGBnZXRQcm9wZXJ0eURlc2NyaXB0b3JgIGludGVybmFsbHkgdG8gZ2V0IGEgZGVzY3JpcHRvciB0byBpbnN0YWxsLlxuICAgKiBUbyBjdXN0b21pemUgd2hhdCBwcm9wZXJ0aWVzIGRvIHdoZW4gdGhleSBhcmUgZ2V0IG9yIHNldCwgb3ZlcnJpZGVcbiAgICogYGdldFByb3BlcnR5RGVzY3JpcHRvcmAuIFRvIGN1c3RvbWl6ZSB0aGUgb3B0aW9ucyBmb3IgYSBwcm9wZXJ0eSxcbiAgICogaW1wbGVtZW50IGBjcmVhdGVQcm9wZXJ0eWAgbGlrZSB0aGlzOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBzdGF0aWMgY3JlYXRlUHJvcGVydHkobmFtZSwgb3B0aW9ucykge1xuICAgKiAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKG9wdGlvbnMsIHtteU9wdGlvbjogdHJ1ZX0pO1xuICAgKiAgIHN1cGVyLmNyZWF0ZVByb3BlcnR5KG5hbWUsIG9wdGlvbnMpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgcHJvcGVydGllc1xuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVByb3BlcnR5KFxuICAgIG5hbWU6IFByb3BlcnR5S2V5LFxuICAgIG9wdGlvbnM6IFByb3BlcnR5RGVjbGFyYXRpb24gPSBkZWZhdWx0UHJvcGVydHlEZWNsYXJhdGlvblxuICApIHtcbiAgICAvLyBJZiB0aGlzIGlzIGEgc3RhdGUgcHJvcGVydHksIGZvcmNlIHRoZSBhdHRyaWJ1dGUgdG8gZmFsc2UuXG4gICAgaWYgKG9wdGlvbnMuc3RhdGUpIHtcbiAgICAgIChvcHRpb25zIGFzIE11dGFibGU8UHJvcGVydHlEZWNsYXJhdGlvbiwgJ2F0dHJpYnV0ZSc+KS5hdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5fX3ByZXBhcmUoKTtcbiAgICB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzLnNldChuYW1lLCBvcHRpb25zKTtcbiAgICBpZiAoIW9wdGlvbnMubm9BY2Nlc3Nvcikge1xuICAgICAgY29uc3Qga2V5ID0gREVWX01PREVcbiAgICAgICAgPyAvLyBVc2UgU3ltYm9sLmZvciBpbiBkZXYgbW9kZSB0byBtYWtlIGl0IGVhc2llciB0byBtYWludGFpbiBzdGF0ZVxuICAgICAgICAgIC8vIHdoZW4gZG9pbmcgSE1SLlxuICAgICAgICAgIFN5bWJvbC5mb3IoYCR7U3RyaW5nKG5hbWUpfSAoQHByb3BlcnR5KCkgY2FjaGUpYClcbiAgICAgICAgOiBTeW1ib2woKTtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLmdldFByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBrZXksIG9wdGlvbnMpO1xuICAgICAgaWYgKGRlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZGVzY3JpcHRvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIGJlIGRlZmluZWQgb24gdGhlIGdpdmVuIG5hbWVkIHByb3BlcnR5LlxuICAgKiBJZiBubyBkZXNjcmlwdG9yIGlzIHJldHVybmVkLCB0aGUgcHJvcGVydHkgd2lsbCBub3QgYmVjb21lIGFuIGFjY2Vzc29yLlxuICAgKiBGb3IgZXhhbXBsZSxcbiAgICpcbiAgICogYGBgdHNcbiAgICogY2xhc3MgTXlFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gICAqICAgc3RhdGljIGdldFByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBrZXksIG9wdGlvbnMpIHtcbiAgICogICAgIGNvbnN0IGRlZmF1bHREZXNjcmlwdG9yID1cbiAgICogICAgICAgICBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwga2V5LCBvcHRpb25zKTtcbiAgICogICAgIGNvbnN0IHNldHRlciA9IGRlZmF1bHREZXNjcmlwdG9yLnNldDtcbiAgICogICAgIHJldHVybiB7XG4gICAqICAgICAgIGdldDogZGVmYXVsdERlc2NyaXB0b3IuZ2V0LFxuICAgKiAgICAgICBzZXQodmFsdWUpIHtcbiAgICogICAgICAgICBzZXR0ZXIuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAqICAgICAgICAgLy8gY3VzdG9tIGFjdGlvbi5cbiAgICogICAgICAgfSxcbiAgICogICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgKiAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgcHJvcGVydGllc1xuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgbmFtZTogUHJvcGVydHlLZXksXG4gICAga2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgb3B0aW9uczogUHJvcGVydHlEZWNsYXJhdGlvblxuICApOiBQcm9wZXJ0eURlc2NyaXB0b3IgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHtnZXQsIHNldH0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcy5wcm90b3R5cGUsIG5hbWUpID8/IHtcbiAgICAgIGdldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNba2V5IGFzIGtleW9mIHR5cGVvZiB0aGlzXTtcbiAgICAgIH0sXG4gICAgICBzZXQodGhpczogUmVhY3RpdmVFbGVtZW50LCB2OiB1bmtub3duKSB7XG4gICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4pW2tleV0gPSB2O1xuICAgICAgfSxcbiAgICB9O1xuICAgIGlmIChERVZfTU9ERSAmJiBnZXQgPT0gbnVsbCkge1xuICAgICAgaWYgKCd2YWx1ZScgaW4gKGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLnByb3RvdHlwZSwgbmFtZSkgPz8ge30pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmllbGQgJHtKU09OLnN0cmluZ2lmeShTdHJpbmcobmFtZSkpfSBvbiBgICtcbiAgICAgICAgICAgIGAke3RoaXMubmFtZX0gd2FzIGRlY2xhcmVkIGFzIGEgcmVhY3RpdmUgcHJvcGVydHkgYCArXG4gICAgICAgICAgICBgYnV0IGl0J3MgYWN0dWFsbHkgZGVjbGFyZWQgYXMgYSB2YWx1ZSBvbiB0aGUgcHJvdG90eXBlLiBgICtcbiAgICAgICAgICAgIGBVc3VhbGx5IHRoaXMgaXMgZHVlIHRvIHVzaW5nIEBwcm9wZXJ0eSBvciBAc3RhdGUgb24gYSBtZXRob2QuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaXNzdWVXYXJuaW5nKFxuICAgICAgICAncmVhY3RpdmUtcHJvcGVydHktd2l0aG91dC1nZXR0ZXInLFxuICAgICAgICBgRmllbGQgJHtKU09OLnN0cmluZ2lmeShTdHJpbmcobmFtZSkpfSBvbiBgICtcbiAgICAgICAgICBgJHt0aGlzLm5hbWV9IHdhcyBkZWNsYXJlZCBhcyBhIHJlYWN0aXZlIHByb3BlcnR5IGAgK1xuICAgICAgICAgIGBidXQgaXQgZG9lcyBub3QgaGF2ZSBhIGdldHRlci4gVGhpcyB3aWxsIGJlIGFuIGVycm9yIGluIGEgYCArXG4gICAgICAgICAgYGZ1dHVyZSB2ZXJzaW9uIG9mIExpdC5gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZ2V0KHRoaXM6IFJlYWN0aXZlRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZ2V0Py5jYWxsKHRoaXMpO1xuICAgICAgfSxcbiAgICAgIHNldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gZ2V0Py5jYWxsKHRoaXMpO1xuICAgICAgICBzZXQhLmNhbGwodGhpcywgdmFsdWUpO1xuICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgfSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBvcHRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAqIFRoZXNlIG9wdGlvbnMgYXJlIGRlZmluZWQgd2l0aCBhIGBQcm9wZXJ0eURlY2xhcmF0aW9uYCB2aWEgdGhlIGBwcm9wZXJ0aWVzYFxuICAgKiBvYmplY3Qgb3IgdGhlIGBAcHJvcGVydHlgIGRlY29yYXRvciBhbmQgYXJlIHJlZ2lzdGVyZWQgaW5cbiAgICogYGNyZWF0ZVByb3BlcnR5KC4uLilgLlxuICAgKlxuICAgKiBOb3RlLCB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY29uc2lkZXJlZCBcImZpbmFsXCIgYW5kIG5vdCBvdmVycmlkZGVuLiBUb1xuICAgKiBjdXN0b21pemUgdGhlIG9wdGlvbnMgZm9yIGEgZ2l2ZW4gcHJvcGVydHksIG92ZXJyaWRlXG4gICAqIHtAbGlua2NvZGUgY3JlYXRlUHJvcGVydHl9LlxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAZmluYWxcbiAgICogQGNhdGVnb3J5IHByb3BlcnRpZXNcbiAgICovXG4gIHN0YXRpYyBnZXRQcm9wZXJ0eU9wdGlvbnMobmFtZTogUHJvcGVydHlLZXkpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UHJvcGVydGllcy5nZXQobmFtZSkgPz8gZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb247XG4gIH1cblxuICAvLyBUZW1wb3JhcnksIHVudGlsIGdvb2dsZTMgaXMgb24gVHlwZVNjcmlwdCA1LjJcbiAgZGVjbGFyZSBzdGF0aWMgW1N5bWJvbC5tZXRhZGF0YV06IG9iamVjdCAmIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHN0YXRpYyBvd24gcHJvcGVydGllcyBvZiB0aGUgY2xhc3MgdXNlZCBpbiBib29ra2VlcGluZ1xuICAgKiBmb3IgZWxlbWVudCBwcm9wZXJ0aWVzLCBpbml0aWFsaXplcnMsIGV0Yy5cbiAgICpcbiAgICogQ2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBieSBjb2RlIHRoYXQgbmVlZHMgdG8gZW5zdXJlIHRoZXNlXG4gICAqIHByb3BlcnRpZXMgZXhpc3QgYmVmb3JlIHVzaW5nIHRoZW0uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhlIHN1cGVyY2xhc3MgaXMgZmluYWxpemVkIHNvIHRoYXQgaW5oZXJpdGVkXG4gICAqIHByb3BlcnR5IG1ldGFkYXRhIGNhbiBiZSBjb3BpZWQgZG93bi5cbiAgICogQG5vY29sbGFwc2VcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9fcHJlcGFyZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2VsZW1lbnRQcm9wZXJ0aWVzJywgdGhpcykpXG4gICAgKSB7XG4gICAgICAvLyBBbHJlYWR5IHByZXBhcmVkXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZpbmFsaXplIGFueSBzdXBlcmNsYXNzZXNcbiAgICBjb25zdCBzdXBlckN0b3IgPSBnZXRQcm90b3R5cGVPZih0aGlzKSBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50O1xuICAgIHN1cGVyQ3Rvci5maW5hbGl6ZSgpO1xuXG4gICAgLy8gQ3JlYXRlIG93biBzZXQgb2YgaW5pdGlhbGl6ZXJzIGZvciB0aGlzIGNsYXNzIGlmIGFueSBleGlzdCBvbiB0aGVcbiAgICAvLyBzdXBlcmNsYXNzIGFuZCBjb3B5IHRoZW0gZG93bi4gTm90ZSwgZm9yIGEgc21hbGwgcGVyZiBib29zdCwgYXZvaWRcbiAgICAvLyBjcmVhdGluZyBpbml0aWFsaXplcnMgdW5sZXNzIG5lZWRlZC5cbiAgICBpZiAoc3VwZXJDdG9yLl9pbml0aWFsaXplcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZXJzID0gWy4uLnN1cGVyQ3Rvci5faW5pdGlhbGl6ZXJzXTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbGl6ZSBlbGVtZW50UHJvcGVydGllcyBmcm9tIHRoZSBzdXBlcmNsYXNzXG4gICAgdGhpcy5lbGVtZW50UHJvcGVydGllcyA9IG5ldyBNYXAoc3VwZXJDdG9yLmVsZW1lbnRQcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5pc2hlcyBzZXR0aW5nIHVwIHRoZSBjbGFzcyBzbyB0aGF0IGl0J3MgcmVhZHkgdG8gYmUgcmVnaXN0ZXJlZFxuICAgKiBhcyBhIGN1c3RvbSBlbGVtZW50IGFuZCBpbnN0YW50aWF0ZWQuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgUmVhY3RpdmVFbGVtZW50Lm9ic2VydmVkQXR0cmlidXRlcyBnZXR0ZXIuXG4gICAqIElmIHlvdSBvdmVycmlkZSB0aGUgb2JzZXJ2ZWRBdHRyaWJ1dGVzIGdldHRlciwgeW91IG11c3QgZWl0aGVyIGNhbGxcbiAgICogc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzIHRvIHRyaWdnZXIgZmluYWxpemF0aW9uLCBvciBjYWxsIGZpbmFsaXplKClcbiAgICogeW91cnNlbGYuXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsaXplKCkge1xuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2ZpbmFsaXplZCcsIHRoaXMpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZpbmFsaXplZCA9IHRydWU7XG4gICAgdGhpcy5fX3ByZXBhcmUoKTtcblxuICAgIC8vIENyZWF0ZSBwcm9wZXJ0aWVzIGZyb20gdGhlIHN0YXRpYyBwcm9wZXJ0aWVzIGJsb2NrOlxuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ3Byb3BlcnRpZXMnLCB0aGlzKSkpIHtcbiAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgY29uc3QgcHJvcEtleXMgPSBbXG4gICAgICAgIC4uLmdldE93blByb3BlcnR5TmFtZXMocHJvcHMpLFxuICAgICAgICAuLi5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocHJvcHMpLFxuICAgICAgXSBhcyBBcnJheTxrZXlvZiB0eXBlb2YgcHJvcHM+O1xuICAgICAgZm9yIChjb25zdCBwIG9mIHByb3BLZXlzKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlUHJvcGVydHkocCwgcHJvcHNbcF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBwcm9wZXJ0aWVzIGZyb20gc3RhbmRhcmQgZGVjb3JhdG9yIG1ldGFkYXRhOlxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpc1tTeW1ib2wubWV0YWRhdGFdO1xuICAgIGlmIChtZXRhZGF0YSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IGxpdFByb3BlcnR5TWV0YWRhdGEuZ2V0KG1ldGFkYXRhKTtcbiAgICAgIGlmIChwcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBbcCwgb3B0aW9uc10gb2YgcHJvcGVydGllcykge1xuICAgICAgICAgIHRoaXMuZWxlbWVudFByb3BlcnRpZXMuc2V0KHAsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBhdHRyaWJ1dGUtdG8tcHJvcGVydHkgbWFwXG4gICAgdGhpcy5fX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChjb25zdCBbcCwgb3B0aW9uc10gb2YgdGhpcy5lbGVtZW50UHJvcGVydGllcykge1xuICAgICAgY29uc3QgYXR0ciA9IHRoaXMuX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocCwgb3B0aW9ucyk7XG4gICAgICBpZiAoYXR0ciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwLnNldChhdHRyLCBwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnRTdHlsZXMgPSB0aGlzLmZpbmFsaXplU3R5bGVzKHRoaXMuc3R5bGVzKTtcblxuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoJ2NyZWF0ZVByb3BlcnR5JykpIHtcbiAgICAgICAgaXNzdWVXYXJuaW5nKFxuICAgICAgICAgICduby1vdmVycmlkZS1jcmVhdGUtcHJvcGVydHknLFxuICAgICAgICAgICdPdmVycmlkaW5nIFJlYWN0aXZlRWxlbWVudC5jcmVhdGVQcm9wZXJ0eSgpIGlzIGRlcHJlY2F0ZWQuICcgK1xuICAgICAgICAgICAgJ1RoZSBvdmVycmlkZSB3aWxsIG5vdCBiZSBjYWxsZWQgd2l0aCBzdGFuZGFyZCBkZWNvcmF0b3JzJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoJ2dldFByb3BlcnR5RGVzY3JpcHRvcicpKSB7XG4gICAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgICAnbm8tb3ZlcnJpZGUtZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3InLFxuICAgICAgICAgICdPdmVycmlkaW5nIFJlYWN0aXZlRWxlbWVudC5nZXRQcm9wZXJ0eURlc2NyaXB0b3IoKSBpcyBkZXByZWNhdGVkLiAnICtcbiAgICAgICAgICAgICdUaGUgb3ZlcnJpZGUgd2lsbCBub3QgYmUgY2FsbGVkIHdpdGggc3RhbmRhcmQgZGVjb3JhdG9ycydcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3B0aW9ucyB1c2VkIHdoZW4gY2FsbGluZyBgYXR0YWNoU2hhZG93YC4gU2V0IHRoaXMgcHJvcGVydHkgdG8gY3VzdG9taXplXG4gICAqIHRoZSBvcHRpb25zIGZvciB0aGUgc2hhZG93Um9vdDsgZm9yIGV4YW1wbGUsIHRvIGNyZWF0ZSBhIGNsb3NlZFxuICAgKiBzaGFkb3dSb290OiBge21vZGU6ICdjbG9zZWQnfWAuXG4gICAqXG4gICAqIE5vdGUsIHRoZXNlIG9wdGlvbnMgYXJlIHVzZWQgaW4gYGNyZWF0ZVJlbmRlclJvb3RgLiBJZiB0aGlzIG1ldGhvZFxuICAgKiBpcyBjdXN0b21pemVkLCBvcHRpb25zIHNob3VsZCBiZSByZXNwZWN0ZWQgaWYgcG9zc2libGUuXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHN0YXRpYyBzaGFkb3dSb290T3B0aW9uczogU2hhZG93Um9vdEluaXQgPSB7bW9kZTogJ29wZW4nfTtcblxuICAvKipcbiAgICogVGFrZXMgdGhlIHN0eWxlcyB0aGUgdXNlciBzdXBwbGllZCB2aWEgdGhlIGBzdGF0aWMgc3R5bGVzYCBwcm9wZXJ0eSBhbmRcbiAgICogcmV0dXJucyB0aGUgYXJyYXkgb2Ygc3R5bGVzIHRvIGFwcGx5IHRvIHRoZSBlbGVtZW50LlxuICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbnRlZ3JhdGUgaW50byBhIHN0eWxlIG1hbmFnZW1lbnQgc3lzdGVtLlxuICAgKlxuICAgKiBTdHlsZXMgYXJlIGRlZHVwbGljYXRlZCBwcmVzZXJ2aW5nIHRoZSBfbGFzdF8gaW5zdGFuY2UgaW4gdGhlIGxpc3QuIFRoaXNcbiAgICogaXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdG8gYXZvaWQgZHVwbGljYXRlZCBzdHlsZXMgdGhhdCBjYW4gb2NjdXJcbiAgICogZXNwZWNpYWxseSB3aGVuIGNvbXBvc2luZyB2aWEgc3ViY2xhc3NpbmcuIFRoZSBsYXN0IGl0ZW0gaXMga2VwdCB0byB0cnlcbiAgICogdG8gcHJlc2VydmUgdGhlIGNhc2NhZGUgb3JkZXIgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0J3MgbW9zdCBpbXBvcnRhbnRcbiAgICogdGhhdCBsYXN0IGFkZGVkIHN0eWxlcyBvdmVycmlkZSBwcmV2aW91cyBzdHlsZXMuXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSBzdHlsZXNcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgZmluYWxpemVTdHlsZXMoXG4gICAgc3R5bGVzPzogQ1NTUmVzdWx0R3JvdXBcbiAgKTogQXJyYXk8Q1NTUmVzdWx0T3JOYXRpdmU+IHtcbiAgICBjb25zdCBlbGVtZW50U3R5bGVzID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGVzKSkge1xuICAgICAgLy8gRGVkdXBlIHRoZSBmbGF0dGVuZWQgYXJyYXkgaW4gcmV2ZXJzZSBvcmRlciB0byBwcmVzZXJ2ZSB0aGUgbGFzdCBpdGVtcy5cbiAgICAgIC8vIENhc3RpbmcgdG8gQXJyYXk8dW5rbm93bj4gd29ya3MgYXJvdW5kIFRTIGVycm9yIHRoYXRcbiAgICAgIC8vIGFwcGVhcnMgdG8gY29tZSBmcm9tIHRyeWluZyB0byBmbGF0dGVuIGEgdHlwZSBDU1NSZXN1bHRBcnJheS5cbiAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoKHN0eWxlcyBhcyBBcnJheTx1bmtub3duPikuZmxhdChJbmZpbml0eSkucmV2ZXJzZSgpKTtcbiAgICAgIC8vIFRoZW4gcHJlc2VydmUgb3JpZ2luYWwgb3JkZXIgYnkgYWRkaW5nIHRoZSBzZXQgaXRlbXMgaW4gcmV2ZXJzZSBvcmRlci5cbiAgICAgIGZvciAoY29uc3QgcyBvZiBzZXQpIHtcbiAgICAgICAgZWxlbWVudFN0eWxlcy51bnNoaWZ0KGdldENvbXBhdGlibGVTdHlsZShzIGFzIENTU1Jlc3VsdE9yTmF0aXZlKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdHlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZWxlbWVudFN0eWxlcy5wdXNoKGdldENvbXBhdGlibGVTdHlsZShzdHlsZXMpKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRTdHlsZXM7XG4gIH1cblxuICAvKipcbiAgICogTm9kZSBvciBTaGFkb3dSb290IGludG8gd2hpY2ggZWxlbWVudCBET00gc2hvdWxkIGJlIHJlbmRlcmVkLiBEZWZhdWx0c1xuICAgKiB0byBhbiBvcGVuIHNoYWRvd1Jvb3QuXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IHJlbmRlclJvb3QhOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUgYG5hbWVgLlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkoXG4gICAgbmFtZTogUHJvcGVydHlLZXksXG4gICAgb3B0aW9uczogUHJvcGVydHlEZWNsYXJhdGlvblxuICApIHtcbiAgICBjb25zdCBhdHRyaWJ1dGUgPSBvcHRpb25zLmF0dHJpYnV0ZTtcbiAgICByZXR1cm4gYXR0cmlidXRlID09PSBmYWxzZVxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogdHlwZW9mIGF0dHJpYnV0ZSA9PT0gJ3N0cmluZydcbiAgICAgID8gYXR0cmlidXRlXG4gICAgICA6IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJ1xuICAgICAgPyBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSB0byBhbiB1bnJlc29sdmVkIFByb21pc2Ugc28gd2UgY2FuIG1ha2Ugc3VyZSB0aGUgZWxlbWVudCBoYXNcbiAgLy8gY29ubmVjdGVkIGJlZm9yZSBmaXJzdCB1cGRhdGUuXG4gIHByaXZhdGUgX191cGRhdGVQcm9taXNlITogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogVHJ1ZSBpZiB0aGVyZSBpcyBhIHBlbmRpbmcgdXBkYXRlIGFzIGEgcmVzdWx0IG9mIGNhbGxpbmcgYHJlcXVlc3RVcGRhdGUoKWAuXG4gICAqIFNob3VsZCBvbmx5IGJlIHJlYWQuXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBpc1VwZGF0ZVBlbmRpbmcgPSBmYWxzZTtcblxuICAvKipcbiAgICogSXMgc2V0IHRvIGB0cnVlYCBhZnRlciB0aGUgZmlyc3QgdXBkYXRlLiBUaGUgZWxlbWVudCBjb2RlIGNhbm5vdCBhc3N1bWVcbiAgICogdGhhdCBgcmVuZGVyUm9vdGAgZXhpc3RzIGJlZm9yZSB0aGUgZWxlbWVudCBgaGFzVXBkYXRlZGAuXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBoYXNVcGRhdGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIE1hcCB3aXRoIGtleXMgZm9yIGFueSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0XG4gICAqIHVwZGF0ZSBjeWNsZSB3aXRoIHByZXZpb3VzIHZhbHVlcy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfJGNoYW5nZWRQcm9wZXJ0aWVzITogUHJvcGVydHlWYWx1ZXM7XG5cbiAgLyoqXG4gICAqIFByb3BlcnRpZXMgdGhhdCBzaG91bGQgYmUgcmVmbGVjdGVkIHdoZW4gdXBkYXRlZC5cbiAgICovXG4gIHByaXZhdGUgX19yZWZsZWN0aW5nUHJvcGVydGllcz86IFNldDxQcm9wZXJ0eUtleT47XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgY3VycmVudGx5IHJlZmxlY3RpbmcgcHJvcGVydHlcbiAgICovXG4gIHByaXZhdGUgX19yZWZsZWN0aW5nUHJvcGVydHk6IFByb3BlcnR5S2V5IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiBjb250cm9sbGVycy5cbiAgICovXG4gIHByaXZhdGUgX19jb250cm9sbGVycz86IFNldDxSZWFjdGl2ZUNvbnRyb2xsZXI+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fX2luaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBvbmx5IG92ZXJyaWRlIHBvaW50IGZvciBjdXN0b21pemluZyB3b3JrIGRvbmUgd2hlbiBlbGVtZW50c1xuICAgKiBhcmUgY29uc3RydWN0ZWQuXG4gICAqL1xuICBwcml2YXRlIF9faW5pdGlhbGl6ZSgpIHtcbiAgICB0aGlzLl9fdXBkYXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlPGJvb2xlYW4+KFxuICAgICAgKHJlcykgPT4gKHRoaXMuZW5hYmxlVXBkYXRpbmcgPSByZXMpXG4gICAgKTtcbiAgICB0aGlzLl8kY2hhbmdlZFByb3BlcnRpZXMgPSBuZXcgTWFwKCk7XG4gICAgLy8gVGhpcyBlbnF1ZXVlcyBhIG1pY3JvdGFzayB0aGF0IHVzdCBydW4gYmVmb3JlIHRoZSBmaXJzdCB1cGRhdGUsIHNvIGl0XG4gICAgLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJlcXVlc3RVcGRhdGUoKVxuICAgIHRoaXMuX19zYXZlSW5zdGFuY2VQcm9wZXJ0aWVzKCk7XG4gICAgLy8gZW5zdXJlcyBmaXJzdCB1cGRhdGUgd2lsbCBiZSBjYXVnaHQgYnkgYW4gZWFybHkgYWNjZXNzIG9mXG4gICAgLy8gYHVwZGF0ZUNvbXBsZXRlYFxuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpLl9pbml0aWFsaXplcnM/LmZvckVhY2goKGkpID0+XG4gICAgICBpKHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBgUmVhY3RpdmVDb250cm9sbGVyYCB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUgZWxlbWVudCdzIHJlYWN0aXZlXG4gICAqIHVwZGF0ZSBjeWNsZS4gVGhlIGVsZW1lbnQgYXV0b21hdGljYWxseSBjYWxscyBpbnRvIGFueSByZWdpc3RlcmVkXG4gICAqIGNvbnRyb2xsZXJzIGR1cmluZyBpdHMgbGlmZWN5Y2xlIGNhbGxiYWNrcy5cbiAgICpcbiAgICogSWYgdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHdoZW4gYGFkZENvbnRyb2xsZXIoKWAgaXMgY2FsbGVkLCB0aGVcbiAgICogY29udHJvbGxlcidzIGBob3N0Q29ubmVjdGVkKClgIGNhbGxiYWNrIHdpbGwgYmUgaW1tZWRpYXRlbHkgY2FsbGVkLlxuICAgKiBAY2F0ZWdvcnkgY29udHJvbGxlcnNcbiAgICovXG4gIGFkZENvbnRyb2xsZXIoY29udHJvbGxlcjogUmVhY3RpdmVDb250cm9sbGVyKSB7XG4gICAgKHRoaXMuX19jb250cm9sbGVycyA/Pz0gbmV3IFNldCgpKS5hZGQoY29udHJvbGxlcik7XG4gICAgLy8gSWYgYSBjb250cm9sbGVyIGlzIGFkZGVkIGFmdGVyIHRoZSBlbGVtZW50IGhhcyBiZWVuIGNvbm5lY3RlZCxcbiAgICAvLyBjYWxsIGhvc3RDb25uZWN0ZWQuIE5vdGUsIHJlLXVzaW5nIGV4aXN0ZW5jZSBvZiBgcmVuZGVyUm9vdGAgaGVyZVxuICAgIC8vICh3aGljaCBpcyBzZXQgaW4gY29ubmVjdGVkQ2FsbGJhY2spIHRvIGF2b2lkIHRoZSBuZWVkIHRvIHRyYWNrIGFcbiAgICAvLyBmaXJzdCBjb25uZWN0ZWQgc3RhdGUuXG4gICAgaWYgKHRoaXMucmVuZGVyUm9vdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgIGNvbnRyb2xsZXIuaG9zdENvbm5lY3RlZD8uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBgUmVhY3RpdmVDb250cm9sbGVyYCBmcm9tIHRoZSBlbGVtZW50LlxuICAgKiBAY2F0ZWdvcnkgY29udHJvbGxlcnNcbiAgICovXG4gIHJlbW92ZUNvbnRyb2xsZXIoY29udHJvbGxlcjogUmVhY3RpdmVDb250cm9sbGVyKSB7XG4gICAgdGhpcy5fX2NvbnRyb2xsZXJzPy5kZWxldGUoY29udHJvbGxlcik7XG4gIH1cblxuICAvKipcbiAgICogRml4ZXMgYW55IHByb3BlcnRpZXMgc2V0IG9uIHRoZSBpbnN0YW5jZSBiZWZvcmUgdXBncmFkZSB0aW1lLlxuICAgKiBPdGhlcndpc2UgdGhlc2Ugd291bGQgc2hhZG93IHRoZSBhY2Nlc3NvciBhbmQgYnJlYWsgdGhlc2UgcHJvcGVydGllcy5cbiAgICogVGhlIHByb3BlcnRpZXMgYXJlIHN0b3JlZCBpbiBhIE1hcCB3aGljaCBpcyBwbGF5ZWQgYmFjayBhZnRlciB0aGVcbiAgICogY29uc3RydWN0b3IgcnVucy4gTm90ZSwgb24gdmVyeSBvbGQgdmVyc2lvbnMgb2YgU2FmYXJpICg8PTkpIG9yIENocm9tZVxuICAgKiAoPD00MSksIHByb3BlcnRpZXMgY3JlYXRlZCBmb3IgbmF0aXZlIHBsYXRmb3JtIHByb3BlcnRpZXMgbGlrZSAoYGlkYCBvclxuICAgKiBgbmFtZWApIG1heSBub3QgaGF2ZSBkZWZhdWx0IHZhbHVlcyBzZXQgaW4gdGhlIGVsZW1lbnQgY29uc3RydWN0b3IuIE9uXG4gICAqIHRoZXNlIGJyb3dzZXJzIG5hdGl2ZSBwcm9wZXJ0aWVzIGFwcGVhciBvbiBpbnN0YW5jZXMgYW5kIHRoZXJlZm9yZSB0aGVpclxuICAgKiBkZWZhdWx0IHZhbHVlIHdpbGwgb3ZlcndyaXRlIGFueSBlbGVtZW50IGRlZmF1bHQgKGUuZy4gaWYgdGhlIGVsZW1lbnQgc2V0c1xuICAgKiB0aGlzLmlkID0gJ2lkJyBpbiB0aGUgY29uc3RydWN0b3IsIHRoZSAnaWQnIHdpbGwgYmVjb21lICcnIHNpbmNlIHRoaXMgaXNcbiAgICogdGhlIG5hdGl2ZSBwbGF0Zm9ybSBkZWZhdWx0KS5cbiAgICovXG4gIHByaXZhdGUgX19zYXZlSW5zdGFuY2VQcm9wZXJ0aWVzKCkge1xuICAgIGNvbnN0IGluc3RhbmNlUHJvcGVydGllcyA9IG5ldyBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KCk7XG4gICAgY29uc3QgZWxlbWVudFByb3BlcnRpZXMgPSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50KVxuICAgICAgLmVsZW1lbnRQcm9wZXJ0aWVzO1xuICAgIGZvciAoY29uc3QgcCBvZiBlbGVtZW50UHJvcGVydGllcy5rZXlzKCkgYXMgSXRlcmFibGVJdGVyYXRvcjxrZXlvZiB0aGlzPikge1xuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgaW5zdGFuY2VQcm9wZXJ0aWVzLnNldChwLCB0aGlzW3BdKTtcbiAgICAgICAgZGVsZXRlIHRoaXNbcF07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZVByb3BlcnRpZXMuc2l6ZSA+IDApIHtcbiAgICAgIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMgPSBpbnN0YW5jZVByb3BlcnRpZXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5vZGUgaW50byB3aGljaCB0aGUgZWxlbWVudCBzaG91bGQgcmVuZGVyIGFuZCBieSBkZWZhdWx0XG4gICAqIGNyZWF0ZXMgYW5kIHJldHVybnMgYW4gb3BlbiBzaGFkb3dSb290LiBJbXBsZW1lbnQgdG8gY3VzdG9taXplIHdoZXJlIHRoZVxuICAgKiBlbGVtZW50J3MgRE9NIGlzIHJlbmRlcmVkLiBGb3IgZXhhbXBsZSwgdG8gcmVuZGVyIGludG8gdGhlIGVsZW1lbnQnc1xuICAgKiBjaGlsZE5vZGVzLCByZXR1cm4gYHRoaXNgLlxuICAgKlxuICAgKiBAcmV0dXJuIFJldHVybnMgYSBub2RlIGludG8gd2hpY2ggdG8gcmVuZGVyLlxuICAgKiBAY2F0ZWdvcnkgcmVuZGVyaW5nXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlUmVuZGVyUm9vdCgpOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IHJlbmRlclJvb3QgPVxuICAgICAgdGhpcy5zaGFkb3dSb290ID8/XG4gICAgICB0aGlzLmF0dGFjaFNoYWRvdyhcbiAgICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuc2hhZG93Um9vdE9wdGlvbnNcbiAgICAgICk7XG4gICAgYWRvcHRTdHlsZXMoXG4gICAgICByZW5kZXJSb290LFxuICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuZWxlbWVudFN0eWxlc1xuICAgICk7XG4gICAgcmV0dXJuIHJlbmRlclJvb3Q7XG4gIH1cblxuICAvKipcbiAgICogT24gZmlyc3QgY29ubmVjdGlvbiwgY3JlYXRlcyB0aGUgZWxlbWVudCdzIHJlbmRlclJvb3QsIHNldHMgdXBcbiAgICogZWxlbWVudCBzdHlsaW5nLCBhbmQgZW5hYmxlcyB1cGRhdGluZy5cbiAgICogQGNhdGVnb3J5IGxpZmVjeWNsZVxuICAgKi9cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgLy8gQ3JlYXRlIHJlbmRlclJvb3QgYmVmb3JlIGNvbnRyb2xsZXJzIGBob3N0Q29ubmVjdGVkYFxuICAgICh0aGlzIGFzIE11dGFibGU8dHlwZW9mIHRoaXMsICdyZW5kZXJSb290Jz4pLnJlbmRlclJvb3QgPz89XG4gICAgICB0aGlzLmNyZWF0ZVJlbmRlclJvb3QoKTtcbiAgICB0aGlzLmVuYWJsZVVwZGF0aW5nKHRydWUpO1xuICAgIHRoaXMuX19jb250cm9sbGVycz8uZm9yRWFjaCgoYykgPT4gYy5ob3N0Q29ubmVjdGVkPy4oKSk7XG4gIH1cblxuICAvKipcbiAgICogTm90ZSwgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZmluYWwgYW5kIG5vdCBvdmVycmlkZGVuLiBJdCBpc1xuICAgKiBvdmVycmlkZGVuIG9uIHRoZSBlbGVtZW50IGluc3RhbmNlIHdpdGggYSBmdW5jdGlvbiB0aGF0IHRyaWdnZXJzIHRoZSBmaXJzdFxuICAgKiB1cGRhdGUuXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBwcm90ZWN0ZWQgZW5hYmxlVXBkYXRpbmcoX3JlcXVlc3RlZFVwZGF0ZTogYm9vbGVhbikge31cblxuICAvKipcbiAgICogQWxsb3dzIGZvciBgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKWAgaW4gZXh0ZW5zaW9ucyB3aGlsZVxuICAgKiByZXNlcnZpbmcgdGhlIHBvc3NpYmlsaXR5IG9mIG1ha2luZyBub24tYnJlYWtpbmcgZmVhdHVyZSBhZGRpdGlvbnNcbiAgICogd2hlbiBkaXNjb25uZWN0aW5nIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS5cbiAgICogQGNhdGVnb3J5IGxpZmVjeWNsZVxuICAgKi9cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5fX2NvbnRyb2xsZXJzPy5mb3JFYWNoKChjKSA9PiBjLmhvc3REaXNjb25uZWN0ZWQ/LigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbml6ZXMgcHJvcGVydHkgdmFsdWVzIHdoZW4gYXR0cmlidXRlcyBjaGFuZ2UuXG4gICAqXG4gICAqIFNwZWNpZmljYWxseSwgd2hlbiBhbiBhdHRyaWJ1dGUgaXMgc2V0LCB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBpcyBzZXQuXG4gICAqIFlvdSBzaG91bGQgcmFyZWx5IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgY2FsbGJhY2suIElmIHRoaXMgbWV0aG9kIGlzXG4gICAqIG92ZXJyaWRkZW4sIGBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgX29sZCwgdmFsdWUpYCBtdXN0IGJlXG4gICAqIGNhbGxlZC5cbiAgICpcbiAgICogU2VlIFt1c2luZyB0aGUgbGlmZWN5Y2xlIGNhbGxiYWNrc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvV2ViX0NvbXBvbmVudHMvVXNpbmdfY3VzdG9tX2VsZW1lbnRzI3VzaW5nX3RoZV9saWZlY3ljbGVfY2FsbGJhY2tzKVxuICAgKiBvbiBNRE4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgLlxuICAgKiBAY2F0ZWdvcnkgYXR0cmlidXRlc1xuICAgKi9cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBfb2xkOiBzdHJpbmcgfCBudWxsLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudWxsXG4gICkge1xuICAgIHRoaXMuXyRhdHRyaWJ1dGVUb1Byb3BlcnR5KG5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX19wcm9wZXJ0eVRvQXR0cmlidXRlKG5hbWU6IFByb3BlcnR5S2V5LCB2YWx1ZTogdW5rbm93bikge1xuICAgIGNvbnN0IGVsZW1Qcm9wZXJ0aWVzOiBQcm9wZXJ0eURlY2xhcmF0aW9uTWFwID0gKFxuICAgICAgdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50XG4gICAgKS5lbGVtZW50UHJvcGVydGllcztcbiAgICBjb25zdCBvcHRpb25zID0gZWxlbVByb3BlcnRpZXMuZ2V0KG5hbWUpITtcbiAgICBjb25zdCBhdHRyID0gKFxuICAgICAgdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50XG4gICAgKS5fX2F0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShuYW1lLCBvcHRpb25zKTtcbiAgICBpZiAoYXR0ciAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMucmVmbGVjdCA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgY29udmVydGVyID1cbiAgICAgICAgKG9wdGlvbnMuY29udmVydGVyIGFzIENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXIpPy50b0F0dHJpYnV0ZSAhPT1cbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICAgPyAob3B0aW9ucy5jb252ZXJ0ZXIgYXMgQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlcilcbiAgICAgICAgICA6IGRlZmF1bHRDb252ZXJ0ZXI7XG4gICAgICBjb25zdCBhdHRyVmFsdWUgPSBjb252ZXJ0ZXIudG9BdHRyaWJ1dGUhKHZhbHVlLCBvcHRpb25zLnR5cGUpO1xuICAgICAgaWYgKFxuICAgICAgICBERVZfTU9ERSAmJlxuICAgICAgICAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50KS5lbmFibGVkV2FybmluZ3MhLmluY2x1ZGVzKFxuICAgICAgICAgICdtaWdyYXRpb24nXG4gICAgICAgICkgJiZcbiAgICAgICAgYXR0clZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAgICAgJ3VuZGVmaW5lZC1hdHRyaWJ1dGUtdmFsdWUnLFxuICAgICAgICAgIGBUaGUgYXR0cmlidXRlIHZhbHVlIGZvciB0aGUgJHtuYW1lIGFzIHN0cmluZ30gcHJvcGVydHkgaXMgYCArXG4gICAgICAgICAgICBgdW5kZWZpbmVkIG9uIGVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0uIFRoZSBhdHRyaWJ1dGUgd2lsbCBiZSBgICtcbiAgICAgICAgICAgIGByZW1vdmVkLCBidXQgaW4gdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgXFxgUmVhY3RpdmVFbGVtZW50XFxgLCBgICtcbiAgICAgICAgICAgIGB0aGUgYXR0cmlidXRlIHdvdWxkIG5vdCBoYXZlIGNoYW5nZWQuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gVHJhY2sgaWYgdGhlIHByb3BlcnR5IGlzIGJlaW5nIHJlZmxlY3RlZCB0byBhdm9pZFxuICAgICAgLy8gc2V0dGluZyB0aGUgcHJvcGVydHkgYWdhaW4gdmlhIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgLiBOb3RlOlxuICAgICAgLy8gMS4gdGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGUgY2FsbGJhY2sgaXMgc3luY2hyb25vdXMuXG4gICAgICAvLyAyLiB3aWxsIGJlaGF2ZSBpbmNvcnJlY3RseSBpZiBtdWx0aXBsZSBhdHRyaWJ1dGVzIGFyZSBpbiB0aGUgcmVhY3Rpb25cbiAgICAgIC8vIHN0YWNrIGF0IHRpbWUgb2YgY2FsbGluZy4gSG93ZXZlciwgc2luY2Ugd2UgcHJvY2VzcyBhdHRyaWJ1dGVzXG4gICAgICAvLyBpbiBgdXBkYXRlYCB0aGlzIHNob3VsZCBub3QgYmUgcG9zc2libGUgKG9yIGFuIGV4dHJlbWUgY29ybmVyIGNhc2VcbiAgICAgIC8vIHRoYXQgd2UnZCBsaWtlIHRvIGRpc2NvdmVyKS5cbiAgICAgIC8vIG1hcmsgc3RhdGUgcmVmbGVjdGluZ1xuICAgICAgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSA9IG5hbWU7XG4gICAgICBpZiAoYXR0clZhbHVlID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyVmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIC8vIG1hcmsgc3RhdGUgbm90IHJlZmxlY3RpbmdcbiAgICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRhdHRyaWJ1dGVUb1Byb3BlcnR5KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50O1xuICAgIC8vIE5vdGUsIGhpbnQgdGhpcyBhcyBhbiBgQXR0cmlidXRlTWFwYCBzbyBjbG9zdXJlIGNsZWFybHkgdW5kZXJzdGFuZHNcbiAgICAvLyB0aGUgdHlwZTsgaXQgaGFzIGlzc3VlcyB3aXRoIHRyYWNraW5nIHR5cGVzIHRocm91Z2ggc3RhdGljc1xuICAgIGNvbnN0IHByb3BOYW1lID0gKGN0b3IuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwIGFzIEF0dHJpYnV0ZU1hcCkuZ2V0KG5hbWUpO1xuICAgIC8vIFVzZSB0cmFja2luZyBpbmZvIHRvIGF2b2lkIHJlZmxlY3RpbmcgYSBwcm9wZXJ0eSB2YWx1ZSB0byBhbiBhdHRyaWJ1dGVcbiAgICAvLyBpZiBpdCB3YXMganVzdCBzZXQgYmVjYXVzZSB0aGUgYXR0cmlidXRlIGNoYW5nZWQuXG4gICAgaWYgKHByb3BOYW1lICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSAhPT0gcHJvcE5hbWUpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBjdG9yLmdldFByb3BlcnR5T3B0aW9ucyhwcm9wTmFtZSk7XG4gICAgICBjb25zdCBjb252ZXJ0ZXIgPVxuICAgICAgICB0eXBlb2Ygb3B0aW9ucy5jb252ZXJ0ZXIgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHtmcm9tQXR0cmlidXRlOiBvcHRpb25zLmNvbnZlcnRlcn1cbiAgICAgICAgICA6IG9wdGlvbnMuY29udmVydGVyPy5mcm9tQXR0cmlidXRlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IG9wdGlvbnMuY29udmVydGVyXG4gICAgICAgICAgOiBkZWZhdWx0Q29udmVydGVyO1xuICAgICAgLy8gbWFyayBzdGF0ZSByZWZsZWN0aW5nXG4gICAgICB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnR5ID0gcHJvcE5hbWU7XG4gICAgICB0aGlzW3Byb3BOYW1lIGFzIGtleW9mIHRoaXNdID0gY29udmVydGVyLmZyb21BdHRyaWJ1dGUhKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgb3B0aW9ucy50eXBlXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICApIGFzIGFueTtcbiAgICAgIC8vIG1hcmsgc3RhdGUgbm90IHJlZmxlY3RpbmdcbiAgICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBhbiB1cGRhdGUgd2hpY2ggaXMgcHJvY2Vzc2VkIGFzeW5jaHJvbm91c2x5LiBUaGlzIHNob3VsZCBiZSBjYWxsZWRcbiAgICogd2hlbiBhbiBlbGVtZW50IHNob3VsZCB1cGRhdGUgYmFzZWQgb24gc29tZSBzdGF0ZSBub3QgdHJpZ2dlcmVkIGJ5IHNldHRpbmdcbiAgICogYSByZWFjdGl2ZSBwcm9wZXJ0eS4gSW4gdGhpcyBjYXNlLCBwYXNzIG5vIGFyZ3VtZW50cy4gSXQgc2hvdWxkIGFsc28gYmVcbiAgICogY2FsbGVkIHdoZW4gbWFudWFsbHkgaW1wbGVtZW50aW5nIGEgcHJvcGVydHkgc2V0dGVyLiBJbiB0aGlzIGNhc2UsIHBhc3MgdGhlXG4gICAqIHByb3BlcnR5IGBuYW1lYCBhbmQgYG9sZFZhbHVlYCB0byBlbnN1cmUgdGhhdCBhbnkgY29uZmlndXJlZCBwcm9wZXJ0eVxuICAgKiBvcHRpb25zIGFyZSBob25vcmVkLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHJlcXVlc3RpbmcgcHJvcGVydHlcbiAgICogQHBhcmFtIG9sZFZhbHVlIG9sZCB2YWx1ZSBvZiByZXF1ZXN0aW5nIHByb3BlcnR5XG4gICAqIEBwYXJhbSBvcHRpb25zIHByb3BlcnR5IG9wdGlvbnMgdG8gdXNlIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzbHlcbiAgICogICAgIGNvbmZpZ3VyZWQgb3B0aW9uc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcmVxdWVzdFVwZGF0ZShcbiAgICBuYW1lPzogUHJvcGVydHlLZXksXG4gICAgb2xkVmFsdWU/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBQcm9wZXJ0eURlY2xhcmF0aW9uXG4gICk6IHZvaWQge1xuICAgIC8vIElmIHdlIGhhdmUgYSBwcm9wZXJ0eSBrZXksIHBlcmZvcm0gcHJvcGVydHkgdXBkYXRlIHN0ZXBzLlxuICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChERVZfTU9ERSAmJiAobmFtZSBhcyB1bmtub3duKSBpbnN0YW5jZW9mIEV2ZW50KSB7XG4gICAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgICBgYCxcbiAgICAgICAgICBgVGhlIHJlcXVlc3RVcGRhdGUoKSBtZXRob2Qgd2FzIGNhbGxlZCB3aXRoIGFuIEV2ZW50IGFzIHRoZSBwcm9wZXJ0eSBuYW1lLiBUaGlzIGlzIHByb2JhYmx5IGEgbWlzdGFrZSBjYXVzZWQgYnkgYmluZGluZyB0aGlzLnJlcXVlc3RVcGRhdGUgYXMgYW4gZXZlbnQgbGlzdGVuZXIuIEluc3RlYWQgYmluZCBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBjYWxsIGl0IHdpdGggbm8gYXJndW1lbnRzOiAoKSA9PiB0aGlzLnJlcXVlc3RVcGRhdGUoKWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMgPz89IChcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50XG4gICAgICApLmdldFByb3BlcnR5T3B0aW9ucyhuYW1lKTtcbiAgICAgIGNvbnN0IGhhc0NoYW5nZWQgPSBvcHRpb25zLmhhc0NoYW5nZWQgPz8gbm90RXF1YWw7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXNbbmFtZSBhcyBrZXlvZiB0aGlzXTtcbiAgICAgIGlmIChoYXNDaGFuZ2VkKG5ld1ZhbHVlLCBvbGRWYWx1ZSkpIHtcbiAgICAgICAgdGhpcy5fJGNoYW5nZVByb3BlcnR5KG5hbWUsIG9sZFZhbHVlLCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFib3J0IHRoZSByZXF1ZXN0IGlmIHRoZSBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgY2hhbmdlZC5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5pc1VwZGF0ZVBlbmRpbmcgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLl9fdXBkYXRlUHJvbWlzZSA9IHRoaXMuX19lbnF1ZXVlVXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgXyRjaGFuZ2VQcm9wZXJ0eShcbiAgICBuYW1lOiBQcm9wZXJ0eUtleSxcbiAgICBvbGRWYWx1ZTogdW5rbm93bixcbiAgICBvcHRpb25zOiBQcm9wZXJ0eURlY2xhcmF0aW9uXG4gICkge1xuICAgIC8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiBDcmVhdGUgYSBiZW5jaG1hcmsgb2YgTWFwLmhhcygpICsgTWFwLnNldChcbiAgICAvLyB2cyBqdXN0IE1hcC5zZXQoKVxuICAgIGlmICghdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzLmhhcyhuYW1lKSkge1xuICAgICAgdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzLnNldChuYW1lLCBvbGRWYWx1ZSk7XG4gICAgfVxuICAgIC8vIEFkZCB0byByZWZsZWN0aW5nIHByb3BlcnRpZXMgc2V0LlxuICAgIC8vIE5vdGUsIGl0J3MgaW1wb3J0YW50IHRoYXQgZXZlcnkgY2hhbmdlIGhhcyBhIGNoYW5jZSB0byBhZGQgdGhlXG4gICAgLy8gcHJvcGVydHkgdG8gYF9fcmVmbGVjdGluZ1Byb3BlcnRpZXNgLiBUaGlzIGVuc3VyZXMgc2V0dGluZ1xuICAgIC8vIGF0dHJpYnV0ZSArIHByb3BlcnR5IHJlZmxlY3RzIGNvcnJlY3RseS5cbiAgICBpZiAob3B0aW9ucy5yZWZsZWN0ID09PSB0cnVlICYmIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgIT09IG5hbWUpIHtcbiAgICAgICh0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnRpZXMgPz89IG5ldyBTZXQ8UHJvcGVydHlLZXk+KCkpLmFkZChuYW1lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0aGUgZWxlbWVudCB0byBhc3luY2hyb25vdXNseSB1cGRhdGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9fZW5xdWV1ZVVwZGF0ZSgpIHtcbiAgICB0aGlzLmlzVXBkYXRlUGVuZGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSBhbnkgcHJldmlvdXMgdXBkYXRlIGhhcyByZXNvbHZlZCBiZWZvcmUgdXBkYXRpbmcuXG4gICAgICAvLyBUaGlzIGBhd2FpdGAgYWxzbyBlbnN1cmVzIHRoYXQgcHJvcGVydHkgY2hhbmdlcyBhcmUgYmF0Y2hlZC5cbiAgICAgIGF3YWl0IHRoaXMuX191cGRhdGVQcm9taXNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFJlZmlyZSBhbnkgcHJldmlvdXMgZXJyb3JzIGFzeW5jIHNvIHRoZXkgZG8gbm90IGRpc3J1cHQgdGhlIHVwZGF0ZVxuICAgICAgLy8gY3ljbGUuIEVycm9ycyBhcmUgcmVmaXJlZCBzbyBkZXZlbG9wZXJzIGhhdmUgYSBjaGFuY2UgdG8gb2JzZXJ2ZVxuICAgICAgLy8gdGhlbSwgYW5kIHRoaXMgY2FuIGJlIGRvbmUgYnkgaW1wbGVtZW50aW5nXG4gICAgICAvLyBgd2luZG93Lm9udW5oYW5kbGVkcmVqZWN0aW9uYC5cbiAgICAgIFByb21pc2UucmVqZWN0KGUpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XG4gICAgLy8gSWYgYHNjaGVkdWxlVXBkYXRlYCByZXR1cm5zIGEgUHJvbWlzZSwgd2UgYXdhaXQgaXQuIFRoaXMgaXMgZG9uZSB0b1xuICAgIC8vIGVuYWJsZSBjb29yZGluYXRpbmcgdXBkYXRlcyB3aXRoIGEgc2NoZWR1bGVyLiBOb3RlLCB0aGUgcmVzdWx0IGlzXG4gICAgLy8gY2hlY2tlZCB0byBhdm9pZCBkZWxheWluZyBhbiBhZGRpdGlvbmFsIG1pY3JvdGFzayB1bmxlc3Mgd2UgbmVlZCB0by5cbiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuICF0aGlzLmlzVXBkYXRlUGVuZGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2hlZHVsZXMgYW4gZWxlbWVudCB1cGRhdGUuIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIHRoZVxuICAgKiB0aW1pbmcgb2YgdXBkYXRlcyBieSByZXR1cm5pbmcgYSBQcm9taXNlLiBUaGUgdXBkYXRlIHdpbGwgYXdhaXQgdGhlXG4gICAqIHJldHVybmVkIFByb21pc2UsIGFuZCB5b3Ugc2hvdWxkIHJlc29sdmUgdGhlIFByb21pc2UgdG8gYWxsb3cgdGhlIHVwZGF0ZVxuICAgKiB0byBwcm9jZWVkLiBJZiB0aGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuLCBgc3VwZXIuc2NoZWR1bGVVcGRhdGUoKWBcbiAgICogbXVzdCBiZSBjYWxsZWQuXG4gICAqXG4gICAqIEZvciBpbnN0YW5jZSwgdG8gc2NoZWR1bGUgdXBkYXRlcyB0byBvY2N1ciBqdXN0IGJlZm9yZSB0aGUgbmV4dCBmcmFtZTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogb3ZlcnJpZGUgcHJvdGVjdGVkIGFzeW5jIHNjaGVkdWxlVXBkYXRlKCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgKiAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gcmVzb2x2ZSgpKSk7XG4gICAqICAgc3VwZXIuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCBzY2hlZHVsZVVwZGF0ZSgpOiB2b2lkIHwgUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wZXJmb3JtVXBkYXRlKCk7XG4gICAgaWYgKFxuICAgICAgREVWX01PREUgJiZcbiAgICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpLmVuYWJsZWRXYXJuaW5ncyEuaW5jbHVkZXMoXG4gICAgICAgICdhc3luYy1wZXJmb3JtLXVwZGF0ZSdcbiAgICAgICkgJiZcbiAgICAgIHR5cGVvZiAocmVzdWx0IGFzIHVua25vd24gYXMgUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZCk/LnRoZW4gPT09XG4gICAgICAgICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgJ2FzeW5jLXBlcmZvcm0tdXBkYXRlJyxcbiAgICAgICAgYEVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0gcmV0dXJuZWQgYSBQcm9taXNlIGZyb20gcGVyZm9ybVVwZGF0ZSgpLiBgICtcbiAgICAgICAgICBgVGhpcyBiZWhhdmlvciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgYCArXG4gICAgICAgICAgYHZlcnNpb24gb2YgUmVhY3RpdmVFbGVtZW50LmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYW4gZWxlbWVudCB1cGRhdGUuIE5vdGUsIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIHRoZVxuICAgKiB1cGRhdGUsIGBmaXJzdFVwZGF0ZWRgIGFuZCBgdXBkYXRlZGAgd2lsbCBub3QgYmUgY2FsbGVkLlxuICAgKlxuICAgKiBDYWxsIGBwZXJmb3JtVXBkYXRlKClgIHRvIGltbWVkaWF0ZWx5IHByb2Nlc3MgYSBwZW5kaW5nIHVwZGF0ZS4gVGhpcyBzaG91bGRcbiAgICogZ2VuZXJhbGx5IG5vdCBiZSBuZWVkZWQsIGJ1dCBpdCBjYW4gYmUgZG9uZSBpbiByYXJlIGNhc2VzIHdoZW4geW91IG5lZWQgdG9cbiAgICogdXBkYXRlIHN5bmNocm9ub3VzbHkuXG4gICAqXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBwcm90ZWN0ZWQgcGVyZm9ybVVwZGF0ZSgpOiB2b2lkIHtcbiAgICAvLyBBYm9ydCBhbnkgdXBkYXRlIGlmIG9uZSBpcyBub3QgcGVuZGluZyB3aGVuIHRoaXMgaXMgY2FsbGVkLlxuICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBgcGVyZm9ybVVwZGF0ZWAgaXMgY2FsbGVkIGVhcmx5IHRvIFwiZmx1c2hcIlxuICAgIC8vIHRoZSB1cGRhdGUuXG4gICAgaWYgKCF0aGlzLmlzVXBkYXRlUGVuZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWJ1Z0xvZ0V2ZW50Py4oe2tpbmQ6ICd1cGRhdGUnfSk7XG4gICAgaWYgKCF0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgIC8vIENyZWF0ZSByZW5kZXJSb290IGJlZm9yZSBmaXJzdCB1cGRhdGUuIFRoaXMgb2NjdXJzIGluIGBjb25uZWN0ZWRDYWxsYmFja2BcbiAgICAgIC8vIGJ1dCBpcyBkb25lIGhlcmUgdG8gc3VwcG9ydCBvdXQgb2YgdHJlZSBjYWxscyB0byBgZW5hYmxlVXBkYXRpbmdgL2BwZXJmb3JtVXBkYXRlYC5cbiAgICAgICh0aGlzIGFzIE11dGFibGU8dHlwZW9mIHRoaXMsICdyZW5kZXJSb290Jz4pLnJlbmRlclJvb3QgPz89XG4gICAgICAgIHRoaXMuY3JlYXRlUmVuZGVyUm9vdCgpO1xuICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgIC8vIFByb2R1Y2Ugd2FybmluZyBpZiBhbnkgcmVhY3RpdmUgcHJvcGVydGllcyBvbiB0aGUgcHJvdG90eXBlIGFyZVxuICAgICAgICAvLyBzaGFkb3dlZCBieSBjbGFzcyBmaWVsZHMuIEluc3RhbmNlIGZpZWxkcyBzZXQgYmVmb3JlIHVwZ3JhZGUgYXJlXG4gICAgICAgIC8vIGRlbGV0ZWQgYnkgdGhpcyBwb2ludCwgc28gYW55IG93biBwcm9wZXJ0eSBpcyBjYXVzZWQgYnkgY2xhc3MgZmllbGRcbiAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24gaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBzaGFkb3dlZFByb3BlcnRpZXMgPSBbLi4uY3Rvci5lbGVtZW50UHJvcGVydGllcy5rZXlzKCldLmZpbHRlcihcbiAgICAgICAgICAocCkgPT4gdGhpcy5oYXNPd25Qcm9wZXJ0eShwKSAmJiBwIGluIGdldFByb3RvdHlwZU9mKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzaGFkb3dlZFByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBvbiBlbGVtZW50ICR7dGhpcy5sb2NhbE5hbWV9IHdpbGwgbm90IGAgK1xuICAgICAgICAgICAgICBgdHJpZ2dlciB1cGRhdGVzIGFzIGV4cGVjdGVkIGJlY2F1c2UgdGhleSBhcmUgc2V0IHVzaW5nIGNsYXNzIGAgK1xuICAgICAgICAgICAgICBgZmllbGRzOiAke3NoYWRvd2VkUHJvcGVydGllcy5qb2luKCcsICcpfS4gYCArXG4gICAgICAgICAgICAgIGBOYXRpdmUgY2xhc3MgZmllbGRzIGFuZCBzb21lIGNvbXBpbGVkIG91dHB1dCB3aWxsIG92ZXJ3cml0ZSBgICtcbiAgICAgICAgICAgICAgYGFjY2Vzc29ycyB1c2VkIGZvciBkZXRlY3RpbmcgY2hhbmdlcy4gU2VlIGAgK1xuICAgICAgICAgICAgICBgaHR0cHM6Ly9saXQuZGV2L21zZy9jbGFzcy1maWVsZC1zaGFkb3dpbmcgYCArXG4gICAgICAgICAgICAgIGBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gTWl4aW4gaW5zdGFuY2UgcHJvcGVydGllcyBvbmNlLCBpZiB0aGV5IGV4aXN0LlxuICAgICAgaWYgKHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMpIHtcbiAgICAgICAgLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IHNob3VsZCB3ZSB1c2UgdGhlIHN0b3JlZCB2YWx1ZT8gQ291bGQgYSBuZXcgdmFsdWVcbiAgICAgICAgLy8gaGF2ZSBiZWVuIHNldCBzaW5jZSB3ZSBzdG9yZWQgdGhlIG93biBwcm9wZXJ0eSB2YWx1ZT9cbiAgICAgICAgZm9yIChjb25zdCBbcCwgdmFsdWVdIG9mIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICB0aGlzW3AgYXMga2V5b2YgdGhpc10gPSB2YWx1ZSBhcyB0aGlzW2tleW9mIHRoaXNdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICAvLyBUcmlnZ2VyIGluaXRpYWwgdmFsdWUgcmVmbGVjdGlvbiBhbmQgcG9wdWxhdGUgdGhlIGluaXRpYWxcbiAgICAgIC8vIGNoYW5nZWRQcm9wZXJ0aWVzIG1hcCwgYnV0IG9ubHkgZm9yIHRoZSBjYXNlIG9mIGV4cGVyaW1lbnRhbFxuICAgICAgLy8gZGVjb3JhdG9ycyBvbiBhY2Nlc3NvcnMsIHdoaWNoIHdpbGwgbm90IGhhdmUgYWxyZWFkeSBwb3B1bGF0ZWQgdGhlXG4gICAgICAvLyBjaGFuZ2VkUHJvcGVydGllcyBtYXAuIFdlIGNhbid0IGtub3cgaWYgdGhlc2UgYWNjZXNzb3JzIGhhZFxuICAgICAgLy8gaW5pdGlhbGl6ZXJzLCBzbyB3ZSBqdXN0IHNldCB0aGVtIGFueXdheSAtIGEgZGlmZmVyZW5jZSBmcm9tXG4gICAgICAvLyBleHBlcmltZW50YWwgZGVjb3JhdG9ycyBvbiBmaWVsZHMgYW5kIHN0YW5kYXJkIGRlY29yYXRvcnMgb25cbiAgICAgIC8vIGF1dG8tYWNjZXNzb3JzLlxuICAgICAgLy8gRm9yIGNvbnRleHQgd2h5IGV4cGVyaW1lbnRhbERlY29yYXRvcnMgd2l0aCBhdXRvIGFjY2Vzc29ycyBhcmUgaGFuZGxlZFxuICAgICAgLy8gc3BlY2lmaWNhbGx5IGFsc28gc2VlOlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvcHVsbC80MTgzI2lzc3VlY29tbWVudC0xNzExOTU5NjM1XG4gICAgICBjb25zdCBlbGVtZW50UHJvcGVydGllcyA9ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpXG4gICAgICAgIC5lbGVtZW50UHJvcGVydGllcztcbiAgICAgIGlmIChlbGVtZW50UHJvcGVydGllcy5zaXplID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtwLCBvcHRpb25zXSBvZiBlbGVtZW50UHJvcGVydGllcykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG9wdGlvbnMud3JhcHBlZCA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgIXRoaXMuXyRjaGFuZ2VkUHJvcGVydGllcy5oYXMocCkgJiZcbiAgICAgICAgICAgIHRoaXNbcCBhcyBrZXlvZiB0aGlzXSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLl8kY2hhbmdlUHJvcGVydHkocCwgdGhpc1twIGFzIGtleW9mIHRoaXNdLCBvcHRpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IHNob3VsZFVwZGF0ZSA9IGZhbHNlO1xuICAgIGNvbnN0IGNoYW5nZWRQcm9wZXJ0aWVzID0gdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzO1xuICAgIHRyeSB7XG4gICAgICBzaG91bGRVcGRhdGUgPSB0aGlzLnNob3VsZFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICAgIHRoaXMud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICAgIHRoaXMuX19jb250cm9sbGVycz8uZm9yRWFjaCgoYykgPT4gYy5ob3N0VXBkYXRlPy4oKSk7XG4gICAgICAgIHRoaXMudXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX19tYXJrVXBkYXRlZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFByZXZlbnQgYGZpcnN0VXBkYXRlZGAgYW5kIGB1cGRhdGVkYCBmcm9tIHJ1bm5pbmcgd2hlbiB0aGVyZSdzIGFuXG4gICAgICAvLyB1cGRhdGUgZXhjZXB0aW9uLlxuICAgICAgc2hvdWxkVXBkYXRlID0gZmFsc2U7XG4gICAgICAvLyBFbnN1cmUgZWxlbWVudCBjYW4gYWNjZXB0IGFkZGl0aW9uYWwgdXBkYXRlcyBhZnRlciBhbiBleGNlcHRpb24uXG4gICAgICB0aGlzLl9fbWFya1VwZGF0ZWQoKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIC8vIFRoZSB1cGRhdGUgaXMgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgcGVuZGluZyBhbmQgZnVydGhlciB1cGRhdGVzIGFyZSBub3cgYWxsb3dlZC5cbiAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICB0aGlzLl8kZGlkVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlZCBiZWZvcmUgYHVwZGF0ZSgpYCB0byBjb21wdXRlIHZhbHVlcyBuZWVkZWQgZHVyaW5nIHRoZSB1cGRhdGUuXG4gICAqXG4gICAqIEltcGxlbWVudCBgd2lsbFVwZGF0ZWAgdG8gY29tcHV0ZSBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBkZXBlbmQgb24gb3RoZXJcbiAgICogcHJvcGVydGllcyBhbmQgYXJlIHVzZWQgaW4gdGhlIHJlc3Qgb2YgdGhlIHVwZGF0ZSBwcm9jZXNzLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKSB7XG4gICAqICAgLy8gb25seSBuZWVkIHRvIGNoZWNrIGNoYW5nZWQgcHJvcGVydGllcyBmb3IgYW4gZXhwZW5zaXZlIGNvbXB1dGF0aW9uLlxuICAgKiAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2ZpcnN0TmFtZScpIHx8IGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnbGFzdE5hbWUnKSkge1xuICAgKiAgICAgdGhpcy5zaGEgPSBjb21wdXRlU0hBKGAke3RoaXMuZmlyc3ROYW1lfSAke3RoaXMubGFzdE5hbWV9YCk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIHJlbmRlcigpIHtcbiAgICogICByZXR1cm4gaHRtbGBTSEE6ICR7dGhpcy5zaGF9YDtcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCB3aWxsVXBkYXRlKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpOiB2b2lkIHt9XG5cbiAgLy8gTm90ZSwgdGhpcyBpcyBhbiBvdmVycmlkZSBwb2ludCBmb3IgcG9seWZpbGwtc3VwcG9ydC5cbiAgLy8gQGludGVybmFsXG4gIF8kZGlkVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlcykge1xuICAgIHRoaXMuX19jb250cm9sbGVycz8uZm9yRWFjaCgoYykgPT4gYy5ob3N0VXBkYXRlZD8uKCkpO1xuICAgIGlmICghdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICB0aGlzLmhhc1VwZGF0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgIGlmIChcbiAgICAgIERFVl9NT0RFICYmXG4gICAgICB0aGlzLmlzVXBkYXRlUGVuZGluZyAmJlxuICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuZW5hYmxlZFdhcm5pbmdzIS5pbmNsdWRlcyhcbiAgICAgICAgJ2NoYW5nZS1pbi11cGRhdGUnXG4gICAgICApXG4gICAgKSB7XG4gICAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAgICdjaGFuZ2UtaW4tdXBkYXRlJyxcbiAgICAgICAgYEVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0gc2NoZWR1bGVkIGFuIHVwZGF0ZSBgICtcbiAgICAgICAgICBgKGdlbmVyYWxseSBiZWNhdXNlIGEgcHJvcGVydHkgd2FzIHNldCkgYCArXG4gICAgICAgICAgYGFmdGVyIGFuIHVwZGF0ZSBjb21wbGV0ZWQsIGNhdXNpbmcgYSBuZXcgdXBkYXRlIHRvIGJlIHNjaGVkdWxlZC4gYCArXG4gICAgICAgICAgYFRoaXMgaXMgaW5lZmZpY2llbnQgYW5kIHNob3VsZCBiZSBhdm9pZGVkIHVubGVzcyB0aGUgbmV4dCB1cGRhdGUgYCArXG4gICAgICAgICAgYGNhbiBvbmx5IGJlIHNjaGVkdWxlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIHRoZSBwcmV2aW91cyB1cGRhdGUuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9fbWFya1VwZGF0ZWQoKSB7XG4gICAgdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuaXNVcGRhdGVQZW5kaW5nID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBlbGVtZW50IGhhcyBjb21wbGV0ZWQgdXBkYXRpbmcuXG4gICAqIFRoZSBQcm9taXNlIHZhbHVlIGlzIGEgYm9vbGVhbiB0aGF0IGlzIGB0cnVlYCBpZiB0aGUgZWxlbWVudCBjb21wbGV0ZWQgdGhlXG4gICAqIHVwZGF0ZSB3aXRob3V0IHRyaWdnZXJpbmcgYW5vdGhlciB1cGRhdGUuIFRoZSBQcm9taXNlIHJlc3VsdCBpcyBgZmFsc2VgIGlmXG4gICAqIGEgcHJvcGVydHkgd2FzIHNldCBpbnNpZGUgYHVwZGF0ZWQoKWAuIElmIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLCBhblxuICAgKiBleGNlcHRpb24gd2FzIHRocm93biBkdXJpbmcgdGhlIHVwZGF0ZS5cbiAgICpcbiAgICogVG8gYXdhaXQgYWRkaXRpb25hbCBhc3luY2hyb25vdXMgd29yaywgb3ZlcnJpZGUgdGhlIGBnZXRVcGRhdGVDb21wbGV0ZWBcbiAgICogbWV0aG9kLiBGb3IgZXhhbXBsZSwgaXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBhd2FpdCBhIHJlbmRlcmVkIGVsZW1lbnRcbiAgICogYmVmb3JlIGZ1bGZpbGxpbmcgdGhpcyBQcm9taXNlLiBUbyBkbyB0aGlzLCBmaXJzdCBhd2FpdFxuICAgKiBgc3VwZXIuZ2V0VXBkYXRlQ29tcGxldGUoKWAsIHRoZW4gYW55IHN1YnNlcXVlbnQgc3RhdGUuXG4gICAqXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIG9mIGEgYm9vbGVhbiB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHVwZGF0ZSBjb21wbGV0ZWRcbiAgICogICAgIHdpdGhvdXQgdHJpZ2dlcmluZyBhbm90aGVyIHVwZGF0ZS5cbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIGdldCB1cGRhdGVDb21wbGV0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRVcGRhdGVDb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHBvaW50IGZvciB0aGUgYHVwZGF0ZUNvbXBsZXRlYCBwcm9taXNlLlxuICAgKlxuICAgKiBJdCBpcyBub3Qgc2FmZSB0byBvdmVycmlkZSB0aGUgYHVwZGF0ZUNvbXBsZXRlYCBnZXR0ZXIgZGlyZWN0bHkgZHVlIHRvIGFcbiAgICogbGltaXRhdGlvbiBpbiBUeXBlU2NyaXB0IHdoaWNoIG1lYW5zIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYWxsIGFcbiAgICogc3VwZXJjbGFzcyBnZXR0ZXIgKGUuZy4gYHN1cGVyLnVwZGF0ZUNvbXBsZXRlLnRoZW4oLi4uKWApIHdoZW4gdGhlIHRhcmdldFxuICAgKiBsYW5ndWFnZSBpcyBFUzUgKGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMzM4KS5cbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gaW5zdGVhZC4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGNsYXNzIE15RWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuICAgKiAgIG92ZXJyaWRlIGFzeW5jIGdldFVwZGF0ZUNvbXBsZXRlKCkge1xuICAgKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3VwZXIuZ2V0VXBkYXRlQ29tcGxldGUoKTtcbiAgICogICAgIGF3YWl0IHRoaXMuX215Q2hpbGQudXBkYXRlQ29tcGxldGU7XG4gICAqICAgICByZXR1cm4gcmVzdWx0O1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQHJldHVybiBBIHByb21pc2Ugb2YgYSBib29sZWFuIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgdXBkYXRlIGNvbXBsZXRlZFxuICAgKiAgICAgd2l0aG91dCB0cmlnZ2VyaW5nIGFub3RoZXIgdXBkYXRlLlxuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldFVwZGF0ZUNvbXBsZXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9fdXBkYXRlUHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIG9yIG5vdCBgdXBkYXRlKClgIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCByZXF1ZXN0c1xuICAgKiBhbiB1cGRhdGUuIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIGB0cnVlYCwgYnV0IHRoaXMgY2FuIGJlXG4gICAqIGN1c3RvbWl6ZWQgdG8gY29udHJvbCB3aGVuIHRvIHVwZGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHNob3VsZFVwZGF0ZShfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZWxlbWVudC4gVGhpcyBtZXRob2QgcmVmbGVjdHMgcHJvcGVydHkgdmFsdWVzIHRvIGF0dHJpYnV0ZXMuXG4gICAqIEl0IGNhbiBiZSBvdmVycmlkZGVuIHRvIHJlbmRlciBhbmQga2VlcCB1cGRhdGVkIGVsZW1lbnQgRE9NLlxuICAgKiBTZXR0aW5nIHByb3BlcnRpZXMgaW5zaWRlIHRoaXMgbWV0aG9kIHdpbGwgKm5vdCogdHJpZ2dlclxuICAgKiBhbm90aGVyIHVwZGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZShfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKSB7XG4gICAgLy8gVGhlIGZvckVhY2goKSBleHByZXNzaW9uIHdpbGwgb25seSBydW4gd2hlbiB3aGVuIF9fcmVmbGVjdGluZ1Byb3BlcnRpZXMgaXNcbiAgICAvLyBkZWZpbmVkLCBhbmQgaXQgcmV0dXJucyB1bmRlZmluZWQsIHNldHRpbmcgX19yZWZsZWN0aW5nUHJvcGVydGllcyB0b1xuICAgIC8vIHVuZGVmaW5lZFxuICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydGllcyAmJj0gdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0aWVzLmZvckVhY2goKHApID0+XG4gICAgICB0aGlzLl9fcHJvcGVydHlUb0F0dHJpYnV0ZShwLCB0aGlzW3AgYXMga2V5b2YgdGhpc10pXG4gICAgKSBhcyB1bmRlZmluZWQ7XG4gICAgdGhpcy5fX21hcmtVcGRhdGVkKCk7XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuZXZlciB0aGUgZWxlbWVudCBpcyB1cGRhdGVkLiBJbXBsZW1lbnQgdG8gcGVyZm9ybVxuICAgKiBwb3N0LXVwZGF0aW5nIHRhc2tzIHZpYSBET00gQVBJcywgZm9yIGV4YW1wbGUsIGZvY3VzaW5nIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIFNldHRpbmcgcHJvcGVydGllcyBpbnNpZGUgdGhpcyBtZXRob2Qgd2lsbCB0cmlnZ2VyIHRoZSBlbGVtZW50IHRvIHVwZGF0ZVxuICAgKiBhZ2FpbiBhZnRlciB0aGlzIHVwZGF0ZSBjeWNsZSBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBfY2hhbmdlZFByb3BlcnRpZXMgTWFwIG9mIGNoYW5nZWQgcHJvcGVydGllcyB3aXRoIG9sZCB2YWx1ZXNcbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCB1cGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpIHt9XG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBmaXJzdCB1cGRhdGVkLiBJbXBsZW1lbnQgdG8gcGVyZm9ybSBvbmUgdGltZVxuICAgKiB3b3JrIG9uIHRoZSBlbGVtZW50IGFmdGVyIHVwZGF0ZS5cbiAgICpcbiAgICogYGBgdHNcbiAgICogZmlyc3RVcGRhdGVkKCkge1xuICAgKiAgIHRoaXMucmVuZGVyUm9vdC5nZXRFbGVtZW50QnlJZCgnbXktdGV4dC1hcmVhJykuZm9jdXMoKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogU2V0dGluZyBwcm9wZXJ0aWVzIGluc2lkZSB0aGlzIG1ldGhvZCB3aWxsIHRyaWdnZXIgdGhlIGVsZW1lbnQgdG8gdXBkYXRlXG4gICAqIGFnYWluIGFmdGVyIHRoaXMgdXBkYXRlIGN5Y2xlIGNvbXBsZXRlcy5cbiAgICpcbiAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKSB7fVxufVxuLy8gQXNzaWduZWQgaGVyZSB0byB3b3JrIGFyb3VuZCBhIGpzY29tcGlsZXIgYnVnIHdpdGggc3RhdGljIGZpZWxkc1xuLy8gd2hlbiBjb21waWxpbmcgdG8gRVM1LlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWNvbXBpbGVyL2lzc3Vlcy8zMTc3XG4oUmVhY3RpdmVFbGVtZW50IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW1xuICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdlbGVtZW50UHJvcGVydGllcycsIFJlYWN0aXZlRWxlbWVudClcbl0gPSBuZXcgTWFwKCk7XG4oUmVhY3RpdmVFbGVtZW50IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW1xuICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdmaW5hbGl6ZWQnLCBSZWFjdGl2ZUVsZW1lbnQpXG5dID0gbmV3IE1hcCgpO1xuXG4vLyBBcHBseSBwb2x5ZmlsbHMgaWYgYXZhaWxhYmxlXG5wb2x5ZmlsbFN1cHBvcnQ/Lih7UmVhY3RpdmVFbGVtZW50fSk7XG5cbi8vIERldiBtb2RlIHdhcm5pbmdzLi4uXG5pZiAoREVWX01PREUpIHtcbiAgLy8gRGVmYXVsdCB3YXJuaW5nIHNldC5cbiAgUmVhY3RpdmVFbGVtZW50LmVuYWJsZWRXYXJuaW5ncyA9IFtcbiAgICAnY2hhbmdlLWluLXVwZGF0ZScsXG4gICAgJ2FzeW5jLXBlcmZvcm0tdXBkYXRlJyxcbiAgXTtcbiAgY29uc3QgZW5zdXJlT3duV2FybmluZ3MgPSBmdW5jdGlvbiAoY3RvcjogdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkge1xuICAgIGlmIChcbiAgICAgICFjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2VuYWJsZWRXYXJuaW5ncycsIGN0b3IpKVxuICAgICkge1xuICAgICAgY3Rvci5lbmFibGVkV2FybmluZ3MgPSBjdG9yLmVuYWJsZWRXYXJuaW5ncyEuc2xpY2UoKTtcbiAgICB9XG4gIH07XG4gIFJlYWN0aXZlRWxlbWVudC5lbmFibGVXYXJuaW5nID0gZnVuY3Rpb24gKFxuICAgIHRoaXM6IHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQsXG4gICAgd2FybmluZzogV2FybmluZ0tpbmRcbiAgKSB7XG4gICAgZW5zdXJlT3duV2FybmluZ3ModGhpcyk7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWRXYXJuaW5ncyEuaW5jbHVkZXMod2FybmluZykpIHtcbiAgICAgIHRoaXMuZW5hYmxlZFdhcm5pbmdzIS5wdXNoKHdhcm5pbmcpO1xuICAgIH1cbiAgfTtcbiAgUmVhY3RpdmVFbGVtZW50LmRpc2FibGVXYXJuaW5nID0gZnVuY3Rpb24gKFxuICAgIHRoaXM6IHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQsXG4gICAgd2FybmluZzogV2FybmluZ0tpbmRcbiAgKSB7XG4gICAgZW5zdXJlT3duV2FybmluZ3ModGhpcyk7XG4gICAgY29uc3QgaSA9IHRoaXMuZW5hYmxlZFdhcm5pbmdzIS5pbmRleE9mKHdhcm5pbmcpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuZW5hYmxlZFdhcm5pbmdzIS5zcGxpY2UoaSwgMSk7XG4gICAgfVxuICB9O1xufVxuXG4vLyBJTVBPUlRBTlQ6IGRvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnR5IG5hbWUgb3IgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbi5cbi8vIFRoaXMgbGluZSB3aWxsIGJlIHVzZWQgaW4gcmVnZXhlcyB0byBzZWFyY2ggZm9yIFJlYWN0aXZlRWxlbWVudCB1c2FnZS5cbihnbG9iYWwucmVhY3RpdmVFbGVtZW50VmVyc2lvbnMgPz89IFtdKS5wdXNoKCcyLjAuNCcpO1xuaWYgKERFVl9NT0RFICYmIGdsb2JhbC5yZWFjdGl2ZUVsZW1lbnRWZXJzaW9ucy5sZW5ndGggPiAxKSB7XG4gIGlzc3VlV2FybmluZyEoXG4gICAgJ211bHRpcGxlLXZlcnNpb25zJyxcbiAgICBgTXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0IGxvYWRlZC4gTG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBgICtcbiAgICAgIGBpcyBub3QgcmVjb21tZW5kZWQuYFxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG4vLyBJTVBPUlRBTlQ6IHRoZXNlIGltcG9ydHMgbXVzdCBiZSB0eXBlLW9ubHlcbmltcG9ydCB0eXBlIHtEaXJlY3RpdmUsIERpcmVjdGl2ZVJlc3VsdCwgUGFydEluZm99IGZyb20gJy4vZGlyZWN0aXZlLmpzJztcbmltcG9ydCB0eXBlIHtUcnVzdGVkSFRNTCwgVHJ1c3RlZFR5cGVzV2luZG93fSBmcm9tICd0cnVzdGVkLXR5cGVzL2xpYic7XG5cbmNvbnN0IERFVl9NT0RFID0gdHJ1ZTtcbmNvbnN0IEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUyA9IHRydWU7XG5jb25zdCBFTkFCTEVfU0hBRFlET01fTk9QQVRDSCA9IHRydWU7XG5jb25zdCBOT0RFX01PREUgPSBmYWxzZTtcblxuLy8gQWxsb3dzIG1pbmlmaWVycyB0byByZW5hbWUgcmVmZXJlbmNlcyB0byBnbG9iYWxUaGlzXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzO1xuXG4vKipcbiAqIENvbnRhaW5zIHR5cGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHVuc3RhYmxlIGRlYnVnIEFQSS5cbiAqXG4gKiBFdmVyeXRoaW5nIGluIHRoaXMgQVBJIGlzIG5vdCBzdGFibGUgYW5kIG1heSBjaGFuZ2Ugb3IgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLFxuICogZXZlbiBvbiBwYXRjaCByZWxlYXNlcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbmV4cG9ydCBuYW1lc3BhY2UgTGl0VW5zdGFibGUge1xuICAvKipcbiAgICogV2hlbiBMaXQgaXMgcnVubmluZyBpbiBkZXYgbW9kZSBhbmQgYHdpbmRvdy5lbWl0TGl0RGVidWdMb2dFdmVudHNgIGlzIHRydWUsXG4gICAqIHdlIHdpbGwgZW1pdCAnbGl0LWRlYnVnJyBldmVudHMgdG8gd2luZG93LCB3aXRoIGxpdmUgZGV0YWlscyBhYm91dCB0aGUgdXBkYXRlIGFuZCByZW5kZXJcbiAgICogbGlmZWN5Y2xlLiBUaGVzZSBjYW4gYmUgdXNlZnVsIGZvciB3cml0aW5nIGRlYnVnIHRvb2xpbmcgYW5kIHZpc3VhbGl6YXRpb25zLlxuICAgKlxuICAgKiBQbGVhc2UgYmUgYXdhcmUgdGhhdCBydW5uaW5nIHdpdGggd2luZG93LmVtaXRMaXREZWJ1Z0xvZ0V2ZW50cyBoYXMgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQsXG4gICAqIG1ha2luZyBjZXJ0YWluIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm9ybWFsbHkgdmVyeSBjaGVhcCAobGlrZSBhIG5vLW9wIHJlbmRlcikgbXVjaCBzbG93ZXIsXG4gICAqIGJlY2F1c2Ugd2UgbXVzdCBjb3B5IGRhdGEgYW5kIGRpc3BhdGNoIGV2ZW50cy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG4gIGV4cG9ydCBuYW1lc3BhY2UgRGVidWdMb2cge1xuICAgIGV4cG9ydCB0eXBlIEVudHJ5ID1cbiAgICAgIHwgVGVtcGxhdGVQcmVwXG4gICAgICB8IFRlbXBsYXRlSW5zdGFudGlhdGVkXG4gICAgICB8IFRlbXBsYXRlSW5zdGFudGlhdGVkQW5kVXBkYXRlZFxuICAgICAgfCBUZW1wbGF0ZVVwZGF0aW5nXG4gICAgICB8IEJlZ2luUmVuZGVyXG4gICAgICB8IEVuZFJlbmRlclxuICAgICAgfCBDb21taXRQYXJ0RW50cnlcbiAgICAgIHwgU2V0UGFydFZhbHVlO1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVQcmVwIHtcbiAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBwcmVwJztcbiAgICAgIHRlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgICAgIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5O1xuICAgICAgY2xvbmFibGVUZW1wbGF0ZTogSFRNTFRlbXBsYXRlRWxlbWVudDtcbiAgICAgIHBhcnRzOiBUZW1wbGF0ZVBhcnRbXTtcbiAgICB9XG4gICAgZXhwb3J0IGludGVyZmFjZSBCZWdpblJlbmRlciB7XG4gICAgICBraW5kOiAnYmVnaW4gcmVuZGVyJztcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB2YWx1ZTogdW5rbm93bjtcbiAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50O1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIHBhcnQ6IENoaWxkUGFydCB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZXhwb3J0IGludGVyZmFjZSBFbmRSZW5kZXIge1xuICAgICAga2luZDogJ2VuZCByZW5kZXInO1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgICAgcGFydDogQ2hpbGRQYXJ0O1xuICAgIH1cbiAgICBleHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlSW5zdGFudGlhdGVkIHtcbiAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQnO1xuICAgICAgdGVtcGxhdGU6IFRlbXBsYXRlIHwgQ29tcGlsZWRUZW1wbGF0ZTtcbiAgICAgIGluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIGZyYWdtZW50OiBOb2RlO1xuICAgICAgcGFydHM6IEFycmF5PFBhcnQgfCB1bmRlZmluZWQ+O1xuICAgICAgdmFsdWVzOiB1bmtub3duW107XG4gICAgfVxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVJbnN0YW50aWF0ZWRBbmRVcGRhdGVkIHtcbiAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQgYW5kIHVwZGF0ZWQnO1xuICAgICAgdGVtcGxhdGU6IFRlbXBsYXRlIHwgQ29tcGlsZWRUZW1wbGF0ZTtcbiAgICAgIGluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIGZyYWdtZW50OiBOb2RlO1xuICAgICAgcGFydHM6IEFycmF5PFBhcnQgfCB1bmRlZmluZWQ+O1xuICAgICAgdmFsdWVzOiB1bmtub3duW107XG4gICAgfVxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVVcGRhdGluZyB7XG4gICAgICBraW5kOiAndGVtcGxhdGUgdXBkYXRpbmcnO1xuICAgICAgdGVtcGxhdGU6IFRlbXBsYXRlIHwgQ29tcGlsZWRUZW1wbGF0ZTtcbiAgICAgIGluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIHBhcnRzOiBBcnJheTxQYXJ0IHwgdW5kZWZpbmVkPjtcbiAgICAgIHZhbHVlczogdW5rbm93bltdO1xuICAgIH1cbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldFBhcnRWYWx1ZSB7XG4gICAgICBraW5kOiAnc2V0IHBhcnQnO1xuICAgICAgcGFydDogUGFydDtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgdmFsdWVJbmRleDogbnVtYmVyO1xuICAgICAgdmFsdWVzOiB1bmtub3duW107XG4gICAgICB0ZW1wbGF0ZUluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgIH1cblxuICAgIGV4cG9ydCB0eXBlIENvbW1pdFBhcnRFbnRyeSA9XG4gICAgICB8IENvbW1pdE5vdGhpbmdUb0NoaWxkRW50cnlcbiAgICAgIHwgQ29tbWl0VGV4dFxuICAgICAgfCBDb21taXROb2RlXG4gICAgICB8IENvbW1pdEF0dHJpYnV0ZVxuICAgICAgfCBDb21taXRQcm9wZXJ0eVxuICAgICAgfCBDb21taXRCb29sZWFuQXR0cmlidXRlXG4gICAgICB8IENvbW1pdEV2ZW50TGlzdGVuZXJcbiAgICAgIHwgQ29tbWl0VG9FbGVtZW50QmluZGluZztcblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0Tm90aGluZ1RvQ2hpbGRFbnRyeSB7XG4gICAgICBraW5kOiAnY29tbWl0IG5vdGhpbmcgdG8gY2hpbGQnO1xuICAgICAgc3RhcnQ6IENoaWxkTm9kZTtcbiAgICAgIGVuZDogQ2hpbGROb2RlIHwgbnVsbDtcbiAgICAgIHBhcmVudDogRGlzY29ubmVjdGFibGUgfCB1bmRlZmluZWQ7XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0VGV4dCB7XG4gICAgICBraW5kOiAnY29tbWl0IHRleHQnO1xuICAgICAgbm9kZTogVGV4dDtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbW1pdE5vZGUge1xuICAgICAga2luZDogJ2NvbW1pdCBub2RlJztcbiAgICAgIHN0YXJ0OiBOb2RlO1xuICAgICAgcGFyZW50OiBEaXNjb25uZWN0YWJsZSB8IHVuZGVmaW5lZDtcbiAgICAgIHZhbHVlOiBOb2RlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbW1pdEF0dHJpYnV0ZSB7XG4gICAgICBraW5kOiAnY29tbWl0IGF0dHJpYnV0ZSc7XG4gICAgICBlbGVtZW50OiBFbGVtZW50O1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgdmFsdWU6IHVua25vd247XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0UHJvcGVydHkge1xuICAgICAga2luZDogJ2NvbW1pdCBwcm9wZXJ0eSc7XG4gICAgICBlbGVtZW50OiBFbGVtZW50O1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgdmFsdWU6IHVua25vd247XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0Qm9vbGVhbkF0dHJpYnV0ZSB7XG4gICAgICBraW5kOiAnY29tbWl0IGJvb2xlYW4gYXR0cmlidXRlJztcbiAgICAgIGVsZW1lbnQ6IEVsZW1lbnQ7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICB2YWx1ZTogYm9vbGVhbjtcbiAgICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb21taXRFdmVudExpc3RlbmVyIHtcbiAgICAgIGtpbmQ6ICdjb21taXQgZXZlbnQgbGlzdGVuZXInO1xuICAgICAgZWxlbWVudDogRWxlbWVudDtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgb2xkTGlzdGVuZXI6IHVua25vd247XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgICAgLy8gVHJ1ZSBpZiB3ZSdyZSByZW1vdmluZyB0aGUgb2xkIGV2ZW50IGxpc3RlbmVyIChlLmcuIGJlY2F1c2Ugc2V0dGluZ3MgY2hhbmdlZCwgb3IgdmFsdWUgaXMgbm90aGluZylcbiAgICAgIHJlbW92ZUxpc3RlbmVyOiBib29sZWFuO1xuICAgICAgLy8gVHJ1ZSBpZiB3ZSdyZSBhZGRpbmcgYSBuZXcgZXZlbnQgbGlzdGVuZXIgKGUuZy4gYmVjYXVzZSBmaXJzdCByZW5kZXIsIG9yIHNldHRpbmdzIGNoYW5nZWQpXG4gICAgICBhZGRMaXN0ZW5lcjogYm9vbGVhbjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbW1pdFRvRWxlbWVudEJpbmRpbmcge1xuICAgICAga2luZDogJ2NvbW1pdCB0byBlbGVtZW50IGJpbmRpbmcnO1xuICAgICAgZWxlbWVudDogRWxlbWVudDtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIERlYnVnTG9nZ2luZ1dpbmRvdyB7XG4gIC8vIEV2ZW4gaW4gZGV2IG1vZGUsIHdlIGdlbmVyYWxseSBkb24ndCB3YW50IHRvIGVtaXQgdGhlc2UgZXZlbnRzLCBhcyB0aGF0J3NcbiAgLy8gYW5vdGhlciBsZXZlbCBvZiBjb3N0LCBzbyBvbmx5IGVtaXQgdGhlbSB3aGVuIERFVl9NT0RFIGlzIHRydWUgX2FuZF8gd2hlblxuICAvLyB3aW5kb3cuZW1pdExpdERlYnVnRXZlbnRzIGlzIHRydWUuXG4gIGVtaXRMaXREZWJ1Z0xvZ0V2ZW50cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVXNlZnVsIGZvciB2aXN1YWxpemluZyBhbmQgbG9nZ2luZyBpbnNpZ2h0cyBpbnRvIHdoYXQgdGhlIExpdCB0ZW1wbGF0ZSBzeXN0ZW0gaXMgZG9pbmcuXG4gKlxuICogQ29tcGlsZWQgb3V0IG9mIHByb2QgbW9kZSBidWlsZHMuXG4gKi9cbmNvbnN0IGRlYnVnTG9nRXZlbnQgPSBERVZfTU9ERVxuICA/IChldmVudDogTGl0VW5zdGFibGUuRGVidWdMb2cuRW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEVtaXQgPSAoZ2xvYmFsIGFzIHVua25vd24gYXMgRGVidWdMb2dnaW5nV2luZG93KVxuICAgICAgICAuZW1pdExpdERlYnVnTG9nRXZlbnRzO1xuICAgICAgaWYgKCFzaG91bGRFbWl0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGdsb2JhbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8TGl0VW5zdGFibGUuRGVidWdMb2cuRW50cnk+KCdsaXQtZGVidWcnLCB7XG4gICAgICAgICAgZGV0YWlsOiBldmVudCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICA6IHVuZGVmaW5lZDtcbi8vIFVzZWQgZm9yIGNvbm5lY3RpbmcgYmVnaW5SZW5kZXIgYW5kIGVuZFJlbmRlciBldmVudHMgd2hlbiB0aGVyZSBhcmUgbmVzdGVkXG4vLyByZW5kZXJzIHdoZW4gZXJyb3JzIGFyZSB0aHJvd24gcHJldmVudGluZyBhbiBlbmRSZW5kZXIgZXZlbnQgZnJvbSBiZWluZ1xuLy8gY2FsbGVkLlxubGV0IGRlYnVnTG9nUmVuZGVySWQgPSAwO1xuXG5sZXQgaXNzdWVXYXJuaW5nOiAoY29kZTogc3RyaW5nLCB3YXJuaW5nOiBzdHJpbmcpID0+IHZvaWQ7XG5cbmlmIChERVZfTU9ERSkge1xuICBnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MgPz89IG5ldyBTZXQoKTtcblxuICAvLyBJc3N1ZSBhIHdhcm5pbmcsIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeS5cbiAgaXNzdWVXYXJuaW5nID0gKGNvZGU6IHN0cmluZywgd2FybmluZzogc3RyaW5nKSA9PiB7XG4gICAgd2FybmluZyArPSBjb2RlXG4gICAgICA/IGAgU2VlIGh0dHBzOi8vbGl0LmRldi9tc2cvJHtjb2RlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gXG4gICAgICA6ICcnO1xuICAgIGlmICghZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzIS5oYXMod2FybmluZykpIHtcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgIGdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncyEuYWRkKHdhcm5pbmcpO1xuICAgIH1cbiAgfTtcblxuICBpc3N1ZVdhcm5pbmcoXG4gICAgJ2Rldi1tb2RlJyxcbiAgICBgTGl0IGlzIGluIGRldiBtb2RlLiBOb3QgcmVjb21tZW5kZWQgZm9yIHByb2R1Y3Rpb24hYFxuICApO1xufVxuXG5jb25zdCB3cmFwID1cbiAgRU5BQkxFX1NIQURZRE9NX05PUEFUQ0ggJiZcbiAgZ2xvYmFsLlNoYWR5RE9NPy5pblVzZSAmJlxuICBnbG9iYWwuU2hhZHlET00/Lm5vUGF0Y2ggPT09IHRydWVcbiAgICA/IChnbG9iYWwuU2hhZHlET00hLndyYXAgYXMgPFQgZXh0ZW5kcyBOb2RlPihub2RlOiBUKSA9PiBUKVxuICAgIDogPFQgZXh0ZW5kcyBOb2RlPihub2RlOiBUKSA9PiBub2RlO1xuXG5jb25zdCB0cnVzdGVkVHlwZXMgPSAoZ2xvYmFsIGFzIHVua25vd24gYXMgVHJ1c3RlZFR5cGVzV2luZG93KS50cnVzdGVkVHlwZXM7XG5cbi8qKlxuICogT3VyIFRydXN0ZWRUeXBlUG9saWN5IGZvciBIVE1MIHdoaWNoIGlzIGRlY2xhcmVkIHVzaW5nIHRoZSBodG1sIHRlbXBsYXRlXG4gKiB0YWcgZnVuY3Rpb24uXG4gKlxuICogVGhhdCBIVE1MIGlzIGEgZGV2ZWxvcGVyLWF1dGhvcmVkIGNvbnN0YW50LCBhbmQgaXMgcGFyc2VkIHdpdGggaW5uZXJIVE1MXG4gKiBiZWZvcmUgYW55IHVudHJ1c3RlZCBleHByZXNzaW9ucyBoYXZlIGJlZW4gbWl4ZWQgaW4uIFRoZXJlZm9yIGl0IGlzXG4gKiBjb25zaWRlcmVkIHNhZmUgYnkgY29uc3RydWN0aW9uLlxuICovXG5jb25zdCBwb2xpY3kgPSB0cnVzdGVkVHlwZXNcbiAgPyB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KCdsaXQtaHRtbCcsIHtcbiAgICAgIGNyZWF0ZUhUTUw6IChzKSA9PiBzLFxuICAgIH0pXG4gIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFVzZWQgdG8gc2FuaXRpemUgYW55IHZhbHVlIGJlZm9yZSBpdCBpcyB3cml0dGVuIGludG8gdGhlIERPTS4gVGhpcyBjYW4gYmVcbiAqIHVzZWQgdG8gaW1wbGVtZW50IGEgc2VjdXJpdHkgcG9saWN5IG9mIGFsbG93ZWQgYW5kIGRpc2FsbG93ZWQgdmFsdWVzIGluXG4gKiBvcmRlciB0byBwcmV2ZW50IFhTUyBhdHRhY2tzLlxuICpcbiAqIE9uZSB3YXkgb2YgdXNpbmcgdGhpcyBjYWxsYmFjayB3b3VsZCBiZSB0byBjaGVjayBhdHRyaWJ1dGVzIGFuZCBwcm9wZXJ0aWVzXG4gKiBhZ2FpbnN0IGEgbGlzdCBvZiBoaWdoIHJpc2sgZmllbGRzLCBhbmQgcmVxdWlyZSB0aGF0IHZhbHVlcyB3cml0dGVuIHRvIHN1Y2hcbiAqIGZpZWxkcyBiZSBpbnN0YW5jZXMgb2YgYSBjbGFzcyB3aGljaCBpcyBzYWZlIGJ5IGNvbnN0cnVjdGlvbi4gQ2xvc3VyZSdzIFNhZmVcbiAqIEhUTUwgVHlwZXMgaXMgb25lIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgdGVjaG5pcXVlIChcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvc2FmZS1odG1sLXR5cGVzL2Jsb2IvbWFzdGVyL2RvYy9zYWZlaHRtbC10eXBlcy5tZCkuXG4gKiBUaGUgVHJ1c3RlZFR5cGVzIHBvbHlmaWxsIGluIEFQSS1vbmx5IG1vZGUgY291bGQgYWxzbyBiZSB1c2VkIGFzIGEgYmFzaXNcbiAqIGZvciB0aGlzIHRlY2huaXF1ZSAoaHR0cHM6Ly9naXRodWIuY29tL1dJQ0cvdHJ1c3RlZC10eXBlcykuXG4gKlxuICogQHBhcmFtIG5vZGUgVGhlIEhUTUwgbm9kZSAodXN1YWxseSBlaXRoZXIgYSAjdGV4dCBub2RlIG9yIGFuIEVsZW1lbnQpIHRoYXRcbiAqICAgICBpcyBiZWluZyB3cml0dGVuIHRvLiBOb3RlIHRoYXQgdGhpcyBpcyBqdXN0IGFuIGV4ZW1wbGFyIG5vZGUsIHRoZSB3cml0ZVxuICogICAgIG1heSB0YWtlIHBsYWNlIGFnYWluc3QgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgc2FtZSBjbGFzcyBvZiBub2RlLlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIG9yIHByb3BlcnR5IChmb3IgZXhhbXBsZSwgJ2hyZWYnKS5cbiAqIEBwYXJhbSB0eXBlIEluZGljYXRlcyB3aGV0aGVyIHRoZSB3cml0ZSB0aGF0J3MgYWJvdXQgdG8gYmUgcGVyZm9ybWVkIHdpbGxcbiAqICAgICBiZSB0byBhIHByb3BlcnR5IG9yIGEgbm9kZS5cbiAqIEByZXR1cm4gQSBmdW5jdGlvbiB0aGF0IHdpbGwgc2FuaXRpemUgdGhpcyBjbGFzcyBvZiB3cml0ZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFNhbml0aXplckZhY3RvcnkgPSAoXG4gIG5vZGU6IE5vZGUsXG4gIG5hbWU6IHN0cmluZyxcbiAgdHlwZTogJ3Byb3BlcnR5JyB8ICdhdHRyaWJ1dGUnXG4pID0+IFZhbHVlU2FuaXRpemVyO1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gd2hpY2ggY2FuIHNhbml0aXplIHZhbHVlcyB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byBhIHNwZWNpZmljIGtpbmRcbiAqIG9mIERPTSBzaW5rLlxuICpcbiAqIFNlZSBTYW5pdGl6ZXJGYWN0b3J5LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2FuaXRpemUuIFdpbGwgYmUgdGhlIGFjdHVhbCB2YWx1ZSBwYXNzZWQgaW50b1xuICogICAgIHRoZSBsaXQtaHRtbCB0ZW1wbGF0ZSBsaXRlcmFsLCBzbyB0aGlzIGNvdWxkIGJlIG9mIGFueSB0eXBlLlxuICogQHJldHVybiBUaGUgdmFsdWUgdG8gd3JpdGUgdG8gdGhlIERPTS4gVXN1YWxseSB0aGUgc2FtZSBhcyB0aGUgaW5wdXQgdmFsdWUsXG4gKiAgICAgdW5sZXNzIHNhbml0aXphdGlvbiBpcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFZhbHVlU2FuaXRpemVyID0gKHZhbHVlOiB1bmtub3duKSA9PiB1bmtub3duO1xuXG5jb25zdCBpZGVudGl0eUZ1bmN0aW9uOiBWYWx1ZVNhbml0aXplciA9ICh2YWx1ZTogdW5rbm93bikgPT4gdmFsdWU7XG5jb25zdCBub29wU2FuaXRpemVyOiBTYW5pdGl6ZXJGYWN0b3J5ID0gKFxuICBfbm9kZTogTm9kZSxcbiAgX25hbWU6IHN0cmluZyxcbiAgX3R5cGU6ICdwcm9wZXJ0eScgfCAnYXR0cmlidXRlJ1xuKSA9PiBpZGVudGl0eUZ1bmN0aW9uO1xuXG4vKiogU2V0cyB0aGUgZ2xvYmFsIHNhbml0aXplciBmYWN0b3J5LiAqL1xuY29uc3Qgc2V0U2FuaXRpemVyID0gKG5ld1Nhbml0aXplcjogU2FuaXRpemVyRmFjdG9yeSkgPT4ge1xuICBpZiAoIUVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoc2FuaXRpemVyRmFjdG9yeUludGVybmFsICE9PSBub29wU2FuaXRpemVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEF0dGVtcHRlZCB0byBvdmVyd3JpdGUgZXhpc3RpbmcgbGl0LWh0bWwgc2VjdXJpdHkgcG9saWN5LmAgK1xuICAgICAgICBgIHNldFNhbml0aXplRE9NVmFsdWVGYWN0b3J5IHNob3VsZCBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlLmBcbiAgICApO1xuICB9XG4gIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCA9IG5ld1Nhbml0aXplcjtcbn07XG5cbi8qKlxuICogT25seSB1c2VkIGluIGludGVybmFsIHRlc3RzLCBub3QgYSBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLlxuICovXG5jb25zdCBfdGVzdE9ubHlDbGVhclNhbml0aXplckZhY3RvcnlEb05vdENhbGxPckVsc2UgPSAoKSA9PiB7XG4gIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCA9IG5vb3BTYW5pdGl6ZXI7XG59O1xuXG5jb25zdCBjcmVhdGVTYW5pdGl6ZXI6IFNhbml0aXplckZhY3RvcnkgPSAobm9kZSwgbmFtZSwgdHlwZSkgPT4ge1xuICByZXR1cm4gc2FuaXRpemVyRmFjdG9yeUludGVybmFsKG5vZGUsIG5hbWUsIHR5cGUpO1xufTtcblxuLy8gQWRkZWQgdG8gYW4gYXR0cmlidXRlIG5hbWUgdG8gbWFyayB0aGUgYXR0cmlidXRlIGFzIGJvdW5kIHNvIHdlIGNhbiBmaW5kXG4vLyBpdCBlYXNpbHkuXG5jb25zdCBib3VuZEF0dHJpYnV0ZVN1ZmZpeCA9ICckbGl0JCc7XG5cbi8vIFRoaXMgbWFya2VyIGlzIHVzZWQgaW4gbWFueSBzeW50YWN0aWMgcG9zaXRpb25zIGluIEhUTUwsIHNvIGl0IG11c3QgYmVcbi8vIGEgdmFsaWQgZWxlbWVudCBuYW1lIGFuZCBhdHRyaWJ1dGUgbmFtZS4gV2UgZG9uJ3Qgc3VwcG9ydCBkeW5hbWljIG5hbWVzICh5ZXQpXG4vLyBidXQgdGhpcyBhdCBsZWFzdCBlbnN1cmVzIHRoYXQgdGhlIHBhcnNlIHRyZWUgaXMgY2xvc2VyIHRvIHRoZSB0ZW1wbGF0ZVxuLy8gaW50ZW50aW9uLlxuY29uc3QgbWFya2VyID0gYGxpdCQke01hdGgucmFuZG9tKCkudG9GaXhlZCg5KS5zbGljZSgyKX0kYDtcblxuLy8gU3RyaW5nIHVzZWQgdG8gdGVsbCBpZiBhIGNvbW1lbnQgaXMgYSBtYXJrZXIgY29tbWVudFxuY29uc3QgbWFya2VyTWF0Y2ggPSAnPycgKyBtYXJrZXI7XG5cbi8vIFRleHQgdXNlZCB0byBpbnNlcnQgYSBjb21tZW50IG1hcmtlciBub2RlLiBXZSB1c2UgcHJvY2Vzc2luZyBpbnN0cnVjdGlvblxuLy8gc3ludGF4IGJlY2F1c2UgaXQncyBzbGlnaHRseSBzbWFsbGVyLCBidXQgcGFyc2VzIGFzIGEgY29tbWVudCBub2RlLlxuY29uc3Qgbm9kZU1hcmtlciA9IGA8JHttYXJrZXJNYXRjaH0+YDtcblxuY29uc3QgZCA9XG4gIE5PREVfTU9ERSAmJiBnbG9iYWwuZG9jdW1lbnQgPT09IHVuZGVmaW5lZFxuICAgID8gKHtcbiAgICAgICAgY3JlYXRlVHJlZVdhbGtlcigpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH0sXG4gICAgICB9IGFzIHVua25vd24gYXMgRG9jdW1lbnQpXG4gICAgOiBkb2N1bWVudDtcblxuLy8gQ3JlYXRlcyBhIGR5bmFtaWMgbWFya2VyLiBXZSBuZXZlciBoYXZlIHRvIHNlYXJjaCBmb3IgdGhlc2UgaW4gdGhlIERPTS5cbmNvbnN0IGNyZWF0ZU1hcmtlciA9ICgpID0+IGQuY3JlYXRlQ29tbWVudCgnJyk7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGVvZi1vcGVyYXRvclxudHlwZSBQcmltaXRpdmUgPSBudWxsIHwgdW5kZWZpbmVkIHwgYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZyB8IHN5bWJvbCB8IGJpZ2ludDtcbmNvbnN0IGlzUHJpbWl0aXZlID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJpbWl0aXZlID0+XG4gIHZhbHVlID09PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgIT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlICE9ICdmdW5jdGlvbicpO1xuY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5jb25zdCBpc0l0ZXJhYmxlID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgSXRlcmFibGU8dW5rbm93bj4gPT5cbiAgaXNBcnJheSh2YWx1ZSkgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgdHlwZW9mICh2YWx1ZSBhcyBhbnkpPy5bU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcblxuY29uc3QgU1BBQ0VfQ0hBUiA9IGBbIFxcdFxcblxcZlxccl1gO1xuY29uc3QgQVRUUl9WQUxVRV9DSEFSID0gYFteIFxcdFxcblxcZlxcclwiJ1xcYDw+PV1gO1xuY29uc3QgTkFNRV9DSEFSID0gYFteXFxcXHNcIic+PS9dYDtcblxuLy8gVGhlc2UgcmVnZXhlcyByZXByZXNlbnQgdGhlIGZpdmUgcGFyc2luZyBzdGF0ZXMgdGhhdCB3ZSBjYXJlIGFib3V0IGluIHRoZVxuLy8gVGVtcGxhdGUncyBIVE1MIHNjYW5uZXIuIFRoZXkgbWF0Y2ggdGhlICplbmQqIG9mIHRoZSBzdGF0ZSB0aGV5J3JlIG5hbWVkXG4vLyBhZnRlci5cbi8vIERlcGVuZGluZyBvbiB0aGUgbWF0Y2gsIHdlIHRyYW5zaXRpb24gdG8gYSBuZXcgc3RhdGUuIElmIHRoZXJlJ3Mgbm8gbWF0Y2gsXG4vLyB3ZSBzdGF5IGluIHRoZSBzYW1lIHN0YXRlLlxuLy8gTm90ZSB0aGF0IHRoZSByZWdleGVzIGFyZSBzdGF0ZWZ1bC4gV2UgdXRpbGl6ZSBsYXN0SW5kZXggYW5kIHN5bmMgaXRcbi8vIGFjcm9zcyB0aGUgbXVsdGlwbGUgcmVnZXhlcyB1c2VkLiBJbiBhZGRpdGlvbiB0byB0aGUgZml2ZSByZWdleGVzIGJlbG93XG4vLyB3ZSBhbHNvIGR5bmFtaWNhbGx5IGNyZWF0ZSBhIHJlZ2V4IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVuZCB0YWdzIGZvciByYXdcbi8vIHRleHQgZWxlbWVudHMuXG5cbi8qKlxuICogRW5kIG9mIHRleHQgaXM6IGA8YCBmb2xsb3dlZCBieTpcbiAqICAgKGNvbW1lbnQgc3RhcnQpIG9yICh0YWcpIG9yIChkeW5hbWljIHRhZyBiaW5kaW5nKVxuICovXG5jb25zdCB0ZXh0RW5kUmVnZXggPSAvPCg/OighLS18XFwvW15hLXpBLVpdKXwoXFwvP1thLXpBLVpdW14+XFxzXSopfChcXC8/JCkpL2c7XG5jb25zdCBDT01NRU5UX1NUQVJUID0gMTtcbmNvbnN0IFRBR19OQU1FID0gMjtcbmNvbnN0IERZTkFNSUNfVEFHX05BTUUgPSAzO1xuXG5jb25zdCBjb21tZW50RW5kUmVnZXggPSAvLS0+L2c7XG4vKipcbiAqIENvbW1lbnRzIG5vdCBzdGFydGVkIHdpdGggPCEtLSwgbGlrZSA8L3ssIGNhbiBiZSBlbmRlZCBieSBhIHNpbmdsZSBgPmBcbiAqL1xuY29uc3QgY29tbWVudDJFbmRSZWdleCA9IC8+L2c7XG5cbi8qKlxuICogVGhlIHRhZ0VuZCByZWdleCBtYXRjaGVzIHRoZSBlbmQgb2YgdGhlIFwiaW5zaWRlIGFuIG9wZW5pbmdcIiB0YWcgc3ludGF4XG4gKiBwb3NpdGlvbi4gSXQgZWl0aGVyIG1hdGNoZXMgYSBgPmAsIGFuIGF0dHJpYnV0ZS1saWtlIHNlcXVlbmNlLCBvciB0aGUgZW5kXG4gKiBvZiB0aGUgc3RyaW5nIGFmdGVyIGEgc3BhY2UgKGF0dHJpYnV0ZS1uYW1lIHBvc2l0aW9uIGVuZGluZykuXG4gKlxuICogU2VlIGF0dHJpYnV0ZXMgaW4gdGhlIEhUTUwgc3BlYzpcbiAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zeW50YXguaHRtbCNlbGVtZW50cy1hdHRyaWJ1dGVzXG4gKlxuICogXCIgXFx0XFxuXFxmXFxyXCIgYXJlIEhUTUwgc3BhY2UgY2hhcmFjdGVyczpcbiAqIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNhc2NpaS13aGl0ZXNwYWNlXG4gKlxuICogU28gYW4gYXR0cmlidXRlIGlzOlxuICogICogVGhlIG5hbWU6IGFueSBjaGFyYWN0ZXIgZXhjZXB0IGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIsIChcIiksICgnKSwgXCI+XCIsXG4gKiAgICBcIj1cIiwgb3IgXCIvXCIuIE5vdGU6IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIEhUTUwgc3BlYyB3aGljaCBhbHNvIGV4Y2x1ZGVzIGNvbnRyb2wgY2hhcmFjdGVycy5cbiAqICAqIEZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBzcGFjZSBjaGFyYWN0ZXJzXG4gKiAgKiBGb2xsb3dlZCBieSBcIj1cIlxuICogICogRm9sbG93ZWQgYnkgemVybyBvciBtb3JlIHNwYWNlIGNoYXJhY3RlcnNcbiAqICAqIEZvbGxvd2VkIGJ5OlxuICogICAgKiBBbnkgY2hhcmFjdGVyIGV4Y2VwdCBzcGFjZSwgKCcpLCAoXCIpLCBcIjxcIiwgXCI+XCIsIFwiPVwiLCAoYCksIG9yXG4gKiAgICAqIChcIikgdGhlbiBhbnkgbm9uLShcIiksIG9yXG4gKiAgICAqICgnKSB0aGVuIGFueSBub24tKCcpXG4gKi9cbmNvbnN0IHRhZ0VuZFJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgYD58JHtTUEFDRV9DSEFSfSg/Oigke05BTUVfQ0hBUn0rKSgke1NQQUNFX0NIQVJ9Kj0ke1NQQUNFX0NIQVJ9Kig/OiR7QVRUUl9WQUxVRV9DSEFSfXwoXCJ8Jyl8KSl8JClgLFxuICAnZydcbik7XG5jb25zdCBFTlRJUkVfTUFUQ0ggPSAwO1xuY29uc3QgQVRUUklCVVRFX05BTUUgPSAxO1xuY29uc3QgU1BBQ0VTX0FORF9FUVVBTFMgPSAyO1xuY29uc3QgUVVPVEVfQ0hBUiA9IDM7XG5cbmNvbnN0IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4ID0gLycvZztcbmNvbnN0IGRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4ID0gL1wiL2c7XG4vKipcbiAqIE1hdGNoZXMgdGhlIHJhdyB0ZXh0IGVsZW1lbnRzLlxuICpcbiAqIENvbW1lbnRzIGFyZSBub3QgcGFyc2VkIHdpdGhpbiByYXcgdGV4dCBlbGVtZW50cywgc28gd2UgbmVlZCB0byBzZWFyY2ggdGhlaXJcbiAqIHRleHQgY29udGVudCBmb3IgbWFya2VyIHN0cmluZ3MuXG4gKi9cbmNvbnN0IHJhd1RleHRFbGVtZW50ID0gL14oPzpzY3JpcHR8c3R5bGV8dGV4dGFyZWF8dGl0bGUpJC9pO1xuXG4vKiogVGVtcGxhdGVSZXN1bHQgdHlwZXMgKi9cbmNvbnN0IEhUTUxfUkVTVUxUID0gMTtcbmNvbnN0IFNWR19SRVNVTFQgPSAyO1xuY29uc3QgTUFUSE1MX1JFU1VMVCA9IDM7XG5cbnR5cGUgUmVzdWx0VHlwZSA9IHR5cGVvZiBIVE1MX1JFU1VMVCB8IHR5cGVvZiBTVkdfUkVTVUxUIHwgdHlwZW9mIE1BVEhNTF9SRVNVTFQ7XG5cbi8vIFRlbXBsYXRlUGFydCB0eXBlc1xuLy8gSU1QT1JUQU5UOiB0aGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gUGFydFR5cGVcbmNvbnN0IEFUVFJJQlVURV9QQVJUID0gMTtcbmNvbnN0IENISUxEX1BBUlQgPSAyO1xuY29uc3QgUFJPUEVSVFlfUEFSVCA9IDM7XG5jb25zdCBCT09MRUFOX0FUVFJJQlVURV9QQVJUID0gNDtcbmNvbnN0IEVWRU5UX1BBUlQgPSA1O1xuY29uc3QgRUxFTUVOVF9QQVJUID0gNjtcbmNvbnN0IENPTU1FTlRfUEFSVCA9IDc7XG5cbi8qKlxuICogVGhlIHJldHVybiB0eXBlIG9mIHRoZSB0ZW1wbGF0ZSB0YWcgZnVuY3Rpb25zLCB7QGxpbmtjb2RlIGh0bWx9IGFuZFxuICoge0BsaW5rY29kZSBzdmd9IHdoZW4gaXQgaGFzbid0IGJlZW4gY29tcGlsZWQgYnkgQGxpdC1sYWJzL2NvbXBpbGVyLlxuICpcbiAqIEEgYFRlbXBsYXRlUmVzdWx0YCBvYmplY3QgaG9sZHMgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRlbXBsYXRlXG4gKiBleHByZXNzaW9uIHJlcXVpcmVkIHRvIHJlbmRlciBpdDogdGhlIHRlbXBsYXRlIHN0cmluZ3MsIGV4cHJlc3Npb24gdmFsdWVzLFxuICogYW5kIHR5cGUgb2YgdGVtcGxhdGUgKGh0bWwgb3Igc3ZnKS5cbiAqXG4gKiBgVGVtcGxhdGVSZXN1bHRgIG9iamVjdHMgZG8gbm90IGNyZWF0ZSBhbnkgRE9NIG9uIHRoZWlyIG93bi4gVG8gY3JlYXRlIG9yXG4gKiB1cGRhdGUgRE9NIHlvdSBuZWVkIHRvIHJlbmRlciB0aGUgYFRlbXBsYXRlUmVzdWx0YC4gU2VlXG4gKiBbUmVuZGVyaW5nXShodHRwczovL2xpdC5kZXYvZG9jcy9jb21wb25lbnRzL3JlbmRlcmluZykgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICovXG5leHBvcnQgdHlwZSBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQ8VCBleHRlbmRzIFJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlPiA9IHtcbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgWydfJGxpdFR5cGUkJ106IFQ7XG4gIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5O1xuICB2YWx1ZXM6IHVua25vd25bXTtcbn07XG5cbi8qKlxuICogVGhpcyBpcyBhIHRlbXBsYXRlIHJlc3VsdCB0aGF0IG1heSBiZSBlaXRoZXIgdW5jb21waWxlZCBvciBjb21waWxlZC5cbiAqXG4gKiBJbiB0aGUgZnV0dXJlLCBUZW1wbGF0ZVJlc3VsdCB3aWxsIGJlIHRoaXMgdHlwZS4gSWYgeW91IHdhbnQgdG8gZXhwbGljaXRseVxuICogbm90ZSB0aGF0IGEgdGVtcGxhdGUgcmVzdWx0IGlzIHBvdGVudGlhbGx5IGNvbXBpbGVkLCB5b3UgY2FuIHJlZmVyZW5jZSB0aGlzXG4gKiB0eXBlIGFuZCBpdCB3aWxsIGNvbnRpbnVlIHRvIGJlaGF2ZSB0aGUgc2FtZSB0aHJvdWdoIHRoZSBuZXh0IG1ham9yIHZlcnNpb25cbiAqIG9mIExpdC4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBjb2RlIHRoYXQgd2FudHMgdG8gcHJlcGFyZSBmb3IgdGhlIG5leHRcbiAqIG1ham9yIHZlcnNpb24gb2YgTGl0LlxuICovXG5leHBvcnQgdHlwZSBNYXliZUNvbXBpbGVkVGVtcGxhdGVSZXN1bHQ8VCBleHRlbmRzIFJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlPiA9XG4gIHwgVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0PFQ+XG4gIHwgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdDtcblxuLyoqXG4gKiBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHRlbXBsYXRlIHRhZyBmdW5jdGlvbnMsIHtAbGlua2NvZGUgaHRtbH0gYW5kXG4gKiB7QGxpbmtjb2RlIHN2Z30uXG4gKlxuICogQSBgVGVtcGxhdGVSZXN1bHRgIG9iamVjdCBob2xkcyBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgdGVtcGxhdGVcbiAqIGV4cHJlc3Npb24gcmVxdWlyZWQgdG8gcmVuZGVyIGl0OiB0aGUgdGVtcGxhdGUgc3RyaW5ncywgZXhwcmVzc2lvbiB2YWx1ZXMsXG4gKiBhbmQgdHlwZSBvZiB0ZW1wbGF0ZSAoaHRtbCBvciBzdmcpLlxuICpcbiAqIGBUZW1wbGF0ZVJlc3VsdGAgb2JqZWN0cyBkbyBub3QgY3JlYXRlIGFueSBET00gb24gdGhlaXIgb3duLiBUbyBjcmVhdGUgb3JcbiAqIHVwZGF0ZSBET00geW91IG5lZWQgdG8gcmVuZGVyIHRoZSBgVGVtcGxhdGVSZXN1bHRgLiBTZWVcbiAqIFtSZW5kZXJpbmddKGh0dHBzOi8vbGl0LmRldi9kb2NzL2NvbXBvbmVudHMvcmVuZGVyaW5nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBJbiBMaXQgNCwgdGhpcyB0eXBlIHdpbGwgYmUgYW4gYWxpYXMgb2ZcbiAqIE1heWJlQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCwgc28gdGhhdCBjb2RlIHdpbGwgZ2V0IHR5cGUgZXJyb3JzIGlmIGl0IGFzc3VtZXNcbiAqIHRoYXQgTGl0IHRlbXBsYXRlcyBhcmUgbm90IGNvbXBpbGVkLiBXaGVuIGRlbGliZXJhdGVseSB3b3JraW5nIHdpdGggb25seVxuICogb25lLCB1c2UgZWl0aGVyIHtAbGlua2NvZGUgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdH0gb3JcbiAqIHtAbGlua2NvZGUgVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0fSBleHBsaWNpdGx5LlxuICovXG5leHBvcnQgdHlwZSBUZW1wbGF0ZVJlc3VsdDxUIGV4dGVuZHMgUmVzdWx0VHlwZSA9IFJlc3VsdFR5cGU+ID1cbiAgVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0PFQ+O1xuXG5leHBvcnQgdHlwZSBIVE1MVGVtcGxhdGVSZXN1bHQgPSBUZW1wbGF0ZVJlc3VsdDx0eXBlb2YgSFRNTF9SRVNVTFQ+O1xuXG5leHBvcnQgdHlwZSBTVkdUZW1wbGF0ZVJlc3VsdCA9IFRlbXBsYXRlUmVzdWx0PHR5cGVvZiBTVkdfUkVTVUxUPjtcblxuZXhwb3J0IHR5cGUgTWF0aE1MVGVtcGxhdGVSZXN1bHQgPSBUZW1wbGF0ZVJlc3VsdDx0eXBlb2YgTUFUSE1MX1JFU1VMVD47XG5cbi8qKlxuICogQSBUZW1wbGF0ZVJlc3VsdCB0aGF0IGhhcyBiZWVuIGNvbXBpbGVkIGJ5IEBsaXQtbGFicy9jb21waWxlciwgc2tpcHBpbmcgdGhlXG4gKiBwcmVwYXJlIHN0ZXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCB7XG4gIC8vIFRoaXMgaXMgYSBmYWN0b3J5IGluIG9yZGVyIHRvIG1ha2UgdGVtcGxhdGUgaW5pdGlhbGl6YXRpb24gbGF6eVxuICAvLyBhbmQgYWxsb3cgU2hhZHlSZW5kZXJPcHRpb25zIHNjb3BlIHRvIGJlIHBhc3NlZCBpbi5cbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgWydfJGxpdFR5cGUkJ106IENvbXBpbGVkVGVtcGxhdGU7XG4gIHZhbHVlczogdW5rbm93bltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVkVGVtcGxhdGUgZXh0ZW5kcyBPbWl0PFRlbXBsYXRlLCAnZWwnPiB7XG4gIC8vIGVsIGlzIG92ZXJyaWRkZW4gdG8gYmUgb3B0aW9uYWwuIFdlIGluaXRpYWxpemUgaXQgb24gZmlyc3QgcmVuZGVyXG4gIGVsPzogSFRNTFRlbXBsYXRlRWxlbWVudDtcblxuICAvLyBUaGUgcHJlcGFyZWQgSFRNTCBzdHJpbmcgdG8gY3JlYXRlIGEgdGVtcGxhdGUgZWxlbWVudCBmcm9tLlxuICAvLyBUaGUgdHlwZSBpcyBhIFRlbXBsYXRlU3RyaW5nc0FycmF5IHRvIGd1YXJhbnRlZSB0aGF0IHRoZSB2YWx1ZSBjYW1lIGZyb21cbiAgLy8gc291cmNlIGNvZGUsIHByZXZlbnRpbmcgYSBKU09OIGluamVjdGlvbiBhdHRhY2suXG4gIGg6IFRlbXBsYXRlU3RyaW5nc0FycmF5O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHRlbXBsYXRlIGxpdGVyYWwgdGFnIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIFRlbXBsYXRlUmVzdWx0IHdpdGhcbiAqIHRoZSBnaXZlbiByZXN1bHQgdHlwZS5cbiAqL1xuY29uc3QgdGFnID1cbiAgPFQgZXh0ZW5kcyBSZXN1bHRUeXBlPih0eXBlOiBUKSA9PlxuICAoc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksIC4uLnZhbHVlczogdW5rbm93bltdKTogVGVtcGxhdGVSZXN1bHQ8VD4gPT4ge1xuICAgIC8vIFdhcm4gYWdhaW5zdCB0ZW1wbGF0ZXMgb2N0YWwgZXNjYXBlIHNlcXVlbmNlc1xuICAgIC8vIFdlIGRvIHRoaXMgaGVyZSByYXRoZXIgdGhhbiBpbiByZW5kZXIgc28gdGhhdCB0aGUgd2FybmluZyBpcyBjbG9zZXIgdG8gdGhlXG4gICAgLy8gdGVtcGxhdGUgZGVmaW5pdGlvbi5cbiAgICBpZiAoREVWX01PREUgJiYgc3RyaW5ncy5zb21lKChzKSA9PiBzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdTb21lIHRlbXBsYXRlIHN0cmluZ3MgYXJlIHVuZGVmaW5lZC5cXG4nICtcbiAgICAgICAgICAnVGhpcyBpcyBwcm9iYWJseSBjYXVzZWQgYnkgaWxsZWdhbCBvY3RhbCBlc2NhcGUgc2VxdWVuY2VzLidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgLy8gSW1wb3J0IHN0YXRpYy1odG1sLmpzIHJlc3VsdHMgaW4gYSBjaXJjdWxhciBkZXBlbmRlbmN5IHdoaWNoIGczIGRvZXNuJ3RcbiAgICAgIC8vIGhhbmRsZS4gSW5zdGVhZCB3ZSBrbm93IHRoYXQgc3RhdGljIHZhbHVlcyBtdXN0IGhhdmUgdGhlIGZpZWxkXG4gICAgICAvLyBgXyRsaXRTdGF0aWMkYC5cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWVzLnNvbWUoKHZhbCkgPT4gKHZhbCBhcyB7XyRsaXRTdGF0aWMkOiB1bmtub3dufSk/LlsnXyRsaXRTdGF0aWMkJ10pXG4gICAgICApIHtcbiAgICAgICAgaXNzdWVXYXJuaW5nKFxuICAgICAgICAgICcnLFxuICAgICAgICAgIGBTdGF0aWMgdmFsdWVzICdsaXRlcmFsJyBvciAndW5zYWZlU3RhdGljJyBjYW5ub3QgYmUgdXNlZCBhcyB2YWx1ZXMgdG8gbm9uLXN0YXRpYyB0ZW1wbGF0ZXMuXFxuYCArXG4gICAgICAgICAgICBgUGxlYXNlIHVzZSB0aGUgc3RhdGljICdodG1sJyB0YWcgZnVuY3Rpb24uIFNlZSBodHRwczovL2xpdC5kZXYvZG9jcy90ZW1wbGF0ZXMvZXhwcmVzc2lvbnMvI3N0YXRpYy1leHByZXNzaW9uc2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICBbJ18kbGl0VHlwZSQnXTogdHlwZSxcbiAgICAgIHN0cmluZ3MsXG4gICAgICB2YWx1ZXMsXG4gICAgfTtcbiAgfTtcblxuLyoqXG4gKiBJbnRlcnByZXRzIGEgdGVtcGxhdGUgbGl0ZXJhbCBhcyBhbiBIVE1MIHRlbXBsYXRlIHRoYXQgY2FuIGVmZmljaWVudGx5XG4gKiByZW5kZXIgdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgaGVhZGVyID0gKHRpdGxlOiBzdHJpbmcpID0+IGh0bWxgPGgxPiR7dGl0bGV9PC9oMT5gO1xuICogYGBgXG4gKlxuICogVGhlIGBodG1sYCB0YWcgcmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBET00gdG8gcmVuZGVyIGFzIGEgdmFsdWUuIEl0IGlzXG4gKiBsYXp5LCBtZWFuaW5nIG5vIHdvcmsgaXMgZG9uZSB1bnRpbCB0aGUgdGVtcGxhdGUgaXMgcmVuZGVyZWQuIFdoZW4gcmVuZGVyaW5nLFxuICogaWYgYSB0ZW1wbGF0ZSBjb21lcyBmcm9tIHRoZSBzYW1lIGV4cHJlc3Npb24gYXMgYSBwcmV2aW91c2x5IHJlbmRlcmVkIHJlc3VsdCxcbiAqIGl0J3MgZWZmaWNpZW50bHkgdXBkYXRlZCBpbnN0ZWFkIG9mIHJlcGxhY2VkLlxuICovXG5leHBvcnQgY29uc3QgaHRtbCA9IHRhZyhIVE1MX1JFU1VMVCk7XG5cbi8qKlxuICogSW50ZXJwcmV0cyBhIHRlbXBsYXRlIGxpdGVyYWwgYXMgYW4gU1ZHIGZyYWdtZW50IHRoYXQgY2FuIGVmZmljaWVudGx5IHJlbmRlclxuICogdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcmVjdCA9IHN2Z2A8cmVjdCB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIj48L3JlY3Q+YDtcbiAqXG4gKiBjb25zdCBteUltYWdlID0gaHRtbGBcbiAqICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICogICAgICR7cmVjdH1cbiAqICAgPC9zdmc+YDtcbiAqIGBgYFxuICpcbiAqIFRoZSBgc3ZnYCAqdGFnIGZ1bmN0aW9uKiBzaG91bGQgb25seSBiZSB1c2VkIGZvciBTVkcgZnJhZ21lbnRzLCBvciBlbGVtZW50c1xuICogdGhhdCB3b3VsZCBiZSBjb250YWluZWQgKippbnNpZGUqKiBhbiBgPHN2Zz5gIEhUTUwgZWxlbWVudC4gQSBjb21tb24gZXJyb3IgaXNcbiAqIHBsYWNpbmcgYW4gYDxzdmc+YCAqZWxlbWVudCogaW4gYSB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUgYHN2Z2AgdGFnXG4gKiBmdW5jdGlvbi4gVGhlIGA8c3ZnPmAgZWxlbWVudCBpcyBhbiBIVE1MIGVsZW1lbnQgYW5kIHNob3VsZCBiZSB1c2VkIHdpdGhpbiBhXG4gKiB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUge0BsaW5rY29kZSBodG1sfSB0YWcgZnVuY3Rpb24uXG4gKlxuICogSW4gTGl0RWxlbWVudCB1c2FnZSwgaXQncyBpbnZhbGlkIHRvIHJldHVybiBhbiBTVkcgZnJhZ21lbnQgZnJvbSB0aGVcbiAqIGByZW5kZXIoKWAgbWV0aG9kLCBhcyB0aGUgU1ZHIGZyYWdtZW50IHdpbGwgYmUgY29udGFpbmVkIHdpdGhpbiB0aGUgZWxlbWVudCdzXG4gKiBzaGFkb3cgcm9vdCBhbmQgdGh1cyBub3QgYmUgcHJvcGVybHkgY29udGFpbmVkIHdpdGhpbiBhbiBgPHN2Zz5gIEhUTUxcbiAqIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBzdmcgPSB0YWcoU1ZHX1JFU1VMVCk7XG5cbi8qKlxuICogSW50ZXJwcmV0cyBhIHRlbXBsYXRlIGxpdGVyYWwgYXMgTWF0aE1MIGZyYWdtZW50IHRoYXQgY2FuIGVmZmljaWVudGx5IHJlbmRlclxuICogdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgbnVtID0gbWF0aG1sYDxtbj4xPC9tbj5gO1xuICpcbiAqIGNvbnN0IGVxID0gaHRtbGBcbiAqICAgPG1hdGg+XG4gKiAgICAgJHtudW19XG4gKiAgIDwvbWF0aD5gO1xuICogYGBgXG4gKlxuICogVGhlIGBtYXRobWxgICp0YWcgZnVuY3Rpb24qIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIE1hdGhNTCBmcmFnbWVudHMsIG9yXG4gKiBlbGVtZW50cyB0aGF0IHdvdWxkIGJlIGNvbnRhaW5lZCAqKmluc2lkZSoqIGEgYDxtYXRoPmAgSFRNTCBlbGVtZW50LiBBIGNvbW1vblxuICogZXJyb3IgaXMgcGxhY2luZyBhIGA8bWF0aD5gICplbGVtZW50KiBpbiBhIHRlbXBsYXRlIHRhZ2dlZCB3aXRoIHRoZSBgbWF0aG1sYFxuICogdGFnIGZ1bmN0aW9uLiBUaGUgYDxtYXRoPmAgZWxlbWVudCBpcyBhbiBIVE1MIGVsZW1lbnQgYW5kIHNob3VsZCBiZSB1c2VkXG4gKiB3aXRoaW4gYSB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUge0BsaW5rY29kZSBodG1sfSB0YWcgZnVuY3Rpb24uXG4gKlxuICogSW4gTGl0RWxlbWVudCB1c2FnZSwgaXQncyBpbnZhbGlkIHRvIHJldHVybiBhbiBNYXRoTUwgZnJhZ21lbnQgZnJvbSB0aGVcbiAqIGByZW5kZXIoKWAgbWV0aG9kLCBhcyB0aGUgTWF0aE1MIGZyYWdtZW50IHdpbGwgYmUgY29udGFpbmVkIHdpdGhpbiB0aGVcbiAqIGVsZW1lbnQncyBzaGFkb3cgcm9vdCBhbmQgdGh1cyBub3QgYmUgcHJvcGVybHkgY29udGFpbmVkIHdpdGhpbiBhIGA8bWF0aD5gXG4gKiBIVE1MIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBtYXRobWwgPSB0YWcoTUFUSE1MX1JFU1VMVCk7XG5cbi8qKlxuICogQSBzZW50aW5lbCB2YWx1ZSB0aGF0IHNpZ25hbHMgdGhhdCBhIHZhbHVlIHdhcyBoYW5kbGVkIGJ5IGEgZGlyZWN0aXZlIGFuZFxuICogc2hvdWxkIG5vdCBiZSB3cml0dGVuIHRvIHRoZSBET00uXG4gKi9cbmV4cG9ydCBjb25zdCBub0NoYW5nZSA9IFN5bWJvbC5mb3IoJ2xpdC1ub0NoYW5nZScpO1xuXG4vKipcbiAqIEEgc2VudGluZWwgdmFsdWUgdGhhdCBzaWduYWxzIGEgQ2hpbGRQYXJ0IHRvIGZ1bGx5IGNsZWFyIGl0cyBjb250ZW50LlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBidXR0b24gPSBodG1sYCR7XG4gKiAgdXNlci5pc0FkbWluXG4gKiAgICA/IGh0bWxgPGJ1dHRvbj5ERUxFVEU8L2J1dHRvbj5gXG4gKiAgICA6IG5vdGhpbmdcbiAqIH1gO1xuICogYGBgXG4gKlxuICogUHJlZmVyIHVzaW5nIGBub3RoaW5nYCBvdmVyIG90aGVyIGZhbHN5IHZhbHVlcyBhcyBpdCBwcm92aWRlcyBhIGNvbnNpc3RlbnRcbiAqIGJlaGF2aW9yIGJldHdlZW4gdmFyaW91cyBleHByZXNzaW9uIGJpbmRpbmcgY29udGV4dHMuXG4gKlxuICogSW4gY2hpbGQgZXhwcmVzc2lvbnMsIGB1bmRlZmluZWRgLCBgbnVsbGAsIGAnJ2AsIGFuZCBgbm90aGluZ2AgYWxsIGJlaGF2ZSB0aGVcbiAqIHNhbWUgYW5kIHJlbmRlciBubyBub2Rlcy4gSW4gYXR0cmlidXRlIGV4cHJlc3Npb25zLCBgbm90aGluZ2AgX3JlbW92ZXNfIHRoZVxuICogYXR0cmlidXRlLCB3aGlsZSBgdW5kZWZpbmVkYCBhbmQgYG51bGxgIHdpbGwgcmVuZGVyIGFuIGVtcHR5IHN0cmluZy4gSW5cbiAqIHByb3BlcnR5IGV4cHJlc3Npb25zIGBub3RoaW5nYCBiZWNvbWVzIGB1bmRlZmluZWRgLlxuICovXG5leHBvcnQgY29uc3Qgbm90aGluZyA9IFN5bWJvbC5mb3IoJ2xpdC1ub3RoaW5nJyk7XG5cbi8qKlxuICogVGhlIGNhY2hlIG9mIHByZXBhcmVkIHRlbXBsYXRlcywga2V5ZWQgYnkgdGhlIHRhZ2dlZCBUZW1wbGF0ZVN0cmluZ3NBcnJheVxuICogYW5kIF9ub3RfIGFjY291bnRpbmcgZm9yIHRoZSBzcGVjaWZpYyB0ZW1wbGF0ZSB0YWcgdXNlZC4gVGhpcyBtZWFucyB0aGF0XG4gKiB0ZW1wbGF0ZSB0YWdzIGNhbm5vdCBiZSBkeW5hbWljIC0gdGhleSBtdXN0IHN0YXRpY2FsbHkgYmUgb25lIG9mIGh0bWwsIHN2ZyxcbiAqIG9yIGF0dHIuIFRoaXMgcmVzdHJpY3Rpb24gc2ltcGxpZmllcyB0aGUgY2FjaGUgbG9va3VwLCB3aGljaCBpcyBvbiB0aGUgaG90XG4gKiBwYXRoIGZvciByZW5kZXJpbmcuXG4gKi9cbmNvbnN0IHRlbXBsYXRlQ2FjaGUgPSBuZXcgV2Vha01hcDxUZW1wbGF0ZVN0cmluZ3NBcnJheSwgVGVtcGxhdGU+KCk7XG5cbi8qKlxuICogT2JqZWN0IHNwZWNpZnlpbmcgb3B0aW9ucyBmb3IgY29udHJvbGxpbmcgbGl0LWh0bWwgcmVuZGVyaW5nLiBOb3RlIHRoYXRcbiAqIHdoaWxlIGByZW5kZXJgIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgb24gdGhlIHNhbWUgYGNvbnRhaW5lcmAgKGFuZFxuICogYHJlbmRlckJlZm9yZWAgcmVmZXJlbmNlIG5vZGUpIHRvIGVmZmljaWVudGx5IHVwZGF0ZSB0aGUgcmVuZGVyZWQgY29udGVudCxcbiAqIG9ubHkgdGhlIG9wdGlvbnMgcGFzc2VkIGluIGR1cmluZyB0aGUgZmlyc3QgcmVuZGVyIGFyZSByZXNwZWN0ZWQgZHVyaW5nXG4gKiB0aGUgbGlmZXRpbWUgb2YgcmVuZGVycyB0byB0aGF0IHVuaXF1ZSBgY29udGFpbmVyYCArIGByZW5kZXJCZWZvcmVgXG4gKiBjb21iaW5hdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCB0byB1c2UgYXMgdGhlIGB0aGlzYCB2YWx1ZSBmb3IgZXZlbnQgbGlzdGVuZXJzLiBJdCdzIG9mdGVuXG4gICAqIHVzZWZ1bCB0byBzZXQgdGhpcyB0byB0aGUgaG9zdCBjb21wb25lbnQgcmVuZGVyaW5nIGEgdGVtcGxhdGUuXG4gICAqL1xuICBob3N0Pzogb2JqZWN0O1xuICAvKipcbiAgICogQSBET00gbm9kZSBiZWZvcmUgd2hpY2ggdG8gcmVuZGVyIGNvbnRlbnQgaW4gdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIHJlbmRlckJlZm9yZT86IENoaWxkTm9kZSB8IG51bGw7XG4gIC8qKlxuICAgKiBOb2RlIHVzZWQgZm9yIGNsb25pbmcgdGhlIHRlbXBsYXRlIChgaW1wb3J0Tm9kZWAgd2lsbCBiZSBjYWxsZWQgb24gdGhpc1xuICAgKiBub2RlKS4gVGhpcyBjb250cm9scyB0aGUgYG93bmVyRG9jdW1lbnRgIG9mIHRoZSByZW5kZXJlZCBET00sIGFsb25nIHdpdGhcbiAgICogYW55IGluaGVyaXRlZCBjb250ZXh0LiBEZWZhdWx0cyB0byB0aGUgZ2xvYmFsIGBkb2N1bWVudGAuXG4gICAqL1xuICBjcmVhdGlvblNjb3BlPzoge2ltcG9ydE5vZGUobm9kZTogTm9kZSwgZGVlcD86IGJvb2xlYW4pOiBOb2RlfTtcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIGNvbm5lY3RlZCBzdGF0ZSBmb3IgdGhlIHRvcC1sZXZlbCBwYXJ0IGJlaW5nIHJlbmRlcmVkLiBJZiBub1xuICAgKiBgaXNDb25uZWN0ZWRgIG9wdGlvbiBpcyBzZXQsIGBBc3luY0RpcmVjdGl2ZWBzIHdpbGwgYmUgY29ubmVjdGVkIGJ5XG4gICAqIGRlZmF1bHQuIFNldCB0byBgZmFsc2VgIGlmIHRoZSBpbml0aWFsIHJlbmRlciBvY2N1cnMgaW4gYSBkaXNjb25uZWN0ZWQgdHJlZVxuICAgKiBhbmQgYEFzeW5jRGlyZWN0aXZlYHMgc2hvdWxkIHNlZSBgaXNDb25uZWN0ZWQgPT09IGZhbHNlYCBmb3IgdGhlaXIgaW5pdGlhbFxuICAgKiByZW5kZXIuIFRoZSBgcGFydC5zZXRDb25uZWN0ZWQoKWAgbWV0aG9kIG11c3QgYmUgdXNlZCBzdWJzZXF1ZW50IHRvIGluaXRpYWxcbiAgICogcmVuZGVyIHRvIGNoYW5nZSB0aGUgY29ubmVjdGVkIHN0YXRlIG9mIHRoZSBwYXJ0LlxuICAgKi9cbiAgaXNDb25uZWN0ZWQ/OiBib29sZWFuO1xufVxuXG5jb25zdCB3YWxrZXIgPSBkLmNyZWF0ZVRyZWVXYWxrZXIoXG4gIGQsXG4gIDEyOSAvKiBOb2RlRmlsdGVyLlNIT1dfe0VMRU1FTlR8Q09NTUVOVH0gKi9cbik7XG5cbmxldCBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWw6IFNhbml0aXplckZhY3RvcnkgPSBub29wU2FuaXRpemVyO1xuXG4vL1xuLy8gQ2xhc3NlcyBvbmx5IGJlbG93IGhlcmUsIGNvbnN0IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBvbmx5IGFib3ZlIGhlcmUuLi5cbi8vXG4vLyBLZWVwaW5nIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBhbmQgY2xhc3NlcyB0b2dldGhlciBpbXByb3ZlcyBtaW5pZmljYXRpb24uXG4vLyBJbnRlcmZhY2VzIGFuZCB0eXBlIGFsaWFzZXMgY2FuIGJlIGludGVybGVhdmVkIGZyZWVseS5cbi8vXG5cbi8vIFR5cGUgZm9yIGNsYXNzZXMgdGhhdCBoYXZlIGEgYF9kaXJlY3RpdmVgIG9yIGBfZGlyZWN0aXZlc1tdYCBmaWVsZCwgdXNlZCBieVxuLy8gYHJlc29sdmVEaXJlY3RpdmVgXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZVBhcmVudCB7XG4gIF8kcGFyZW50PzogRGlyZWN0aXZlUGFyZW50O1xuICBfJGlzQ29ubmVjdGVkOiBib29sZWFuO1xuICBfX2RpcmVjdGl2ZT86IERpcmVjdGl2ZTtcbiAgX19kaXJlY3RpdmVzPzogQXJyYXk8RGlyZWN0aXZlIHwgdW5kZWZpbmVkPjtcbn1cblxuZnVuY3Rpb24gdHJ1c3RGcm9tVGVtcGxhdGVTdHJpbmcoXG4gIHRzYTogVGVtcGxhdGVTdHJpbmdzQXJyYXksXG4gIHN0cmluZ0Zyb21UU0E6IHN0cmluZ1xuKTogVHJ1c3RlZEhUTUwge1xuICAvLyBBIHNlY3VyaXR5IGNoZWNrIHRvIHByZXZlbnQgc3Bvb2Zpbmcgb2YgTGl0IHRlbXBsYXRlIHJlc3VsdHMuXG4gIC8vIEluIHRoZSBmdXR1cmUsIHdlIG1heSBiZSBhYmxlIHRvIHJlcGxhY2UgdGhpcyB3aXRoIEFycmF5LmlzVGVtcGxhdGVPYmplY3QsXG4gIC8vIHRob3VnaCB3ZSBtaWdodCBuZWVkIHRvIG1ha2UgdGhhdCBjaGVjayBpbnNpZGUgb2YgdGhlIGh0bWwgYW5kIHN2Z1xuICAvLyBmdW5jdGlvbnMsIGJlY2F1c2UgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGRvbid0IGNvbWUgaW4gYXNcbiAgLy8gVGVtcGxhdGVTdHJpbmdBcnJheSBvYmplY3RzLlxuICBpZiAoIWlzQXJyYXkodHNhKSB8fCAhdHNhLmhhc093blByb3BlcnR5KCdyYXcnKSkge1xuICAgIGxldCBtZXNzYWdlID0gJ2ludmFsaWQgdGVtcGxhdGUgc3RyaW5ncyBhcnJheSc7XG4gICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICBtZXNzYWdlID0gYFxuICAgICAgICAgIEludGVybmFsIEVycm9yOiBleHBlY3RlZCB0ZW1wbGF0ZSBzdHJpbmdzIHRvIGJlIGFuIGFycmF5XG4gICAgICAgICAgd2l0aCBhICdyYXcnIGZpZWxkLiBGYWtpbmcgYSB0ZW1wbGF0ZSBzdHJpbmdzIGFycmF5IGJ5XG4gICAgICAgICAgY2FsbGluZyBodG1sIG9yIHN2ZyBsaWtlIGFuIG9yZGluYXJ5IGZ1bmN0aW9uIGlzIGVmZmVjdGl2ZWx5XG4gICAgICAgICAgdGhlIHNhbWUgYXMgY2FsbGluZyB1bnNhZmVIdG1sIGFuZCBjYW4gbGVhZCB0byBtYWpvciBzZWN1cml0eVxuICAgICAgICAgIGlzc3VlcywgZS5nLiBvcGVuaW5nIHlvdXIgY29kZSB1cCB0byBYU1MgYXR0YWNrcy5cbiAgICAgICAgICBJZiB5b3UncmUgdXNpbmcgdGhlIGh0bWwgb3Igc3ZnIHRhZ2dlZCB0ZW1wbGF0ZSBmdW5jdGlvbnMgbm9ybWFsbHlcbiAgICAgICAgICBhbmQgc3RpbGwgc2VlaW5nIHRoaXMgZXJyb3IsIHBsZWFzZSBmaWxlIGEgYnVnIGF0XG4gICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvaXNzdWVzL25ldz90ZW1wbGF0ZT1idWdfcmVwb3J0Lm1kXG4gICAgICAgICAgYW5kIGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgeW91ciBidWlsZCB0b29saW5nLCBpZiBhbnkuXG4gICAgICAgIGBcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAucmVwbGFjZSgvXFxuICovZywgJ1xcbicpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH1cbiAgcmV0dXJuIHBvbGljeSAhPT0gdW5kZWZpbmVkXG4gICAgPyBwb2xpY3kuY3JlYXRlSFRNTChzdHJpbmdGcm9tVFNBKVxuICAgIDogKHN0cmluZ0Zyb21UU0EgYXMgdW5rbm93biBhcyBUcnVzdGVkSFRNTCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBIVE1MIHN0cmluZyBmb3IgdGhlIGdpdmVuIFRlbXBsYXRlU3RyaW5nc0FycmF5IGFuZCByZXN1bHQgdHlwZVxuICogKEhUTUwgb3IgU1ZHKSwgYWxvbmcgd2l0aCB0aGUgY2FzZS1zZW5zaXRpdmUgYm91bmQgYXR0cmlidXRlIG5hbWVzIGluXG4gKiB0ZW1wbGF0ZSBvcmRlci4gVGhlIEhUTUwgY29udGFpbnMgY29tbWVudCBtYXJrZXJzIGRlbm90aW5nIHRoZSBgQ2hpbGRQYXJ0YHNcbiAqIGFuZCBzdWZmaXhlcyBvbiBib3VuZCBhdHRyaWJ1dGVzIGRlbm90aW5nIHRoZSBgQXR0cmlidXRlUGFydHNgLlxuICpcbiAqIEBwYXJhbSBzdHJpbmdzIHRlbXBsYXRlIHN0cmluZ3MgYXJyYXlcbiAqIEBwYXJhbSB0eXBlIEhUTUwgb3IgU1ZHXG4gKiBAcmV0dXJuIEFycmF5IGNvbnRhaW5pbmcgYFtodG1sLCBhdHRyTmFtZXNdYCAoYXJyYXkgcmV0dXJuZWQgZm9yIHRlcnNlbmVzcyxcbiAqICAgICB0byBhdm9pZCBvYmplY3QgZmllbGRzIHNpbmNlIHRoaXMgY29kZSBpcyBzaGFyZWQgd2l0aCBub24tbWluaWZpZWQgU1NSXG4gKiAgICAgY29kZSlcbiAqL1xuY29uc3QgZ2V0VGVtcGxhdGVIdG1sID0gKFxuICBzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSxcbiAgdHlwZTogUmVzdWx0VHlwZVxuKTogW1RydXN0ZWRIVE1MLCBBcnJheTxzdHJpbmc+XSA9PiB7XG4gIC8vIEluc2VydCBtYWtlcnMgaW50byB0aGUgdGVtcGxhdGUgSFRNTCB0byByZXByZXNlbnQgdGhlIHBvc2l0aW9uIG9mXG4gIC8vIGJpbmRpbmdzLiBUaGUgZm9sbG93aW5nIGNvZGUgc2NhbnMgdGhlIHRlbXBsYXRlIHN0cmluZ3MgdG8gZGV0ZXJtaW5lIHRoZVxuICAvLyBzeW50YWN0aWMgcG9zaXRpb24gb2YgdGhlIGJpbmRpbmdzLiBUaGV5IGNhbiBiZSBpbiB0ZXh0IHBvc2l0aW9uLCB3aGVyZVxuICAvLyB3ZSBpbnNlcnQgYW4gSFRNTCBjb21tZW50LCBhdHRyaWJ1dGUgdmFsdWUgcG9zaXRpb24sIHdoZXJlIHdlIGluc2VydCBhXG4gIC8vIHNlbnRpbmVsIHN0cmluZyBhbmQgcmUtd3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lLCBvciBpbnNpZGUgYSB0YWcgd2hlcmVcbiAgLy8gd2UgaW5zZXJ0IHRoZSBzZW50aW5lbCBzdHJpbmcuXG4gIGNvbnN0IGwgPSBzdHJpbmdzLmxlbmd0aCAtIDE7XG4gIC8vIFN0b3JlcyB0aGUgY2FzZS1zZW5zaXRpdmUgYm91bmQgYXR0cmlidXRlIG5hbWVzIGluIHRoZSBvcmRlciBvZiB0aGVpclxuICAvLyBwYXJ0cy4gRWxlbWVudFBhcnRzIGFyZSBhbHNvIHJlZmxlY3RlZCBpbiB0aGlzIGFycmF5IGFzIHVuZGVmaW5lZFxuICAvLyByYXRoZXIgdGhhbiBhIHN0cmluZywgdG8gZGlzYW1iaWd1YXRlIGZyb20gYXR0cmlidXRlIGJpbmRpbmdzLlxuICBjb25zdCBhdHRyTmFtZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgbGV0IGh0bWwgPVxuICAgIHR5cGUgPT09IFNWR19SRVNVTFQgPyAnPHN2Zz4nIDogdHlwZSA9PT0gTUFUSE1MX1JFU1VMVCA/ICc8bWF0aD4nIDogJyc7XG5cbiAgLy8gV2hlbiB3ZSdyZSBpbnNpZGUgYSByYXcgdGV4dCB0YWcgKG5vdCBpdCdzIHRleHQgY29udGVudCksIHRoZSByZWdleFxuICAvLyB3aWxsIHN0aWxsIGJlIHRhZ1JlZ2V4IHNvIHdlIGNhbiBmaW5kIGF0dHJpYnV0ZXMsIGJ1dCB3aWxsIHN3aXRjaCB0b1xuICAvLyB0aGlzIHJlZ2V4IHdoZW4gdGhlIHRhZyBlbmRzLlxuICBsZXQgcmF3VGV4dEVuZFJlZ2V4OiBSZWdFeHAgfCB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIGN1cnJlbnQgcGFyc2luZyBzdGF0ZSwgcmVwcmVzZW50ZWQgYXMgYSByZWZlcmVuY2UgdG8gb25lIG9mIHRoZVxuICAvLyByZWdleGVzXG4gIGxldCByZWdleCA9IHRleHRFbmRSZWdleDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IHMgPSBzdHJpbmdzW2ldO1xuICAgIC8vIFRoZSBpbmRleCBvZiB0aGUgZW5kIG9mIHRoZSBsYXN0IGF0dHJpYnV0ZSBuYW1lLiBXaGVuIHRoaXMgaXNcbiAgICAvLyBwb3NpdGl2ZSBhdCBlbmQgb2YgYSBzdHJpbmcsIGl0IG1lYW5zIHdlJ3JlIGluIGFuIGF0dHJpYnV0ZSB2YWx1ZVxuICAgIC8vIHBvc2l0aW9uIGFuZCBuZWVkIHRvIHJld3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lLlxuICAgIC8vIFdlIGFsc28gdXNlIGEgc3BlY2lhbCB2YWx1ZSBvZiAtMiB0byBpbmRpY2F0ZSB0aGF0IHdlIGVuY291bnRlcmVkXG4gICAgLy8gdGhlIGVuZCBvZiBhIHN0cmluZyBpbiBhdHRyaWJ1dGUgbmFtZSBwb3NpdGlvbi5cbiAgICBsZXQgYXR0ck5hbWVFbmRJbmRleCA9IC0xO1xuICAgIGxldCBhdHRyTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBsYXN0SW5kZXggPSAwO1xuICAgIGxldCBtYXRjaCE6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG5cbiAgICAvLyBUaGUgY29uZGl0aW9ucyBpbiB0aGlzIGxvb3AgaGFuZGxlIHRoZSBjdXJyZW50IHBhcnNlIHN0YXRlLCBhbmQgdGhlXG4gICAgLy8gYXNzaWdubWVudHMgdG8gdGhlIGByZWdleGAgdmFyaWFibGUgYXJlIHRoZSBzdGF0ZSB0cmFuc2l0aW9ucy5cbiAgICB3aGlsZSAobGFzdEluZGV4IDwgcy5sZW5ndGgpIHtcbiAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzdGFydCBzZWFyY2hpbmcgZnJvbSB3aGVyZSB3ZSBwcmV2aW91c2x5IGxlZnQgb2ZmXG4gICAgICByZWdleC5sYXN0SW5kZXggPSBsYXN0SW5kZXg7XG4gICAgICBtYXRjaCA9IHJlZ2V4LmV4ZWMocyk7XG4gICAgICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsYXN0SW5kZXggPSByZWdleC5sYXN0SW5kZXg7XG4gICAgICBpZiAocmVnZXggPT09IHRleHRFbmRSZWdleCkge1xuICAgICAgICBpZiAobWF0Y2hbQ09NTUVOVF9TVEFSVF0gPT09ICchLS0nKSB7XG4gICAgICAgICAgcmVnZXggPSBjb21tZW50RW5kUmVnZXg7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hbQ09NTUVOVF9TVEFSVF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFdlIHN0YXJ0ZWQgYSB3ZWlyZCBjb21tZW50LCBsaWtlIDwve1xuICAgICAgICAgIHJlZ2V4ID0gY29tbWVudDJFbmRSZWdleDtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaFtUQUdfTkFNRV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChyYXdUZXh0RWxlbWVudC50ZXN0KG1hdGNoW1RBR19OQU1FXSkpIHtcbiAgICAgICAgICAgIC8vIFJlY29yZCBpZiB3ZSBlbmNvdW50ZXIgYSByYXctdGV4dCBlbGVtZW50LiBXZSdsbCBzd2l0Y2ggdG9cbiAgICAgICAgICAgIC8vIHRoaXMgcmVnZXggYXQgdGhlIGVuZCBvZiB0aGUgdGFnLlxuICAgICAgICAgICAgcmF3VGV4dEVuZFJlZ2V4ID0gbmV3IFJlZ0V4cChgPC8ke21hdGNoW1RBR19OQU1FXX1gLCAnZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWdleCA9IHRhZ0VuZFJlZ2V4O1xuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoW0RZTkFNSUNfVEFHX05BTUVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ0JpbmRpbmdzIGluIHRhZyBuYW1lcyBhcmUgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVzZSBzdGF0aWMgdGVtcGxhdGVzIGluc3RlYWQuICcgK1xuICAgICAgICAgICAgICAgICdTZWUgaHR0cHM6Ly9saXQuZGV2L2RvY3MvdGVtcGxhdGVzL2V4cHJlc3Npb25zLyNzdGF0aWMtZXhwcmVzc2lvbnMnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWdleCA9IHRhZ0VuZFJlZ2V4O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlZ2V4ID09PSB0YWdFbmRSZWdleCkge1xuICAgICAgICBpZiAobWF0Y2hbRU5USVJFX01BVENIXSA9PT0gJz4nKSB7XG4gICAgICAgICAgLy8gRW5kIG9mIGEgdGFnLiBJZiB3ZSBoYWQgc3RhcnRlZCBhIHJhdy10ZXh0IGVsZW1lbnQsIHVzZSB0aGF0XG4gICAgICAgICAgLy8gcmVnZXhcbiAgICAgICAgICByZWdleCA9IHJhd1RleHRFbmRSZWdleCA/PyB0ZXh0RW5kUmVnZXg7XG4gICAgICAgICAgLy8gV2UgbWF5IGJlIGVuZGluZyBhbiB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUsIHNvIG1ha2Ugc3VyZSB3ZVxuICAgICAgICAgIC8vIGNsZWFyIGFueSBwZW5kaW5nIGF0dHJOYW1lRW5kSW5kZXhcbiAgICAgICAgICBhdHRyTmFtZUVuZEluZGV4ID0gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hbQVRUUklCVVRFX05BTUVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBBdHRyaWJ1dGUgbmFtZSBwb3NpdGlvblxuICAgICAgICAgIGF0dHJOYW1lRW5kSW5kZXggPSAtMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhdHRyTmFtZUVuZEluZGV4ID0gcmVnZXgubGFzdEluZGV4IC0gbWF0Y2hbU1BBQ0VTX0FORF9FUVVBTFNdLmxlbmd0aDtcbiAgICAgICAgICBhdHRyTmFtZSA9IG1hdGNoW0FUVFJJQlVURV9OQU1FXTtcbiAgICAgICAgICByZWdleCA9XG4gICAgICAgICAgICBtYXRjaFtRVU9URV9DSEFSXSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gdGFnRW5kUmVnZXhcbiAgICAgICAgICAgICAgOiBtYXRjaFtRVU9URV9DSEFSXSA9PT0gJ1wiJ1xuICAgICAgICAgICAgICAgID8gZG91YmxlUXVvdGVBdHRyRW5kUmVnZXhcbiAgICAgICAgICAgICAgICA6IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICByZWdleCA9PT0gZG91YmxlUXVvdGVBdHRyRW5kUmVnZXggfHxcbiAgICAgICAgcmVnZXggPT09IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4XG4gICAgICApIHtcbiAgICAgICAgcmVnZXggPSB0YWdFbmRSZWdleDtcbiAgICAgIH0gZWxzZSBpZiAocmVnZXggPT09IGNvbW1lbnRFbmRSZWdleCB8fCByZWdleCA9PT0gY29tbWVudDJFbmRSZWdleCkge1xuICAgICAgICByZWdleCA9IHRleHRFbmRSZWdleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vdCBvbmUgb2YgdGhlIGZpdmUgc3RhdGUgcmVnZXhlcywgc28gaXQgbXVzdCBiZSB0aGUgZHluYW1pY2FsbHlcbiAgICAgICAgLy8gY3JlYXRlZCByYXcgdGV4dCByZWdleCBhbmQgd2UncmUgYXQgdGhlIGNsb3NlIG9mIHRoYXQgZWxlbWVudC5cbiAgICAgICAgcmVnZXggPSB0YWdFbmRSZWdleDtcbiAgICAgICAgcmF3VGV4dEVuZFJlZ2V4ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBhIGF0dHJOYW1lRW5kSW5kZXgsIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZFxuICAgICAgLy8gcmV3cml0ZSB0aGUgYXR0cmlidXRlIG5hbWUsIGFzc2VydCB0aGF0IHdlJ3JlIGluIGEgdmFsaWQgYXR0cmlidXRlXG4gICAgICAvLyBwb3NpdGlvbiAtIGVpdGhlciBpbiBhIHRhZywgb3IgYSBxdW90ZWQgYXR0cmlidXRlIHZhbHVlLlxuICAgICAgY29uc29sZS5hc3NlcnQoXG4gICAgICAgIGF0dHJOYW1lRW5kSW5kZXggPT09IC0xIHx8XG4gICAgICAgICAgcmVnZXggPT09IHRhZ0VuZFJlZ2V4IHx8XG4gICAgICAgICAgcmVnZXggPT09IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4IHx8XG4gICAgICAgICAgcmVnZXggPT09IGRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4LFxuICAgICAgICAndW5leHBlY3RlZCBwYXJzZSBzdGF0ZSBCJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBXZSBoYXZlIGZvdXIgY2FzZXM6XG4gICAgLy8gIDEuIFdlJ3JlIGluIHRleHQgcG9zaXRpb24sIGFuZCBub3QgaW4gYSByYXcgdGV4dCBlbGVtZW50XG4gICAgLy8gICAgIChyZWdleCA9PT0gdGV4dEVuZFJlZ2V4KTogaW5zZXJ0IGEgY29tbWVudCBtYXJrZXIuXG4gICAgLy8gIDIuIFdlIGhhdmUgYSBub24tbmVnYXRpdmUgYXR0ck5hbWVFbmRJbmRleCB3aGljaCBtZWFucyB3ZSBuZWVkIHRvXG4gICAgLy8gICAgIHJld3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGFkZCBhIGJvdW5kIGF0dHJpYnV0ZSBzdWZmaXguXG4gICAgLy8gIDMuIFdlJ3JlIGF0IHRoZSBub24tZmlyc3QgYmluZGluZyBpbiBhIG11bHRpLWJpbmRpbmcgYXR0cmlidXRlLCB1c2UgYVxuICAgIC8vICAgICBwbGFpbiBtYXJrZXIuXG4gICAgLy8gIDQuIFdlJ3JlIHNvbWV3aGVyZSBlbHNlIGluc2lkZSB0aGUgdGFnLiBJZiB3ZSdyZSBpbiBhdHRyaWJ1dGUgbmFtZVxuICAgIC8vICAgICBwb3NpdGlvbiAoYXR0ck5hbWVFbmRJbmRleCA9PT0gLTIpLCBhZGQgYSBzZXF1ZW50aWFsIHN1ZmZpeCB0b1xuICAgIC8vICAgICBnZW5lcmF0ZSBhIHVuaXF1ZSBhdHRyaWJ1dGUgbmFtZS5cblxuICAgIC8vIERldGVjdCBhIGJpbmRpbmcgbmV4dCB0byBzZWxmLWNsb3NpbmcgdGFnIGVuZCBhbmQgaW5zZXJ0IGEgc3BhY2UgdG9cbiAgICAvLyBzZXBhcmF0ZSB0aGUgbWFya2VyIGZyb20gdGhlIHRhZyBlbmQ6XG4gICAgY29uc3QgZW5kID1cbiAgICAgIHJlZ2V4ID09PSB0YWdFbmRSZWdleCAmJiBzdHJpbmdzW2kgKyAxXS5zdGFydHNXaXRoKCcvPicpID8gJyAnIDogJyc7XG4gICAgaHRtbCArPVxuICAgICAgcmVnZXggPT09IHRleHRFbmRSZWdleFxuICAgICAgICA/IHMgKyBub2RlTWFya2VyXG4gICAgICAgIDogYXR0ck5hbWVFbmRJbmRleCA+PSAwXG4gICAgICAgICAgPyAoYXR0ck5hbWVzLnB1c2goYXR0ck5hbWUhKSxcbiAgICAgICAgICAgIHMuc2xpY2UoMCwgYXR0ck5hbWVFbmRJbmRleCkgK1xuICAgICAgICAgICAgICBib3VuZEF0dHJpYnV0ZVN1ZmZpeCArXG4gICAgICAgICAgICAgIHMuc2xpY2UoYXR0ck5hbWVFbmRJbmRleCkpICtcbiAgICAgICAgICAgIG1hcmtlciArXG4gICAgICAgICAgICBlbmRcbiAgICAgICAgICA6IHMgKyBtYXJrZXIgKyAoYXR0ck5hbWVFbmRJbmRleCA9PT0gLTIgPyBpIDogZW5kKTtcbiAgfVxuXG4gIGNvbnN0IGh0bWxSZXN1bHQ6IHN0cmluZyB8IFRydXN0ZWRIVE1MID1cbiAgICBodG1sICtcbiAgICAoc3RyaW5nc1tsXSB8fCAnPD8+JykgK1xuICAgICh0eXBlID09PSBTVkdfUkVTVUxUID8gJzwvc3ZnPicgOiB0eXBlID09PSBNQVRITUxfUkVTVUxUID8gJzwvbWF0aD4nIDogJycpO1xuXG4gIC8vIFJldHVybmVkIGFzIGFuIGFycmF5IGZvciB0ZXJzZW5lc3NcbiAgcmV0dXJuIFt0cnVzdEZyb21UZW1wbGF0ZVN0cmluZyhzdHJpbmdzLCBodG1sUmVzdWx0KSwgYXR0ck5hbWVzXTtcbn07XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCB0eXBlIHtUZW1wbGF0ZX07XG5jbGFzcyBUZW1wbGF0ZSB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZWwhOiBIVE1MVGVtcGxhdGVFbGVtZW50O1xuXG4gIHBhcnRzOiBBcnJheTxUZW1wbGF0ZVBhcnQ+ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICB7c3RyaW5ncywgWydfJGxpdFR5cGUkJ106IHR5cGV9OiBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQsXG4gICAgb3B0aW9ucz86IFJlbmRlck9wdGlvbnNcbiAgKSB7XG4gICAgbGV0IG5vZGU6IE5vZGUgfCBudWxsO1xuICAgIGxldCBub2RlSW5kZXggPSAwO1xuICAgIGxldCBhdHRyTmFtZUluZGV4ID0gMDtcbiAgICBjb25zdCBwYXJ0Q291bnQgPSBzdHJpbmdzLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzO1xuXG4gICAgLy8gQ3JlYXRlIHRlbXBsYXRlIGVsZW1lbnRcbiAgICBjb25zdCBbaHRtbCwgYXR0ck5hbWVzXSA9IGdldFRlbXBsYXRlSHRtbChzdHJpbmdzLCB0eXBlKTtcbiAgICB0aGlzLmVsID0gVGVtcGxhdGUuY3JlYXRlRWxlbWVudChodG1sLCBvcHRpb25zKTtcbiAgICB3YWxrZXIuY3VycmVudE5vZGUgPSB0aGlzLmVsLmNvbnRlbnQ7XG5cbiAgICAvLyBSZS1wYXJlbnQgU1ZHIG9yIE1hdGhNTCBub2RlcyBpbnRvIHRlbXBsYXRlIHJvb3RcbiAgICBpZiAodHlwZSA9PT0gU1ZHX1JFU1VMVCB8fCB0eXBlID09PSBNQVRITUxfUkVTVUxUKSB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5lbC5jb250ZW50LmZpcnN0Q2hpbGQhO1xuICAgICAgd3JhcHBlci5yZXBsYWNlV2l0aCguLi53cmFwcGVyLmNoaWxkTm9kZXMpO1xuICAgIH1cblxuICAgIC8vIFdhbGsgdGhlIHRlbXBsYXRlIHRvIGZpbmQgYmluZGluZyBtYXJrZXJzIGFuZCBjcmVhdGUgVGVtcGxhdGVQYXJ0c1xuICAgIHdoaWxlICgobm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpKSAhPT0gbnVsbCAmJiBwYXJ0cy5sZW5ndGggPCBwYXJ0Q291bnQpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICAgIGNvbnN0IHRhZyA9IChub2RlIGFzIEVsZW1lbnQpLmxvY2FsTmFtZTtcbiAgICAgICAgICAvLyBXYXJuIGlmIGB0ZXh0YXJlYWAgaW5jbHVkZXMgYW4gZXhwcmVzc2lvbiBhbmQgdGhyb3cgaWYgYHRlbXBsYXRlYFxuICAgICAgICAgIC8vIGRvZXMgc2luY2UgdGhlc2UgYXJlIG5vdCBzdXBwb3J0ZWQuIFdlIGRvIHRoaXMgYnkgY2hlY2tpbmdcbiAgICAgICAgICAvLyBpbm5lckhUTUwgZm9yIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIG1hcmtlci4gVGhpcyBjYXRjaGVzXG4gICAgICAgICAgLy8gY2FzZXMgbGlrZSBiaW5kaW5ncyBpbiB0ZXh0YXJlYSB0aGVyZSBtYXJrZXJzIHR1cm4gaW50byB0ZXh0IG5vZGVzLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC9eKD86dGV4dGFyZWF8dGVtcGxhdGUpJC9pIS50ZXN0KHRhZykgJiZcbiAgICAgICAgICAgIChub2RlIGFzIEVsZW1lbnQpLmlubmVySFRNTC5pbmNsdWRlcyhtYXJrZXIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBtID1cbiAgICAgICAgICAgICAgYEV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIGluc2lkZSBcXGAke3RhZ31cXGAgYCArXG4gICAgICAgICAgICAgIGBlbGVtZW50cy4gU2VlIGh0dHBzOi8vbGl0LmRldi9tc2cvZXhwcmVzc2lvbi1pbi0ke3RhZ30gZm9yIG1vcmUgYCArXG4gICAgICAgICAgICAgIGBpbmZvcm1hdGlvbi5gO1xuICAgICAgICAgICAgaWYgKHRhZyA9PT0gJ3RlbXBsYXRlJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobSk7XG4gICAgICAgICAgICB9IGVsc2UgaXNzdWVXYXJuaW5nKCcnLCBtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IGZvciBhdHRlbXB0ZWQgZHluYW1pYyB0YWcgbmFtZXMsIHdlIGRvbid0XG4gICAgICAgIC8vIGluY3JlbWVudCB0aGUgYmluZGluZ0luZGV4LCBhbmQgaXQnbGwgYmUgb2ZmIGJ5IDEgaW4gdGhlIGVsZW1lbnRcbiAgICAgICAgLy8gYW5kIG9mZiBieSB0d28gYWZ0ZXIgaXQuXG4gICAgICAgIGlmICgobm9kZSBhcyBFbGVtZW50KS5oYXNBdHRyaWJ1dGVzKCkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoYm91bmRBdHRyaWJ1dGVTdWZmaXgpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlYWxOYW1lID0gYXR0ck5hbWVzW2F0dHJOYW1lSW5kZXgrK107XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKG5hbWUpITtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdGljcyA9IHZhbHVlLnNwbGl0KG1hcmtlcik7XG4gICAgICAgICAgICAgIGNvbnN0IG0gPSAvKFsuP0BdKT8oLiopLy5leGVjKHJlYWxOYW1lKSE7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IEFUVFJJQlVURV9QQVJULFxuICAgICAgICAgICAgICAgIGluZGV4OiBub2RlSW5kZXgsXG4gICAgICAgICAgICAgICAgbmFtZTogbVsyXSxcbiAgICAgICAgICAgICAgICBzdHJpbmdzOiBzdGF0aWNzLFxuICAgICAgICAgICAgICAgIGN0b3I6XG4gICAgICAgICAgICAgICAgICBtWzFdID09PSAnLidcbiAgICAgICAgICAgICAgICAgICAgPyBQcm9wZXJ0eVBhcnRcbiAgICAgICAgICAgICAgICAgICAgOiBtWzFdID09PSAnPydcbiAgICAgICAgICAgICAgICAgICAgICA/IEJvb2xlYW5BdHRyaWJ1dGVQYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgOiBtWzFdID09PSAnQCdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gRXZlbnRQYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IEF0dHJpYnV0ZVBhcnQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAobm9kZSBhcyBFbGVtZW50KS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aChtYXJrZXIpKSB7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IEVMRU1FTlRfUEFSVCxcbiAgICAgICAgICAgICAgICBpbmRleDogbm9kZUluZGV4LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgKG5vZGUgYXMgRWxlbWVudCkucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIChqdXN0aW5mYWduYW5pKTogYmVuY2htYXJrIHRoZSByZWdleCBhZ2FpbnN0IHRlc3RpbmcgZm9yIGVhY2hcbiAgICAgICAgLy8gb2YgdGhlIDMgcmF3IHRleHQgZWxlbWVudCBuYW1lcy5cbiAgICAgICAgaWYgKHJhd1RleHRFbGVtZW50LnRlc3QoKG5vZGUgYXMgRWxlbWVudCkudGFnTmFtZSkpIHtcbiAgICAgICAgICAvLyBGb3IgcmF3IHRleHQgZWxlbWVudHMgd2UgbmVlZCB0byBzcGxpdCB0aGUgdGV4dCBjb250ZW50IG9uXG4gICAgICAgICAgLy8gbWFya2VycywgY3JlYXRlIGEgVGV4dCBub2RlIGZvciBlYWNoIHNlZ21lbnQsIGFuZCBjcmVhdGVcbiAgICAgICAgICAvLyBhIFRlbXBsYXRlUGFydCBmb3IgZWFjaCBtYXJrZXIuXG4gICAgICAgICAgY29uc3Qgc3RyaW5ncyA9IChub2RlIGFzIEVsZW1lbnQpLnRleHRDb250ZW50IS5zcGxpdChtYXJrZXIpO1xuICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IHN0cmluZ3MubGVuZ3RoIC0gMTtcbiAgICAgICAgICBpZiAobGFzdEluZGV4ID4gMCkge1xuICAgICAgICAgICAgKG5vZGUgYXMgRWxlbWVudCkudGV4dENvbnRlbnQgPSB0cnVzdGVkVHlwZXNcbiAgICAgICAgICAgICAgPyAodHJ1c3RlZFR5cGVzLmVtcHR5U2NyaXB0IGFzIHVua25vd24gYXMgJycpXG4gICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgICAvLyBHZW5lcmF0ZSBhIG5ldyB0ZXh0IG5vZGUgZm9yIGVhY2ggbGl0ZXJhbCBzZWN0aW9uXG4gICAgICAgICAgICAvLyBUaGVzZSBub2RlcyBhcmUgYWxzbyB1c2VkIGFzIHRoZSBtYXJrZXJzIGZvciBub2RlIHBhcnRzXG4gICAgICAgICAgICAvLyBXZSBjYW4ndCB1c2UgZW1wdHkgdGV4dCBub2RlcyBhcyBtYXJrZXJzIGJlY2F1c2UgdGhleSdyZVxuICAgICAgICAgICAgLy8gbm9ybWFsaXplZCB3aGVuIGNsb25pbmcgaW4gSUUgKGNvdWxkIHNpbXBsaWZ5IHdoZW5cbiAgICAgICAgICAgIC8vIElFIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhc3RJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICAgIChub2RlIGFzIEVsZW1lbnQpLmFwcGVuZChzdHJpbmdzW2ldLCBjcmVhdGVNYXJrZXIoKSk7XG4gICAgICAgICAgICAgIC8vIFdhbGsgcGFzdCB0aGUgbWFya2VyIG5vZGUgd2UganVzdCBhZGRlZFxuICAgICAgICAgICAgICB3YWxrZXIubmV4dE5vZGUoKTtcbiAgICAgICAgICAgICAgcGFydHMucHVzaCh7dHlwZTogQ0hJTERfUEFSVCwgaW5kZXg6ICsrbm9kZUluZGV4fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBOb3RlIGJlY2F1c2UgdGhpcyBtYXJrZXIgaXMgYWRkZWQgYWZ0ZXIgdGhlIHdhbGtlcidzIGN1cnJlbnRcbiAgICAgICAgICAgIC8vIG5vZGUsIGl0IHdpbGwgYmUgd2Fsa2VkIHRvIGluIHRoZSBvdXRlciBsb29wIChhbmQgaWdub3JlZCksIHNvXG4gICAgICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGFkanVzdCBub2RlSW5kZXggaGVyZVxuICAgICAgICAgICAgKG5vZGUgYXMgRWxlbWVudCkuYXBwZW5kKHN0cmluZ3NbbGFzdEluZGV4XSwgY3JlYXRlTWFya2VyKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09PSA4KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSAobm9kZSBhcyBDb21tZW50KS5kYXRhO1xuICAgICAgICBpZiAoZGF0YSA9PT0gbWFya2VyTWF0Y2gpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKHt0eXBlOiBDSElMRF9QQVJULCBpbmRleDogbm9kZUluZGV4fSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IGkgPSAtMTtcbiAgICAgICAgICB3aGlsZSAoKGkgPSAobm9kZSBhcyBDb21tZW50KS5kYXRhLmluZGV4T2YobWFya2VyLCBpICsgMSkpICE9PSAtMSkge1xuICAgICAgICAgICAgLy8gQ29tbWVudCBub2RlIGhhcyBhIGJpbmRpbmcgbWFya2VyIGluc2lkZSwgbWFrZSBhbiBpbmFjdGl2ZSBwYXJ0XG4gICAgICAgICAgICAvLyBUaGUgYmluZGluZyB3b24ndCB3b3JrLCBidXQgc3Vic2VxdWVudCBiaW5kaW5ncyB3aWxsXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKHt0eXBlOiBDT01NRU5UX1BBUlQsIGluZGV4OiBub2RlSW5kZXh9KTtcbiAgICAgICAgICAgIC8vIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgbWF0Y2hcbiAgICAgICAgICAgIGkgKz0gbWFya2VyLmxlbmd0aCAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBub2RlSW5kZXgrKztcbiAgICB9XG5cbiAgICBpZiAoREVWX01PREUpIHtcbiAgICAgIC8vIElmIHRoZXJlIHdhcyBhIGR1cGxpY2F0ZSBhdHRyaWJ1dGUgb24gYSB0YWcsIHRoZW4gd2hlbiB0aGUgdGFnIGlzXG4gICAgICAvLyBwYXJzZWQgaW50byBhbiBlbGVtZW50IHRoZSBhdHRyaWJ1dGUgZ2V0cyBkZS1kdXBsaWNhdGVkLiBXZSBjYW4gZGV0ZWN0XG4gICAgICAvLyB0aGlzIG1pc21hdGNoIGlmIHdlIGhhdmVuJ3QgcHJlY2lzZWx5IGNvbnN1bWVkIGV2ZXJ5IGF0dHJpYnV0ZSBuYW1lXG4gICAgICAvLyB3aGVuIHByZXBhcmluZyB0aGUgdGVtcGxhdGUuIFRoaXMgd29ya3MgYmVjYXVzZSBgYXR0ck5hbWVzYCBpcyBidWlsdFxuICAgICAgLy8gZnJvbSB0aGUgdGVtcGxhdGUgc3RyaW5nIGFuZCBgYXR0ck5hbWVJbmRleGAgY29tZXMgZnJvbSBwcm9jZXNzaW5nIHRoZVxuICAgICAgLy8gcmVzdWx0aW5nIERPTS5cbiAgICAgIGlmIChhdHRyTmFtZXMubGVuZ3RoICE9PSBhdHRyTmFtZUluZGV4KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRGV0ZWN0ZWQgZHVwbGljYXRlIGF0dHJpYnV0ZSBiaW5kaW5ncy4gVGhpcyBvY2N1cnMgaWYgeW91ciB0ZW1wbGF0ZSBgICtcbiAgICAgICAgICAgIGBoYXMgZHVwbGljYXRlIGF0dHJpYnV0ZXMgb24gYW4gZWxlbWVudCB0YWcuIEZvciBleGFtcGxlIGAgK1xuICAgICAgICAgICAgYFwiPGlucHV0ID9kaXNhYmxlZD1cXCR7dHJ1ZX0gP2Rpc2FibGVkPVxcJHtmYWxzZX0+XCIgY29udGFpbnMgYSBgICtcbiAgICAgICAgICAgIGBkdXBsaWNhdGUgXCJkaXNhYmxlZFwiIGF0dHJpYnV0ZS4gVGhlIGVycm9yIHdhcyBkZXRlY3RlZCBpbiBgICtcbiAgICAgICAgICAgIGB0aGUgZm9sbG93aW5nIHRlbXBsYXRlOiBcXG5gICtcbiAgICAgICAgICAgICdgJyArXG4gICAgICAgICAgICBzdHJpbmdzLmpvaW4oJyR7Li4ufScpICtcbiAgICAgICAgICAgICdgJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdlIGNvdWxkIHNldCB3YWxrZXIuY3VycmVudE5vZGUgdG8gYW5vdGhlciBub2RlIGhlcmUgdG8gcHJldmVudCBhIG1lbW9yeVxuICAgIC8vIGxlYWssIGJ1dCBldmVyeSB0aW1lIHdlIHByZXBhcmUgYSB0ZW1wbGF0ZSwgd2UgaW1tZWRpYXRlbHkgcmVuZGVyIGl0XG4gICAgLy8gYW5kIHJlLXVzZSB0aGUgd2Fsa2VyIGluIG5ldyBUZW1wbGF0ZUluc3RhbmNlLl9jbG9uZSgpLlxuICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICBraW5kOiAndGVtcGxhdGUgcHJlcCcsXG4gICAgICAgIHRlbXBsYXRlOiB0aGlzLFxuICAgICAgICBjbG9uYWJsZVRlbXBsYXRlOiB0aGlzLmVsLFxuICAgICAgICBwYXJ0czogdGhpcy5wYXJ0cyxcbiAgICAgICAgc3RyaW5ncyxcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gT3ZlcnJpZGRlbiB2aWEgYGxpdEh0bWxQb2x5ZmlsbFN1cHBvcnRgIHRvIHByb3ZpZGUgcGxhdGZvcm0gc3VwcG9ydC5cbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjcmVhdGVFbGVtZW50KGh0bWw6IFRydXN0ZWRIVE1MLCBfb3B0aW9ucz86IFJlbmRlck9wdGlvbnMpIHtcbiAgICBjb25zdCBlbCA9IGQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICBlbC5pbm5lckhUTUwgPSBodG1sIGFzIHVua25vd24gYXMgc3RyaW5nO1xuICAgIHJldHVybiBlbDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpc2Nvbm5lY3RhYmxlIHtcbiAgXyRwYXJlbnQ/OiBEaXNjb25uZWN0YWJsZTtcbiAgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuPzogU2V0PERpc2Nvbm5lY3RhYmxlPjtcbiAgLy8gUmF0aGVyIHRoYW4gaG9sZCBjb25uZWN0aW9uIHN0YXRlIG9uIGluc3RhbmNlcywgRGlzY29ubmVjdGFibGVzIHJlY3Vyc2l2ZWx5XG4gIC8vIGZldGNoIHRoZSBjb25uZWN0aW9uIHN0YXRlIGZyb20gdGhlIFJvb3RQYXJ0IHRoZXkgYXJlIGNvbm5lY3RlZCBpbiB2aWFcbiAgLy8gZ2V0dGVycyB1cCB0aGUgRGlzY29ubmVjdGFibGUgdHJlZSB2aWEgXyRwYXJlbnQgcmVmZXJlbmNlcy4gVGhpcyBwdXNoZXMgdGhlXG4gIC8vIGNvc3Qgb2YgdHJhY2tpbmcgdGhlIGlzQ29ubmVjdGVkIHN0YXRlIHRvIGBBc3luY0RpcmVjdGl2ZXNgLCBhbmQgYXZvaWRzXG4gIC8vIG5lZWRpbmcgdG8gcGFzcyBhbGwgRGlzY29ubmVjdGFibGVzIChwYXJ0cywgdGVtcGxhdGUgaW5zdGFuY2VzLCBhbmRcbiAgLy8gZGlyZWN0aXZlcykgdGhlaXIgY29ubmVjdGlvbiBzdGF0ZSBlYWNoIHRpbWUgaXQgY2hhbmdlcywgd2hpY2ggd291bGQgYmVcbiAgLy8gY29zdGx5IGZvciB0cmVlcyB0aGF0IGhhdmUgbm8gQXN5bmNEaXJlY3RpdmVzLlxuICBfJGlzQ29ubmVjdGVkOiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGlyZWN0aXZlKFxuICBwYXJ0OiBDaGlsZFBhcnQgfCBBdHRyaWJ1dGVQYXJ0IHwgRWxlbWVudFBhcnQsXG4gIHZhbHVlOiB1bmtub3duLFxuICBwYXJlbnQ6IERpcmVjdGl2ZVBhcmVudCA9IHBhcnQsXG4gIGF0dHJpYnV0ZUluZGV4PzogbnVtYmVyXG4pOiB1bmtub3duIHtcbiAgLy8gQmFpbCBlYXJseSBpZiB0aGUgdmFsdWUgaXMgZXhwbGljaXRseSBub0NoYW5nZS4gTm90ZSwgdGhpcyBtZWFucyBhbnlcbiAgLy8gbmVzdGVkIGRpcmVjdGl2ZSBpcyBzdGlsbCBhdHRhY2hlZCBhbmQgaXMgbm90IHJ1bi5cbiAgaWYgKHZhbHVlID09PSBub0NoYW5nZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBsZXQgY3VycmVudERpcmVjdGl2ZSA9XG4gICAgYXR0cmlidXRlSW5kZXggIT09IHVuZGVmaW5lZFxuICAgICAgPyAocGFyZW50IGFzIEF0dHJpYnV0ZVBhcnQpLl9fZGlyZWN0aXZlcz8uW2F0dHJpYnV0ZUluZGV4XVxuICAgICAgOiAocGFyZW50IGFzIENoaWxkUGFydCB8IEVsZW1lbnRQYXJ0IHwgRGlyZWN0aXZlKS5fX2RpcmVjdGl2ZTtcbiAgY29uc3QgbmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yID0gaXNQcmltaXRpdmUodmFsdWUpXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICAodmFsdWUgYXMgRGlyZWN0aXZlUmVzdWx0KVsnXyRsaXREaXJlY3RpdmUkJ107XG4gIGlmIChjdXJyZW50RGlyZWN0aXZlPy5jb25zdHJ1Y3RvciAhPT0gbmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yKSB7XG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICBjdXJyZW50RGlyZWN0aXZlPy5bJ18kbm90aWZ5RGlyZWN0aXZlQ29ubmVjdGlvbkNoYW5nZWQnXT8uKGZhbHNlKTtcbiAgICBpZiAobmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGN1cnJlbnREaXJlY3RpdmUgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnREaXJlY3RpdmUgPSBuZXcgbmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yKHBhcnQgYXMgUGFydEluZm8pO1xuICAgICAgY3VycmVudERpcmVjdGl2ZS5fJGluaXRpYWxpemUocGFydCwgcGFyZW50LCBhdHRyaWJ1dGVJbmRleCk7XG4gICAgfVxuICAgIGlmIChhdHRyaWJ1dGVJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAoKHBhcmVudCBhcyBBdHRyaWJ1dGVQYXJ0KS5fX2RpcmVjdGl2ZXMgPz89IFtdKVthdHRyaWJ1dGVJbmRleF0gPVxuICAgICAgICBjdXJyZW50RGlyZWN0aXZlO1xuICAgIH0gZWxzZSB7XG4gICAgICAocGFyZW50IGFzIENoaWxkUGFydCB8IERpcmVjdGl2ZSkuX19kaXJlY3RpdmUgPSBjdXJyZW50RGlyZWN0aXZlO1xuICAgIH1cbiAgfVxuICBpZiAoY3VycmVudERpcmVjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsdWUgPSByZXNvbHZlRGlyZWN0aXZlKFxuICAgICAgcGFydCxcbiAgICAgIGN1cnJlbnREaXJlY3RpdmUuXyRyZXNvbHZlKHBhcnQsICh2YWx1ZSBhcyBEaXJlY3RpdmVSZXN1bHQpLnZhbHVlcyksXG4gICAgICBjdXJyZW50RGlyZWN0aXZlLFxuICAgICAgYXR0cmlidXRlSW5kZXhcbiAgICApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IHR5cGUge1RlbXBsYXRlSW5zdGFuY2V9O1xuLyoqXG4gKiBBbiB1cGRhdGVhYmxlIGluc3RhbmNlIG9mIGEgVGVtcGxhdGUuIEhvbGRzIHJlZmVyZW5jZXMgdG8gdGhlIFBhcnRzIHVzZWQgdG9cbiAqIHVwZGF0ZSB0aGUgdGVtcGxhdGUgaW5zdGFuY2UuXG4gKi9cbmNsYXNzIFRlbXBsYXRlSW5zdGFuY2UgaW1wbGVtZW50cyBEaXNjb25uZWN0YWJsZSB7XG4gIF8kdGVtcGxhdGU6IFRlbXBsYXRlO1xuICBfJHBhcnRzOiBBcnJheTxQYXJ0IHwgdW5kZWZpbmVkPiA9IFtdO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRwYXJlbnQ6IENoaWxkUGFydDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4/OiBTZXQ8RGlzY29ubmVjdGFibGU+ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlOiBUZW1wbGF0ZSwgcGFyZW50OiBDaGlsZFBhcnQpIHtcbiAgICB0aGlzLl8kdGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB0aGlzLl8kcGFyZW50ID0gcGFyZW50O1xuICB9XG5cbiAgLy8gQ2FsbGVkIGJ5IENoaWxkUGFydCBwYXJlbnROb2RlIGdldHRlclxuICBnZXQgcGFyZW50Tm9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5wYXJlbnROb2RlO1xuICB9XG5cbiAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5fJGlzQ29ubmVjdGVkO1xuICB9XG5cbiAgLy8gVGhpcyBtZXRob2QgaXMgc2VwYXJhdGUgZnJvbSB0aGUgY29uc3RydWN0b3IgYmVjYXVzZSB3ZSBuZWVkIHRvIHJldHVybiBhXG4gIC8vIERvY3VtZW50RnJhZ21lbnQgYW5kIHdlIGRvbid0IHdhbnQgdG8gaG9sZCBvbnRvIGl0IHdpdGggYW4gaW5zdGFuY2UgZmllbGQuXG4gIF9jbG9uZShvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qge1xuICAgICAgZWw6IHtjb250ZW50fSxcbiAgICAgIHBhcnRzOiBwYXJ0cyxcbiAgICB9ID0gdGhpcy5fJHRlbXBsYXRlO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gKG9wdGlvbnM/LmNyZWF0aW9uU2NvcGUgPz8gZCkuaW1wb3J0Tm9kZShjb250ZW50LCB0cnVlKTtcbiAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBmcmFnbWVudDtcblxuICAgIGxldCBub2RlID0gd2Fsa2VyLm5leHROb2RlKCkhO1xuICAgIGxldCBub2RlSW5kZXggPSAwO1xuICAgIGxldCBwYXJ0SW5kZXggPSAwO1xuICAgIGxldCB0ZW1wbGF0ZVBhcnQgPSBwYXJ0c1swXTtcblxuICAgIHdoaWxlICh0ZW1wbGF0ZVBhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG5vZGVJbmRleCA9PT0gdGVtcGxhdGVQYXJ0LmluZGV4KSB7XG4gICAgICAgIGxldCBwYXJ0OiBQYXJ0IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGVtcGxhdGVQYXJ0LnR5cGUgPT09IENISUxEX1BBUlQpIHtcbiAgICAgICAgICBwYXJ0ID0gbmV3IENoaWxkUGFydChcbiAgICAgICAgICAgIG5vZGUgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICBub2RlLm5leHRTaWJsaW5nLFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHRlbXBsYXRlUGFydC50eXBlID09PSBBVFRSSUJVVEVfUEFSVCkge1xuICAgICAgICAgIHBhcnQgPSBuZXcgdGVtcGxhdGVQYXJ0LmN0b3IoXG4gICAgICAgICAgICBub2RlIGFzIEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgdGVtcGxhdGVQYXJ0Lm5hbWUsXG4gICAgICAgICAgICB0ZW1wbGF0ZVBhcnQuc3RyaW5ncyxcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0ZW1wbGF0ZVBhcnQudHlwZSA9PT0gRUxFTUVOVF9QQVJUKSB7XG4gICAgICAgICAgcGFydCA9IG5ldyBFbGVtZW50UGFydChub2RlIGFzIEhUTUxFbGVtZW50LCB0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl8kcGFydHMucHVzaChwYXJ0KTtcbiAgICAgICAgdGVtcGxhdGVQYXJ0ID0gcGFydHNbKytwYXJ0SW5kZXhdO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGVJbmRleCAhPT0gdGVtcGxhdGVQYXJ0Py5pbmRleCkge1xuICAgICAgICBub2RlID0gd2Fsa2VyLm5leHROb2RlKCkhO1xuICAgICAgICBub2RlSW5kZXgrKztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gV2UgbmVlZCB0byBzZXQgdGhlIGN1cnJlbnROb2RlIGF3YXkgZnJvbSB0aGUgY2xvbmVkIHRyZWUgc28gdGhhdCB3ZVxuICAgIC8vIGRvbid0IGhvbGQgb250byB0aGUgdHJlZSBldmVuIGlmIHRoZSB0cmVlIGlzIGRldGFjaGVkIGFuZCBzaG91bGQgYmVcbiAgICAvLyBmcmVlZC5cbiAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBkO1xuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIF91cGRhdGUodmFsdWVzOiBBcnJheTx1bmtub3duPikge1xuICAgIGxldCBpID0gMDtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgdGhpcy5fJHBhcnRzKSB7XG4gICAgICBpZiAocGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgIGtpbmQ6ICdzZXQgcGFydCcsXG4gICAgICAgICAgICBwYXJ0LFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlc1tpXSxcbiAgICAgICAgICAgIHZhbHVlSW5kZXg6IGksXG4gICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICB0ZW1wbGF0ZUluc3RhbmNlOiB0aGlzLFxuICAgICAgICAgIH0pO1xuICAgICAgICBpZiAoKHBhcnQgYXMgQXR0cmlidXRlUGFydCkuc3RyaW5ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKHBhcnQgYXMgQXR0cmlidXRlUGFydCkuXyRzZXRWYWx1ZSh2YWx1ZXMsIHBhcnQgYXMgQXR0cmlidXRlUGFydCwgaSk7XG4gICAgICAgICAgLy8gVGhlIG51bWJlciBvZiB2YWx1ZXMgdGhlIHBhcnQgY29uc3VtZXMgaXMgcGFydC5zdHJpbmdzLmxlbmd0aCAtIDFcbiAgICAgICAgICAvLyBzaW5jZSB2YWx1ZXMgYXJlIGluIGJldHdlZW4gdGVtcGxhdGUgc3BhbnMuIFdlIGluY3JlbWVudCBpIGJ5IDFcbiAgICAgICAgICAvLyBsYXRlciBpbiB0aGUgbG9vcCwgc28gaW5jcmVtZW50IGl0IGJ5IHBhcnQuc3RyaW5ncy5sZW5ndGggLSAyIGhlcmVcbiAgICAgICAgICBpICs9IChwYXJ0IGFzIEF0dHJpYnV0ZVBhcnQpLnN0cmluZ3MhLmxlbmd0aCAtIDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFydC5fJHNldFZhbHVlKHZhbHVlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9XG4gIH1cbn1cblxuLypcbiAqIFBhcnRzXG4gKi9cbnR5cGUgQXR0cmlidXRlVGVtcGxhdGVQYXJ0ID0ge1xuICByZWFkb25seSB0eXBlOiB0eXBlb2YgQVRUUklCVVRFX1BBUlQ7XG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgY3RvcjogdHlwZW9mIEF0dHJpYnV0ZVBhcnQ7XG4gIHJlYWRvbmx5IHN0cmluZ3M6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPjtcbn07XG50eXBlIENoaWxkVGVtcGxhdGVQYXJ0ID0ge1xuICByZWFkb25seSB0eXBlOiB0eXBlb2YgQ0hJTERfUEFSVDtcbiAgcmVhZG9ubHkgaW5kZXg6IG51bWJlcjtcbn07XG50eXBlIEVsZW1lbnRUZW1wbGF0ZVBhcnQgPSB7XG4gIHJlYWRvbmx5IHR5cGU6IHR5cGVvZiBFTEVNRU5UX1BBUlQ7XG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG59O1xudHlwZSBDb21tZW50VGVtcGxhdGVQYXJ0ID0ge1xuICByZWFkb25seSB0eXBlOiB0eXBlb2YgQ09NTUVOVF9QQVJUO1xuICByZWFkb25seSBpbmRleDogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBBIFRlbXBsYXRlUGFydCByZXByZXNlbnRzIGEgZHluYW1pYyBwYXJ0IGluIGEgdGVtcGxhdGUsIGJlZm9yZSB0aGUgdGVtcGxhdGVcbiAqIGlzIGluc3RhbnRpYXRlZC4gV2hlbiBhIHRlbXBsYXRlIGlzIGluc3RhbnRpYXRlZCBQYXJ0cyBhcmUgY3JlYXRlZCBmcm9tXG4gKiBUZW1wbGF0ZVBhcnRzLlxuICovXG50eXBlIFRlbXBsYXRlUGFydCA9XG4gIHwgQ2hpbGRUZW1wbGF0ZVBhcnRcbiAgfCBBdHRyaWJ1dGVUZW1wbGF0ZVBhcnRcbiAgfCBFbGVtZW50VGVtcGxhdGVQYXJ0XG4gIHwgQ29tbWVudFRlbXBsYXRlUGFydDtcblxuZXhwb3J0IHR5cGUgUGFydCA9XG4gIHwgQ2hpbGRQYXJ0XG4gIHwgQXR0cmlidXRlUGFydFxuICB8IFByb3BlcnR5UGFydFxuICB8IEJvb2xlYW5BdHRyaWJ1dGVQYXJ0XG4gIHwgRWxlbWVudFBhcnRcbiAgfCBFdmVudFBhcnQ7XG5cbmV4cG9ydCB0eXBlIHtDaGlsZFBhcnR9O1xuY2xhc3MgQ2hpbGRQYXJ0IGltcGxlbWVudHMgRGlzY29ubmVjdGFibGUge1xuICByZWFkb25seSB0eXBlID0gQ0hJTERfUEFSVDtcbiAgcmVhZG9ubHkgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgXyRjb21taXR0ZWRWYWx1ZTogdW5rbm93biA9IG5vdGhpbmc7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX19kaXJlY3RpdmU/OiBEaXJlY3RpdmU7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRzdGFydE5vZGU6IENoaWxkTm9kZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGVuZE5vZGU6IENoaWxkTm9kZSB8IG51bGw7XG4gIHByaXZhdGUgX3RleHRTYW5pdGl6ZXI6IFZhbHVlU2FuaXRpemVyIHwgdW5kZWZpbmVkO1xuICAvKiogQGludGVybmFsICovXG4gIF8kcGFyZW50OiBEaXNjb25uZWN0YWJsZSB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIENvbm5lY3Rpb24gc3RhdGUgZm9yIFJvb3RQYXJ0cyBvbmx5IChpLmUuIENoaWxkUGFydCB3aXRob3V0IF8kcGFyZW50XG4gICAqIHJldHVybmVkIGZyb20gdG9wLWxldmVsIGByZW5kZXJgKS4gVGhpcyBmaWVsZCBpcyB1bnVzZWQgb3RoZXJ3aXNlLiBUaGVcbiAgICogaW50ZW50aW9uIHdvdWxkIGJlIGNsZWFyZXIgaWYgd2UgbWFkZSBgUm9vdFBhcnRgIGEgc3ViY2xhc3Mgb2YgYENoaWxkUGFydGBcbiAgICogd2l0aCB0aGlzIGZpZWxkIChhbmQgYSBkaWZmZXJlbnQgXyRpc0Nvbm5lY3RlZCBnZXR0ZXIpLCBidXQgdGhlIHN1YmNsYXNzXG4gICAqIGNhdXNlZCBhIHBlcmYgcmVncmVzc2lvbiwgcG9zc2libHkgZHVlIHRvIG1ha2luZyBjYWxsIHNpdGVzIHBvbHltb3JwaGljLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9faXNDb25uZWN0ZWQ6IGJvb2xlYW47XG5cbiAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICAvLyBDaGlsZFBhcnRzIHRoYXQgYXJlIG5vdCBhdCB0aGUgcm9vdCBzaG91bGQgYWx3YXlzIGJlIGNyZWF0ZWQgd2l0aCBhXG4gICAgLy8gcGFyZW50OyBvbmx5IFJvb3RDaGlsZE5vZGUncyB3b24ndCwgc28gdGhleSByZXR1cm4gdGhlIGxvY2FsIGlzQ29ubmVjdGVkXG4gICAgLy8gc3RhdGVcbiAgICByZXR1cm4gdGhpcy5fJHBhcmVudD8uXyRpc0Nvbm5lY3RlZCA/PyB0aGlzLl9faXNDb25uZWN0ZWQ7XG4gIH1cblxuICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkcyB3aWxsIGJlIHBhdGNoZWQgb250byBDaGlsZFBhcnRzIHdoZW4gcmVxdWlyZWQgYnlcbiAgLy8gQXN5bmNEaXJlY3RpdmVcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4/OiBTZXQ8RGlzY29ubmVjdGFibGU+ID0gdW5kZWZpbmVkO1xuICAvKiogQGludGVybmFsICovXG4gIF8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQ/KFxuICAgIGlzQ29ubmVjdGVkOiBib29sZWFuLFxuICAgIHJlbW92ZUZyb21QYXJlbnQ/OiBib29sZWFuLFxuICAgIGZyb20/OiBudW1iZXJcbiAgKTogdm9pZDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJHJlcGFyZW50RGlzY29ubmVjdGFibGVzPyhwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlKTogdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzdGFydE5vZGU6IENoaWxkTm9kZSxcbiAgICBlbmROb2RlOiBDaGlsZE5vZGUgfCBudWxsLFxuICAgIHBhcmVudDogVGVtcGxhdGVJbnN0YW5jZSB8IENoaWxkUGFydCB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuXyRzdGFydE5vZGUgPSBzdGFydE5vZGU7XG4gICAgdGhpcy5fJGVuZE5vZGUgPSBlbmROb2RlO1xuICAgIHRoaXMuXyRwYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAvLyBOb3RlIF9faXNDb25uZWN0ZWQgaXMgb25seSBldmVyIGFjY2Vzc2VkIG9uIFJvb3RQYXJ0cyAoaS5lLiB3aGVuIHRoZXJlIGlzXG4gICAgLy8gbm8gXyRwYXJlbnQpOyB0aGUgdmFsdWUgb24gYSBub24tcm9vdC1wYXJ0IGlzIFwiZG9uJ3QgY2FyZVwiLCBidXQgY2hlY2tpbmdcbiAgICAvLyBmb3IgcGFyZW50IHdvdWxkIGJlIG1vcmUgY29kZVxuICAgIHRoaXMuX19pc0Nvbm5lY3RlZCA9IG9wdGlvbnM/LmlzQ29ubmVjdGVkID8/IHRydWU7XG4gICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgLy8gRXhwbGljaXRseSBpbml0aWFsaXplIGZvciBjb25zaXN0ZW50IGNsYXNzIHNoYXBlLlxuICAgICAgdGhpcy5fdGV4dFNhbml0aXplciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhcmVudCBub2RlIGludG8gd2hpY2ggdGhlIHBhcnQgcmVuZGVycyBpdHMgY29udGVudC5cbiAgICpcbiAgICogQSBDaGlsZFBhcnQncyBjb250ZW50IGNvbnNpc3RzIG9mIGEgcmFuZ2Ugb2YgYWRqYWNlbnQgY2hpbGQgbm9kZXMgb2ZcbiAgICogYC5wYXJlbnROb2RlYCwgcG9zc2libHkgYm9yZGVyZWQgYnkgJ21hcmtlciBub2RlcycgKGAuc3RhcnROb2RlYCBhbmRcbiAgICogYC5lbmROb2RlYCkuXG4gICAqXG4gICAqIC0gSWYgYm90aCBgLnN0YXJ0Tm9kZWAgYW5kIGAuZW5kTm9kZWAgYXJlIG5vbi1udWxsLCB0aGVuIHRoZSBwYXJ0J3MgY29udGVudFxuICAgKiBjb25zaXN0cyBvZiBhbGwgc2libGluZ3MgYmV0d2VlbiBgLnN0YXJ0Tm9kZWAgYW5kIGAuZW5kTm9kZWAsIGV4Y2x1c2l2ZWx5LlxuICAgKlxuICAgKiAtIElmIGAuc3RhcnROb2RlYCBpcyBub24tbnVsbCBidXQgYC5lbmROb2RlYCBpcyBudWxsLCB0aGVuIHRoZSBwYXJ0J3NcbiAgICogY29udGVudCBjb25zaXN0cyBvZiBhbGwgc2libGluZ3MgZm9sbG93aW5nIGAuc3RhcnROb2RlYCwgdXAgdG8gYW5kXG4gICAqIGluY2x1ZGluZyB0aGUgbGFzdCBjaGlsZCBvZiBgLnBhcmVudE5vZGVgLiBJZiBgLmVuZE5vZGVgIGlzIG5vbi1udWxsLCB0aGVuXG4gICAqIGAuc3RhcnROb2RlYCB3aWxsIGFsd2F5cyBiZSBub24tbnVsbC5cbiAgICpcbiAgICogLSBJZiBib3RoIGAuZW5kTm9kZWAgYW5kIGAuc3RhcnROb2RlYCBhcmUgbnVsbCwgdGhlbiB0aGUgcGFydCdzIGNvbnRlbnRcbiAgICogY29uc2lzdHMgb2YgYWxsIGNoaWxkIG5vZGVzIG9mIGAucGFyZW50Tm9kZWAuXG4gICAqL1xuICBnZXQgcGFyZW50Tm9kZSgpOiBOb2RlIHtcbiAgICBsZXQgcGFyZW50Tm9kZTogTm9kZSA9IHdyYXAodGhpcy5fJHN0YXJ0Tm9kZSkucGFyZW50Tm9kZSE7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5fJHBhcmVudDtcbiAgICBpZiAoXG4gICAgICBwYXJlbnQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyZW50Tm9kZT8ubm9kZVR5cGUgPT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlQgKi9cbiAgICApIHtcbiAgICAgIC8vIElmIHRoZSBwYXJlbnROb2RlIGlzIGEgRG9jdW1lbnRGcmFnbWVudCwgaXQgbWF5IGJlIGJlY2F1c2UgdGhlIERPTSBpc1xuICAgICAgLy8gc3RpbGwgaW4gdGhlIGNsb25lZCBmcmFnbWVudCBkdXJpbmcgaW5pdGlhbCByZW5kZXI7IGlmIHNvLCBnZXQgdGhlIHJlYWxcbiAgICAgIC8vIHBhcmVudE5vZGUgdGhlIHBhcnQgd2lsbCBiZSBjb21taXR0ZWQgaW50byBieSBhc2tpbmcgdGhlIHBhcmVudC5cbiAgICAgIHBhcmVudE5vZGUgPSAocGFyZW50IGFzIENoaWxkUGFydCB8IFRlbXBsYXRlSW5zdGFuY2UpLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBwYXJlbnROb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJ0J3MgbGVhZGluZyBtYXJrZXIgbm9kZSwgaWYgYW55LiBTZWUgYC5wYXJlbnROb2RlYCBmb3IgbW9yZVxuICAgKiBpbmZvcm1hdGlvbi5cbiAgICovXG4gIGdldCBzdGFydE5vZGUoKTogTm9kZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl8kc3RhcnROb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJ0J3MgdHJhaWxpbmcgbWFya2VyIG5vZGUsIGlmIGFueS4gU2VlIGAucGFyZW50Tm9kZWAgZm9yIG1vcmVcbiAgICogaW5mb3JtYXRpb24uXG4gICAqL1xuICBnZXQgZW5kTm9kZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuXyRlbmROb2RlO1xuICB9XG5cbiAgXyRzZXRWYWx1ZSh2YWx1ZTogdW5rbm93biwgZGlyZWN0aXZlUGFyZW50OiBEaXJlY3RpdmVQYXJlbnQgPSB0aGlzKTogdm9pZCB7XG4gICAgaWYgKERFVl9NT0RFICYmIHRoaXMucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhpcyBcXGBDaGlsZFBhcnRcXGAgaGFzIG5vIFxcYHBhcmVudE5vZGVcXGAgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYWNjZXB0IGEgdmFsdWUuIFRoaXMgbGlrZWx5IG1lYW5zIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIHBhcnQgd2FzIG1hbmlwdWxhdGVkIGluIGFuIHVuc3VwcG9ydGVkIHdheSBvdXRzaWRlIG9mIExpdCdzIGNvbnRyb2wgc3VjaCB0aGF0IHRoZSBwYXJ0J3MgbWFya2VyIG5vZGVzIHdlcmUgZWplY3RlZCBmcm9tIERPTS4gRm9yIGV4YW1wbGUsIHNldHRpbmcgdGhlIGVsZW1lbnQncyBcXGBpbm5lckhUTUxcXGAgb3IgXFxgdGV4dENvbnRlbnRcXGAgY2FuIGRvIHRoaXMuYFxuICAgICAgKTtcbiAgICB9XG4gICAgdmFsdWUgPSByZXNvbHZlRGlyZWN0aXZlKHRoaXMsIHZhbHVlLCBkaXJlY3RpdmVQYXJlbnQpO1xuICAgIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgIC8vIE5vbi1yZW5kZXJpbmcgY2hpbGQgdmFsdWVzLiBJdCdzIGltcG9ydGFudCB0aGF0IHRoZXNlIGRvIG5vdCByZW5kZXJcbiAgICAgIC8vIGVtcHR5IHRleHQgbm9kZXMgdG8gYXZvaWQgaXNzdWVzIHdpdGggcHJldmVudGluZyBkZWZhdWx0IDxzbG90PlxuICAgICAgLy8gZmFsbGJhY2sgY29udGVudC5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbm90aGluZyB8fCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSAnJykge1xuICAgICAgICBpZiAodGhpcy5fJGNvbW1pdHRlZFZhbHVlICE9PSBub3RoaW5nKSB7XG4gICAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgbm90aGluZyB0byBjaGlsZCcsXG4gICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLl8kc3RhcnROb2RlLFxuICAgICAgICAgICAgICBlbmQ6IHRoaXMuXyRlbmROb2RlLFxuICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXMuXyRwYXJlbnQsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuXyRjbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IG5vdGhpbmc7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSB0aGlzLl8kY29tbWl0dGVkVmFsdWUgJiYgdmFsdWUgIT09IG5vQ2hhbmdlKSB7XG4gICAgICAgIHRoaXMuX2NvbW1pdFRleHQodmFsdWUpO1xuICAgICAgfVxuICAgICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICB9IGVsc2UgaWYgKCh2YWx1ZSBhcyBUZW1wbGF0ZVJlc3VsdClbJ18kbGl0VHlwZSQnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9jb21taXRUZW1wbGF0ZVJlc3VsdCh2YWx1ZSBhcyBUZW1wbGF0ZVJlc3VsdCk7XG4gICAgfSBlbHNlIGlmICgodmFsdWUgYXMgTm9kZSkubm9kZVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKERFVl9NT0RFICYmIHRoaXMub3B0aW9ucz8uaG9zdCA9PT0gdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fY29tbWl0VGV4dChcbiAgICAgICAgICBgW3Byb2JhYmxlIG1pc3Rha2U6IHJlbmRlcmVkIGEgdGVtcGxhdGUncyBob3N0IGluIGl0c2VsZiBgICtcbiAgICAgICAgICAgIGAoY29tbW9ubHkgY2F1c2VkIGJ5IHdyaXRpbmcgXFwke3RoaXN9IGluIGEgdGVtcGxhdGVdYFxuICAgICAgICApO1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYEF0dGVtcHRlZCB0byByZW5kZXIgdGhlIHRlbXBsYXRlIGhvc3RgLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIGBpbnNpZGUgaXRzZWxmLiBUaGlzIGlzIGFsbW9zdCBhbHdheXMgYSBtaXN0YWtlLCBhbmQgaW4gZGV2IG1vZGUgYCxcbiAgICAgICAgICBgd2UgcmVuZGVyIHNvbWUgd2FybmluZyB0ZXh0LiBJbiBwcm9kdWN0aW9uIGhvd2V2ZXIsIHdlJ2xsIGAsXG4gICAgICAgICAgYHJlbmRlciBpdCwgd2hpY2ggd2lsbCB1c3VhbGx5IHJlc3VsdCBpbiBhbiBlcnJvciwgYW5kIHNvbWV0aW1lcyBgLFxuICAgICAgICAgIGBpbiB0aGUgZWxlbWVudCBkaXNhcHBlYXJpbmcgZnJvbSB0aGUgRE9NLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fY29tbWl0Tm9kZSh2YWx1ZSBhcyBOb2RlKTtcbiAgICB9IGVsc2UgaWYgKGlzSXRlcmFibGUodmFsdWUpKSB7XG4gICAgICB0aGlzLl9jb21taXRJdGVyYWJsZSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGxiYWNrLCB3aWxsIHJlbmRlciB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAgICB0aGlzLl9jb21taXRUZXh0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pbnNlcnQ8VCBleHRlbmRzIE5vZGU+KG5vZGU6IFQpIHtcbiAgICByZXR1cm4gd3JhcCh3cmFwKHRoaXMuXyRzdGFydE5vZGUpLnBhcmVudE5vZGUhKS5pbnNlcnRCZWZvcmUoXG4gICAgICBub2RlLFxuICAgICAgdGhpcy5fJGVuZE5vZGVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tbWl0Tm9kZSh2YWx1ZTogTm9kZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl8kY2xlYXIoKTtcbiAgICAgIGlmIChcbiAgICAgICAgRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTICYmXG4gICAgICAgIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCAhPT0gbm9vcFNhbml0aXplclxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGVOYW1lID0gdGhpcy5fJHN0YXJ0Tm9kZS5wYXJlbnROb2RlPy5ub2RlTmFtZTtcbiAgICAgICAgaWYgKHBhcmVudE5vZGVOYW1lID09PSAnU1RZTEUnIHx8IHBhcmVudE5vZGVOYW1lID09PSAnU0NSSVBUJykge1xuICAgICAgICAgIGxldCBtZXNzYWdlID0gJ0ZvcmJpZGRlbic7XG4gICAgICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZU5hbWUgPT09ICdTVFlMRScpIHtcbiAgICAgICAgICAgICAgbWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgYExpdCBkb2VzIG5vdCBzdXBwb3J0IGJpbmRpbmcgaW5zaWRlIHN0eWxlIG5vZGVzLiBgICtcbiAgICAgICAgICAgICAgICBgVGhpcyBpcyBhIHNlY3VyaXR5IHJpc2ssIGFzIHN0eWxlIGluamVjdGlvbiBhdHRhY2tzIGNhbiBgICtcbiAgICAgICAgICAgICAgICBgZXhmaWx0cmF0ZSBkYXRhIGFuZCBzcG9vZiBVSXMuIGAgK1xuICAgICAgICAgICAgICAgIGBDb25zaWRlciBpbnN0ZWFkIHVzaW5nIGNzc1xcYC4uLlxcYCBsaXRlcmFscyBgICtcbiAgICAgICAgICAgICAgICBgdG8gY29tcG9zZSBzdHlsZXMsIGFuZCBkbyBkeW5hbWljIHN0eWxpbmcgd2l0aCBgICtcbiAgICAgICAgICAgICAgICBgY3NzIGN1c3RvbSBwcm9wZXJ0aWVzLCA6OnBhcnRzLCA8c2xvdD5zLCBgICtcbiAgICAgICAgICAgICAgICBgYW5kIGJ5IG11dGF0aW5nIHRoZSBET00gcmF0aGVyIHRoYW4gc3R5bGVzaGVldHMuYDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgIGBMaXQgZG9lcyBub3Qgc3VwcG9ydCBiaW5kaW5nIGluc2lkZSBzY3JpcHQgbm9kZXMuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGlzIGlzIGEgc2VjdXJpdHkgcmlzaywgYXMgaXQgY291bGQgYWxsb3cgYXJiaXRyYXJ5IGAgK1xuICAgICAgICAgICAgICAgIGBjb2RlIGV4ZWN1dGlvbi5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAga2luZDogJ2NvbW1pdCBub2RlJyxcbiAgICAgICAgICBzdGFydDogdGhpcy5fJHN0YXJ0Tm9kZSxcbiAgICAgICAgICBwYXJlbnQ6IHRoaXMuXyRwYXJlbnQsXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSB0aGlzLl9pbnNlcnQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NvbW1pdFRleHQodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBJZiB0aGUgY29tbWl0dGVkIHZhbHVlIGlzIGEgcHJpbWl0aXZlIGl0IG1lYW5zIHdlIGNhbGxlZCBfY29tbWl0VGV4dCBvblxuICAgIC8vIHRoZSBwcmV2aW91cyByZW5kZXIsIGFuZCB3ZSBrbm93IHRoYXQgdGhpcy5fJHN0YXJ0Tm9kZS5uZXh0U2libGluZyBpcyBhXG4gICAgLy8gVGV4dCBub2RlLiBXZSBjYW4gbm93IGp1c3QgcmVwbGFjZSB0aGUgdGV4dCBjb250ZW50ICguZGF0YSkgb2YgdGhlIG5vZGUuXG4gICAgaWYgKFxuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlICE9PSBub3RoaW5nICYmXG4gICAgICBpc1ByaW1pdGl2ZSh0aGlzLl8kY29tbWl0dGVkVmFsdWUpXG4gICAgKSB7XG4gICAgICBjb25zdCBub2RlID0gd3JhcCh0aGlzLl8kc3RhcnROb2RlKS5uZXh0U2libGluZyBhcyBUZXh0O1xuICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICBpZiAodGhpcy5fdGV4dFNhbml0aXplciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5fdGV4dFNhbml0aXplciA9IGNyZWF0ZVNhbml0aXplcihub2RlLCAnZGF0YScsICdwcm9wZXJ0eScpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdGhpcy5fdGV4dFNhbml0aXplcih2YWx1ZSk7XG4gICAgICB9XG4gICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgIGtpbmQ6ICdjb21taXQgdGV4dCcsXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgICAgKG5vZGUgYXMgVGV4dCkuZGF0YSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgICAgICB0aGlzLl9jb21taXROb2RlKHRleHROb2RlKTtcbiAgICAgICAgLy8gV2hlbiBzZXR0aW5nIHRleHQgY29udGVudCwgZm9yIHNlY3VyaXR5IHB1cnBvc2VzIGl0IG1hdHRlcnMgYSBsb3RcbiAgICAgICAgLy8gd2hhdCB0aGUgcGFyZW50IGlzLiBGb3IgZXhhbXBsZSwgPHN0eWxlPiBhbmQgPHNjcmlwdD4gbmVlZCB0byBiZVxuICAgICAgICAvLyBoYW5kbGVkIHdpdGggY2FyZSwgd2hpbGUgPHNwYW4+IGRvZXMgbm90LiBTbyBmaXJzdCB3ZSBuZWVkIHRvIHB1dCBhXG4gICAgICAgIC8vIHRleHQgbm9kZSBpbnRvIHRoZSBkb2N1bWVudCwgdGhlbiB3ZSBjYW4gc2FuaXRpemUgaXRzIGNvbnRlbnQuXG4gICAgICAgIGlmICh0aGlzLl90ZXh0U2FuaXRpemVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLl90ZXh0U2FuaXRpemVyID0gY3JlYXRlU2FuaXRpemVyKHRleHROb2RlLCAnZGF0YScsICdwcm9wZXJ0eScpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdGhpcy5fdGV4dFNhbml0aXplcih2YWx1ZSk7XG4gICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgdGV4dCcsXG4gICAgICAgICAgICBub2RlOiB0ZXh0Tm9kZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB0ZXh0Tm9kZS5kYXRhID0gdmFsdWUgYXMgc3RyaW5nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY29tbWl0Tm9kZShkLmNyZWF0ZVRleHROb2RlKHZhbHVlIGFzIHN0cmluZykpO1xuICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICBraW5kOiAnY29tbWl0IHRleHQnLFxuICAgICAgICAgICAgbm9kZTogd3JhcCh0aGlzLl8kc3RhcnROb2RlKS5uZXh0U2libGluZyBhcyBUZXh0LFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tbWl0VGVtcGxhdGVSZXN1bHQoXG4gICAgcmVzdWx0OiBUZW1wbGF0ZVJlc3VsdCB8IENvbXBpbGVkVGVtcGxhdGVSZXN1bHRcbiAgKTogdm9pZCB7XG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICBjb25zdCB7dmFsdWVzLCBbJ18kbGl0VHlwZSQnXTogdHlwZX0gPSByZXN1bHQ7XG4gICAgLy8gSWYgJGxpdFR5cGUkIGlzIGEgbnVtYmVyLCByZXN1bHQgaXMgYSBwbGFpbiBUZW1wbGF0ZVJlc3VsdCBhbmQgd2UgZ2V0XG4gICAgLy8gdGhlIHRlbXBsYXRlIGZyb20gdGhlIHRlbXBsYXRlIGNhY2hlLiBJZiBub3QsIHJlc3VsdCBpcyBhXG4gICAgLy8gQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCBhbmQgXyRsaXRUeXBlJCBpcyBhIENvbXBpbGVkVGVtcGxhdGUgYW5kIHdlIG5lZWRcbiAgICAvLyB0byBjcmVhdGUgdGhlIDx0ZW1wbGF0ZT4gZWxlbWVudCB0aGUgZmlyc3QgdGltZSB3ZSBzZWUgaXQuXG4gICAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlIHwgQ29tcGlsZWRUZW1wbGF0ZSA9XG4gICAgICB0eXBlb2YgdHlwZSA9PT0gJ251bWJlcidcbiAgICAgICAgPyB0aGlzLl8kZ2V0VGVtcGxhdGUocmVzdWx0IGFzIFVuY29tcGlsZWRUZW1wbGF0ZVJlc3VsdClcbiAgICAgICAgOiAodHlwZS5lbCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAodHlwZS5lbCA9IFRlbXBsYXRlLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgIHRydXN0RnJvbVRlbXBsYXRlU3RyaW5nKHR5cGUuaCwgdHlwZS5oWzBdKSxcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zXG4gICAgICAgICAgICApKSxcbiAgICAgICAgICB0eXBlKTtcblxuICAgIGlmICgodGhpcy5fJGNvbW1pdHRlZFZhbHVlIGFzIFRlbXBsYXRlSW5zdGFuY2UpPy5fJHRlbXBsYXRlID09PSB0ZW1wbGF0ZSkge1xuICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICBraW5kOiAndGVtcGxhdGUgdXBkYXRpbmcnLFxuICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgIGluc3RhbmNlOiB0aGlzLl8kY29tbWl0dGVkVmFsdWUgYXMgVGVtcGxhdGVJbnN0YW5jZSxcbiAgICAgICAgICBwYXJ0czogKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSBhcyBUZW1wbGF0ZUluc3RhbmNlKS5fJHBhcnRzLFxuICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgIH0pO1xuICAgICAgKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSBhcyBUZW1wbGF0ZUluc3RhbmNlKS5fdXBkYXRlKHZhbHVlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFRlbXBsYXRlSW5zdGFuY2UodGVtcGxhdGUgYXMgVGVtcGxhdGUsIHRoaXMpO1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBpbnN0YW5jZS5fY2xvbmUodGhpcy5vcHRpb25zKTtcbiAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAga2luZDogJ3RlbXBsYXRlIGluc3RhbnRpYXRlZCcsXG4gICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgcGFydHM6IGluc3RhbmNlLl8kcGFydHMsXG4gICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgIGZyYWdtZW50LFxuICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgfSk7XG4gICAgICBpbnN0YW5jZS5fdXBkYXRlKHZhbHVlcyk7XG4gICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQgYW5kIHVwZGF0ZWQnLFxuICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIHBhcnRzOiBpbnN0YW5jZS5fJHBhcnRzLFxuICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICBmcmFnbWVudCxcbiAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgIH0pO1xuICAgICAgdGhpcy5fY29tbWl0Tm9kZShmcmFnbWVudCk7XG4gICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSBpbnN0YW5jZTtcbiAgICB9XG4gIH1cblxuICAvLyBPdmVycmlkZGVuIHZpYSBgbGl0SHRtbFBvbHlmaWxsU3VwcG9ydGAgdG8gcHJvdmlkZSBwbGF0Zm9ybSBzdXBwb3J0LlxuICAvKiogQGludGVybmFsICovXG4gIF8kZ2V0VGVtcGxhdGUocmVzdWx0OiBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQpIHtcbiAgICBsZXQgdGVtcGxhdGUgPSB0ZW1wbGF0ZUNhY2hlLmdldChyZXN1bHQuc3RyaW5ncyk7XG4gICAgaWYgKHRlbXBsYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRlbXBsYXRlQ2FjaGUuc2V0KHJlc3VsdC5zdHJpbmdzLCAodGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUocmVzdWx0KSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcGxhdGU7XG4gIH1cblxuICBwcml2YXRlIF9jb21taXRJdGVyYWJsZSh2YWx1ZTogSXRlcmFibGU8dW5rbm93bj4pOiB2b2lkIHtcbiAgICAvLyBGb3IgYW4gSXRlcmFibGUsIHdlIGNyZWF0ZSBhIG5ldyBJbnN0YW5jZVBhcnQgcGVyIGl0ZW0sIHRoZW4gc2V0IGl0c1xuICAgIC8vIHZhbHVlIHRvIHRoZSBpdGVtLiBUaGlzIGlzIGEgbGl0dGxlIGJpdCBvZiBvdmVyaGVhZCBmb3IgZXZlcnkgaXRlbSBpblxuICAgIC8vIGFuIEl0ZXJhYmxlLCBidXQgaXQgbGV0cyB1cyByZWN1cnNlIGVhc2lseSBhbmQgZWZmaWNpZW50bHkgdXBkYXRlIEFycmF5c1xuICAgIC8vIG9mIFRlbXBsYXRlUmVzdWx0cyB0aGF0IHdpbGwgYmUgY29tbW9ubHkgcmV0dXJuZWQgZnJvbSBleHByZXNzaW9ucyBsaWtlOlxuICAgIC8vIGFycmF5Lm1hcCgoaSkgPT4gaHRtbGAke2l9YCksIGJ5IHJldXNpbmcgZXhpc3RpbmcgVGVtcGxhdGVJbnN0YW5jZXMuXG5cbiAgICAvLyBJZiB2YWx1ZSBpcyBhbiBhcnJheSwgdGhlbiB0aGUgcHJldmlvdXMgcmVuZGVyIHdhcyBvZiBhblxuICAgIC8vIGl0ZXJhYmxlIGFuZCB2YWx1ZSB3aWxsIGNvbnRhaW4gdGhlIENoaWxkUGFydHMgZnJvbSB0aGUgcHJldmlvdXNcbiAgICAvLyByZW5kZXIuIElmIHZhbHVlIGlzIG5vdCBhbiBhcnJheSwgY2xlYXIgdGhpcyBwYXJ0IGFuZCBtYWtlIGEgbmV3XG4gICAgLy8gYXJyYXkgZm9yIENoaWxkUGFydHMuXG4gICAgaWYgKCFpc0FycmF5KHRoaXMuXyRjb21taXR0ZWRWYWx1ZSkpIHtcbiAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IFtdO1xuICAgICAgdGhpcy5fJGNsZWFyKCk7XG4gICAgfVxuXG4gICAgLy8gTGV0cyB1cyBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IGl0ZW1zIHdlIHN0YW1wZWQgc28gd2UgY2FuIGNsZWFyIGxlZnRvdmVyXG4gICAgLy8gaXRlbXMgZnJvbSBhIHByZXZpb3VzIHJlbmRlclxuICAgIGNvbnN0IGl0ZW1QYXJ0cyA9IHRoaXMuXyRjb21taXR0ZWRWYWx1ZSBhcyBDaGlsZFBhcnRbXTtcbiAgICBsZXQgcGFydEluZGV4ID0gMDtcbiAgICBsZXQgaXRlbVBhcnQ6IENoaWxkUGFydCB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgaWYgKHBhcnRJbmRleCA9PT0gaXRlbVBhcnRzLmxlbmd0aCkge1xuICAgICAgICAvLyBJZiBubyBleGlzdGluZyBwYXJ0LCBjcmVhdGUgYSBuZXcgb25lXG4gICAgICAgIC8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiB0ZXN0IHBlcmYgaW1wYWN0IG9mIGFsd2F5cyBjcmVhdGluZyB0d28gcGFydHNcbiAgICAgICAgLy8gaW5zdGVhZCBvZiBzaGFyaW5nIHBhcnRzIGJldHdlZW4gbm9kZXNcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvaXNzdWVzLzEyNjZcbiAgICAgICAgaXRlbVBhcnRzLnB1c2goXG4gICAgICAgICAgKGl0ZW1QYXJ0ID0gbmV3IENoaWxkUGFydChcbiAgICAgICAgICAgIHRoaXMuX2luc2VydChjcmVhdGVNYXJrZXIoKSksXG4gICAgICAgICAgICB0aGlzLl9pbnNlcnQoY3JlYXRlTWFya2VyKCkpLFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc1xuICAgICAgICAgICkpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZXVzZSBhbiBleGlzdGluZyBwYXJ0XG4gICAgICAgIGl0ZW1QYXJ0ID0gaXRlbVBhcnRzW3BhcnRJbmRleF07XG4gICAgICB9XG4gICAgICBpdGVtUGFydC5fJHNldFZhbHVlKGl0ZW0pO1xuICAgICAgcGFydEluZGV4Kys7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRJbmRleCA8IGl0ZW1QYXJ0cy5sZW5ndGgpIHtcbiAgICAgIC8vIGl0ZW1QYXJ0cyBhbHdheXMgaGF2ZSBlbmQgbm9kZXNcbiAgICAgIHRoaXMuXyRjbGVhcihcbiAgICAgICAgaXRlbVBhcnQgJiYgd3JhcChpdGVtUGFydC5fJGVuZE5vZGUhKS5uZXh0U2libGluZyxcbiAgICAgICAgcGFydEluZGV4XG4gICAgICApO1xuICAgICAgLy8gVHJ1bmNhdGUgdGhlIHBhcnRzIGFycmF5IHNvIF92YWx1ZSByZWZsZWN0cyB0aGUgY3VycmVudCBzdGF0ZVxuICAgICAgaXRlbVBhcnRzLmxlbmd0aCA9IHBhcnRJbmRleDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgbm9kZXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIFBhcnQgZnJvbSB0aGUgRE9NLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhcnQgU3RhcnQgbm9kZSB0byBjbGVhciBmcm9tLCBmb3IgY2xlYXJpbmcgYSBzdWJzZXQgb2YgdGhlIHBhcnQnc1xuICAgKiAgICAgRE9NICh1c2VkIHdoZW4gdHJ1bmNhdGluZyBpdGVyYWJsZXMpXG4gICAqIEBwYXJhbSBmcm9tICBXaGVuIGBzdGFydGAgaXMgc3BlY2lmaWVkLCB0aGUgaW5kZXggd2l0aGluIHRoZSBpdGVyYWJsZSBmcm9tXG4gICAqICAgICB3aGljaCBDaGlsZFBhcnRzIGFyZSBiZWluZyByZW1vdmVkLCB1c2VkIGZvciBkaXNjb25uZWN0aW5nIGRpcmVjdGl2ZXMgaW5cbiAgICogICAgIHRob3NlIFBhcnRzLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF8kY2xlYXIoXG4gICAgc3RhcnQ6IENoaWxkTm9kZSB8IG51bGwgPSB3cmFwKHRoaXMuXyRzdGFydE5vZGUpLm5leHRTaWJsaW5nLFxuICAgIGZyb20/OiBudW1iZXJcbiAgKSB7XG4gICAgdGhpcy5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkPy4oZmFsc2UsIHRydWUsIGZyb20pO1xuICAgIHdoaWxlIChzdGFydCAmJiBzdGFydCAhPT0gdGhpcy5fJGVuZE5vZGUpIHtcbiAgICAgIGNvbnN0IG4gPSB3cmFwKHN0YXJ0ISkubmV4dFNpYmxpbmc7XG4gICAgICAod3JhcChzdGFydCEpIGFzIEVsZW1lbnQpLnJlbW92ZSgpO1xuICAgICAgc3RhcnQgPSBuO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gb2YgUm9vdFBhcnQncyBgaXNDb25uZWN0ZWRgLiBOb3RlIHRoYXQgdGhpcyBtZXRob2RcbiAgICogc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGBSb290UGFydGBzICh0aGUgYENoaWxkUGFydGAgcmV0dXJuZWQgZnJvbSBhXG4gICAqIHRvcC1sZXZlbCBgcmVuZGVyKClgIGNhbGwpLiBJdCBoYXMgbm8gZWZmZWN0IG9uIG5vbi1yb290IENoaWxkUGFydHMuXG4gICAqIEBwYXJhbSBpc0Nvbm5lY3RlZCBXaGV0aGVyIHRvIHNldFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHNldENvbm5lY3RlZChpc0Nvbm5lY3RlZDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLl8kcGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX19pc0Nvbm5lY3RlZCA9IGlzQ29ubmVjdGVkO1xuICAgICAgdGhpcy5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkPy4oaXNDb25uZWN0ZWQpO1xuICAgIH0gZWxzZSBpZiAoREVWX01PREUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3BhcnQuc2V0Q29ubmVjdGVkKCkgbWF5IG9ubHkgYmUgY2FsbGVkIG9uIGEgJyArXG4gICAgICAgICAgJ1Jvb3RQYXJ0IHJldHVybmVkIGZyb20gcmVuZGVyKCkuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIHRvcC1sZXZlbCBgQ2hpbGRQYXJ0YCByZXR1cm5lZCBmcm9tIGByZW5kZXJgIHRoYXQgbWFuYWdlcyB0aGUgY29ubmVjdGVkXG4gKiBzdGF0ZSBvZiBgQXN5bmNEaXJlY3RpdmVgcyBjcmVhdGVkIHRocm91Z2hvdXQgdGhlIHRyZWUgYmVsb3cgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdFBhcnQgZXh0ZW5kcyBDaGlsZFBhcnQge1xuICAvKipcbiAgICogU2V0cyB0aGUgY29ubmVjdGlvbiBzdGF0ZSBmb3IgYEFzeW5jRGlyZWN0aXZlYHMgY29udGFpbmVkIHdpdGhpbiB0aGlzIHJvb3RcbiAgICogQ2hpbGRQYXJ0LlxuICAgKlxuICAgKiBsaXQtaHRtbCBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IG1vbml0b3IgdGhlIGNvbm5lY3RlZG5lc3Mgb2YgRE9NIHJlbmRlcmVkO1xuICAgKiBhcyBzdWNoLCBpdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBgcmVuZGVyYCB0byBlbnN1cmUgdGhhdFxuICAgKiBgcGFydC5zZXRDb25uZWN0ZWQoZmFsc2UpYCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBwYXJ0IG9iamVjdCBpcyBwb3RlbnRpYWxseVxuICAgKiBkaXNjYXJkZWQsIHRvIGVuc3VyZSB0aGF0IGBBc3luY0RpcmVjdGl2ZWBzIGhhdmUgYSBjaGFuY2UgdG8gZGlzcG9zZSBvZlxuICAgKiBhbnkgcmVzb3VyY2VzIGJlaW5nIGhlbGQuIElmIGEgYFJvb3RQYXJ0YCB0aGF0IHdhcyBwcmV2aW91c2x5XG4gICAqIGRpc2Nvbm5lY3RlZCBpcyBzdWJzZXF1ZW50bHkgcmUtY29ubmVjdGVkIChhbmQgaXRzIGBBc3luY0RpcmVjdGl2ZWBzIHNob3VsZFxuICAgKiByZS1jb25uZWN0KSwgYHNldENvbm5lY3RlZCh0cnVlKWAgc2hvdWxkIGJlIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGlzQ29ubmVjdGVkIFdoZXRoZXIgZGlyZWN0aXZlcyB3aXRoaW4gdGhpcyB0cmVlIHNob3VsZCBiZSBjb25uZWN0ZWRcbiAgICogb3Igbm90XG4gICAqL1xuICBzZXRDb25uZWN0ZWQoaXNDb25uZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSB7QXR0cmlidXRlUGFydH07XG5jbGFzcyBBdHRyaWJ1dGVQYXJ0IGltcGxlbWVudHMgRGlzY29ubmVjdGFibGUge1xuICByZWFkb25seSB0eXBlOlxuICAgIHwgdHlwZW9mIEFUVFJJQlVURV9QQVJUXG4gICAgfCB0eXBlb2YgUFJPUEVSVFlfUEFSVFxuICAgIHwgdHlwZW9mIEJPT0xFQU5fQVRUUklCVVRFX1BBUlRcbiAgICB8IHR5cGVvZiBFVkVOVF9QQVJUID0gQVRUUklCVVRFX1BBUlQ7XG4gIHJlYWRvbmx5IGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgYXR0cmlidXRlIHBhcnQgcmVwcmVzZW50cyBhbiBpbnRlcnBvbGF0aW9uLCB0aGlzIGNvbnRhaW5zIHRoZVxuICAgKiBzdGF0aWMgc3RyaW5ncyBvZiB0aGUgaW50ZXJwb2xhdGlvbi4gRm9yIHNpbmdsZS12YWx1ZSwgY29tcGxldGUgYmluZGluZ3MsXG4gICAqIHRoaXMgaXMgdW5kZWZpbmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RyaW5ncz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGNvbW1pdHRlZFZhbHVlOiB1bmtub3duIHwgQXJyYXk8dW5rbm93bj4gPSBub3RoaW5nO1xuICAvKiogQGludGVybmFsICovXG4gIF9fZGlyZWN0aXZlcz86IEFycmF5PERpcmVjdGl2ZSB8IHVuZGVmaW5lZD47XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlO1xuICAvKiogQGludGVybmFsICovXG4gIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbj86IFNldDxEaXNjb25uZWN0YWJsZT4gPSB1bmRlZmluZWQ7XG5cbiAgcHJvdGVjdGVkIF9zYW5pdGl6ZXI6IFZhbHVlU2FuaXRpemVyIHwgdW5kZWZpbmVkO1xuXG4gIGdldCB0YWdOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnQudGFnTmFtZTtcbiAgfVxuXG4gIC8vIFNlZSBjb21tZW50IGluIERpc2Nvbm5lY3RhYmxlIGludGVyZmFjZSBmb3Igd2h5IHRoaXMgaXMgYSBnZXR0ZXJcbiAgZ2V0IF8kaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuXyRwYXJlbnQuXyRpc0Nvbm5lY3RlZDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzdHJpbmdzOiBSZWFkb25seUFycmF5PHN0cmluZz4sXG4gICAgcGFyZW50OiBEaXNjb25uZWN0YWJsZSxcbiAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLl8kcGFyZW50ID0gcGFyZW50O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgaWYgKHN0cmluZ3MubGVuZ3RoID4gMiB8fCBzdHJpbmdzWzBdICE9PSAnJyB8fCBzdHJpbmdzWzFdICE9PSAnJykge1xuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbmV3IEFycmF5KHN0cmluZ3MubGVuZ3RoIC0gMSkuZmlsbChuZXcgU3RyaW5nKCkpO1xuICAgICAgdGhpcy5zdHJpbmdzID0gc3RyaW5ncztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbm90aGluZztcbiAgICB9XG4gICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgdGhpcy5fc2FuaXRpemVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHBhcnQgYnkgcmVzb2x2aW5nIHRoZSB2YWx1ZSBmcm9tIHBvc3NpYmx5IG11bHRpcGxlXG4gICAqIHZhbHVlcyBhbmQgc3RhdGljIHN0cmluZ3MgYW5kIGNvbW1pdHRpbmcgaXQgdG8gdGhlIERPTS5cbiAgICogSWYgdGhpcyBwYXJ0IGlzIHNpbmdsZS12YWx1ZWQsIGB0aGlzLl9zdHJpbmdzYCB3aWxsIGJlIHVuZGVmaW5lZCwgYW5kIHRoZVxuICAgKiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0aCBhIHNpbmdsZSB2YWx1ZSBhcmd1bWVudC4gSWYgdGhpcyBwYXJ0IGlzXG4gICAqIG11bHRpLXZhbHVlLCBgdGhpcy5fc3RyaW5nc2Agd2lsbCBiZSBkZWZpbmVkLCBhbmQgdGhlIG1ldGhvZCBpcyBjYWxsZWRcbiAgICogd2l0aCB0aGUgdmFsdWUgYXJyYXkgb2YgdGhlIHBhcnQncyBvd25pbmcgVGVtcGxhdGVJbnN0YW5jZSwgYW5kIGFuIG9mZnNldFxuICAgKiBpbnRvIHRoZSB2YWx1ZSBhcnJheSBmcm9tIHdoaWNoIHRoZSB2YWx1ZXMgc2hvdWxkIGJlIHJlYWQuXG4gICAqIFRoaXMgbWV0aG9kIGlzIG92ZXJsb2FkZWQgdGhpcyB3YXkgdG8gZWxpbWluYXRlIHNob3J0LWxpdmVkIGFycmF5IHNsaWNlc1xuICAgKiBvZiB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdmFsdWVzLCBhbmQgYWxsb3cgYSBmYXN0LXBhdGggZm9yIHNpbmdsZS12YWx1ZWRcbiAgICogcGFydHMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgcGFydCB2YWx1ZSwgb3IgYW4gYXJyYXkgb2YgdmFsdWVzIGZvciBtdWx0aS12YWx1ZWQgcGFydHNcbiAgICogQHBhcmFtIHZhbHVlSW5kZXggdGhlIGluZGV4IHRvIHN0YXJ0IHJlYWRpbmcgdmFsdWVzIGZyb20uIGB1bmRlZmluZWRgIGZvclxuICAgKiAgIHNpbmdsZS12YWx1ZWQgcGFydHNcbiAgICogQHBhcmFtIG5vQ29tbWl0IGNhdXNlcyB0aGUgcGFydCB0byBub3QgY29tbWl0IGl0cyB2YWx1ZSB0byB0aGUgRE9NLiBVc2VkXG4gICAqICAgaW4gaHlkcmF0aW9uIHRvIHByaW1lIGF0dHJpYnV0ZSBwYXJ0cyB3aXRoIHRoZWlyIGZpcnN0LXJlbmRlcmVkIHZhbHVlLFxuICAgKiAgIGJ1dCBub3Qgc2V0IHRoZSBhdHRyaWJ1dGUsIGFuZCBpbiBTU1IgdG8gbm8tb3AgdGhlIERPTSBvcGVyYXRpb24gYW5kXG4gICAqICAgY2FwdHVyZSB0aGUgdmFsdWUgZm9yIHNlcmlhbGl6YXRpb24uXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgXyRzZXRWYWx1ZShcbiAgICB2YWx1ZTogdW5rbm93biB8IEFycmF5PHVua25vd24+LFxuICAgIGRpcmVjdGl2ZVBhcmVudDogRGlyZWN0aXZlUGFyZW50ID0gdGhpcyxcbiAgICB2YWx1ZUluZGV4PzogbnVtYmVyLFxuICAgIG5vQ29tbWl0PzogYm9vbGVhblxuICApIHtcbiAgICBjb25zdCBzdHJpbmdzID0gdGhpcy5zdHJpbmdzO1xuXG4gICAgLy8gV2hldGhlciBhbnkgb2YgdGhlIHZhbHVlcyBoYXMgY2hhbmdlZCwgZm9yIGRpcnR5LWNoZWNraW5nXG4gICAgbGV0IGNoYW5nZSA9IGZhbHNlO1xuXG4gICAgaWYgKHN0cmluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gU2luZ2xlLXZhbHVlIGJpbmRpbmcgY2FzZVxuICAgICAgdmFsdWUgPSByZXNvbHZlRGlyZWN0aXZlKHRoaXMsIHZhbHVlLCBkaXJlY3RpdmVQYXJlbnQsIDApO1xuICAgICAgY2hhbmdlID1cbiAgICAgICAgIWlzUHJpbWl0aXZlKHZhbHVlKSB8fFxuICAgICAgICAodmFsdWUgIT09IHRoaXMuXyRjb21taXR0ZWRWYWx1ZSAmJiB2YWx1ZSAhPT0gbm9DaGFuZ2UpO1xuICAgICAgaWYgKGNoYW5nZSkge1xuICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW50ZXJwb2xhdGlvbiBjYXNlXG4gICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZSBhcyBBcnJheTx1bmtub3duPjtcbiAgICAgIHZhbHVlID0gc3RyaW5nc1swXTtcblxuICAgICAgbGV0IGksIHY7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgdiA9IHJlc29sdmVEaXJlY3RpdmUodGhpcywgdmFsdWVzW3ZhbHVlSW5kZXghICsgaV0sIGRpcmVjdGl2ZVBhcmVudCwgaSk7XG5cbiAgICAgICAgaWYgKHYgPT09IG5vQ2hhbmdlKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHVzZXItcHJvdmlkZWQgdmFsdWUgaXMgYG5vQ2hhbmdlYCwgdXNlIHRoZSBwcmV2aW91cyB2YWx1ZVxuICAgICAgICAgIHYgPSAodGhpcy5fJGNvbW1pdHRlZFZhbHVlIGFzIEFycmF5PHVua25vd24+KVtpXTtcbiAgICAgICAgfVxuICAgICAgICBjaGFuZ2UgfHw9XG4gICAgICAgICAgIWlzUHJpbWl0aXZlKHYpIHx8IHYgIT09ICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgYXMgQXJyYXk8dW5rbm93bj4pW2ldO1xuICAgICAgICBpZiAodiA9PT0gbm90aGluZykge1xuICAgICAgICAgIHZhbHVlID0gbm90aGluZztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gbm90aGluZykge1xuICAgICAgICAgIHZhbHVlICs9ICh2ID8/ICcnKSArIHN0cmluZ3NbaSArIDFdO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGFsd2F5cyByZWNvcmQgZWFjaCB2YWx1ZSwgZXZlbiBpZiBvbmUgaXMgYG5vdGhpbmdgLCBmb3IgZnV0dXJlXG4gICAgICAgIC8vIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICAgICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgYXMgQXJyYXk8dW5rbm93bj4pW2ldID0gdjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZSAmJiAhbm9Db21taXQpIHtcbiAgICAgIHRoaXMuX2NvbW1pdFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9jb21taXRWYWx1ZSh2YWx1ZTogdW5rbm93bikge1xuICAgIGlmICh2YWx1ZSA9PT0gbm90aGluZykge1xuICAgICAgKHdyYXAodGhpcy5lbGVtZW50KSBhcyBFbGVtZW50KS5yZW1vdmVBdHRyaWJ1dGUodGhpcy5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICBpZiAodGhpcy5fc2FuaXRpemVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLl9zYW5pdGl6ZXIgPSBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWwoXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgICAgICAnYXR0cmlidXRlJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB0aGlzLl9zYW5pdGl6ZXIodmFsdWUgPz8gJycpO1xuICAgICAgfVxuICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICBraW5kOiAnY29tbWl0IGF0dHJpYnV0ZScsXG4gICAgICAgICAgZWxlbWVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgICAgKHdyYXAodGhpcy5lbGVtZW50KSBhcyBFbGVtZW50KS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgIHRoaXMubmFtZSxcbiAgICAgICAgKHZhbHVlID8/ICcnKSBhcyBzdHJpbmdcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB0eXBlIHtQcm9wZXJ0eVBhcnR9O1xuY2xhc3MgUHJvcGVydHlQYXJ0IGV4dGVuZHMgQXR0cmlidXRlUGFydCB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHR5cGUgPSBQUk9QRVJUWV9QQVJUO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgb3ZlcnJpZGUgX2NvbW1pdFZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgaWYgKHRoaXMuX3Nhbml0aXplciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX3Nhbml0aXplciA9IHNhbml0aXplckZhY3RvcnlJbnRlcm5hbChcbiAgICAgICAgICB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICAgICdwcm9wZXJ0eSdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdGhpcy5fc2FuaXRpemVyKHZhbHVlKTtcbiAgICB9XG4gICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgIGtpbmQ6ICdjb21taXQgcHJvcGVydHknLFxuICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgKHRoaXMuZWxlbWVudCBhcyBhbnkpW3RoaXMubmFtZV0gPSB2YWx1ZSA9PT0gbm90aGluZyA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIHtCb29sZWFuQXR0cmlidXRlUGFydH07XG5jbGFzcyBCb29sZWFuQXR0cmlidXRlUGFydCBleHRlbmRzIEF0dHJpYnV0ZVBhcnQge1xuICBvdmVycmlkZSByZWFkb25seSB0eXBlID0gQk9PTEVBTl9BVFRSSUJVVEVfUEFSVDtcblxuICAvKiogQGludGVybmFsICovXG4gIG92ZXJyaWRlIF9jb21taXRWYWx1ZSh2YWx1ZTogdW5rbm93bikge1xuICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICBraW5kOiAnY29tbWl0IGJvb2xlYW4gYXR0cmlidXRlJyxcbiAgICAgICAgZWxlbWVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIHZhbHVlOiAhISh2YWx1ZSAmJiB2YWx1ZSAhPT0gbm90aGluZyksXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgIH0pO1xuICAgICh3cmFwKHRoaXMuZWxlbWVudCkgYXMgRWxlbWVudCkudG9nZ2xlQXR0cmlidXRlKFxuICAgICAgdGhpcy5uYW1lLFxuICAgICAgISF2YWx1ZSAmJiB2YWx1ZSAhPT0gbm90aGluZ1xuICAgICk7XG4gIH1cbn1cblxudHlwZSBFdmVudExpc3RlbmVyV2l0aE9wdGlvbnMgPSBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0ICZcbiAgUGFydGlhbDxBZGRFdmVudExpc3RlbmVyT3B0aW9ucz47XG5cbi8qKlxuICogQW4gQXR0cmlidXRlUGFydCB0aGF0IG1hbmFnZXMgYW4gZXZlbnQgbGlzdGVuZXIgdmlhIGFkZC9yZW1vdmVFdmVudExpc3RlbmVyLlxuICpcbiAqIFRoaXMgcGFydCB3b3JrcyBieSBhZGRpbmcgaXRzZWxmIGFzIHRoZSBldmVudCBsaXN0ZW5lciBvbiBhbiBlbGVtZW50LCB0aGVuXG4gKiBkZWxlZ2F0aW5nIHRvIHRoZSB2YWx1ZSBwYXNzZWQgdG8gaXQuIFRoaXMgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvXG4gKiBhZGQvcmVtb3ZlRXZlbnRMaXN0ZW5lciBpZiB0aGUgbGlzdGVuZXIgY2hhbmdlcyBmcmVxdWVudGx5LCBzdWNoIGFzIHdoZW4gYW5cbiAqIGlubGluZSBmdW5jdGlvbiBpcyB1c2VkIGFzIGEgbGlzdGVuZXIuXG4gKlxuICogQmVjYXVzZSBldmVudCBvcHRpb25zIGFyZSBwYXNzZWQgd2hlbiBhZGRpbmcgbGlzdGVuZXJzLCB3ZSBtdXN0IHRha2UgY2FzZVxuICogdG8gYWRkIGFuZCByZW1vdmUgdGhlIHBhcnQgYXMgYSBsaXN0ZW5lciB3aGVuIHRoZSBldmVudCBvcHRpb25zIGNoYW5nZS5cbiAqL1xuZXhwb3J0IHR5cGUge0V2ZW50UGFydH07XG5jbGFzcyBFdmVudFBhcnQgZXh0ZW5kcyBBdHRyaWJ1dGVQYXJ0IHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgdHlwZSA9IEVWRU5UX1BBUlQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0cmluZ3M6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgICBwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlLFxuICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgbmFtZSwgc3RyaW5ncywgcGFyZW50LCBvcHRpb25zKTtcblxuICAgIGlmIChERVZfTU9ERSAmJiB0aGlzLnN0cmluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQSBcXGA8JHtlbGVtZW50LmxvY2FsTmFtZX0+XFxgIGhhcyBhIFxcYEAke25hbWV9PS4uLlxcYCBsaXN0ZW5lciB3aXRoIGAgK1xuICAgICAgICAgICdpbnZhbGlkIGNvbnRlbnQuIEV2ZW50IGxpc3RlbmVycyBpbiB0ZW1wbGF0ZXMgbXVzdCBoYXZlIGV4YWN0bHkgJyArXG4gICAgICAgICAgJ29uZSBleHByZXNzaW9uIGFuZCBubyBzdXJyb3VuZGluZyB0ZXh0LidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXZlbnRQYXJ0IGRvZXMgbm90IHVzZSB0aGUgYmFzZSBfJHNldFZhbHVlL19yZXNvbHZlVmFsdWUgaW1wbGVtZW50YXRpb25cbiAgLy8gc2luY2UgdGhlIGRpcnR5IGNoZWNraW5nIGlzIG1vcmUgY29tcGxleFxuICAvKiogQGludGVybmFsICovXG4gIG92ZXJyaWRlIF8kc2V0VmFsdWUoXG4gICAgbmV3TGlzdGVuZXI6IHVua25vd24sXG4gICAgZGlyZWN0aXZlUGFyZW50OiBEaXJlY3RpdmVQYXJlbnQgPSB0aGlzXG4gICkge1xuICAgIG5ld0xpc3RlbmVyID1cbiAgICAgIHJlc29sdmVEaXJlY3RpdmUodGhpcywgbmV3TGlzdGVuZXIsIGRpcmVjdGl2ZVBhcmVudCwgMCkgPz8gbm90aGluZztcbiAgICBpZiAobmV3TGlzdGVuZXIgPT09IG5vQ2hhbmdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9sZExpc3RlbmVyID0gdGhpcy5fJGNvbW1pdHRlZFZhbHVlO1xuXG4gICAgLy8gSWYgdGhlIG5ldyB2YWx1ZSBpcyBub3RoaW5nIG9yIGFueSBvcHRpb25zIGNoYW5nZSB3ZSBoYXZlIHRvIHJlbW92ZSB0aGVcbiAgICAvLyBwYXJ0IGFzIGEgbGlzdGVuZXIuXG4gICAgY29uc3Qgc2hvdWxkUmVtb3ZlTGlzdGVuZXIgPVxuICAgICAgKG5ld0xpc3RlbmVyID09PSBub3RoaW5nICYmIG9sZExpc3RlbmVyICE9PSBub3RoaW5nKSB8fFxuICAgICAgKG5ld0xpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykuY2FwdHVyZSAhPT1cbiAgICAgICAgKG9sZExpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykuY2FwdHVyZSB8fFxuICAgICAgKG5ld0xpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykub25jZSAhPT1cbiAgICAgICAgKG9sZExpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykub25jZSB8fFxuICAgICAgKG5ld0xpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykucGFzc2l2ZSAhPT1cbiAgICAgICAgKG9sZExpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykucGFzc2l2ZTtcblxuICAgIC8vIElmIHRoZSBuZXcgdmFsdWUgaXMgbm90IG5vdGhpbmcgYW5kIHdlIHJlbW92ZWQgdGhlIGxpc3RlbmVyLCB3ZSBoYXZlXG4gICAgLy8gdG8gYWRkIHRoZSBwYXJ0IGFzIGEgbGlzdGVuZXIuXG4gICAgY29uc3Qgc2hvdWxkQWRkTGlzdGVuZXIgPVxuICAgICAgbmV3TGlzdGVuZXIgIT09IG5vdGhpbmcgJiZcbiAgICAgIChvbGRMaXN0ZW5lciA9PT0gbm90aGluZyB8fCBzaG91bGRSZW1vdmVMaXN0ZW5lcik7XG5cbiAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAga2luZDogJ2NvbW1pdCBldmVudCBsaXN0ZW5lcicsXG4gICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICB2YWx1ZTogbmV3TGlzdGVuZXIsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgcmVtb3ZlTGlzdGVuZXI6IHNob3VsZFJlbW92ZUxpc3RlbmVyLFxuICAgICAgICBhZGRMaXN0ZW5lcjogc2hvdWxkQWRkTGlzdGVuZXIsXG4gICAgICAgIG9sZExpc3RlbmVyLFxuICAgICAgfSk7XG4gICAgaWYgKHNob3VsZFJlbW92ZUxpc3RlbmVyKSB7XG4gICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICB0aGlzLFxuICAgICAgICBvbGRMaXN0ZW5lciBhcyBFdmVudExpc3RlbmVyV2l0aE9wdGlvbnNcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChzaG91bGRBZGRMaXN0ZW5lcikge1xuICAgICAgLy8gQmV3YXJlOiBJRTExIGFuZCBDaHJvbWUgNDEgZG9uJ3QgbGlrZSB1c2luZyB0aGUgbGlzdGVuZXIgYXMgdGhlXG4gICAgICAvLyBvcHRpb25zIG9iamVjdC4gRmlndXJlIG91dCBob3cgdG8gZGVhbCB3LyB0aGlzIGluIElFMTEgLSBtYXliZVxuICAgICAgLy8gcGF0Y2ggYWRkRXZlbnRMaXN0ZW5lcj9cbiAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgIHRoaXMsXG4gICAgICAgIG5ld0xpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbmV3TGlzdGVuZXI7XG4gIH1cblxuICBoYW5kbGVFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlLmNhbGwodGhpcy5vcHRpb25zPy5ob3N0ID8/IHRoaXMuZWxlbWVudCwgZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAodGhpcy5fJGNvbW1pdHRlZFZhbHVlIGFzIEV2ZW50TGlzdGVuZXJPYmplY3QpLmhhbmRsZUV2ZW50KGV2ZW50KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUge0VsZW1lbnRQYXJ0fTtcbmNsYXNzIEVsZW1lbnRQYXJ0IGltcGxlbWVudHMgRGlzY29ubmVjdGFibGUge1xuICByZWFkb25seSB0eXBlID0gRUxFTUVOVF9QQVJUO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX19kaXJlY3RpdmU/OiBEaXJlY3RpdmU7XG5cbiAgLy8gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCBldmVyeSBQYXJ0IGhhcyBhIF8kY29tbWl0dGVkVmFsdWVcbiAgXyRjb21taXR0ZWRWYWx1ZTogdW5kZWZpbmVkO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRwYXJlbnQhOiBEaXNjb25uZWN0YWJsZTtcblxuICAvKiogQGludGVybmFsICovXG4gIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbj86IFNldDxEaXNjb25uZWN0YWJsZT4gPSB1bmRlZmluZWQ7XG5cbiAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWxlbWVudDogRWxlbWVudCxcbiAgICBwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlLFxuICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgdGhpcy5fJHBhcmVudCA9IHBhcmVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5fJGlzQ29ubmVjdGVkO1xuICB9XG5cbiAgXyRzZXRWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICBraW5kOiAnY29tbWl0IHRvIGVsZW1lbnQgYmluZGluZycsXG4gICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIHJlc29sdmVEaXJlY3RpdmUodGhpcywgdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogRU5EIFVTRVJTIFNIT1VMRCBOT1QgUkVMWSBPTiBUSElTIE9CSkVDVC5cbiAqXG4gKiBQcml2YXRlIGV4cG9ydHMgZm9yIHVzZSBieSBvdGhlciBMaXQgcGFja2FnZXMsIG5vdCBpbnRlbmRlZCBmb3IgdXNlIGJ5XG4gKiBleHRlcm5hbCB1c2Vycy5cbiAqXG4gKiBXZSBjdXJyZW50bHkgZG8gbm90IG1ha2UgYSBtYW5nbGVkIHJvbGx1cCBidWlsZCBvZiB0aGUgbGl0LXNzciBjb2RlLiBJbiBvcmRlclxuICogdG8ga2VlcCBhIG51bWJlciBvZiAob3RoZXJ3aXNlIHByaXZhdGUpIHRvcC1sZXZlbCBleHBvcnRzIG1hbmdsZWQgaW4gdGhlXG4gKiBjbGllbnQgc2lkZSBjb2RlLCB3ZSBleHBvcnQgYSBfJExIIG9iamVjdCBjb250YWluaW5nIHRob3NlIG1lbWJlcnMgKG9yXG4gKiBoZWxwZXIgbWV0aG9kcyBmb3IgYWNjZXNzaW5nIHByaXZhdGUgZmllbGRzIG9mIHRob3NlIG1lbWJlcnMpLCBhbmQgdGhlblxuICogcmUtZXhwb3J0IHRoZW0gZm9yIHVzZSBpbiBsaXQtc3NyLiBUaGlzIGtlZXBzIGxpdC1zc3IgYWdub3N0aWMgdG8gd2hldGhlciB0aGVcbiAqIGNsaWVudC1zaWRlIGNvZGUgaXMgYmVpbmcgdXNlZCBpbiBgZGV2YCBtb2RlIG9yIGBwcm9kYCBtb2RlLlxuICpcbiAqIFRoaXMgaGFzIGEgdW5pcXVlIG5hbWUsIHRvIGRpc2FtYmlndWF0ZSBpdCBmcm9tIHByaXZhdGUgZXhwb3J0cyBpblxuICogbGl0LWVsZW1lbnQsIHdoaWNoIHJlLWV4cG9ydHMgYWxsIG9mIGxpdC1odG1sLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBfJExIID0ge1xuICAvLyBVc2VkIGluIGxpdC1zc3JcbiAgX2JvdW5kQXR0cmlidXRlU3VmZml4OiBib3VuZEF0dHJpYnV0ZVN1ZmZpeCxcbiAgX21hcmtlcjogbWFya2VyLFxuICBfbWFya2VyTWF0Y2g6IG1hcmtlck1hdGNoLFxuICBfSFRNTF9SRVNVTFQ6IEhUTUxfUkVTVUxULFxuICBfZ2V0VGVtcGxhdGVIdG1sOiBnZXRUZW1wbGF0ZUh0bWwsXG4gIC8vIFVzZWQgaW4gdGVzdHMgYW5kIHByaXZhdGUtc3NyLXN1cHBvcnRcbiAgX1RlbXBsYXRlSW5zdGFuY2U6IFRlbXBsYXRlSW5zdGFuY2UsXG4gIF9pc0l0ZXJhYmxlOiBpc0l0ZXJhYmxlLFxuICBfcmVzb2x2ZURpcmVjdGl2ZTogcmVzb2x2ZURpcmVjdGl2ZSxcbiAgX0NoaWxkUGFydDogQ2hpbGRQYXJ0LFxuICBfQXR0cmlidXRlUGFydDogQXR0cmlidXRlUGFydCxcbiAgX0Jvb2xlYW5BdHRyaWJ1dGVQYXJ0OiBCb29sZWFuQXR0cmlidXRlUGFydCxcbiAgX0V2ZW50UGFydDogRXZlbnRQYXJ0LFxuICBfUHJvcGVydHlQYXJ0OiBQcm9wZXJ0eVBhcnQsXG4gIF9FbGVtZW50UGFydDogRWxlbWVudFBhcnQsXG59O1xuXG4vLyBBcHBseSBwb2x5ZmlsbHMgaWYgYXZhaWxhYmxlXG5jb25zdCBwb2x5ZmlsbFN1cHBvcnQgPSBERVZfTU9ERVxuICA/IGdsb2JhbC5saXRIdG1sUG9seWZpbGxTdXBwb3J0RGV2TW9kZVxuICA6IGdsb2JhbC5saXRIdG1sUG9seWZpbGxTdXBwb3J0O1xucG9seWZpbGxTdXBwb3J0Py4oVGVtcGxhdGUsIENoaWxkUGFydCk7XG5cbi8vIElNUE9SVEFOVDogZG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydHkgbmFtZSBvciB0aGUgYXNzaWdubWVudCBleHByZXNzaW9uLlxuLy8gVGhpcyBsaW5lIHdpbGwgYmUgdXNlZCBpbiByZWdleGVzIHRvIHNlYXJjaCBmb3IgbGl0LWh0bWwgdXNhZ2UuXG4oZ2xvYmFsLmxpdEh0bWxWZXJzaW9ucyA/Pz0gW10pLnB1c2goJzMuMi4xJyk7XG5pZiAoREVWX01PREUgJiYgZ2xvYmFsLmxpdEh0bWxWZXJzaW9ucy5sZW5ndGggPiAxKSB7XG4gIGlzc3VlV2FybmluZyEoXG4gICAgJ211bHRpcGxlLXZlcnNpb25zJyxcbiAgICBgTXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0IGxvYWRlZC4gYCArXG4gICAgICBgTG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBpcyBub3QgcmVjb21tZW5kZWQuYFxuICApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSB2YWx1ZSwgdXN1YWxseSBhIGxpdC1odG1sIFRlbXBsYXRlUmVzdWx0LCB0byB0aGUgY29udGFpbmVyLlxuICpcbiAqIFRoaXMgZXhhbXBsZSByZW5kZXJzIHRoZSB0ZXh0IFwiSGVsbG8sIFpvZSFcIiBpbnNpZGUgYSBwYXJhZ3JhcGggdGFnLCBhcHBlbmRpbmdcbiAqIGl0IHRvIHRoZSBjb250YWluZXIgYGRvY3VtZW50LmJvZHlgLlxuICpcbiAqIGBgYGpzXG4gKiBpbXBvcnQge2h0bWwsIHJlbmRlcn0gZnJvbSAnbGl0JztcbiAqXG4gKiBjb25zdCBuYW1lID0gXCJab2VcIjtcbiAqIHJlbmRlcihodG1sYDxwPkhlbGxvLCAke25hbWV9ITwvcD5gLCBkb2N1bWVudC5ib2R5KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZSBBbnkgW3JlbmRlcmFibGVcbiAqICAgdmFsdWVdKGh0dHBzOi8vbGl0LmRldi9kb2NzL3RlbXBsYXRlcy9leHByZXNzaW9ucy8jY2hpbGQtZXhwcmVzc2lvbnMpLFxuICogICB0eXBpY2FsbHkgYSB7QGxpbmtjb2RlIFRlbXBsYXRlUmVzdWx0fSBjcmVhdGVkIGJ5IGV2YWx1YXRpbmcgYSB0ZW1wbGF0ZSB0YWdcbiAqICAgbGlrZSB7QGxpbmtjb2RlIGh0bWx9IG9yIHtAbGlua2NvZGUgc3ZnfS5cbiAqIEBwYXJhbSBjb250YWluZXIgQSBET00gY29udGFpbmVyIHRvIHJlbmRlciB0by4gVGhlIGZpcnN0IHJlbmRlciB3aWxsIGFwcGVuZFxuICogICB0aGUgcmVuZGVyZWQgdmFsdWUgdG8gdGhlIGNvbnRhaW5lciwgYW5kIHN1YnNlcXVlbnQgcmVuZGVycyB3aWxsXG4gKiAgIGVmZmljaWVudGx5IHVwZGF0ZSB0aGUgcmVuZGVyZWQgdmFsdWUgaWYgdGhlIHNhbWUgcmVzdWx0IHR5cGUgd2FzXG4gKiAgIHByZXZpb3VzbHkgcmVuZGVyZWQgdGhlcmUuXG4gKiBAcGFyYW0gb3B0aW9ucyBTZWUge0BsaW5rY29kZSBSZW5kZXJPcHRpb25zfSBmb3Igb3B0aW9ucyBkb2N1bWVudGF0aW9uLlxuICogQHNlZVxuICoge0BsaW5rIGh0dHBzOi8vbGl0LmRldi9kb2NzL2xpYnJhcmllcy9zdGFuZGFsb25lLXRlbXBsYXRlcy8jcmVuZGVyaW5nLWxpdC1odG1sLXRlbXBsYXRlc3wgUmVuZGVyaW5nIExpdCBIVE1MIFRlbXBsYXRlc31cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbmRlciA9IChcbiAgdmFsdWU6IHVua25vd24sXG4gIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50LFxuICBvcHRpb25zPzogUmVuZGVyT3B0aW9uc1xuKTogUm9vdFBhcnQgPT4ge1xuICBpZiAoREVWX01PREUgJiYgY29udGFpbmVyID09IG51bGwpIHtcbiAgICAvLyBHaXZlIGEgY2xlYXJlciBlcnJvciBtZXNzYWdlIHRoYW5cbiAgICAvLyAgICAgVW5jYXVnaHQgVHlwZUVycm9yOiBDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIG51bGwgKHJlYWRpbmdcbiAgICAvLyAgICAgJ18kbGl0UGFydCQnKVxuICAgIC8vIHdoaWNoIHJlYWRzIGxpa2UgYW4gaW50ZXJuYWwgTGl0IGVycm9yLlxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFRoZSBjb250YWluZXIgdG8gcmVuZGVyIGludG8gbWF5IG5vdCBiZSAke2NvbnRhaW5lcn1gKTtcbiAgfVxuICBjb25zdCByZW5kZXJJZCA9IERFVl9NT0RFID8gZGVidWdMb2dSZW5kZXJJZCsrIDogMDtcbiAgY29uc3QgcGFydE93bmVyTm9kZSA9IG9wdGlvbnM/LnJlbmRlckJlZm9yZSA/PyBjb250YWluZXI7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGxldCBwYXJ0OiBDaGlsZFBhcnQgPSAocGFydE93bmVyTm9kZSBhcyBhbnkpWydfJGxpdFBhcnQkJ107XG4gIGRlYnVnTG9nRXZlbnQgJiZcbiAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgIGtpbmQ6ICdiZWdpbiByZW5kZXInLFxuICAgICAgaWQ6IHJlbmRlcklkLFxuICAgICAgdmFsdWUsXG4gICAgICBjb250YWluZXIsXG4gICAgICBvcHRpb25zLFxuICAgICAgcGFydCxcbiAgICB9KTtcbiAgaWYgKHBhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGVuZE5vZGUgPSBvcHRpb25zPy5yZW5kZXJCZWZvcmUgPz8gbnVsbDtcbiAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgKHBhcnRPd25lck5vZGUgYXMgYW55KVsnXyRsaXRQYXJ0JCddID0gcGFydCA9IG5ldyBDaGlsZFBhcnQoXG4gICAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGNyZWF0ZU1hcmtlcigpLCBlbmROb2RlKSxcbiAgICAgIGVuZE5vZGUsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBvcHRpb25zID8/IHt9XG4gICAgKTtcbiAgfVxuICBwYXJ0Ll8kc2V0VmFsdWUodmFsdWUpO1xuICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgZGVidWdMb2dFdmVudCh7XG4gICAgICBraW5kOiAnZW5kIHJlbmRlcicsXG4gICAgICBpZDogcmVuZGVySWQsXG4gICAgICB2YWx1ZSxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIG9wdGlvbnMsXG4gICAgICBwYXJ0LFxuICAgIH0pO1xuICByZXR1cm4gcGFydCBhcyBSb290UGFydDtcbn07XG5cbmlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgcmVuZGVyLnNldFNhbml0aXplciA9IHNldFNhbml0aXplcjtcbiAgcmVuZGVyLmNyZWF0ZVNhbml0aXplciA9IGNyZWF0ZVNhbml0aXplcjtcbiAgaWYgKERFVl9NT0RFKSB7XG4gICAgcmVuZGVyLl90ZXN0T25seUNsZWFyU2FuaXRpemVyRmFjdG9yeURvTm90Q2FsbE9yRWxzZSA9XG4gICAgICBfdGVzdE9ubHlDbGVhclNhbml0aXplckZhY3RvcnlEb05vdENhbGxPckVsc2U7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBUaGUgbWFpbiBMaXRFbGVtZW50IG1vZHVsZSwgd2hpY2ggZGVmaW5lcyB0aGUge0BsaW5rY29kZSBMaXRFbGVtZW50fSBiYXNlXG4gKiBjbGFzcyBhbmQgcmVsYXRlZCBBUElzLlxuICpcbiAqIExpdEVsZW1lbnQgY29tcG9uZW50cyBjYW4gZGVmaW5lIGEgdGVtcGxhdGUgYW5kIGEgc2V0IG9mIG9ic2VydmVkXG4gKiBwcm9wZXJ0aWVzLiBDaGFuZ2luZyBhbiBvYnNlcnZlZCBwcm9wZXJ0eSB0cmlnZ2VycyBhIHJlLXJlbmRlciBvZiB0aGVcbiAqIGVsZW1lbnQuXG4gKlxuICogSW1wb3J0IHtAbGlua2NvZGUgTGl0RWxlbWVudH0gYW5kIHtAbGlua2NvZGUgaHRtbH0gZnJvbSB0aGlzIG1vZHVsZSB0b1xuICogY3JlYXRlIGEgY29tcG9uZW50OlxuICpcbiAqICBgYGBqc1xuICogaW1wb3J0IHtMaXRFbGVtZW50LCBodG1sfSBmcm9tICdsaXQtZWxlbWVudCc7XG4gKlxuICogY2xhc3MgTXlFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gKlxuICogICAvLyBEZWNsYXJlIG9ic2VydmVkIHByb3BlcnRpZXNcbiAqICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICogICAgIHJldHVybiB7XG4gKiAgICAgICBhZGplY3RpdmU6IHt9XG4gKiAgICAgfVxuICogICB9XG4gKlxuICogICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICB0aGlzLmFkamVjdGl2ZSA9ICdhd2Vzb21lJztcbiAqICAgfVxuICpcbiAqICAgLy8gRGVmaW5lIHRoZSBlbGVtZW50J3MgdGVtcGxhdGVcbiAqICAgcmVuZGVyKCkge1xuICogICAgIHJldHVybiBodG1sYDxwPnlvdXIgJHthZGplY3RpdmV9IHRlbXBsYXRlIGhlcmU8L3A+YDtcbiAqICAgfVxuICogfVxuICpcbiAqIGN1c3RvbUVsZW1lbnRzLmRlZmluZSgnbXktZWxlbWVudCcsIE15RWxlbWVudCk7XG4gKiBgYGBcbiAqXG4gKiBgTGl0RWxlbWVudGAgZXh0ZW5kcyB7QGxpbmtjb2RlIFJlYWN0aXZlRWxlbWVudH0gYW5kIGFkZHMgbGl0LWh0bWxcbiAqIHRlbXBsYXRpbmcuIFRoZSBgUmVhY3RpdmVFbGVtZW50YCBjbGFzcyBpcyBwcm92aWRlZCBmb3IgdXNlcnMgdGhhdCB3YW50IHRvXG4gKiBidWlsZCB0aGVpciBvd24gY3VzdG9tIGVsZW1lbnQgYmFzZSBjbGFzc2VzIHRoYXQgZG9uJ3QgdXNlIGxpdC1odG1sLlxuICpcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5pbXBvcnQge1Byb3BlcnR5VmFsdWVzLCBSZWFjdGl2ZUVsZW1lbnR9IGZyb20gJ0BsaXQvcmVhY3RpdmUtZWxlbWVudCc7XG5pbXBvcnQge3JlbmRlciwgUmVuZGVyT3B0aW9ucywgbm9DaGFuZ2UsIFJvb3RQYXJ0fSBmcm9tICdsaXQtaHRtbCc7XG5leHBvcnQgKiBmcm9tICdAbGl0L3JlYWN0aXZlLWVsZW1lbnQnO1xuZXhwb3J0ICogZnJvbSAnbGl0LWh0bWwnO1xuXG5pbXBvcnQge0xpdFVuc3RhYmxlfSBmcm9tICdsaXQtaHRtbCc7XG5pbXBvcnQge1JlYWN0aXZlVW5zdGFibGV9IGZyb20gJ0BsaXQvcmVhY3RpdmUtZWxlbWVudCc7XG5cbi8qKlxuICogQ29udGFpbnMgdHlwZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUgdW5zdGFibGUgZGVidWcgQVBJLlxuICpcbiAqIEV2ZXJ5dGhpbmcgaW4gdGhpcyBBUEkgaXMgbm90IHN0YWJsZSBhbmQgbWF5IGNoYW5nZSBvciBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUsXG4gKiBldmVuIG9uIHBhdGNoIHJlbGVhc2VzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZVxuZXhwb3J0IG5hbWVzcGFjZSBVbnN0YWJsZSB7XG4gIC8qKlxuICAgKiBXaGVuIExpdCBpcyBydW5uaW5nIGluIGRldiBtb2RlIGFuZCBgd2luZG93LmVtaXRMaXREZWJ1Z0xvZ0V2ZW50c2AgaXMgdHJ1ZSxcbiAgICogd2Ugd2lsbCBlbWl0ICdsaXQtZGVidWcnIGV2ZW50cyB0byB3aW5kb3csIHdpdGggbGl2ZSBkZXRhaWxzIGFib3V0IHRoZSB1cGRhdGUgYW5kIHJlbmRlclxuICAgKiBsaWZlY3ljbGUuIFRoZXNlIGNhbiBiZSB1c2VmdWwgZm9yIHdyaXRpbmcgZGVidWcgdG9vbGluZyBhbmQgdmlzdWFsaXphdGlvbnMuXG4gICAqXG4gICAqIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHJ1bm5pbmcgd2l0aCB3aW5kb3cuZW1pdExpdERlYnVnTG9nRXZlbnRzIGhhcyBwZXJmb3JtYW5jZSBvdmVyaGVhZCxcbiAgICogbWFraW5nIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3JtYWxseSB2ZXJ5IGNoZWFwIChsaWtlIGEgbm8tb3AgcmVuZGVyKSBtdWNoIHNsb3dlcixcbiAgICogYmVjYXVzZSB3ZSBtdXN0IGNvcHkgZGF0YSBhbmQgZGlzcGF0Y2ggZXZlbnRzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbiAgZXhwb3J0IG5hbWVzcGFjZSBEZWJ1Z0xvZyB7XG4gICAgZXhwb3J0IHR5cGUgRW50cnkgPVxuICAgICAgfCBMaXRVbnN0YWJsZS5EZWJ1Z0xvZy5FbnRyeVxuICAgICAgfCBSZWFjdGl2ZVVuc3RhYmxlLkRlYnVnTG9nLkVudHJ5O1xuICB9XG59XG4vKlxuICogV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzXG4gKiByZXBsYWNlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIG11bmdlZCBuYW1lIGZvciBvYmplY3RbcHJvcGVydHldLiBXZSBjYW5ub3RcbiAqIGFsaWFzIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGhhdmUgdG8gdXNlIGEgc21hbGwgc2hpbSB0aGF0IGhhcyB0aGUgc2FtZVxuICogYmVoYXZpb3Igd2hlbiBub3QgY29tcGlsaW5nLlxuICovXG4vKkBfX0lOTElORV9fKi9cbmNvbnN0IEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSA8UCBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgcHJvcDogUCxcbiAgX29iajogdW5rbm93blxuKTogUCA9PiBwcm9wO1xuXG5jb25zdCBERVZfTU9ERSA9IHRydWU7XG5cbmxldCBpc3N1ZVdhcm5pbmc6IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4gdm9pZDtcblxuaWYgKERFVl9NT0RFKSB7XG4gIC8vIEVuc3VyZSB3YXJuaW5ncyBhcmUgaXNzdWVkIG9ubHkgMXgsIGV2ZW4gaWYgbXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0XG4gIC8vIGFyZSBsb2FkZWQuXG4gIGNvbnN0IGlzc3VlZFdhcm5pbmdzOiBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPiA9XG4gICAgKGdsb2JhbFRoaXMubGl0SXNzdWVkV2FybmluZ3MgPz89IG5ldyBTZXQoKSk7XG5cbiAgLy8gSXNzdWUgYSB3YXJuaW5nLCBpZiB3ZSBoYXZlbid0IGFscmVhZHkuXG4gIGlzc3VlV2FybmluZyA9IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4ge1xuICAgIHdhcm5pbmcgKz0gYCBTZWUgaHR0cHM6Ly9saXQuZGV2L21zZy8ke2NvZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLmA7XG4gICAgaWYgKCFpc3N1ZWRXYXJuaW5ncy5oYXMod2FybmluZykpIHtcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgIGlzc3VlZFdhcm5pbmdzLmFkZCh3YXJuaW5nKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQmFzZSBlbGVtZW50IGNsYXNzIHRoYXQgbWFuYWdlcyBlbGVtZW50IHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXMsIGFuZFxuICogcmVuZGVycyBhIGxpdC1odG1sIHRlbXBsYXRlLlxuICpcbiAqIFRvIGRlZmluZSBhIGNvbXBvbmVudCwgc3ViY2xhc3MgYExpdEVsZW1lbnRgIGFuZCBpbXBsZW1lbnQgYVxuICogYHJlbmRlcmAgbWV0aG9kIHRvIHByb3ZpZGUgdGhlIGNvbXBvbmVudCdzIHRlbXBsYXRlLiBEZWZpbmUgcHJvcGVydGllc1xuICogdXNpbmcgdGhlIHtAbGlua2NvZGUgTGl0RWxlbWVudC5wcm9wZXJ0aWVzIHByb3BlcnRpZXN9IHByb3BlcnR5IG9yIHRoZVxuICoge0BsaW5rY29kZSBwcm9wZXJ0eX0gZGVjb3JhdG9yLlxuICovXG5leHBvcnQgY2xhc3MgTGl0RWxlbWVudCBleHRlbmRzIFJlYWN0aXZlRWxlbWVudCB7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIHN0YXRpYyBbJ18kbGl0RWxlbWVudCQnXSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IHJlbmRlck9wdGlvbnM6IFJlbmRlck9wdGlvbnMgPSB7aG9zdDogdGhpc307XG5cbiAgcHJpdmF0ZSBfX2NoaWxkUGFydDogUm9vdFBhcnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVSZW5kZXJSb290KCkge1xuICAgIGNvbnN0IHJlbmRlclJvb3QgPSBzdXBlci5jcmVhdGVSZW5kZXJSb290KCk7XG4gICAgLy8gV2hlbiBhZG9wdGVkU3R5bGVTaGVldHMgYXJlIHNoaW1tZWQsIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlXG4gICAgLy8gc2hhZG93Um9vdCBieSBjcmVhdGVSZW5kZXJSb290LiBBZGp1c3QgdGhlIHJlbmRlckJlZm9yZSBub2RlIHNvIHRoYXRcbiAgICAvLyBhbnkgc3R5bGVzIGluIExpdCBjb250ZW50IHJlbmRlciBiZWZvcmUgYWRvcHRlZFN0eWxlU2hlZXRzLiBUaGlzIGlzXG4gICAgLy8gaW1wb3J0YW50IHNvIHRoYXQgYWRvcHRlZFN0eWxlU2hlZXRzIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHN0eWxlcyBpblxuICAgIC8vIHRoZSBzaGFkb3dSb290LlxuICAgIHRoaXMucmVuZGVyT3B0aW9ucy5yZW5kZXJCZWZvcmUgPz89IHJlbmRlclJvb3QhLmZpcnN0Q2hpbGQgYXMgQ2hpbGROb2RlO1xuICAgIHJldHVybiByZW5kZXJSb290O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGVsZW1lbnQuIFRoaXMgbWV0aG9kIHJlZmxlY3RzIHByb3BlcnR5IHZhbHVlcyB0byBhdHRyaWJ1dGVzXG4gICAqIGFuZCBjYWxscyBgcmVuZGVyYCB0byByZW5kZXIgRE9NIHZpYSBsaXQtaHRtbC4gU2V0dGluZyBwcm9wZXJ0aWVzIGluc2lkZVxuICAgKiB0aGlzIG1ldGhvZCB3aWxsICpub3QqIHRyaWdnZXIgYW5vdGhlciB1cGRhdGUuXG4gICAqIEBwYXJhbSBjaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpIHtcbiAgICAvLyBTZXR0aW5nIHByb3BlcnRpZXMgaW4gYHJlbmRlcmAgc2hvdWxkIG5vdCB0cmlnZ2VyIGFuIHVwZGF0ZS4gU2luY2VcbiAgICAvLyB1cGRhdGVzIGFyZSBhbGxvd2VkIGFmdGVyIHN1cGVyLnVwZGF0ZSwgaXQncyBpbXBvcnRhbnQgdG8gY2FsbCBgcmVuZGVyYFxuICAgIC8vIGJlZm9yZSB0aGF0LlxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZW5kZXIoKTtcbiAgICBpZiAoIXRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgdGhpcy5yZW5kZXJPcHRpb25zLmlzQ29ubmVjdGVkID0gdGhpcy5pc0Nvbm5lY3RlZDtcbiAgICB9XG4gICAgc3VwZXIudXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICB0aGlzLl9fY2hpbGRQYXJ0ID0gcmVuZGVyKHZhbHVlLCB0aGlzLnJlbmRlclJvb3QsIHRoaXMucmVuZGVyT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgYWRkZWQgdG8gdGhlIGRvY3VtZW50J3MgRE9NLlxuICAgKlxuICAgKiBJbiBgY29ubmVjdGVkQ2FsbGJhY2soKWAgeW91IHNob3VsZCBzZXR1cCB0YXNrcyB0aGF0IHNob3VsZCBvbmx5IG9jY3VyIHdoZW5cbiAgICogdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHRvIHRoZSBkb2N1bWVudC4gVGhlIG1vc3QgY29tbW9uIG9mIHRoZXNlIGlzXG4gICAqIGFkZGluZyBldmVudCBsaXN0ZW5lcnMgdG8gbm9kZXMgZXh0ZXJuYWwgdG8gdGhlIGVsZW1lbnQsIGxpa2UgYSBrZXlkb3duXG4gICAqIGV2ZW50IGhhbmRsZXIgYWRkZWQgdG8gdGhlIHdpbmRvdy5cbiAgICpcbiAgICogYGBgdHNcbiAgICogY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAqICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICogICBhZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5faGFuZGxlS2V5ZG93bik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFR5cGljYWxseSwgYW55dGhpbmcgZG9uZSBpbiBgY29ubmVjdGVkQ2FsbGJhY2soKWAgc2hvdWxkIGJlIHVuZG9uZSB3aGVuIHRoZVxuICAgKiBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZCwgaW4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrKClgLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgbGlmZWN5Y2xlXG4gICAqL1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuX19jaGlsZFBhcnQ/LnNldENvbm5lY3RlZCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyByZW1vdmVkIGZyb20gdGhlIGRvY3VtZW50J3MgRE9NLlxuICAgKlxuICAgKiBUaGlzIGNhbGxiYWNrIGlzIHRoZSBtYWluIHNpZ25hbCB0byB0aGUgZWxlbWVudCB0aGF0IGl0IG1heSBubyBsb25nZXIgYmVcbiAgICogdXNlZC4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrKClgIHNob3VsZCBlbnN1cmUgdGhhdCBub3RoaW5nIGlzIGhvbGRpbmcgYVxuICAgKiByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgKHN1Y2ggYXMgZXZlbnQgbGlzdGVuZXJzIGFkZGVkIHRvIG5vZGVzIGV4dGVybmFsXG4gICAqIHRvIHRoZSBlbGVtZW50KSwgc28gdGhhdCBpdCBpcyBmcmVlIHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICogICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgKiAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5faGFuZGxlS2V5ZG93bik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEFuIGVsZW1lbnQgbWF5IGJlIHJlLWNvbm5lY3RlZCBhZnRlciBiZWluZyBkaXNjb25uZWN0ZWQuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBsaWZlY3ljbGVcbiAgICovXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5fX2NoaWxkUGFydD8uc2V0Q29ubmVjdGVkKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VkIG9uIGVhY2ggdXBkYXRlIHRvIHBlcmZvcm0gcmVuZGVyaW5nIHRhc2tzLiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuXG4gICAqIGFueSB2YWx1ZSByZW5kZXJhYmxlIGJ5IGxpdC1odG1sJ3MgYENoaWxkUGFydGAgLSB0eXBpY2FsbHkgYVxuICAgKiBgVGVtcGxhdGVSZXN1bHRgLiBTZXR0aW5nIHByb3BlcnRpZXMgaW5zaWRlIHRoaXMgbWV0aG9kIHdpbGwgKm5vdCogdHJpZ2dlclxuICAgKiB0aGUgZWxlbWVudCB0byB1cGRhdGUuXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHByb3RlY3RlZCByZW5kZXIoKTogdW5rbm93biB7XG4gICAgcmV0dXJuIG5vQ2hhbmdlO1xuICB9XG59XG5cbi8qKlxuICogRW5zdXJlIHRoaXMgY2xhc3MgaXMgbWFya2VkIGFzIGBmaW5hbGl6ZWRgIGFzIGFuIG9wdGltaXphdGlvbiBlbnN1cmluZ1xuICogaXQgd2lsbCBub3QgbmVlZGxlc3NseSB0cnkgdG8gYGZpbmFsaXplYC5cbiAqXG4gKiBOb3RlIHRoaXMgcHJvcGVydHkgbmFtZSBpcyBhIHN0cmluZyB0byBwcmV2ZW50IGJyZWFraW5nIENsb3N1cmUgSlMgQ29tcGlsZXJcbiAqIG9wdGltaXphdGlvbnMuIFNlZSBAbGl0L3JlYWN0aXZlLWVsZW1lbnQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbihMaXRFbGVtZW50IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW1xuICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdmaW5hbGl6ZWQnLCBMaXRFbGVtZW50KVxuXSA9IHRydWU7XG5cbi8vIEluc3RhbGwgaHlkcmF0aW9uIGlmIGF2YWlsYWJsZVxuZ2xvYmFsVGhpcy5saXRFbGVtZW50SHlkcmF0ZVN1cHBvcnQ/Lih7TGl0RWxlbWVudH0pO1xuXG4vLyBBcHBseSBwb2x5ZmlsbHMgaWYgYXZhaWxhYmxlXG5jb25zdCBwb2x5ZmlsbFN1cHBvcnQgPSBERVZfTU9ERVxuICA/IGdsb2JhbFRoaXMubGl0RWxlbWVudFBvbHlmaWxsU3VwcG9ydERldk1vZGVcbiAgOiBnbG9iYWxUaGlzLmxpdEVsZW1lbnRQb2x5ZmlsbFN1cHBvcnQ7XG5wb2x5ZmlsbFN1cHBvcnQ/Lih7TGl0RWxlbWVudH0pO1xuXG4vKipcbiAqIEVORCBVU0VSUyBTSE9VTEQgTk9UIFJFTFkgT04gVEhJUyBPQkpFQ1QuXG4gKlxuICogUHJpdmF0ZSBleHBvcnRzIGZvciB1c2UgYnkgb3RoZXIgTGl0IHBhY2thZ2VzLCBub3QgaW50ZW5kZWQgZm9yIHVzZSBieVxuICogZXh0ZXJuYWwgdXNlcnMuXG4gKlxuICogV2UgY3VycmVudGx5IGRvIG5vdCBtYWtlIGEgbWFuZ2xlZCByb2xsdXAgYnVpbGQgb2YgdGhlIGxpdC1zc3IgY29kZS4gSW4gb3JkZXJcbiAqIHRvIGtlZXAgYSBudW1iZXIgb2YgKG90aGVyd2lzZSBwcml2YXRlKSB0b3AtbGV2ZWwgZXhwb3J0cyAgbWFuZ2xlZCBpbiB0aGVcbiAqIGNsaWVudCBzaWRlIGNvZGUsIHdlIGV4cG9ydCBhIF8kTEUgb2JqZWN0IGNvbnRhaW5pbmcgdGhvc2UgbWVtYmVycyAob3JcbiAqIGhlbHBlciBtZXRob2RzIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSBmaWVsZHMgb2YgdGhvc2UgbWVtYmVycyksIGFuZCB0aGVuXG4gKiByZS1leHBvcnQgdGhlbSBmb3IgdXNlIGluIGxpdC1zc3IuIFRoaXMga2VlcHMgbGl0LXNzciBhZ25vc3RpYyB0byB3aGV0aGVyIHRoZVxuICogY2xpZW50LXNpZGUgY29kZSBpcyBiZWluZyB1c2VkIGluIGBkZXZgIG1vZGUgb3IgYHByb2RgIG1vZGUuXG4gKlxuICogVGhpcyBoYXMgYSB1bmlxdWUgbmFtZSwgdG8gZGlzYW1iaWd1YXRlIGl0IGZyb20gcHJpdmF0ZSBleHBvcnRzIGluXG4gKiBsaXQtaHRtbCwgc2luY2UgdGhpcyBtb2R1bGUgcmUtZXhwb3J0cyBhbGwgb2YgbGl0LWh0bWwuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IF8kTEUgPSB7XG4gIF8kYXR0cmlidXRlVG9Qcm9wZXJ0eTogKFxuICAgIGVsOiBMaXRFbGVtZW50LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVsbFxuICApID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAoZWwgYXMgYW55KS5fJGF0dHJpYnV0ZVRvUHJvcGVydHkobmFtZSwgdmFsdWUpO1xuICB9LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgXyRjaGFuZ2VkUHJvcGVydGllczogKGVsOiBMaXRFbGVtZW50KSA9PiAoZWwgYXMgYW55KS5fJGNoYW5nZWRQcm9wZXJ0aWVzLFxufTtcblxuLy8gSU1QT1JUQU5UOiBkbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0eSBuYW1lIG9yIHRoZSBhc3NpZ25tZW50IGV4cHJlc3Npb24uXG4vLyBUaGlzIGxpbmUgd2lsbCBiZSB1c2VkIGluIHJlZ2V4ZXMgdG8gc2VhcmNoIGZvciBMaXRFbGVtZW50IHVzYWdlLlxuKGdsb2JhbFRoaXMubGl0RWxlbWVudFZlcnNpb25zID8/PSBbXSkucHVzaCgnNC4xLjEnKTtcbmlmIChERVZfTU9ERSAmJiBnbG9iYWxUaGlzLmxpdEVsZW1lbnRWZXJzaW9ucy5sZW5ndGggPiAxKSB7XG4gIGlzc3VlV2FybmluZyEoXG4gICAgJ211bHRpcGxlLXZlcnNpb25zJyxcbiAgICBgTXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0IGxvYWRlZC4gTG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBgICtcbiAgICAgIGBpcyBub3QgcmVjb21tZW5kZWQuYFxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG4vKlxuICogSU1QT1JUQU5UOiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRzaWNrbGUgYW5kIHRoZSBDbG9zdXJlIEpTIGNvbXBpbGVyLCBhbGxcbiAqIHByb3BlcnR5IGRlY29yYXRvcnMgKGJ1dCBub3QgY2xhc3MgZGVjb3JhdG9ycykgaW4gdGhpcyBmaWxlIHRoYXQgaGF2ZVxuICogYW4gQEV4cG9ydERlY29yYXRlZEl0ZW1zIGFubm90YXRpb24gbXVzdCBiZSBkZWZpbmVkIGFzIGEgcmVndWxhciBmdW5jdGlvbixcbiAqIG5vdCBhbiBhcnJvdyBmdW5jdGlvbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7Q29uc3RydWN0b3J9IGZyb20gJy4vYmFzZS5qcyc7XG5cbi8qKlxuICogQWxsb3cgZm9yIGN1c3RvbSBlbGVtZW50IGNsYXNzZXMgd2l0aCBwcml2YXRlIGNvbnN0cnVjdG9yc1xuICovXG50eXBlIEN1c3RvbUVsZW1lbnRDbGFzcyA9IE9taXQ8dHlwZW9mIEhUTUxFbGVtZW50LCAnbmV3Jz47XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUVsZW1lbnREZWNvcmF0b3IgPSB7XG4gIC8vIGxlZ2FjeVxuICAoY2xzOiBDdXN0b21FbGVtZW50Q2xhc3MpOiB2b2lkO1xuXG4gIC8vIHN0YW5kYXJkXG4gIChcbiAgICB0YXJnZXQ6IEN1c3RvbUVsZW1lbnRDbGFzcyxcbiAgICBjb250ZXh0OiBDbGFzc0RlY29yYXRvckNvbnRleHQ8Q29uc3RydWN0b3I8SFRNTEVsZW1lbnQ+PlxuICApOiB2b2lkO1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGRlZmluZXMgdGhlIGRlY29yYXRlZCBjbGFzcyBhcyBhIGN1c3RvbSBlbGVtZW50LlxuICpcbiAqIGBgYGpzXG4gKiBAY3VzdG9tRWxlbWVudCgnbXktZWxlbWVudCcpXG4gKiBjbGFzcyBNeUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAqICAgcmVuZGVyKCkge1xuICogICAgIHJldHVybiBodG1sYGA7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICogQGNhdGVnb3J5IERlY29yYXRvclxuICogQHBhcmFtIHRhZ05hbWUgVGhlIHRhZyBuYW1lIG9mIHRoZSBjdXN0b20gZWxlbWVudCB0byBkZWZpbmUuXG4gKi9cbmV4cG9ydCBjb25zdCBjdXN0b21FbGVtZW50ID1cbiAgKHRhZ05hbWU6IHN0cmluZyk6IEN1c3RvbUVsZW1lbnREZWNvcmF0b3IgPT5cbiAgKFxuICAgIGNsYXNzT3JUYXJnZXQ6IEN1c3RvbUVsZW1lbnRDbGFzcyB8IENvbnN0cnVjdG9yPEhUTUxFbGVtZW50PixcbiAgICBjb250ZXh0PzogQ2xhc3NEZWNvcmF0b3JDb250ZXh0PENvbnN0cnVjdG9yPEhUTUxFbGVtZW50Pj5cbiAgKSA9PiB7XG4gICAgaWYgKGNvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplcigoKSA9PiB7XG4gICAgICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgICAgICAgICB0YWdOYW1lLFxuICAgICAgICAgIGNsYXNzT3JUYXJnZXQgYXMgQ3VzdG9tRWxlbWVudENvbnN0cnVjdG9yXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKHRhZ05hbWUsIGNsYXNzT3JUYXJnZXQgYXMgQ3VzdG9tRWxlbWVudENvbnN0cnVjdG9yKTtcbiAgICB9XG4gIH07XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbi8qXG4gKiBJTVBPUlRBTlQ6IEZvciBjb21wYXRpYmlsaXR5IHdpdGggdHNpY2tsZSBhbmQgdGhlIENsb3N1cmUgSlMgY29tcGlsZXIsIGFsbFxuICogcHJvcGVydHkgZGVjb3JhdG9ycyAoYnV0IG5vdCBjbGFzcyBkZWNvcmF0b3JzKSBpbiB0aGlzIGZpbGUgdGhhdCBoYXZlXG4gKiBhbiBARXhwb3J0RGVjb3JhdGVkSXRlbXMgYW5ub3RhdGlvbiBtdXN0IGJlIGRlZmluZWQgYXMgYSByZWd1bGFyIGZ1bmN0aW9uLFxuICogbm90IGFuIGFycm93IGZ1bmN0aW9uLlxuICovXG5cbmltcG9ydCB7XG4gIHR5cGUgUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgdHlwZSBSZWFjdGl2ZUVsZW1lbnQsXG4gIGRlZmF1bHRDb252ZXJ0ZXIsXG4gIG5vdEVxdWFsLFxufSBmcm9tICcuLi9yZWFjdGl2ZS1lbGVtZW50LmpzJztcbmltcG9ydCB0eXBlIHtJbnRlcmZhY2V9IGZyb20gJy4vYmFzZS5qcyc7XG5cbmNvbnN0IERFVl9NT0RFID0gdHJ1ZTtcblxubGV0IGlzc3VlV2FybmluZzogKGNvZGU6IHN0cmluZywgd2FybmluZzogc3RyaW5nKSA9PiB2b2lkO1xuXG5pZiAoREVWX01PREUpIHtcbiAgLy8gRW5zdXJlIHdhcm5pbmdzIGFyZSBpc3N1ZWQgb25seSAxeCwgZXZlbiBpZiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBMaXRcbiAgLy8gYXJlIGxvYWRlZC5cbiAgY29uc3QgaXNzdWVkV2FybmluZ3M6IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+ID1cbiAgICAoZ2xvYmFsVGhpcy5saXRJc3N1ZWRXYXJuaW5ncyA/Pz0gbmV3IFNldCgpKTtcblxuICAvLyBJc3N1ZSBhIHdhcm5pbmcsIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeS5cbiAgaXNzdWVXYXJuaW5nID0gKGNvZGU6IHN0cmluZywgd2FybmluZzogc3RyaW5nKSA9PiB7XG4gICAgd2FybmluZyArPSBgIFNlZSBodHRwczovL2xpdC5kZXYvbXNnLyR7Y29kZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uYDtcbiAgICBpZiAoIWlzc3VlZFdhcm5pbmdzLmhhcyh3YXJuaW5nKSkge1xuICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgICAgaXNzdWVkV2FybmluZ3MuYWRkKHdhcm5pbmcpO1xuICAgIH1cbiAgfTtcbn1cblxuLy8gT3ZlcmxvYWRzIGZvciBwcm9wZXJ0eSBkZWNvcmF0b3Igc28gdGhhdCBUeXBlU2NyaXB0IGNhbiBpbmZlciB0aGUgY29ycmVjdFxuLy8gcmV0dXJuIHR5cGUgd2hlbiBhIGRlY29yYXRvciBpcyB1c2VkIGFzIGFuIGFjY2Vzc29yIGRlY29yYXRvciBvciBhIHNldHRlclxuLy8gZGVjb3JhdG9yLlxuZXhwb3J0IHR5cGUgUHJvcGVydHlEZWNvcmF0b3IgPSB7XG4gIC8vIGFjY2Vzc29yIGRlY29yYXRvciBzaWduYXR1cmVcbiAgPEMgZXh0ZW5kcyBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PiwgVj4oXG4gICAgdGFyZ2V0OiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yVGFyZ2V0PEMsIFY+LFxuICAgIGNvbnRleHQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICk6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JSZXN1bHQ8QywgVj47XG5cbiAgLy8gc2V0dGVyIGRlY29yYXRvciBzaWduYXR1cmVcbiAgPEMgZXh0ZW5kcyBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PiwgVj4oXG4gICAgdGFyZ2V0OiAodmFsdWU6IFYpID0+IHZvaWQsXG4gICAgY29udGV4dDogQ2xhc3NTZXR0ZXJEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICk6ICh0aGlzOiBDLCB2YWx1ZTogVikgPT4gdm9pZDtcblxuICAvLyBsZWdhY3kgZGVjb3JhdG9yIHNpZ25hdHVyZVxuICAoXG4gICAgcHJvdG9PckRlc2NyaXB0b3I6IE9iamVjdCxcbiAgICBuYW1lOiBQcm9wZXJ0eUtleSxcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgKTogYW55O1xufTtcblxuY29uc3QgbGVnYWN5UHJvcGVydHkgPSAoXG4gIG9wdGlvbnM6IFByb3BlcnR5RGVjbGFyYXRpb24gfCB1bmRlZmluZWQsXG4gIHByb3RvOiBPYmplY3QsXG4gIG5hbWU6IFByb3BlcnR5S2V5XG4pID0+IHtcbiAgY29uc3QgaGFzT3duUHJvcGVydHkgPSBwcm90by5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcbiAgKHByb3RvLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpLmNyZWF0ZVByb3BlcnR5KFxuICAgIG5hbWUsXG4gICAgaGFzT3duUHJvcGVydHkgPyB7Li4ub3B0aW9ucywgd3JhcHBlZDogdHJ1ZX0gOiBvcHRpb25zXG4gICk7XG4gIC8vIEZvciBhY2Nlc3NvcnMgKHdoaWNoIGhhdmUgYSBkZXNjcmlwdG9yIG9uIHRoZSBwcm90b3R5cGUpIHdlIG5lZWQgdG9cbiAgLy8gcmV0dXJuIGEgZGVzY3JpcHRvciwgb3RoZXJ3aXNlIFR5cGVTY3JpcHQgb3ZlcndyaXRlcyB0aGUgZGVzY3JpcHRvciB3ZVxuICAvLyBkZWZpbmUgaW4gY3JlYXRlUHJvcGVydHkoKSB3aXRoIHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9yLiBXZSBkb24ndCBkbyB0aGlzXG4gIC8vIGZvciBmaWVsZHMsIHdoaWNoIGRvbid0IGhhdmUgYSBkZXNjcmlwdG9yLCBiZWNhdXNlIHRoaXMgY291bGQgb3ZlcndyaXRlXG4gIC8vIGRlc2NyaXB0b3IgZGVmaW5lZCBieSBvdGhlciBkZWNvcmF0b3JzLlxuICByZXR1cm4gaGFzT3duUHJvcGVydHlcbiAgICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIG5hbWUpXG4gICAgOiB1bmRlZmluZWQ7XG59O1xuXG4vLyBUaGlzIGlzIGR1cGxpY2F0ZWQgZnJvbSBhIHNpbWlsYXIgdmFyaWFibGUgaW4gcmVhY3RpdmUtZWxlbWVudC50cywgYnV0XG4vLyBhY3R1YWxseSBtYWtlcyBzZW5zZSB0byBoYXZlIHRoaXMgZGVmYXVsdCBkZWZpbmVkIHdpdGggdGhlIGRlY29yYXRvciwgc29cbi8vIHRoYXQgZGlmZmVyZW50IGRlY29yYXRvcnMgY291bGQgaGF2ZSBkaWZmZXJlbnQgZGVmYXVsdHMuXG5jb25zdCBkZWZhdWx0UHJvcGVydHlEZWNsYXJhdGlvbjogUHJvcGVydHlEZWNsYXJhdGlvbiA9IHtcbiAgYXR0cmlidXRlOiB0cnVlLFxuICB0eXBlOiBTdHJpbmcsXG4gIGNvbnZlcnRlcjogZGVmYXVsdENvbnZlcnRlcixcbiAgcmVmbGVjdDogZmFsc2UsXG4gIGhhc0NoYW5nZWQ6IG5vdEVxdWFsLFxufTtcblxuLy8gVGVtcG9yYXJ5IHR5cGUsIHVudGlsIGdvb2dsZTMgaXMgb24gVHlwZVNjcmlwdCA1LjJcbnR5cGUgU3RhbmRhcmRQcm9wZXJ0eUNvbnRleHQ8QywgVj4gPSAoXG4gIHwgQ2xhc3NBY2Nlc3NvckRlY29yYXRvckNvbnRleHQ8QywgVj5cbiAgfCBDbGFzc1NldHRlckRlY29yYXRvckNvbnRleHQ8QywgVj5cbikgJiB7bWV0YWRhdGE6IG9iamVjdH07XG5cbi8qKlxuICogV3JhcHMgYSBjbGFzcyBhY2Nlc3NvciBvciBzZXR0ZXIgc28gdGhhdCBgcmVxdWVzdFVwZGF0ZSgpYCBpcyBjYWxsZWQgd2l0aCB0aGVcbiAqIHByb3BlcnR5IG5hbWUgYW5kIG9sZCB2YWx1ZSB3aGVuIHRoZSBhY2Nlc3NvciBpcyBzZXQuXG4gKi9cbmV4cG9ydCBjb25zdCBzdGFuZGFyZFByb3BlcnR5ID0gPEMgZXh0ZW5kcyBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PiwgVj4oXG4gIG9wdGlvbnM6IFByb3BlcnR5RGVjbGFyYXRpb24gPSBkZWZhdWx0UHJvcGVydHlEZWNsYXJhdGlvbixcbiAgdGFyZ2V0OiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yVGFyZ2V0PEMsIFY+IHwgKCh2YWx1ZTogVikgPT4gdm9pZCksXG4gIGNvbnRleHQ6IFN0YW5kYXJkUHJvcGVydHlDb250ZXh0PEMsIFY+XG4pOiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yUmVzdWx0PEMsIFY+IHwgKCh0aGlzOiBDLCB2YWx1ZTogVikgPT4gdm9pZCkgPT4ge1xuICBjb25zdCB7a2luZCwgbWV0YWRhdGF9ID0gY29udGV4dDtcblxuICBpZiAoREVWX01PREUgJiYgbWV0YWRhdGEgPT0gbnVsbCkge1xuICAgIGlzc3VlV2FybmluZyhcbiAgICAgICdtaXNzaW5nLWNsYXNzLW1ldGFkYXRhJyxcbiAgICAgIGBUaGUgY2xhc3MgJHt0YXJnZXR9IGlzIG1pc3NpbmcgZGVjb3JhdG9yIG1ldGFkYXRhLiBUaGlzIGAgK1xuICAgICAgICBgY291bGQgbWVhbiB0aGF0IHlvdSdyZSB1c2luZyBhIGNvbXBpbGVyIHRoYXQgc3VwcG9ydHMgZGVjb3JhdG9ycyBgICtcbiAgICAgICAgYGJ1dCBkb2Vzbid0IHN1cHBvcnQgZGVjb3JhdG9yIG1ldGFkYXRhLCBzdWNoIGFzIFR5cGVTY3JpcHQgNS4xLiBgICtcbiAgICAgICAgYFBsZWFzZSB1cGRhdGUgeW91ciBjb21waWxlci5gXG4gICAgKTtcbiAgfVxuXG4gIC8vIFN0b3JlIHRoZSBwcm9wZXJ0eSBvcHRpb25zXG4gIGxldCBwcm9wZXJ0aWVzID0gZ2xvYmFsVGhpcy5saXRQcm9wZXJ0eU1ldGFkYXRhLmdldChtZXRhZGF0YSk7XG4gIGlmIChwcm9wZXJ0aWVzID09PSB1bmRlZmluZWQpIHtcbiAgICBnbG9iYWxUaGlzLmxpdFByb3BlcnR5TWV0YWRhdGEuc2V0KG1ldGFkYXRhLCAocHJvcGVydGllcyA9IG5ldyBNYXAoKSkpO1xuICB9XG4gIHByb3BlcnRpZXMuc2V0KGNvbnRleHQubmFtZSwgb3B0aW9ucyk7XG5cbiAgaWYgKGtpbmQgPT09ICdhY2Nlc3NvcicpIHtcbiAgICAvLyBTdGFuZGFyZCBkZWNvcmF0b3JzIGNhbm5vdCBkeW5hbWljYWxseSBtb2RpZnkgdGhlIGNsYXNzLCBzbyB3ZSBjYW4ndFxuICAgIC8vIHJlcGxhY2UgYSBmaWVsZCB3aXRoIGFjY2Vzc29ycy4gVGhlIHVzZXIgbXVzdCB1c2UgdGhlIG5ldyBgYWNjZXNzb3JgXG4gICAgLy8ga2V5d29yZCBpbnN0ZWFkLlxuICAgIGNvbnN0IHtuYW1lfSA9IGNvbnRleHQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQsIHY6IFYpIHtcbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSAoXG4gICAgICAgICAgdGFyZ2V0IGFzIENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj5cbiAgICAgICAgKS5nZXQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgQyk7XG4gICAgICAgICh0YXJnZXQgYXMgQ2xhc3NBY2Nlc3NvckRlY29yYXRvclRhcmdldDxDLCBWPikuc2V0LmNhbGwoXG4gICAgICAgICAgdGhpcyBhcyB1bmtub3duIGFzIEMsXG4gICAgICAgICAgdlxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgfSxcbiAgICAgIGluaXQodGhpczogUmVhY3RpdmVFbGVtZW50LCB2OiBWKTogViB7XG4gICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLl8kY2hhbmdlUHJvcGVydHkobmFtZSwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdjtcbiAgICAgIH0sXG4gICAgfSBhcyB1bmtub3duIGFzIENsYXNzQWNjZXNzb3JEZWNvcmF0b3JSZXN1bHQ8QywgVj47XG4gIH0gZWxzZSBpZiAoa2luZCA9PT0gJ3NldHRlcicpIHtcbiAgICBjb25zdCB7bmFtZX0gPSBjb250ZXh0O1xuICAgIHJldHVybiBmdW5jdGlvbiAodGhpczogUmVhY3RpdmVFbGVtZW50LCB2YWx1ZTogVikge1xuICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzW25hbWUgYXMga2V5b2YgUmVhY3RpdmVFbGVtZW50XTtcbiAgICAgICh0YXJnZXQgYXMgKHZhbHVlOiBWKSA9PiB2b2lkKS5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZShuYW1lLCBvbGRWYWx1ZSwgb3B0aW9ucyk7XG4gICAgfSBhcyB1bmtub3duIGFzICh0aGlzOiBDLCB2YWx1ZTogVikgPT4gdm9pZDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRlY29yYXRvciBsb2NhdGlvbjogJHtraW5kfWApO1xufTtcblxuLyoqXG4gKiBBIGNsYXNzIGZpZWxkIG9yIGFjY2Vzc29yIGRlY29yYXRvciB3aGljaCBjcmVhdGVzIGEgcmVhY3RpdmUgcHJvcGVydHkgdGhhdFxuICogcmVmbGVjdHMgYSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSB2YWx1ZS4gV2hlbiBhIGRlY29yYXRlZCBwcm9wZXJ0eSBpcyBzZXRcbiAqIHRoZSBlbGVtZW50IHdpbGwgdXBkYXRlIGFuZCByZW5kZXIuIEEge0BsaW5rY29kZSBQcm9wZXJ0eURlY2xhcmF0aW9ufSBtYXlcbiAqIG9wdGlvbmFsbHkgYmUgc3VwcGxpZWQgdG8gY29uZmlndXJlIHByb3BlcnR5IGZlYXR1cmVzLlxuICpcbiAqIFRoaXMgZGVjb3JhdG9yIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHB1YmxpYyBmaWVsZHMuIEFzIHB1YmxpYyBmaWVsZHMsXG4gKiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIHByaW1hcmlseSBzZXR0YWJsZSBieSBlbGVtZW50IHVzZXJzLFxuICogZWl0aGVyIHZpYSBhdHRyaWJ1dGUgb3IgdGhlIHByb3BlcnR5IGl0c2VsZi5cbiAqXG4gKiBHZW5lcmFsbHksIHByb3BlcnRpZXMgdGhhdCBhcmUgY2hhbmdlZCBieSB0aGUgZWxlbWVudCBzaG91bGQgYmUgcHJpdmF0ZSBvclxuICogcHJvdGVjdGVkIGZpZWxkcyBhbmQgc2hvdWxkIHVzZSB0aGUge0BsaW5rY29kZSBzdGF0ZX0gZGVjb3JhdG9yLlxuICpcbiAqIEhvd2V2ZXIsIHNvbWV0aW1lcyBlbGVtZW50IGNvZGUgZG9lcyBuZWVkIHRvIHNldCBhIHB1YmxpYyBwcm9wZXJ0eS4gVGhpc1xuICogc2hvdWxkIHR5cGljYWxseSBvbmx5IGJlIGRvbmUgaW4gcmVzcG9uc2UgdG8gdXNlciBpbnRlcmFjdGlvbiwgYW5kIGFuIGV2ZW50XG4gKiBzaG91bGQgYmUgZmlyZWQgaW5mb3JtaW5nIHRoZSB1c2VyOyBmb3IgZXhhbXBsZSwgYSBjaGVja2JveCBzZXRzIGl0c1xuICogYGNoZWNrZWRgIHByb3BlcnR5IHdoZW4gY2xpY2tlZCBhbmQgZmlyZXMgYSBgY2hhbmdlZGAgZXZlbnQuIE11dGF0aW5nIHB1YmxpY1xuICogcHJvcGVydGllcyBzaG91bGQgdHlwaWNhbGx5IG5vdCBiZSBkb25lIGZvciBub24tcHJpbWl0aXZlIChvYmplY3Qgb3IgYXJyYXkpXG4gKiBwcm9wZXJ0aWVzLiBJbiBvdGhlciBjYXNlcyB3aGVuIGFuIGVsZW1lbnQgbmVlZHMgdG8gbWFuYWdlIHN0YXRlLCBhIHByaXZhdGVcbiAqIHByb3BlcnR5IGRlY29yYXRlZCB2aWEgdGhlIHtAbGlua2NvZGUgc3RhdGV9IGRlY29yYXRvciBzaG91bGQgYmUgdXNlZC4gV2hlblxuICogbmVlZGVkLCBzdGF0ZSBwcm9wZXJ0aWVzIGNhbiBiZSBpbml0aWFsaXplZCB2aWEgcHVibGljIHByb3BlcnRpZXMgdG9cbiAqIGZhY2lsaXRhdGUgY29tcGxleCBpbnRlcmFjdGlvbnMuXG4gKlxuICogYGBgdHNcbiAqIGNsYXNzIE15RWxlbWVudCB7XG4gKiAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSlcbiAqICAgY2xpY2tlZCA9IGZhbHNlO1xuICogfVxuICogYGBgXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yXG4gKiBARXhwb3J0RGVjb3JhdGVkSXRlbXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnR5KG9wdGlvbnM/OiBQcm9wZXJ0eURlY2xhcmF0aW9uKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gPEMgZXh0ZW5kcyBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PiwgVj4oXG4gICAgcHJvdG9PclRhcmdldDpcbiAgICAgIHwgb2JqZWN0XG4gICAgICB8IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj5cbiAgICAgIHwgKCh2YWx1ZTogVikgPT4gdm9pZCksXG4gICAgbmFtZU9yQ29udGV4dDpcbiAgICAgIHwgUHJvcGVydHlLZXlcbiAgICAgIHwgQ2xhc3NBY2Nlc3NvckRlY29yYXRvckNvbnRleHQ8QywgVj5cbiAgICAgIHwgQ2xhc3NTZXR0ZXJEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgKTogYW55ID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIG5hbWVPckNvbnRleHQgPT09ICdvYmplY3QnXG4gICAgICAgID8gc3RhbmRhcmRQcm9wZXJ0eTxDLCBWPihcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBwcm90b09yVGFyZ2V0IGFzXG4gICAgICAgICAgICAgIHwgQ2xhc3NBY2Nlc3NvckRlY29yYXRvclRhcmdldDxDLCBWPlxuICAgICAgICAgICAgICB8ICgodmFsdWU6IFYpID0+IHZvaWQpLFxuICAgICAgICAgICAgbmFtZU9yQ29udGV4dCBhcyBTdGFuZGFyZFByb3BlcnR5Q29udGV4dDxDLCBWPlxuICAgICAgICAgIClcbiAgICAgICAgOiBsZWdhY3lQcm9wZXJ0eShcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBwcm90b09yVGFyZ2V0IGFzIE9iamVjdCxcbiAgICAgICAgICAgIG5hbWVPckNvbnRleHQgYXMgUHJvcGVydHlLZXlcbiAgICAgICAgICApXG4gICAgKSBhcyBQcm9wZXJ0eURlY29yYXRvcjtcbiAgfTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cblxuaW1wb3J0IHtwcm9wZXJ0eX0gZnJvbSAnLi9wcm9wZXJ0eS5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVEZWNsYXJhdGlvbjxUeXBlID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGluZGljYXRlcyBpZiBhIHByb3BlcnR5IHNob3VsZCBiZSBjb25zaWRlcmVkIGNoYW5nZWQgd2hlblxuICAgKiBpdCBpcyBzZXQuIFRoZSBmdW5jdGlvbiBzaG91bGQgdGFrZSB0aGUgYG5ld1ZhbHVlYCBhbmQgYG9sZFZhbHVlYCBhbmRcbiAgICogcmV0dXJuIGB0cnVlYCBpZiBhbiB1cGRhdGUgc2hvdWxkIGJlIHJlcXVlc3RlZC5cbiAgICovXG4gIGhhc0NoYW5nZWQ/KHZhbHVlOiBUeXBlLCBvbGRWYWx1ZTogVHlwZSk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIFN0YXRlRGVjbGFyYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgSW50ZXJuYWxQcm9wZXJ0eURlY2xhcmF0aW9uPFR5cGUgPSB1bmtub3duPiA9XG4gIFN0YXRlRGVjbGFyYXRpb248VHlwZT47XG5cbi8qKlxuICogRGVjbGFyZXMgYSBwcml2YXRlIG9yIHByb3RlY3RlZCByZWFjdGl2ZSBwcm9wZXJ0eSB0aGF0IHN0aWxsIHRyaWdnZXJzXG4gKiB1cGRhdGVzIHRvIHRoZSBlbGVtZW50IHdoZW4gaXQgY2hhbmdlcy4gSXQgZG9lcyBub3QgcmVmbGVjdCBmcm9tIHRoZVxuICogY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUuXG4gKlxuICogUHJvcGVydGllcyBkZWNsYXJlZCB0aGlzIHdheSBtdXN0IG5vdCBiZSB1c2VkIGZyb20gSFRNTCBvciBIVE1MIHRlbXBsYXRpbmdcbiAqIHN5c3RlbXMsIHRoZXkncmUgc29sZWx5IGZvciBwcm9wZXJ0aWVzIGludGVybmFsIHRvIHRoZSBlbGVtZW50LiBUaGVzZVxuICogcHJvcGVydGllcyBtYXkgYmUgcmVuYW1lZCBieSBvcHRpbWl6YXRpb24gdG9vbHMgbGlrZSBjbG9zdXJlIGNvbXBpbGVyLlxuICogQGNhdGVnb3J5IERlY29yYXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhdGUob3B0aW9ucz86IFN0YXRlRGVjbGFyYXRpb24pIHtcbiAgcmV0dXJuIHByb3BlcnR5KHtcbiAgICAuLi5vcHRpb25zLFxuICAgIC8vIEFkZCBib3RoIGBzdGF0ZWAgYW5kIGBhdHRyaWJ1dGVgIGJlY2F1c2Ugd2UgZm91bmQgYSB0aGlyZCBwYXJ0eVxuICAgIC8vIGNvbnRyb2xsZXIgdGhhdCBpcyBrZXlpbmcgb2ZmIG9mIFByb3BlcnR5T3B0aW9ucy5zdGF0ZSB0byBkZXRlcm1pbmVcbiAgICAvLyB3aGV0aGVyIGEgZmllbGQgaXMgYSBwcml2YXRlIGludGVybmFsIHByb3BlcnR5IG9yIG5vdC5cbiAgICBzdGF0ZTogdHJ1ZSxcbiAgICBhdHRyaWJ1dGU6IGZhbHNlLFxuICB9KTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBwdWJsaWMgaW50ZXJmYWNlIHR5cGUgdGhhdCByZW1vdmVzIHByaXZhdGUgYW5kIHByb3RlY3RlZCBmaWVsZHMuXG4gKiBUaGlzIGFsbG93cyBhY2NlcHRpbmcgb3RoZXJ3aXNlIGluY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiB0aGUgdHlwZSAoZS5nLiBmcm9tXG4gKiBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgcGFja2FnZSBpbiBgbm9kZV9tb2R1bGVzYCkuXG4gKi9cbmV4cG9ydCB0eXBlIEludGVyZmFjZTxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS107XG59O1xuXG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUPiA9IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQ7XG59O1xuXG4vKipcbiAqIFdyYXBzIHVwIGEgZmV3IGJlc3QgcHJhY3RpY2VzIHdoZW4gcmV0dXJuaW5nIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmcm9tIGFcbiAqIGRlY29yYXRvci5cbiAqXG4gKiBNYXJrcyB0aGUgZGVmaW5lZCBwcm9wZXJ0eSBhcyBjb25maWd1cmFibGUsIGFuZCBlbnVtZXJhYmxlLCBhbmQgaGFuZGxlc1xuICogdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBhIGJ1c3RlZCBSZWZsZWN0LmRlY29yYXRlIHpvbWJpZWZpbGwgKGUuZy4gaW4gQW5ndWxhclxuICogYXBwcykuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBkZXNjID0gKFxuICBvYmo6IG9iamVjdCxcbiAgbmFtZTogUHJvcGVydHlLZXkgfCBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dDx1bmtub3duLCB1bmtub3duPixcbiAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yXG4pID0+IHtcbiAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB3ZSBrZWVwIHRoZW0gY29uZmlndXJhYmxlIGFuZCBlbnVtZXJhYmxlLlxuICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG4gIGlmIChcbiAgICAvLyBXZSBjaGVjayBmb3IgUmVmbGVjdC5kZWNvcmF0ZSBlYWNoIHRpbWUsIGluIGNhc2UgdGhlIHpvbWJpZWZpbGxcbiAgICAvLyBpcyBhcHBsaWVkIHZpYSBsYXp5IGxvYWRpbmcgc29tZSBBbmd1bGFyIGNvZGUuXG4gICAgKFJlZmxlY3QgYXMgdHlwZW9mIFJlZmxlY3QgJiB7ZGVjb3JhdGU/OiB1bmtub3dufSkuZGVjb3JhdGUgJiZcbiAgICB0eXBlb2YgbmFtZSAhPT0gJ29iamVjdCdcbiAgKSB7XG4gICAgLy8gSWYgd2UncmUgY2FsbGVkIGFzIGEgbGVnYWN5IGRlY29yYXRvciwgYW5kIFJlZmxlY3QuZGVjb3JhdGUgaXMgcHJlc2VudFxuICAgIC8vIHRoZW4gd2UgaGF2ZSBubyBndWFyYW50ZWVzIHRoYXQgdGhlIHJldHVybmVkIGRlc2NyaXB0b3Igd2lsbCBiZVxuICAgIC8vIGRlZmluZWQgb24gdGhlIGNsYXNzLCBzbyB3ZSBtdXN0IGFwcGx5IGl0IGRpcmVjdGx5IG91cnNlbHZlcy5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG5hbWUsIGRlc2NyaXB0b3IpO1xuICB9XG4gIHJldHVybiBkZXNjcmlwdG9yO1xufTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cbmltcG9ydCB0eXBlIHtSZWFjdGl2ZUVsZW1lbnR9IGZyb20gJy4uL3JlYWN0aXZlLWVsZW1lbnQuanMnO1xuaW1wb3J0IHtkZXNjLCB0eXBlIEludGVyZmFjZX0gZnJvbSAnLi9iYXNlLmpzJztcblxuY29uc3QgREVWX01PREUgPSB0cnVlO1xuXG5sZXQgaXNzdWVXYXJuaW5nOiAoY29kZTogc3RyaW5nLCB3YXJuaW5nOiBzdHJpbmcpID0+IHZvaWQ7XG5cbmlmIChERVZfTU9ERSkge1xuICAvLyBFbnN1cmUgd2FybmluZ3MgYXJlIGlzc3VlZCBvbmx5IDF4LCBldmVuIGlmIG11bHRpcGxlIHZlcnNpb25zIG9mIExpdFxuICAvLyBhcmUgbG9hZGVkLlxuICBjb25zdCBpc3N1ZWRXYXJuaW5nczogU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4gPVxuICAgIChnbG9iYWxUaGlzLmxpdElzc3VlZFdhcm5pbmdzID8/PSBuZXcgU2V0KCkpO1xuXG4gIC8vIElzc3VlIGEgd2FybmluZywgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5LlxuICBpc3N1ZVdhcm5pbmcgPSAoY29kZTogc3RyaW5nLCB3YXJuaW5nOiBzdHJpbmcpID0+IHtcbiAgICB3YXJuaW5nICs9IGNvZGVcbiAgICAgID8gYCBTZWUgaHR0cHM6Ly9saXQuZGV2L21zZy8ke2NvZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLmBcbiAgICAgIDogJyc7XG4gICAgaWYgKCFpc3N1ZWRXYXJuaW5ncy5oYXMod2FybmluZykpIHtcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgIGlzc3VlZFdhcm5pbmdzLmFkZCh3YXJuaW5nKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5RGVjb3JhdG9yID0ge1xuICAvLyBsZWdhY3lcbiAgKFxuICAgIHByb3RvOiBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PixcbiAgICBuYW1lOiBQcm9wZXJ0eUtleSxcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICAgLy8gTm90ZSBUeXBlU2NyaXB0IHJlcXVpcmVzIHRoZSByZXR1cm4gdHlwZSB0byBiZSBgdm9pZHxhbnlgXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgKTogdm9pZCB8IGFueTtcblxuICAvLyBzdGFuZGFyZFxuICA8QyBleHRlbmRzIEludGVyZmFjZTxSZWFjdGl2ZUVsZW1lbnQ+LCBWIGV4dGVuZHMgRWxlbWVudCB8IG51bGw+KFxuICAgIHZhbHVlOiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yVGFyZ2V0PEMsIFY+LFxuICAgIGNvbnRleHQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICk6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JSZXN1bHQ8QywgVj47XG59O1xuXG4vKipcbiAqIEEgcHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgY29udmVydHMgYSBjbGFzcyBwcm9wZXJ0eSBpbnRvIGEgZ2V0dGVyIHRoYXRcbiAqIGV4ZWN1dGVzIGEgcXVlcnlTZWxlY3RvciBvbiB0aGUgZWxlbWVudCdzIHJlbmRlclJvb3QuXG4gKlxuICogQHBhcmFtIHNlbGVjdG9yIEEgRE9NU3RyaW5nIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgc2VsZWN0b3JzIHRvIG1hdGNoLlxuICogQHBhcmFtIGNhY2hlIEFuIG9wdGlvbmFsIGJvb2xlYW4gd2hpY2ggd2hlbiB0cnVlIHBlcmZvcm1zIHRoZSBET00gcXVlcnkgb25seVxuICogICAgIG9uY2UgYW5kIGNhY2hlcyB0aGUgcmVzdWx0LlxuICpcbiAqIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50L3F1ZXJ5U2VsZWN0b3JcbiAqXG4gKiBgYGB0c1xuICogY2xhc3MgTXlFbGVtZW50IHtcbiAqICAgQHF1ZXJ5KCcjZmlyc3QnKVxuICogICBmaXJzdDogSFRNTERpdkVsZW1lbnQ7XG4gKlxuICogICByZW5kZXIoKSB7XG4gKiAgICAgcmV0dXJuIGh0bWxgXG4gKiAgICAgICA8ZGl2IGlkPVwiZmlyc3RcIj48L2Rpdj5cbiAqICAgICAgIDxkaXYgaWQ9XCJzZWNvbmRcIj48L2Rpdj5cbiAqICAgICBgO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5KHNlbGVjdG9yOiBzdHJpbmcsIGNhY2hlPzogYm9vbGVhbik6IFF1ZXJ5RGVjb3JhdG9yIHtcbiAgcmV0dXJuICg8QyBleHRlbmRzIEludGVyZmFjZTxSZWFjdGl2ZUVsZW1lbnQ+LCBWIGV4dGVuZHMgRWxlbWVudCB8IG51bGw+KFxuICAgIHByb3RvT3JUYXJnZXQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj4sXG4gICAgbmFtZU9yQ29udGV4dDogUHJvcGVydHlLZXkgfCBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dDxDLCBWPixcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkgPT4ge1xuICAgIGNvbnN0IGRvUXVlcnkgPSAoZWw6IEludGVyZmFjZTxSZWFjdGl2ZUVsZW1lbnQ+KTogViA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSAoZWwucmVuZGVyUm9vdD8ucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgPz8gbnVsbCkgYXMgVjtcbiAgICAgIGlmIChERVZfTU9ERSAmJiByZXN1bHQgPT09IG51bGwgJiYgY2FjaGUgJiYgIWVsLmhhc1VwZGF0ZWQpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9XG4gICAgICAgICAgdHlwZW9mIG5hbWVPckNvbnRleHQgPT09ICdvYmplY3QnXG4gICAgICAgICAgICA/IG5hbWVPckNvbnRleHQubmFtZVxuICAgICAgICAgICAgOiBuYW1lT3JDb250ZXh0O1xuICAgICAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAgICAgJycsXG4gICAgICAgICAgYEBxdWVyeSdkIGZpZWxkICR7SlNPTi5zdHJpbmdpZnkoU3RyaW5nKG5hbWUpKX0gd2l0aCB0aGUgJ2NhY2hlJyBgICtcbiAgICAgICAgICAgIGBmbGFnIHNldCBmb3Igc2VsZWN0b3IgJyR7c2VsZWN0b3J9JyBoYXMgYmVlbiBhY2Nlc3NlZCBiZWZvcmUgYCArXG4gICAgICAgICAgICBgdGhlIGZpcnN0IHVwZGF0ZSBhbmQgcmV0dXJuZWQgbnVsbC4gVGhpcyBpcyBleHBlY3RlZCBpZiB0aGUgYCArXG4gICAgICAgICAgICBgcmVuZGVyUm9vdCB0cmVlIGhhcyBub3QgYmVlbiBwcm92aWRlZCBiZWZvcmVoYW5kIChlLmcuIHZpYSBgICtcbiAgICAgICAgICAgIGBEZWNsYXJhdGl2ZSBTaGFkb3cgRE9NKS4gVGhlcmVmb3JlIHRoZSB2YWx1ZSBoYXNuJ3QgYmVlbiBjYWNoZWQuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogaWYgd2Ugd2FudCB0byBhbGxvdyB1c2VycyB0byBhc3NlcnQgdGhhdCB0aGUgcXVlcnkgd2lsbCBuZXZlclxuICAgICAgLy8gcmV0dXJuIG51bGwsIHdlIG5lZWQgYSBuZXcgb3B0aW9uIGFuZCB0byB0aHJvdyBoZXJlIGlmIHRoZSByZXN1bHRcbiAgICAgIC8vIGlzIG51bGwuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICAvLyBBY2Nlc3NvcnMgdG8gd3JhcCBmcm9tIGVpdGhlcjpcbiAgICAgIC8vICAgMS4gVGhlIGRlY29yYXRvciB0YXJnZXQsIGluIHRoZSBjYXNlIG9mIHN0YW5kYXJkIGRlY29yYXRvcnNcbiAgICAgIC8vICAgMi4gVGhlIHByb3BlcnR5IGRlc2NyaXB0b3IsIGluIHRoZSBjYXNlIG9mIGV4cGVyaW1lbnRhbCBkZWNvcmF0b3JzXG4gICAgICAvLyAgICAgIG9uIGF1dG8tYWNjZXNzb3JzLlxuICAgICAgLy8gICAzLiBGdW5jdGlvbnMgdGhhdCBhY2Nlc3Mgb3VyIG93biBjYWNoZS1rZXkgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlLFxuICAgICAgLy8gICAgICBpbiB0aGUgY2FzZSBvZiBleHBlcmltZW50YWwgZGVjb3JhdG9ycyBvbiBmaWVsZHMuXG4gICAgICBjb25zdCB7Z2V0LCBzZXR9ID1cbiAgICAgICAgdHlwZW9mIG5hbWVPckNvbnRleHQgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyBwcm90b09yVGFyZ2V0XG4gICAgICAgICAgOiBkZXNjcmlwdG9yID8/XG4gICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBrZXkgPSBERVZfTU9ERVxuICAgICAgICAgICAgICAgID8gU3ltYm9sKGAke1N0cmluZyhuYW1lT3JDb250ZXh0KX0gKEBxdWVyeSgpIGNhY2hlKWApXG4gICAgICAgICAgICAgICAgOiBTeW1ib2woKTtcbiAgICAgICAgICAgICAgdHlwZSBXaXRoQ2FjaGUgPSBSZWFjdGl2ZUVsZW1lbnQgJiB7XG4gICAgICAgICAgICAgICAgW2tleTogc3ltYm9sXTogRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzIGFzIFdpdGhDYWNoZSlba2V5XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldCh2KSB7XG4gICAgICAgICAgICAgICAgICAodGhpcyBhcyBXaXRoQ2FjaGUpW2tleV0gPSB2O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgcmV0dXJuIGRlc2MocHJvdG9PclRhcmdldCwgbmFtZU9yQ29udGV4dCwge1xuICAgICAgICBnZXQodGhpczogUmVhY3RpdmVFbGVtZW50KTogViB7XG4gICAgICAgICAgbGV0IHJlc3VsdDogViA9IGdldCEuY2FsbCh0aGlzKTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGRvUXVlcnkodGhpcyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsIHx8IHRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgICAgICAgICBzZXQhLmNhbGwodGhpcywgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIG9iamVjdCB3b3JrcyBhcyB0aGUgcmV0dXJuIHR5cGUgZm9yIGJvdGggc3RhbmRhcmQgYW5kXG4gICAgICAvLyBleHBlcmltZW50YWwgZGVjb3JhdG9ycy5cbiAgICAgIHJldHVybiBkZXNjKHByb3RvT3JUYXJnZXQsIG5hbWVPckNvbnRleHQsIHtcbiAgICAgICAgZ2V0KHRoaXM6IFJlYWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgIHJldHVybiBkb1F1ZXJ5KHRoaXMpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9KSBhcyBRdWVyeURlY29yYXRvcjtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cblxuaW1wb3J0IHR5cGUge1JlYWN0aXZlRWxlbWVudH0gZnJvbSAnLi4vcmVhY3RpdmUtZWxlbWVudC5qcyc7XG5pbXBvcnQgdHlwZSB7UXVlcnlBc3NpZ25lZE5vZGVzT3B0aW9uc30gZnJvbSAnLi9xdWVyeS1hc3NpZ25lZC1ub2Rlcy5qcyc7XG5pbXBvcnQge2Rlc2MsIHR5cGUgSW50ZXJmYWNlfSBmcm9tICcuL2Jhc2UuanMnO1xuXG5leHBvcnQgdHlwZSBRdWVyeUFzc2lnbmVkRWxlbWVudHNEZWNvcmF0b3IgPSB7XG4gIC8vIGxlZ2FjeVxuICAoXG4gICAgcHJvdG86IEludGVyZmFjZTxSZWFjdGl2ZUVsZW1lbnQ+LFxuICAgIG5hbWU6IFByb3BlcnR5S2V5LFxuICAgIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgICAvLyBOb3RlIFR5cGVTY3JpcHQgcmVxdWlyZXMgdGhlIHJldHVybiB0eXBlIHRvIGJlIGB2b2lkfGFueWBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICApOiB2b2lkIHwgYW55O1xuXG4gIC8vIHN0YW5kYXJkXG4gIDxDIGV4dGVuZHMgSW50ZXJmYWNlPFJlYWN0aXZlRWxlbWVudD4sIFYgZXh0ZW5kcyBBcnJheTxFbGVtZW50Pj4oXG4gICAgdmFsdWU6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj4sXG4gICAgY29udGV4dDogQ2xhc3NBY2Nlc3NvckRlY29yYXRvckNvbnRleHQ8QywgVj5cbiAgKTogQ2xhc3NBY2Nlc3NvckRlY29yYXRvclJlc3VsdDxDLCBWPjtcbn07XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHtAbGlua2NvZGUgcXVlcnlBc3NpZ25lZEVsZW1lbnRzfSBkZWNvcmF0b3IuIEV4dGVuZHMgdGhlXG4gKiBvcHRpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCBpbnRvXG4gKiBbSFRNTFNsb3RFbGVtZW50LmFzc2lnbmVkRWxlbWVudHNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MU2xvdEVsZW1lbnQvYXNzaWduZWRFbGVtZW50cykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlBc3NpZ25lZEVsZW1lbnRzT3B0aW9uc1xuICBleHRlbmRzIFF1ZXJ5QXNzaWduZWROb2Rlc09wdGlvbnMge1xuICAvKipcbiAgICogQ1NTIHNlbGVjdG9yIHVzZWQgdG8gZmlsdGVyIHRoZSBlbGVtZW50cyByZXR1cm5lZC4gRm9yIGV4YW1wbGUsIGEgc2VsZWN0b3JcbiAgICogb2YgYFwiLml0ZW1cImAgd2lsbCBvbmx5IGluY2x1ZGUgZWxlbWVudHMgd2l0aCB0aGUgYGl0ZW1gIGNsYXNzLlxuICAgKi9cbiAgc2VsZWN0b3I/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBjb252ZXJ0cyBhIGNsYXNzIHByb3BlcnR5IGludG8gYSBnZXR0ZXIgdGhhdFxuICogcmV0dXJucyB0aGUgYGFzc2lnbmVkRWxlbWVudHNgIG9mIHRoZSBnaXZlbiBgc2xvdGAuIFByb3ZpZGVzIGEgZGVjbGFyYXRpdmVcbiAqIHdheSB0byB1c2VcbiAqIFtgSFRNTFNsb3RFbGVtZW50LmFzc2lnbmVkRWxlbWVudHNgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTFNsb3RFbGVtZW50L2Fzc2lnbmVkRWxlbWVudHMpLlxuICpcbiAqIENhbiBiZSBwYXNzZWQgYW4gb3B0aW9uYWwge0BsaW5rY29kZSBRdWVyeUFzc2lnbmVkRWxlbWVudHNPcHRpb25zfSBvYmplY3QuXG4gKlxuICogRXhhbXBsZSB1c2FnZTpcbiAqIGBgYHRzXG4gKiBjbGFzcyBNeUVsZW1lbnQge1xuICogICBAcXVlcnlBc3NpZ25lZEVsZW1lbnRzKHsgc2xvdDogJ2xpc3QnIH0pXG4gKiAgIGxpc3RJdGVtcyE6IEFycmF5PEhUTUxFbGVtZW50PjtcbiAqICAgQHF1ZXJ5QXNzaWduZWRFbGVtZW50cygpXG4gKiAgIHVubmFtZWRTbG90RWxzITogQXJyYXk8SFRNTEVsZW1lbnQ+O1xuICpcbiAqICAgcmVuZGVyKCkge1xuICogICAgIHJldHVybiBodG1sYFxuICogICAgICAgPHNsb3QgbmFtZT1cImxpc3RcIj48L3Nsb3Q+XG4gKiAgICAgICA8c2xvdD48L3Nsb3Q+XG4gKiAgICAgYDtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogTm90ZSwgdGhlIHR5cGUgb2YgdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgYW5ub3RhdGVkIGFzIGBBcnJheTxIVE1MRWxlbWVudD5gLlxuICpcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5QXNzaWduZWRFbGVtZW50cyhcbiAgb3B0aW9ucz86IFF1ZXJ5QXNzaWduZWRFbGVtZW50c09wdGlvbnNcbik6IFF1ZXJ5QXNzaWduZWRFbGVtZW50c0RlY29yYXRvciB7XG4gIHJldHVybiAoPFYgZXh0ZW5kcyBBcnJheTxFbGVtZW50Pj4oXG4gICAgb2JqOiBvYmplY3QsXG4gICAgbmFtZTogUHJvcGVydHlLZXkgfCBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dDx1bmtub3duLCB1bmtub3duPlxuICApID0+IHtcbiAgICBjb25zdCB7c2xvdCwgc2VsZWN0b3J9ID0gb3B0aW9ucyA/PyB7fTtcbiAgICBjb25zdCBzbG90U2VsZWN0b3IgPSBgc2xvdCR7c2xvdCA/IGBbbmFtZT0ke3Nsb3R9XWAgOiAnOm5vdChbbmFtZV0pJ31gO1xuICAgIHJldHVybiBkZXNjKG9iaiwgbmFtZSwge1xuICAgICAgZ2V0KHRoaXM6IFJlYWN0aXZlRWxlbWVudCk6IFYge1xuICAgICAgICBjb25zdCBzbG90RWwgPVxuICAgICAgICAgIHRoaXMucmVuZGVyUm9vdD8ucXVlcnlTZWxlY3RvcjxIVE1MU2xvdEVsZW1lbnQ+KHNsb3RTZWxlY3Rvcik7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gc2xvdEVsPy5hc3NpZ25lZEVsZW1lbnRzKG9wdGlvbnMpID8/IFtdO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHNlbGVjdG9yID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gZWxlbWVudHNcbiAgICAgICAgICAgIDogZWxlbWVudHMuZmlsdGVyKChub2RlKSA9PiBub2RlLm1hdGNoZXMoc2VsZWN0b3IpKVxuICAgICAgICApIGFzIFY7XG4gICAgICB9LFxuICAgIH0pO1xuICB9KSBhcyBRdWVyeUFzc2lnbmVkRWxlbWVudHNEZWNvcmF0b3I7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxudHlwZSBVcGRhdGVIYW5kbGVyID0gKHByZXY/OiB1bmtub3duLCBuZXh0PzogdW5rbm93bikgPT4gdm9pZDtcblxudHlwZSBOb25VbmRlZmluZWQ8QT4gPSBBIGV4dGVuZHMgdW5kZWZpbmVkID8gbmV2ZXIgOiBBO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8VCBleHRlbmRzIG9iamVjdD4gPSB7XG4gIFtLIGluIGtleW9mIFRdLT86IE5vblVuZGVmaW5lZDxUW0tdPiBleHRlbmRzIFVwZGF0ZUhhbmRsZXIgPyBLIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG5pbnRlcmZhY2UgV2F0Y2hPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHdpbGwgb25seSBzdGFydCB3YXRjaGluZyBhZnRlciB0aGUgaW5pdGlhbCB1cGRhdGUvcmVuZGVyXG4gICAqL1xuICB3YWl0VW50aWxGaXJzdFVwZGF0ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUnVucyB3aGVuIG9ic2VydmVkIHByb3BlcnRpZXMgY2hhbmdlLCBlLmcuIEBwcm9wZXJ0eSBvciBAc3RhdGUsIGJ1dCBiZWZvcmUgdGhlIGNvbXBvbmVudCB1cGRhdGVzLiBUbyB3YWl0IGZvciBhblxuICogdXBkYXRlIHRvIGNvbXBsZXRlIGFmdGVyIGEgY2hhbmdlIG9jY3VycywgdXNlIGBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlYCBpbiB0aGUgaGFuZGxlci4gVG8gc3RhcnQgd2F0Y2hpbmcgYWZ0ZXIgdGhlXG4gKiBpbml0aWFsIHVwZGF0ZS9yZW5kZXIsIHVzZSBgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9YCBvciBgdGhpcy5oYXNVcGRhdGVkYCBpbiB0aGUgaGFuZGxlci5cbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiBAd2F0Y2goJ3Byb3BOYW1lJylcbiAqIGhhbmRsZVByb3BDaGFuZ2Uob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gKiAgIC4uLlxuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gd2F0Y2gocHJvcGVydHlOYW1lOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3B0aW9ucz86IFdhdGNoT3B0aW9ucykge1xuICBjb25zdCByZXNvbHZlZE9wdGlvbnM6IFJlcXVpcmVkPFdhdGNoT3B0aW9ucz4gPSB7XG4gICAgd2FpdFVudGlsRmlyc3RVcGRhdGU6IGZhbHNlLFxuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgcmV0dXJuIDxFbGVtQ2xhc3MgZXh0ZW5kcyBMaXRFbGVtZW50Pihwcm90bzogRWxlbUNsYXNzLCBkZWNvcmF0ZWRGbk5hbWU6IFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8RWxlbUNsYXNzPikgPT4ge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSB1cGRhdGUgaXMgYSBwcm90ZWN0ZWQgcHJvcGVydHlcbiAgICBjb25zdCB7IHVwZGF0ZSB9ID0gcHJvdG87XG4gICAgY29uc3Qgd2F0Y2hlZFByb3BlcnRpZXMgPSBBcnJheS5pc0FycmF5KHByb3BlcnR5TmFtZSkgPyBwcm9wZXJ0eU5hbWUgOiBbcHJvcGVydHlOYW1lXTtcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSB1cGRhdGUgaXMgYSBwcm90ZWN0ZWQgcHJvcGVydHlcbiAgICBwcm90by51cGRhdGUgPSBmdW5jdGlvbiAodGhpczogRWxlbUNsYXNzLCBjaGFuZ2VkUHJvcHM6IE1hcDxrZXlvZiBFbGVtQ2xhc3MsIEVsZW1DbGFzc1trZXlvZiBFbGVtQ2xhc3NdPikge1xuICAgICAgd2F0Y2hlZFByb3BlcnRpZXMuZm9yRWFjaChwcm9wZXJ0eSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHByb3BlcnR5IGFzIGtleW9mIEVsZW1DbGFzcztcbiAgICAgICAgaWYgKGNoYW5nZWRQcm9wcy5oYXMoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gY2hhbmdlZFByb3BzLmdldChrZXkpO1xuICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICAgICAgaWYgKG9sZFZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFyZXNvbHZlZE9wdGlvbnMud2FpdFVudGlsRmlyc3RVcGRhdGUgfHwgdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICAgICAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHVwZGF0ZS5jYWxsKHRoaXMsIGNoYW5nZWRQcm9wcyk7XG4gICAgfTtcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1Db250ZXh0IHtcbiAgaHJlZj86IHN0cmluZztcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICB2YXJpYWJsZXM6IFJlYWRvbmx5QXJyYXk8VmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXT4+O1xufVxuXG5leHBvcnQgY29uc3QgaXRlbUNvbnRleHRWYXJpYWJsZXMgPSBbXG4gIHtcbiAgICBpZGVudGlmaWVyOiAnY29tcGxldGlvblN0YXR1cycsXG4gICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnLFxuICAgIGJhc2VUeXBlOiAnc3RyaW5nJyxcbiAgICB2YWx1ZTogJ3Vua25vd24nLFxuICAgIHR5cGU6ICdvdXRjb21lJ1xuICB9LFxuICB7XG4gICAgaWRlbnRpZmllcjogJ251bUF0dGVtcHRzJyxcbiAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZScsXG4gICAgYmFzZVR5cGU6ICdpbnRlZ2VyJyxcbiAgICB2YWx1ZTogJzAnLFxuICAgIHR5cGU6ICdyZXNwb25zZSdcbiAgfVxuXSBhcyBWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPltdO1xuXG5leHBvcnQgY29uc3QgaXRlbUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEl0ZW1Db250ZXh0PihTeW1ib2woJ2l0ZW0nKSk7XG4iLCAiaW1wb3J0IHsgcHJvdmlkZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcbmltcG9ydCB0eXBlIHsgSW50ZXJhY3Rpb25DaGFuZ2VkRGV0YWlscywgT3V0Y29tZUNoYW5nZWREZXRhaWxzIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXZlbnQtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBSZXNwb25zZUludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHR5cGUgeyBWYXJpYWJsZURlY2xhcmF0aW9uLCBWYXJpYWJsZVZhbHVlIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IE91dGNvbWVWYXJpYWJsZSwgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgdHlwZSB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjayc7XG5pbXBvcnQgdHlwZSB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB0eXBlIHsgUXRpUmVzcG9uc2VQcm9jZXNzaW5nIH0gZnJvbSAnLi4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dFZhcmlhYmxlcyB9IGZyb20gJy4vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCBRdGlSZWdpc3RlclZhcmlhYmxlIGZyb20gJy4uL2ludGVybmFsL2V2ZW50cy9xdGktcmVnaXN0ZXItdmFyaWFibGUnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBxdGktYXNzZXNzbWVudC1pdGVtIGVsZW1lbnQgY29udGFpbnMgYWxsIHRoZSBvdGhlciBRVEkgMyBpdGVtIHN0cnVjdHVyZXMuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLmRsdG5uajg3bDB5alxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA0LjBcbiAqXG4gKiBAZGVwZW5kZW5jeSBxdGktZmVlZGJhY2tcbiAqIEBkZXBlbmRlbmN5IHF0aS1yZXNwb25zZXByb2Nlc3NpbmdcbiAqXG4gKiBAc2xvdCAtIFRoZSBkZWZhdWx0IHNsb3Qgd2hlcmUgYWxsIHRoZSBvdGhlciBRVEkgMyBpdGVtIHN0cnVjdHVyZXMgZ28uXG4gKlxuICogQGV2ZW50IHF0aS1pbnRlcmFjdGlvbi1jaGFuZ2VkIC0gRW1pdHRlZCB3aGVuIGFuIGludGVyYWN0aW9uIGlzIGNoYW5nZWQuXG4gKiBAZXZlbnQgcXRpLW91dGNvbWUtY2hhbmdlZCAtIEVtaXR0ZWQgd2hlbiBhbiBvdXRjb21lIGhhcyBjaGFuZ2VkLlxuICogQGV2ZW50IHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nIC0gRW1pdHRlZCB3aGVuIHJlc3BvbnNlLXByb2Nlc3NpbmcgaXMgY2FsbGVkLlxuICpcbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKVxuZXhwb3J0IGNsYXNzIFF0aUFzc2Vzc21lbnRJdGVtIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0aXRsZTogc3RyaW5nO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBhZGFwdGl2ZTogJ3RydWUnIHwgJ2ZhbHNlJyA9ICdmYWxzZSc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0aW1lRGVwZW5kZW50OiAndHJ1ZScgfCAnZmFsc2UnIHwgbnVsbCA9IG51bGw7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSBkaXNhYmxlZDogYm9vbGVhbjtcbiAgQHdhdGNoKCdkaXNhYmxlZCcsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZURpc2FibGVkQ2hhbmdlID0gKF86IGJvb2xlYW4sIGRpc2FibGVkOiBib29sZWFuKSA9PiB7XG4gICAgdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5kaXNhYmxlZCA9IGRpc2FibGVkKSk7XG4gIH07XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSByZWFkb25seTogYm9vbGVhbjtcbiAgQHdhdGNoKCdyZWFkb25seScsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZVJlYWRvbmx5Q2hhbmdlID0gKF86IGJvb2xlYW4sIHJlYWRvbmx5OiBib29sZWFuKSA9PlxuICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZm9yRWFjaChjaCA9PiAoY2gucmVhZG9ubHkgPSByZWFkb25seSkpO1xuXG4gIEBwcm92aWRlKHsgY29udGV4dDogaXRlbUNvbnRleHQgfSlcbiAgcHJpdmF0ZSBfY29udGV4dDogSXRlbUNvbnRleHQgPSB7XG4gICAgaWRlbnRpZmllcjogdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSxcbiAgICB2YXJpYWJsZXM6IGl0ZW1Db250ZXh0VmFyaWFibGVzXG4gIH07XG5cbiAgcHVibGljIGdldCB2YXJpYWJsZXMoKTogVmFyaWFibGVWYWx1ZTxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+W10ge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5tYXAodiA9PiAoe1xuICAgICAgaWRlbnRpZmllcjogdi5pZGVudGlmaWVyLFxuICAgICAgdmFsdWU6IHYudmFsdWUsXG4gICAgICB0eXBlOiB2LnR5cGUsXG4gICAgICAvLyBhZGQgZXh0ZXJuYWxzY29yZWQsIGEgZml4ZWQgcHJvcCB0byB0aGUgdGVzdCwgc28gdGhlIHRlc3Rjb250ZXh0IGNhbiByZWFkIGFuZCBkZWNpZGUgaG93IHRvIHNjb3JlIHRoaXMgaXRlbVxuICAgICAgLi4uKHYudHlwZSA9PT0gJ291dGNvbWUnICYmIHYuaWRlbnRpZmllciA9PT0gJ1NDT1JFJ1xuICAgICAgICA/IHsgZXh0ZXJuYWxTY29yZWQ6ICh2IGFzIE91dGNvbWVWYXJpYWJsZSkuZXh0ZXJuYWxTY29yZWQgfVxuICAgICAgICA6IHt9KVxuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFyaWFibGVzKHZhbHVlOiBWYXJpYWJsZVZhbHVlPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD5bXSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUuc29tZSh2ID0+ICEoJ2lkZW50aWZpZXInIGluIHYpKSkge1xuICAgICAgY29uc29sZS53YXJuKCd2YXJpYWJsZXMgcHJvcGVydHkgc2hvdWxkIGJlIGFuIGFycmF5IG9mIFZhcmlhYmxlRGVjbGFyYXRpb24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY29udGV4dCA9IHtcbiAgICAgIC4uLnRoaXMuX2NvbnRleHQsXG4gICAgICB2YXJpYWJsZXM6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLm1hcCh2YXJpYWJsZSA9PiB7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nVmFsdWUgPSB2YWx1ZS5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB2YXJpYWJsZS5pZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKG1hdGNoaW5nVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi52YXJpYWJsZSwgLi4ubWF0Y2hpbmdWYWx1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YXJpYWJsZTtcbiAgICAgIH0pXG4gICAgfTtcblxuICAgIHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdyZXNwb25zZScpIHtcbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb25FbGVtZW50ID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICAgIChlbDogSW50ZXJhY3Rpb24pID0+IGVsLnJlc3BvbnNlSWRlbnRpZmllciA9PT0gdmFyaWFibGUuaWRlbnRpZmllclxuICAgICAgICApO1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb25FbGVtZW50KSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb25FbGVtZW50LnZhbHVlID0gdmFyaWFibGUudmFsdWUgYXMgc3RyaW5nIHwgc3RyaW5nW107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdvdXRjb21lJykge1xuICAgICAgICB0aGlzLl9mZWVkYmFja0VsZW1lbnRzLmZvckVhY2goZmUgPT4gZmUuY2hlY2tTaG93RmVlZGJhY2sodmFyaWFibGUuaWRlbnRpZmllcikpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdGlhbENvbnRleHQ6IFJlYWRvbmx5PEl0ZW1Db250ZXh0PiA9IHsgLi4udGhpcy5fY29udGV4dCwgdmFyaWFibGVzOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcyB9O1xuICBwcml2YXRlIF9mZWVkYmFja0VsZW1lbnRzOiBRdGlGZWVkYmFja1tdID0gW107XG4gIHByaXZhdGUgX2ludGVyYWN0aW9uRWxlbWVudHM6IEludGVyYWN0aW9uW10gPSBbXTtcblxuICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7XG4gICAgdGhpcy5fZW1pdDx7IGRldGFpbDogUXRpQXNzZXNzbWVudEl0ZW0gfT4oJ3F0aS1hc3Nlc3NtZW50LWl0ZW0tY29ubmVjdGVkJywgdGhpcyk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgdXNlIHZhcmlhYmxlcyBwcm9wZXJ0eSBpbnN0ZWFkICovXG4gIHNldCByZXNwb25zZXMobXlSZXNwb25zZXM6IFJlc3BvbnNlSW50ZXJhY3Rpb25bXSkge1xuICAgIGlmIChteVJlc3BvbnNlcykge1xuICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBteVJlc3BvbnNlcykge1xuICAgICAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlID0gdGhpcy5nZXRSZXNwb25zZShyZXNwb25zZS5yZXNwb25zZUlkZW50aWZpZXIpO1xuICAgICAgICBpZiAocmVzcG9uc2VWYXJpYWJsZSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlUmVzcG9uc2VWYXJpYWJsZShyZXNwb25zZS5yZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlLnJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbiB8IHVuZGVmaW5lZCA9IHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZmluZChcbiAgICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgICApO1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICBpbnRlcmFjdGlvbi52YWx1ZSA9IHJlc3BvbnNlLnJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci12YXJpYWJsZScsIChlOiBRdGlSZWdpc3RlclZhcmlhYmxlKSA9PiB7XG4gICAgICB0aGlzLl9jb250ZXh0ID0geyAuLi50aGlzLl9jb250ZXh0LCB2YXJpYWJsZXM6IFsuLi50aGlzLl9jb250ZXh0LnZhcmlhYmxlcywgZS5kZXRhaWwudmFyaWFibGVdIH07XG4gICAgICB0aGlzLl9pbml0aWFsQ29udGV4dCA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWZlZWRiYWNrJywgKGU6IEN1c3RvbUV2ZW50PFF0aUZlZWRiYWNrPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGZlZWRiYWNrRWxlbWVudCA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy5fZmVlZGJhY2tFbGVtZW50cy5wdXNoKGZlZWRiYWNrRWxlbWVudCk7XG4gICAgICBmZWVkYmFja0VsZW1lbnQuY2hlY2tTaG93RmVlZGJhY2soZmVlZGJhY2tFbGVtZW50Lm91dGNvbWVJZGVudGlmaWVyKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIChlOiBDdXN0b21FdmVudDxudWxsPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMucHVzaChlLnRhcmdldCBhcyBJbnRlcmFjdGlvbik7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlbmQtYXR0ZW1wdCcsIChlOiBDdXN0b21FdmVudDx7IHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nOyBjb3VudEF0dGVtcHQ6IGJvb2xlYW4gfT4pID0+IHtcbiAgICAgIGNvbnN0IHsgcmVzcG9uc2VJZGVudGlmaWVyLCBjb3VudEF0dGVtcHQgfSA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgJ3RydWUnKTtcbiAgICAgIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKGNvdW50QXR0ZW1wdCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAvLyB3b3JkdCBhYW5nZXJvZXBlbiB2YW51aXQgZGUgcHJvY2Vzc2luZ3RlbXBsYXRlXG4gICAgICAncXRpLXNldC1vdXRjb21lLXZhbHVlJyxcbiAgICAgIChlOiBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PikgPT4ge1xuICAgICAgICBjb25zdCB7IG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSB9ID0gZS5kZXRhaWw7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywgdGhpcy5oYW5kbGVVcGRhdGVSZXNwb25zZVZhcmlhYmxlKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q29ycmVjdFJlc3BvbnNlKHNob3c6IGJvb2xlYW4pIHtcbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlcyA9IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbHRlcihcbiAgICAgICh2YXJpOiBSZXNwb25zZVZhcmlhYmxlIHwgT3V0Y29tZVZhcmlhYmxlKSA9PiAnY29ycmVjdFJlc3BvbnNlJyBpbiB2YXJpICYmIHZhcmkuY29ycmVjdFJlc3BvbnNlXG4gICAgKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgY29uc3QgcmVzcG9uc2VzID0gcmVzcG9uc2VWYXJpYWJsZXMubWFwKGNyID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogY3IuaWRlbnRpZmllcixcbiAgICAgICAgcmVzcG9uc2U6IGNyLmNvcnJlY3RSZXNwb25zZVxuICAgICAgfTtcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuICAgICAgY29uc3QgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgKTtcbiAgICAgIGlmIChpbnRlcmFjdGlvbikge1xuICAgICAgICBpbnRlcmFjdGlvbi5jb3JyZWN0UmVzcG9uc2UgPSBzaG93ID8gcmVzcG9uc2UucmVzcG9uc2UgOiAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJvY2Vzc1Jlc3BvbnNlKGNvdW50TnVtQXR0ZW1wdHM6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzcG9uc2VQcm9jZXNzb3IgPSB0aGlzLnF1ZXJ5U2VsZWN0b3I8UXRpUmVzcG9uc2VQcm9jZXNzaW5nPigncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnKTtcbiAgICBpZiAoIXJlc3BvbnNlUHJvY2Vzc29yKSB7XG4gICAgICAvLyBjb25zb2xlLmluZm8oJ0NsaWVudCBzaWRlIHJlc3BvbnNlIHByb2Nlc3NpbmcgdGVtcGxhdGUgbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2VQcm9jZXNzb3IucHJvY2Vzcykge1xuICAgICAgLy8gY29uc29sZS5pbmZvKCdDbGllbnQgc2lkZSByZXNwb25zZSB3ZWJjb21wb25lbnRzIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXNwb25zZVByb2Nlc3Nvci5wcm9jZXNzKCk7XG5cbiAgICBpZiAodGhpcy5hZGFwdGl2ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgLy8gaWYgYWRhcHRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50TnVtQXR0ZW1wdHMpIHtcbiAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKFxuICAgICAgICAnbnVtQXR0ZW1wdHMnLFxuICAgICAgICAoK3RoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09ICdudW1BdHRlbXB0cycpPy52YWx1ZSArIDEpLnRvU3RyaW5nKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fZW1pdCgncXRpLXJlc3BvbnNlLXByb2Nlc3NlZCcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHJlc2V0UmVzcG9uc2VzKCkge1xuICAgIHRoaXMuX2NvbnRleHQgPSB0aGlzLl9pbml0aWFsQ29udGV4dDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXNwb25zZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxSZXNwb25zZVZhcmlhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGUoaWRlbnRpZmllcikgYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPdXRjb21lKGlkZW50aWZpZXI6IHN0cmluZyk6IFJlYWRvbmx5PE91dGNvbWVWYXJpYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpIGFzIE91dGNvbWVWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgfVxuXG4gIC8vIHNhdmluZyBwcml2YXRlcyBoZXJlOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIGhhbmRsZVVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoZXZlbnQ6IEN1c3RvbUV2ZW50PFJlc3BvbnNlSW50ZXJhY3Rpb24+KSB7XG4gICAgY29uc3QgeyByZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlIH0gPSBldmVudC5kZXRhaWw7XG4gICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoaWRlbnRpZmllcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4gKHYuaWRlbnRpZmllciAhPT0gaWRlbnRpZmllciA/IHYgOiB7IC4uLnYsIHZhbHVlOiB2YWx1ZSB9KSlcbiAgICB9O1xuXG4gICAgdGhpcy5fZW1pdDxJbnRlcmFjdGlvbkNoYW5nZWREZXRhaWxzPigncXRpLWludGVyYWN0aW9uLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZUlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWVcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmFkYXB0aXZlID09PSAnZmFsc2UnKSB7XG4gICAgICAvLyBpZiBhZGFwYXRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZU91dGNvbWVWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZSA9IHRoaXMuZ2V0T3V0Y29tZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghb3V0Y29tZVZhcmlhYmxlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENhbiBub3Qgc2V0IHF0aS1vdXRjb21lLWlkZW50aWZpZXI6ICR7aWRlbnRpZmllcn0sIGl0IGlzIG5vdCBhdmFpbGFibGVgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4ge1xuICAgICAgICBpZiAodi5pZGVudGlmaWVyICE9PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi52LFxuICAgICAgICAgIHZhbHVlOiBvdXRjb21lVmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnID8gdmFsdWUgOiBbLi4udi52YWx1ZSwgdmFsdWUgYXMgc3RyaW5nXVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9O1xuICAgIHRoaXMuX2ZlZWRiYWNrRWxlbWVudHMuZm9yRWFjaChmZSA9PiBmZS5jaGVja1Nob3dGZWVkYmFjayhpZGVudGlmaWVyKSk7XG5cbiAgICB0aGlzLl9lbWl0PE91dGNvbWVDaGFuZ2VkRGV0YWlscz4oJ3F0aS1vdXRjb21lLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICBvdXRjb21lSWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgIHZhbHVlOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKT8udmFsdWVcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbXBsZXRpb25TdGF0dXMoKTogJ2NvbXBsZXRlZCcgfCAnaW5jb21wbGV0ZScgfCAnbm90X2F0dGVtcHRlZCcgfCAndW5rbm93bicge1xuICAgIGlmICh0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmV2ZXJ5KGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnY29tcGxldGVkJztcbiAgICBpZiAodGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5zb21lKGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnaW5jb21wbGV0ZSc7XG4gICAgcmV0dXJuICdub3RfYXR0ZW1wdGVkJztcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXQ8VD4obmFtZSwgZGV0YWlsID0gbnVsbCkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxUPihuYW1lLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzZXNzbWVudC1pdGVtJzogUXRpQXNzZXNzbWVudEl0ZW07XG4gIH1cbn1cbiIsICJjb25zdCB4bWwgPSBTdHJpbmcucmF3O1xuXG4vKiAgIDwhLS0gY29udmVydCBDREFUQSB0byBjb21tZW50cyAtLT5cbiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cInRleHQoKVtjb250YWlucyguLCAnQ0RBVEEnKV1cIj5cbiAgPHhzbDpjb21tZW50PlxuICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PVwiLlwiLz5cbiAgPC94c2w6Y29tbWVudD5cbjwveHNsOnRlbXBsYXRlPlxuKi9cblxuLypcbiAgPCEtLSByZW1vdmUgeG1sIGNvbW1lbnRzIC0tPlxuICA8eHNsOnRlbXBsYXRlIG1hdGNoPVwiY29tbWVudCgpXCIgLz5cbiAgKi9cblxuY29uc3QgeG1sVG9IVE1MID0geG1sYDx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPVwiMS4wXCIgeG1sbnM6eHNsPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtXCI+XG48eHNsOm91dHB1dCBtZXRob2Q9XCJodG1sXCIgdmVyc2lvbj1cIjUuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBpbmRlbnQ9XCJ5ZXNcIiAvPlxuICA8eHNsOnRlbXBsYXRlIG1hdGNoPVwiQCp8bm9kZSgpXCI+XG4gICAgPHhzbDpjb3B5PlxuICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PVwiQCp8bm9kZSgpXCIvPlxuICAgIDwveHNsOmNvcHk+XG4gIDwveHNsOnRlbXBsYXRlPlxuXG4gIDwhLS0gcmVtb3ZlIGV4aXN0aW5nIG5hbWVzcGFjZXMgLS0+XG4gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9XCIqXCI+XG4gICAgPCEtLSByZW1vdmUgZWxlbWVudCBwcmVmaXggLS0+XG4gICAgPHhzbDplbGVtZW50IG5hbWU9XCJ7bG9jYWwtbmFtZSgpfVwiPlxuICAgICAgPCEtLSBwcm9jZXNzIGF0dHJpYnV0ZXMgLS0+XG4gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD1cIkAqXCI+XG4gICAgICAgIDwhLS0gcmVtb3ZlIGF0dHJpYnV0ZSBwcmVmaXggLS0+XG4gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9XCJ7bG9jYWwtbmFtZSgpfVwiPlxuICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PVwiLlwiLz5cbiAgICAgICAgPC94c2w6YXR0cmlidXRlPlxuICAgICAgPC94c2w6Zm9yLWVhY2g+XG4gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPlxuICA8L3hzbDplbGVtZW50PlxuPC94c2w6dGVtcGxhdGU+XG48L3hzbDpzdHlsZXNoZWV0PmA7XG5cbi8vIEZ1bmN0aW9uIHRvIGV4dGVuZCBlbGVtZW50cyB3aXRoIGEgc3BlY2lmaWMgdGFnIG5hbWUgYnkgYWRkaW5nIGFuIGV4dGVuc2lvbiBzdWZmaXhcbmV4cG9ydCBmdW5jdGlvbiBleHRlbmRFbGVtZW50TmFtZSh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQsIHRhZ05hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpIHtcbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCh0YWdOYW1lKS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IG5ld1RhZ05hbWUgPSBgJHt0YWdOYW1lfS0ke2V4dGVuc2lvbn1gO1xuICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50V2l0aE5ld1RhZ05hbWUoZWxlbWVudCwgbmV3VGFnTmFtZSk7XG4gICAgZWxlbWVudC5yZXBsYWNlV2l0aChuZXdFbGVtZW50KTtcbiAgfSk7XG59XG5cbi8vIEZ1bmN0aW9uIHRvIGV4dGVuZCBhbnkgZWxlbWVudCB3aXRoIGEgc3BlY2lmaWMgY2xhc3MgcGF0dGVybiAoZS5nLiwgXCJleHRlbmQ6c3VmZml4XCIpXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3MoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50LCBjbGFzc05hbWVQYXR0ZXJuOiBzdHJpbmcpIHtcbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnKicpLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgY29uc3QgY2xhc3NMaXN0ID0gZWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgaWYgKGNsYXNzTGlzdCkge1xuICAgICAgY2xhc3NMaXN0LmZvckVhY2goY2xhc3NOYW1lID0+IHtcbiAgICAgICAgaWYgKGNsYXNzTmFtZS5zdGFydHNXaXRoKGAke2NsYXNzTmFtZVBhdHRlcm59OmApKSB7XG4gICAgICAgICAgY29uc3Qgc3VmZml4ID0gY2xhc3NOYW1lLnNsaWNlKGAke2NsYXNzTmFtZVBhdHRlcm59OmAubGVuZ3RoKTtcbiAgICAgICAgICBjb25zdCBuZXdUYWdOYW1lID0gYCR7ZWxlbWVudC5ub2RlTmFtZX0tJHtzdWZmaXh9YDtcbiAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudFdpdGhOZXdUYWdOYW1lKGVsZW1lbnQsIG5ld1RhZ05hbWUpO1xuICAgICAgICAgIGVsZW1lbnQucmVwbGFjZVdpdGgobmV3RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgZWxlbWVudCB3aXRoIGEgbmV3IHRhZyBuYW1lIGFuZCBjb3B5IGF0dHJpYnV0ZXMgYW5kIGNoaWxkcmVuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50V2l0aE5ld1RhZ05hbWUoZWxlbWVudCwgbmV3VGFnTmFtZSkge1xuICBjb25zdCBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuZXdUYWdOYW1lKTtcbiAgLy8gQ29weSBhdHRyaWJ1dGVzXG4gIGZvciAoY29uc3QgYXR0ciBvZiBlbGVtZW50LmF0dHJpYnV0ZXMpIHtcbiAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpO1xuICB9XG4gIC8vIENvcHkgY2hpbGQgbm9kZXNcbiAgd2hpbGUgKGVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTtcbiAgfVxuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGl0ZW1zRnJvbVRlc3QoeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpIHtcbiAgY29uc3QgaXRlbXM6IHsgaWRlbnRpZmllcjogc3RyaW5nOyBocmVmOiBzdHJpbmc7IGNhdGVnb3J5OiBzdHJpbmcgfVtdID0gW107XG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0tcmVmJykuZm9yRWFjaChlbCA9PiB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IGVsLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgIGNvbnN0IGhyZWYgPSBlbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICBjb25zdCBjYXRlZ29yeSA9IGVsLmdldEF0dHJpYnV0ZSgnY2F0ZWdvcnknKTtcbiAgICBpdGVtcy5wdXNoKHsgaWRlbnRpZmllciwgaHJlZiwgY2F0ZWdvcnkgfSk7XG4gIH0pO1xuICByZXR1cm4gaXRlbXM7XG59XG5cbmxldCBjdXJyZW50UmVxdWVzdDogWE1MSHR0cFJlcXVlc3QgfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRYTUwodXJsLCBjYW5jZWxQcmV2aW91c1JlcXVlc3QgPSBmYWxzZSkge1xuICBpZiAoY2FuY2VsUHJldmlvdXNSZXF1ZXN0ICYmIGN1cnJlbnRSZXF1ZXN0ICE9PSBudWxsKSB7XG4gICAgY3VycmVudFJlcXVlc3QuYWJvcnQoKTsgLy8gQWJvcnQgdGhlIG9uZ29pbmcgcmVxdWVzdCBpZiB0aGVyZSBpcyBvbmVcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxYTUxEb2N1bWVudCB8IG51bGw+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICBjdXJyZW50UmVxdWVzdCA9IHhocjsgLy8gU3RvcmUgdGhlIGN1cnJlbnQgcmVxdWVzdFxuXG4gICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7XG4gICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdkb2N1bWVudCc7XG5cbiAgICB4aHIub25sb2FkID0gKCkgPT4ge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDApIHtcbiAgICAgICAgcmVzb2x2ZSh4aHIucmVzcG9uc2VYTUwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgeGhyLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgIH07XG5cbiAgICB4aHIuc2VuZCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlWE1MKHhtbERvY3VtZW50OiBzdHJpbmcpIHtcbiAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICBjb25zdCB4bWxGcmFnbWVudCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoeG1sRG9jdW1lbnQsICd0ZXh0L3htbCcpO1xuICByZXR1cm4geG1sRnJhZ21lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0hUTUwoeG1sRnJhZ21lbnQ6IERvY3VtZW50KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gIGNvbnN0IHByb2Nlc3NvciA9IG5ldyBYU0xUUHJvY2Vzc29yKCk7XG4gIGNvbnN0IHhzbHREb2N1bWVudCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoeG1sVG9IVE1MLCAndGV4dC94bWwnKTtcbiAgcHJvY2Vzc29yLmltcG9ydFN0eWxlc2hlZXQoeHNsdERvY3VtZW50KTtcbiAgY29uc3QgaXRlbUhUTUxGcmFnbWVudCA9IHByb2Nlc3Nvci50cmFuc2Zvcm1Ub0ZyYWdtZW50KHhtbEZyYWdtZW50LCBkb2N1bWVudCk7XG4gIHJldHVybiBpdGVtSFRNTEZyYWdtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0TG9jYXRpb24oeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQsIGxvY2F0aW9uOiBzdHJpbmcpIHtcbiAgaWYgKCFsb2NhdGlvbi5lbmRzV2l0aCgnLycpKSB7XG4gICAgbG9jYXRpb24gKz0gJy8nO1xuICB9XG5cbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NyY10sW2hyZWZdLFtwcmltYXJ5LXBhdGhdJykuZm9yRWFjaChlbFdpdGhTcmMgPT4ge1xuICAgIGxldCBhdHRyOiAnc3JjJyB8ICdocmVmJyB8ICdwcmltYXJ5LXBhdGgnIHwgJycgPSAnJztcblxuICAgIGlmIChlbFdpdGhTcmMuZ2V0QXR0cmlidXRlKCdzcmMnKSkge1xuICAgICAgYXR0ciA9ICdzcmMnO1xuICAgIH1cbiAgICBpZiAoZWxXaXRoU3JjLmdldEF0dHJpYnV0ZSgnaHJlZicpKSB7XG4gICAgICBhdHRyID0gJ2hyZWYnO1xuICAgIH1cbiAgICBpZiAoZWxXaXRoU3JjLmdldEF0dHJpYnV0ZSgncHJpbWFyeS1wYXRoJykpIHtcbiAgICAgIGF0dHIgPSAncHJpbWFyeS1wYXRoJztcbiAgICB9XG4gICAgY29uc3QgYXR0clZhbHVlID0gZWxXaXRoU3JjLmdldEF0dHJpYnV0ZShhdHRyKT8udHJpbSgpO1xuXG4gICAgaWYgKCFhdHRyVmFsdWUuc3RhcnRzV2l0aCgnZGF0YTonKSAmJiAhYXR0clZhbHVlLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgY29uc3QgbmV3U3JjVmFsdWUgPSBsb2NhdGlvbiArIGVuY29kZVVSSShhdHRyVmFsdWUpO1xuICAgICAgZWxXaXRoU3JjLnNldEF0dHJpYnV0ZShhdHRyLCBuZXdTcmNWYWx1ZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRDREFUQXRvQ29tbWVudCh4bWxGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCkge1xuICBjb25zdCBjZGF0YUVsZW1lbnRzID0geG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgncXRpLWN1c3RvbS1vcGVyYXRvcltjbGFzcz1cImpzLm9yZ1wiXSA+IHF0aS1iYXNlLXZhbHVlJyk7XG4gIGNkYXRhRWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBjb25zdCBjb21tZW50VGV4dCA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoZWxlbWVudC50ZXh0Q29udGVudCk7XG4gICAgZWxlbWVudC5yZXBsYWNlQ2hpbGQoY29tbWVudFRleHQsIGVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBTdHlsZVNoZWV0cyh4bWxGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCkge1xuICAvLyByZW1vdmUgcXRpLXN0eWxlc2hlZXQgdGFnXG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zdHlsZXNoZWV0JykuZm9yRWFjaChzdHlsZXNoZWV0ID0+IHN0eWxlc2hlZXQucmVtb3ZlKCkpO1xufVxuIiwgIi8qKlxuICogQnJvd3NlciBiYXNlZCBRVEktWE1MIHRvIEhUTUwgdHJhbnNmb3JtZXIuXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIG1ldGhvZHMgdG8gbG9hZCwgcGFyc2UsIHRyYW5zZm9ybSBhbmQgc2VyaWFsaXplIFFUSSBYTUwgaXRlbXMuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIGxvYWQsIHBhcnNlLCB0cmFuc2Zvcm0gYW5kIHNlcmlhbGl6ZSBRVEkgWE1MIGl0ZW1zLlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHF0aVRyYW5zZm9ybWVyID0gcXRpVHJhbnNmb3JtSXRlbSgpO1xuICogYXdhaXQgcXRpVHJhbnNmb3JtZXIubG9hZCgncGF0aC90by94bWwvZmlsZS54bWwnKTtcbiAqIHF0aVRyYW5zZm9ybWVyLnBhdGgoJy9hc3Nlc3NtZW50SXRlbS9pdGVtQm9keScpO1xuICogY29uc3QgaHRtbCA9IHF0aVRyYW5zZm9ybWVyLmh0bWwoKTtcbiAqIGNvbnN0IHhtbCA9IHF0aVRyYW5zZm9ybWVyLnhtbCgpO1xuICogY29uc3QgaHRtbGRvYyA9IHF0aVRyYW5zZm9ybWVyLmh0bWxkb2MoKTtcbiAqIGNvbnN0IHhtbGRvYyA9IHF0aVRyYW5zZm9ybWVyLnhtbGRvYygpO1xuICpcbiAqIHF0aVRyYW5zZm9ybUl0ZW0oKS5wYXJzZShzdG9yeVhNTCkuaHRtbCgpXG4gKi9cblxuaW1wb3J0IHtcbiAgY29udmVydENEQVRBdG9Db21tZW50LFxuICBleHRlbmRFbGVtZW50TmFtZSxcbiAgZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3MsXG4gIGxvYWRYTUwsXG4gIHBhcnNlWE1MLFxuICBzZXRMb2NhdGlvbixcbiAgc3RyaXBTdHlsZVNoZWV0cyxcbiAgdG9IVE1MXG59IGZyb20gJy4vcXRpLXRyYW5zZm9ybWVycyc7XG5cbmV4cG9ydCB0eXBlIHRyYW5zZm9ybUl0ZW1BcGkgPSB7XG4gIGxvYWQ6ICh1cmk6IHN0cmluZywgY2FuY2VsUHJldmlvdXNSZXF1ZXN0PzogYm9vbGVhbikgPT4gUHJvbWlzZTx0cmFuc2Zvcm1JdGVtQXBpPjtcbiAgcGFyc2U6ICh4bWxTdHJpbmc6IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgcGF0aDogKGxvY2F0aW9uOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGZuOiAoZm46ICh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQpID0+IHZvaWQpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIHBjaUhvb2tzOiAodXJpOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGV4dGVuZEVsZW1lbnROYW1lOiAoZWxlbWVudE5hbWU6IHN0cmluZywgZXh0ZW5kOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzOiAocGFyYW0/OiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGN1c3RvbUludGVyYWN0aW9uOiAoYmFzZVJlZjogc3RyaW5nLCBiYXNlSXRlbTogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQ6ICgpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIHN0cmlwU3R5bGVTaGVldHM6ICgpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGh0bWw6ICgpID0+IHN0cmluZztcbiAgeG1sOiAoKSA9PiBzdHJpbmc7XG4gIGh0bWxEb2M6ICgpID0+IERvY3VtZW50RnJhZ21lbnQ7XG4gIHhtbERvYzogKCkgPT4gWE1MRG9jdW1lbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgcXRpVHJhbnNmb3JtSXRlbSA9ICgpID0+IHtcbiAgbGV0IHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudDtcblxuICBjb25zdCBhcGk6IHRyYW5zZm9ybUl0ZW1BcGkgPSB7XG4gICAgYXN5bmMgbG9hZCh1cmk6IHN0cmluZywgY2FuY2VsUHJldmlvdXNSZXF1ZXN0ID0gZmFsc2UpOiBQcm9taXNlPHR5cGVvZiBhcGk+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx0eXBlb2YgYXBpPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxvYWRYTUwodXJpLCBjYW5jZWxQcmV2aW91c1JlcXVlc3QpLnRoZW4oeG1sID0+IHtcbiAgICAgICAgICB4bWxGcmFnbWVudCA9IHhtbDtcbiAgICAgICAgICAvLyBzZXQgdGhlIGJhc2UgcGF0aCBmb3IgaW1hZ2VzIGFuZCBvdGhlciByZXNvdXJjZXMsXG4gICAgICAgICAgLy8geW91IHByb2JhYmx5IHdhbnQgdG8gc2V0IHRoZSBiYXNlIHBhdGggdG8gdGhlIGRvY3VtZW50IHJvb3QgZWxzZSB5b3UgY2FuIHVzZSB0aGUgcGF0aCBtZXRob2QgdG8gc2V0IGl0XG4gICAgICAgICAgYXBpLnBhdGgodXJpLnN1YnN0cmluZygwLCB1cmkubGFzdEluZGV4T2YoJy8nKSkpO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKGFwaSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBwYXJzZSh4bWxTdHJpbmc6IHN0cmluZyk6IHR5cGVvZiBhcGkge1xuICAgICAgeG1sRnJhZ21lbnQgPSBwYXJzZVhNTCh4bWxTdHJpbmcpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIHBhdGg6IChsb2NhdGlvbjogc3RyaW5nKTogdHlwZW9mIGFwaSA9PiB7XG4gICAgICBzZXRMb2NhdGlvbih4bWxGcmFnbWVudCwgbG9jYXRpb24pO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGZuKGZuOiAoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50KSA9PiB2b2lkKTogdHlwZW9mIGFwaSB7XG4gICAgICBmbih4bWxGcmFnbWVudCk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgcGNpSG9va3ModXJpOiBzdHJpbmcpOiB0eXBlb2YgYXBpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbJ2hvb2snLCAnbW9kdWxlJ107XG4gICAgICBjb25zdCBkb2N1bWVudFBhdGggPSB1cmkuc3Vic3RyaW5nKDAsIHVyaS5sYXN0SW5kZXhPZignLycpKTtcbiAgICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgY29uc3Qgc3JjQXR0cmlidXRlcyA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1snICsgYXR0cmlidXRlICsgJ10nKTtcbiAgICAgICAgc3JjQXR0cmlidXRlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgIGNvbnN0IHNyY1ZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKSE7XG4gICAgICAgICAgaWYgKCFzcmNWYWx1ZS5zdGFydHNXaXRoKCdkYXRhOicpICYmICFzcmNWYWx1ZS5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgICAgIC8vIEp1c3QgcGFzdGUgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHNyYyBsb2NhdGlvbiBhZnRlciB0aGUgZG9jdW1lbnRyb290UGF0aFxuICAgICAgICAgICAgLy8gb2xkIHBjaXMgY2FuIGhhdmUgYSAuanMsIG5ldyBwY2kncyBkb24ndFxuICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ2Jhc2UtdXJsJywgdXJpKTtcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAnbW9kdWxlJyxcbiAgICAgICAgICAgICAgZG9jdW1lbnRQYXRoICsgJy8nICsgZW5jb2RlVVJJKHNyY1ZhbHVlICsgKHNyY1ZhbHVlLmVuZHNXaXRoKCcuanMnKSA/ICcnIDogJy5qcycpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGV4dGVuZEVsZW1lbnROYW1lOiAodGFnTmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHR5cGVvZiBhcGkgPT4ge1xuICAgICAgZXh0ZW5kRWxlbWVudE5hbWUoeG1sRnJhZ21lbnQsIHRhZ05hbWUsIGV4dGVuc2lvbik7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3M6IChwYXJhbTogc3RyaW5nID0gJ2V4dGVuZCcpOiB0eXBlb2YgYXBpID0+IHtcbiAgICAgIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzKHhtbEZyYWdtZW50LCBwYXJhbSk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgY3VzdG9tSW50ZXJhY3Rpb24oYmFzZVJlZjogc3RyaW5nLCBiYXNlSXRlbTogc3RyaW5nKTogdHlwZW9mIGFwaSB7XG4gICAgICBjb25zdCBxdGlDdXN0b21JbnRlcmFjdGlvbiA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nKTtcbiAgICAgIGNvbnN0IHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0ID0gcXRpQ3VzdG9tSW50ZXJhY3Rpb24ucXVlcnlTZWxlY3Rvcignb2JqZWN0Jyk7XG5cbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnZGF0YS1iYXNlLXJlZicsIGJhc2VSZWYpO1xuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCdkYXRhLWJhc2UtaXRlbScsIGJhc2VSZWYgKyBiYXNlSXRlbSk7XG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEnLCBxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdC5nZXRBdHRyaWJ1dGUoJ2RhdGEnKSk7XG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgcXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QuZ2V0QXR0cmlidXRlKCd3aWR0aCcpKTtcbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgcXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKSk7XG5cbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnJlbW92ZUNoaWxkKHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0KTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQoKTogdHlwZW9mIGFwaSB7XG4gICAgICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQoeG1sRnJhZ21lbnQpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIHN0cmlwU3R5bGVTaGVldHMoKTogdHlwZW9mIGFwaSB7XG4gICAgICBzdHJpcFN0eWxlU2hlZXRzKHhtbEZyYWdtZW50KTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBodG1sKCkge1xuICAgICAgcmV0dXJuIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcodG9IVE1MKHhtbEZyYWdtZW50KSk7XG4gICAgfSxcbiAgICB4bWwoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHhtbEZyYWdtZW50KTtcbiAgICB9LFxuICAgIGh0bWxEb2MoKSB7XG4gICAgICByZXR1cm4gdG9IVE1MKHhtbEZyYWdtZW50KTtcbiAgICB9LFxuICAgIHhtbERvYygpOiBYTUxEb2N1bWVudCB7XG4gICAgICByZXR1cm4geG1sRnJhZ21lbnQ7IC8vIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoeG1sRnJhZ21lbnQpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGFwaTtcbn07XG4iLCAiaW1wb3J0IHsgbG9hZFhNTCwgcGFyc2VYTUwgfSBmcm9tIFwiLi9xdGktdHJhbnNmb3JtZXJzXCI7XG5cbmV4cG9ydCBjb25zdCBxdGlUcmFuc2Zvcm1NYW5pZmVzdCA9ICgpOiB7XG4gICAgbG9hZDogKHVyaTogc3RyaW5nKSA9PiBQcm9taXNlPHR5cGVvZiBhcGk+O1xuICAgIGFzc2Vzc21lbnRUZXN0OiAoKSA9PiB7IGhyZWY6IHN0cmluZzsgaWRlbnRpZmllcjogc3RyaW5nIH07XG4gIH0gPT4ge1xuICAgIGxldCB4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQ7XG4gIFxuICAgIGNvbnN0IGFwaSA9IHtcbiAgICAgIGFzeW5jIGxvYWQodXJpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx0eXBlb2YgYXBpPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgbG9hZFhNTCh1cmkpLnRoZW4oeG1sID0+IHtcbiAgICAgICAgICAgIHhtbEZyYWdtZW50ID0geG1sO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoYXBpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcGFyc2UoeG1sU3RyaW5nOiBzdHJpbmcpIHtcbiAgICAgICAgeG1sRnJhZ21lbnQgPSBwYXJzZVhNTCh4bWxTdHJpbmcpO1xuICAgICAgfSxcbiAgICAgIGFzc2Vzc21lbnRUZXN0KCkge1xuICAgICAgICBjb25zdCBlbCA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Jlc291cmNlW3R5cGU9XCJpbXNxdGlfdGVzdF94bWx2M3AwXCJdJyk7XG4gICAgICAgIHJldHVybiB7IGhyZWY6IGVsLmdldEF0dHJpYnV0ZSgnaHJlZicpLCBpZGVudGlmaWVyOiBlbC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGFwaTtcbiAgfTsiLCAiXG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBsb2FkLCBwYXJzZSBhbmQgdHJhbnNmb3JtIFFUSSB0ZXN0cy5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIG1ldGhvZHMgdG8gbG9hZCwgcGFyc2UgYW5kIHRyYW5zZm9ybSBRVEkgdGVzdHMuXG4gKiBAZXhhbXBsZVxuICogY29uc3QgcXRpVHJhbnNmb3JtZXIgPSBxdGlUcmFuc2Zvcm1UZXN0KCk7XG4gKiBhd2FpdCBxdGlUcmFuc2Zvcm1lci5sb2FkKCdodHRwczovL2V4YW1wbGUuY29tL3Rlc3QueG1sJyk7XG4gKiBjb25zdCBpdGVtcyA9IHF0aVRyYW5zZm9ybWVyLml0ZW1zKCk7XG4gKiBjb25zdCBodG1sID0gcXRpVHJhbnNmb3JtZXIuaHRtbCgpO1xuICogY29uc3QgeG1sID0gcXRpVHJhbnNmb3JtZXIueG1sKCk7XG4gKi9cblxuaW1wb3J0IHsgaXRlbXNGcm9tVGVzdCwgbG9hZFhNTCwgcGFyc2VYTUwsIHRvSFRNTCB9IGZyb20gXCIuL3F0aS10cmFuc2Zvcm1lcnNcIjtcblxuZXhwb3J0IHR5cGUgdHJhbnNmb3JtVGVzdEFwaSA9IHtcbiAgICBsb2FkOiAodXJpOiBzdHJpbmcpID0+IFByb21pc2U8dHJhbnNmb3JtVGVzdEFwaT47XG4gICAgcGFyc2U6ICh4bWxTdHJpbmc6IHN0cmluZykgPT4gdHJhbnNmb3JtVGVzdEFwaTtcbiAgICBmbjogKGZuOiAoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50KSA9PiB2b2lkKSA9PiB0cmFuc2Zvcm1UZXN0QXBpO1xuICAgIGl0ZW1zOiAoKSA9PiB7IGlkZW50aWZpZXI6IHN0cmluZzsgaHJlZjogc3RyaW5nOyBjYXRlZ29yeTogc3RyaW5nIH1bXTtcbiAgICBodG1sOiAoKSA9PiBzdHJpbmc7XG4gICAgeG1sOiAoKSA9PiBzdHJpbmc7XG4gICAgaHRtbERvYzogKCkgPT4gRG9jdW1lbnRGcmFnbWVudDtcbiAgICB4bWxEb2M6ICgpID0+IFhNTERvY3VtZW50O1xuICB9XG4gIFxuICBleHBvcnQgY29uc3QgcXRpVHJhbnNmb3JtVGVzdCA9ICgpOiB0cmFuc2Zvcm1UZXN0QXBpID0+IHtcbiAgICBsZXQgeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50O1xuICBcbiAgICBjb25zdCBhcGk6dHJhbnNmb3JtVGVzdEFwaSA9IHtcbiAgICAgIGFzeW5jIGxvYWQodXJpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx0cmFuc2Zvcm1UZXN0QXBpPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgbG9hZFhNTCh1cmkpLnRoZW4oeG1sID0+IHtcbiAgICAgICAgICAgIHhtbEZyYWdtZW50ID0geG1sO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoYXBpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcGFyc2UoeG1sU3RyaW5nOiBzdHJpbmcpIHtcbiAgICAgICAgeG1sRnJhZ21lbnQgPSBwYXJzZVhNTCh4bWxTdHJpbmcpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcbiAgICAgIGZuKGZuOiAoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHhtbEZyYWdtZW50KTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG4gICAgICBpdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1zRnJvbVRlc3QoeG1sRnJhZ21lbnQpO1xuICAgICAgfSxcbiAgICAgIGh0bWwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHRvSFRNTCh4bWxGcmFnbWVudCkpO1xuICAgICAgfSxcbiAgICAgIHhtbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh4bWxGcmFnbWVudCk7XG4gICAgICB9LFxuICAgICAgaHRtbERvYygpIHtcbiAgICAgICAgcmV0dXJuIHRvSFRNTCh4bWxGcmFnbWVudCk7XG4gICAgICB9LFxuICAgICAgeG1sRG9jKCk6IFhNTERvY3VtZW50IHtcbiAgICAgICAgcmV0dXJuIHhtbEZyYWdtZW50O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGFwaTtcbiAgfTsiLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHF0aVRyYW5zZm9ybUl0ZW0gfSBmcm9tICcuLi8uLi9xdGktdHJhbnNmb3JtZXJzJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY3VzdG9tIGVsZW1lbnQgZm9yIHJlZmVyZW5jaW5nIGFuIGFzc2Vzc21lbnQgc3RpbXVsdXMuXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnKVxuZXhwb3J0IGNsYXNzIFF0aUFzc2Vzc21lbnRTdGltdWx1c1JlZiBleHRlbmRzIExpdEVsZW1lbnQge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHN0aW11bHVzLlxuICAgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXIgPSAnJztcblxuICAvKipcbiAgICogVGhlIGhyZWYgb2YgdGhlIHN0aW11bHVzLlxuICAgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGhyZWYgPSAnJztcblxuICAvKipcbiAgICogTGlmZWN5Y2xlIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlIERPTS5cbiAgICogTG9hZHMgYW5kIGFwcGVuZHMgdGhlIHN0aW11bHVzIGlmIHRoZSAncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLWNvbm5lY3RlZCcgZXZlbnQgaXMgbm90IHByZXZlbnRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi1jb25uZWN0ZWQnLCB7IGNhbmNlbGFibGU6IHRydWUsIGJ1YmJsZXM6IHRydWUgfSk7XG4gICAgY29uc3QgaXNQcmV2ZW50ZWQgPSB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG4gICAgaWYgKGlzUHJldmVudGVkKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5jbG9zZXN0KCdxdGktYXNzZXNzbWVudC1pdGVtJyk7XG5cbiAgICAgIGNvbnN0IHN0aW11bHVzUmVmID0gaXRlbS5xdWVyeVNlbGVjdG9yKGBbZGF0YS1zdGltdWx1cy1pZHJlZj0ke3RoaXMuaWRlbnRpZmllcn1dYCk7XG4gICAgICBpZiAoc3RpbXVsdXNSZWYpIHtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdGltdWx1c1JlZihzdGltdWx1c1JlZik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFN0aW11bHVzIHdpdGggZGF0YS1zdGltdWx1cy1pZHJlZiAke3RoaXMuaWRlbnRpZmllcn0gbm90IGZvdW5kYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGFuZCBhcHBlbmRzIHRoZSBzdGltdWx1cyB0byB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBzdGltdWx1c1JlZiAtIFRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBzdGltdWx1cyB3aWxsIGJlIGFwcGVuZGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVwZGF0ZVN0aW11bHVzUmVmKHN0aW11bHVzUmVmOiBFbGVtZW50KSB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuaHJlZi5zdWJzdHJpbmcoMCwgdGhpcy5ocmVmLmxhc3RJbmRleE9mKCcvJykpO1xuICAgIGNvbnN0IHN0aW11bHVzID0gYXdhaXQgcXRpVHJhbnNmb3JtSXRlbSgpXG4gICAgICAubG9hZCh0aGlzLmhyZWYpXG4gICAgICAudGhlbihhcGkgPT4gYXBpLnBhdGgocGF0aCkuaHRtbERvYygpKTtcbiAgICBpZiAoc3RpbXVsdXMpIHsgICAgICBcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gc3RpbXVsdXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXN0aW11bHVzLWJvZHksIHF0aS1zdHlsZXNoZWV0Jyk7XG4gICAgICBzdGltdWx1c1JlZi5pbm5lckhUTUwgPSAnJztcbiAgICAgIHN0aW11bHVzUmVmLmFwcGVuZCguLi5lbGVtZW50cyk7XG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZic6IFF0aUFzc2Vzc21lbnRTdGltdWx1c1JlZjtcbiAgfVxufVxuIiwgImltcG9ydCB7IENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXIsIExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5leHBvcnQgaW50ZXJmYWNlIENob2ljZUludGVyZmFjZSB7XG4gIGlkZW50aWZpZXI6IHN0cmluZztcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRlciB0byBoYW5kbGUgYm9vbGVhbiBhdHRyaWJ1dGVzIGZvciBBUklBIHByb3BlcnRpZXMsXG4gKiBlbnN1cmluZyB0aGV5IGFyZSBzZXQgYXMgJ3RydWUnIG9yICdmYWxzZScgc3RyaW5ncy5cbiAqL1xuY29uc3QgYXJpYUJvb2xlYW5Db252ZXJ0ZXI6IENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXI8Ym9vbGVhbiwgYm9vbGVhbj4gPSB7XG4gIHRvQXR0cmlidXRlOiAodmFsdWU6IGJvb2xlYW4pID0+ICh2YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZScpLFxuICBmcm9tQXR0cmlidXRlOiAodmFsdWU6IHN0cmluZyB8IG51bGwpID0+IHZhbHVlID09PSAndHJ1ZSdcbn07XG5cbi8qKlxuICogQSBtaXhpbiB0aGF0IGFkZHMgY2hvaWNlIGZ1bmN0aW9uYWxpdHkgdG8gYSBMaXRFbGVtZW50LWJhc2VkIGNsYXNzLlxuICogSXQgZGlzcGF0Y2hlcyBldmVudHMgd2l0aCBhIGN1c3RvbSBgdHlwZWAgYW5kIGhhbmRsZXMgc2VsZWN0aW9uIGxvZ2ljLlxuICpcbiAqIEBwYXJhbSBCYXNlIC0gVGhlIGJhc2UgY2xhc3MgdG8gZXh0ZW5kLlxuICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgY2hvaWNlLCB1c2VkIGluIGV2ZW50IG5hbWVzLlxuICogQHJldHVybnMgQSBuZXcgY2xhc3MgZXh0ZW5kaW5nIHRoZSBiYXNlIGNsYXNzIHdpdGggY2hvaWNlIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZlRWxlbWVudE1peGluSW50ZXJmYWNlIHtcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICB0YWJJbmRleDogbnVtYmVyO1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHk6IGJvb2xlYW47XG4gIGludGVybmFsczogRWxlbWVudEludGVybmFscztcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gQWN0aXZlRWxlbWVudE1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oQmFzZTogVCwgdHlwZTogc3RyaW5nKSB7XG4gIGFic3RyYWN0IGNsYXNzIFF0aUNob2ljZSBleHRlbmRzIEJhc2Uge1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICAgIHB1YmxpYyBpZGVudGlmaWVyID0gJyc7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUsIGF0dHJpYnV0ZTogJ3RhYmluZGV4JyB9KVxuICAgIHB1YmxpYyB0YWJJbmRleCA9IDA7XG5cbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIHJlZmxlY3Q6IHRydWUsXG4gICAgICBhdHRyaWJ1dGU6ICdhcmlhLWRpc2FibGVkJyxcbiAgICAgIGNvbnZlcnRlcjogYXJpYUJvb2xlYW5Db252ZXJ0ZXJcbiAgICB9KVxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICByZWZsZWN0OiB0cnVlLFxuICAgICAgYXR0cmlidXRlOiAnYXJpYS1yZWFkb25seScsXG4gICAgICBjb252ZXJ0ZXI6IGFyaWFCb29sZWFuQ29udmVydGVyXG4gICAgfSlcbiAgICBwdWJsaWMgcmVhZG9ubHkgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBpbnRlcm5hbHM6IEVsZW1lbnRJbnRlcm5hbHM7XG5cbiAgICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIGhhbmRsZURpc2FibGVkQ2hhbmdlKF9vbGRWYWx1ZTogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMudGFiSW5kZXggPSBkaXNhYmxlZCA/IC0xIDogMDtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmJsdXIoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgc3VwZXIoLi4uYXJncyk7XG4gICAgICB0aGlzLmludGVybmFscyA9IHRoaXMuYXR0YWNoSW50ZXJuYWxzKCk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5fb25LZXlVcCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGljayk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGByZWdpc3Rlci0ke3R5cGV9YCwge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuX29uS2V5VXApO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2spO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoYHVucmVnaXN0ZXItJHt0eXBlfWAsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX29uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5hbHRLZXkpIHJldHVybjtcblxuICAgICAgaWYgKGV2ZW50LmNvZGUgPT09ICdTcGFjZScpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fYWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9vbkNsaWNrKCkge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgdGhpcy5fYWN0aXZhdGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hY3RpdmF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBpZGVudGlmaWVyOiBzdHJpbmcgfT4oYGFjdGl2YXRlLSR7dHlwZX1gLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHsgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gICAgfVxuICB9XG4gIHJldHVybiBRdGlDaG9pY2UgYXMgQ29uc3RydWN0b3I8QWN0aXZlRWxlbWVudE1peGluSW50ZXJmYWNlPiAmIFQ7XG59XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1pdGVtLWJvZHkuc3R5bGVzJztcbmltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAgfSBmcm9tICdsaXQnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBxdGktaXRlbS1ib2R5IG5vZGUgY29udGFpbnMgdGhlIHRleHQsIGdyYXBoaWNzLCBtZWRpYSBvYmplY3RzIGFuZCBpbnRlcmFjdGlvbnMgdGhhdCBkZXNjcmliZSB0aGUgaXRlbSdzIGNvbnRlbnQgYW5kIGluZm9ybWF0aW9uIGFib3V0IGhvdyBpdCBpcyBzdHJ1Y3R1cmVkLlxuICogQGRvY3VtZW50YXRpb24gaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5zcGhwbzZsdTZ6cWlcbiAqIEBzdGF0dXMgc3RhYmxlXG4gKiBAc2luY2UgNC4wXG4gKlxuICogQHNsb3QgLSBpdGVtIGJvZHkgY29udGVudC5cbiAqIEBzbG90IHF0aS1ydWJyaWMtYmxvY2sgLSB0aGUgcXRpIHJ1YnJpYyBibG9jayBpcyBwbGFjZWQgYWJvdmUgdGhlIGl0ZW1cbiAqXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktaXRlbS1ib2R5JylcbmV4cG9ydCBjbGFzcyBRdGlJdGVtQm9keSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInF0aS1ydWJyaWMtYmxvY2tcIj48L3Nsb3Q+PHNsb3Q+PC9zbG90PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWl0ZW0tYm9keSc6IFF0aUl0ZW1Cb2R5O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1wcm9tcHQnKVxuZXhwb3J0IGNsYXNzIFF0aVByb21wdCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAvLyBpZiBwcm9tcHRzIGFyZSBpbiBpbnRlcmFjdGlvbnMgdGhleSBzaG91bGQgaGF2ZSBhIHNsb3QsIHNvIHRoZSBwcm9tcHQgaGFzIHRvIGdvIHRoZXJlXG4gICAgLy8gaWYgcHJvbXB0IGlzIGluIHRoZSBib2R5LCB0aGVuIGp1c3QgZGlzcGxheSB0aGUgcHJvbXB0IHRoZXJlLlxuICAgIC8vIEEgYmV0dGVyIGNoZWNrIHdvdWxkIGJlIHRoZSBsYXR0ZXIsIGJ1dCBub3QgY2FuJ3QgZ2V0IHRocm91Z2ggdGhlIHNoYWRvd3Jvb3QgdG8gZmluZCB0aGUgc2xvdFxuICAgIGNvbnN0IGluSW50ZXJhY3Rpb24gPSB0aGlzLnBhcmVudEVsZW1lbnQudGFnTmFtZS5lbmRzV2l0aCgnSU5URVJBQ1RJT04nKTtcbiAgICBpZiAoaW5JbnRlcmFjdGlvbikge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncHJvbXB0Jyk7XG4gICAgfVxuICAgIC8vIGNvbnN0IHByb21wdFNsb3QgPSB0aGlzLnBhcmVudEVsZW1lbnQuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFwiW25hbWU9J3Byb21wdCddXCIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1wcm9tcHQnOiBRdGlQcm9tcHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBQcm9wZXJ0eVZhbHVlTWFwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktc3R5bGVzaGVldCcpXG5leHBvcnQgY2xhc3MgUXRpU3R5bGVzaGVldCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBwcml2YXRlIHN0eWxlRWxlbWVudDogSFRNTFN0eWxlRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlTWFwPGFueT4gfCBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBjb25zdCBsaW5rID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcblxuICAgIGlmIChsaW5rICE9PSBudWxsKSB7XG4gICAgICAvLyBGZXRjaCB0aGUgc3R5bGVzaGVldCBjb250ZW50XG4gICAgICBmZXRjaChsaW5rKVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS50ZXh0KCkpXG4gICAgICAgIC50aGVuKGNzc0NvbnRlbnQgPT4ge1xuICAgICAgICAgIC8vIE1pbmlmeSB0aGUgQ1NTIGNvbnRlbnQgYnkgcmVtb3Zpbmcgd2hpdGVzcGFjZSBhbmQgY29tbWVudHNcbiAgICAgICAgICBjb25zdCBtaW5pZmllZENzcyA9IHRoaXMubWluaWZ5Q3NzKGNzc0NvbnRlbnQpO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgPHN0eWxlPiBlbGVtZW50IHdpdGggQHNjb3BlIHN1cnJvdW5kaW5nIHRoZSBtaW5pZmllZCBDU1NcbiAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgdGhpcy5zdHlsZUVsZW1lbnQubWVkaWEgPSAnc2NyZWVuJztcbiAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9IGBAc2NvcGUgeyR7bWluaWZpZWRDc3N9fWA7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQXBwZW5kIHRoZSBzdHlsZSBlbGVtZW50IHRvIHRoZSBwYXJlbnQgZWxlbWVudCBvZiB0aGlzIGNvbXBvbmVudFxuICAgICAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnN0eWxlRWxlbWVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignTm8gcGFyZW50IGVsZW1lbnQgdG8gYXBwZW5kIHRoZSBzY29wZWQgc3R5bGVzaGVldCB0by4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgc3R5bGVzaGVldDonLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRleHRDb250ZW50ICE9PSBudWxsICYmIHRoaXMudGV4dENvbnRlbnQudHJpbSgpICE9PSAnJykge1xuICAgICAgLy8gTWluaWZ5IHRoZSBpbmxpbmUgQ1NTIGNvbnRlbnRcbiAgICAgIGNvbnN0IG1pbmlmaWVkQ3NzID0gdGhpcy5taW5pZnlDc3ModGhpcy50ZXh0Q29udGVudCk7XG5cbiAgICAgIC8vIERpcmVjdGx5IGNyZWF0ZSBhIDxzdHlsZT4gZWxlbWVudCB3aXRoIHRoZSBAc2NvcGUgc3Vycm91bmRpbmcgdGhlIG1pbmlmaWVkIGlubGluZSBzdHlsZXNcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50Lm1lZGlhID0gJ3NjcmVlbic7XG4gICAgICB0aGlzLnN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9IGBAc2NvcGUgeyR7bWluaWZpZWRDc3N9fWA7XG5cbiAgICAgIC8vIEFwcGVuZCB0aGUgc3R5bGUgZWxlbWVudCB0byB0aGUgcGFyZW50IGVsZW1lbnQgb2YgdGhpcyBjb21wb25lbnRcbiAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc3R5bGVFbGVtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTm8gcGFyZW50IGVsZW1lbnQgdG8gYXBwZW5kIHRoZSBzY29wZWQgc3R5bGVzaGVldCB0by4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1pbmlmeUNzcyhjc3NDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFJlbW92ZSBjb21tZW50cywgd2hpdGVzcGFjZSwgYW5kIG5ld2xpbmUgY2hhcmFjdGVyc1xuICAgIHJldHVybiBjc3NDb250ZW50XG4gICAgICAucmVwbGFjZSgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAnJykgLy8gUmVtb3ZlIGNvbW1lbnRzXG4gICAgICAucmVwbGFjZSgvXFxzKy9nLCAnICcpIC8vIENvbGxhcHNlIHdoaXRlc3BhY2VcbiAgICAgIC5yZXBsYWNlKC9cXHMqKFt7fTo7XSlcXHMqL2csICckMScpIC8vIFJlbW92ZSBzcGFjZXMgYXJvdW5kIHt9LCA6LCA7XG4gICAgICAudHJpbSgpOyAvLyBUcmltIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgaWYgKHRoaXMuc3R5bGVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCByZW1vdmUgc3R5bGVzaGVldDonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXN0eWxlc2hlZXQnOiBRdGlTdHlsZXNoZWV0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktdmFyaWFibGVkZWNsYXJhdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVmYXVsdFZhbHVlcyh2YXJpYWJsZTogVmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+KSB7XG4gICAgY29uc3QgaHRtbFZhbHVlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktZGVmYXVsdC12YWx1ZSA+IHF0aS12YWx1ZScpKTtcblxuICAgIGlmIChodG1sVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFZhbHVlcyA9IGh0bWxWYWx1ZXMubWFwKG4gPT4gbi5pbm5lckhUTUwudHJpbSgpKTtcbiAgICBpZiAoZGVmYXVsdFZhbHVlcy5sZW5ndGggPiAxIHx8IHZhcmlhYmxlLmNhcmRpbmFsaXR5ID09PSAnbXVsdGlwbGUnIHx8IHZhcmlhYmxlLmNhcmRpbmFsaXR5ID09PSAnb3JkZXJlZCcpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVzO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlc1swXTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktdmFyaWFibGVkZWNsYXJhdGlvbic6IFF0aVZhcmlhYmxlRGVjbGFyYXRpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBCYXNlVHlwZSwgQ2FyZGluYWxpdHkgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBPdXRjb21lVmFyaWFibGUgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3V0Y29tZS1kZWNsYXJhdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpT3V0Y29tZURlY2xhcmF0aW9uIGV4dGVuZHMgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGU7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZXh0ZXJuYWwtc2NvcmVkJyB9KSBleHRlcm5hbFNjb3JlZDogJ2h1bWFuJyB8ICdleHRlcm5hbE1hY2hpbmUnIHwgbnVsbCA9IG51bGw7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBjYXJkaW5hbGl0eTogQ2FyZGluYWxpdHk7XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHB1YmxpYyBpdGVtQ29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIHN0YXRpYyBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLml0ZW1Db250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKT8udmFsdWU7XG4gICAgcmV0dXJuIGh0bWxgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMil9YDtcbiAgfVxuXG4gIGdldCBpbnRlcnBvbGF0aW9uVGFibGUoKTogTWFwPG51bWJlciwgbnVtYmVyPiB8IG51bGwge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktaW50ZXJwb2xhdGlvbi10YWJsZScpO1xuICAgIGlmICh0YWJsZSkge1xuICAgICAgY29uc3QgZW50cmllcyA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1pbnRlcnBvbGF0aW9uLXRhYmxlLWVudHJ5JykpIHtcbiAgICAgICAgaWYgKCFlbnRyeS5nZXRBdHRyaWJ1dGUoJ3NvdXJjZS12YWx1ZScpICYmIGVudHJ5LmdldEF0dHJpYnV0ZSgndGFyZ2V0LXZhbHVlJykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdzb3VyY2UtdmFsdWUgb3IgdGFyZ2V0LXZhbHVlIGlzIG1pc3NpbmcgaW4gcXRpLWludGVycG9sYXRpb24tdGFibGUtZW50cnknKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHBhcnNlSW50KGVudHJ5LmdldEF0dHJpYnV0ZSgnc291cmNlLXZhbHVlJykpO1xuICAgICAgICBjb25zdCB0YXJnZXRWYWx1ZSA9IHBhcnNlSW50KGVudHJ5LmdldEF0dHJpYnV0ZSgndGFyZ2V0LXZhbHVlJykpO1xuICAgICAgICBpZiAoaXNOYU4oc291cmNlVmFsdWUpIHx8IGlzTmFOKHRhcmdldFZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3NvdXJjZS12YWx1ZSBvciB0YXJnZXQtdmFsdWUgaXMgbm90IGEgbnVtYmVyIGluIHF0aS1pbnRlcnBvbGF0aW9uLXRhYmxlLWVudHJ5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZW50cmllcy5zZXQoc291cmNlVmFsdWUsIHRhcmdldFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZTogT3V0Y29tZVZhcmlhYmxlID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgY2FyZGluYWxpdHk6IHRoaXMuY2FyZGluYWxpdHksXG4gICAgICBiYXNlVHlwZTogdGhpcy5iYXNlVHlwZSxcbiAgICAgIHR5cGU6ICdvdXRjb21lJyxcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgaW50ZXJwb2xhdGlvblRhYmxlOiB0aGlzLmludGVycG9sYXRpb25UYWJsZSxcbiAgICAgIGV4dGVybmFsU2NvcmVkOiB0aGlzLmV4dGVybmFsU2NvcmVkXG4gICAgfTtcbiAgICBvdXRjb21lVmFyaWFibGUudmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZXMob3V0Y29tZVZhcmlhYmxlKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1yZWdpc3Rlci12YXJpYWJsZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyB2YXJpYWJsZTogb3V0Y29tZVZhcmlhYmxlIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktb3V0Y29tZS1kZWNsYXJhdGlvbic6IFF0aU91dGNvbWVEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEJhc2VUeXBlLCBDYXJkaW5hbGl0eSB9IGZyb20gJy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpTWFwcGluZyB9IGZyb20gJy4uLy4uL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXBwaW5nL3F0aS1tYXBwaW5nJztcbmltcG9ydCB7IFF0aVZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZURlY2xhcmF0aW9uIGV4dGVuZHMgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGU7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgY2FyZGluYWxpdHk6IENhcmRpbmFsaXR5O1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwdWJsaWMgaXRlbUNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtQ29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik/LnZhbHVlO1xuICAgIHJldHVybiBodG1sYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpfWA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGU6IFJlc3BvbnNlVmFyaWFibGUgPSB7XG4gICAgICBiYXNlVHlwZTogdGhpcy5iYXNlVHlwZSxcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIGNvcnJlY3RSZXNwb25zZTogdGhpcy5jb3JyZWN0UmVzcG9uc2UsXG4gICAgICBjYXJkaW5hbGl0eTogdGhpcy5jYXJkaW5hbGl0eSB8fCAnc2luZ2xlJyxcbiAgICAgIG1hcHBpbmc6IHRoaXMubWFwcGluZyxcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgdHlwZTogJ3Jlc3BvbnNlJyxcbiAgICAgIGNhbmRpZGF0ZVJlc3BvbnNlOiBudWxsXG4gICAgfTtcbiAgICByZXNwb25zZVZhcmlhYmxlLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWVzKHJlc3BvbnNlVmFyaWFibGUpO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItdmFyaWFibGUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgdmFyaWFibGU6IHJlc3BvbnNlVmFyaWFibGUgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY29ycmVjdFJlc3BvbnNlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICBjb25zdCBjb3JyZWN0UmVzcG9uc2UgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1jb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgaWYgKGNvcnJlY3RSZXNwb25zZSkge1xuICAgICAgY29uc3QgdmFsdWVzID0gY29ycmVjdFJlc3BvbnNlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS12YWx1ZScpO1xuICAgICAgaWYgKHRoaXMuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlc1swXS50ZXh0Q29udGVudDtcbiAgICAgICAgdmFsdWVzWzBdLnJlbW92ZSgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJykge1xuICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZXNbaV0udGV4dENvbnRlbnQpO1xuICAgICAgICAgIHZhbHVlc1tpXS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgbWFwcGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktbWFwcGluZycpIGFzIFF0aU1hcHBpbmc7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uJzogUXRpUmVzcG9uc2VEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8nKVxuZXhwb3J0IGNsYXNzIFF0aUNvbXBhbmlvbk1hdGVyaWFsc0luZm8gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgLy8gc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgLy8gICBzbG90IHtcbiAgLy8gICAgIGRpc3BsYXk6IGhpZGRlbjtcbiAgLy8gICB9XG4gIC8vIGA7XG4gIC8vIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgLy8gICByZXR1cm4gaHRtbGAgPHNsb3Q+PC9zbG90PiBgO1xuICAvLyB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8nOiBRdGlDb21wYW5pb25NYXRlcmlhbHNJbmZvO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWNvbnRlbnQtYm9keScpXG5leHBvcnQgY2xhc3MgUXRpQ29udGVudEJvZHkgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG59XG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY29udGVudC1ib2R5JzogUXRpQ29udGVudEJvZHk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJ1YnJpYy1ibG9jaycpXG5leHBvcnQgY2xhc3MgUXRpUnVicmljQmxvY2sgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIG92ZXJyaWRlIGlkOyAvLyA9XCJxdGlBc3BlY3RJbmhvdWRSdWJyaWNCbG9ja1wiXG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHVzZTogJ2luc3RydWN0aW9ucycgfCAnc2NvcmluZycgfCAnbmF2aWdhdGlvbic7IC8vICA9IFwic2NvcmluZ1wiXG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHZpZXc6ICdhdXRob3InIHwgJ2NhbmRpZGF0ZScgfCAncHJvY3RvcicgfCAnc2NvcmVyJyB8ICd0ZXN0Q29uc3RydWN0b3InIHwgJ3R1dG9yJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NsYXNzJyB9KSBjbGFzc05hbWVzO1xuICBAd2F0Y2goJ2NsYXNzTmFtZXMnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIGhhbmRsZWNsYXNzTmFtZXNDaGFuZ2Uob2xkLCBkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSB0aGlzLmNsYXNzTmFtZXMuc3BsaXQoJyAnKTtcbiAgICBjbGFzc05hbWVzLmZvckVhY2goKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBzd2l0Y2ggKGNsYXNzTmFtZSkge1xuICAgICAgICBjYXNlICdxdGktcnVicmljLWRpc2NyZXRpb25hcnktcGxhY2VtZW50JzpcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktcnVicmljLWJsb2NrJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3F0aS1ydWJyaWMtaW5saW5lJzpcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICcnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gYnkgZGVmYXVsdCBwdXQgdGhpcyBpbiBhIHNsb3QgaW4gdGhlIGl0ZW0tYm9keVxuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1ydWJyaWMtYmxvY2snKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcnVicmljLWJsb2NrJzogUXRpUnVicmljQmxvY2s7XG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgZGVjaW1hbFNlcGFyYXRvciA9ICgpID0+IHtcbiAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCgpLmZvcm1hdCgwLjEpLnJlcGxhY2UoL1xcZC9nLCAnJyk7XG59O1xuXG5leHBvcnQgY29uc3QgY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQgPSAobnVtYmVyOiBudW1iZXIgfCBzdHJpbmcpID0+IHtcbiAgLy8gY2hlY2sgaWYgdHlwZSBpcyBzdHJpbmdcbiAgaWYgKHR5cGVvZiBudW1iZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bWJlcjtcbiAgfVxuICBjb25zdCBkU2VwID0gZGVjaW1hbFNlcGFyYXRvcigpO1xuICBpZiAoZFNlcCA9PT0gJy4nKSB7XG4gICAgcmV0dXJuIG51bWJlci50b0xvY2FsZVN0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudW1iZXIudG9TdHJpbmcoKS5yZXBsYWNlKCcuJywgJycpLnJlcGxhY2UoZFNlcCwgJy4nKTtcbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIElzTnVsbE9yVW5kZWZpbmVkKHZhbHVlOiB1bmtub3duKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRG91YmxlU2xhc2hlcyhzdHI6IHN0cmluZykge1xuICBjb25zdCBzaW5nbGVGb3J3YXJkU2xhc2hlcyA9IHN0clxuICAgIC5yZXBsYWNlKC8oW146XVxcLylcXC8rL2csICckMScpXG4gICAgLnJlcGxhY2UoL1xcL1xcLy9nLCAnLycpXG4gICAgLnJlcGxhY2UoJ2h0dHA6LycsICdodHRwOi8vJylcbiAgICAucmVwbGFjZSgnaHR0cHM6LycsICdodHRwczovLycpO1xuICByZXR1cm4gc2luZ2xlRm9yd2FyZFNsYXNoZXM7XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IElzTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnLi4vaW50ZXJuYWwvdXRpbHMnO1xuaW1wb3J0IHsgaXRlbUNvbnRleHQsIEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpRmVlZGJhY2sgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdzaG93LWhpZGUnIH0pXG4gIHByb3RlY3RlZCBzaG93SGlkZTogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnb3V0Y29tZS1pZGVudGlmaWVyJyB9KVxuICBwdWJsaWMgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHJvdGVjdGVkIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogZmFsc2UgfSlcbiAgcHVibGljIHNob3dTdGF0dXM6IHN0cmluZztcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfY29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxRdGlGZWVkYmFjaz4oJ3F0aS1yZWdpc3Rlci1mZWVkYmFjaycsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogdGhpc1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNoZWNrU2hvd0ZlZWRiYWNrKG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmcpIHsgICAgXG4gICAgY29uc3Qgb3V0Y29tZVZhcmlhYmxlID0gdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gb3V0Y29tZUlkZW50aWZpZXIpIHx8IG51bGw7O1xuXG4gICAgaWYgKHRoaXMub3V0Y29tZUlkZW50aWZpZXIgIT09IG91dGNvbWVJZGVudGlmaWVyIHx8ICFvdXRjb21lVmFyaWFibGUpIHJldHVybjtcbiAgICBsZXQgaXNGb3VuZCA9IGZhbHNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG91dGNvbWVWYXJpYWJsZS52YWx1ZSkpIHtcbiAgICAgIGlzRm91bmQgPSBvdXRjb21lVmFyaWFibGUudmFsdWUuaW5jbHVkZXModGhpcy5pZGVudGlmaWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNGb3VuZCA9XG4gICAgICAgICghSXNOdWxsT3JVbmRlZmluZWQodGhpcy5pZGVudGlmaWVyKSAmJlxuICAgICAgICAgICFJc051bGxPclVuZGVmaW5lZChvdXRjb21lVmFyaWFibGU/LnZhbHVlKSAmJlxuICAgICAgICAgIHRoaXMuaWRlbnRpZmllciA9PT0gb3V0Y29tZVZhcmlhYmxlLnZhbHVlKSB8fFxuICAgICAgICBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dGZWVkYmFjayhpc0ZvdW5kKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0ZlZWRiYWNrKHZhbHVlOiBib29sZWFuKSB7ICAgIFxuICAgIHRoaXMuc2hvd1N0YXR1cyA9ICh2YWx1ZSAmJiB0aGlzLnNob3dIaWRlID09PSAnc2hvdycpIHx8ICghdmFsdWUgJiYgdGhpcy5zaG93SGlkZSA9PT0gJ2hpZGUnKSA/ICdvbicgOiAnb2ZmJzsgICAgXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBQcm9wZXJ0eVZhbHVlTWFwLCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1mZWVkYmFjay1ibG9jaycpXG5leHBvcnQgY2xhc3MgUXRpRmVlZGJhY2tCbG9jayBleHRlbmRzIFF0aUZlZWRiYWNrIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgLm9uIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICAub2ZmIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCJmZWVkYmFjayAke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZU1hcDxhbnk+IHwgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tTaG93RmVlZGJhY2sodGhpcy5vdXRjb21lSWRlbnRpZmllcik7XG4gIH1cbn1cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1mZWVkYmFjay1ibG9jayc6IFF0aUZlZWRiYWNrQmxvY2s7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1mZWVkYmFjay1pbmxpbmUnKVxuZXhwb3J0IGNsYXNzIFF0aUZlZWRiYWNrSW5saW5lIGV4dGVuZHMgUXRpRmVlZGJhY2sge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuICAgIC5vZmYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCIke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1mZWVkYmFjay1pbmxpbmUnOiBRdGlGZWVkYmFja0lubGluZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpRmVlZGJhY2sgfSBmcm9tICcuLi9xdGktZmVlZGJhY2snO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1vZGFsLWZlZWRiYWNrJylcbmV4cG9ydCBjbGFzcyBRdGlNb2RhbEZlZWRiYWNrIGV4dGVuZHMgUXRpRmVlZGJhY2sge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuICAgIC5vZmYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCIke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1tb2RhbC1mZWVkYmFjayc6IFF0aU1vZGFsRmVlZGJhY2s7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtub3RoaW5nfSBmcm9tICcuLi9saXQtaHRtbC5qcyc7XG5cbi8qKlxuICogRm9yIEF0dHJpYnV0ZVBhcnRzLCBzZXRzIHRoZSBhdHRyaWJ1dGUgaWYgdGhlIHZhbHVlIGlzIGRlZmluZWQgYW5kIHJlbW92ZXNcbiAqIHRoZSBhdHRyaWJ1dGUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZC5cbiAqXG4gKiBGb3Igb3RoZXIgcGFydCB0eXBlcywgdGhpcyBkaXJlY3RpdmUgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlmRGVmaW5lZCA9IDxUPih2YWx1ZTogVCkgPT4gdmFsdWUgPz8gbm90aGluZztcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IElJbnRlcmFjdGlvbiB9IGZyb20gJy4vaW50ZXJhY3Rpb24uaW50ZXJmYWNlJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEludGVyYWN0aW9uIGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIElJbnRlcmFjdGlvbiB7XG4gIHN0YXRpYyBmb3JtQXNzb2NpYXRlZCA9IHRydWU7IC8vIEVuYWJsZSBmb3JtIGFzc29jaWF0aW9uXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncmVzcG9uc2UtaWRlbnRpZmllcicgfSkgcmVzcG9uc2VJZGVudGlmaWVyID0gJyc7XG4gIC8qKiBkaXNhYmxlZCBzaG91bGQgYmUgZXhwb3NlZCB0byB0aGUgYXR0cmlidXRlcyBhbmQgYWNjZXNzaWJsZSBhcyBwcm9wZXJ0eSAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqIHJlYWRvbmx5IHNob3VsZCBiZSBleHBvc2VkIHRvIHRoZSBhdHRyaWJ1dGVzIGFuZCBhY2Nlc3NpYmxlIGFzIHByb3BlcnR5ICovXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSkgcmVhZG9ubHkgPSBmYWxzZTtcblxuICBAc3RhdGUoKVxuICBwcm90ZWN0ZWQgX2NvcnJlY3RSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10gPSAnJztcbiAgcHJvdGVjdGVkIF9pbnRlcm5hbHM6IEVsZW1lbnRJbnRlcm5hbHM7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9pbnRlcm5hbHMgPSB0aGlzLmF0dGFjaEludGVybmFscygpO1xuICB9XG5cbiAgYWJzdHJhY3QgdmFsaWRhdGUoKTogYm9vbGVhbjtcblxuICBwdWJsaWMgcmVwb3J0VmFsaWRpdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVybmFscy5yZXBvcnRWYWxpZGl0eSgpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSAnJztcbiAgfVxuXG4gIGFic3RyYWN0IGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgYWJzdHJhY3Qgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pO1xuXG4gIHB1YmxpYyBnZXQgY29ycmVjdFJlc3BvbnNlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fY29ycmVjdFJlc3BvbnNlO1xuICB9XG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fY29ycmVjdFJlc3BvbnNlID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2VcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlUmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGlmRGVmaW5lZCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2lmLWRlZmluZWQuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUV4dGVuZGVkVGV4dEludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBAc3RhdGUoKVxuICBwcml2YXRlIF9yb3dzID0gNTtcblxuICAvKiogZXhwZWN0ZWQgbGVuZ3RoIGlzIG1hcHBlZCB0byB0aGUgcHJvcGVydHkgbWF4bGVuZ3RoIG9uIHRoZSB0ZXh0YXJlYSAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ2V4cGVjdGVkLWxlbmd0aCcgfSkgZXhwZWN0ZWRMZW5ndGg6IG51bWJlcjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BhdHRlcm4tbWFzaycgfSkgcGF0dGVybk1hc2s6IHN0cmluZztcblxuICAvKiogdGV4dCBhcHBlYXJpbmcgaW4gdGhlIGV4dGVuZGVkLXRleHQtbnRlcmFjdGlvbiBpZiBpdCBpcyBlbXB0eSAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BsYWNlaG9sZGVyLXRleHQnIH0pIHBsYWNlaG9sZGVyVGV4dDogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YS1wYXR0ZXJubWFzay1tZXNzYWdlJyB9KSBkYXRhUGF0dGVybm1hc2tNZXNzYWdlOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NsYXNzJyB9KSBjbGFzc05hbWVzO1xuICBAd2F0Y2goJ2NsYXNzTmFtZXMnKVxuICBoYW5kbGVjbGFzc05hbWVzQ2hhbmdlKG9sZCwgY2xhc3Nlczogc3RyaW5nKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcbiAgICBsZXQgcm93c1NldCA9IGZhbHNlO1xuICAgIGNsYXNzTmFtZXMuZm9yRWFjaCgoY2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChjbGFzc05hbWUuc3RhcnRzV2l0aCgncXRpLWhlaWdodC1saW5lcy0nKSkge1xuICAgICAgICBjb25zdCBuclJvd3MgPSBjbGFzc05hbWUucmVwbGFjZSgncXRpLWhlaWdodC1saW5lcy0nLCAnJyk7XG4gICAgICAgIHRoaXMuX3Jvd3MgPSBwYXJzZUludChuclJvd3MpO1xuICAgICAgICByb3dzU2V0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBJZiBubyBxdGktaGVpZ2h0LWxpbmVzIGNsYXNzIGlzIHNldCwgY2FsY3VsYXRlIHJvd3MgYmFzZWQgb24gZXhwZWN0ZWRMZW5ndGhcbiAgICBpZiAoIXJvd3NTZXQgJiYgdGhpcy5leHBlY3RlZExlbmd0aCkge1xuICAgICAgY29uc3QgZXN0aW1hdGVkUm93cyA9IE1hdGguY2VpbCh0aGlzLmV4cGVjdGVkTGVuZ3RoIC8gNTApOyAvLyAgJzUwJyBiYXNlZCBvbiBhbiBlc3RpbWF0ZSBmb3IgY2hhcmFjdGVycyBwZXIgcm93XG4gICAgICB0aGlzLl9yb3dzID0gZXN0aW1hdGVkUm93cztcbiAgICB9XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWw7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgZm9ybURhdGEuYXBwZW5kKHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCB2YWwpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldEZvcm1WYWx1ZShmb3JtRGF0YSk7XG4gICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSB2YWxpZGF0ZSgpIHtcbiAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgIGlmICghdGV4dGFyZWEpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0aGlzLnBhdHRlcm5NYXNrICYmIHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSkge1xuICAgICAgLy8gQ2xlYXIgYW55IGN1c3RvbSBlcnJvciBpbml0aWFsbHlcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eSh7fSk7XG4gICAgICB0ZXh0YXJlYS5zZXRDdXN0b21WYWxpZGl0eSgnJyk7XG4gICAgICBjb25zdCBwYXR0ZXJuU291cmNlID1cbiAgICAgICAgdGhpcy5wYXR0ZXJuTWFzay5zdGFydHNXaXRoKCdeJykgJiYgdGhpcy5wYXR0ZXJuTWFzay5lbmRzV2l0aCgnJCcpID8gdGhpcy5wYXR0ZXJuTWFzayA6IGBeJHt0aGlzLnBhdHRlcm5NYXNrfSRgO1xuXG4gICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChwYXR0ZXJuU291cmNlKTtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0ZXh0YXJlYS5jaGVja1ZhbGlkaXR5KCkgJiYgcGF0dGVybi50ZXN0KHRleHRhcmVhLnZhbHVlKTtcblxuICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIC8vIFNldCBjdXN0b20gZXJyb3IgaWYgaW52YWxpZFxuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoeyBjdXN0b21FcnJvcjogdHJ1ZSB9LCB0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpO1xuICAgICAgICB0ZXh0YXJlYS5zZXRDdXN0b21WYWxpZGl0eSh0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdGV4dGFyZWEuY2hlY2tWYWxpZGl0eSgpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KGlzVmFsaWQgPyB7fSA6IHsgY3VzdG9tRXJyb3I6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl92YWx1ZSAhPT0gJycgJiYgdGV4dGFyZWEuY2hlY2tWYWxpZGl0eSgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVwb3J0VmFsaWRpdHkoKSB7XG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKTtcbiAgICBpZiAoIXRleHRhcmVhKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBSdW4gdGhlIHZhbGlkYXRlIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGUgY3VzdG9tIHZhbGlkaXR5IHN0YXRlIGlzIHVwIHRvIGRhdGVcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGV4dGFyZWEucmVwb3J0VmFsaWRpdHkoKTtcbiAgICB9XG4gICAgcmV0dXJuIGlzVmFsaWQ7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3NzYFxuICAgICAgICAvKiBQSzogZGlzcGxheSBob3N0IGFzIGJsb2NrLCBlbHNlIGRlc2lnbiB3aWxsIGJlIGNvbGxhcHNlZCAqL1xuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIH1cbiAgICAgICAgdGV4dGFyZWEge1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIGJvcmRlcjogMDtcbiAgICAgICAgfVxuICAgICAgYFxuICAgIF07XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdFxuICAgICAgPjx0ZXh0YXJlYVxuICAgICAgICBwYXJ0PVwidGV4dGFyZWFcIlxuICAgICAgICBuYW1lPVwiJHt0aGlzLnJlc3BvbnNlSWRlbnRpZmllcn1cIlxuICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBtYXhsZW5ndGg9XCIkezUwMDB9XCJcbiAgICAgICAgQGtleWRvd249XCIke2V2ZW50ID0+IGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfVwiXG4gICAgICAgIEBrZXl1cD1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICBAY2hhbmdlPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIEBibHVyPVwiJHsoZXZlbnQ6IEZvY3VzRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICAgIH19XCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCIke2lmRGVmaW5lZCh0aGlzLnBsYWNlaG9sZGVyVGV4dCA/IHRoaXMucGxhY2Vob2xkZXJUZXh0IDogdW5kZWZpbmVkKX1cIlxuICAgICAgICByb3dzPVwiJHt0aGlzLl9yb3dzfVwiXG4gICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIlxuICAgICAgICA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCJcbiAgICAgICAgLnZhbHVlPSR7dGhpcy5fdmFsdWV9XG4gICAgICA+PC90ZXh0YXJlYT5gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRleHRDaGFuZ2VkKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIHRoaXMuc2V0RW1wdHlBdHRyaWJ1dGUoaW5wdXQudmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gaW5wdXQudmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZShpbnB1dC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRFbXB0eUF0dHJpYnV0ZSh0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZW1wdHknLCB0ZXh0ID09PSAnJyA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJzogUXRpRXh0ZW5kZWRUZXh0SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtcbiAgXyRMSCxcbiAgUGFydCxcbiAgRGlyZWN0aXZlUGFyZW50LFxuICBDb21waWxlZFRlbXBsYXRlUmVzdWx0LFxuICBNYXliZUNvbXBpbGVkVGVtcGxhdGVSZXN1bHQsXG4gIFVuY29tcGlsZWRUZW1wbGF0ZVJlc3VsdCxcbn0gZnJvbSAnLi9saXQtaHRtbC5qcyc7XG5pbXBvcnQge1xuICBEaXJlY3RpdmVSZXN1bHQsXG4gIERpcmVjdGl2ZUNsYXNzLFxuICBQYXJ0SW5mbyxcbiAgQXR0cmlidXRlUGFydEluZm8sXG59IGZyb20gJy4vZGlyZWN0aXZlLmpzJztcbnR5cGUgUHJpbWl0aXZlID0gbnVsbCB8IHVuZGVmaW5lZCB8IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBzeW1ib2wgfCBiaWdpbnQ7XG5cbmNvbnN0IHtfQ2hpbGRQYXJ0OiBDaGlsZFBhcnR9ID0gXyRMSDtcblxudHlwZSBDaGlsZFBhcnQgPSBJbnN0YW5jZVR5cGU8dHlwZW9mIENoaWxkUGFydD47XG5cbmNvbnN0IEVOQUJMRV9TSEFEWURPTV9OT1BBVENIID0gdHJ1ZTtcblxuY29uc3Qgd3JhcCA9XG4gIEVOQUJMRV9TSEFEWURPTV9OT1BBVENIICYmXG4gIHdpbmRvdy5TaGFkeURPTT8uaW5Vc2UgJiZcbiAgd2luZG93LlNoYWR5RE9NPy5ub1BhdGNoID09PSB0cnVlXG4gICAgPyB3aW5kb3cuU2hhZHlET00hLndyYXBcbiAgICA6IChub2RlOiBOb2RlKSA9PiBub2RlO1xuXG4vKipcbiAqIFRlc3RzIGlmIGEgdmFsdWUgaXMgYSBwcmltaXRpdmUgdmFsdWUuXG4gKlxuICogU2VlIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGVvZi1vcGVyYXRvclxuICovXG5leHBvcnQgY29uc3QgaXNQcmltaXRpdmUgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQcmltaXRpdmUgPT5cbiAgdmFsdWUgPT09IG51bGwgfHwgKHR5cGVvZiB2YWx1ZSAhPSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUgIT0gJ2Z1bmN0aW9uJyk7XG5cbmV4cG9ydCBjb25zdCBUZW1wbGF0ZVJlc3VsdFR5cGUgPSB7XG4gIEhUTUw6IDEsXG4gIFNWRzogMixcbiAgTUFUSE1MOiAzLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGVtcGxhdGVSZXN1bHRUeXBlID1cbiAgKHR5cGVvZiBUZW1wbGF0ZVJlc3VsdFR5cGUpW2tleW9mIHR5cGVvZiBUZW1wbGF0ZVJlc3VsdFR5cGVdO1xuXG50eXBlIElzVGVtcGxhdGVSZXN1bHQgPSB7XG4gICh2YWw6IHVua25vd24pOiB2YWwgaXMgTWF5YmVDb21waWxlZFRlbXBsYXRlUmVzdWx0O1xuICA8VCBleHRlbmRzIFRlbXBsYXRlUmVzdWx0VHlwZT4oXG4gICAgdmFsOiB1bmtub3duLFxuICAgIHR5cGU6IFRcbiAgKTogdmFsIGlzIFVuY29tcGlsZWRUZW1wbGF0ZVJlc3VsdDxUPjtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgYSB2YWx1ZSBpcyBhIFRlbXBsYXRlUmVzdWx0IG9yIGEgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzVGVtcGxhdGVSZXN1bHQ6IElzVGVtcGxhdGVSZXN1bHQgPSAoXG4gIHZhbHVlOiB1bmtub3duLFxuICB0eXBlPzogVGVtcGxhdGVSZXN1bHRUeXBlXG4pOiB2YWx1ZSBpcyBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQgPT5cbiAgdHlwZSA9PT0gdW5kZWZpbmVkXG4gICAgPyAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgKHZhbHVlIGFzIFVuY29tcGlsZWRUZW1wbGF0ZVJlc3VsdCk/LlsnXyRsaXRUeXBlJCddICE9PSB1bmRlZmluZWRcbiAgICA6ICh2YWx1ZSBhcyBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQpPy5bJ18kbGl0VHlwZSQnXSA9PT0gdHlwZTtcblxuLyoqXG4gKiBUZXN0cyBpZiBhIHZhbHVlIGlzIGEgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCA9IChcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIENvbXBpbGVkVGVtcGxhdGVSZXN1bHQgPT4ge1xuICByZXR1cm4gKHZhbHVlIGFzIENvbXBpbGVkVGVtcGxhdGVSZXN1bHQpPy5bJ18kbGl0VHlwZSQnXT8uaCAhPSBudWxsO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiBhIHZhbHVlIGlzIGEgRGlyZWN0aXZlUmVzdWx0LlxuICovXG5leHBvcnQgY29uc3QgaXNEaXJlY3RpdmVSZXN1bHQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBEaXJlY3RpdmVSZXN1bHQgPT5cbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgKHZhbHVlIGFzIERpcmVjdGl2ZVJlc3VsdCk/LlsnXyRsaXREaXJlY3RpdmUkJ10gIT09IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIERpcmVjdGl2ZSBjbGFzcyBmb3IgYSBEaXJlY3RpdmVSZXN1bHRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldERpcmVjdGl2ZUNsYXNzID0gKHZhbHVlOiB1bmtub3duKTogRGlyZWN0aXZlQ2xhc3MgfCB1bmRlZmluZWQgPT5cbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgKHZhbHVlIGFzIERpcmVjdGl2ZVJlc3VsdCk/LlsnXyRsaXREaXJlY3RpdmUkJ107XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIHBhcnQgaGFzIG9ubHkgYSBzaW5nbGUtZXhwcmVzc2lvbiB3aXRoIG5vIHN0cmluZ3MgdG9cbiAqIGludGVycG9sYXRlIGJldHdlZW4uXG4gKlxuICogT25seSBBdHRyaWJ1dGVQYXJ0IGFuZCBQcm9wZXJ0eVBhcnQgY2FuIGhhdmUgbXVsdGlwbGUgZXhwcmVzc2lvbnMuXG4gKiBNdWx0aS1leHByZXNzaW9uIHBhcnRzIGhhdmUgYSBgc3RyaW5nc2AgcHJvcGVydHkgYW5kIHNpbmdsZS1leHByZXNzaW9uXG4gKiBwYXJ0cyBkbyBub3QuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1NpbmdsZUV4cHJlc3Npb24gPSAocGFydDogUGFydEluZm8pID0+XG4gIChwYXJ0IGFzIEF0dHJpYnV0ZVBhcnRJbmZvKS5zdHJpbmdzID09PSB1bmRlZmluZWQ7XG5cbmNvbnN0IGNyZWF0ZU1hcmtlciA9ICgpID0+IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJycpO1xuXG4vKipcbiAqIEluc2VydHMgYSBDaGlsZFBhcnQgaW50byB0aGUgZ2l2ZW4gY29udGFpbmVyIENoaWxkUGFydCdzIERPTSwgZWl0aGVyIGF0IHRoZVxuICogZW5kIG9mIHRoZSBjb250YWluZXIgQ2hpbGRQYXJ0LCBvciBiZWZvcmUgdGhlIG9wdGlvbmFsIGByZWZQYXJ0YC5cbiAqXG4gKiBUaGlzIGRvZXMgbm90IGFkZCB0aGUgcGFydCB0byB0aGUgY29udGFpbmVyUGFydCdzIGNvbW1pdHRlZCB2YWx1ZS4gVGhhdCBtdXN0XG4gKiBiZSBkb25lIGJ5IGNhbGxlcnMuXG4gKlxuICogQHBhcmFtIGNvbnRhaW5lclBhcnQgUGFydCB3aXRoaW4gd2hpY2ggdG8gYWRkIHRoZSBuZXcgQ2hpbGRQYXJ0XG4gKiBAcGFyYW0gcmVmUGFydCBQYXJ0IGJlZm9yZSB3aGljaCB0byBhZGQgdGhlIG5ldyBDaGlsZFBhcnQ7IHdoZW4gb21pdHRlZCB0aGVcbiAqICAgICBwYXJ0IGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGBjb250YWluZXJQYXJ0YFxuICogQHBhcmFtIHBhcnQgUGFydCB0byBpbnNlcnQsIG9yIHVuZGVmaW5lZCB0byBjcmVhdGUgYSBuZXcgcGFydFxuICovXG5leHBvcnQgY29uc3QgaW5zZXJ0UGFydCA9IChcbiAgY29udGFpbmVyUGFydDogQ2hpbGRQYXJ0LFxuICByZWZQYXJ0PzogQ2hpbGRQYXJ0LFxuICBwYXJ0PzogQ2hpbGRQYXJ0XG4pOiBDaGlsZFBhcnQgPT4ge1xuICBjb25zdCBjb250YWluZXIgPSB3cmFwKGNvbnRhaW5lclBhcnQuXyRzdGFydE5vZGUpLnBhcmVudE5vZGUhO1xuXG4gIGNvbnN0IHJlZk5vZGUgPVxuICAgIHJlZlBhcnQgPT09IHVuZGVmaW5lZCA/IGNvbnRhaW5lclBhcnQuXyRlbmROb2RlIDogcmVmUGFydC5fJHN0YXJ0Tm9kZTtcblxuICBpZiAocGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qgc3RhcnROb2RlID0gd3JhcChjb250YWluZXIpLmluc2VydEJlZm9yZShjcmVhdGVNYXJrZXIoKSwgcmVmTm9kZSk7XG4gICAgY29uc3QgZW5kTm9kZSA9IHdyYXAoY29udGFpbmVyKS5pbnNlcnRCZWZvcmUoY3JlYXRlTWFya2VyKCksIHJlZk5vZGUpO1xuICAgIHBhcnQgPSBuZXcgQ2hpbGRQYXJ0KFxuICAgICAgc3RhcnROb2RlLFxuICAgICAgZW5kTm9kZSxcbiAgICAgIGNvbnRhaW5lclBhcnQsXG4gICAgICBjb250YWluZXJQYXJ0Lm9wdGlvbnNcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGVuZE5vZGUgPSB3cmFwKHBhcnQuXyRlbmROb2RlISkubmV4dFNpYmxpbmc7XG4gICAgY29uc3Qgb2xkUGFyZW50ID0gcGFydC5fJHBhcmVudDtcbiAgICBjb25zdCBwYXJlbnRDaGFuZ2VkID0gb2xkUGFyZW50ICE9PSBjb250YWluZXJQYXJ0O1xuICAgIGlmIChwYXJlbnRDaGFuZ2VkKSB7XG4gICAgICBwYXJ0Ll8kcmVwYXJlbnREaXNjb25uZWN0YWJsZXM/Lihjb250YWluZXJQYXJ0KTtcbiAgICAgIC8vIE5vdGUgdGhhdCBhbHRob3VnaCBgXyRyZXBhcmVudERpc2Nvbm5lY3RhYmxlc2AgdXBkYXRlcyB0aGUgcGFydCdzXG4gICAgICAvLyBgXyRwYXJlbnRgIHJlZmVyZW5jZSBhZnRlciB1bmxpbmtpbmcgZnJvbSBpdHMgY3VycmVudCBwYXJlbnQsIHRoYXRcbiAgICAgIC8vIG1ldGhvZCBvbmx5IGV4aXN0cyBpZiBEaXNjb25uZWN0YWJsZXMgYXJlIHByZXNlbnQsIHNvIHdlIG5lZWQgdG9cbiAgICAgIC8vIHVuY29uZGl0aW9uYWxseSBzZXQgaXQgaGVyZVxuICAgICAgcGFydC5fJHBhcmVudCA9IGNvbnRhaW5lclBhcnQ7XG4gICAgICAvLyBTaW5jZSB0aGUgXyRpc0Nvbm5lY3RlZCBnZXR0ZXIgaXMgc29tZXdoYXQgY29zdGx5LCBvbmx5XG4gICAgICAvLyByZWFkIGl0IG9uY2Ugd2Uga25vdyB0aGUgc3VidHJlZSBoYXMgZGlyZWN0aXZlcyB0aGF0IG5lZWRcbiAgICAgIC8vIHRvIGJlIG5vdGlmaWVkXG4gICAgICBsZXQgbmV3Q29ubmVjdGlvblN0YXRlO1xuICAgICAgaWYgKFxuICAgICAgICBwYXJ0Ll8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAobmV3Q29ubmVjdGlvblN0YXRlID0gY29udGFpbmVyUGFydC5fJGlzQ29ubmVjdGVkKSAhPT1cbiAgICAgICAgICBvbGRQYXJlbnQhLl8kaXNDb25uZWN0ZWRcbiAgICAgICkge1xuICAgICAgICBwYXJ0Ll8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQobmV3Q29ubmVjdGlvblN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuZE5vZGUgIT09IHJlZk5vZGUgfHwgcGFyZW50Q2hhbmdlZCkge1xuICAgICAgbGV0IHN0YXJ0OiBOb2RlIHwgbnVsbCA9IHBhcnQuXyRzdGFydE5vZGU7XG4gICAgICB3aGlsZSAoc3RhcnQgIT09IGVuZE5vZGUpIHtcbiAgICAgICAgY29uc3QgbjogTm9kZSB8IG51bGwgPSB3cmFwKHN0YXJ0ISkubmV4dFNpYmxpbmc7XG4gICAgICAgIHdyYXAoY29udGFpbmVyKS5pbnNlcnRCZWZvcmUoc3RhcnQhLCByZWZOb2RlKTtcbiAgICAgICAgc3RhcnQgPSBuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJ0O1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIFBhcnQuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBzZXQvdXBkYXRlIHRoZSB2YWx1ZSBvZiB1c2VyLWNyZWF0ZWRcbiAqIHBhcnRzIChpLmUuIHRob3NlIGNyZWF0ZWQgdXNpbmcgYGluc2VydFBhcnRgKTsgaXQgc2hvdWxkIG5vdCBiZSB1c2VkXG4gKiBieSBkaXJlY3RpdmVzIHRvIHNldCB0aGUgdmFsdWUgb2YgdGhlIGRpcmVjdGl2ZSdzIGNvbnRhaW5lciBwYXJ0LiBEaXJlY3RpdmVzXG4gKiBzaG91bGQgcmV0dXJuIGEgdmFsdWUgZnJvbSBgdXBkYXRlYC9gcmVuZGVyYCB0byB1cGRhdGUgdGhlaXIgcGFydCBzdGF0ZS5cbiAqXG4gKiBGb3IgZGlyZWN0aXZlcyB0aGF0IHJlcXVpcmUgc2V0dGluZyB0aGVpciBwYXJ0IHZhbHVlIGFzeW5jaHJvbm91c2x5LCB0aGV5XG4gKiBzaG91bGQgZXh0ZW5kIGBBc3luY0RpcmVjdGl2ZWAgYW5kIGNhbGwgYHRoaXMuc2V0VmFsdWUoKWAuXG4gKlxuICogQHBhcmFtIHBhcnQgUGFydCB0byBzZXRcbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBzZXRcbiAqIEBwYXJhbSBpbmRleCBGb3IgYEF0dHJpYnV0ZVBhcnRgcywgdGhlIGluZGV4IHRvIHNldFxuICogQHBhcmFtIGRpcmVjdGl2ZVBhcmVudCBVc2VkIGludGVybmFsbHk7IHNob3VsZCBub3QgYmUgc2V0IGJ5IHVzZXJcbiAqL1xuZXhwb3J0IGNvbnN0IHNldENoaWxkUGFydFZhbHVlID0gPFQgZXh0ZW5kcyBDaGlsZFBhcnQ+KFxuICBwYXJ0OiBULFxuICB2YWx1ZTogdW5rbm93bixcbiAgZGlyZWN0aXZlUGFyZW50OiBEaXJlY3RpdmVQYXJlbnQgPSBwYXJ0XG4pOiBUID0+IHtcbiAgcGFydC5fJHNldFZhbHVlKHZhbHVlLCBkaXJlY3RpdmVQYXJlbnQpO1xuICByZXR1cm4gcGFydDtcbn07XG5cbi8vIEEgc2VudGluZWwgdmFsdWUgdGhhdCBjYW4gbmV2ZXIgYXBwZWFyIGFzIGEgcGFydCB2YWx1ZSBleGNlcHQgd2hlbiBzZXQgYnlcbi8vIGxpdmUoKS4gVXNlZCB0byBmb3JjZSBhIGRpcnR5LWNoZWNrIHRvIGZhaWwgYW5kIGNhdXNlIGEgcmUtcmVuZGVyLlxuY29uc3QgUkVTRVRfVkFMVUUgPSB7fTtcblxuLyoqXG4gKiBTZXRzIHRoZSBjb21taXR0ZWQgdmFsdWUgb2YgYSBDaGlsZFBhcnQgZGlyZWN0bHkgd2l0aG91dCB0cmlnZ2VyaW5nIHRoZVxuICogY29tbWl0IHN0YWdlIG9mIHRoZSBwYXJ0LlxuICpcbiAqIFRoaXMgaXMgdXNlZnVsIGluIGNhc2VzIHdoZXJlIGEgZGlyZWN0aXZlIG5lZWRzIHRvIHVwZGF0ZSB0aGUgcGFydCBzdWNoXG4gKiB0aGF0IHRoZSBuZXh0IHVwZGF0ZSBkZXRlY3RzIGEgdmFsdWUgY2hhbmdlIG9yIG5vdC4gV2hlbiB2YWx1ZSBpcyBvbWl0dGVkLFxuICogdGhlIG5leHQgdXBkYXRlIHdpbGwgYmUgZ3VhcmFudGVlZCB0byBiZSBkZXRlY3RlZCBhcyBhIGNoYW5nZS5cbiAqXG4gKiBAcGFyYW0gcGFydFxuICogQHBhcmFtIHZhbHVlXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRDb21taXR0ZWRWYWx1ZSA9IChwYXJ0OiBQYXJ0LCB2YWx1ZTogdW5rbm93biA9IFJFU0VUX1ZBTFVFKSA9PlxuICAocGFydC5fJGNvbW1pdHRlZFZhbHVlID0gdmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbW1pdHRlZCB2YWx1ZSBvZiBhIENoaWxkUGFydC5cbiAqXG4gKiBUaGUgY29tbWl0dGVkIHZhbHVlIGlzIHVzZWQgZm9yIGNoYW5nZSBkZXRlY3Rpb24gYW5kIGVmZmljaWVudCB1cGRhdGVzIG9mXG4gKiB0aGUgcGFydC4gSXQgY2FuIGRpZmZlciBmcm9tIHRoZSB2YWx1ZSBzZXQgYnkgdGhlIHRlbXBsYXRlIG9yIGRpcmVjdGl2ZSBpblxuICogY2FzZXMgd2hlcmUgdGhlIHRlbXBsYXRlIHZhbHVlIGlzIHRyYW5zZm9ybWVkIGJlZm9yZSBiZWluZyBjb21taXR0ZWQuXG4gKlxuICogLSBgVGVtcGxhdGVSZXN1bHRgcyBhcmUgY29tbWl0dGVkIGFzIGEgYFRlbXBsYXRlSW5zdGFuY2VgXG4gKiAtIEl0ZXJhYmxlcyBhcmUgY29tbWl0dGVkIGFzIGBBcnJheTxDaGlsZFBhcnQ+YFxuICogLSBBbGwgb3RoZXIgdHlwZXMgYXJlIGNvbW1pdHRlZCBhcyB0aGUgdGVtcGxhdGUgdmFsdWUgb3IgdmFsdWUgcmV0dXJuZWQgb3JcbiAqICAgc2V0IGJ5IGEgZGlyZWN0aXZlLlxuICpcbiAqIEBwYXJhbSBwYXJ0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb21taXR0ZWRWYWx1ZSA9IChwYXJ0OiBDaGlsZFBhcnQpID0+IHBhcnQuXyRjb21taXR0ZWRWYWx1ZTtcblxuLyoqXG4gKiBSZW1vdmVzIGEgQ2hpbGRQYXJ0IGZyb20gdGhlIERPTSwgaW5jbHVkaW5nIGFueSBvZiBpdHMgY29udGVudC5cbiAqXG4gKiBAcGFyYW0gcGFydCBUaGUgUGFydCB0byByZW1vdmVcbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZVBhcnQgPSAocGFydDogQ2hpbGRQYXJ0KSA9PiB7XG4gIHBhcnQuXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZD8uKGZhbHNlLCB0cnVlKTtcbiAgbGV0IHN0YXJ0OiBDaGlsZE5vZGUgfCBudWxsID0gcGFydC5fJHN0YXJ0Tm9kZTtcbiAgY29uc3QgZW5kOiBDaGlsZE5vZGUgfCBudWxsID0gd3JhcChwYXJ0Ll8kZW5kTm9kZSEpLm5leHRTaWJsaW5nO1xuICB3aGlsZSAoc3RhcnQgIT09IGVuZCkge1xuICAgIGNvbnN0IG46IENoaWxkTm9kZSB8IG51bGwgPSB3cmFwKHN0YXJ0ISkubmV4dFNpYmxpbmc7XG4gICAgKHdyYXAoc3RhcnQhKSBhcyBDaGlsZE5vZGUpLnJlbW92ZSgpO1xuICAgIHN0YXJ0ID0gbjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNsZWFyUGFydCA9IChwYXJ0OiBDaGlsZFBhcnQpID0+IHtcbiAgcGFydC5fJGNsZWFyKCk7XG59O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG5pbXBvcnQge0Rpc2Nvbm5lY3RhYmxlLCBQYXJ0fSBmcm9tICcuL2xpdC1odG1sLmpzJztcblxuZXhwb3J0IHtcbiAgQXR0cmlidXRlUGFydCxcbiAgQm9vbGVhbkF0dHJpYnV0ZVBhcnQsXG4gIENoaWxkUGFydCxcbiAgRWxlbWVudFBhcnQsXG4gIEV2ZW50UGFydCxcbiAgUGFydCxcbiAgUHJvcGVydHlQYXJ0LFxufSBmcm9tICcuL2xpdC1odG1sLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmVDbGFzcyB7XG4gIG5ldyAocGFydDogUGFydEluZm8pOiBEaXJlY3RpdmU7XG59XG5cbi8qKlxuICogVGhpcyB1dGlsaXR5IHR5cGUgZXh0cmFjdHMgdGhlIHNpZ25hdHVyZSBvZiBhIGRpcmVjdGl2ZSBjbGFzcydzIHJlbmRlcigpXG4gKiBtZXRob2Qgc28gd2UgY2FuIHVzZSBpdCBmb3IgdGhlIHR5cGUgb2YgdGhlIGdlbmVyYXRlZCBkaXJlY3RpdmUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIERpcmVjdGl2ZVBhcmFtZXRlcnM8QyBleHRlbmRzIERpcmVjdGl2ZT4gPSBQYXJhbWV0ZXJzPENbJ3JlbmRlciddPjtcblxuLyoqXG4gKiBBIGdlbmVyYXRlZCBkaXJlY3RpdmUgZnVuY3Rpb24gZG9lc24ndCBldmFsdWF0ZSB0aGUgZGlyZWN0aXZlLCBidXQganVzdFxuICogcmV0dXJucyBhIERpcmVjdGl2ZVJlc3VsdCBvYmplY3QgdGhhdCBjYXB0dXJlcyB0aGUgYXJndW1lbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZVJlc3VsdDxDIGV4dGVuZHMgRGlyZWN0aXZlQ2xhc3MgPSBEaXJlY3RpdmVDbGFzcz4ge1xuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBbJ18kbGl0RGlyZWN0aXZlJCddOiBDO1xuICAvKiogQGludGVybmFsICovXG4gIHZhbHVlczogRGlyZWN0aXZlUGFyYW1ldGVyczxJbnN0YW5jZVR5cGU8Qz4+O1xufVxuXG5leHBvcnQgY29uc3QgUGFydFR5cGUgPSB7XG4gIEFUVFJJQlVURTogMSxcbiAgQ0hJTEQ6IDIsXG4gIFBST1BFUlRZOiAzLFxuICBCT09MRUFOX0FUVFJJQlVURTogNCxcbiAgRVZFTlQ6IDUsXG4gIEVMRU1FTlQ6IDYsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBQYXJ0VHlwZSA9ICh0eXBlb2YgUGFydFR5cGUpW2tleW9mIHR5cGVvZiBQYXJ0VHlwZV07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbGRQYXJ0SW5mbyB7XG4gIHJlYWRvbmx5IHR5cGU6IHR5cGVvZiBQYXJ0VHlwZS5DSElMRDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdHRyaWJ1dGVQYXJ0SW5mbyB7XG4gIHJlYWRvbmx5IHR5cGU6XG4gICAgfCB0eXBlb2YgUGFydFR5cGUuQVRUUklCVVRFXG4gICAgfCB0eXBlb2YgUGFydFR5cGUuUFJPUEVSVFlcbiAgICB8IHR5cGVvZiBQYXJ0VHlwZS5CT09MRUFOX0FUVFJJQlVURVxuICAgIHwgdHlwZW9mIFBhcnRUeXBlLkVWRU5UO1xuICByZWFkb25seSBzdHJpbmdzPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+O1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhZ05hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50UGFydEluZm8ge1xuICByZWFkb25seSB0eXBlOiB0eXBlb2YgUGFydFR5cGUuRUxFTUVOVDtcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFydCBhIGRpcmVjdGl2ZSBpcyBib3VuZCB0by5cbiAqXG4gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgY2hlY2tpbmcgdGhhdCBhIGRpcmVjdGl2ZSBpcyBhdHRhY2hlZCB0byBhIHZhbGlkIHBhcnQsXG4gKiBzdWNoIGFzIHdpdGggZGlyZWN0aXZlIHRoYXQgY2FuIG9ubHkgYmUgdXNlZCBvbiBhdHRyaWJ1dGUgYmluZGluZ3MuXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnRJbmZvID0gQ2hpbGRQYXJ0SW5mbyB8IEF0dHJpYnV0ZVBhcnRJbmZvIHwgRWxlbWVudFBhcnRJbmZvO1xuXG4vKipcbiAqIENyZWF0ZXMgYSB1c2VyLWZhY2luZyBkaXJlY3RpdmUgZnVuY3Rpb24gZnJvbSBhIERpcmVjdGl2ZSBjbGFzcy4gVGhpc1xuICogZnVuY3Rpb24gaGFzIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgdGhlIGRpcmVjdGl2ZSdzIHJlbmRlcigpIG1ldGhvZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGRpcmVjdGl2ZSA9XG4gIDxDIGV4dGVuZHMgRGlyZWN0aXZlQ2xhc3M+KGM6IEMpID0+XG4gICguLi52YWx1ZXM6IERpcmVjdGl2ZVBhcmFtZXRlcnM8SW5zdGFuY2VUeXBlPEM+Pik6IERpcmVjdGl2ZVJlc3VsdDxDPiA9PiAoe1xuICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgWydfJGxpdERpcmVjdGl2ZSQnXTogYyxcbiAgICB2YWx1ZXMsXG4gIH0pO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIGN1c3RvbSBkaXJlY3RpdmVzLiBVc2VycyBzaG91bGQgZXh0ZW5kIHRoaXMgY2xhc3MsXG4gKiBpbXBsZW1lbnQgYHJlbmRlcmAgYW5kL29yIGB1cGRhdGVgLCBhbmQgdGhlbiBwYXNzIHRoZWlyIHN1YmNsYXNzIHRvXG4gKiBgZGlyZWN0aXZlYC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERpcmVjdGl2ZSBpbXBsZW1lbnRzIERpc2Nvbm5lY3RhYmxlIHtcbiAgLy9AaW50ZXJuYWxcbiAgX19wYXJ0ITogUGFydDtcbiAgLy9AaW50ZXJuYWxcbiAgX19hdHRyaWJ1dGVJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvL0BpbnRlcm5hbFxuICBfX2RpcmVjdGl2ZT86IERpcmVjdGl2ZTtcblxuICAvL0BpbnRlcm5hbFxuICBfJHBhcmVudCE6IERpc2Nvbm5lY3RhYmxlO1xuXG4gIC8vIFRoZXNlIHdpbGwgb25seSBleGlzdCBvbiB0aGUgQXN5bmNEaXJlY3RpdmUgc3ViY2xhc3NcbiAgLy9AaW50ZXJuYWxcbiAgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuPzogU2V0PERpc2Nvbm5lY3RhYmxlPjtcbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgLy9AaW50ZXJuYWxcbiAgWydfJG5vdGlmeURpcmVjdGl2ZUNvbm5lY3Rpb25DaGFuZ2VkJ10/KGlzQ29ubmVjdGVkOiBib29sZWFuKTogdm9pZDtcblxuICBjb25zdHJ1Y3RvcihfcGFydEluZm86IFBhcnRJbmZvKSB7fVxuXG4gIC8vIFNlZSBjb21tZW50IGluIERpc2Nvbm5lY3RhYmxlIGludGVyZmFjZSBmb3Igd2h5IHRoaXMgaXMgYSBnZXR0ZXJcbiAgZ2V0IF8kaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuXyRwYXJlbnQuXyRpc0Nvbm5lY3RlZDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRpbml0aWFsaXplKFxuICAgIHBhcnQ6IFBhcnQsXG4gICAgcGFyZW50OiBEaXNjb25uZWN0YWJsZSxcbiAgICBhdHRyaWJ1dGVJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuX19wYXJ0ID0gcGFydDtcbiAgICB0aGlzLl8kcGFyZW50ID0gcGFyZW50O1xuICAgIHRoaXMuX19hdHRyaWJ1dGVJbmRleCA9IGF0dHJpYnV0ZUluZGV4O1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRyZXNvbHZlKHBhcnQ6IFBhcnQsIHByb3BzOiBBcnJheTx1bmtub3duPik6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZShwYXJ0LCBwcm9wcyk7XG4gIH1cblxuICBhYnN0cmFjdCByZW5kZXIoLi4ucHJvcHM6IEFycmF5PHVua25vd24+KTogdW5rbm93bjtcblxuICB1cGRhdGUoX3BhcnQ6IFBhcnQsIHByb3BzOiBBcnJheTx1bmtub3duPik6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLnJlbmRlciguLi5wcm9wcyk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBPdmVydmlldzpcbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyBkZXNpZ25lZCB0byBhZGQgc3VwcG9ydCBmb3IgYW4gYXN5bmMgYHNldFZhbHVlYCBBUEkgYW5kXG4gKiBgZGlzY29ubmVjdGVkYCBjYWxsYmFjayB0byBkaXJlY3RpdmVzIHdpdGggdGhlIGxlYXN0IGltcGFjdCBvbiB0aGUgY29yZVxuICogcnVudGltZSBvciBwYXlsb2FkIHdoZW4gdGhhdCBmZWF0dXJlIGlzIG5vdCB1c2VkLlxuICpcbiAqIFRoZSBzdHJhdGVneSBpcyB0byBpbnRyb2R1Y2UgYSBgQXN5bmNEaXJlY3RpdmVgIHN1YmNsYXNzIG9mXG4gKiBgRGlyZWN0aXZlYCB0aGF0IGNsaW1icyB0aGUgXCJwYXJlbnRcIiB0cmVlIGluIGl0cyBjb25zdHJ1Y3RvciB0byBub3RlIHdoaWNoXG4gKiBicmFuY2hlcyBvZiBsaXQtaHRtbCdzIFwibG9naWNhbCB0cmVlXCIgb2YgZGF0YSBzdHJ1Y3R1cmVzIGNvbnRhaW4gc3VjaFxuICogZGlyZWN0aXZlcyBhbmQgdGh1cyBuZWVkIHRvIGJlIGNyYXdsZWQgd2hlbiBhIHN1YnRyZWUgaXMgYmVpbmcgY2xlYXJlZCAob3JcbiAqIG1hbnVhbGx5IGRpc2Nvbm5lY3RlZCkgaW4gb3JkZXIgdG8gcnVuIHRoZSBgZGlzY29ubmVjdGVkYCBjYWxsYmFjay5cbiAqXG4gKiBUaGUgXCJub2Rlc1wiIG9mIHRoZSBsb2dpY2FsIHRyZWUgaW5jbHVkZSBQYXJ0cywgVGVtcGxhdGVJbnN0YW5jZXMgKGZvciB3aGVuIGFcbiAqIFRlbXBsYXRlUmVzdWx0IGlzIGNvbW1pdHRlZCB0byBhIHZhbHVlIG9mIGEgQ2hpbGRQYXJ0KSwgYW5kIERpcmVjdGl2ZXM7IHRoZXNlXG4gKiBhbGwgaW1wbGVtZW50IGEgY29tbW9uIGludGVyZmFjZSBjYWxsZWQgYERpc2Nvbm5lY3RhYmxlQ2hpbGRgLiBFYWNoIGhhcyBhXG4gKiBgXyRwYXJlbnRgIHJlZmVyZW5jZSB3aGljaCBpcyBzZXQgZHVyaW5nIGNvbnN0cnVjdGlvbiBpbiB0aGUgY29yZSBjb2RlLCBhbmQgYVxuICogYF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbmAgZmllbGQgd2hpY2ggaXMgaW5pdGlhbGx5IHVuZGVmaW5lZC5cbiAqXG4gKiBUaGUgc3BhcnNlIHRyZWUgY3JlYXRlZCBieSBtZWFucyBvZiB0aGUgYEFzeW5jRGlyZWN0aXZlYCBjb25zdHJ1Y3RvclxuICogY3Jhd2xpbmcgdXAgdGhlIGBfJHBhcmVudGAgdHJlZSBhbmQgcGxhY2luZyBhIGBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW5gIFNldFxuICogb24gZWFjaCBwYXJlbnQgdGhhdCBpbmNsdWRlcyBlYWNoIGNoaWxkIHRoYXQgY29udGFpbnMgYVxuICogYEFzeW5jRGlyZWN0aXZlYCBkaXJlY3RseSBvciB0cmFuc2l0aXZlbHkgdmlhIGl0cyBjaGlsZHJlbi4gSW4gb3JkZXIgdG9cbiAqIG5vdGlmeSBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZXMgYW5kIGRpc2Nvbm5lY3QgKG9yIHJlY29ubmVjdCkgYSB0cmVlLCB0aGVcbiAqIGBfJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkYCBBUEkgaXMgcGF0Y2hlZCBvbnRvIENoaWxkUGFydHMgYXMgYSBkaXJlY3RpdmVcbiAqIGNsaW1icyB0aGUgcGFyZW50IHRyZWUsIHdoaWNoIGlzIGNhbGxlZCBieSB0aGUgY29yZSB3aGVuIGNsZWFyaW5nIGEgcGFydCBpZlxuICogaXQgZXhpc3RzLiBXaGVuIGNhbGxlZCwgdGhhdCBtZXRob2QgaXRlcmF0ZXMgb3ZlciB0aGUgc3BhcnNlIHRyZWUgb2ZcbiAqIFNldDxEaXNjb25uZWN0YWJsZUNoaWxkcmVuPiBidWlsdCB1cCBieSBBc3luY0RpcmVjdGl2ZXMsIGFuZCBjYWxsc1xuICogYF8kbm90aWZ5RGlyZWN0aXZlQ29ubmVjdGlvbkNoYW5nZWRgIG9uIGFueSBkaXJlY3RpdmVzIHRoYXQgYXJlIGVuY291bnRlcmVkXG4gKiBpbiB0aGF0IHRyZWUsIHJ1bm5pbmcgdGhlIHJlcXVpcmVkIGNhbGxiYWNrcy5cbiAqXG4gKiBBIGdpdmVuIFwibG9naWNhbCB0cmVlXCIgb2YgbGl0LWh0bWwgZGF0YS1zdHJ1Y3R1cmVzIG1pZ2h0IGxvb2sgbGlrZSB0aGlzOlxuICpcbiAqICBDaGlsZFBhcnQoTjEpIF8kZEM9W0QyLFQzXVxuICogICAuX2RpcmVjdGl2ZVxuICogICAgIEFzeW5jRGlyZWN0aXZlKEQyKVxuICogICAuX3ZhbHVlIC8vIHVzZXIgdmFsdWUgd2FzIFRlbXBsYXRlUmVzdWx0XG4gKiAgICAgVGVtcGxhdGVJbnN0YW5jZShUMykgXyRkQz1bQTQsQTYsTjEwLE4xMl1cbiAqICAgICAgLl8kcGFydHNbXVxuICogICAgICAgIEF0dHJpYnV0ZVBhcnQoQTQpIF8kZEM9W0Q1XVxuICogICAgICAgICAuX2RpcmVjdGl2ZXNbXVxuICogICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQ1KVxuICogICAgICAgIEF0dHJpYnV0ZVBhcnQoQTYpIF8kZEM9W0Q3LEQ4XVxuICogICAgICAgICAuX2RpcmVjdGl2ZXNbXVxuICogICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQ3KVxuICogICAgICAgICAgIERpcmVjdGl2ZShEOCkgXyRkQz1bRDldXG4gKiAgICAgICAgICAgIC5fZGlyZWN0aXZlXG4gKiAgICAgICAgICAgICAgQXN5bmNEaXJlY3RpdmUoRDkpXG4gKiAgICAgICAgQ2hpbGRQYXJ0KE4xMCkgXyRkQz1bRDExXVxuICogICAgICAgICAuX2RpcmVjdGl2ZVxuICogICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQxMSlcbiAqICAgICAgICAgLl92YWx1ZVxuICogICAgICAgICAgIHN0cmluZ1xuICogICAgICAgIENoaWxkUGFydChOMTIpIF8kZEM9W0QxMyxOMTQsTjE2XVxuICogICAgICAgICAuX2RpcmVjdGl2ZVxuICogICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQxMylcbiAqICAgICAgICAgLl92YWx1ZSAvLyB1c2VyIHZhbHVlIHdhcyBpdGVyYWJsZVxuICogICAgICAgICAgIEFycmF5PENoaWxkUGFydD5cbiAqICAgICAgICAgICAgIENoaWxkUGFydChOMTQpIF8kZEM9W0QxNV1cbiAqICAgICAgICAgICAgICAuX3ZhbHVlXG4gKiAgICAgICAgICAgICAgICBzdHJpbmdcbiAqICAgICAgICAgICAgIENoaWxkUGFydChOMTYpIF8kZEM9W0QxNyxUMThdXG4gKiAgICAgICAgICAgICAgLl9kaXJlY3RpdmVcbiAqICAgICAgICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQxNylcbiAqICAgICAgICAgICAgICAuX3ZhbHVlIC8vIHVzZXIgdmFsdWUgd2FzIFRlbXBsYXRlUmVzdWx0XG4gKiAgICAgICAgICAgICAgICBUZW1wbGF0ZUluc3RhbmNlKFQxOCkgXyRkQz1bQTE5LEEyMSxOMjVdXG4gKiAgICAgICAgICAgICAgICAgLl8kcGFydHNbXVxuICogICAgICAgICAgICAgICAgICAgQXR0cmlidXRlUGFydChBMTkpIF8kZEM9W0QyMF1cbiAqICAgICAgICAgICAgICAgICAgICAuX2RpcmVjdGl2ZXNbXVxuICogICAgICAgICAgICAgICAgICAgICAgQXN5bmNEaXJlY3RpdmUoRDIwKVxuICogICAgICAgICAgICAgICAgICAgQXR0cmlidXRlUGFydChBMjEpIF8kZEM9WzIyLDIzXVxuICogICAgICAgICAgICAgICAgICAgIC5fZGlyZWN0aXZlc1tdXG4gKiAgICAgICAgICAgICAgICAgICAgICBBc3luY0RpcmVjdGl2ZShEMjIpXG4gKiAgICAgICAgICAgICAgICAgICAgICBEaXJlY3RpdmUoRDIzKSBfJGRDPVtEMjRdXG4gKiAgICAgICAgICAgICAgICAgICAgICAgLl9kaXJlY3RpdmVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQyNClcbiAqICAgICAgICAgICAgICAgICAgIENoaWxkUGFydChOMjUpIF8kZEM9W0QyNl1cbiAqICAgICAgICAgICAgICAgICAgICAuX2RpcmVjdGl2ZVxuICogICAgICAgICAgICAgICAgICAgICAgQXN5bmNEaXJlY3RpdmUoRDI2KVxuICogICAgICAgICAgICAgICAgICAgIC5fdmFsdWVcbiAqICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1xuICpcbiAqIEV4YW1wbGUgMTogVGhlIGRpcmVjdGl2ZSBpbiBDaGlsZFBhcnQoTjEyKSB1cGRhdGVzIGFuZCByZXR1cm5zIGBub3RoaW5nYC4gVGhlXG4gKiBDaGlsZFBhcnQgd2lsbCBfY2xlYXIoKSBpdHNlbGYsIGFuZCBzbyB3ZSBuZWVkIHRvIGRpc2Nvbm5lY3QgdGhlIFwidmFsdWVcIiBvZlxuICogdGhlIENoaWxkUGFydCAoYnV0IG5vdCBpdHMgZGlyZWN0aXZlKS4gSW4gdGhpcyBjYXNlLCB3aGVuIGBfY2xlYXIoKWAgY2FsbHNcbiAqIGBfJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkKClgLCB3ZSBkb24ndCBpdGVyYXRlIGFsbCBvZiB0aGVcbiAqIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiwgcmF0aGVyIHdlIGRvIGEgdmFsdWUtc3BlY2lmaWMgZGlzY29ubmVjdGlvbjogaS5lLlxuICogc2luY2UgdGhlIF92YWx1ZSB3YXMgYW4gQXJyYXk8Q2hpbGRQYXJ0PiAoYmVjYXVzZSBhbiBpdGVyYWJsZSBoYWQgYmVlblxuICogY29tbWl0dGVkKSwgd2UgaXRlcmF0ZSB0aGUgYXJyYXkgb2YgQ2hpbGRQYXJ0cyAoTjE0LCBOMTYpIGFuZCBydW5cbiAqIGBzZXRDb25uZWN0ZWRgIG9uIHRoZW0gKHdoaWNoIGRvZXMgcmVjdXJzZSBkb3duIHRoZSBmdWxsIHRyZWUgb2ZcbiAqIGBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW5gIGJlbG93IGl0LCBhbmQgYWxzbyByZW1vdmVzIE4xNCBhbmQgTjE2IGZyb20gTjEyJ3NcbiAqIGBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW5gKS4gT25jZSB0aGUgdmFsdWVzIGhhdmUgYmVlbiBkaXNjb25uZWN0ZWQsIHdlIHRoZW5cbiAqIGNoZWNrIHdoZXRoZXIgdGhlIENoaWxkUGFydChOMTIpJ3MgbGlzdCBvZiBgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuYCBpcyBlbXB0eVxuICogKGFuZCB3b3VsZCByZW1vdmUgaXQgZnJvbSBpdHMgcGFyZW50IFRlbXBsYXRlSW5zdGFuY2UoVDMpIGlmIHNvKSwgYnV0IHNpbmNlXG4gKiBpdCB3b3VsZCBzdGlsbCBjb250YWluIGl0cyBkaXJlY3RpdmUgRDEzLCBpdCBzdGF5cyBpbiB0aGUgZGlzY29ubmVjdGFibGVcbiAqIHRyZWUuXG4gKlxuICogRXhhbXBsZSAyOiBJbiB0aGUgY291cnNlIG9mIEV4YW1wbGUgMSwgYHNldENvbm5lY3RlZGAgd2lsbCByZWFjaFxuICogQ2hpbGRQYXJ0KE4xNik7IGluIHRoaXMgY2FzZSB0aGUgZW50aXJlIHBhcnQgaXMgYmVpbmcgZGlzY29ubmVjdGVkLCBzbyB3ZVxuICogc2ltcGx5IGl0ZXJhdGUgYWxsIG9mIE4xNidzIGBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW5gIChEMTcsVDE4KSBhbmRcbiAqIHJlY3Vyc2l2ZWx5IHJ1biBgc2V0Q29ubmVjdGVkYCBvbiB0aGVtLiBOb3RlIHRoYXQgd2Ugb25seSByZW1vdmUgY2hpbGRyZW5cbiAqIGZyb20gYF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbmAgZm9yIHRoZSB0b3AtbGV2ZWwgdmFsdWVzIGJlaW5nIGRpc2Nvbm5lY3RlZFxuICogb24gYSBjbGVhcjsgZG9pbmcgdGhpcyBib29ra2VlcGluZyBsb3dlciBpbiB0aGUgdHJlZSBpcyB3YXN0ZWZ1bCBzaW5jZSBpdCdzXG4gKiBhbGwgYmVpbmcgdGhyb3duIGF3YXkuXG4gKlxuICogRXhhbXBsZSAzOiBJZiB0aGUgTGl0RWxlbWVudCBjb250YWluaW5nIHRoZSBlbnRpcmUgdHJlZSBhYm92ZSBiZWNvbWVzXG4gKiBkaXNjb25uZWN0ZWQsIGl0IHdpbGwgcnVuIGBjaGlsZFBhcnQuc2V0Q29ubmVjdGVkKClgICh3aGljaCBjYWxsc1xuICogYGNoaWxkUGFydC5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkKClgIGlmIGl0IGV4aXN0cyk7IGluIHRoaXMgY2FzZSwgd2VcbiAqIHJlY3Vyc2l2ZWx5IHJ1biBgc2V0Q29ubmVjdGVkKClgIG92ZXIgdGhlIGVudGlyZSB0cmVlLCB3aXRob3V0IHJlbW92aW5nIGFueVxuICogY2hpbGRyZW4gZnJvbSBgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuYCwgc2luY2UgdGhpcyB0cmVlIGlzIHJlcXVpcmVkIHRvXG4gKiByZS1jb25uZWN0IHRoZSB0cmVlLCB3aGljaCBkb2VzIHRoZSBzYW1lIG9wZXJhdGlvbiwgc2ltcGx5IHBhc3NpbmdcbiAqIGBpc0Nvbm5lY3RlZDogdHJ1ZWAgZG93biB0aGUgdHJlZSwgc2lnbmFsaW5nIHdoaWNoIGNhbGxiYWNrIHRvIHJ1bi5cbiAqL1xuXG5pbXBvcnQge0F0dHJpYnV0ZVBhcnQsIENoaWxkUGFydCwgRGlzY29ubmVjdGFibGUsIFBhcnR9IGZyb20gJy4vbGl0LWh0bWwuanMnO1xuaW1wb3J0IHtpc1NpbmdsZUV4cHJlc3Npb259IGZyb20gJy4vZGlyZWN0aXZlLWhlbHBlcnMuanMnO1xuaW1wb3J0IHtEaXJlY3RpdmUsIFBhcnRJbmZvLCBQYXJ0VHlwZX0gZnJvbSAnLi9kaXJlY3RpdmUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9kaXJlY3RpdmUuanMnO1xuXG5jb25zdCBERVZfTU9ERSA9IHRydWU7XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgd2Fsa3MgZG93biB0aGUgdHJlZSBvZiBQYXJ0cy9UZW1wbGF0ZUluc3RhbmNlcy9EaXJlY3RpdmVzIHRvIHNldFxuICogdGhlIGNvbm5lY3RlZCBzdGF0ZSBvZiBkaXJlY3RpdmVzIGFuZCBydW4gYGRpc2Nvbm5lY3RlZGAvIGByZWNvbm5lY3RlZGBcbiAqIGNhbGxiYWNrcy5cbiAqXG4gKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgd2VyZSBjaGlsZHJlbiB0byBkaXNjb25uZWN0OyBmYWxzZSBvdGhlcndpc2VcbiAqL1xuY29uc3Qgbm90aWZ5Q2hpbGRyZW5Db25uZWN0ZWRDaGFuZ2VkID0gKFxuICBwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlLFxuICBpc0Nvbm5lY3RlZDogYm9vbGVhblxuKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGNoaWxkcmVuID0gcGFyZW50Ll8kZGlzY29ubmVjdGFibGVDaGlsZHJlbjtcbiAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChjb25zdCBvYmogb2YgY2hpbGRyZW4pIHtcbiAgICAvLyBUaGUgZXhpc3RlbmNlIG9mIGBfJG5vdGlmeURpcmVjdGl2ZUNvbm5lY3Rpb25DaGFuZ2VkYCBpcyB1c2VkIGFzIGEgXCJicmFuZFwiIHRvXG4gICAgLy8gZGlzYW1iaWd1YXRlIEFzeW5jRGlyZWN0aXZlcyBmcm9tIG90aGVyIERpc2Nvbm5lY3RhYmxlQ2hpbGRyZW5cbiAgICAvLyAoYXMgb3Bwb3NlZCB0byB1c2luZyBhbiBpbnN0YW5jZW9mIGNoZWNrIHRvIGtub3cgd2hlbiB0byBjYWxsIGl0KTsgdGhlXG4gICAgLy8gcmVkdW5kYW5jeSBvZiBcIkRpcmVjdGl2ZVwiIGluIHRoZSBBUEkgbmFtZSBpcyB0byBhdm9pZCBjb25mbGljdGluZyB3aXRoXG4gICAgLy8gYF8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWRgLCB3aGljaCBleGlzdHMgYENoaWxkUGFydHNgIHdoaWNoIGFyZSBhbHNvIGluXG4gICAgLy8gdGhpcyBsaXN0XG4gICAgLy8gRGlzY29ubmVjdCBEaXJlY3RpdmUgKGFuZCBhbnkgbmVzdGVkIGRpcmVjdGl2ZXMgY29udGFpbmVkIHdpdGhpbilcbiAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgIChvYmogYXMgQXN5bmNEaXJlY3RpdmUpWydfJG5vdGlmeURpcmVjdGl2ZUNvbm5lY3Rpb25DaGFuZ2VkJ10/LihcbiAgICAgIGlzQ29ubmVjdGVkLFxuICAgICAgZmFsc2VcbiAgICApO1xuICAgIC8vIERpc2Nvbm5lY3QgUGFydC9UZW1wbGF0ZUluc3RhbmNlXG4gICAgbm90aWZ5Q2hpbGRyZW5Db25uZWN0ZWRDaGFuZ2VkKG9iaiwgaXNDb25uZWN0ZWQpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBnaXZlbiBjaGlsZCBmcm9tIGl0cyBwYXJlbnQgbGlzdCBvZiBkaXNjb25uZWN0YWJsZSBjaGlsZHJlbiwgYW5kXG4gKiBpZiB0aGUgcGFyZW50IGxpc3QgYmVjb21lcyBlbXB0eSBhcyBhIHJlc3VsdCwgcmVtb3ZlcyB0aGUgcGFyZW50IGZyb20gaXRzXG4gKiBwYXJlbnQsIGFuZCBzbyBmb3J0aCB1cCB0aGUgdHJlZSB3aGVuIHRoYXQgY2F1c2VzIHN1YnNlcXVlbnQgcGFyZW50IGxpc3RzIHRvXG4gKiBiZWNvbWUgZW1wdHkuXG4gKi9cbmNvbnN0IHJlbW92ZURpc2Nvbm5lY3RhYmxlRnJvbVBhcmVudCA9IChvYmo6IERpc2Nvbm5lY3RhYmxlKSA9PiB7XG4gIGxldCBwYXJlbnQsIGNoaWxkcmVuO1xuICBkbyB7XG4gICAgaWYgKChwYXJlbnQgPSBvYmouXyRwYXJlbnQpID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjaGlsZHJlbiA9IHBhcmVudC5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4hO1xuICAgIGNoaWxkcmVuLmRlbGV0ZShvYmopO1xuICAgIG9iaiA9IHBhcmVudDtcbiAgfSB3aGlsZSAoY2hpbGRyZW4/LnNpemUgPT09IDApO1xufTtcblxuY29uc3QgYWRkRGlzY29ubmVjdGFibGVUb1BhcmVudCA9IChvYmo6IERpc2Nvbm5lY3RhYmxlKSA9PiB7XG4gIC8vIENsaW1iIHRoZSBwYXJlbnQgdHJlZSwgY3JlYXRpbmcgYSBzcGFyc2UgdHJlZSBvZiBjaGlsZHJlbiBuZWVkaW5nXG4gIC8vIGRpc2Nvbm5lY3Rpb25cbiAgZm9yIChsZXQgcGFyZW50OyAocGFyZW50ID0gb2JqLl8kcGFyZW50KTsgb2JqID0gcGFyZW50KSB7XG4gICAgbGV0IGNoaWxkcmVuID0gcGFyZW50Ll8kZGlzY29ubmVjdGFibGVDaGlsZHJlbjtcbiAgICBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyZW50Ll8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiA9IGNoaWxkcmVuID0gbmV3IFNldCgpO1xuICAgIH0gZWxzZSBpZiAoY2hpbGRyZW4uaGFzKG9iaikpIHtcbiAgICAgIC8vIE9uY2Ugd2UndmUgcmVhY2hlZCBhIHBhcmVudCB0aGF0IGFscmVhZHkgY29udGFpbnMgdGhpcyBjaGlsZCwgd2VcbiAgICAgIC8vIGNhbiBzaG9ydC1jaXJjdWl0XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2hpbGRyZW4uYWRkKG9iaik7XG4gICAgaW5zdGFsbERpc2Nvbm5lY3RBUEkocGFyZW50KTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGFuZ2VzIHRoZSBwYXJlbnQgcmVmZXJlbmNlIG9mIHRoZSBDaGlsZFBhcnQsIGFuZCB1cGRhdGVzIHRoZSBzcGFyc2UgdHJlZSBvZlxuICogRGlzY29ubmVjdGFibGUgY2hpbGRyZW4gYWNjb3JkaW5nbHkuXG4gKlxuICogTm90ZSwgdGhpcyBtZXRob2Qgd2lsbCBiZSBwYXRjaGVkIG9udG8gQ2hpbGRQYXJ0IGluc3RhbmNlcyBhbmQgY2FsbGVkIGZyb21cbiAqIHRoZSBjb3JlIGNvZGUgd2hlbiBwYXJ0cyBhcmUgbW92ZWQgYmV0d2VlbiBkaWZmZXJlbnQgcGFyZW50cy5cbiAqL1xuZnVuY3Rpb24gcmVwYXJlbnREaXNjb25uZWN0YWJsZXModGhpczogQ2hpbGRQYXJ0LCBuZXdQYXJlbnQ6IERpc2Nvbm5lY3RhYmxlKSB7XG4gIGlmICh0aGlzLl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50KHRoaXMpO1xuICAgIHRoaXMuXyRwYXJlbnQgPSBuZXdQYXJlbnQ7XG4gICAgYWRkRGlzY29ubmVjdGFibGVUb1BhcmVudCh0aGlzKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl8kcGFyZW50ID0gbmV3UGFyZW50O1xuICB9XG59XG5cbi8qKlxuICogU2V0cyB0aGUgY29ubmVjdGVkIHN0YXRlIG9uIGFueSBkaXJlY3RpdmVzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGNvbW1pdHRlZFxuICogdmFsdWUgb2YgdGhpcyBwYXJ0IChpLmUuIHdpdGhpbiBhIFRlbXBsYXRlSW5zdGFuY2Ugb3IgaXRlcmFibGUgb2ZcbiAqIENoaWxkUGFydHMpIGFuZCBydW5zIHRoZWlyIGBkaXNjb25uZWN0ZWRgL2ByZWNvbm5lY3RlZGBzLCBhcyB3ZWxsIGFzIHdpdGhpblxuICogYW55IGRpcmVjdGl2ZXMgc3RvcmVkIG9uIHRoZSBDaGlsZFBhcnQgKHdoZW4gYHZhbHVlT25seWAgaXMgZmFsc2UpLlxuICpcbiAqIGBpc0NsZWFyaW5nVmFsdWVgIHNob3VsZCBiZSBwYXNzZWQgYXMgYHRydWVgIG9uIGEgdG9wLWxldmVsIHBhcnQgdGhhdCBpc1xuICogY2xlYXJpbmcgaXRzZWxmLCBhbmQgbm90IGFzIGEgcmVzdWx0IG9mIHJlY3Vyc2l2ZWx5IGRpc2Nvbm5lY3RpbmcgZGlyZWN0aXZlc1xuICogYXMgcGFydCBvZiBhIGBjbGVhcmAgb3BlcmF0aW9uIGhpZ2hlciB1cCB0aGUgdHJlZS4gVGhpcyBib3RoIGVuc3VyZXMgdGhhdCBhbnlcbiAqIGRpcmVjdGl2ZSBvbiB0aGlzIENoaWxkUGFydCB0aGF0IHByb2R1Y2VkIGEgdmFsdWUgdGhhdCBjYXVzZWQgdGhlIGNsZWFyXG4gKiBvcGVyYXRpb24gaXMgbm90IGRpc2Nvbm5lY3RlZCwgYW5kIGFsc28gc2VydmVzIGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uXG4gKiB0byBhdm9pZCBuZWVkbGVzcyBib29ra2VlcGluZyB3aGVuIGEgc3VidHJlZSBpcyBnb2luZyBhd2F5OyB3aGVuIGNsZWFyaW5nIGFcbiAqIHN1YnRyZWUsIG9ubHkgdGhlIHRvcC1tb3N0IHBhcnQgbmVlZCB0byByZW1vdmUgaXRzZWxmIGZyb20gdGhlIHBhcmVudC5cbiAqXG4gKiBgZnJvbVBhcnRJbmRleGAgaXMgcGFzc2VkIG9ubHkgaW4gdGhlIGNhc2Ugb2YgYSBwYXJ0aWFsIGBfY2xlYXJgIHJ1bm5pbmcgYXMgYVxuICogcmVzdWx0IG9mIHRydW5jYXRpbmcgYW4gaXRlcmFibGUuXG4gKlxuICogTm90ZSwgdGhpcyBtZXRob2Qgd2lsbCBiZSBwYXRjaGVkIG9udG8gQ2hpbGRQYXJ0IGluc3RhbmNlcyBhbmQgY2FsbGVkIGZyb20gdGhlXG4gKiBjb3JlIGNvZGUgd2hlbiBwYXJ0cyBhcmUgY2xlYXJlZCBvciB0aGUgY29ubmVjdGlvbiBzdGF0ZSBpcyBjaGFuZ2VkIGJ5IHRoZVxuICogdXNlci5cbiAqL1xuZnVuY3Rpb24gbm90aWZ5Q2hpbGRQYXJ0Q29ubmVjdGVkQ2hhbmdlZChcbiAgdGhpczogQ2hpbGRQYXJ0LFxuICBpc0Nvbm5lY3RlZDogYm9vbGVhbixcbiAgaXNDbGVhcmluZ1ZhbHVlID0gZmFsc2UsXG4gIGZyb21QYXJ0SW5kZXggPSAwXG4pIHtcbiAgY29uc3QgdmFsdWUgPSB0aGlzLl8kY29tbWl0dGVkVmFsdWU7XG4gIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW47XG4gIGlmIChjaGlsZHJlbiA9PT0gdW5kZWZpbmVkIHx8IGNoaWxkcmVuLnNpemUgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGlzQ2xlYXJpbmdWYWx1ZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgLy8gSXRlcmFibGUgY2FzZTogQW55IENoaWxkUGFydHMgY3JlYXRlZCBieSB0aGUgaXRlcmFibGUgc2hvdWxkIGJlXG4gICAgICAvLyBkaXNjb25uZWN0ZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGlzIENoaWxkUGFydCdzIGRpc2Nvbm5lY3RhYmxlXG4gICAgICAvLyBjaGlsZHJlbiAoc3RhcnRpbmcgYXQgYGZyb21QYXJ0SW5kZXhgIGluIHRoZSBjYXNlIG9mIHRydW5jYXRpb24pXG4gICAgICBmb3IgKGxldCBpID0gZnJvbVBhcnRJbmRleDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5vdGlmeUNoaWxkcmVuQ29ubmVjdGVkQ2hhbmdlZCh2YWx1ZVtpXSwgZmFsc2UpO1xuICAgICAgICByZW1vdmVEaXNjb25uZWN0YWJsZUZyb21QYXJlbnQodmFsdWVbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgLy8gVGVtcGxhdGVJbnN0YW5jZSBjYXNlOiBJZiB0aGUgdmFsdWUgaGFzIGRpc2Nvbm5lY3RhYmxlIGNoaWxkcmVuICh3aWxsXG4gICAgICAvLyBvbmx5IGJlIGluIHRoZSBjYXNlIHRoYXQgaXQgaXMgYSBUZW1wbGF0ZUluc3RhbmNlKSwgd2UgZGlzY29ubmVjdCBpdFxuICAgICAgLy8gYW5kIHJlbW92ZSBpdCBmcm9tIHRoaXMgQ2hpbGRQYXJ0J3MgZGlzY29ubmVjdGFibGUgY2hpbGRyZW5cbiAgICAgIG5vdGlmeUNoaWxkcmVuQ29ubmVjdGVkQ2hhbmdlZCh2YWx1ZSBhcyBEaXNjb25uZWN0YWJsZSwgZmFsc2UpO1xuICAgICAgcmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50KHZhbHVlIGFzIERpc2Nvbm5lY3RhYmxlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5Q2hpbGRyZW5Db25uZWN0ZWRDaGFuZ2VkKHRoaXMsIGlzQ29ubmVjdGVkKTtcbiAgfVxufVxuXG4vKipcbiAqIFBhdGNoZXMgZGlzY29ubmVjdGlvbiBBUEkgb250byBDaGlsZFBhcnRzLlxuICovXG5jb25zdCBpbnN0YWxsRGlzY29ubmVjdEFQSSA9IChvYmo6IERpc2Nvbm5lY3RhYmxlKSA9PiB7XG4gIGlmICgob2JqIGFzIENoaWxkUGFydCkudHlwZSA9PSBQYXJ0VHlwZS5DSElMRCkge1xuICAgIChvYmogYXMgQ2hpbGRQYXJ0KS5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkID8/PVxuICAgICAgbm90aWZ5Q2hpbGRQYXJ0Q29ubmVjdGVkQ2hhbmdlZDtcbiAgICAob2JqIGFzIENoaWxkUGFydCkuXyRyZXBhcmVudERpc2Nvbm5lY3RhYmxlcyA/Pz0gcmVwYXJlbnREaXNjb25uZWN0YWJsZXM7XG4gIH1cbn07XG5cbi8qKlxuICogQW4gYWJzdHJhY3QgYERpcmVjdGl2ZWAgYmFzZSBjbGFzcyB3aG9zZSBgZGlzY29ubmVjdGVkYCBtZXRob2Qgd2lsbCBiZVxuICogY2FsbGVkIHdoZW4gdGhlIHBhcnQgY29udGFpbmluZyB0aGUgZGlyZWN0aXZlIGlzIGNsZWFyZWQgYXMgYSByZXN1bHQgb2ZcbiAqIHJlLXJlbmRlcmluZywgb3Igd2hlbiB0aGUgdXNlciBjYWxscyBgcGFydC5zZXRDb25uZWN0ZWQoZmFsc2UpYCBvblxuICogYSBwYXJ0IHRoYXQgd2FzIHByZXZpb3VzbHkgcmVuZGVyZWQgY29udGFpbmluZyB0aGUgZGlyZWN0aXZlIChhcyBoYXBwZW5zXG4gKiB3aGVuIGUuZy4gYSBMaXRFbGVtZW50IGRpc2Nvbm5lY3RzIGZyb20gdGhlIERPTSkuXG4gKlxuICogSWYgYHBhcnQuc2V0Q29ubmVjdGVkKHRydWUpYCBpcyBzdWJzZXF1ZW50bHkgY2FsbGVkIG9uIGFcbiAqIGNvbnRhaW5pbmcgcGFydCwgdGhlIGRpcmVjdGl2ZSdzIGByZWNvbm5lY3RlZGAgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHByaW9yXG4gKiB0byBpdHMgbmV4dCBgdXBkYXRlYC9gcmVuZGVyYCBjYWxsYmFja3MuIFdoZW4gaW1wbGVtZW50aW5nIGBkaXNjb25uZWN0ZWRgLFxuICogYHJlY29ubmVjdGVkYCBzaG91bGQgYWxzbyBiZSBpbXBsZW1lbnRlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggcmVjb25uZWN0aW9uLlxuICpcbiAqIE5vdGUgdGhhdCB1cGRhdGVzIG1heSBvY2N1ciB3aGlsZSB0aGUgZGlyZWN0aXZlIGlzIGRpc2Nvbm5lY3RlZC4gQXMgc3VjaCxcbiAqIGRpcmVjdGl2ZXMgc2hvdWxkIGdlbmVyYWxseSBjaGVjayB0aGUgYHRoaXMuaXNDb25uZWN0ZWRgIGZsYWcgZHVyaW5nXG4gKiByZW5kZXIvdXBkYXRlIHRvIGRldGVybWluZSB3aGV0aGVyIGl0IGlzIHNhZmUgdG8gc3Vic2NyaWJlIHRvIHJlc291cmNlc1xuICogdGhhdCBtYXkgcHJldmVudCBnYXJiYWdlIGNvbGxlY3Rpb24uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBc3luY0RpcmVjdGl2ZSBleHRlbmRzIERpcmVjdGl2ZSB7XG4gIC8vIEFzIG9wcG9zZWQgdG8gb3RoZXIgRGlzY29ubmVjdGFibGVzLCBBc3luY0RpcmVjdGl2ZXMgYWx3YXlzIGdldCBub3RpZmllZFxuICAvLyB3aGVuIHRoZSBSb290UGFydCBjb25uZWN0aW9uIGNoYW5nZXMsIHNvIHRoZSBwdWJsaWMgYGlzQ29ubmVjdGVkYFxuICAvLyBpcyBhIGxvY2FsbHkgc3RvcmVkIHZhcmlhYmxlIGluaXRpYWxpemVkIHZpYSBpdHMgcGFydCdzIGdldHRlciBhbmQgc3luY2VkXG4gIC8vIHZpYSBgXyRub3RpZnlEaXJlY3RpdmVDb25uZWN0aW9uQ2hhbmdlZGAuIFRoaXMgaXMgY2hlYXBlciB0aGFuIHVzaW5nXG4gIC8vIHRoZSBfJGlzQ29ubmVjdGVkIGdldHRlciwgd2hpY2ggaGFzIHRvIGxvb2sgYmFjayB1cCB0aGUgdHJlZSBlYWNoIHRpbWUuXG4gIC8qKlxuICAgKiBUaGUgY29ubmVjdGlvbiBzdGF0ZSBmb3IgdGhpcyBEaXJlY3RpdmUuXG4gICAqL1xuICBpc0Nvbm5lY3RlZCE6IGJvb2xlYW47XG5cbiAgLy8gQGludGVybmFsXG4gIG92ZXJyaWRlIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbj86IFNldDxEaXNjb25uZWN0YWJsZT4gPSB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBwYXJ0IHdpdGggaW50ZXJuYWwgZmllbGRzXG4gICAqIEBwYXJhbSBwYXJ0XG4gICAqIEBwYXJhbSBwYXJlbnRcbiAgICogQHBhcmFtIGF0dHJpYnV0ZUluZGV4XG4gICAqL1xuICBvdmVycmlkZSBfJGluaXRpYWxpemUoXG4gICAgcGFydDogUGFydCxcbiAgICBwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlLFxuICAgIGF0dHJpYnV0ZUluZGV4OiBudW1iZXIgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgc3VwZXIuXyRpbml0aWFsaXplKHBhcnQsIHBhcmVudCwgYXR0cmlidXRlSW5kZXgpO1xuICAgIGFkZERpc2Nvbm5lY3RhYmxlVG9QYXJlbnQodGhpcyk7XG4gICAgdGhpcy5pc0Nvbm5lY3RlZCA9IHBhcnQuXyRpc0Nvbm5lY3RlZDtcbiAgfVxuICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAvKipcbiAgICogQ2FsbGVkIGZyb20gdGhlIGNvcmUgY29kZSB3aGVuIGEgZGlyZWN0aXZlIGlzIGdvaW5nIGF3YXkgZnJvbSBhIHBhcnQgKGluXG4gICAqIHdoaWNoIGNhc2UgYHNob3VsZFJlbW92ZUZyb21QYXJlbnRgIHNob3VsZCBiZSB0cnVlKSwgYW5kIGZyb20gdGhlXG4gICAqIGBzZXRDaGlsZHJlbkNvbm5lY3RlZGAgaGVscGVyIGZ1bmN0aW9uIHdoZW4gcmVjdXJzaXZlbHkgY2hhbmdpbmcgdGhlXG4gICAqIGNvbm5lY3Rpb24gc3RhdGUgb2YgYSB0cmVlIChpbiB3aGljaCBjYXNlIGBzaG91bGRSZW1vdmVGcm9tUGFyZW50YCBzaG91bGRcbiAgICogYmUgZmFsc2UpLlxuICAgKlxuICAgKiBAcGFyYW0gaXNDb25uZWN0ZWRcbiAgICogQHBhcmFtIGlzQ2xlYXJpbmdEaXJlY3RpdmUgLSBUcnVlIHdoZW4gdGhlIGRpcmVjdGl2ZSBpdHNlbGYgaXMgYmVpbmdcbiAgICogICAgIHJlbW92ZWQ7IGZhbHNlIHdoZW4gdGhlIHRyZWUgaXMgYmVpbmcgZGlzY29ubmVjdGVkXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb3ZlcnJpZGUgWydfJG5vdGlmeURpcmVjdGl2ZUNvbm5lY3Rpb25DaGFuZ2VkJ10oXG4gICAgaXNDb25uZWN0ZWQ6IGJvb2xlYW4sXG4gICAgaXNDbGVhcmluZ0RpcmVjdGl2ZSA9IHRydWVcbiAgKSB7XG4gICAgaWYgKGlzQ29ubmVjdGVkICE9PSB0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICB0aGlzLmlzQ29ubmVjdGVkID0gaXNDb25uZWN0ZWQ7XG4gICAgICBpZiAoaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5yZWNvbm5lY3RlZD8uKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RlZD8uKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NsZWFyaW5nRGlyZWN0aXZlKSB7XG4gICAgICBub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQodGhpcywgaXNDb25uZWN0ZWQpO1xuICAgICAgcmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50KHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGlyZWN0aXZlJ3MgUGFydCBvdXRzaWRlIHRoZSBub3JtYWwgYHVwZGF0ZWAvYHJlbmRlcmBcbiAgICogbGlmZWN5Y2xlIG9mIGEgZGlyZWN0aXZlLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBzeW5jaHJvbm91c2x5IGZyb20gYSBkaXJlY3RpdmUncyBgdXBkYXRlYFxuICAgKiBvciBgcmVuZGVyYC5cbiAgICpcbiAgICogQHBhcmFtIGRpcmVjdGl2ZSBUaGUgZGlyZWN0aXZlIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldFxuICAgKi9cbiAgc2V0VmFsdWUodmFsdWU6IHVua25vd24pIHtcbiAgICBpZiAoaXNTaW5nbGVFeHByZXNzaW9uKHRoaXMuX19wYXJ0IGFzIHVua25vd24gYXMgUGFydEluZm8pKSB7XG4gICAgICB0aGlzLl9fcGFydC5fJHNldFZhbHVlKHZhbHVlLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhpcy5fX2F0dHJpYnV0ZUluZGV4IHdpbGwgYmUgZGVmaW5lZCBpbiB0aGlzIGNhc2UsIGJ1dFxuICAgICAgLy8gYXNzZXJ0IGl0IGluIGRldiBtb2RlXG4gICAgICBpZiAoREVWX01PREUgJiYgdGhpcy5fX2F0dHJpYnV0ZUluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCB0aGlzLl9fYXR0cmlidXRlSW5kZXggdG8gYmUgYSBudW1iZXJgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IFsuLi4odGhpcy5fX3BhcnQuXyRjb21taXR0ZWRWYWx1ZSBhcyBBcnJheTx1bmtub3duPildO1xuICAgICAgbmV3VmFsdWVzW3RoaXMuX19hdHRyaWJ1dGVJbmRleCFdID0gdmFsdWU7XG4gICAgICAodGhpcy5fX3BhcnQgYXMgQXR0cmlidXRlUGFydCkuXyRzZXRWYWx1ZShuZXdWYWx1ZXMsIHRoaXMsIDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VyIGNhbGxiYWNrcyBmb3IgaW1wbGVtZW50aW5nIGxvZ2ljIHRvIHJlbGVhc2UgYW55IHJlc291cmNlcy9zdWJzY3JpcHRpb25zXG4gICAqIHRoYXQgbWF5IGhhdmUgYmVlbiByZXRhaW5lZCBieSB0aGlzIGRpcmVjdGl2ZS4gU2luY2UgZGlyZWN0aXZlcyBtYXkgYWxzbyBiZVxuICAgKiByZS1jb25uZWN0ZWQsIGByZWNvbm5lY3RlZGAgc2hvdWxkIGFsc28gYmUgaW1wbGVtZW50ZWQgdG8gcmVzdG9yZSB0aGVcbiAgICogd29ya2luZyBzdGF0ZSBvZiB0aGUgZGlyZWN0aXZlIHByaW9yIHRvIHRoZSBuZXh0IHJlbmRlci5cbiAgICovXG4gIHByb3RlY3RlZCBkaXNjb25uZWN0ZWQoKSB7fVxuICBwcm90ZWN0ZWQgcmVjb25uZWN0ZWQoKSB7fVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuaW1wb3J0IHtub3RoaW5nLCBFbGVtZW50UGFydH0gZnJvbSAnLi4vbGl0LWh0bWwuanMnO1xuaW1wb3J0IHtkaXJlY3RpdmUsIEFzeW5jRGlyZWN0aXZlfSBmcm9tICcuLi9hc3luYy1kaXJlY3RpdmUuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgUmVmIG9iamVjdCwgd2hpY2ggaXMgY29udGFpbmVyIGZvciBhIHJlZmVyZW5jZSB0byBhbiBlbGVtZW50LlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmID0gPFQgPSBFbGVtZW50PigpID0+IG5ldyBSZWY8VD4oKTtcblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBob2xkcyBhIHJlZiB2YWx1ZS5cbiAqL1xuY2xhc3MgUmVmPFQgPSBFbGVtZW50PiB7XG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBFbGVtZW50IHZhbHVlIG9mIHRoZSByZWYsIG9yIGVsc2UgYHVuZGVmaW5lZGAgaWYgdGhlIHJlZiBpcyBub1xuICAgKiBsb25nZXIgcmVuZGVyZWQuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZT86IFQ7XG59XG5cbmV4cG9ydCB0eXBlIHtSZWZ9O1xuXG5pbnRlcmZhY2UgUmVmSW50ZXJuYWwge1xuICB2YWx1ZTogRWxlbWVudCB8IHVuZGVmaW5lZDtcbn1cblxuLy8gV2hlbiBjYWxsYmFja3MgYXJlIHVzZWQgZm9yIHJlZnMsIHRoaXMgbWFwIHRyYWNrcyB0aGUgbGFzdCB2YWx1ZSB0aGUgY2FsbGJhY2tcbi8vIHdhcyBjYWxsZWQgd2l0aCwgZm9yIGVuc3VyaW5nIGEgZGlyZWN0aXZlIGRvZXNuJ3QgY2xlYXIgdGhlIHJlZiBpZiB0aGUgcmVmXG4vLyBoYXMgYWxyZWFkeSBiZWVuIHJlbmRlcmVkIHRvIGEgbmV3IHNwb3QuIEl0IGlzIGRvdWJsZS1rZXllZCBvbiBib3RoIHRoZVxuLy8gY29udGV4dCAoYG9wdGlvbnMuaG9zdGApIGFuZCB0aGUgY2FsbGJhY2ssIHNpbmNlIHdlIGF1dG8tYmluZCBjbGFzcyBtZXRob2RzXG4vLyB0byBgb3B0aW9ucy5ob3N0YC5cbmNvbnN0IGxhc3RFbGVtZW50Rm9yQ29udGV4dEFuZENhbGxiYWNrID0gbmV3IFdlYWtNYXA8XG4gIG9iamVjdCxcbiAgV2Vha01hcDxGdW5jdGlvbiwgRWxlbWVudCB8IHVuZGVmaW5lZD5cbj4oKTtcblxuZXhwb3J0IHR5cGUgUmVmT3JDYWxsYmFjazxUID0gRWxlbWVudD4gPSBSZWY8VD4gfCAoKGVsOiBUIHwgdW5kZWZpbmVkKSA9PiB2b2lkKTtcblxuY2xhc3MgUmVmRGlyZWN0aXZlIGV4dGVuZHMgQXN5bmNEaXJlY3RpdmUge1xuICBwcml2YXRlIF9lbGVtZW50PzogRWxlbWVudDtcbiAgcHJpdmF0ZSBfcmVmPzogUmVmT3JDYWxsYmFjaztcbiAgcHJpdmF0ZSBfY29udGV4dD86IG9iamVjdDtcblxuICByZW5kZXIoX3JlZj86IFJlZk9yQ2FsbGJhY2spIHtcbiAgICByZXR1cm4gbm90aGluZztcbiAgfVxuXG4gIG92ZXJyaWRlIHVwZGF0ZShwYXJ0OiBFbGVtZW50UGFydCwgW3JlZl06IFBhcmFtZXRlcnM8dGhpc1sncmVuZGVyJ10+KSB7XG4gICAgY29uc3QgcmVmQ2hhbmdlZCA9IHJlZiAhPT0gdGhpcy5fcmVmO1xuICAgIGlmIChyZWZDaGFuZ2VkICYmIHRoaXMuX3JlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGUgcmVmIHBhc3NlZCB0byB0aGUgZGlyZWN0aXZlIGhhcyBjaGFuZ2VkO1xuICAgICAgLy8gdW5zZXQgdGhlIHByZXZpb3VzIHJlZidzIHZhbHVlXG4gICAgICB0aGlzLl91cGRhdGVSZWZWYWx1ZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAocmVmQ2hhbmdlZCB8fCB0aGlzLl9sYXN0RWxlbWVudEZvclJlZiAhPT0gdGhpcy5fZWxlbWVudCkge1xuICAgICAgLy8gV2UgZWl0aGVyIGdvdCBhIG5ldyByZWYgb3IgdGhpcyBpcyB0aGUgZmlyc3QgcmVuZGVyO1xuICAgICAgLy8gc3RvcmUgdGhlIHJlZi9lbGVtZW50ICYgdXBkYXRlIHRoZSByZWYgdmFsdWVcbiAgICAgIHRoaXMuX3JlZiA9IHJlZjtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSBwYXJ0Lm9wdGlvbnM/Lmhvc3Q7XG4gICAgICB0aGlzLl91cGRhdGVSZWZWYWx1ZSgodGhpcy5fZWxlbWVudCA9IHBhcnQuZWxlbWVudCkpO1xuICAgIH1cbiAgICByZXR1cm4gbm90aGluZztcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVJlZlZhbHVlKGVsZW1lbnQ6IEVsZW1lbnQgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgIGVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5fcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBJZiB0aGUgY3VycmVudCByZWYgd2FzIGNhbGxlZCB3aXRoIGEgcHJldmlvdXMgdmFsdWUsIGNhbGwgd2l0aFxuICAgICAgLy8gYHVuZGVmaW5lZGA7IFdlIGRvIHRoaXMgdG8gZW5zdXJlIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGluIGEgY29uc2lzdGVudFxuICAgICAgLy8gd2F5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhIHJlZiBtaWdodCBiZSBtb3ZpbmcgdXAgaW4gdGhlIHRyZWUgKGluXG4gICAgICAvLyB3aGljaCBjYXNlIGl0IHdvdWxkIG90aGVyd2lzZSBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IHZhbHVlIGJlZm9yZSB0aGVcbiAgICAgIC8vIHByZXZpb3VzIG9uZSB1bnNldHMgaXQpIGFuZCBkb3duIGluIHRoZSB0cmVlICh3aGVyZSBpdCB3b3VsZCBiZSB1bnNldFxuICAgICAgLy8gYmVmb3JlIGJlaW5nIHNldCkuIE5vdGUgdGhhdCBlbGVtZW50IGxvb2t1cCBpcyBrZXllZCBieVxuICAgICAgLy8gYm90aCB0aGUgY29udGV4dCBhbmQgdGhlIGNhbGxiYWNrLCBzaW5jZSB3ZSBhbGxvdyBwYXNzaW5nIHVuYm91bmRcbiAgICAgIC8vIGZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQgb24gb3B0aW9ucy5ob3N0LCBhbmQgd2Ugd2FudCB0byB0cmVhdFxuICAgICAgLy8gdGhlc2UgYXMgdW5pcXVlIFwiaW5zdGFuY2VzXCIgb2YgYSBmdW5jdGlvbi5cbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9jb250ZXh0ID8/IGdsb2JhbFRoaXM7XG4gICAgICBsZXQgbGFzdEVsZW1lbnRGb3JDYWxsYmFjayA9XG4gICAgICAgIGxhc3RFbGVtZW50Rm9yQ29udGV4dEFuZENhbGxiYWNrLmdldChjb250ZXh0KTtcbiAgICAgIGlmIChsYXN0RWxlbWVudEZvckNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGFzdEVsZW1lbnRGb3JDYWxsYmFjayA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIGxhc3RFbGVtZW50Rm9yQ29udGV4dEFuZENhbGxiYWNrLnNldChjb250ZXh0LCBsYXN0RWxlbWVudEZvckNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0RWxlbWVudEZvckNhbGxiYWNrLmdldCh0aGlzLl9yZWYpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fcmVmLmNhbGwodGhpcy5fY29udGV4dCwgdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICAgIGxhc3RFbGVtZW50Rm9yQ2FsbGJhY2suc2V0KHRoaXMuX3JlZiwgZWxlbWVudCk7XG4gICAgICAvLyBDYWxsIHRoZSByZWYgd2l0aCB0aGUgbmV3IGVsZW1lbnQgdmFsdWVcbiAgICAgIGlmIChlbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fcmVmLmNhbGwodGhpcy5fY29udGV4dCwgZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICh0aGlzLl9yZWYgYXMgUmVmSW50ZXJuYWwpIS52YWx1ZSA9IGVsZW1lbnQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2xhc3RFbGVtZW50Rm9yUmVmKCkge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5fcmVmID09PSAnZnVuY3Rpb24nXG4gICAgICA/IGxhc3RFbGVtZW50Rm9yQ29udGV4dEFuZENhbGxiYWNrXG4gICAgICAgICAgLmdldCh0aGlzLl9jb250ZXh0ID8/IGdsb2JhbFRoaXMpXG4gICAgICAgICAgPy5nZXQodGhpcy5fcmVmKVxuICAgICAgOiB0aGlzLl9yZWY/LnZhbHVlO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkKCkge1xuICAgIC8vIE9ubHkgY2xlYXIgdGhlIGJveCBpZiBvdXIgZWxlbWVudCBpcyBzdGlsbCB0aGUgb25lIGluIGl0IChpLmUuIGFub3RoZXJcbiAgICAvLyBkaXJlY3RpdmUgaW5zdGFuY2UgaGFzbid0IHJlbmRlcmVkIGl0cyBlbGVtZW50IHRvIGl0IGJlZm9yZSB1cyk7IHRoYXRcbiAgICAvLyBvbmx5IGhhcHBlbnMgaW4gdGhlIGV2ZW50IG9mIHRoZSBkaXJlY3RpdmUgYmVpbmcgY2xlYXJlZCAobm90IHZpYSBtYW51YWxcbiAgICAvLyBkaXNjb25uZWN0aW9uKVxuICAgIGlmICh0aGlzLl9sYXN0RWxlbWVudEZvclJlZiA9PT0gdGhpcy5fZWxlbWVudCkge1xuICAgICAgdGhpcy5fdXBkYXRlUmVmVmFsdWUodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSByZWNvbm5lY3RlZCgpIHtcbiAgICAvLyBJZiB3ZSB3ZXJlIG1hbnVhbGx5IGRpc2Nvbm5lY3RlZCwgd2UgY2FuIHNhZmVseSBwdXQgb3VyIGVsZW1lbnQgYmFjayBpblxuICAgIC8vIHRoZSBib3gsIHNpbmNlIG5vIHJlbmRlcmluZyBjb3VsZCBoYXZlIG9jY3VycmVkIHRvIGNoYW5nZSBpdHMgc3RhdGVcbiAgICB0aGlzLl91cGRhdGVSZWZWYWx1ZSh0aGlzLl9lbGVtZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIG9mIGEgUmVmIG9iamVjdCBvciBjYWxscyBhIHJlZiBjYWxsYmFjayB3aXRoIHRoZSBlbGVtZW50IGl0J3NcbiAqIGJvdW5kIHRvLlxuICpcbiAqIEEgUmVmIG9iamVjdCBhY3RzIGFzIGEgY29udGFpbmVyIGZvciBhIHJlZmVyZW5jZSB0byBhbiBlbGVtZW50LiBBIHJlZlxuICogY2FsbGJhY2sgaXMgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGFuIGVsZW1lbnQgYXMgaXRzIG9ubHkgYXJndW1lbnQuXG4gKlxuICogVGhlIHJlZiBkaXJlY3RpdmUgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIFJlZiBvYmplY3Qgb3IgY2FsbHMgdGhlIHJlZiBjYWxsYmFja1xuICogZHVyaW5nIHJlbmRlcmluZywgaWYgdGhlIHJlZmVyZW5jZWQgZWxlbWVudCBjaGFuZ2VkLlxuICpcbiAqIE5vdGU6IElmIGEgcmVmIGNhbGxiYWNrIGlzIHJlbmRlcmVkIHRvIGEgZGlmZmVyZW50IGVsZW1lbnQgcG9zaXRpb24gb3IgaXNcbiAqIHJlbW92ZWQgaW4gYSBzdWJzZXF1ZW50IHJlbmRlciwgaXQgd2lsbCBmaXJzdCBiZSBjYWxsZWQgd2l0aCBgdW5kZWZpbmVkYCxcbiAqIGZvbGxvd2VkIGJ5IGFub3RoZXIgY2FsbCB3aXRoIHRoZSBuZXcgZWxlbWVudCBpdCB3YXMgcmVuZGVyZWQgdG8gKGlmIGFueSkuXG4gKlxuICogYGBganNcbiAqIC8vIFVzaW5nIFJlZiBvYmplY3RcbiAqIGNvbnN0IGlucHV0UmVmID0gY3JlYXRlUmVmKCk7XG4gKiByZW5kZXIoaHRtbGA8aW5wdXQgJHtyZWYoaW5wdXRSZWYpfT5gLCBjb250YWluZXIpO1xuICogaW5wdXRSZWYudmFsdWUuZm9jdXMoKTtcbiAqXG4gKiAvLyBVc2luZyBjYWxsYmFja1xuICogY29uc3QgY2FsbGJhY2sgPSAoaW5wdXRFbGVtZW50KSA9PiBpbnB1dEVsZW1lbnQuZm9jdXMoKTtcbiAqIHJlbmRlcihodG1sYDxpbnB1dCAke3JlZihjYWxsYmFjayl9PmAsIGNvbnRhaW5lcik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHJlZiA9IGRpcmVjdGl2ZShSZWZEaXJlY3RpdmUpO1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHRoZSBjbGFzcyB0aGF0IHBvd2VycyB0aGlzIGRpcmVjdGl2ZS4gTmVjZXNzYXJ5IGZvciBuYW1pbmcgdGhlXG4gKiBkaXJlY3RpdmUncyByZXR1cm4gdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUge1JlZkRpcmVjdGl2ZX07XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB9XG4gIFtwYXJ0PSdjb3JyZWN0J10ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTEpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMS4xcmVtO1xuICAgIG1pbi13aWR0aDogMS4xcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0yKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDIuM3JlbTtcbiAgICBtaW4td2lkdGg6IDIuM3JlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMykgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAzLjNyZW07XG4gICAgbWluLXdpZHRoOiAzLjNyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTQpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogNC4ycmVtO1xuICAgIG1pbi13aWR0aDogNC4ycmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC02KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDYuNnJlbTtcbiAgICBtaW4td2lkdGg6IDYuNnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMTApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogOHJlbTtcbiAgICBtaW4td2lkdGg6IDhyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTE1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDEycmVtO1xuICAgIG1pbi13aWR0aDogMTJyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTIwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDE3cmVtO1xuICAgIG1pbi13aWR0aDogMTdyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTI1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDIwcmVtO1xuICAgIG1pbi13aWR0aDogMjByZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTMwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDI0cmVtO1xuICAgIG1pbi13aWR0aDogMjRyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTM1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDI4cmVtO1xuICAgIG1pbi13aWR0aDogMjhyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTQwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDMycmVtO1xuICAgIG1pbi13aWR0aDogMzJyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTQ1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDM2cmVtO1xuICAgIG1pbi13aWR0aDogMzZyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTUwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDQwcmVtO1xuICAgIG1pbi13aWR0aDogNDByZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTcyKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDU3cmVtO1xuICAgIG1pbi13aWR0aDogNTdyZW07XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgQ1NTUmVzdWx0R3JvdXAsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaWZEZWZpbmVkIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvaWYtZGVmaW5lZC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVSZWYgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZWYuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uLnN0eWxlcyc7XG5AY3VzdG9tRWxlbWVudCgncXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVRleHRFbnRyeUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ2V4cGVjdGVkLWxlbmd0aCcgfSkgZXhwZWN0ZWRMZW5ndGg6IG51bWJlcjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BhdHRlcm4tbWFzaycgfSkgcGF0dGVybk1hc2s6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BsYWNlaG9sZGVyLXRleHQnIH0pIHBsYWNlaG9sZGVyVGV4dDogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YS1wYXR0ZXJubWFzay1tZXNzYWdlJyB9KSBkYXRhUGF0dGVybm1hc2tNZXNzYWdlOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcblxuICBpbnB1dFJlZiA9IGNyZWF0ZVJlZjxIVE1MSW5wdXRFbGVtZW50PigpO1xuXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbDtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQodGhpcy5yZXNwb25zZUlkZW50aWZpZXIsIHZhbCk7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKGZvcm1EYXRhKTtcbiAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHZhbGlkYXRlKCkge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgaWYgKCFpbnB1dCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLnBhdHRlcm5NYXNrICYmIHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSkge1xuICAgICAgLy8gQ2xlYXIgYW55IGN1c3RvbSBlcnJvciBpZiB0aGUgaW5wdXQgaXMgdmFsaWRcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eSh7fSk7XG4gICAgICBpbnB1dC5zZXRDdXN0b21WYWxpZGl0eSgnJyk7IC8vIENsZWFyIHRoZSBjdXN0b20gbWVzc2FnZVxuICAgICAgY29uc3QgaXNWYWxpZCA9IGlucHV0LmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAvLyBTZXQgY3VzdG9tIGVycm9yIGlmIGludmFsaWRcbiAgICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KHsgY3VzdG9tRXJyb3I6IHRydWUgfSwgdGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKTtcbiAgICAgICAgaW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkodGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKTsgLy8gU2V0IGN1c3RvbSBtZXNzYWdlIG9ubHkgaWYgaW52YWxpZFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gaW5wdXQuY2hlY2tWYWxpZGl0eSgpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KGlzVmFsaWQgPyB7fSA6IHsgY3VzdG9tRXJyb3I6IGZhbHNlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgIT09ICcnICYmIGlucHV0LmNoZWNrVmFsaWRpdHkoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxpbnB1dFxuICAgICAgICBwYXJ0PVwiaW5wdXRcIlxuICAgICAgICBuYW1lPVwiJHt0aGlzLnJlc3BvbnNlSWRlbnRpZmllcn1cIlxuICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBAYmx1cj1cIiR7KGV2ZW50OiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICB9fVwiXG4gICAgICAgIEBrZXlkb3duPVwiJHtldmVudCA9PiBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1cIlxuICAgICAgICBAa2V5dXA9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgQGNoYW5nZT1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICB0eXBlPVwiJHt0aGlzLnBhdHRlcm5NYXNrID09ICdbMC05XSonID8gJ251bWJlcicgOiAndGV4dCd9XCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCIke2lmRGVmaW5lZCh0aGlzLnBsYWNlaG9sZGVyVGV4dCA/IHRoaXMucGxhY2Vob2xkZXJUZXh0IDogdW5kZWZpbmVkKX1cIlxuICAgICAgICAudmFsdWU9XCIke3RoaXMuX3ZhbHVlfVwiXG4gICAgICAgIHBhdHRlcm49XCIke2lmRGVmaW5lZCh0aGlzLnBhdHRlcm5NYXNrID8gdGhpcy5wYXR0ZXJuTWFzayA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgbWF4bGVuZ3RoPSR7MTAwMH1cbiAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkfVwiXG4gICAgICAgID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIlxuICAgICAgLz5cbiAgICAgIDxkaXYgcGFydD1cImNvcnJlY3RcIj4ke3RoaXMuX2NvcnJlY3RSZXNwb25zZX08L2Rpdj5cbiAgICBgO1xuICB9XG4gIHByb3RlY3RlZCB0ZXh0Q2hhbmdlZChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICB0aGlzLnNldEVtcHR5QXR0cmlidXRlKGlucHV0LnZhbHVlKTtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IGlucHV0LnZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoaW5wdXQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHJlcG9ydFZhbGlkaXR5KCkge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgaWYgKCFpbnB1dCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUnVuIHRoZSB2YWxpZGF0ZSBmdW5jdGlvbiB0byBlbnN1cmUgdGhlIGN1c3RvbSB2YWxpZGl0eSBzdGF0ZSBpcyB1cCB0byBkYXRlXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIGlucHV0LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgfVxuICAgIHJldHVybiBpc1ZhbGlkO1xuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWUgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgc2V0RW1wdHlBdHRyaWJ1dGUodGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2VtcHR5JywgdGV4dCA9PT0gJycgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbic6IFF0aVRleHRFbnRyeUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgcHJvcGVydHksIHF1ZXJ5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxuaW1wb3J0IHsgQ2hvaWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyBJSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbi5pbnRlcmZhY2UnO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5leHBvcnQgdHlwZSBDaG9pY2UgPSBIVE1MRWxlbWVudCAmIENob2ljZUludGVyZmFjZSAmIHsgaW50ZXJuYWxzOiBFbGVtZW50SW50ZXJuYWxzIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hvaWNlc0ludGVyZmFjZSBleHRlbmRzIElJbnRlcmFjdGlvbiB7XG4gIF9jaG9pY2VFbGVtZW50czogQXJyYXk8Q2hvaWNlPjtcbiAgY29ycmVjdFJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNvbnN0IENob2ljZXNNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihzdXBlckNsYXNzOiBULCBzZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIENob2ljZXNNaXhpbkVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIGltcGxlbWVudHMgQ2hvaWNlc0ludGVyZmFjZSB7XG4gICAgcHVibGljIF9jaG9pY2VFbGVtZW50czogQ2hvaWNlW10gPSBbXTtcblxuICAgIEBxdWVyeSgnI3ZhbGlkYXRpb25NZXNzYWdlJylcbiAgICBwcml2YXRlIF92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQhOiBIVE1MRWxlbWVudDtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnbWluLWNob2ljZXMnIH0pXG4gICAgcHVibGljIG1pbkNob2ljZXMgPSAwO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdtYXgtY2hvaWNlcycgfSlcbiAgICBwdWJsaWMgbWF4Q2hvaWNlcyA9IDE7XG5cbiAgICBAd2F0Y2goJ21heENob2ljZXMnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gICAgX2hhbmRsZU1heENob2ljZXNDaGFuZ2UoX29sZFZhbHVlOiBudW1iZXIsIF9uZXdWYWx1ZTogbnVtYmVyKSB7XG4gICAgICB0aGlzLl9kZXRlcm1pbmVJbnB1dFR5cGUoKTtcbiAgICB9XG5cbiAgICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIF9oYW5kbGVEaXNhYmxlZENoYW5nZSA9IChfOiBib29sZWFuLCBkaXNhYmxlZDogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaCA9PiAoY2guZGlzYWJsZWQgPSBkaXNhYmxlZCkpO1xuICAgIH07XG5cbiAgICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIF9oYW5kbGVSZWFkb25seUNoYW5nZSA9IChfOiBib29sZWFuLCByZWFkb25seTogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4gKGNob2ljZS5yZWFkb25seSA9IHJlYWRvbmx5KSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgX3ZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnO1xuXG4gICAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSA/IHRoaXMuX3ZhbHVlLmpvaW4oJywnKSA6IHRoaXMuX3ZhbHVlO1xuICAgIH1cblxuICAgIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgICBpZiAodGhpcy5tYXhDaG9pY2VzID4gMSAmJiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbC5zcGxpdCgnLCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWw7XG4gICAgICB9XG4gICAgICAvLyBBc3N1bWluZyB0aGlzLnZhbHVlIGlzIGFuIGFycmF5IG9mIHN0cmluZ3NcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSkge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICB0aGlzLl92YWx1ZS5mb3JFYWNoKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQodGhpcy5yZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zZXRGb3JtVmFsdWUoZm9ybURhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoaXMudmFsdWUgaXMgbm90IGFuIGFycmF5XG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zZXRGb3JtVmFsdWUodGhpcy5fdmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5fdXBkYXRlQ2hvaWNlU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb3JyZWN0UmVzcG9uc2UoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvcnJlY3RSZXNwb25zZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgIHRoaXMuX2NvcnJlY3RSZXNwb25zZSA9IHZhbHVlO1xuICAgICAgY29uc3QgcmVzcG9uc2VBcnJheSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4ge1xuICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5kZWxldGUoJ2NvcnJlY3QtcmVzcG9uc2UnKTtcbiAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuZGVsZXRlKCdpbmNvcnJlY3QtcmVzcG9uc2UnKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGlmIChyZXNwb25zZUFycmF5LmluY2x1ZGVzKGNob2ljZS5pZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuYWRkKCdjb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmFkZCgnaW5jb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYHJlZ2lzdGVyLSR7c2VsZWN0b3J9YCwgdGhpcy5fcmVnaXN0ZXJDaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihgdW5yZWdpc3Rlci0ke3NlbGVjdG9yfWAsIHRoaXMuX3VucmVnaXN0ZXJDaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihgYWN0aXZhdGUtJHtzZWxlY3Rvcn1gLCB0aGlzLl9jaG9pY2VFbGVtZW50U2VsZWN0ZWRIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYHJlZ2lzdGVyLSR7c2VsZWN0b3J9YCwgdGhpcy5fcmVnaXN0ZXJDaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihgdW5yZWdpc3Rlci0ke3NlbGVjdG9yfWAsIHRoaXMuX3VucmVnaXN0ZXJDaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihgYWN0aXZhdGUtJHtzZWxlY3Rvcn1gLCB0aGlzLl9jaG9pY2VFbGVtZW50U2VsZWN0ZWRIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBzZWxlY3RlZENob2ljZXMgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maWx0ZXIoY2hvaWNlID0+IHRoaXMuX2dldENob2ljZUNoZWNrZWQoY2hvaWNlKSk7XG4gICAgICBjb25zdCBzZWxlY3RlZENvdW50ID0gc2VsZWN0ZWRDaG9pY2VzLmxlbmd0aDtcbiAgICAgIGxldCBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgIGxldCB2YWxpZGl0eU1lc3NhZ2UgPSAnJztcbiAgICAgIGlmICh0aGlzLm1heENob2ljZXMgIT09IDAgJiYgc2VsZWN0ZWRDb3VudCA+IHRoaXMubWF4Q2hvaWNlcykge1xuICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIHZhbGlkaXR5TWVzc2FnZSA9IHRoaXMuZGF0YXNldC5tYXhTZWxlY3Rpb25zTWVzc2FnZSB8fCBgWW91IGNhbiBzZWxlY3QgYXQgbW9zdCAke3RoaXMubWF4Q2hvaWNlc30gY2hvaWNlcy5gO1xuICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZENvdW50IDwgdGhpcy5taW5DaG9pY2VzKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgdmFsaWRpdHlNZXNzYWdlID0gdGhpcy5kYXRhc2V0Lm1pblNlbGVjdGlvbnNNZXNzYWdlIHx8IGBZb3UgbXVzdCBzZWxlY3QgYXQgbGVhc3QgJHt0aGlzLm1pbkNob2ljZXN9IGNob2ljZXMuYDtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdGVkQ2hvaWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eShcbiAgICAgICAgICBpc1ZhbGlkID8ge30gOiB7IGN1c3RvbUVycm9yOiB0cnVlIH0sXG4gICAgICAgICAgdmFsaWRpdHlNZXNzYWdlLFxuICAgICAgICAgIHNlbGVjdGVkQ2hvaWNlc1tzZWxlY3RlZENvdW50IC0gMV0gfHwgdGhpcy5fY2hvaWNlRWxlbWVudHNbMF0gfHwgdGhpc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgcmVwb3J0VmFsaWRpdHkoKSB7XG4gICAgICBpZiAodGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5faW50ZXJuYWxzLnZhbGlkaXR5LnZhbGlkKSB7XG4gICAgICAgICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50LnRleHRDb250ZW50ID0gdGhpcy5faW50ZXJuYWxzLnZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQudGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX2ludGVybmFscy52YWxpZGl0eS52YWxpZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZWdpc3RlckNob2ljZUVsZW1lbnQoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgQ2hvaWNlO1xuICAgICAgY2hvaWNlRWxlbWVudC5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7XG5cblxuICAgICAgXG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5wdXNoKGNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5fc2V0SW5wdXRUeXBlKGNob2ljZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3VucmVnaXN0ZXJDaG9pY2VFbGVtZW50KGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIENob2ljZTtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzID0gdGhpcy5fY2hvaWNlRWxlbWVudHMuZmlsdGVyKGNob2ljZSA9PiBjaG9pY2UgIT09IGNob2ljZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2RldGVybWluZUlucHV0VHlwZSgpIHtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgdGhpcy5fc2V0SW5wdXRUeXBlKGNob2ljZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRJbnB1dFR5cGUoY2hvaWNlRWxlbWVudDogQ2hvaWNlKSB7XG4gICAgICAvLyBjaG9pY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsIHRoaXMubWF4Q2hvaWNlcyA9PT0gMSA/ICdyYWRpbycgOiAnY2hlY2tib3gnKTtcbiAgICAgIGNob2ljZUVsZW1lbnQuaW50ZXJuYWxzLnJvbGUgPSB0aGlzLm1heENob2ljZXMgPT09IDEgPyAncmFkaW8nIDogJ2NoZWNrYm94JztcbiAgICAgIGNob2ljZUVsZW1lbnQuaW50ZXJuYWxzLnN0YXRlcy5hZGQoY2hvaWNlRWxlbWVudC5pbnRlcm5hbHMucm9sZSlcbiAgICAgIC8vIGNob2ljZUVsZW1lbnQuaW50ZXJuYWxzLmFyaWFDaGVja2VkID0gJ2ZhbHNlJztcbiAgICAgIC8vIGNob2ljZUVsZW1lbnQuYXJpYVJlYWRPbmx5ID0gdGhpcy5yZWFkb25seSA9PSB0cnVlID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2Nob2ljZUVsZW1lbnRTZWxlY3RlZEhhbmRsZXIoZXZlbnQ6IEN1c3RvbUV2ZW50PHsgaWRlbnRpZmllcjogc3RyaW5nIH0+KSB7XG4gICAgICB0aGlzLl90b2dnbGVDaG9pY2VDaGVja2VkKGV2ZW50LnRhcmdldCBhcyBDaG9pY2UpO1xuICAgICAgaWYgKHRoaXMubWF4Q2hvaWNlcyA9PT0gMSkge1xuICAgICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiB7XG4gICAgICAgICAgaWYgKGNob2ljZS5pZGVudGlmaWVyICE9PSBldmVudC5kZXRhaWwuaWRlbnRpZmllcikge1xuICAgICAgICAgICAgdGhpcy5fc2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5faGFuZGxlQ2hvaWNlU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2U6IENob2ljZSwgY2hlY2tlZDogYm9vbGVhbikge1xuICAgICAgaWYgKGNob2ljZS5pbnRlcm5hbHM/LnN0YXRlcykge1xuICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmFkZCgnLS1jaGVja2VkJyk7XG4gICAgICAgICAgY2hvaWNlLmludGVybmFscy5hcmlhQ2hlY2tlZCA9ICd0cnVlJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5kZWxldGUoJy0tY2hlY2tlZCcpO1xuICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuYXJpYUNoZWNrZWQgPSAnZmFsc2UnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2U6IENob2ljZSk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmhhcygnLS1jaGVja2VkJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdG9nZ2xlQ2hvaWNlQ2hlY2tlZChjaG9pY2U6IENob2ljZSkge1xuICAgICAgY29uc3QgY2hlY2tlZCA9IHRoaXMuX2dldENob2ljZUNoZWNrZWQoY2hvaWNlKTtcbiAgICAgIHRoaXMuX3NldENob2ljZUNoZWNrZWQoY2hvaWNlLCAhY2hlY2tlZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaGFuZGxlQ2hvaWNlU2VsZWN0aW9uKCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRDaG9pY2VzID0gdGhpcy5fY2hvaWNlRWxlbWVudHMuZmlsdGVyKGNob2ljZSA9PiB0aGlzLl9nZXRDaG9pY2VDaGVja2VkKGNob2ljZSkpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRJZGVudGlmaWVycyA9IHNlbGVjdGVkQ2hvaWNlcy5tYXAoY2hvaWNlID0+IGNob2ljZS5pZGVudGlmaWVyKTtcblxuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubWF4Q2hvaWNlcyA9PT0gMSA/IHNlbGVjdGVkSWRlbnRpZmllcnNbMF0gfHwgJycgOiBzZWxlY3RlZElkZW50aWZpZXJzO1xuICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiBlYWNoIGNob2ljZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlc3BvbnNlLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3VwZGF0ZUNob2ljZVNlbGVjdGlvbigpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlQXJyYXkgPSBBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSA/IHRoaXMuX3ZhbHVlIDogW3RoaXMuX3ZhbHVlXTtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHJlc3BvbnNlQXJyYXkuaW5jbHVkZXMoY2hvaWNlLmlkZW50aWZpZXIpO1xuICAgICAgICB0aGlzLl9zZXRDaG9pY2VDaGVja2VkKGNob2ljZSwgaXNTZWxlY3RlZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIENob2ljZXNNaXhpbkVsZW1lbnQgYXMgQ29uc3RydWN0b3I8Q2hvaWNlc0ludGVyZmFjZT4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90dGV4dC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpSG90dGV4dEludGVyYWN0aW9uIGV4dGVuZHMgQ2hvaWNlc01peGluKEludGVyYWN0aW9uLCAncXRpLWhvdHRleHQnKSB7XG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uJywgJycpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nOiBRdGlIb3R0ZXh0SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtub3RoaW5nLCBUZW1wbGF0ZVJlc3VsdCwgbm9DaGFuZ2V9IGZyb20gJy4uL2xpdC1odG1sLmpzJztcbmltcG9ydCB7ZGlyZWN0aXZlLCBEaXJlY3RpdmUsIFBhcnRJbmZvLCBQYXJ0VHlwZX0gZnJvbSAnLi4vZGlyZWN0aXZlLmpzJztcblxuY29uc3QgSFRNTF9SRVNVTFQgPSAxO1xuXG5leHBvcnQgY2xhc3MgVW5zYWZlSFRNTERpcmVjdGl2ZSBleHRlbmRzIERpcmVjdGl2ZSB7XG4gIHN0YXRpYyBkaXJlY3RpdmVOYW1lID0gJ3Vuc2FmZUhUTUwnO1xuICBzdGF0aWMgcmVzdWx0VHlwZSA9IEhUTUxfUkVTVUxUO1xuXG4gIHByaXZhdGUgX3ZhbHVlOiB1bmtub3duID0gbm90aGluZztcbiAgcHJpdmF0ZSBfdGVtcGxhdGVSZXN1bHQ/OiBUZW1wbGF0ZVJlc3VsdDtcblxuICBjb25zdHJ1Y3RvcihwYXJ0SW5mbzogUGFydEluZm8pIHtcbiAgICBzdXBlcihwYXJ0SW5mbyk7XG4gICAgaWYgKHBhcnRJbmZvLnR5cGUgIT09IFBhcnRUeXBlLkNISUxEKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke1xuICAgICAgICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBVbnNhZmVIVE1MRGlyZWN0aXZlKS5kaXJlY3RpdmVOYW1lXG4gICAgICAgIH0oKSBjYW4gb25seSBiZSB1c2VkIGluIGNoaWxkIGJpbmRpbmdzYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIodmFsdWU6IHN0cmluZyB8IHR5cGVvZiBub3RoaW5nIHwgdHlwZW9mIG5vQ2hhbmdlIHwgdW5kZWZpbmVkIHwgbnVsbCkge1xuICAgIGlmICh2YWx1ZSA9PT0gbm90aGluZyB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZVJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiAodGhpcy5fdmFsdWUgPSB2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gbm9DaGFuZ2UpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtcbiAgICAgICAgICAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgVW5zYWZlSFRNTERpcmVjdGl2ZSkuZGlyZWN0aXZlTmFtZVxuICAgICAgICB9KCkgY2FsbGVkIHdpdGggYSBub24tc3RyaW5nIHZhbHVlYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLl92YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RlbXBsYXRlUmVzdWx0O1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIGNvbnN0IHN0cmluZ3MgPSBbdmFsdWVdIGFzIHVua25vd24gYXMgVGVtcGxhdGVTdHJpbmdzQXJyYXk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAoc3RyaW5ncyBhcyBhbnkpLnJhdyA9IHN0cmluZ3M7XG4gICAgLy8gV0FSTklORzogaW1wZXJzb25hdGluZyBhIFRlbXBsYXRlUmVzdWx0IGxpa2UgdGhpcyBpcyBleHRyZW1lbHlcbiAgICAvLyBkYW5nZXJvdXMuIFRoaXJkLXBhcnR5IGRpcmVjdGl2ZXMgc2hvdWxkIG5vdCBkbyB0aGlzLlxuICAgIHJldHVybiAodGhpcy5fdGVtcGxhdGVSZXN1bHQgPSB7XG4gICAgICAvLyBDYXN0IHRvIGEga25vd24gc2V0IG9mIGludGVnZXJzIHRoYXQgc2F0aXNmeSBSZXN1bHRUeXBlIHNvIHRoYXQgd2VcbiAgICAgIC8vIGRvbid0IGhhdmUgdG8gZXhwb3J0IFJlc3VsdFR5cGUgYW5kIHBvc3NpYmx5IGVuY291cmFnZSB0aGlzIHBhdHRlcm4uXG4gICAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgWydfJGxpdFR5cGUkJ106ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBVbnNhZmVIVE1MRGlyZWN0aXZlKVxuICAgICAgICAucmVzdWx0VHlwZSBhcyAxIHwgMixcbiAgICAgIHN0cmluZ3MsXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVuZGVycyB0aGUgcmVzdWx0IGFzIEhUTUwsIHJhdGhlciB0aGFuIHRleHQuXG4gKlxuICogVGhlIHZhbHVlcyBgdW5kZWZpbmVkYCwgYG51bGxgLCBhbmQgYG5vdGhpbmdgLCB3aWxsIGFsbCByZXN1bHQgaW4gbm8gY29udGVudFxuICogKGVtcHR5IHN0cmluZykgYmVpbmcgcmVuZGVyZWQuXG4gKlxuICogTm90ZSwgdGhpcyBpcyB1bnNhZmUgdG8gdXNlIHdpdGggYW55IHVzZXItcHJvdmlkZWQgaW5wdXQgdGhhdCBoYXNuJ3QgYmVlblxuICogc2FuaXRpemVkIG9yIGVzY2FwZWQsIGFzIGl0IG1heSBsZWFkIHRvIGNyb3NzLXNpdGUtc2NyaXB0aW5nXG4gKiB2dWxuZXJhYmlsaXRpZXMuXG4gKi9cbmV4cG9ydCBjb25zdCB1bnNhZmVIVE1MID0gZGlyZWN0aXZlKFVuc2FmZUhUTUxEaXJlY3RpdmUpO1xuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbmludGVyZmFjZSBPcHRpb25UeXBlIHtcbiAgdGV4dENvbnRlbnQ6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgc2VsZWN0ZWQ6IGJvb2xlYW47XG59XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpSW5saW5lQ2hvaWNlSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHN0YXRpYyBvdmVycmlkZSBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgIH1cbiAgICAgICAgc2xvdCB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICB9XG4gICAgICAgIFtyb2xlPSdtZW51J10ge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICB6LWluZGV4OiAxMDAwO1xuICAgICAgICB9XG4gICAgICAgIC5hbmNob3Ige1xuICAgICAgICAgIC8qIGFuY2hvci1uYW1lOiAtLWluZm9ib3g7ICovXG4gICAgICAgICAgd2lkdGg6IGZpdC1jb250ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLnBvc2l0aW9uZWRFbGVtZW50IHtcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgLyogcG9zaXRpb24tYW5jaG9yOiAtLWluZm9ib3g7ICovXG4gICAgICAgICAgLyogdG9wOiBhbmNob3IoYm90dG9tKTsgKi9cbiAgICAgICAgfVxuICAgICAgYFxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlucHV0V2lkdGhDbGFzcyA9IFtcbiAgICAnJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTInLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMScsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0zJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTQnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtNicsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0xMCcsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0xNScsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0yMCcsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC03MidcbiAgXTtcblxuICBAc3RhdGUoKSBvcHRpb25zOiBPcHRpb25UeXBlW10gPSBbXTtcblxuICBAc3RhdGUoKSBjb3JyZWN0T3B0aW9uOiBzdHJpbmcgPSAnJztcblxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdkYXRhLXByb21wdCcsIHR5cGU6IFN0cmluZyB9KVxuICBkYXRhUHJvbXB0OiBzdHJpbmcgPSAnc2VsZWN0JztcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2VsZWN0IHBhcnQ9XCJzZWxlY3RcIiBAY2hhbmdlPVwiJHt0aGlzLmNob2ljZVNlbGVjdGVkfVwiID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIiA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCI+XG4gICAgICAgICR7dGhpcy5vcHRpb25zLm1hcChcbiAgICAgICAgICBvcHRpb24gPT4gaHRtbGBcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIke29wdGlvbi52YWx1ZX1cIiA/c2VsZWN0ZWQ9XCIke29wdGlvbi5zZWxlY3RlZH1cIj4ke3Vuc2FmZUhUTUwob3B0aW9uLnRleHRDb250ZW50KX08L29wdGlvbj5cbiAgICAgICAgICBgXG4gICAgICAgICl9XG4gICAgICA8L3NlbGVjdD5cblxuICAgICAgJHt1bnNhZmVIVE1MKHRoaXMuY29ycmVjdE9wdGlvbil9XG4gICAgYDtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdvbi1kcm9wZG93bi1zZWxlY3RlZCcsIHRoaXMuY2hvaWNlU2VsZWN0ZWQpO1xuICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWlubGluZS1jaG9pY2UnKSk7XG4gICAgdGhpcy5vcHRpb25zID0gW1xuICAgICAge1xuICAgICAgICB0ZXh0Q29udGVudDogdGhpcy5kYXRhUHJvbXB0LFxuICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIC4uLmNob2ljZXMubWFwKGNob2ljZSA9PiAoe1xuICAgICAgICB0ZXh0Q29udGVudDogY2hvaWNlLmlubmVySFRNTCxcbiAgICAgICAgdmFsdWU6IGNob2ljZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXG4gICAgICB9KSlcbiAgICBdO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdvbi1kcm9wZG93bi1zZWxlY3RlZCcsIHRoaXMuY2hvaWNlU2VsZWN0ZWQpO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQob3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCk7XG4gICAgcmV0dXJuIHNlbGVjdGVkT3B0aW9uID8gc2VsZWN0ZWRPcHRpb24udmFsdWUgIT09ICcnIDogZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcCgob3B0aW9uLCBpKSA9PiAoeyAuLi5vcHRpb24sIHNlbGVjdGVkOiBpID09PSAwIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMub3B0aW9ucy5tYXAob3B0aW9uID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gb3B0aW9uLnZhbHVlKSB7XG4gICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9uO1xuICAgIH0pO1xuICB9XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkKS52YWx1ZTtcbiAgfVxuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9uID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29ycmVjdE9wdGlvbiA9IGA8c3BhbiBwYXJ0PVwiY29ycmVjdC1vcHRpb25cIj4ke1xuICAgICAgdGhpcy5vcHRpb25zLmZpbmQob3B0aW9uID0+IHZhbHVlID09PSBvcHRpb24udmFsdWUpLnRleHRDb250ZW50XG4gICAgfTwvc3Bhbj5gO1xuICB9XG5cbiAgcHVibGljIGNob2ljZVNlbGVjdGVkKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uVmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50KS52YWx1ZTtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnMubWFwKG9wdGlvbiA9PiAoeyAuLi5vcHRpb24sIHNlbGVjdGVkOiBvcHRpb24udmFsdWUgPT09IHNlbGVjdGVkT3B0aW9uVmFsdWUgfSkpO1xuICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHNlbGVjdGVkT3B0aW9uVmFsdWUpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uJzogUXRpSW5saW5lQ2hvaWNlSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICIvKipcbiAqIE1peGluIHRoYXQgcHJvdmlkZXMgc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIGEgTGl0RWxlbWVudC5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIExpdEVsZW1lbnQgc3ViY2xhc3MuXG4gKiBAcGFyYW0ge1R9IHN1cGVyQ2xhc3MgLSBUaGUgc3VwZXJjbGFzcyB0byBleHRlbmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBUaGUgQ1NTIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudHMgdG8gc2h1ZmZsZS5cbiAqIEByZXR1cm5zIHtDb25zdHJ1Y3RvcjxTaHVmZmxlSW50ZXJmYWNlPiAmIFR9IC0gVGhlIGV4dGVuZGVkIGNsYXNzIHdpdGggc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogYWRkcyBhIHNodWZmbGUgcHJvcGVydHkgdG8gdGhlIGNsYXNzIHdpdGggYW4gYXR0cmlidXRlIGNvbnZlcnRlclxuICpcbiAqIHF0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktbWF0Y2gtaW50ZXJhY3Rpb25cbiAqL1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5kZWNsYXJlIGNsYXNzIFNodWZmbGVJbnRlcmZhY2Uge31cbmV4cG9ydCBjb25zdCBTaHVmZmxlTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oc3VwZXJDbGFzczogVCwgc2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTaHVmZmxlRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIHByaXZhdGUgX3NodWZmbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8vIERlZmluZSB0aGUgcHJvcGVydHkgd2l0aCB0aGUgY3VzdG9tIGNvbnZlcnRlclxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZWZsZWN0OiB0cnVlLFxuICAgICAgY29udmVydGVyOiBzdHJpbmdUb0Jvb2xlYW5Db252ZXJ0ZXJcbiAgICB9KVxuICAgIHNldCBzaHVmZmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX3NodWZmbGU7XG4gICAgICB0aGlzLl9zaHVmZmxlID0gdmFsdWU7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fc2h1ZmZsZUNob2ljZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3Jlc2V0U2h1ZmZsZUNob2ljZXMoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgnc2h1ZmZsZScsIG9sZFZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXQgc2h1ZmZsZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaHVmZmxlO1xuICAgIH1cblxuICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIC8vIENhbGwgX3Jlc2V0U2h1ZmZsZUNob2ljZXMgaW5pdGlhbGx5IHRvIHNldCB0aGUgQ1NTIG9yZGVyIHRvIGluaXRpYWwuXG4gICAgICAvLyBJZiBzaHVmZmxlIGlzIHRydWUsIF9zaHVmZmxlQ2hvaWNlcyB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHZpYSB0aGUgc2V0dGVyLlxuICAgICAgaWYgKHRoaXMuc2h1ZmZsZSkge1xuICAgICAgICB0aGlzLl9zaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVzZXRTaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3NodWZmbGVDaG9pY2VzKCkge1xuICAgICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihzZWxlY3RvcikpO1xuICAgICAgY29uc3QgZml4ZWRFbGVtZW50czogQXJyYXk8eyBlbGVtZW50OiBIVE1MRWxlbWVudDsgaW5kZXg6IG51bWJlciB9PiA9IFtdO1xuICAgICAgY29uc3Qgbm9uRml4ZWRFbGVtZW50czogQXJyYXk8SFRNTEVsZW1lbnQ+ID0gW107XG5cbiAgICAgIC8vIFNlcGFyYXRlIGZpeGVkIGFuZCBub24tZml4ZWQgZWxlbWVudHNcbiAgICAgIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoY2hvaWNlLmhhc0F0dHJpYnV0ZSgnZml4ZWQnKSkge1xuICAgICAgICAgIGZpeGVkRWxlbWVudHMucHVzaCh7IGVsZW1lbnQ6IGNob2ljZSwgaW5kZXg6IGluZGV4IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vbkZpeGVkRWxlbWVudHMucHVzaChjaG9pY2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgdGhlcmUgYXJlIDEgb3IgZmV3ZXIgbm9uLWZpeGVkIGVsZW1lbnRzLCB0aHJvdyBhbiBlcnJvciAobm8gc2h1ZmZsZSBwb3NzaWJsZSlcbiAgICAgIGlmIChub25GaXhlZEVsZW1lbnRzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU2h1ZmZsaW5nIGlzIG5vdCBwb3NzaWJsZSB3aXRoIGZld2VyIHRoYW4gMiBub24tZml4ZWQgZWxlbWVudHMuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGlzU2h1ZmZsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IG1heEF0dGVtcHRzID0gMTA7IC8vIE1heCBhdHRlbXB0cyB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzXG4gICAgICBsZXQgYXR0ZW1wdCA9IDA7XG5cbiAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIG9yZGVyIGZvciBjb21wYXJpc29uXG4gICAgICBjb25zdCBvcmlnaW5hbE9yZGVyID0gWy4uLm5vbkZpeGVkRWxlbWVudHNdO1xuXG4gICAgICAvLyBTaHVmZmxlIHVudGlsIHRoZSByZXN1bHQgaXMgZGlmZmVyZW50IG9yIG1heEF0dGVtcHRzIGlzIHJlYWNoZWRcbiAgICAgIHdoaWxlICghaXNTaHVmZmxlZCAmJiBhdHRlbXB0IDwgbWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgYXR0ZW1wdCsrO1xuXG4gICAgICAgIC8vIFNodWZmbGUgbm9uLWZpeGVkIGVsZW1lbnRzXG4gICAgICAgIGZvciAobGV0IGkgPSBub25GaXhlZEVsZW1lbnRzLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICBjb25zdCBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICAgICAgW25vbkZpeGVkRWxlbWVudHNbaV0sIG5vbkZpeGVkRWxlbWVudHNbal1dID0gW25vbkZpeGVkRWxlbWVudHNbal0sIG5vbkZpeGVkRWxlbWVudHNbaV1dO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNodWZmbGVkIHJlc3VsdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgb3JkZXJcbiAgICAgICAgaXNTaHVmZmxlZCA9ICFub25GaXhlZEVsZW1lbnRzLmV2ZXJ5KChjaG9pY2UsIGluZGV4KSA9PiBjaG9pY2UgPT09IG9yaWdpbmFsT3JkZXJbaW5kZXhdKTtcblxuICAgICAgICBpZiAoaXNTaHVmZmxlZCkgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNTaHVmZmxlZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBzaHVmZmxlIHRoZSBjaG9pY2VzIGFmdGVyIG11bHRpcGxlIGF0dGVtcHRzLicpO1xuICAgICAgfVxuXG4gICAgICAvLyBBc3NpZ24gb3JkZXIgdG8gZWFjaCBlbGVtZW50XG4gICAgICBsZXQgb3JkZXIgPSAxO1xuICAgICAgY2hvaWNlcy5mb3JFYWNoKChjaG9pY2U6IEhUTUxFbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoY2hvaWNlLmhhc0F0dHJpYnV0ZSgnZml4ZWQnKSkge1xuICAgICAgICAgIGNob2ljZS5zdHlsZS5zZXRQcm9wZXJ0eSgnb3JkZXInLCBTdHJpbmcob3JkZXIrKykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5vbkZpeGVkQ2hvaWNlID0gbm9uRml4ZWRFbGVtZW50cy5zaGlmdCgpO1xuICAgICAgICAgIG5vbkZpeGVkQ2hvaWNlIS5zdHlsZS5zZXRQcm9wZXJ0eSgnb3JkZXInLCBTdHJpbmcob3JkZXIrKykpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXNldFNodWZmbGVDaG9pY2VzKCkge1xuICAgICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgICAgIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlLCBpbmRleCkgPT4ge1xuICAgICAgICBjaG9pY2Uuc3R5bGUuc2V0UHJvcGVydHkoJ29yZGVyJywgJ2luaXRpYWwnKTsgLy8gY2hvaWNlLnN0eWxlLm9yZGVyID0gJ2luaXRpYWwnO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBTaHVmZmxlRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxTaHVmZmxlSW50ZXJmYWNlPiAmIFQ7XG59O1xuXG5jb25zdCBzdHJpbmdUb0Jvb2xlYW5Db252ZXJ0ZXIgPSB7XG4gIGZyb21BdHRyaWJ1dGUodmFsdWU6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICd0cnVlJztcbiAgfSxcbiAgdG9BdHRyaWJ1dGUodmFsdWU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHJldHVybiB2YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH1cbn07XG4iLCAiLyoqXG4gKiBNaXhpbiB0aGF0IHByb3ZpZGVzIHNodWZmbGluZyBmdW5jdGlvbmFsaXR5IGZvciBhIExpdEVsZW1lbnQuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSBMaXRFbGVtZW50IHN1YmNsYXNzLlxuICogQHBhcmFtIHtUfSBzdXBlckNsYXNzIC0gVGhlIHN1cGVyY2xhc3MgdG8gZXh0ZW5kLlxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gVGhlIENTUyBzZWxlY3RvciBmb3IgdGhlIGVsZW1lbnRzIHRvIHNodWZmbGUuXG4gKiBAcmV0dXJucyB7Q29uc3RydWN0b3I8U2h1ZmZsZUludGVyZmFjZT4gJiBUfSAtIFRoZSBleHRlbmRlZCBjbGFzcyB3aXRoIHNodWZmbGluZyBmdW5jdGlvbmFsaXR5LlxuICpcbiAqIGFkZHMgYSBzaHVmZmxlIHByb3BlcnR5IHRvIHRoZSBjbGFzcyB3aXRoIGFuIGF0dHJpYnV0ZSBjb252ZXJ0ZXJcbiAqXG4gKiBxdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvblxuICogcXRpLWNob2ljZS1pbnRlcmFjdGlvblxuICogcXRpLW1hdGNoLWludGVyYWN0aW9uXG4gKi9cbmltcG9ydCB7IFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpU2ltcGxlQ2hvaWNlIH0gZnJvbSAnLi4vLi4vcXRpLXNpbXBsZS1jaG9pY2UnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbnR5cGUgTGFiZWxUeXBlID0gJ3F0aS1sYWJlbHMtZGVjaW1hbCcgfCAncXRpLWxhYmVscy1sb3dlci1hbHBoYScgfCAncXRpLWxhYmVscy11cHBlci1hbHBoYSc7XG50eXBlIExhYmVsU3VmZml4VHlwZSA9ICdxdGktbGFiZWxzLXN1ZmZpeC1wZXJpb2QnIHwgJ3F0aS1sYWJlbHMtc3VmZml4LXBhcmVudGhlc2lzJztcblxuZGVjbGFyZSBjbGFzcyBWb2NhYnVsYXJ5SW50ZXJmYWNlIHt9XG5cbmV4cG9ydCBjb25zdCBWb2NhYnVsYXJ5TWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oc3VwZXJDbGFzczogVCwgc2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBWb2NhYnVsYXJ5RWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIHByaXZhdGUgX2NsYXNzZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBfYWxsTGFiZWxzID0gWydxdGktbGFiZWxzLWRlY2ltYWwnLCAncXRpLWxhYmVscy1sb3dlci1hbHBoYScsICdxdGktbGFiZWxzLXVwcGVyLWFscGhhJ107XG4gICAgcHJpdmF0ZSBfYWxsTGFiZWxTdWZmaXhlcyA9IFsncXRpLWxhYmVscy1zdWZmaXgtcGVyaW9kJywgJ3F0aS1sYWJlbHMtc3VmZml4LXBhcmVudGhlc2lzJ10gYXMgTGFiZWxTdWZmaXhUeXBlW107XG4gICAgLy8gRGVmaW5lIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBjdXN0b20gY29udmVydGVyXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIHJlZmxlY3Q6IHRydWVcbiAgICB9KVxuICAgIHNldCBjbGFzcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fY2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgICB0aGlzLl9jbGFzc2VzID0gdmFsdWUuc3BsaXQoJyAnKTtcblxuICAgICAgdGhpcy5fYWRkTGFiZWxzKCk7XG4gICAgICAvLyB0aGlzLnJlcXVlc3RVcGRhdGUoJ2NsYXNzJywgb2xkVmFsdWUpO1xuICAgIH1cbiAgICBnZXQgY2xhc3MoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLl9jbGFzc2VzPy5qb2luKCcgJykgfHwgJyc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlcyk6IHZvaWQge1xuICAgICAgc3VwZXIudXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgICAgaWYgKF9jaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3NodWZmbGUnKSkge1xuICAgICAgICB0aGlzLl9hZGRMYWJlbHMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9hZGRMYWJlbHMoKSB7XG4gICAgICBjb25zdCBjbGFzc0NvbnRhaW5zTGFiZWwgPSB0aGlzLl9jbGFzc2VzLnNvbWUoXG4gICAgICAgIGNscyA9PiB0aGlzLl9hbGxMYWJlbHMuaW5jbHVkZXMoY2xzKSB8fCB0aGlzLl9hbGxMYWJlbFN1ZmZpeGVzLmluY2x1ZGVzKGNscyBhcyBMYWJlbFN1ZmZpeFR5cGUpXG4gICAgICApO1xuICAgICAgY29uc3QgaXNOdW1iZXIgPSB2YWx1ZSA9PiB7XG4gICAgICAgIHJldHVybiAhaXNOYU4oK3ZhbHVlKTtcbiAgICAgIH07XG4gICAgICBpZiAoY2xhc3NDb250YWluc0xhYmVsKSB7XG4gICAgICAgIGNvbnN0IGNob2ljZUVsZW1lbnRzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpLm1hcChjID0+IGMgYXMgUXRpU2ltcGxlQ2hvaWNlKTtcbiAgICAgICAgY29uc3QgY2hvaWNlcyA9IGNob2ljZUVsZW1lbnRzXG4gICAgICAgICAgLm1hcCgoY2hvaWNlOiBIVE1MRWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IGVsOiBjaG9pY2UsIG9yZGVyOiBpc051bWJlcihjaG9pY2Uuc3R5bGUub3JkZXIpID8gK2Nob2ljZS5zdHlsZS5vcmRlciA6IGluZGV4ICsgMSB9O1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKVxuICAgICAgICAgIC5tYXAoY2hvaWNlID0+IGNob2ljZS5lbCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hvaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIChjaG9pY2VzW2ldIGFzIFF0aVNpbXBsZUNob2ljZSkubWFya2VyID0gdGhpcy5fZ2V0TGFiZWwoaSArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgX2dldExhYmVsKGluZGV4OiBudW1iZXIpIHtcbiAgICAgIGxldCBsYXN0TGFiZWwgPSB0aGlzLl9jbGFzc2VzLmZpbHRlcihjID0+IHRoaXMuX2FsbExhYmVscy5pbmNsdWRlcyhjKSkucG9wKCkgYXMgTGFiZWxUeXBlO1xuICAgICAgY29uc3QgbGFzdExhYmVsU3VmZml4ID0gdGhpcy5fY2xhc3Nlcy5maWx0ZXIoYyA9PiB0aGlzLl9hbGxMYWJlbFN1ZmZpeGVzLmluY2x1ZGVzKGMgYXMgTGFiZWxTdWZmaXhUeXBlKSkucG9wKCk7XG5cbiAgICAgIGlmICghbGFzdExhYmVsICYmIGxhc3RMYWJlbFN1ZmZpeCkge1xuICAgICAgICAvLyBhIHN1ZmZpeCB3aXRob3V0IGEgbGFiZWwgaXMgc3RyYW5nZSBzbyBhZGQgcXRpLWxhYmVscy11cHBlci1hbHBoYVxuICAgICAgICBsYXN0TGFiZWwgPSAncXRpLWxhYmVscy11cHBlci1hbHBoYSc7XG4gICAgICB9XG4gICAgICBsZXQgbGFiZWwgPSAnJztcbiAgICAgIHN3aXRjaCAobGFzdExhYmVsKSB7XG4gICAgICAgIGNhc2UgJ3F0aS1sYWJlbHMtZGVjaW1hbCc6XG4gICAgICAgICAgbGFiZWwgPSBgJHtpbmRleH1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdxdGktbGFiZWxzLWxvd2VyLWFscGhhJzpcbiAgICAgICAgICBsYWJlbCA9IGAke1N0cmluZy5mcm9tQ2hhckNvZGUoOTcgKyBpbmRleCAtIDEpfWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3F0aS1sYWJlbHMtdXBwZXItYWxwaGEnOlxuICAgICAgICAgIGxhYmVsID0gYCR7U3RyaW5nLmZyb21DaGFyQ29kZSg2NSArIGluZGV4IC0gMSl9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0TGFiZWxTdWZmaXggPT09ICdxdGktbGFiZWxzLXN1ZmZpeC1wZXJpb2QnKSB7XG4gICAgICAgIGxhYmVsICs9ICcuJztcbiAgICAgIH0gZWxzZSBpZiAobGFzdExhYmVsU3VmZml4ID09PSAncXRpLWxhYmVscy1zdWZmaXgtcGFyZW50aGVzaXMnKSB7XG4gICAgICAgIGxhYmVsICs9IGApYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsYWJlbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFZvY2FidWxhcnlFbGVtZW50IGFzIENvbnN0cnVjdG9yPFZvY2FidWxhcnlJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICBbcGFydD0nc2xvdCddIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiB2YXIoLS1xdGktZ2FwLXNpemUpO1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgfVxuXG4gIDo6c2xvdHRlZChxdGktc2ltcGxlLWNob2ljZSkge1xuICAgIGZsZXg6IDAgMFxuICAgICAgY2FsYygoMTAwJSAtICh2YXIoLS1xdGktZ2FwLXNpemUpICogdmFyKC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZykpKSAvIHZhcigtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmcpKSAhaW1wb3J0YW50O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDtcbiAgfVxuXG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy0xKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogMTtcbiAgfVxuXG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy0yKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogMjtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtc3RhY2tpbmctMykgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmc6IDM7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTQpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiA0O1xuICB9XG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy01KSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogNTtcbiAgfVxuICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgfVxuYDtcbiIsICJpbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBDaG9pY2VzSW50ZXJmYWNlLCBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgU2h1ZmZsZU1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvc2h1ZmZsZS9zaHVmZmxlLW1peGluJztcbmltcG9ydCB7IFZvY2FidWxhcnlNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL3ZvY2FidWxhcnkvdm9jYWJ1bGFyeS1taXhpbic7XG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi5zdHlsZXMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktY2hvaWNlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlDaG9pY2VJbnRlcmFjdGlvblxuICBleHRlbmRzIFZvY2FidWxhcnlNaXhpbihcbiAgICBTaHVmZmxlTWl4aW4oQ2hvaWNlc01peGluKEludGVyYWN0aW9uLCAncXRpLXNpbXBsZS1jaG9pY2UnKSwgJ3F0aS1zaW1wbGUtY2hvaWNlJyksXG4gICAgJ3F0aS1zaW1wbGUtY2hvaWNlJ1xuICApXG4gIGltcGxlbWVudHMgQ2hvaWNlc0ludGVyZmFjZVxue1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+PHNsb3QgcGFydD1cInNsb3RcIj48L3Nsb3Q+XG4gICAgICA8ZGl2IHJvbGU9XCJhbGVydFwiIGlkPVwidmFsaWRhdGlvbk1lc3NhZ2VcIj48L2Rpdj5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24nOiBRdGlDaG9pY2VJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpUnVsZSwgUXRpUnVsZUJhc2UgfSBmcm9tICcuLic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3V0Y29tZS1wcm9jZXNzaW5nJylcbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lUHJvY2Vzc2luZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgY29uc3QgbG9naWMgPSBuZXcgUXRpT3V0Y29tZVByb2Nlc3NpbmdQcm9jZXNzb3IoKTtcbiAgICBjb25zdCBydWxlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlSdWxlW107XG4gICAgbG9naWMucHJvY2VzcyhydWxlcyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW91dGNvbWUtcHJvY2Vzc2luZyc6IFF0aU91dGNvbWVQcm9jZXNzaW5nO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lUHJvY2Vzc2luZ1Byb2Nlc3NvciB7XG4gIHB1YmxpYyBwcm9jZXNzKHJ1bGVzOiBRdGlSdWxlQmFzZVtdKSB7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICBydWxlLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbWF0Y2hDb3JyZWN0ID0gYDxxdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5cbiAgPHF0aS1yZXNwb25zZS1jb25kaXRpb24+XG4gICAgPHF0aS1yZXNwb25zZS1pZj5cbiAgICAgIDxxdGktbWF0Y2g+XG4gICAgICAgIDxxdGktdmFyaWFibGUgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktdmFyaWFibGU+XG4gICAgICAgIDxxdGktY29ycmVjdCBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS1jb3JyZWN0PlxuICAgICAgPC9xdGktbWF0Y2g+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4xPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWlmPlxuICAgIDxxdGktcmVzcG9uc2UtZWxzZT5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjA8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtZWxzZT5cbiAgPC9xdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuPC9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5gO1xuXG5leHBvcnQgY29uc3QgbWFwUmVzcG9uc2UgPSBgPHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nPlxuICA8cXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbiAgICA8cXRpLXJlc3BvbnNlLWlmPlxuICAgICAgPHF0aS1pcy1udWxsPlxuICAgICAgICA8cXRpLXZhcmlhYmxlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLXZhcmlhYmxlPlxuICAgICAgPC9xdGktaXMtbnVsbD5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjAuMDwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1pZj5cbiAgICA8cXRpLXJlc3BvbnNlLWVsc2U+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLW1hcC1yZXNwb25zZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj4gPC9xdGktbWFwLXJlc3BvbnNlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtZWxzZT5cbiAgPC9xdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuPC9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5gO1xuXG5leHBvcnQgY29uc3QgbWFwUmVzcG9uc2VQb2ludCA9IGA8cXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+XG4gIDxxdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuICAgIDxxdGktcmVzcG9uc2UtaWY+XG4gICAgICA8cXRpLWlzLW51bGw+XG4gICAgICAgIDxxdGktdmFyaWFibGUgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktdmFyaWFibGU+XG4gICAgICA8L3F0aS1pcy1udWxsPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MDwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1pZj5cbiAgICA8cXRpLXJlc3BvbnNlLWVsc2U+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLW1hcC1yZXNwb25zZS1wb2ludCBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS1tYXAtcmVzcG9uc2UtcG9pbnQ+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1lbHNlPlxuICA8L3F0aS1yZXNwb25zZS1jb25kaXRpb24+XG48L3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nPmA7XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50LCBQcm9wZXJ0eVZhbHVlTWFwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IG1hcFJlc3BvbnNlLCBtYXBSZXNwb25zZVBvaW50LCBtYXRjaENvcnJlY3QgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC90ZW1wbGF0ZS1zdHJpbmdzJztcbmltcG9ydCB7IHR5cGUgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nJylcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF0aVJlc3BvbnNlUHJvY2Vzc2luZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgY29uc3QgcnVsZXMgPSBbLi4udGhpcy5jaGlsZHJlbl0gYXMgUXRpUnVsZVtdO1xuXG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICBydWxlLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZU1hcDxhbnk+IHwgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPik6IHZvaWQge1xuICAgIGlmICh0aGlzLmdldEF0dHJpYnV0ZSgndGVtcGxhdGUnKSkge1xuICAgICAgY29uc3Qgc3BsaXR0ZWRUZW1wbGF0ZU5hbWUgPSB0aGlzLmdldEF0dHJpYnV0ZSgndGVtcGxhdGUnKSEuc3BsaXQoJy8nKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlTmFtZSA9IHNwbGl0dGVkVGVtcGxhdGVOYW1lW3NwbGl0dGVkVGVtcGxhdGVOYW1lLmxlbmd0aCAtIDFdLnJlcGxhY2UoJy54bWwnLCAnJyk7XG4gICAgICB0aGlzLmlubmVySFRNTCA9ICcnO1xuICAgICAgc3dpdGNoICh0ZW1wbGF0ZU5hbWUpIHtcbiAgICAgICAgY2FzZSAnbWFwX3Jlc3BvbnNlJzoge1xuICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy5mcmFnbWVudEZyb21TdHJpbmcobWFwUmVzcG9uc2UpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdtYXBfcmVzcG9uc2VfcG9pbnQnOiB7XG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLmZyYWdtZW50RnJvbVN0cmluZyhtYXBSZXNwb25zZVBvaW50KS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbWF0Y2hfY29ycmVjdCc6XG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLmZyYWdtZW50RnJvbVN0cmluZyhtYXRjaENvcnJlY3QpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZyYWdtZW50RnJvbVN0cmluZyhzdHJIVE1MOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoc3RySFRNTCk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnOiBRdGlSZXNwb25zZVByb2Nlc3Npbmc7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcnVsZScpXG5leHBvcnQgY2xhc3MgUXRpUnVsZSBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBRdGlSdWxlQmFzZSB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdGlSdWxlQmFzZSB7XG4gIHByb2Nlc3MoKTogYW55O1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcnVsZSc6IFF0aVJ1bGU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBPdXRjb21lVmFyaWFibGUgfSBmcm9tICdAY2l0b2xhYi9xdGktY29tcG9uZW50cy9xdGktY29tcG9uZW50cyc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdXRpbHMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbi8qKlxuICogVGhlIGxvb2t1cE91dGNvbWVWYWx1ZSBydWxlIHNldHMgdGhlIHZhbHVlIG9mIGFuIG91dGNvbWUgdmFyaWFibGUgdG8gdGhlIHZhbHVlIG9idGFpbmVkXG4gKiBieSBsb29raW5nIHVwIHRoZSB2YWx1ZSBvZiB0aGUgYXNzb2NpYXRlZCBleHByZXNzaW9uIGluIHRoZSBsb29rdXBUYWJsZSBhc3NvY2lhdGVkXG4gKiB3aXRoIHRoZSBvdXRjb21lJ3MgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdGlMb29rdXBPdXRjb21lVmFsdWUgZXh0ZW5kcyBRdGlSdWxlIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBnZXQgY2hpbGRFeHByZXNzaW9uKCk6IFF0aUV4cHJlc3Npb248c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxzdHJpbmc+O1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHByb2Nlc3MoKTogbnVtYmVyIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGUgPSB0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKS5nZXRWYXJpYWJsZShpZGVudGlmaWVyKSBhcyBPdXRjb21lVmFyaWFibGU7XG4gICAgbGV0IHZhbHVlO1xuICAgIGlmIChvdXRjb21lVmFyaWFibGUuaW50ZXJwb2xhdGlvblRhYmxlKSB7XG4gICAgICB2YWx1ZSA9IG91dGNvbWVWYXJpYWJsZS5pbnRlcnBvbGF0aW9uVGFibGUuZ2V0KHBhcnNlSW50KHRoaXMuY2hpbGRFeHByZXNzaW9uLmNhbGN1bGF0ZSgpKSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ2xvb2t1cE91dGNvbWVWYWx1ZTogdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfT4oJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIG91dGNvbWVJZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICAgICAgdmFsdWU6IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0KHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZScsIFF0aUxvb2t1cE91dGNvbWVWYWx1ZSk7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZSc6IFF0aUxvb2t1cE91dGNvbWVWYWx1ZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUNvbmRpdGlvbiBleHRlbmRzIFF0aVJ1bGUge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgcHJvY2VzcygpIHtcbiAgICBjb25zdCBicmFuY2hlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlFeHByZXNzaW9uPGFueT5bXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhbmNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJyYW5jaCA9IGJyYW5jaGVzW2ldO1xuXG4gICAgICBpZiAoYnJhbmNoLmNhbGN1bGF0ZSgpKSB7XG4gICAgICAgIChicmFuY2ggYXMgdW5rbm93biBhcyBRdGlSdWxlKS5wcm9jZXNzKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1jb25kaXRpb24nLCBRdGlSZXNwb25zZUNvbmRpdGlvbik7XG4iLCAiaW1wb3J0IHsgY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC91dGlscyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uLCBRdGlFeHByZXNzaW9uQmFzZSB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUsIFF0aVJ1bGVCYXNlIH0gZnJvbSAnLi4vcXRpLXJ1bGUnO1xuXG5leHBvcnQgY2xhc3MgUXRpU2V0T3V0Y29tZVZhbHVlIGV4dGVuZHMgUXRpUnVsZSB7XG4gIHB1YmxpYyBvdmVycmlkZSBwcm9jZXNzKCkge1xuICAgIGNvbnN0IG91dGNvbWVJZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcblxuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248c3RyaW5nPjtcblxuICAgIGNvbnN0IHJ1bGUgPSBuZXcgUXRpU2V0T3V0Y29tZVZhbHVlUnVsZShleHByZXNzaW9uKTtcbiAgICBjb25zdCB2YWx1ZSA9IHJ1bGUucHJvY2VzcygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLXNldC1vdXRjb21lLXZhbHVlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgdmFsdWU6IEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgICA/IHZhbHVlLm1hcCgodjogc3RyaW5nKSA9PiBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCh2KSlcbiAgICAgICAgICAgIDogY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQodmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXRpU2V0T3V0Y29tZVZhbHVlUnVsZTxUPiBpbXBsZW1lbnRzIFF0aVJ1bGVCYXNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHByZXNzaW9uOiBRdGlFeHByZXNzaW9uQmFzZTxUPikge31cblxuICBwcm9jZXNzKCk6IGFueSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmV4cHJlc3Npb24gPyB0aGlzLmV4cHJlc3Npb24uY2FsY3VsYXRlKCkgOiBudWxsO1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2Fybignc2V0T3V0Y29tZVZhbHVlOiB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCBRdGlTZXRPdXRjb21lVmFsdWUpO1xuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlRWxzZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3ViUnVsZXMoKTogUXRpUnVsZVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuY2hpbGRyZW5dIGFzIFF0aVJ1bGVbXTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIGNvbnN0IHN1YlJ1bGVzID0gdGhpcy5nZXRTdWJSdWxlcygpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViUnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN1YlJ1bGUgPSBzdWJSdWxlc1tpXTtcbiAgICAgIHN1YlJ1bGUucHJvY2VzcygpO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1lbHNlJywgUXRpUmVzcG9uc2VFbHNlKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uLy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcbmltcG9ydCB7IFF0aVJlc3BvbnNlRWxzZSB9IGZyb20gJy4uL3F0aS1yZXNwb25zZS1lbHNlJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlSWYgZXh0ZW5kcyBRdGlSZXNwb25zZUVsc2Uge1xuICBwdWJsaWMgb3ZlcnJpZGUgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj47XG4gICAgY29uc3QgcmVzdWx0ID0gZXhwcmVzc2lvbi5jYWxjdWxhdGUoKSBhcyBib29sZWFuO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0U3ViUnVsZXMoKTogUXRpUnVsZVtdIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY2hpbGRyZW5baV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXJlc3BvbnNlLWlmJywgUXRpUmVzcG9uc2VJZik7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlSZXNwb25zZUlmIH0gZnJvbSAnLi4vcXRpLXJlc3BvbnNlLWlmJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlRWxzZUlmIGV4dGVuZHMgUXRpUmVzcG9uc2VJZiB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAke3N1cGVyLnJlbmRlcigpfWA7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtZWxzZS1pZicsIFF0aVJlc3BvbnNlRWxzZUlmKTtcbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUsIFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgaXRlbUNvbnRleHQsIEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpTXVsdGlwbGUgfSBmcm9tICcuL3F0aS1tdWx0aXBsZS9xdGktbXVsdGlwbGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF0aUV4cHJlc3Npb25CYXNlPFQ+IHtcbiAgLy8gZ2V0IGFzc2Vzc21lbnRJdGVtKCk6IFF0aUFzc2Vzc21lbnRJdGVtO1xuXG4gIC8vIGdldFZhcmlhYmxlcygpOiBWYXJpYWJsZURlY2xhcmF0aW9uPG51bWJlciB8IHN0cmluZyB8IChudW1iZXIgfCBzdHJpbmcpW10gfCBudWxsPltdO1xuICBjYWxjdWxhdGUoKTogUmVhZG9ubHk8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBRdGlFeHByZXNzaW9uPFQ+IGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIFF0aUV4cHJlc3Npb25CYXNlPFQ+IHtcbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIHJlc3VsdDogYW55O1xuXG4gIC8vIGhpZGUgdGhlIHNsb3Qgd2l0aCBjc3NcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICBzbG90IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8cHJlPiR7SlNPTi5zdHJpbmdpZnkodGhpcy5yZXN1bHQsIG51bGwsIDIpfTwvcHJlPlxuICAgICAgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCk6IFJlYWRvbmx5PFQ+IHtcbiAgICB0aGlzLnJlc3VsdCA9IHRoaXMuZ2V0UmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFJlc3VsdCgpOiBSZWFkb25seTxUPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcm90ZWN0ZWQgY29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIGdldFZhcmlhYmxlcyA9ICgpOiBWYXJpYWJsZURlY2xhcmF0aW9uPG51bWJlciB8IHN0cmluZyB8IChudW1iZXIgfCBzdHJpbmcpW10gfCBudWxsPltdID0+XG4gICAgLy8gRklYTUU6IGlmIHRoaXMgaXRzZWxmIGlzIG11bHRpcGxlLCB0aGlzIHdpbGwgbmV2ZXIgZW50ZXIgdGhlIHF0aS1tdWx0aXBsZSBzd2l0Y2hcbiAgICAvLyBTZWUgdGhpcyBleGFtcGxlIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS8xRWRUZWNoL3F0aS1leGFtcGxlcy9ibG9iL21hc3Rlci9xdGl2My1leGFtcGxlcy9wYWNrYWdpbmcvaXRlbXMvRXhhbXBsZTA1LWZlZWRiYWNrQmxvY2stYWRhcHRpdmUueG1sXG5cbiAgICBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pXG4gICAgICAubWFwKChlOiBFbGVtZW50KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjYXNlICdxdGktYmFzZS12YWx1ZSc6IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGJhc2VUeXBlOiBlLmdldEF0dHJpYnV0ZSgnYmFzZS10eXBlJyksXG4gICAgICAgICAgICAgIHZhbHVlOiBlLnRleHRDb250ZW50LnRyaW0oKSxcbiAgICAgICAgICAgICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnXG4gICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS12YXJpYWJsZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHx8IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS1tdWx0aXBsZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IG11bHRpcGxlID0gZSBhcyBRdGlNdWx0aXBsZTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG11bHRpcGxlLmdldFJlc3VsdCgpO1xuICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJycsXG4gICAgICAgICAgICAgICAgYmFzZVR5cGU6IHZhbHVlc1swXS5iYXNlVHlwZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVzLm1hcCh2ID0+IHYudmFsdWUpLFxuICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAnbXVsdGlwbGUnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdyZXNwb25zZSdcbiAgICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS1jb3JyZWN0Jzoge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlOiBSZXNwb25zZVZhcmlhYmxlID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB8fCBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYmFzZVR5cGU6IHJlc3BvbnNlVmFyaWFibGUuYmFzZVR5cGUsXG4gICAgICAgICAgICAgIHZhbHVlOiByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZSxcbiAgICAgICAgICAgICAgY2FyZGluYWxpdHk6IHJlc3BvbnNlVmFyaWFibGUuY2FyZGluYWxpdHlcbiAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgLy8gYWRkZWQgZm9yIHVzZSBvZiBxdGktZXF1YWwtcm91bmRlZFxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IGUgYXMgUXRpRXhwcmVzc2lvbjxudW1iZXI+O1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGV4cHJlc3Npb24uZ2V0UmVzdWx0KCk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYmFzZVR5cGU6ICdpbnRlZ2VyJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZSdcbiAgICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdkZWZhdWx0IG5vdCBzdWZmaWNpZW50Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKHYgPT4gdiAhPT0gbnVsbCk7XG59XG4iLCAiaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgY2FsY3VsYXRlKCk6IFJlYWRvbmx5PGJvb2xlYW4+IHtcbiAgICB0aGlzLnJlc3VsdCA9IHRoaXMuZ2V0UmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGdldFJlc3VsdCgpOiBSZWFkb25seTxib29sZWFuPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUPiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5leHBvcnQgY2xhc3MgUXRpQW5kIGV4dGVuZHMgcXRpQW5kTWl4aW4oUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFF0aUNvbmRpdGlvbkV4cHJlc3Npb24+KSB7XG4gIHB1YmxpYyBjYWxjdWxhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlQ2hpbGRyZW4oQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuIGFzIHVua25vd24gYXMgUXRpRXhwcmVzc2lvbjxhbnk+W10pKTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBNb2NrUXRpRXhwcmVzc2lvbjxUPiA9IHsgY2FsY3VsYXRlOiAoKSA9PiBUIH07XG50eXBlIE1vY2tDb25zdHJ1Y3RvciA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IHt9O1xuZXhwb3J0IGZ1bmN0aW9uIHF0aUFuZE1peGluPFRCYXNlIGV4dGVuZHMgTW9ja0NvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICByZXR1cm4gY2xhc3MgTW9ja1F0aUFuZCBleHRlbmRzIEJhc2Uge1xuICAgIHB1YmxpYyBjYWxjdWxhdGVDaGlsZHJlbihjaGlsZHJlbjogQXJyYXk8TW9ja1F0aUV4cHJlc3Npb248YW55Pj4pIHtcbiAgICAgIC8vIGNoaWxkcmVuIGNhbiBiZSBhIG1peCBvZiBxdGktZXhwcmVzc2lvbiBhbmQgcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uXG4gICAgICBjb25zdCB2YWx1ZXMgPSBjaGlsZHJlbi5tYXAoYyA9PiB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IGMgYXMgTW9ja1F0aUV4cHJlc3Npb248YW55PjtcbiAgICAgICAgaWYgKCFjb25kaXRpb24uY2FsY3VsYXRlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVsZW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgUXRpQ29uZGl0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmRpdGlvbi5jYWxjdWxhdGUoKTtcbiAgICAgICAgbGV0IHZhbCA9IGZhbHNlO1xuICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB2YWx1ZSB0byBib29sZWFuIGFuZCByZXR1cm4gbnVsbCBpZiBub3QgcG9zc2libGVcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgdmFsID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICB2YWwgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWwgaW4gcXRpLW9yLCBleHBlY3RlZCBib29sZWFuJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB2YWwgPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlcy5ldmVyeShlID0+IHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBlID09PSAnYm9vbGVhbicgJiYgZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBRdGlBbmQgfSBmcm9tICcuL3F0aS1hbmQnO1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktYW5kJywgUXRpQW5kKTtcblxuZXhwb3J0ICogZnJvbSAnLi9xdGktYW5kJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFuZCc6IFF0aUFuZDtcbiAgfVxufVxuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQmFzZVR5cGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aUJhc2VWYWx1ZSBleHRlbmRzIFF0aUV4cHJlc3Npb248c3RyaW5nPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGUgPSAnc3RyaW5nJztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktYmFzZS12YWx1ZScsIFF0aUJhc2VWYWx1ZSk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpQ29udGFpbnMgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBmb3Igb3RoZXIgdHlwZXMgdGhhbiBkaXJlY3RlZFBhaXJcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSA9PT0gJ211bHRpcGxlJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMiA9IHZhbHVlMi52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICAgICAgY29uc3QgZW51bWVyYWJsZSA9IHByb2plY3Rpb24xLmZpbHRlcih4ID0+IHByb2plY3Rpb24yLmluY2x1ZGVzKHgpKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBlbnVtZXJhYmxlLmxlbmd0aCA+IDA7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB2YWx1ZTEuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMi5iYXNlVHlwZSA9PT0gJ2RpcmVjdGVkUGFpcicgJiZcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ID09PSAnc2luZ2xlJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbjIgPSB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgICAgIHJldHVybiBwcm9qZWN0aW9uMi5pbmNsdWRlcyhwcm9qZWN0aW9uMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICd1bnN1cHBvcnRlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgY29udGFpbnMsIG9ubHkgYmFzZVR5cGU6IGRpcmVjdGVkUGFpciBhbmQgY2FyZGluYWxpdHk6IG11bHRpcGxlIGlzIHN1cHBvcnRlZCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIGNvbnRhaW5zJyk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1jb250YWlucycsIFF0aUNvbnRhaW5zKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUNvcnJlY3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIGdldCBpbnRlcnByZXRhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ2ludGVycHJldGF0aW9uJykgfHwgJyc7XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZTogUmVzcG9uc2VWYXJpYWJsZSA9IHRoaXMuY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgICBpZiAocmVzcG9uc2VWYXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgIHJldHVybiByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZS5sZW5ndGggPiAwID8gcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2VbMF0gOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1jb3JyZWN0JywgUXRpQ29ycmVjdCk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlFcXVhbFJvdW5kZWQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHJvdW5kaW5nTW9kZTogJ2RlY2ltYWxQbGFjZXMnIHwgJ3NpZ25pZmljYW50RmlndXJlcycgPSAnc2lnbmlmaWNhbnRGaWd1cmVzJztcblxuICBnZXQgZmlndXJlcygpIHtcbiAgICBjb25zdCBhdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpZ3VyZXMnKTtcbiAgICBpZiAoIWF0dHIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgYXR0cmlidXRlIGlzIG1pc3NpbmcnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBmaWd1cmVzID0gcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpZ3VyZXMnKSB8fCAnMCcpO1xuICAgIGlmIChpc05hTihmaWd1cmVzKSkge1xuICAgICAgY29uc29sZS5lcnJvcignZmlndXJlcyBhdHRyaWJ1dGUgaXMgbm90IGEgbnVtYmVyJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGZpZ3VyZXMgPCAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGF0dHJpYnV0ZSBpcyBuZWdhdGl2ZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChmaWd1cmVzIDwgMSAmJiB0aGlzLnJvdW5kaW5nTW9kZSA9PT0gJ3NpZ25pZmljYW50RmlndXJlcycpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAxIGZvciBSb3VuZGluZ01vZGUgc2lnbmlmaWNhbnRGaWd1cmVzJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZpZ3VyZXM7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodGhpcy5yb3VuZGluZ01vZGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgdmFsdWUyLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMS52YWx1ZSkgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTIudmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgZXF1YWwnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh2YWx1ZXNbMF0uYmFzZVR5cGUpIHtcbiAgICAgICAgY2FzZSAnaW50ZWdlcic6XG4gICAgICAgIGNhc2UgJ2Zsb2F0Jzoge1xuICAgICAgICAgIGNvbnN0IGZsb2F0MSA9IHBhcnNlRmxvYXQodmFsdWUxLnZhbHVlIGFzIHN0cmluZyk7XG4gICAgICAgICAgY29uc3QgZmxvYXQyID0gcGFyc2VGbG9hdCh2YWx1ZTIudmFsdWUgYXMgc3RyaW5nKTtcblxuICAgICAgICAgIGlmICghaXNOYU4oZmxvYXQxKSAmJiAhaXNOYU4oZmxvYXQyKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucm91bmRpbmdNb2RlID09PSAnc2lnbmlmaWNhbnRGaWd1cmVzJykge1xuICAgICAgICAgICAgICByZXR1cm4gZmxvYXQxLnRvUHJlY2lzaW9uKHRoaXMuZmlndXJlcykgPT09IGZsb2F0Mi50b1ByZWNpc2lvbih0aGlzLmZpZ3VyZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGZsb2F0MSAqIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpKSAvIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpID09PVxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoZmxvYXQyICogTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcykpIC8gTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcylcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgdmFsdWUgY2Fubm90IGJlIGNhc3RlZCB0byBudW1lcmljIHZhbHVlIGluIGVxdWFsUm91bmRlZCBvcGVyYXRvcjogJHtmbG9hdDF9LCAke2Zsb2F0Mn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHZhbHVlcyBvdGhlciB0aGFuIGZsb2F0IGFuZCBpbnQgY2Fubm90IGJlIHVzZWQgaW4gZXF1YWxSb3VuZGVkIG9wZXJhdG9yLmApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aS1lcXVhbC1yb3VuZGVkJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZXF1YWwtcm91bmRlZCcsIFF0aUVxdWFsUm91bmRlZCk7XG4iLCAiaW1wb3J0IHsgQmFzZVR5cGUgfSBmcm9tICcuLi8uLic7XG5cbmV4cG9ydCBjbGFzcyBTY29yaW5nSGVscGVyIHtcbiAgcHVibGljIHN0YXRpYyBjb21wYXJlU2luZ2xlVmFsdWVzKHZhbHVlMTogUmVhZG9ubHk8c3RyaW5nPiwgdmFsdWUyOiBSZWFkb25seTxzdHJpbmc+LCBiYXNlVHlwZTogQmFzZVR5cGUpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGJhc2VUeXBlKSB7XG4gICAgICBjYXNlICdpZGVudGlmaWVyJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJldHVybiB2YWx1ZTEgPT09IHZhbHVlMjtcbiAgICAgIGNhc2UgJ2ludGVnZXInOiB7XG4gICAgICAgIGNvbnN0IGludDEgPSBwYXJzZUludCh2YWx1ZTEsIDEwKTtcbiAgICAgICAgY29uc3QgaW50MiA9IHBhcnNlSW50KHZhbHVlMiwgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKGludDEpICYmICFpc05hTihpbnQyKSkge1xuICAgICAgICAgIHJldHVybiBpbnQxID09PSBpbnQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCBjb252ZXJ0ICR7dmFsdWUxfSBhbmQvb3IgJHt2YWx1ZTJ9IHRvIGludC5gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Zsb2F0Jzoge1xuICAgICAgICBjb25zdCBmbG9hdDEgPSBwYXJzZUZsb2F0KHZhbHVlMSk7XG4gICAgICAgIGNvbnN0IGZsb2F0MiA9IHBhcnNlRmxvYXQodmFsdWUyKTtcbiAgICAgICAgaWYgKCFpc05hTihmbG9hdDEpICYmICFpc05hTihmbG9hdDIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZsb2F0MSA9PT0gZmxvYXQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGNvdWxkbid0IGNvbnZlcnQgJHt2YWx1ZTF9IGFuZC9vciAke3ZhbHVlMn0gdG8gZmxvYXQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdwYWlyJzpcbiAgICAgIGNhc2UgJ2RpcmVjdGVkUGFpcic6IHtcbiAgICAgICAgY29uc3QgcGFpcjEgPSB2YWx1ZTEuc3BsaXQoJyAnKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IHBhaXIyID0gdmFsdWUyLnNwbGl0KCcgJykuc29ydCgpO1xuICAgICAgICBpZiAocGFpcjEubGVuZ3RoID09PSAyICYmIHBhaXIyLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGlmIChiYXNlVHlwZSA9PT0gJ3BhaXInKSB7XG4gICAgICAgICAgICBwYWlyMS5zb3J0KCk7XG4gICAgICAgICAgICBwYWlyMi5zb3J0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYWlyMS5qb2luKCcgJykgPT09IHBhaXIyLmpvaW4oJyAnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBjb21wYXJlZCB0d28gcGFpciBidXQgb25lIG9mIHRoZSB2YWx1ZXMgZG9lcyBub3QgaGF2ZSAyIHZhbHVlczogMTogJHt2YWx1ZTF9IDI6ICR7dmFsdWUyfWApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlFcXVhbCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgdG9sZXJhbmNlTW9kZTogJ2V4YWN0JyB8ICdyZWxhdGl2ZScgfCAnYWJzb2x1dGUnID0gJ2V4YWN0JztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodGhpcy50b2xlcmFuY2VNb2RlICE9PSAnZXhhY3QnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3RvbGVyYW5jZU1vZGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIHZhbHVlMi5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTEudmFsdWUpIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUyLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIGVxdWFsJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXModmFsdWUxLnZhbHVlIGFzIHN0cmluZywgdmFsdWUyLnZhbHVlIGFzIHN0cmluZywgdmFsdWUxLmJhc2VUeXBlKTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpLWVxdWFsJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZXF1YWwnLCBRdGlFcXVhbCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpR3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlID4gK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGd0Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZ3QnLCBRdGlHdCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpR3RlIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA+PSArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgZ3RlJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRlJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZ3RlJywgUXRpR3RlKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUlzTnVsbCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBpZiAoIXZhcmlhYmxlcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGVzWzBdLnZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJztcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIE51bGwnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1pcy1udWxsJywgUXRpSXNOdWxsKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlMdCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUgJiYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2ludGVnZXInIHx8IHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JykpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTEudmFsdWUgPCArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgbHQnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gbHQnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sdCcsIFF0aUx0KTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuXG4vLyBQSzogRm9yIHRoZSBjb250YWlucyB3ZSBhc3N1bWUgdGhlIGV4cHJlc3Npb25zIHRvIGNhbGN1bGF0ZSBhcmUgYWxsIGRpcmVjdGVkUGFpcnNcbi8vIEkgZG9uJ3Qga25vdyBpdCB0aGlzIGluIFFUSSBpcyBhbHdheXMgdGhlIGNhc2UgaG93ZXZlcj9cbmV4cG9ydCBjbGFzcyBRdGlMdGUgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlIDw9ICt2YWx1ZTIudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBsdGUnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBsdGUnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sdGUnLCBRdGlMdGUpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJ3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU1hcFJlc3BvbnNlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVzcG9uc2U6IFJlc3BvbnNlVmFyaWFibGUgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQociA9PiByLmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik7XG4gICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgY29uc29sZS53YXJuKGBSZXNwb25zZSAke3RoaXMuaWRlbnRpZmllcn0gY2FuIG5vdCBiZSBmb3VuZGApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1hcHBpbmcgPSByZXNwb25zZS5tYXBwaW5nO1xuICAgIGNvbnN0IGNhbmRpZGF0ZVJlc3BvbnNlcyA9ICFBcnJheS5pc0FycmF5KHJlc3BvbnNlLnZhbHVlKSA/IFtyZXNwb25zZS52YWx1ZV0gOiByZXNwb25zZS52YWx1ZTtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZVJlc3BvbnNlIG9mIGNhbmRpZGF0ZVJlc3BvbnNlcykge1xuICAgICAgY29uc3QgbWFwcGVkVmFsdWUgPSBtYXBwaW5nLm1hcEVudHJpZXMuZmluZChlbnRyeSA9PiB7XG4gICAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoZW50cnkubWFwS2V5LCBjYW5kaWRhdGVSZXNwb25zZSwgcmVzcG9uc2UuYmFzZVR5cGUpO1xuICAgICAgfSk7XG4gICAgICBpZiAoIShtYXBwZWRWYWx1ZSA9PSBudWxsIHx8IG1hcHBlZFZhbHVlLm1hcHBlZFZhbHVlID09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmVzdWx0ICs9IG1hcHBlZFZhbHVlLm1hcHBlZFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IG1hcHBpbmcuZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWFwcGluZy5sb3dlckJvdW5kICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IE1hdGgubWF4KG1hcHBpbmcubG93ZXJCb3VuZCwgcmVzdWx0KTtcbiAgICB9XG4gICAgaWYgKG1hcHBpbmcudXBwZXJCb3VuZCAhPSBudWxsKSB7XG4gICAgICByZXN1bHQgPSBNYXRoLm1pbihtYXBwaW5nLnVwcGVyQm91bmQsIHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWFwLXJlc3BvbnNlJywgUXRpTWFwUmVzcG9uc2UpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlNYXBwaW5nIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2RlZmF1bHQtdmFsdWUnLCB0eXBlOiBOdW1iZXIgfSkgZGVmYXVsdFZhbHVlOiBudW1iZXIgPSAwO1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdsb3dlci1ib3VuZCcsIHR5cGU6IE51bWJlciB9KSBsb3dlckJvdW5kOiBudW1iZXI7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3VwcGVyLWJvdW5kJywgdHlwZTogTnVtYmVyIH0pIHVwcGVyQm91bmQ6IG51bWJlcjtcblxuICBwdWJsaWMgZ2V0IG1hcEVudHJpZXMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktbWFwLWVudHJ5JykpLm1hcChlbCA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXBLZXk6IGVsLmdldEF0dHJpYnV0ZSgnbWFwLWtleScpLFxuICAgICAgICBtYXBwZWRWYWx1ZTogK2VsLmdldEF0dHJpYnV0ZSgnbWFwcGVkLXZhbHVlJylcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWFwcGluZycsIFF0aU1hcHBpbmcpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgU2NvcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlcic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTWF0Y2ggZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgLy9QSyA6IEZJWE1FLlxuICAvLyBUaGlzIHdhcyBhIGxpdHRsZSBleHBlcmltZW50IGlmIHdlIGNvdWxkIGNhbGwgdGhlIG1hdGNoIGZ1bmN0aW9uIGFzIGEgc3RhdGljIGZ1bmN0aW9uLFxuICAvLyBUaGlzIGNhbiBiZSB1c2VkIGZvciBhbGwga2luZCBvZiB0aGluZ3MsIGJ1dCBub3cgZXNwZWNpYWxseSBmb3IgdXNlIGluXG4gIC8vIHF0aS1yZXNwb25zZS1jb25kaXRpb24tc2NyaXB0XG4gIC8vIGluIHdoaWNoIHdlIHBhc3MgdGhlIGV4cHJlc3Npb25zIGFzIHB1cmUgZnVuY3Rpb25zLCBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuXG4gIC8vIFNBRExZLCB0aGUgZ2V0VmFyaWFibGVzIHRocm93cyByb2V0IGluIGRlIGV0ZW4uLiB3ZWV0IG5vZyBuaWV0IHByZWNpZXMgaG9lIGRlemUgd2Vya3QuXG4gIC8vIE1hYXIgaWsgZ2EgZXJpbiBkdWlrZW4uXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlVG9NYXAgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCBjb3JyZWN0VmFsdWVJbmZvID0gdmFsdWVzWzFdO1xuICAgICAgcmV0dXJuIFF0aU1hdGNoLm1hdGNoKHZhbHVlVG9NYXAsIGNvcnJlY3RWYWx1ZUluZm8pO1xuICAgIH1cblxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIG1hdGNoJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIG1hdGNoKHZhbHVlVG9NYXA6IFJlc3BvbnNlVmFyaWFibGUsIGNvcnJlY3RWYWx1ZUluZm86IFJlc3BvbnNlVmFyaWFibGUpIHtcbiAgICBzd2l0Y2ggKGNvcnJlY3RWYWx1ZUluZm8uY2FyZGluYWxpdHkpIHtcbiAgICAgIGNhc2UgJ3NpbmdsZSc6IHtcbiAgICAgICAgaWYgKHZhbHVlVG9NYXAudmFsdWUgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgQXJyYXkuaXNBcnJheShjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG1hdGNoJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoXG4gICAgICAgICAgdmFsdWVUb01hcC52YWx1ZT8udG9TdHJpbmcoKSxcbiAgICAgICAgICBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdvcmRlcmVkJzoge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgIUFycmF5LmlzQXJyYXkoY29ycmVjdFZhbHVlSW5mby52YWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVUb01hcC52YWx1ZS5sZW5ndGggIT09IGNvcnJlY3RWYWx1ZUluZm8udmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVUb01hcC52YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyhcbiAgICAgICAgICAgIGNvcnJlY3RWYWx1ZUluZm8udmFsdWVbaV0sXG4gICAgICAgICAgICB2YWx1ZVRvTWFwLnZhbHVlW2ldLFxuICAgICAgICAgICAgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ211bHRpcGxlJzoge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgIUFycmF5LmlzQXJyYXkoY29ycmVjdFZhbHVlSW5mby52YWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVUb01hcC52YWx1ZS5sZW5ndGggIT09IGNvcnJlY3RWYWx1ZUluZm8udmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbnN3ZXJJbmRleCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgY29ycmVjdEFuc3dlciBvZiBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSB7XG4gICAgICAgICAgbGV0IG1hdGNoaW5nVmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICAgIGNvbnN0IGFyciA9IFsuLi52YWx1ZVRvTWFwLnZhbHVlXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IG12IG9mIGFycikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKGNvcnJlY3RBbnN3ZXIsIG12LCBjb3JyZWN0VmFsdWVJbmZvLmJhc2VUeXBlKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgbWF0Y2hpbmdWYWx1ZSA9IG12O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1hdGNoaW5nVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIChhcnIgYXMgc3RyaW5nW10pLnNwbGljZShhcnIuaW5kZXhPZihtYXRjaGluZ1ZhbHVlKSwgMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYW5zd2VySW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbWF0Y2gnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tYXRjaCcsIFF0aU1hdGNoKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlNZW1iZXIgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4gfCBudWxsPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG5cbiAgICBpZiAoISh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIG1lbWJlciBvcGVyYXRvciB0YWtlcyB0d28gc3ViLWV4cHJlc3Npb25zJyk7XG4gICAgfVxuXG4gICAgY29uc3QgW3ZhbHVlMSwgdmFsdWUyXSA9IHZhbHVlcztcblxuICAgIGlmICghKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlKSkge1xuICAgICAgY29uc29sZS53YXJuKCdXaGljaCBtdXN0IGJvdGggaGF2ZSB0aGUgc2FtZSBiYXNlLXR5cGUnKTtcbiAgICB9XG4gICAgaWYgKCEodmFsdWUyLmNhcmRpbmFsaXR5ID09PSAnbXVsdGlwbGUnIHx8IHZhbHVlMi5jYXJkaW5hbGl0eSA9PT0gJ29yZGVyZWQnKSkge1xuICAgICAgY29uc29sZS53YXJuKCdhbmQgdGhlIHNlY29uZCBtdXN0IGJlIGEgbXVsdGlwbGUgb3Igb3JkZXJlZCBjb250YWluZXInKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JyB8fCB2YWx1ZTIuYmFzZVR5cGUgPT09ICdmbG9hdCcpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIG1lbWJlciBvcGVyYXRvciBzaG91bGQgbm90IGJlIHVzZWQgb24gc3ViLWV4cHJlc3Npb25zIHdpdGggYSBiYXNlLXR5cGUgb2YgZmxvYXQnKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2R1cmF0aW9uJyB8fCB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkdXJhdGlvbicpIHtcbiAgICAgIGNvbnNvbGUud2FybignSXQgbXVzdCBub3QgYmUgdXNlZCBvbiBzdWItZXhwcmVzc2lvbnMgd2l0aCBhIGJhc2UtdHlwZSBvZiBkdXJhdGlvbicpO1xuICAgIH1cblxuICAgIC8vIElmIGVpdGhlciBzdWItZXhwcmVzc2lvbiBpcyBOVUxMIHRoZW4gdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0b3IgaXMgTlVMTFxuICAgIGlmICh2YWx1ZTEudmFsdWUgPT09IG51bGwgfHwgdmFsdWUyLnZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVzdWx0IGlzIGEgc2luZ2xlIGJvb2xlYW4gd2l0aCBhIHZhbHVlIG9mICd0cnVlJyBpZiB0aGUgdmFsdWUgZ2l2ZW4gYnkgdGhlIGZpcnN0IHN1Yi1leHByZXNzaW9uIGlzIGluIHRoZSBjb250YWluZXIgZGVmaW5lZCBieSB0aGUgc2Vjb25kIHN1Yi1leHByZXNzaW9uLlxuICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZztcbiAgICBjb25zdCBwcm9qZWN0aW9uMiA9IHZhbHVlMi52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICByZXR1cm4gcHJvamVjdGlvbjIuaW5jbHVkZXMocHJvamVjdGlvbjEpO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW1lbWJlcicsIFF0aU1lbWJlcik7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSwgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aU11bHRpcGxlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPltdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogUmVzcG9uc2VWYXJpYWJsZVtdIHtcbiAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBpZiAodmFyaWFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIG11bHRpcGxlJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YXJpYWJsZSBvZiB2YXJpYWJsZXMpIHtcbiAgICAgIGlmICh2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ211bHRpcGxlJyAmJiB2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbXVsdGlwbGUnKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnN0IHZhbHVlcyA9IHZhcmlhYmxlcy5tYXAodiA9PiB2LnZhbHVlKTtcbiAgICAvLyBjb25zb2xlLmxvZyh2YXJpYWJsZXMpO1xuICAgIC8vIGNvbnN0IGZsYXR0ZW5lZEFycmF5ID0gdmFsdWVzLnJlZHVjZSgoYWNjOiBzdHJpbmdbXSwgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiB7XG4gICAgLy8gICByZXR1cm4gYWNjLmNvbmNhdChBcnJheS5pc0FycmF5KHZhbHVlKSA/IFsuLi52YWx1ZV0gOiB2YWx1ZSk7XG4gICAgLy8gfSwgW10pO1xuICAgIC8vIHJldHVybiBmbGF0dGVuZWRBcnJheTtcblxuICAgIHJldHVybiB2YXJpYWJsZXM7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbXVsdGlwbGUnLCBRdGlNdWx0aXBsZSk7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTm90IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAke3N1cGVyLnJlbmRlcigpfWA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj47XG4gICAgY29uc3QgcmVzdWx0ID0gZXhwcmVzc2lvbi5jYWxjdWxhdGUoKSBhcyBib29sZWFuO1xuICAgIHJldHVybiAhcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW5vdCcsIFF0aU5vdCk7XG4iLCAiaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpT3IgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgIGNvbnN0IHZhbHVlcyA9IEFycmF5LmZyb20odGhpcy5jaGlsZHJlbikubWFwKGMgPT4ge1xuICAgICAgY29uc3QgY29uZGl0aW9uID0gYyBhcyBRdGlFeHByZXNzaW9uPGFueT47XG4gICAgICBpZiAoIWNvbmRpdGlvbi5jYWxjdWxhdGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVsZW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgUXRpQ29uZGl0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmRpdGlvbi5jYWxjdWxhdGUoKTtcbiAgICAgIGxldCB2YWwgPSBmYWxzZTtcbiAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHZhbHVlIHRvIGJvb2xlYW4gYW5kIHJldHVybiBudWxsIGlmIG5vdCBwb3NzaWJsZVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgICAgICB2YWwgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgdmFsID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWwgaW4gcXRpLW9yLCBleHBlY3RlZCBib29sZWFuJyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIHZhbCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXMuc29tZShlID0+IHtcbiAgICAgIHJldHVybiB0eXBlb2YgZSA9PT0gJ2Jvb2xlYW4nICYmIGU7XG4gICAgfSk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktb3InLCBRdGlPcik7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aU9yZGVyZWQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPFJlc3BvbnNlVmFyaWFibGVbXT4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IFJlc3BvbnNlVmFyaWFibGVbXSB7XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgaWYgKHZhcmlhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBtdWx0aXBsZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFyaWFibGUgb2YgdmFyaWFibGVzKSB7XG4gICAgICBpZiAodmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdvcmRlcmVkJyAmJiB2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgb3JkZXJlZCcpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YXJpYWJsZXM7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktb3JkZXJlZCcsIFF0aU9yZGVyZWQpO1xuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICdzcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi8uLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlQcmludGVkVmFyaWFibGUgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIGNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpPy52YWx1ZTtcbiAgICByZXR1cm4gaHRtbGAke0pTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKX1gO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpOiBWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpIHx8IG51bGw7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wcmludGVkLXZhcmlhYmxlJywgUXRpUHJpbnRlZFZhcmlhYmxlKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlQcm9kdWN0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBjb25zdCBwcm9kdWN0ID0gdmFsdWVzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZS5iYXNlVHlwZSA9PSAnZmxvYXQnIHx8IGN1cnJlbnRWYWx1ZS5iYXNlVHlwZSA9PSAnaW50ZWdlcicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3IgKiBwYXJzZUludChjdXJyZW50VmFsdWUudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBjYW4gbm90IGNvbnZlcnQgdG8gbnVtYmVyYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgaGFzIGFub3RoZXIgYmFzZVR5cGUgJHtjdXJyZW50VmFsdWUuYmFzZVR5cGV9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfSwgMSk7XG4gICAgcmV0dXJuIHByb2R1Y3Q7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcHJvZHVjdCcsIFF0aVByb2R1Y3QpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlTdHJpbmdNYXRjaCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Nhc2Utc2Vuc2l0aXZlJyB9KSBjYXNlU2Vuc2l0aXZlID0gJ3RydWUnO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICB2YWx1ZTIuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUxLnZhbHVlKSB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBzdHJpbmctbWF0Y2gnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgdjEgPSB0aGlzLmNhc2VTZW5zaXRpdmUgPT09ICd0cnVlJyA/IHZhbHVlMS52YWx1ZSA6ICh2YWx1ZTEudmFsdWUgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgdjIgPSB0aGlzLmNhc2VTZW5zaXRpdmUgPT09ICd0cnVlJyA/IHZhbHVlMi52YWx1ZSA6ICh2YWx1ZTIudmFsdWUgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyh2MSBhcyBzdHJpbmcsIHYyIGFzIHN0cmluZywgdmFsdWUxLmJhc2VUeXBlKTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpLXN0cmluZy1tYXRjaCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXN0cmluZy1tYXRjaCcsIFF0aVN0cmluZ01hdGNoKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uLCBRdGlFeHByZXNzaW9uQmFzZSB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVN1bSBleHRlbmRzIFF0aUV4cHJlc3Npb248bnVtYmVyPiB7XG4gIHByaXZhdGUgX2V4cHJlc3Npb246IFF0aVN1bUV4cHJlc3Npb247XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZXhwcmVzc2lvbiA9IG5ldyBRdGlTdW1FeHByZXNzaW9uKEFycmF5LmZyb20odGhpcy5jaGlsZHJlbiBhcyB1bmtub3duIGFzIFF0aUV4cHJlc3Npb25CYXNlPG51bWJlcj5bXSkpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZXhwcmVzc2lvbi5jYWxjdWxhdGUoKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF0aVN1bUV4cHJlc3Npb24gaW1wbGVtZW50cyBRdGlFeHByZXNzaW9uQmFzZTxudW1iZXI+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHByZXNzaW9uczogUXRpRXhwcmVzc2lvbkJhc2U8bnVtYmVyPltdKSB7fVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5leHByZXNzaW9ucy5tYXAoYyA9PiB7XG4gICAgICBpZiAoIWMuY2FsY3VsYXRlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFbGVtZW50IGRvZXNuJ3QgaW1wbGVtZW50IFF0aUNvbmRpdGlvbkV4cHJlc3Npb25cIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBjLmNhbGN1bGF0ZSgpO1xuICAgICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWx1ZSBpbiBxdGktc3VtLCBleHBlY3RlZCBudW1iZXInKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc3VtJywgUXRpU3VtKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpVmFyaWFibGUgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKS52YWx1ZVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktdmFyaWFibGUnLCBRdGlWYXJpYWJsZSk7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IElNU3BjaSwgTW9kdWxlUmVzb2x1dGlvbkNvbmZpZywgUXRpVmFyaWFibGVKU09OIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5kZWNsYXJlIGNvbnN0IHJlcXVpcmVqczogYW55O1xuZGVjbGFyZSBjb25zdCBkZWZpbmU6IGFueTtcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVBvcnRhYmxlQ3VzdG9tSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHByaXZhdGUgaW50ZXJ2YWxJZDogYW55O1xuICBwcml2YXRlIHJhd1Jlc3BvbnNlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBwY2k6IElNU3BjaTx1bmtub3duPjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ21vZHVsZScgfSlcbiAgbW9kdWxlOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjdXN0b20taW50ZXJhY3Rpb24tdHlwZS1pZGVudGlmaWVyJyB9KVxuICBjdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBudWxsO1xuXG4gIHByaXZhdGUgY29udmVydFF0aVZhcmlhYmxlSlNPTihpbnB1dDogUXRpVmFyaWFibGVKU09OKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIGZvciAoY29uc3QgdG9wTGV2ZWxLZXkgaW4gaW5wdXQpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIGlmIChpbnB1dC5oYXNPd25Qcm9wZXJ0eSh0b3BMZXZlbEtleSkpIHtcbiAgICAgICAgY29uc3QgbmVzdGVkT2JqZWN0ID0gaW5wdXRbdG9wTGV2ZWxLZXkgYXMgJ2xpc3QnIHwgJ2Jhc2UnXTtcbiAgICAgICAgaWYgKG5lc3RlZE9iamVjdCkge1xuICAgICAgICAgIGZvciAoY29uc3QgbmVzdGVkS2V5IGluIG5lc3RlZE9iamVjdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICAgICAgaWYgKG5lc3RlZE9iamVjdC5oYXNPd25Qcm9wZXJ0eShuZXN0ZWRLZXkpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbmVzdGVkT2JqZWN0W25lc3RlZEtleSBhcyBrZXlvZiB0eXBlb2YgbmVzdGVkT2JqZWN0XTtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm1hcChTdHJpbmcpOyAvLyBDb252ZXJ0IGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgdG8gc3RyaW5nXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpOyAvLyBDb252ZXJ0IHRoZSBzaW5nbGUgdmFsdWUgdG8gc3RyaW5nXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0Q2hlY2tpbmcoKTogdm9pZCB7XG4gICAgLy8gYmVjYXVzZSB0aGUgcGNpIGRvZXNuJ3QgaGF2ZSBhIG1ldGhvZCB0byBjaGVjayBmb3IgY2hhbmdlcyB3ZSdsbCB1c2UgYW4gaW50ZXJ2YWxcbiAgICAvLyB0byBjaGVjayBpZiB0aGUgcmVzcG9uc2UgaGFzIGNoYW5nZWQuIElmIGNoYW5nZWQgd2UnbGwgc2F2ZSB0aGUgcmVzcG9uc2VcbiAgICB0aGlzLmludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMucGNpLmdldFJlc3BvbnNlKCk7XG4gICAgICBjb25zdCBuZXdSZXNwb25zZSA9IHRoaXMucGNpLmdldFJlc3BvbnNlKCk7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlKTtcbiAgICAgIGlmIChzdHJpbmdpZmllZCAhPT0gdGhpcy5yYXdSZXNwb25zZSkge1xuICAgICAgICB0aGlzLnJhd1Jlc3BvbnNlID0gc3RyaW5naWZpZWQ7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jb252ZXJ0UXRpVmFyaWFibGVKU09OKG5ld1Jlc3BvbnNlKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSwgMjAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcENoZWNraW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmludGVydmFsSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlOyAvLyBGT1IgTk9XXG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAvLyBPbmx5IHNldCBzdGF0ZSBpcyBzdXBwb3J0ZWQgaW4gYSBQQ0lcbiAgfVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnJhd1Jlc3BvbnNlO1xuICB9XG5cbiAgZ2V0VEFPQ29uZmlnKG5vZGUpIHtcbiAgICBjb25zdCBhID0gbm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdwcm9wZXJ0aWVzJyk7XG4gICAgbGV0IGNvbmZpZyA9IHt9O1xuXG4gICAgY29uc3QgZ2V0UHJvcGVydHlWYWx1ZSA9IGVsID0+IHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0ge307XG4gICAgICBjb25zdCBrZXkgPSBlbC5nZXRBdHRyaWJ1dGUoJ2tleScpO1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZWwuY2hpbGRyZW4pO1xuICAgICAgICBjb25zdCBhbGxLZXkgPSBjaGlsZHJlbi5tYXAoKGM6IEhUTUxFbGVtZW50KSA9PiBjLmdldEF0dHJpYnV0ZSgna2V5JykpO1xuICAgICAgICBjb25zdCBpc0FycmF5ID0gYWxsS2V5Lmxlbmd0aCA+IDAgJiYgIWFsbEtleS5maW5kKGsgPT4gIU51bWJlci5pc0ludGVnZXIoK2spKTtcbiAgICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgICBwcm9wZXJ0eVtrZXldID0gY2hpbGRyZW4ubWFwKGMgPT4gZ2V0Q2hpbGRQcm9wZXJ0aWVzKGMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wZXJ0eVtrZXldID0gZWwudGV4dENvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0Q2hpbGRQcm9wZXJ0aWVzID0gKGVsKToge30gfCB2b2lkID0+IHtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBsZXQgcHJvcGVydGllcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsLmNoaWxkcmVuKSB7XG4gICAgICAgICAgcHJvcGVydGllcyA9IHsgLi4ucHJvcGVydGllcywgLi4uZ2V0UHJvcGVydHlWYWx1ZShjaGlsZCkgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0aWVzIG9mIGEpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3BlcnRpZXMuZ2V0QXR0cmlidXRlKCdrZXknKTtcbiAgICAgIGlmICgha2V5KSB7XG4gICAgICAgIGNvbmZpZyA9IHsgLi4uY29uZmlnLCAuLi5nZXRDaGlsZFByb3BlcnRpZXMocHJvcGVydGllcykgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdDYW4gbm90IGZpbmQgcXRpLWN1c3RvbS1pbnRlcmFjdGlvbiBjb25maWcnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJlZ2lzdGVyKHBjaTogSU1TcGNpPHVua25vd24+KSB7XG4gICAgdGhpcy5wY2kgPSBwY2k7XG5cbiAgICBjb25zdCB0eXBlID0gdGhpcy5wYXJlbnRFbGVtZW50LnRhZ05hbWUgPT09ICdRVEktQ1VTVE9NLUlOVEVSQUNUSU9OJyA/ICdUQU8nIDogJ0lNUyc7XG4gICAgY29uc3QgZG9tOiBIVE1MRWxlbWVudCA9XG4gICAgICB0eXBlID09ICdJTVMnID8gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktaW50ZXJhY3Rpb24tbWFya3VwJykgOiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ21hcmt1cCcpO1xuICAgIGRvbS5jbGFzc0xpc3QuYWRkKCdxdGktY3VzdG9tSW50ZXJhY3Rpb24nKTtcblxuICAgIGlmICh0eXBlID09ICdUQU8nICYmIHRoaXMucXVlcnlTZWxlY3RvcigncHJvcGVydGllcycpKSB7XG4gICAgICAodGhpcy5xdWVyeVNlbGVjdG9yKCdwcm9wZXJ0aWVzJykgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBhbnkgPVxuICAgICAgdHlwZSA9PSAnSU1TJ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHRoaXMuZGF0YXNldCxcbiAgICAgICAgICAgIG9ucmVhZHk6ICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ29ucmVhZHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDogdGhpcy5nZXRUQU9Db25maWcodGhpcyk7XG4gICAgaWYgKHR5cGUgPT0gJ0lNUycpIHtcbiAgICAgIHBjaS5nZXRJbnN0YW5jZShkb20sIGNvbmZpZywgdW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgKHBjaSBhcyBhbnkpLmluaXRpYWxpemUodGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyLCBkb20uZmlyc3RFbGVtZW50Q2hpbGQsIGNvbmZpZyk7XG4gICAgfVxuICAgIGlmICh0eXBlID09ICdUQU8nKSB7XG4gICAgICBjb25zdCBsaW5rcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rJykpLm1hcChhY2MgPT4gYWNjLmdldEF0dHJpYnV0ZSgnaHJlZicpKTtcbiAgICAgIGxpbmtzLmZvckVhY2gobGluayA9PiB7XG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgc3R5bGVzLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgICAgc3R5bGVzLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgICAgICBzdHlsZXMubWVkaWEgPSAnc2NyZWVuJztcbiAgICAgICAgc3R5bGVzLmhyZWYgPSBsaW5rO1xuICAgICAgICBkb20uYXBwZW5kQ2hpbGQoc3R5bGVzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0Q2hlY2tpbmcoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBkZWZpbmUoJ3F0aUN1c3RvbUludGVyYWN0aW9uQ29udGV4dCcsICgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZ2lzdGVyOiBjdHhBID0+IHtcbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyKGN0eEEpO1xuICAgICAgICB9LFxuICAgICAgICBub3RpZnlSZWFkeTogKCkgPT4ge1xuICAgICAgICAgIC8qIG9ubHkgdXNlZCBpbiB0aGUgVEFPIHZlcnNpb24gKi9cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuYnVpbGRSZXF1aXJlQ29uZmlnKCk7XG4gICAgY29uc3QgcmVxdWlyZVBDSSA9IHJlcXVpcmVqcy5jb25maWcoY29uZmlnKTtcbiAgICByZXF1aXJlUENJKFsncmVxdWlyZSddLCByZXF1aXJlID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZHluYW1pYy1yZXF1aXJlXG4gICAgICByZXF1aXJlKFt0aGlzLm1vZHVsZV0pO1xuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICByZXF1aXJlanMudW5kZWYodGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyKTtcbiAgICAvLyBDbGVhciB0aGUgbW9kdWxlcyBpbiB0aGUgY29udGV4dFxuICAgIGNvbnN0IGNvbnRleHQgPSByZXF1aXJlanMucy5jb250ZXh0cztcbiAgICBkZWxldGUgY29udGV4dFt0aGlzLmN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXJdO1xuICAgIHRoaXMuc3RvcENoZWNraW5nKCk7XG4gIH1cblxuICBidWlsZFJlcXVpcmVDb25maWcoKSB7XG4gICAgLy8gU2V0IFJlcXVpcmVKUyBwYXRocyBhbmQgc2hpbSBjb25maWd1cmF0aW9uIGlmIGF2YWlsYWJsZVxuICAgIGNvbnN0IGNvbmZpZzogTW9kdWxlUmVzb2x1dGlvbkNvbmZpZyA9IHtcbiAgICAgIGNvbnRleHQ6IHRoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcixcbiAgICAgIGNhdGNoRXJyb3I6IHRydWUsXG4gICAgICBwYXRoczogd2luZG93WydyZXF1aXJlUGF0aHMnXSB8fCB7fSxcbiAgICAgIHNoaW06IHdpbmRvd1sncmVxdWlyZVNoaW0nXSB8fCB7fVxuICAgIH07XG4gICAgLy8gQ2hlY2sgaWYgUmVxdWlyZUpTIGlzIGF2YWlsYWJsZSwgaWYgbm90LCBzZXQgYW4gZXJyb3IgbWVzc2FnZVxuICAgIGlmICghZ2xvYmFsVGhpcy5yZXF1aXJlKSB7XG4gICAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSBgUmVxdWlyZUpTIG5vdCBmb3VuZC4gUGxlYXNlIGxvYWQgaXQgdmlhIENETjogaHR0cHM6Ly9jZG5qcy5jb20vbGlicmFyaWVzL3JlcXVpcmUuanNgO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1iYXNlLXVybCcpO1xuICAgIGNvbnN0IGludGVyYWN0aW9uTW9kdWxlcyA9IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVyYWN0aW9uLW1vZHVsZXMnKTtcblxuICAgIGlmIChpbnRlcmFjdGlvbk1vZHVsZXMpIHtcbiAgICAgIGNvbnN0IG1vZHVsZXMgPSBpbnRlcmFjdGlvbk1vZHVsZXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWludGVyYWN0aW9uLW1vZHVsZScpO1xuICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuICAgICAgICBjb25zdCBtb2R1bGVJZCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG4gICAgICAgIGNvbnN0IHByaW1hcnlQYXRoID0gbW9kdWxlLmdldEF0dHJpYnV0ZSgncHJpbWFyeS1wYXRoJyk7XG4gICAgICAgIGNvbnN0IGZhbGxiYWNrUGF0aCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ2ZhbGxiYWNrLXBhdGgnKTtcblxuICAgICAgICBpZiAobW9kdWxlSWQgJiYgcHJpbWFyeVBhdGgpIHtcbiAgICAgICAgICAvLyBTZXQgdGhlIHBhdGhzIHVzaW5nIFJlcXVpcmVKUydzIGZhbGxiYWNrIGFycmF5XG4gICAgICAgICAgY29uc3QgcGF0aHMgPSBmYWxsYmFja1BhdGhcbiAgICAgICAgICAgID8gdGhpcy5jb21iaW5lUmVxdWlyZVJlc29sdmVQYXRocyhcbiAgICAgICAgICAgICAgICB0aGlzLmdldFJlc29sdmFibGVQYXRoKHByaW1hcnlQYXRoLCBiYXNlVXJsKSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldFJlc29sdmFibGVQYXRoKGZhbGxiYWNrUGF0aCwgYmFzZVVybClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB0aGlzLmdldFJlc29sdmFibGVQYXRoKHByaW1hcnlQYXRoLCBiYXNlVXJsKTtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1BhdGggPSBjb25maWcucGF0aHNbbW9kdWxlSWRdIHx8IFtdO1xuICAgICAgICAgIGNvbmZpZy5wYXRoc1ttb2R1bGVJZF0gPSB0aGlzLmNvbWJpbmVSZXF1aXJlUmVzb2x2ZVBhdGhzKGV4aXN0aW5nUGF0aCwgcGF0aHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcml2YXRlIGNvbWJpbmVSZXF1aXJlUmVzb2x2ZVBhdGhzKHBhdGgxOiBzdHJpbmcgfCBzdHJpbmdbXSwgcGF0aDI6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcGF0aDFBcnJheSA9IEFycmF5LmlzQXJyYXkocGF0aDEpID8gcGF0aDEgOiBbcGF0aDFdO1xuICAgIGNvbnN0IHBhdGgyQXJyYXkgPSBBcnJheS5pc0FycmF5KHBhdGgyKSA/IHBhdGgyIDogW3BhdGgyXTtcbiAgICByZXR1cm4gcGF0aDFBcnJheS5jb25jYXQocGF0aDJBcnJheSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURvdWJsZVNsYXNoZXMoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzaW5nbGVGb3J3YXJkU2xhc2hlcyA9IHN0clxuICAgICAgLnJlcGxhY2UoLyhbXjpdXFwvKVxcLysvZywgJyQxJylcbiAgICAgIC5yZXBsYWNlKC9cXC9cXC8vZywgJy8nKVxuICAgICAgLnJlcGxhY2UoJ2h0dHA6LycsICdodHRwOi8vJylcbiAgICAgIC5yZXBsYWNlKCdodHRwczovJywgJ2h0dHBzOi8vJyk7XG4gICAgcmV0dXJuIHNpbmdsZUZvcndhcmRTbGFzaGVzO1xuICB9XG5cbiAgbG9hZENvbmZpZyA9IGFzeW5jICh1cmw6IHN0cmluZywgYmFzZVVybD86IHN0cmluZyk6IFByb21pc2U8TW9kdWxlUmVzb2x1dGlvbkNvbmZpZz4gPT4ge1xuICAgIHVybCA9IHRoaXMucmVtb3ZlRG91YmxlU2xhc2hlcyh1cmwpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1aXJlQ29uZmlnID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgIGlmIChyZXF1aXJlQ29uZmlnLm9rKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHJlcXVpcmVDb25maWcuanNvbigpO1xuICAgICAgICBjb25zdCBtb2R1bGVDb25nID0gY29uZmlnIGFzIE1vZHVsZVJlc29sdXRpb25Db25maWc7XG4gICAgICAgIGZvciAoY29uc3QgbW9kdWxlSWQgaW4gbW9kdWxlQ29uZy5wYXRocykge1xuICAgICAgICAgIGlmIChiYXNlVXJsKSB7XG4gICAgICAgICAgICBtb2R1bGVDb25nLnBhdGhzW21vZHVsZUlkXSA9IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGgobW9kdWxlQ29uZy5wYXRoc1ttb2R1bGVJZF0sIGJhc2VVcmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kdWxlQ29uZztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGdldFJlc29sdmFibGVQYXRoU3RyaW5nID0gKHBhdGg6IHN0cmluZywgYmFzZVBhdGg/OiBzdHJpbmcpID0+IHtcbiAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC5qcyQvLCAnJyk7XG4gICAgcmV0dXJuIHBhdGg/LnRvTG9jYWxlTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnaHR0cCcpIHx8ICFiYXNlUGF0aFxuICAgICAgPyBwYXRoXG4gICAgICA6IHRoaXMucmVtb3ZlRG91YmxlU2xhc2hlcyhgJHtiYXNlUGF0aH0vJHtwYXRofWApO1xuICB9O1xuXG4gIGdldFJlc29sdmFibGVQYXRoID0gKHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLCBiYXNlUGF0aD86IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhdGgpXG4gICAgICA/IHBhdGgubWFwKHAgPT4gdGhpcy5nZXRSZXNvbHZhYmxlUGF0aFN0cmluZyhwLCBiYXNlUGF0aCkpXG4gICAgICA6IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGhTdHJpbmcocGF0aCwgYmFzZVBhdGgpO1xuICB9O1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+JHt0aGlzLl9lcnJvck1lc3NhZ2UgJiZcbiAgICAgIGh0bWxgPGRpdiBzdHlsZT1cImNvbG9yOnJlZFwiPlxuICAgICAgICA8aDE+RXJyb3I8L2gxPlxuICAgICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZX1cbiAgICAgIDwvZGl2PmB9YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJzogUXRpUG9ydGFibGVDdXN0b21JbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBUb3VjaERyYWdBbmREcm9wIHtcbiAgcHJpdmF0ZSB0b3VjaFN0YXJ0VGltZSA9IDA7IC8vIFRpbWVzdGFtcCBvZiB0aGUgZmlyc3QgdG91Y2hcbiAgcHJpdmF0ZSB0b3VjaFN0YXJ0UG9pbnQgPSBudWxsOyAvLyBQb2ludCBvZiB0aGUgZmlyc3QgdG91Y2hcbiAgcHJpdmF0ZSBsYXN0Q2xpY2tUaW1lID0gMDsgLy8gVGltZXN0YW1wIG9mIHRoZSBwcmV2aW91cyBjbGlja1xuICBwcml2YXRlIGlzRHJhZ2dhYmxlID0gZmFsc2U7IC8vIFdoZXRoZXIgYSBkcmFnZ2FibGUgZWxlbWVudCBpcyBhY3RpdmVcbiAgcHJpdmF0ZSBkcmFnU291cmNlOiBIVE1MRWxlbWVudCA9IG51bGw7IC8vIFRoZSBzb3VyY2UgZWxlbWVudCBiZWluZyBkcmFnZ2VkXG4gIHByaXZhdGUgZHJhZ0Nsb25lOiBIVE1MRWxlbWVudCA9IG51bGw7IC8vIENsb25lIG9mIGRyYWcgc291cmNlIGZvciB2aXN1YWwgZmVlZGJhY2tcbiAgcHJpdmF0ZSB0b3VjaEVuZFRyaWdnZXJlZCA9IGZhbHNlOyAvLyBGbGFnIGZvciB0b3VjaEVuZCBldmVudFxuICBwcml2YXRlIGlzRHJhZ2dpbmcgPSBmYWxzZTsgLy8gV2hldGhlciBhIGRyYWcgb3BlcmF0aW9uIGlzIG9uZ29pbmdcbiAgcHJpdmF0ZSBpbml0aWFsVHJhbnNmb3JtID0gJyc7IC8vIE9yaWdpbmFsIHRyYW5zZm9ybSBzdHlsZVxuICBwcml2YXRlIGhhc0Rpc3BhdGNoZWREcmFnU3RhcnQgPSBmYWxzZTsgLy8gRmxhZyB0byBlbnN1cmUgZHJhZ3N0YXJ0IGV2ZW50IGlzIGRpc3BhdGNoZWQgb25jZVxuICBwcml2YXRlIHJvb3ROb2RlOiBOb2RlID0gbnVsbDsgLy8gUm9vdCBub2RlIGZvciBib3VuZGFyeSBjYWxjdWxhdGlvbnNcblxuICBwcml2YXRlIGZvY3VzZWRFbGVtZW50OiBIVE1MRWxlbWVudCA9IG51bGw7IC8vIFRvIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnRseSBmb2N1c2VkIGRyYWdnYWJsZSBlbGVtZW50XG4gIHByaXZhdGUgZm9jdXNhYmxlRHJvcFpvbmVzOiBIVE1MRWxlbWVudFtdID0gW107IC8vIEFsbCBkcm9wem9uZXMgZm9yIGtleWJvYXJkIG5hdmlnYXRpb25cbiAgcHJpdmF0ZSBjdXJyZW50RHJvcFpvbmVJbmRleCA9IC0xOyAvLyBJbmRleCBmb3IgdGFiYmluZyB0aHJvdWdoIGRyb3Agem9uZXNcblxuICBwcml2YXRlIGRhdGFUcmFuc2ZlciA9IHtcbiAgICBkYXRhOiB7fSxcbiAgICBzZXREYXRhKHR5cGUsIHZhbCkge1xuICAgICAgdGhpcy5kYXRhW3R5cGVdID0gdmFsO1xuICAgIH0sXG4gICAgZ2V0RGF0YSh0eXBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhW3R5cGVdO1xuICAgIH0sXG4gICAgZWZmZWN0QWxsb3dlZDogJ21vdmUnXG4gIH07XG4gIHByaXZhdGUgY2xvbmVPZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTsgLy8gT2Zmc2V0IGZvciBwb3NpdGlvbmluZyB0aGUgZHJhZyBjbG9uZVxuXG4gIHByaXZhdGUgbGFzdFRhcmdldCA9IG51bGw7IC8vIExhc3QgdG91Y2ggdGFyZ2V0XG4gIHByaXZhdGUgY3VycmVudERyb3BUYXJnZXQgPSBudWxsOyAvLyBDdXJyZW50IGRyb3BwYWJsZSBlbGVtZW50XG4gIHByaXZhdGUgYWxsb3dDbGljayA9IHRydWU7IC8vIEZsYWcgdG8gYWxsb3cgb3IgcHJldmVudCBjbGlja1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogVG91Y2hEcmFnQW5kRHJvcDtcblxuICBjb3B5U3R5bGVzRm9yRHJhZ0Nsb25lID0gdHJ1ZTtcbiAgZHJhZ09uQ2xpY2tFbmFibGVkID0gZmFsc2U7XG4gIHVzZURyYWdDbG9uZSA9IGZhbHNlOyAvLyBTZXQgdG8gdHJ1ZSB0byBkcmFnIHdpdGggYSBjbG9uZTsgc2V0IHRvIGZhbHNlIHRvIGRyYWcgdGhlIG9yaWdpbmFsIGVsZW1lbnRcblxuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9EUkFHX0RJU1RBTkNFID0gNTsgLy8gTWluaW11bSBwaXhlbCBtb3ZlbWVudCB0byBzdGFydCBkcmFnZ2luZ1xuICBwcml2YXRlIHJlYWRvbmx5IERSQUdfQ0xPTkVfT1BBQ0lUWSA9IDE7IC8vIE9wYWNpdHkgb2YgdGhlIGRyYWcgY2xvbmUgZWxlbWVudFxuICBpbml0aWFsVHJhbnNpdGlvbjogc3RyaW5nO1xuICAvLyBkcm9wcGFibGVzOiBFbGVtZW50W107XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKFRvdWNoRHJhZ0FuZERyb3AuaW5zdGFuY2UpIHtcbiAgICAgIHJldHVybiBUb3VjaERyYWdBbmREcm9wLmluc3RhbmNlO1xuICAgIH1cbiAgICBUb3VjaERyYWdBbmREcm9wLmluc3RhbmNlID0gdGhpcztcblxuICAgIC8vIEFkZCBldmVudCBsaXN0ZW5lcnMgZm9yIHRvdWNoIGFuZCBtb3VzZSBpbnRlcmFjdGlvbnNcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLmhhbmRsZVRvdWNoTW92ZS5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuaGFuZGxlVG91Y2hNb3ZlLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLmhhbmRsZVRvdWNoRW5kLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuaGFuZGxlVG91Y2hFbmQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMuaGFuZGxlVG91Y2hDYW5jZWwuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleURvd24uYmluZCh0aGlzKSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLmhhbmRsZUtleVVwLmJpbmQodGhpcykpO1xuICB9XG5cbiAgYWRkRHJhZ2dhYmxlRWxlbWVudHMoZHJhZ2dhYmxlczogRWxlbWVudFtdKSB7XG4gICAgZHJhZ2dhYmxlcy5mb3JFYWNoKGVsID0+IHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpOyAvLyBNYWtlIGRyYWdnYWJsZSBlbGVtZW50cyBmb2N1c2FibGVcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgKCkgPT4gKHRoaXMuZm9jdXNlZEVsZW1lbnQgPSBlbCBhcyBIVE1MRWxlbWVudCkpO1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+ICh0aGlzLmZvY3VzZWRFbGVtZW50ID0gbnVsbCkpO1xuXG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGFkZERyb3BwYWJsZUVsZW1lbnRzKGRyb3BwYWJsZXM6IEVsZW1lbnRbXSkge1xuICAvLyAgIC8vIHRoaXMuZHJvcHBhYmxlcyA9IGRyb3BwYWJsZXM7XG4gIC8vICAgZHJvcHBhYmxlcy5mb3JFYWNoKGVsID0+IHtcbiAgLy8gICAgIGVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpOyAvLyBNYWtlIGRyYWdnYWJsZSBlbGVtZW50cyBmb2N1c2FibGVcbiAgLy8gICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgKCkgPT4gKHRoaXMuZm9jdXNlZEVsZW1lbnQgPSBlbCBhcyBIVE1MRWxlbWVudCkpO1xuICAvLyAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+ICh0aGlzLmZvY3VzZWRFbGVtZW50ID0gbnVsbCkpO1xuXG4gIC8vICAgICAvLyBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gIC8vICAgICAvLyBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIHByaXZhdGUgaGFuZGxlVG91Y2hTdGFydChlKSB7XG4gICAgdGhpcy50b3VjaFN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmdldEV2ZW50Q29vcmRpbmF0ZXMoZSk7XG4gICAgdGhpcy50b3VjaFN0YXJ0UG9pbnQgPSB7IHgsIHkgfTtcbiAgICB0aGlzLmRyYWdTb3VyY2UgPSBlLmN1cnJlbnRUYXJnZXQ7XG4gICAgdGhpcy5pc0RyYWdnYWJsZSA9IHRydWU7XG5cbiAgICAvLyBHZXQgdGhlIHJvb3Qgbm9kZVxuICAgIHRoaXMucm9vdE5vZGUgPSB0aGlzLmRyYWdTb3VyY2UuZ2V0Um9vdE5vZGUoKTtcblxuICAgIGlmICh0aGlzLmRyYWdPbkNsaWNrRW5hYmxlZCkge1xuICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3JlYXRlRHJhZ0Nsb25lKGUsIHsgY2xpZW50WDogeCwgY2xpZW50WTogeSB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudXNlRHJhZ0Nsb25lKSB7XG4gICAgICAvLyBTYXZlIGluaXRpYWwgdHJhbnNmb3JtXG4gICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5kcmFnU291cmNlKTtcbiAgICAgIHRoaXMuaW5pdGlhbFRyYW5zZm9ybSA9IGNvbXB1dGVkU3R5bGUudHJhbnNmb3JtID09PSAnbm9uZScgPyAnJyA6IGNvbXB1dGVkU3R5bGUudHJhbnNmb3JtO1xuXG4gICAgICAvLyBTYXZlIHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9uIHN0eWxlXG4gICAgICB0aGlzLmluaXRpYWxUcmFuc2l0aW9uID0gY29tcHV0ZWRTdHlsZS50cmFuc2l0aW9uIHx8ICcnO1xuXG4gICAgICAvLyBEaXNhYmxlIHRyYW5zaXRpb25zXG4gICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUudHJhbnNpdGlvbiA9ICdub25lJztcblxuICAgICAgLy8gQ2FsY3VsYXRlIGNsb25lIG9mZnNldFxuICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZHJhZ1NvdXJjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMuY2xvbmVPZmZzZXQueCA9IHggLSByZWN0LmxlZnQ7XG4gICAgICB0aGlzLmNsb25lT2Zmc2V0LnkgPSB5IC0gcmVjdC50b3A7XG5cbiAgICAgIC8vIFNldCBoaWdoZXIgei1pbmRleCB0byBicmluZyBpdCBvbiB0b3BcbiAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS56SW5kZXggPSAnOTk5OSc7XG4gICAgICAvLyB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJzsgLy8gU28gaXQgZG9lc24ndCBibG9jayBldmVudHNcbiAgICAgIHRoaXMuZHJhZ1NvdXJjZS5mb2N1cygpO1xuICAgIH1cblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVG91Y2hNb3ZlKGUpIHtcbiAgICBpZiAodGhpcy5pc0RyYWdnYWJsZSAmJiB0aGlzLmRyYWdTb3VyY2UpIHtcbiAgICAgIGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5nZXRFdmVudENvb3JkaW5hdGVzKGUpO1xuICAgICAgY29uc3QgY3VycmVudFRvdWNoID0geyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH07XG5cbiAgICAgIGlmICh0aGlzLmNhbGN1bGF0ZURyYWdEaXN0YW5jZShjdXJyZW50VG91Y2gpID49IHRoaXMuTUlOX0RSQUdfRElTVEFOQ0UpIHtcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7IC8vIFNvIGl0IGRvZXNuJ3QgYmxvY2sgZXZlbnRzXG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3JlYXRlRHJhZ0Nsb25lKGUsIGN1cnJlbnRUb3VjaCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEcmFnQ2xvbmUoZSwgY3VycmVudFRvdWNoOiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0pIHtcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZykgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMudXNlRHJhZ0Nsb25lKSB7XG4gICAgICAvLyBFeGlzdGluZyBjb2RlIGZvciBjcmVhdGluZyBhbmQgaGFuZGxpbmcgdGhlIGRyYWcgY2xvbmVcbiAgICAgIGlmICghdGhpcy5kcmFnQ2xvbmUpIHtcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLm9wYWNpdHkgPSB0aGlzLkRSQUdfQ0xPTkVfT1BBQ0lUWS50b1N0cmluZygpO1xuICAgICAgICB0aGlzLmRyYWdDbG9uZSA9IHRoaXMuZHJhZ1NvdXJjZS5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMuY29weVN0eWxlc0ZvckRyYWdDbG9uZSkge1xuICAgICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5kcmFnU291cmNlKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN0eWxlIG9mIGNvbXB1dGVkU3R5bGVzKSB7XG4gICAgICAgICAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZVtzdHlsZV0gPSBjb21wdXRlZFN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNb3ZlIHRoZSBkcmFnIGNsb25lIHRvIHRoZSByb290IG5vZGVcbiAgICAgICAgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICAgICAgLy8gQXBwZW5kIHRvIHRoZSBob3N0IG9mIHRoZSBzaGFkb3cgcm9vdFxuICAgICAgICAgIHRoaXMucm9vdE5vZGUuaG9zdC5hcHBlbmRDaGlsZCh0aGlzLmRyYWdDbG9uZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmRyYWdDbG9uZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNsb25lUG9zaXRpb24oY3VycmVudFRvdWNoKTtcbiAgICAgICAgdGhpcy5zZXREcmFnQ2xvbmVTdHlsZXMoY3VycmVudFRvdWNoKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuZHJhZ1NvdXJjZSwgJ2RyYWdzdGFydCcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVwZGF0ZURyYWdDbG9uZVBvc2l0aW9uKGN1cnJlbnRUb3VjaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhhbmRsZSBkcmFnZ2luZyB0aGUgb3JpZ2luYWwgZWxlbWVudCB1c2luZyBDU1MgdHJhbnNmb3Jtc1xuICAgICAgaWYgKHRoaXMudG91Y2hTdGFydFBvaW50KSB7XG4gICAgICAgIGNvbnN0IGRlbHRhWCA9IGN1cnJlbnRUb3VjaC5jbGllbnRYIC0gdGhpcy50b3VjaFN0YXJ0UG9pbnQueDtcbiAgICAgICAgY29uc3QgZGVsdGFZID0gY3VycmVudFRvdWNoLmNsaWVudFkgLSB0aGlzLnRvdWNoU3RhcnRQb2ludC55O1xuXG4gICAgICAgIC8vIEFwcGx5IGJvdW5kYXJpZXNcbiAgICAgICAgLy8gY29uc3QgeyBib3VuZGVkRGVsdGFYLCBib3VuZGVkRGVsdGFZIH0gPSB0aGlzLmFwcGx5VHJhbnNmb3JtQm91bmRhcmllcyhkZWx0YVgsIGRlbHRhWSk7XG4gICAgICAgIC8vIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2Zvcm0gPSBgJHt0aGlzLmluaXRpYWxUcmFuc2Zvcm19IHRyYW5zbGF0ZSgke2JvdW5kZWREZWx0YVh9cHgsICR7Ym91bmRlZERlbHRhWX1weClgO1xuXG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2Zvcm0gPSBgJHt0aGlzLmluaXRpYWxUcmFuc2Zvcm19IHRyYW5zbGF0ZSgke2RlbHRhWH1weCwgJHtkZWx0YVl9cHgpYDtcblxuICAgICAgICBpZiAoIXRoaXMuaGFzRGlzcGF0Y2hlZERyYWdTdGFydCkge1xuICAgICAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnc3RhcnQnKTtcbiAgICAgICAgICB0aGlzLmhhc0Rpc3BhdGNoZWREcmFnU3RhcnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZHJvcFRhcmdldCA9IHRoaXMuZmluZERyb3BUYXJnZXQoZSk7XG5cbiAgICBpZiAoZHJvcFRhcmdldCAhPT0gdGhpcy5sYXN0VGFyZ2V0KSB7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQoZHJvcFRhcmdldCwgJ2RyYWdlbnRlcicpO1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMubGFzdFRhcmdldCwgJ2RyYWdsZWF2ZScpO1xuICAgICAgdGhpcy5sYXN0VGFyZ2V0ID0gZHJvcFRhcmdldDtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0ID0gZHJvcFRhcmdldDtcbiAgICBpZiAodGhpcy5jdXJyZW50RHJvcFRhcmdldCkgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KGRyb3BUYXJnZXQsICdkcmFnb3ZlcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaEVuZChlKSB7XG4gICAgdGhpcy50b3VjaEVuZFRyaWdnZXJlZCA9IHRydWU7XG4gICAgdGhpcy5pc0RyYWdnYWJsZSA9IGZhbHNlO1xuICAgIGxldCBkcm9wRm91bmQgPSBmYWxzZTtcblxuICAgIC8vIGNvbnNvbGUubG9nKCdkcm9wRm91bmQnLCBkcm9wRm91bmQpO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudERyb3BUYXJnZXQpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0LCAnZHJvcCcpO1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuZHJhZ1NvdXJjZSwgJ2RyYWdlbmQnKTtcbiAgICAgIGRyb3BGb3VuZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgIGNvbnN0IGRyYWdFbmRFdmVudCA9IG5ldyBDdXN0b21FdmVudCgnZHJhZ2VuZCcsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICAgIGRyYWdFbmRFdmVudFsnZGF0YVRyYW5zZmVyJ10gPSB7IGRyb3BFZmZlY3Q6ICdub25lJyB9O1xuICAgICAgdGhpcy5kcmFnU291cmNlPy5kaXNwYXRjaEV2ZW50KGRyYWdFbmRFdmVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNldERyYWdTdGF0ZShkcm9wRm91bmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaENhbmNlbChlKSB7XG4gICAgdGhpcy5yZXNldERyYWdTdGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kRHJvcFRhcmdldChldmVudCkge1xuICAgIGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5nZXRFdmVudENvb3JkaW5hdGVzKGV2ZW50KTtcbiAgICByZXR1cm4gdGhpcy5nZXREcm9wVGFyZ2V0QXRQb2ludChkb2N1bWVudCwgeCwgeSk7XG4gIH1cblxuICBwcml2YXRlIGdldERyb3BUYXJnZXRBdFBvaW50KHJvb3Q6IERvY3VtZW50T3JTaGFkb3dSb290LCB4OiBudW1iZXIsIHk6IG51bWJlciwgZGVwdGg6IG51bWJlciA9IDApOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgLy8gTGltaXQgdGhlIHJlY3Vyc2lvbiBkZXB0aFxuICAgIGNvbnN0IE1BWF9ERVBUSCA9IDI7XG4gICAgaWYgKGRlcHRoID4gTUFYX0RFUFRIKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gcm9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Ryb3B6b25lJykpIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8vIFRyYXZlcnNlIHVwIHRoZSBET00gdHJlZSB0byBmaW5kIGFuIGFuY2VzdG9yIHdpdGggJ2Ryb3B6b25lJyBhdHRyaWJ1dGVcbiAgICBsZXQgY3VycmVudEVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50KSB7XG4gICAgICBpZiAoY3VycmVudEVsZW1lbnQuaGFzQXR0cmlidXRlKCdkcm9wem9uZScpKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudDtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBTaGFkb3cgRE9NIGFuZCBkZXB0aCBsaW1pdCBub3QgcmVhY2hlZCwgdHJhdmVyc2UgaXRcbiAgICBpZiAoZWxlbWVudC5zaGFkb3dSb290ICYmIGRlcHRoIDwgTUFYX0RFUFRIKSB7XG4gICAgICBjb25zdCBzaGFkb3dFbGVtZW50ID0gdGhpcy5nZXREcm9wVGFyZ2V0QXRQb2ludChlbGVtZW50LnNoYWRvd1Jvb3QsIHgsIHksIGRlcHRoICsgMSk7XG4gICAgICBpZiAoc2hhZG93RWxlbWVudCkge1xuICAgICAgICByZXR1cm4gc2hhZG93RWxlbWVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBObyBlbGVtZW50IHdpdGggJ2Ryb3B6b25lJyBmb3VuZFxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVLZXlEb3duKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAodGhpcy5mb2N1c2VkRWxlbWVudCkge1xuICAgICAgaWYgKGUua2V5ID09PSAnICcgJiYgIXRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAvLyBTcGFjZWJhciBwcmVzc2VkIHRvIHN0YXJ0IGRyYWdnaW5nXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5pc0RyYWdnYWJsZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZSA9IHRoaXMuZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG5cbiAgICAgICAgLy8gU3RvcmUgdGhlIGRyb3Agem9uZXMgZm9yIG5hdmlnYXRpb25cbiAgICAgICAgdGhpcy5jb2xsZWN0RHJvcFpvbmVzKCk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciBkcmFnc3RhcnQgZXZlbnRcbiAgICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuZHJhZ1NvdXJjZSwgJ2RyYWdzdGFydCcpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ1RhYicgJiYgdGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgIC8vIFRhYiBrZXkgdG8gbmF2aWdhdGUgdGhyb3VnaCBkcm9wIHpvbmVzXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5tb3ZlVG9OZXh0RHJvcFpvbmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUtleVVwKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoZS5rZXkgPT09ICcgJyAmJiB0aGlzLmlzRHJhZ2dpbmcgJiYgdGhpcy5jdXJyZW50RHJvcFRhcmdldCkge1xuICAgICAgLy8gU3BhY2ViYXIgcHJlc3NlZCBhZ2FpbiB0byBkcm9wIHRoZSBlbGVtZW50XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5jdXJyZW50RHJvcFRhcmdldCwgJ2Ryb3AnKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnZW5kJyk7XG4gICAgICB0aGlzLnJlc2V0RHJhZ1N0YXRlKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29sbGVjdERyb3Bab25lcygpIHtcbiAgICAvLyBDb2xsZWN0IGFsbCBlbGVtZW50cyB3aXRoIGRyb3B6b25lIGF0dHJpYnV0ZVxuICAgIHRoaXMuZm9jdXNhYmxlRHJvcFpvbmVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZHJvcHpvbmVdJykpIGFzIEhUTUxFbGVtZW50W107IC8vIEFycmF5LmZyb20odGhpcy5kcm9wcGFibGVzKTtcbiAgICB0aGlzLmN1cnJlbnREcm9wWm9uZUluZGV4ID0gLTE7IC8vIFJlc2V0IG5hdmlnYXRpb24gaW5kZXhcbiAgfVxuXG4gIHByaXZhdGUgbW92ZVRvTmV4dERyb3Bab25lKCkge1xuICAgIGlmICh0aGlzLmZvY3VzYWJsZURyb3Bab25lcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIFVwZGF0ZSBpbmRleCBmb3IgdGhlIG5leHQgZHJvcCB6b25lXG4gICAgdGhpcy5jdXJyZW50RHJvcFpvbmVJbmRleCA9ICh0aGlzLmN1cnJlbnREcm9wWm9uZUluZGV4ICsgMSkgJSB0aGlzLmZvY3VzYWJsZURyb3Bab25lcy5sZW5ndGg7XG5cbiAgICAvLyBGb2N1cyB0aGUgbmV4dCBkcm9wIHpvbmVcbiAgICBjb25zdCBuZXh0RHJvcFpvbmUgPSB0aGlzLmZvY3VzYWJsZURyb3Bab25lc1t0aGlzLmN1cnJlbnREcm9wWm9uZUluZGV4XTtcbiAgICBuZXh0RHJvcFpvbmUuZm9jdXMoKTtcblxuICAgIC8vIFVwZGF0ZSBjdXJyZW50IGRyb3AgdGFyZ2V0XG4gICAgdGhpcy5jdXJyZW50RHJvcFRhcmdldCA9IG5leHREcm9wWm9uZTtcblxuICAgIC8vIERpc3BhdGNoIGRyYWdlbnRlciBldmVudFxuICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudChuZXh0RHJvcFpvbmUsICdkcmFnZW50ZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXZlbnRDb29yZGluYXRlcyhldmVudCwgcGFnZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgdG91Y2ggPSBldmVudC50b3VjaGVzID8gZXZlbnQudG91Y2hlc1swXSA6IGV2ZW50O1xuICAgIHJldHVybiB7XG4gICAgICB4OiBwYWdlID8gdG91Y2gucGFnZVggOiB0b3VjaC5jbGllbnRYLFxuICAgICAgeTogcGFnZSA/IHRvdWNoLnBhZ2VZIDogdG91Y2guY2xpZW50WVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUNsb25lUG9zaXRpb24odG91Y2gpIHtcbiAgICBjb25zdCByZWN0ID0gdGhpcy5kcmFnU291cmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMuY2xvbmVPZmZzZXQueCA9IHRvdWNoLmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgdGhpcy5jbG9uZU9mZnNldC55ID0gdG91Y2guY2xpZW50WSAtIHJlY3QudG9wO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREcmFnQ2xvbmVTdHlsZXModG91Y2gpIHtcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUudG9wID0gYCR7dG91Y2guY2xpZW50WSAtIHRoaXMuY2xvbmVPZmZzZXQueX1weGA7XG4gICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUubGVmdCA9IGAke3RvdWNoLmNsaWVudFggLSB0aGlzLmNsb25lT2Zmc2V0Lnh9cHhgO1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUuekluZGV4ID0gJzk5OTk5OSc7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURyYWdDbG9uZVBvc2l0aW9uKHRvdWNoKSB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnRvdWNoRW5kVHJpZ2dlcmVkIHx8ICF0aGlzLmRyYWdDbG9uZSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBuZXdMZWZ0ID0gdG91Y2guY2xpZW50WCAtIHRoaXMuY2xvbmVPZmZzZXQueDtcbiAgICAgIGNvbnN0IG5ld1RvcCA9IHRvdWNoLmNsaWVudFkgLSB0aGlzLmNsb25lT2Zmc2V0Lnk7XG5cbiAgICAgIC8vIEFwcGx5IGJvdW5kYXJpZXNcbiAgICAgIGNvbnN0IHsgbmV3TGVmdDogYm91bmRlZExlZnQsIG5ld1RvcDogYm91bmRlZFRvcCB9ID0gdGhpcy5hcHBseUJvdW5kYXJpZXMobmV3TGVmdCwgbmV3VG9wLCB0aGlzLmRyYWdDbG9uZSk7XG5cbiAgICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLmxlZnQgPSBgJHtib3VuZGVkTGVmdH1weGA7XG4gICAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS50b3AgPSBgJHtib3VuZGVkVG9wfXB4YDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlUcmFuc2Zvcm1Cb3VuZGFyaWVzKGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlcikge1xuICAgIC8vIEdldCB0aGUgYm91bmRhcmllcyBvZiB0aGUgcm9vdCBub2RlXG4gICAgbGV0IGJvdW5kYXJ5UmVjdDogRE9NUmVjdDtcbiAgICBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IHRoaXMucm9vdE5vZGUuaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgICAgYm91bmRhcnlSZWN0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IHRvIHZpZXdwb3J0XG4gICAgICBib3VuZGFyeVJlY3QgPSBuZXcgRE9NUmVjdCgwLCAwLCB3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGRpbWVuc2lvbnMgYW5kIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50XG4gICAgY29uc3QgZWxlbWVudFJlY3QgPSB0aGlzLmRyYWdTb3VyY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZWxlbWVudFdpZHRoID0gZWxlbWVudFJlY3Qud2lkdGg7XG4gICAgY29uc3QgZWxlbWVudEhlaWdodCA9IGVsZW1lbnRSZWN0LmhlaWdodDtcblxuICAgIC8vIENhbGN1bGF0ZSBwb3RlbnRpYWwgbmV3IHBvc2l0aW9uXG4gICAgY29uc3QgbmV3TGVmdCA9IGVsZW1lbnRSZWN0LmxlZnQgKyBkZWx0YVg7XG4gICAgY29uc3QgbmV3VG9wID0gZWxlbWVudFJlY3QudG9wICsgZGVsdGFZO1xuXG4gICAgLy8gTGltaXQgdGhlIG5ldyBwb3NpdGlvbiB3aXRoaW4gdGhlIGJvdW5kYXJpZXNcbiAgICBjb25zdCBib3VuZGVkTGVmdCA9IE1hdGgubWF4KGJvdW5kYXJ5UmVjdC5sZWZ0LCBNYXRoLm1pbihuZXdMZWZ0LCBib3VuZGFyeVJlY3QucmlnaHQgLSBlbGVtZW50V2lkdGgpKTtcbiAgICBjb25zdCBib3VuZGVkVG9wID0gTWF0aC5tYXgoYm91bmRhcnlSZWN0LnRvcCwgTWF0aC5taW4obmV3VG9wLCBib3VuZGFyeVJlY3QuYm90dG9tIC0gZWxlbWVudEhlaWdodCkpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBib3VuZGVkIGRlbHRhIHZhbHVlc1xuICAgIGNvbnN0IGJvdW5kZWREZWx0YVggPSBib3VuZGVkTGVmdCAtIGVsZW1lbnRSZWN0LmxlZnQ7XG4gICAgY29uc3QgYm91bmRlZERlbHRhWSA9IGJvdW5kZWRUb3AgLSBlbGVtZW50UmVjdC50b3A7XG5cbiAgICByZXR1cm4geyBib3VuZGVkRGVsdGFYLCBib3VuZGVkRGVsdGFZIH07XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Qm91bmRhcmllcyhuZXdMZWZ0OiBudW1iZXIsIG5ld1RvcDogbnVtYmVyLCBlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIC8vIEdldCB0aGUgYm91bmRhcmllcyBvZiB0aGUgcm9vdCBub2RlXG4gICAgbGV0IGJvdW5kYXJ5UmVjdDogRE9NUmVjdDtcbiAgICBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IHRoaXMucm9vdE5vZGUuaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgICAgYm91bmRhcnlSZWN0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IHRvIHZpZXdwb3J0XG4gICAgICBib3VuZGFyeVJlY3QgPSBuZXcgRE9NUmVjdCgwLCAwLCB3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGVsZW1lbnRcbiAgICBjb25zdCBlbGVtZW50UmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZWxlbWVudFdpZHRoID0gZWxlbWVudFJlY3Qud2lkdGg7XG4gICAgY29uc3QgZWxlbWVudEhlaWdodCA9IGVsZW1lbnRSZWN0LmhlaWdodDtcblxuICAgIC8vIExpbWl0IHRoZSBuZXdMZWZ0IGFuZCBuZXdUb3Agd2l0aGluIHRoZSBib3VuZGFyaWVzXG4gICAgY29uc3QgYm91bmRlZExlZnQgPSBNYXRoLm1heChib3VuZGFyeVJlY3QubGVmdCwgTWF0aC5taW4obmV3TGVmdCwgYm91bmRhcnlSZWN0LnJpZ2h0IC0gZWxlbWVudFdpZHRoKSk7XG4gICAgY29uc3QgYm91bmRlZFRvcCA9IE1hdGgubWF4KGJvdW5kYXJ5UmVjdC50b3AsIE1hdGgubWluKG5ld1RvcCwgYm91bmRhcnlSZWN0LmJvdHRvbSAtIGVsZW1lbnRIZWlnaHQpKTtcblxuICAgIHJldHVybiB7IG5ld0xlZnQ6IGJvdW5kZWRMZWZ0LCBuZXdUb3A6IGJvdW5kZWRUb3AgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlRHJhZ0Rpc3RhbmNlKHRvdWNoKTogbnVtYmVyIHtcbiAgICBjb25zdCB4RGlzdCA9IE1hdGguYWJzKHRvdWNoLmNsaWVudFggLSB0aGlzLnRvdWNoU3RhcnRQb2ludC54KTtcbiAgICBjb25zdCB5RGlzdCA9IE1hdGguYWJzKHRvdWNoLmNsaWVudFkgLSB0aGlzLnRvdWNoU3RhcnRQb2ludC55KTtcbiAgICByZXR1cm4geERpc3QgKyB5RGlzdDtcbiAgfVxuXG4gIHByaXZhdGUgZGlzcGF0Y2hDdXN0b21FdmVudChlbGVtZW50LCBldmVudFR5cGUsIGJ1YmJsZSA9IHRydWUpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcbiAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudChldmVudFR5cGUsIHsgYnViYmxlczogYnViYmxlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgIGV2ZW50WydkYXRhVHJhbnNmZXInXSA9IHRoaXMuZGF0YVRyYW5zZmVyO1xuICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0RHJhZ1N0YXRlKGRyb3BGb3VuZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgaWYgKHRoaXMudXNlRHJhZ0Nsb25lKSB7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5vcGFjaXR5ID0gJzEuMCc7XG4gICAgICAgIHRoaXMuZHJhZ0Nsb25lPy5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuZHJhZ0Nsb25lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgc3R5bGVzXG4gICAgICAgIGlmICghZHJvcEZvdW5kKSB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS56SW5kZXggPSAnJztcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJztcbiAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgdHJhbnNpdGlvbiBzdHlsZVxuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUudHJhbnNpdGlvbiA9IHRoaXMuaW5pdGlhbFRyYW5zaXRpb247XG5cbiAgICAgICAgLy8gUmVzZXQgdGhlIG9yaWdpbmFsIHRyYW5zaXRpb24gcHJvcGVydHlcbiAgICAgICAgdGhpcy5pbml0aWFsVHJhbnNpdGlvbiA9ICcnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZHJhZ1NvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5kcmFnQ2xvbmUgPSBudWxsO1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSBmYWxzZTtcbiAgICB0aGlzLnRvdWNoU3RhcnRUaW1lID0gMDtcbiAgICB0aGlzLnRvdWNoU3RhcnRQb2ludCA9IG51bGw7XG4gICAgdGhpcy50b3VjaEVuZFRyaWdnZXJlZCA9IGZhbHNlO1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyID0ge1xuICAgICAgZGF0YToge30sXG4gICAgICBzZXREYXRhKHR5cGUsIHZhbCkge1xuICAgICAgICB0aGlzLmRhdGFbdHlwZV0gPSB2YWw7XG4gICAgICB9LFxuICAgICAgZ2V0RGF0YSh0eXBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFbdHlwZV07XG4gICAgICB9LFxuICAgICAgZWZmZWN0QWxsb3dlZDogJ21vdmUnXG4gICAgfTtcbiAgICB0aGlzLmNsb25lT2Zmc2V0ID0geyB4OiAwLCB5OiAwIH07XG4gICAgdGhpcy5sYXN0VGFyZ2V0ID0gbnVsbDtcbiAgICB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0ID0gbnVsbDtcbiAgICB0aGlzLmFsbG93Q2xpY2sgPSB0cnVlO1xuICAgIHRoaXMuaW5pdGlhbFRyYW5zZm9ybSA9ICcnO1xuICAgIHRoaXMuaGFzRGlzcGF0Y2hlZERyYWdTdGFydCA9IGZhbHNlO1xuXG4gICAgdGhpcy5yb290Tm9kZSA9IG51bGw7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmRlY2xhcmUgY2xhc3MgRHJvcHBhYmxlc0ludGVyZmFjZSB7fVxuXG5leHBvcnQgY29uc3QgRHJvcHBhYmxlc01peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KFxuICBzdXBlckNsYXNzOiBULFxuICB1c2VTaGFkb3dSb290OiBib29sZWFuLFxuICBkcm9wcGFibGVzU2VsZWN0b3I6IHN0cmluZ1xuKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIERyb3BwYWJsZXNFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgcHJpdmF0ZSBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmlzTWF0Y2hUYWJ1bGFyKCkpIHJldHVybjtcbiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuXG4gICAgICBjb25zdCBkcm9wcGFibGVzID0gdGhpcy5nZXREcm9wcGFibGVFbGVtZW50cygpO1xuICAgICAgdGhpcy5pbml0aWFsaXplRXZlbnRIYW5kbGVycygpO1xuICAgICAgZHJvcHBhYmxlcy5mb3JFYWNoKGRyb3BwYWJsZSA9PiB7XG4gICAgICAgIHRoaXMucHJlcGFyZURyb3BwYWJsZShkcm9wcGFibGUpO1xuICAgICAgICB0aGlzLm9ic2VydmVEcm9wcGFibGVBdHRyaWJ1dGVzKGRyb3BwYWJsZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTWF0Y2hUYWJ1bGFyKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RHJvcHBhYmxlRWxlbWVudHMoKTogRWxlbWVudFtdIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKFxuICAgICAgICB1c2VTaGFkb3dSb290ID8gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKSA6IHRoaXMucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZUV2ZW50SGFuZGxlcnMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyYWdvdmVySGFuZGxlciA9IHRoaXMuZHJhZ292ZXJIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmRyYWdsZWF2ZUhhbmRsZXIgPSB0aGlzLmRyYWdsZWF2ZUhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuZHJhZ2VudGVySGFuZGxlciA9IHRoaXMuZHJhZ2VudGVySGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5kcm9wSGFuZGxlciA9IHRoaXMuZHJvcEhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXBhcmVEcm9wcGFibGUoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdkcm9wem9uZScsICdtb3ZlJyk7XG4gICAgICBkcm9wcGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcy5kcmFnbGVhdmVIYW5kbGVyKTtcbiAgICAgIHRoaXMuYXR0YWNoRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9ic2VydmVEcm9wcGFibGVBdHRyaWJ1dGVzKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PiB7XG4gICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKCh7IGF0dHJpYnV0ZU5hbWUgfSkgPT4ge1xuICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09PSAnZGlzYWJsZWQnKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZURyb3BwYWJsZUhhbmRsZXJzKGRyb3BwYWJsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKGRyb3BwYWJsZSwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9nZ2xlRHJvcHBhYmxlSGFuZGxlcnMoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBjb25zdCBkaXNhYmxlZCA9IGRyb3BwYWJsZS5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycyhkcm9wcGFibGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudExpc3RlbmVycyhkcm9wcGFibGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXR0YWNoRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmRyYWdvdmVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5kcmFnZW50ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5kcm9wSGFuZGxlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVFdmVudExpc3RlbmVycyhkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuZHJhZ292ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCB0aGlzLmRyYWdlbnRlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLmRyb3BIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmlzTWF0Y2hUYWJ1bGFyKCkpIHJldHVybjtcbiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLm9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkcmFnZW50ZXJIYW5kbGVyKGV2OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkcmFnb3ZlckhhbmRsZXIoZXY6IERyYWdFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuYWN0aXZhdGVEcm9wcGFibGUoZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJztcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFjdGl2YXRlRHJvcHBhYmxlKGRyb3BwYWJsZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5zZXRBdHRyaWJ1dGUoJ2FjdGl2ZScsICcnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGRyb3BIYW5kbGVyKGV2OiBEcmFnRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBkcm9wcGFibGUgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgaWRlbnRpZmllciA9IGV2LmRhdGFUcmFuc2Zlci5nZXREYXRhKCd0ZXh0Jyk7XG4gICAgICBjb25zdCBkcmFnZ2FibGUgPSB0aGlzLmZpbmREcmFnZ2FibGUoaWRlbnRpZmllcik7XG4gICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmlzVmFsaWREcm9wKGRyb3BwYWJsZSwgZHJhZ2dhYmxlKSk7XG5cbiAgICAgIGlmICghZHJhZ2dhYmxlKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZHJhZ2dhYmxlICYmICF0aGlzLmlzVmFsaWREcm9wKGRyb3BwYWJsZSwgZHJhZ2dhYmxlKSkge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5tb3ZlRHJhZ2dhYmxlVG9Ecm9wcGFibGUoZHJhZ2dhYmxlLCBkcm9wcGFibGUpO1xuICAgICAgdGhpcy5kZWFjdGl2YXRlRHJvcHBhYmxlKGRyb3BwYWJsZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kRHJhZ2dhYmxlKGlkZW50aWZpZXI6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICBpZiAoIWlkZW50aWZpZXIpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yKGBbaWRlbnRpZmllcj0ke2lkZW50aWZpZXJ9XWApIHx8IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGBbaWRlbnRpZmllcj0ke2lkZW50aWZpZXJ9XWApXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNWYWxpZERyb3AoZHJvcHBhYmxlOiBIVE1MRWxlbWVudCwgZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGRyYWdnYWJsZS5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpICE9PSBkcm9wcGFibGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBtb3ZlRHJhZ2dhYmxlVG9Ecm9wcGFibGUoZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCwgZHJvcHBhYmxlOiBIVE1MRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgbW92ZUVsZW1lbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgZHJvcHBhYmxlLmFwcGVuZENoaWxkKGRyYWdnYWJsZSk7XG5cbiAgICAgICAgLy8gY2hlY2tNYXhBc3NvY2lhdGlvbnMgYW5kIHNhdmVSZXNwb25zZSBhcmUgZGVmaW5lZC9vdmVycmlkZGVuIGluIGEgbWl4aW5cbiAgICAgICAgdGhpc1snY2hlY2tNYXhBc3NvY2lhdGlvbnMnXSgpO1xuICAgICAgICB0aGlzWydzYXZlUmVzcG9uc2UnXShudWxsKTsgLy9cbiAgICAgIH07XG5cbiAgICAgIGlmICghZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBtb3ZlRWxlbWVudCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKG1vdmVFbGVtZW50KTtcbiAgICAgIGF3YWl0IHRyYW5zaXRpb24uZmluaXNoZWQ7XG5cbiAgICAgIC8vIHRoaXNbJ2NoZWNrTWF4QXNzb2NpYXRpb25zJ10oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlYWN0aXZhdGVEcm9wcGFibGUoZHJvcHBhYmxlOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnYWN0aXZlJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkcmFnbGVhdmVIYW5kbGVyKGV2OiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmRlYWN0aXZhdGVEcm9wcGFibGUoZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdub25lJztcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIERyb3BwYWJsZXNFbGVtZW50IGFzIENvbnN0cnVjdG9yPERyb3BwYWJsZXNJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiLy8gVEhJUyBJUyBBIE1JWElOLCBUSElTIElTIEEgTUlYSU5cbi8vIFVTRSBMSUtFIFRISVNcbi8vIGBgYGNsYXNzIERyb3BMaXN0IGV4dGVuZHMgRmxpcHBhYmxlcyhMaXRFbGVtZW50KSB7YGBgXG4vLyBtaXhpbiB3aGljaCBhbmltYXRlcyBjaGlsZHJlbiB3aXRoIEZMSVBcbi8vIGEgY29tYmluYXRpb24gYmV0d2VlbiB0aGlzIGRpcmVjdGl2ZTpcbi8vIGh0dHBzOi8vbmctcnVuLmNvbS9lZGl0LzlNR3I1ZFlXQTIwQWlKdHB5NWF6P29wZW49YXBwJTJGYXBwLmNvbXBvbmVudC5odG1sXG4vLyBhbmQgYSB0dXRvcmlhbCBob3cgdG8gbWFrZSBhIG1peGluXG4vLyBodHRwczovL2xpdC5kZXYvZG9jcy9jb21wb3NpdGlvbi9taXhpbnMvXG5cbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIEZsaXBwYWJsZXNJbnRlcmZhY2Uge1xuICBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkO1xuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkO1xufVxuXG4vLyBqdXN0IGEgY29udmVyc2lvbiBvZiBhIGFuZ3VsYXIgRkxJUCBkaXJlY3RpdmUsIG1hZGUgYXMgYSBNaXhpblxuLy8gaHR0cHM6Ly9uZy1ydW4uY29tL2VkaXQvOU1HcjVkWVdBMjBBaUp0cHk1YXo/b3Blbj1hcHAlMkZhcHAuY29tcG9uZW50Lmh0bWxcbmV4cG9ydCBjb25zdCBGbGlwcGFibGVzTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4gIGRyb3BwYWJsZXNTZWw6IHN0cmluZyxcbiAgZHJhZ2dhYmxlc1NlbDogc3RyaW5nXG4pID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgRmxpcHBhYmxlc0VsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIHtcbiAgICAvLyBwcml2YXRlIHN0YXRlID0gbmV3IE1hcDxFbGVtZW50LCBhbnk+KCk7XG4gICAgLy8gcHJpdmF0ZSBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcbiAgICAvLyBmbGlwcGFibGVzU2VsZWN0b3I6IHN0cmluZztcbiAgICAvLyBvdmVycmlkZSBhc3luYyBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKSB7XG4gICAgLy8gICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlOyAvLyBwazogdGhpcyBpcyB0aGUga2V5IHRvIGNhbGN1bGF0ZSBjb3JyZWN0IHByb3BvcnRpb25zXG4gICAgLy8gICBjb25zdCBkcmFnZ2FibGVzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJhZ2dhYmxlc1NlbCkpO1xuICAgIC8vICAgZHJhZ2dhYmxlcy5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgLy8gICAgIGNvbnN0IHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0gPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIC8vICAgICB0aGlzLnN0YXRlLnNldChlbGVtLCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAvLyAgIH0pO1xuICAgIC8vICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMuYW5pbWF0ZU1lKTtcbiAgICAvLyAgIGNvbnN0IGRyb3BwYWJsZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsKSk7XG4gICAgLy8gICBkcm9wcGFibGVzLmZvckVhY2goKGRyYWdnYWJsZSkgPT4ge1xuICAgIC8vICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoZHJhZ2dhYmxlLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcbiAgICAvLyAgIH0pO1xuICAgIC8vICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMsIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuICAgIC8vICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk7XG4gICAgLy8gfVxuICAgIC8vIHByaXZhdGUgYW5pbWF0ZU1lID0gKCkgPT4ge1xuICAgIC8vICAgdGhpcy5zdGF0ZS5mb3JFYWNoKCh2YWx1ZSwgZWxlbSkgPT4ge1xuICAgIC8vICAgICBjb25zdCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyAgICAgaWYgKHRoaXMuc3RhdGUuZ2V0KGVsZW0pID09IG51bGwpIHtcbiAgICAvLyAgICAgICB0aGlzLnN0YXRlLnNldChlbGVtLCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICBjb25zdCBjYWNoZSA9IHRoaXMuc3RhdGUuZ2V0KGVsZW0pO1xuICAgIC8vICAgICBjb25zdCBkZWx0YVggPSBjYWNoZS5sZWZ0IC0gbGVmdDtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFZID0gY2FjaGUudG9wIC0gdG9wO1xuICAgIC8vICAgICBjb25zdCBkZWx0YVcgPSBjYWNoZS53aWR0aCAvIHdpZHRoO1xuICAgIC8vICAgICBjb25zdCBkZWx0YUggPSBjYWNoZS5oZWlnaHQgLyBoZWlnaHQ7XG4gICAgLy8gICAgIHRoaXMuc3RhdGUuc2V0KGVsZW0sIHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIC8vICAgICBjb25zdCB7IGR1cmF0aW9uLCBlYXNpbmcgfSA9IHsgZHVyYXRpb246IDM1MCwgZWFzaW5nOiAnY3ViaWMtYmV6aWVyKDAuMjYsIDAuODYsIDAuNDQsIDAuOTg1KScgfTtcbiAgICAvLyAgICAgZWxlbS5hbmltYXRlKFxuICAgIC8vICAgICAgIFtcbiAgICAvLyAgICAgICAgIHtcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAndG9wIGxlZnQnLFxuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm06IGBcbiAgICAvLyB0cmFuc2xhdGUoJHtkZWx0YVh9cHgsICR7ZGVsdGFZfXB4KVxuICAgIC8vIHNjYWxlKCR7ZGVsdGFXfSwgJHtkZWx0YUh9KVxuICAgIC8vIGAsXG4gICAgLy8gICAgICAgICAgIC8vIHdpZHRoOiBjYWNoZS53aWR0aCxcbiAgICAvLyAgICAgICAgICAgLy8gaGVpZ2h0OiBjYWNoZS5oZWlnaHQrICdweCcsXG4gICAgLy8gICAgICAgICAgIC8vIG9wYWNpdHk6IGNhY2hlLm9wYWNpdHksXG4gICAgLy8gICAgICAgICB9LFxuICAgIC8vICAgICAgICAge1xuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICd0b3AgbGVmdCcsXG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybTogJ25vbmUnLFxuICAgIC8vICAgICAgICAgfSxcbiAgICAvLyAgICAgICBdLFxuICAgIC8vICAgICAgIHtcbiAgICAvLyAgICAgICAgIGR1cmF0aW9uLFxuICAgIC8vICAgICAgICAgZWFzaW5nLFxuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgKTtcbiAgICAvLyAgIH0pO1xuICAgIC8vIH07XG4gICAgLy8gb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgLy8gICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIC8vICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgLy8gfVxuICB9XG4gIHJldHVybiBGbGlwcGFibGVzRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxGbGlwcGFibGVzSW50ZXJmYWNlPiAmIFQ7XG59O1xuIiwgIi8vIEB3YXRjaCBkZWNvcmF0b3Jcbi8vXG4vLyBSdW5zIHdoZW4gYW4gb2JzZXJ2ZWQgcHJvcGVydHkgY2hhbmdlcywgZS5nLiBAcHJvcGVydHkgb3IgQHN0YXRlLCBidXQgYmVmb3JlIHRoZSBjb21wb25lbnQgdXBkYXRlcy5cbi8vXG4vLyBUbyB3YWl0IGZvciBhbiB1cGRhdGUgdG8gY29tcGxldGUgYWZ0ZXIgYSBjaGFuZ2Ugb2NjdXJzLCB1c2UgYGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGVgIGluIHRoZSBoYW5kbGVyLiBUbyBzdGFydFxuLy8gd2F0Y2hpbmcgYWZ0ZXIgdGhlIGluaXRpYWwgdXBkYXRlL3JlbmRlciwgdXNlIGB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH1gIG9yIGB0aGlzLmhhc1VwZGF0ZWRgIGluIHRoZSBoYW5kbGVyLlxuLy9cbi8vIFVzYWdlOlxuLy9cbi8vICBAd2F0Y2goJ3Byb3BOYW1lJylcbi8vICBoYW5kbGVQcm9wQ2hhbmdlKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuLy8gICAgLi4uXG4vLyAgfVxuXG5pbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXIgPSAocHJldj86IHVua25vd24sIG5leHQ/OiB1bmtub3duKSA9PiB2b2lkO1xuXG50eXBlIE5vblVuZGVmaW5lZDxBPiA9IEEgZXh0ZW5kcyB1bmRlZmluZWQgPyBuZXZlciA6IEE7XG5cbnR5cGUgVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0tPzogTm9uVW5kZWZpbmVkPFRbS10+IGV4dGVuZHMgVXBkYXRlSGFuZGxlciA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbmludGVyZmFjZSBMaXZlUXVlcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHdpbGwgb25seSBzdGFydCB3YXRjaGluZyBhZnRlciB0aGUgaW5pdGlhbCB1cGRhdGUvcmVuZGVyXG4gICAqL1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGl2ZVF1ZXJ5KHF1ZXJ5U2VsZWN0b3I6IHN0cmluZywgb3B0aW9ucz86IExpdmVRdWVyeU9wdGlvbnMpIHtcbiAgbGV0IG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuICBjb25zdCByZXNvbHZlZE9wdGlvbnM6IFJlcXVpcmVkPExpdmVRdWVyeU9wdGlvbnM+ID0ge1xuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgcmV0dXJuIDxFbGVtQ2xhc3MgZXh0ZW5kcyBMaXRFbGVtZW50PihcbiAgICBwcm90bzogRWxlbUNsYXNzLFxuICAgIGRlY29yYXRlZEZuTmFtZTogVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxFbGVtQ2xhc3M+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHsgY29ubmVjdGVkQ2FsbGJhY2ssIGRpc2Nvbm5lY3RlZENhbGxiYWNrIH0gPSBwcm90bztcblxuICAgIHByb3RvLmNvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcykge1xuICAgICAgY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gKG11dGF0aW9uTGlzdDogTXV0YXRpb25SZWNvcmRbXSkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50c1RvV2F0Y2ggPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKSk7XG4gICAgICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25MaXN0KSB7XG4gICAgICAgICAgY29uc3QgYWRkZWROb2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24uYWRkZWROb2RlcykubWFwKGUgPT4gZSBhcyBFbGVtZW50KTtcbiAgICAgICAgICBjb25zdCByZW1vdmVkTm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLmFkZGVkTm9kZXMpLm1hcChlID0+IGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnICYmIGFkZGVkTm9kZXMuZmluZChuID0+IGVsZW1lbnRzVG9XYXRjaC5pbmNsdWRlcyhuKSkpIHtcbiAgICAgICAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcblxuICAgICAgY29uc3QgZWxlbWVudHNBZGRlZCA9IHRoaXMucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKSA/PyBbXTtcbiAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShBcnJheS5mcm9tKGVsZW1lbnRzQWRkZWQpLCBbXSk7XG4gICAgfTtcblxuICAgIHByb3RvLmRpc2Nvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcykge1xuICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9O1xufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgSUludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IERyb3BwYWJsZXNNaXhpbiB9IGZyb20gJy4vZHJvcHBhYmxlcy1taXhpbic7XG5pbXBvcnQgeyBGbGlwcGFibGVzTWl4aW4gfSBmcm9tICcuL2ZsaXBwYWJsZXMtbWl4aW4nO1xuXG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGxpdmVRdWVyeSB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvbGl2ZS1xdWVyeSc7XG5pbXBvcnQgeyBUb3VjaERyYWdBbmREcm9wIH0gZnJvbSAnLi9kcmFnLWRyb3AtYXBpJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5pbnRlcmZhY2UgSW50ZXJhY3Rpb25Db25maWd1cmF0aW9uIHtcbiAgY29weVN0eWxlc0RyYWdDbG9uZTogYm9vbGVhbjtcbiAgZHJhZ0NhbkJlUGxhY2VkQmFjazogYm9vbGVhbjtcbiAgZHJhZ09uQ2xpY2s6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4gIGRyYWdnYWJsZXNTZWxlY3Rvcjogc3RyaW5nLFxuICB1c2VTaGFkb3dSb290Rm9yRHJvcHBhYmxlczogYm9vbGVhbixcbiAgZHJvcHBhYmxlc1NlbGVjdG9yOiBzdHJpbmdcbikgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBEcmFnRHJvcEludGVyYWN0aW9uRWxlbWVudCBleHRlbmRzIEZsaXBwYWJsZXNNaXhpbihcbiAgICBEcm9wcGFibGVzTWl4aW4oc3VwZXJDbGFzcywgdXNlU2hhZG93Um9vdEZvckRyb3BwYWJsZXMsIGRyb3BwYWJsZXNTZWxlY3RvciksXG4gICAgZHJvcHBhYmxlc1NlbGVjdG9yLFxuICAgIGRyYWdnYWJsZXNTZWxlY3RvclxuICApIHtcbiAgICBwcm90ZWN0ZWQgZHJhZ2dhYmxlcyA9IG5ldyBNYXA8SFRNTEVsZW1lbnQsIHsgcGFyZW50OiBIVE1MRWxlbWVudDsgaW5kZXg6IG51bWJlciB9PigpO1xuICAgIHByb3RlY3RlZCBkcm9wcGFibGVzOiBIVE1MRWxlbWVudFtdID0gW107XG4gICAgZHJhZ0Ryb3BBcGk6IFRvdWNoRHJhZ0FuZERyb3A7XG5cbiAgICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6IGZhbHNlLCB0eXBlOiBPYmplY3QgfSkgY29uZmlndXJhdGlvbjogSW50ZXJhY3Rpb25Db25maWd1cmF0aW9uID0ge1xuICAgICAgY29weVN0eWxlc0RyYWdDbG9uZTogdHJ1ZSxcbiAgICAgIGRyYWdDYW5CZVBsYWNlZEJhY2s6IHRydWUsXG4gICAgICBkcmFnT25DbGljazogZmFsc2VcbiAgICB9O1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSwgYXR0cmlidXRlOiAnbWluLWFzc29jaWF0aW9ucycgfSkgbWluQXNzb2NpYXRpb25zID0gMTtcbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUsIGF0dHJpYnV0ZTogJ21heC1hc3NvY2lhdGlvbnMnIH0pIG1heEFzc29jaWF0aW9ucyA9IDE7XG5cbiAgICBAbGl2ZVF1ZXJ5KGRyYWdnYWJsZXNTZWxlY3RvcilcbiAgICBoYW5kbGVEcmFnZ2FibGVzQ2hhbmdlKGRyYWdzQWRkZWQ6IEhUTUxFbGVtZW50W10sIGRyYWdzUmVtb3ZlZDogRWxlbWVudFtdKSB7XG4gICAgICBpZiAodGhpcy5pc01hdGNoVGFidWxhcigpKSByZXR1cm47XG4gICAgICBjb25zdCBuZXdEcmFnZ2FibGVzID0gdGhpcy5maWx0ZXJFeGlzdGluZ0RyYWdnYWJsZXMoZHJhZ3NBZGRlZCk7XG5cbiAgICAgIGlmIChuZXdEcmFnZ2FibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5hZGROZXdEcmFnZ2FibGVzKG5ld0RyYWdnYWJsZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpOiB2b2lkIHtcbiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuICAgICAgdGhpcy5pbml0aWFsaXplRHJvcHBhYmxlcygpO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZURyYWdEcm9wQXBpKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplRHJhZ0Ryb3BBcGkoKSB7XG4gICAgICB0aGlzLmRyYWdEcm9wQXBpID0gbmV3IFRvdWNoRHJhZ0FuZERyb3AoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50PERyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50PigncXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB0aGlzXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNNYXRjaFRhYnVsYXIoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ3F0aS1tYXRjaC10YWJ1bGFyJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaWx0ZXJFeGlzdGluZ0RyYWdnYWJsZXMoZHJhZ2dhYmxlczogSFRNTEVsZW1lbnRbXSk6IEhUTUxFbGVtZW50W10ge1xuICAgICAgcmV0dXJuIGRyYWdnYWJsZXMuZmlsdGVyKGQgPT4gIXRoaXMuZHJhZ2dhYmxlcy5oYXMoZCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkTmV3RHJhZ2dhYmxlcyhkcmFnZ2FibGVzOiBIVE1MRWxlbWVudFtdKTogdm9pZCB7XG4gICAgICB0aGlzLmRyYWdEcm9wQXBpLmFkZERyYWdnYWJsZUVsZW1lbnRzKGRyYWdnYWJsZXMpO1xuICAgICAgZHJhZ2dhYmxlcy5mb3JFYWNoKGRyYWdnYWJsZSA9PiB0aGlzLnN0b3JlRHJhZ2dhYmxlKGRyYWdnYWJsZSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RvcmVEcmFnZ2FibGUoZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgY29uc3QgaW5kZXggPSBBcnJheS5mcm9tKGRyYWdnYWJsZS5wYXJlbnROb2RlLmNoaWxkcmVuKS5pbmRleE9mKGRyYWdnYWJsZSk7XG4gICAgICB0aGlzLmRyYWdnYWJsZXMuc2V0KGRyYWdnYWJsZSwge1xuICAgICAgICBwYXJlbnQ6IGRyYWdnYWJsZS5wYXJlbnRFbGVtZW50LFxuICAgICAgICBpbmRleFxuICAgICAgfSk7XG4gICAgICBkcmFnZ2FibGUuc3R5bGUudmlld1RyYW5zaXRpb25OYW1lID0gYGRyYWctJHtpbmRleH0tJHt0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8IGNyeXB0by5yYW5kb21VVUlEKCl9YDtcbiAgICAgIGRyYWdnYWJsZS5zZXRBdHRyaWJ1dGUoJ3F0aS1kcmFnZ2FibGUnLCAndHJ1ZScpO1xuICAgICAgZHJhZ2dhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIHRoaXMuaGFuZGxlRHJhZ1N0YXJ0KTtcbiAgICAgIGRyYWdnYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgdGhpcy5oYW5kbGVEcmFnRW5kKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVEcm9wcGFibGVzKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcm9wcGFibGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgdXNlU2hhZG93Um9vdEZvckRyb3BwYWJsZXNcbiAgICAgICAgICA/IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcilcbiAgICAgICAgICA6IHRoaXMucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlRHJhZ1N0YXJ0ID0gKGV2OiBEcmFnRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBldi5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dCcsIHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSk7XG4gICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCdkcmFnZ2luZycsICcnKTtcbiAgICAgIHRoaXMuYWN0aXZhdGVEcm9wcGFibGVzKCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgaGFuZGxlRHJhZ0VuZCA9IGFzeW5jIChldjogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5kZWFjdGl2YXRlRHJvcHBhYmxlcygpO1xuICAgICAgY29uc3QgZHJhZ2dhYmxlID0gZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGRyYWdnYWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ2RyYWdnaW5nJyk7XG4gICAgICBjb25zdCB3YXNEcm9wcGVkID0gYXdhaXQgdGhpcy53YXNEcm9wcGVkKGV2KTtcbiAgICAgIGlmICghd2FzRHJvcHBlZCkge1xuICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmRyYWdDYW5CZVBsYWNlZEJhY2spIHtcbiAgICAgICAgICB0aGlzLnJlc3RvcmVJbml0aWFsRHJhZ2dhYmxlUG9zaXRpb24oZHJhZ2dhYmxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIGFjdGl2YXRlRHJvcHBhYmxlcygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcy5mb3JFYWNoKGQgPT4gZC5zZXRBdHRyaWJ1dGUoJ2VuYWJsZWQnLCAnJykpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVhY3RpdmF0ZURyb3BwYWJsZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyb3BwYWJsZXMuZm9yRWFjaChkID0+IGQucmVtb3ZlQXR0cmlidXRlKCdlbmFibGVkJykpO1xuICAgIH1cblxuICAgIC8vIE1IOiBUaGlzIG1ldGhvZCBpcyBqdXN0IHRvIG1ha2Ugc3VyZSB0aGlzIGNhbiBiZSB0ZXN0ZWQuXG4gICAgLy8gYmVjYXVzZSBJIGNhbid0IGdldCB0aGUgZHJvcEVmZmVjdCB0byBiZSAnbW92ZScgaW4gdGhlIHRlc3RcbiAgICBwcml2YXRlIGNoZWNrRm9yTW92ZVRlc3RJdGVtID0gKGV2OiBEcmFnRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgIGlmICghZXYuZGF0YVRyYW5zZmVyLml0ZW1zKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICBsZXQgaGFzTW92ZVRlc3RJdGVtID0gZmFsc2U7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBkYXRhVHJhbnNmZXIgaXRlbXNcbiAgICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5mcm9tKGV2LmRhdGFUcmFuc2Zlci5pdGVtcyk7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSBpdGVtcy5sZW5ndGg7XG5cbiAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGl0ZW1zLCByZXNvbHZlIGltbWVkaWF0ZWx5XG4gICAgICAgIGlmIChwZW5kaW5nID09PSAwKSB7XG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICBpZiAoaXRlbS5raW5kID09PSAnc3RyaW5nJyAmJiBpdGVtLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgaXRlbS5nZXRBc1N0cmluZyhkYXRhID0+IHtcbiAgICAgICAgICAgICAgaWYgKGRhdGEgPT09ICdtb3ZlLXRlc3QnKSB7XG4gICAgICAgICAgICAgICAgaGFzTW92ZVRlc3RJdGVtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFJlc29sdmUgdGhlIHByb21pc2UgYWZ0ZXIgcHJvY2Vzc2luZyBhbGwgaXRlbXNcbiAgICAgICAgICAgICAgaWYgKHBlbmRpbmcgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGhhc01vdmVUZXN0SXRlbSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgaXRlbSBpcyBub3QgJ3N0cmluZycsIHN0aWxsIGNvdW50IGRvd24gcGVuZGluZ1xuICAgICAgICAgICAgaWYgKHBlbmRpbmcgPT09IDApIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShoYXNNb3ZlVGVzdEl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBhc3luYyB3YXNEcm9wcGVkKGV2OiBEcmFnRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIGNvbnN0IGhhc01vdmVUZXN0SXRlbSA9IGF3YWl0IHRoaXMuY2hlY2tGb3JNb3ZlVGVzdEl0ZW0oZXYpO1xuICAgICAgcmV0dXJuIGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ICE9PSAnbm9uZScgfHwgaGFzTW92ZVRlc3RJdGVtO1xuICAgIH1cblxuICAgIHByaXZhdGUgd2FzTW92ZWQoZXY6IERyYWdFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID09PSAnbW92ZSc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXN0b3JlSW5pdGlhbERyYWdnYWJsZVBvc2l0aW9uKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHsgcGFyZW50LCBpbmRleCB9ID0gdGhpcy5kcmFnZ2FibGVzLmdldChkcmFnZ2FibGUpO1xuICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihpbmRleCwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCk7XG5cbiAgICAgIGNvbnN0IG1vdmVEcmFnZ2FibGUgPSAoZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCwgcGFyZW50OiBIVE1MRWxlbWVudCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRJbmRleCA9IE1hdGgubWluKGluZGV4LCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShkcmFnZ2FibGUsIHBhcmVudC5jaGlsZHJlblt0YXJnZXRJbmRleF0pO1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIHRoaXMuY2hlY2tNYXhBc3NvY2lhdGlvbnMoKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEZhbGxiYWNrIGlmIHZpZXcgdHJhbnNpdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWRcbiAgICAgIGlmICghZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBtb3ZlRHJhZ2dhYmxlKGRyYWdnYWJsZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIHZpZXcgdHJhbnNpdGlvbnMgaWYgc3VwcG9ydGVkXG4gICAgICBjb25zdCB0cmFuc2l0aW9uID0gZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbigoKSA9PiB7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAnJztcbiAgICAgICAgbW92ZURyYWdnYWJsZShkcmFnZ2FibGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgfSk7XG4gICAgICAvLyB0cmFuc2l0aW9uLmZpbmlzaGVkLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gICBkcmFnZ2FibGUuc3R5bGUudHJhbnNpdGlvbiA9ICcnO1xuICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNoZWNrTWF4QXNzb2NpYXRpb25zKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcm9wcGFibGVzLmZvckVhY2goKGQsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IG1heE1hdGNoID0gKyhkLmdldEF0dHJpYnV0ZSgnbWF0Y2gtbWF4JykgfHwgMSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRBc3NvY2lhdGlvbnMgPSBkLnF1ZXJ5U2VsZWN0b3JBbGwoJ1txdGktZHJhZ2dhYmxlPVwidHJ1ZVwiXScpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZGlzYWJsZURyb3BwYWJsZSA9IGN1cnJlbnRBc3NvY2lhdGlvbnMgPj0gbWF4TWF0Y2g7XG4gICAgICAgIGlmIChkaXNhYmxlRHJvcHBhYmxlKSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlRHJvcHBhYmxlKGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZW5hYmxlRHJvcHBhYmxlKGQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRpc2FibGVEcm9wcGFibGUoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKTtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ2Ryb3B6b25lJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmFibGVEcm9wcGFibGUoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgnZHJvcHpvbmUnLCAnbW92ZScpO1xuICAgIH1cblxuICAgIGdldCB2YWx1ZSgpOiBzdHJpbmdbXSB7XG4gICAgICByZXR1cm4gdGhpcy5jb2xsZWN0UmVzcG9uc2VEYXRhKCk7XG4gICAgfVxuXG4gICAgc2V0IHZhbHVlKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgICAgaWYgKHRoaXMuaXNNYXRjaFRhYnVsYXIoKSkgcmV0dXJuO1xuXG4gICAgICB0aGlzLnJlc2V0RHJvcHBhYmxlcygpO1xuICAgICAgdmFsdWU/LmZvckVhY2goZW50cnkgPT4gdGhpcy5wbGFjZVJlc3BvbnNlKGVudHJ5KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwbGFjZVJlc3BvbnNlKHJlc3BvbnNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIGNvbnN0IFtkcm9wSWQsIC4uLmRyYWdJZHNdID0gcmVzcG9uc2Uuc3BsaXQoJyAnKS5yZXZlcnNlKCk7XG4gICAgICBjb25zdCBkcm9wcGFibGUgPSB0aGlzLmZpbmREcm9wcGFibGVCeUlkKGRyb3BJZCk7XG4gICAgICBkcmFnSWRzLmZvckVhY2goZHJhZ0lkID0+IHRoaXMucGxhY2VEcmFnZ2FibGVJbkRyb3BwYWJsZShkcmFnSWQsIGRyb3BwYWJsZSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZERyb3BwYWJsZUJ5SWQoaWRlbnRpZmllcjogc3RyaW5nKTogRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gdGhpcy5kcm9wcGFibGVzLmZpbmQoZHJvcCA9PiBkcm9wLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpID09PSBpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHBsYWNlRHJhZ2dhYmxlSW5Ecm9wcGFibGUoZHJhZ0lkOiBzdHJpbmcsIGRyb3BwYWJsZTogRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgZHJhZ2dhYmxlID0gdGhpcy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgW2lkZW50aWZpZXI9JHtkcmFnSWR9XWApO1xuICAgICAgaWYgKCFkcm9wcGFibGUgfHwgIWRyYWdnYWJsZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDYW5ub3QgZmluZCBkcmFnZ2FibGUgb3IgZHJvcHBhYmxlIHdpdGggdGhlIGdpdmVuIGlkZW50aWZpZXI6ICR7ZHJhZ0lkfWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtb3ZlRWxlbWVudCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICBkcm9wcGFibGUuYXBwZW5kQ2hpbGQoZHJhZ2dhYmxlKTtcbiAgICAgICAgdGhpcy5jaGVja01heEFzc29jaWF0aW9ucygpO1xuICAgICAgfTtcblxuICAgICAgaWYgKCFkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIG1vdmVFbGVtZW50KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uID0gZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihtb3ZlRWxlbWVudCk7XG4gICAgICAgIGF3YWl0IHRyYW5zaXRpb24uZmluaXNoZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCB2YWxpZEFzc29jaWF0aW9ucyA9IHRoaXMuZ2V0VmFsaWRBc3NvY2lhdGlvbnMoKTtcbiAgICAgIHJldHVybiB0aGlzLm1pbkFzc29jaWF0aW9ucyA8PSAwIHx8IHRoaXMubWluQXNzb2NpYXRpb25zIDw9IHZhbGlkQXNzb2NpYXRpb25zO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VmFsaWRBc3NvY2lhdGlvbnMoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLmRyb3BwYWJsZXMuZmlsdGVyKGQgPT4gZC5jaGlsZEVsZW1lbnRDb3VudCA+IDApLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2F2ZVJlc3BvbnNlKCk6IHZvaWQge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLmNvbGxlY3RSZXNwb25zZURhdGEoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogdGhpcy5yZXNwb25zZUlkZW50aWZpZXIsXG4gICAgICAgICAgICByZXNwb25zZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb2xsZWN0UmVzcG9uc2VEYXRhKCk6IHN0cmluZ1tdIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5kcm9wcGFibGVzXG4gICAgICAgIC5tYXAoZHJvcHBhYmxlID0+IHtcbiAgICAgICAgICBjb25zdCBkcmFnZ2FibGVzSW5Ecm9wcGFibGUgPSBkcm9wcGFibGUucXVlcnlTZWxlY3RvckFsbCgnW3F0aS1kcmFnZ2FibGU9XCJ0cnVlXCJdJyk7XG4gICAgICAgICAgY29uc3QgaWRlbnRpZmllcnMgPSBBcnJheS5mcm9tKGRyYWdnYWJsZXNJbkRyb3BwYWJsZSkubWFwKGQgPT4gZC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSk7XG4gICAgICAgICAgY29uc3QgZHJvcHBhYmxlSWRlbnRpZmllciA9IGRyb3BwYWJsZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICByZXR1cm4gaWRlbnRpZmllcnMubWFwKGlkID0+IGAke2lkfSAke2Ryb3BwYWJsZUlkZW50aWZpZXJ9YCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5mbGF0KCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgcmVzZXQoc2F2ZSA9IHRydWUpOiB2b2lkIHtcbiAgICAgIHRoaXMucmVzZXREcm9wcGFibGVzKCk7XG4gICAgICBpZiAoc2F2ZSkgdGhpcy5zYXZlUmVzcG9uc2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlc2V0RHJvcHBhYmxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IG1vdmVEcmFnZ2FibGUgPSAoZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCwgcGFyZW50OiBIVE1MRWxlbWVudCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gTWF0aC5taW4oaW5kZXgsIHBhcmVudC5jaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGRyYWdnYWJsZSwgcGFyZW50LmNoaWxkcmVuW3RhcmdldEluZGV4XSk7XG4gICAgICB9O1xuXG4gICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgaWYgdmlldyB0cmFuc2l0aW9ucyBhcmUgbm90IHN1cHBvcnRlZFxuICAgICAgICB0aGlzLmRyYWdnYWJsZXMuZm9yRWFjaCgoeyBwYXJlbnQsIGluZGV4IH0sIGRyYWdnYWJsZSkgPT4ge1xuICAgICAgICAgIG1vdmVEcmFnZ2FibGUoZHJhZ2dhYmxlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIHZpZXcgdHJhbnNpdGlvbnMgaWYgc3VwcG9ydGVkXG4gICAgICBjb25zdCB0cmFuc2l0aW9uID0gZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbigoKSA9PiB7XG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlcy5mb3JFYWNoKCh7IHBhcmVudCwgaW5kZXggfSwgZHJhZ2dhYmxlKSA9PiB7XG4gICAgICAgICAgbW92ZURyYWdnYWJsZShkcmFnZ2FibGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0cmFuc2l0aW9uLmZpbmlzaGVkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBEcmFnRHJvcEludGVyYWN0aW9uRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxJSW50ZXJhY3Rpb24+ICYgVDtcbn07XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogYmxvY2s7IC8qIG5lY2Vzc2FyeSB0byBjYWxjdWxhdGUgc2NhbGluZyBwb3NpdGlvbiAqL1xuICB9XG4gIHNsb3RbbmFtZT0ncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSddIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICBnYXA6IDAuNXJlbTtcbiAgfVxuXG4gIDpob3N0OjpwYXJ0KGFzc29jaWFibGVzLWNvbnRhaW5lcikge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudChcbiAgICAgIDE4MGRlZyxcbiAgICAgIHJnYigwIDAgMCAvIDAlKSBjYWxjKDUwJSAtIDFweCksXG4gICAgICB2YXIoLS1xdGktYm9yZGVyLWNvbG9yLWdyYXkpIGNhbGMoNTAlKSxcbiAgICAgIHJnYigwIDAgMCAvIDAlKSBjYWxjKDUwJSArIDFweClcbiAgICApO1xuICB9XG5gO1xuIiwgImltcG9ydCB7IENTU1Jlc3VsdEdyb3VwLCBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcblxuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSB9IGZyb20gJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24uc3R5bGVzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUFzc29jaWF0ZUludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKFxuICBJbnRlcmFjdGlvbixcbiAgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLFxuICB0cnVlLFxuICAnLmRsJ1xuKSB7XG4gIEBzdGF0ZSgpIHByaXZhdGUgX2NoaWxkcmVuTWFwOiBFbGVtZW50W10gPSBbXTtcblxuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcbiAgLy8gZHJhZ0Ryb3BBcGk6IFRvdWNoRHJhZ0FuZERyb3A7XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2VIYW5kbGVyOiAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJDaG9pY2VIYW5kbGVyID0gdGhpcy5fcmVnaXN0ZXJDaG9pY2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3JlZ2lzdGVyLXF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLCB0aGlzLl9yZWdpc3RlckNob2ljZUhhbmRsZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2UoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgY29uc3QgY2hvaWNlID0gZXZlbnQudGFyZ2V0IGFzIFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U7XG4gICAgdGhpcy5fY2hpbGRyZW5NYXAucHVzaChjaG9pY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHNsb3QgbmFtZT1cInF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2VcIj48L3Nsb3Q+XG4gICAgICA8ZGl2IHBhcnQ9XCJkcm9wLWNvbnRhaW5lclwiPlxuICAgICAgICAke3RoaXMuX2NoaWxkcmVuTWFwLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgQXJyYXkuZnJvbShBcnJheShNYXRoLmNlaWwodGhpcy5fY2hpbGRyZW5NYXAubGVuZ3RoIC8gMikpLmtleXMoKSkubWFwKFxuICAgICAgICAgIChfLCBpbmRleCkgPT5cbiAgICAgICAgICAgIGh0bWxgPGRpdiBwYXJ0PVwiYXNzb2NpYWJsZXMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgbmFtZT1cImxlZnQke2luZGV4fVwiIHBhcnQ9XCJkcm9wLWxpc3RcIiBjbGFzcz1cImRsXCIgaWRlbnRpZmllcj1cImRyb3BsaXN0JHtpbmRleH1fbGVmdFwiPjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IG5hbWU9XCJyaWdodCR7aW5kZXh9XCIgcGFydD1cImRyb3AtbGlzdFwiIGNsYXNzPVwiZGxcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2luZGV4fV9yaWdodFwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YFxuICAgICAgICApfVxuICAgICAgPC9kaXY+YDtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJywgdGhpcy5fcmVnaXN0ZXJDaG9pY2VIYW5kbGVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzb2NpYXRlLWludGVyYWN0aW9uJzogUXRpQXNzb2NpYXRlSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgcmVtb3ZlRG91YmxlU2xhc2hlcyB9IGZyb20gJy4uLy4uL2ludGVybmFsL3V0aWxzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUN1c3RvbUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICAvLyBUaGlzIGN1c3RvbS1pbnRlcmFjdGlvbiBzdXBwb3J0IHRoZSBDRVMgQVBJIHdoaWNoIGlzIHVzZSBpbiBGQUNFVFxuICAvL1xuICAvLyBJdCB3b3JrcyBsaWtlIHRoaXM6XG4gIC8vIDEuIFRoZSBDSSBtYW5pZmVzdCBpcyBmZXRjaGVkXG4gIC8vIDIuIEFuIGlmcmFtZSBpcyBjcmVhdGVkIGFuZCB0aGUgZmlyc3Qgc3R5bGUgYW5kIGZpcnN0IHNjcmlwdCBmcm9tIHRoZSBtYW5pZmVzdCBhcmUgbG9hZGVkXG4gIC8vIDMuIFRoZSBmaXJzdCBzY3JpcHQgaXMgYm9vdHN0cmFwLmpzIHdoaWNoIGFsc28gY3JlYXRlcyBhbiBpZnJhbWUgYW5kIGxvYWRzIHRoZSBmaXJzdCBtZWRpYSBmcm9tIHRoZSBtYW5pZmVzdFxuICAvLyA0LiBDb21tdW5pY2F0aW9uIGlzIGRvbmUgdmlhIHRoZSBDRVMgQVBJIGJ1dCBiZWNhdXNlIHRoZSBpZnJhbWUgaXMgbm90IGFsbG93ZWQgdG8gYWNjZXNzIHRoZSBnbG9iYWwgQ0VTIG9iamVjdCB3ZSBuZWVkIHRvIHVzZSB3aW5kb3cucG9zdE1lc3NhZ2VcblxuICAvLyBUbyBhY2hpZXZlIHRoaXMgd2UgY2hhbmdlIHRoZSBwYWNrYWdlIGJ5IHJlcGxhY2luZyB0aGUgYm9vdHN0cmFwLmpzIHdpdGggb3VyIG93biBhbmQgaW5qZWN0IGEgcHJveHkgQ0VTIEFQSSB0aGF0IGNvbW11bmljYXRlcyB2aWEgcG9zdE1lc3NhZ2VcbiAgLy8gQmVjYXVzZSB3ZSBhbHNvIHdhbnQgdG8gcnVuIHRoaXMgaW4gc3Rvcnlib29rLCB3ZSBjYW5ub3QgdXNlIHdpbmRvdy50b3AgYmVjYXVzZSB0byBzZW5kIG1lc3NhZ2VzIHRoZXJlLCBiZWNhdXNlIGluIGNhc2Ugb2Ygc3Rvcnlib29rIHRoYXQgaXMgbm90IHRoZSB0b3Agd2luZG93LlxuICAvLyBTbyB3ZSBzZW5kIG1lc3NhZ2VzIHRvIGFsbCBwYXJlbnQgd2luZG93c1xuICBwcml2YXRlIHJhd1Jlc3BvbnNlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlID0gdGhpcy5oYW5kbGVQb3N0TWVzc2FnZS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhJyB9KVxuICBkYXRhOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhLWJhc2UtaXRlbScgfSlcbiAgYmFzZUl0ZW1Vcmw6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEtYmFzZS1yZWYnIH0pXG4gIGJhc2VSZWZVcmw6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2lkJyB9KVxuICBpZDogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2Vycm9yTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcbiAgbWFuaWZlc3Q6IHtcbiAgICBzY3JpcHQ6IHN0cmluZ1tdO1xuICAgIHN0eWxlOiBzdHJpbmdbXTtcbiAgICBtZWRpYTogc3RyaW5nW107XG4gIH07XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IHVyaVRvTWFuaWZlc3QgPSB0aGlzLmRhdGEuc3RhcnRzV2l0aCgnaHR0cCcpXG4gICAgICA/IHRoaXMuZGF0YVxuICAgICAgOiByZW1vdmVEb3VibGVTbGFzaGVzKHRoaXMuYmFzZUl0ZW1VcmwgKyAnLycgKyB0aGlzLmRhdGEpO1xuICAgIC8vIGZldGNoIHRoZSBqc29uIGZpbGUgbG9jYXRlZCBhdCB0aGUgZGF0YSBhdHRyaWJ1dGVcbiAgICBmZXRjaCh1cmlUb01hbmlmZXN0KVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuanNvbigpKVxuICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgIHRoaXMubWFuaWZlc3QgPSBkYXRhO1xuICAgICAgICB0aGlzLnNldHVwQ0VTKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIHRoaXMuX2Vycm9yTWVzc2FnZSA9IGVycjtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gTUg6IENoYW5nZWQgdGhlIGRlZmF1bHQgYm9vdHN0cmFwLmpzIHRvIHVzZSB0aGUgbmV3IENFUyBBUElcbiAgLy8gQmVjYXVzZSB0aGUgb2xkIG9uZSB1c2VzIHRoZSBnbG9iYWwgQ0VTIG9iamVjdCB0aGF0IGlzIG5vdCBhbGxvd2VkIHRvIGJlIGFjY2Vzc2VkIHdoZW4gdGhlIENJXG4gIC8vIGlzIGVtYmVkZGVkIGluIGFuIGlmcmFtZSBhbmQgY29taW5nIGZyb20gYW5vdGhlciBkb21haW5cbiAgLy8gVGhlcmVmb3Igd2UgbmVlZCB0byB1c2UgdGhlIG5ldyBDRVMgQVBJIHRvIGNvbW11bmljYXRlcyB2aWEgdGhlIGJyb2FkY2FzdCBBUElcbiAgc2V0dXBDRVMoKSB7XG4gICAgY29uc3QgaWZyYW1lID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJyNwY2lDb250YWluZXInKSBhcyBIVE1MSUZyYW1lRWxlbWVudCxcbiAgICAgIGlmcmFtZVdpbiA9IGlmcmFtZS5jb250ZW50V2luZG93IHx8IGlmcmFtZSxcbiAgICAgIGlmcmFtZURvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG5cbiAgICAvLyBjb25zdCBjaGFubmVsID0gbmV3IEJyb2FkY2FzdENoYW5uZWwoJ2Nlc19jaGFubmVsJyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlKTtcbiAgICBpZnJhbWVEb2Mub3BlbigpO1xuICAgIGlmcmFtZURvYy53cml0ZShgXG4gICAgICA8aHRtbD5cbiAgICAgICAgPGhlYWQ+XG4gICAgICAgICAgPGxpbmsgaHJlZj0nJHtyZW1vdmVEb3VibGVTbGFzaGVzKGAke3RoaXMuYmFzZVJlZlVybH0vJHt0aGlzLm1hbmlmZXN0LnN0eWxlWzBdfWApfScgcmVsPVwic3R5bGVzaGVldFwiIC8+XG4gICAgICAgICAgPHNjcmlwdCBzcmM9JyR7cmVtb3ZlRG91YmxlU2xhc2hlcyhgJHt0aGlzLmJhc2VSZWZVcmx9LyR7dGhpcy5tYW5pZmVzdC5zY3JpcHRbMF19YCl9Jz48L3NjcmlwdD5cbiAgICAgICAgPC9oZWFkPlxuICAgICAgICA8Ym9keT48L2JvZHk+XG4gICAgICA8L2h0bWw+XG4gICAgICBgKTtcblxuICAgIGlmcmFtZURvYy5jbG9zZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJRnJhbWVzKCkge1xuICAgIGNvbnN0IGlmcmFtZXNJblNoYWRvd1Jvb3QgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJyk7XG4gICAgY29uc3QgaWZyYW1lID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTtcblxuICAgIGNvbnN0IG91dGVySUZyYW1lcyA9IFsuLi5pZnJhbWVzSW5TaGFkb3dSb290LCAuLi5pZnJhbWVdO1xuICAgIGZvciAoY29uc3QgaWZyYW1lIG9mIG91dGVySUZyYW1lcykge1xuICAgICAgY29uc3QgaWZyYW1lU3JjID0gaWZyYW1lLnNyYztcbiAgICAgIGNvbnN0IGlzU2FtZU9yaWdpbiA9IG5ldyBVUkwoaWZyYW1lU3JjLCB3aW5kb3cubG9jYXRpb24uaHJlZikub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuICAgICAgaWYgKGlzU2FtZU9yaWdpbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG91dGVyRG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICBpZiAob3V0ZXJEb2MpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0SW5uZXJJRnJhbWVzKG91dGVyRG9jLCBvdXRlcklGcmFtZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGFjY2Vzc2luZyBuZXN0ZWQgaWZyYW1lOicsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGdldCBvbmx5IHVuaXF1ZSBpZnJhbWVzXG4gICAgb3V0ZXJJRnJhbWVzLmZvckVhY2goKGlmcmFtZSwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChvdXRlcklGcmFtZXMuaW5kZXhPZihpZnJhbWUpICE9PSBpbmRleCkge1xuICAgICAgICBvdXRlcklGcmFtZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gb3V0ZXJJRnJhbWVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbm5lcklGcmFtZXMoaWZyYW1lRG9jdW1lbnQ6IERvY3VtZW50LCBpZnJhbWVzID0gW10pIHtcbiAgICAvLyBHZXQgYWxsIGlmcmFtZXMgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAgICBjb25zdCBjdXJyZW50SWZyYW1lcyA9IGlmcmFtZURvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpO1xuXG4gICAgY3VycmVudElmcmFtZXMuZm9yRWFjaChpZnJhbWUgPT4ge1xuICAgICAgLy8gQWRkIHRoZSBjdXJyZW50IGlmcmFtZSB0byB0aGUgbGlzdFxuICAgICAgaWZyYW1lcy5wdXNoKGlmcmFtZSk7XG5cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGdldCBpZnJhbWVzIHdpdGhpbiB0aGUgY3VycmVudCBpZnJhbWVcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBpZnJhbWUgc3JjIGlzIGZyb20gdGhlIHNhbWUgb3JpZ2luXG4gICAgICBjb25zdCBpZnJhbWVTcmMgPSBpZnJhbWUuc3JjO1xuICAgICAgY29uc3QgaXNTYW1lT3JpZ2luID0gbmV3IFVSTChpZnJhbWVTcmMsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG5cbiAgICAgIGlmIChpc1NhbWVPcmlnaW4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBuZXN0ZWREb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50IHx8IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICAgICAgICAgIHRoaXMuZ2V0SW5uZXJJRnJhbWVzKG5lc3RlZERvYywgaWZyYW1lcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhY2Nlc3NpbmcgbmVzdGVkIGlmcmFtZTonLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTa2lwcGVkIGNyb3NzLW9yaWdpbiBpZnJhbWU6JywgaWZyYW1lU3JjKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBpZnJhbWVzO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3N0VG9XaW5kb3dBbmRJZnJhbWVzKHR5cGU6IHN0cmluZywgZGF0YTogYW55KSB7XG4gICAgd2luZG93LnBvc3RNZXNzYWdlKHsgdHlwZSwgZGF0YSB9LCAnKicpO1xuICAgIGNvbnN0IGlmcmFtZXMgPSB0aGlzLmdldElGcmFtZXMoKTtcbiAgICBmb3IgKGNvbnN0IGlmcmFtZSBvZiBpZnJhbWVzKSB7XG4gICAgICBpZiAoaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoeyB0eXBlLCBkYXRhIH0sICcqJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlUG9zdE1lc3NhZ2UoZXZlbnQ6IE1lc3NhZ2VFdmVudCkge1xuICAgIGNvbnN0IHsgdHlwZSwgZGF0YSB9ID0gZXZlbnQuZGF0YTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3NldFJlc3BvbnNlJzpcbiAgICAgICAgdGhpcy5yYXdSZXNwb25zZSA9IGRhdGE7XG4gICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKGRhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2dldFJlc3BvbnNlJzoge1xuICAgICAgICB0aGlzLnBvc3RUb1dpbmRvd0FuZElmcmFtZXMoJ3Jlc3BvbnNlRGF0YScsIHRoaXMucmF3UmVzcG9uc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2dldE1lZGlhJzoge1xuICAgICAgICBjb25zdCBtZWRpYURhdGEgPSB0aGlzLm1hbmlmZXN0Lm1lZGlhLm1hcChtZWRpYSA9PiB7XG4gICAgICAgICAgY29uc3QgdXJsID0gbWVkaWEuc3RhcnRzV2l0aCgnaHR0cCcpID8gbWVkaWEgOiByZW1vdmVEb3VibGVTbGFzaGVzKHRoaXMuYmFzZVJlZlVybCArICcvJyArIG1lZGlhKTtcbiAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb3N0VG9XaW5kb3dBbmRJZnJhbWVzKCdtZWRpYURhdGEnLCBtZWRpYURhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3NldFN0YWdlSGVpZ2h0JzpcbiAgICAgICAgY29uc29sZS5sb2coJ3NldFN0YWdlSGVpZ2h0IG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yYXdSZXNwb25zZSAhPT0gJyc7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnJhd1Jlc3BvbnNlO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMucmF3UmVzcG9uc2UgPSB2YWw7XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuaGFuZGxlUG9zdE1lc3NhZ2UpO1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGlmcmFtZVxuICAgICAgICB3aWR0aD0ke3RoaXMuZ2V0QXR0cmlidXRlKCd3aWR0aCcpfVxuICAgICAgICBoZWlnaHQ9JHt0aGlzLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyl9XG4gICAgICAgIGZyYW1lYm9yZGVyPVwiMFwiXG4gICAgICAgIHRpdGxlPVwicGNpQ29udGFpbmVyXCJcbiAgICAgICAgaWQ9XCJwY2lDb250YWluZXJcIlxuICAgICAgPlxuICAgICAgPC9pZnJhbWU+XG4gICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZSAmJlxuICAgICAgaHRtbGA8ZGl2IHN0eWxlPVwiY29sb3I6cmVkXCI+XG4gICAgICAgIDxoMT5FcnJvcjwvaDE+XG4gICAgICAgICR7dGhpcy5fZXJyb3JNZXNzYWdlfVxuICAgICAgPC9kaXY+YH1gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nOiBRdGlDdXN0b21JbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbkBjdXN0b21FbGVtZW50KCdxdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUVuZEF0dGVtcHRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjb3VudC1hdHRlbXB0JyB9KVxuICBwdWJsaWMgY291bnRBdHRlbXB0OiBzdHJpbmcgPSAndHJ1ZSc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIHB1YmxpYyB0aXRsZTogJ2VuZCBhdHRlbXB0JztcblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICAvLyBub3QgaW1wbGVtZW50ZWQgYnkgZGVzaWduXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIC8vIG5vdCBpbXBsZW1lbnRlZCBieSBkZXNpZ25cbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8YnV0dG9uID9kaXNhYmxlZD0ke3RoaXMuZGlzYWJsZWR9IHBhcnQ9XCJidXR0b25cIiBAY2xpY2s9JHt0aGlzLmVuZEF0dGVtcHR9PiR7dGhpcy50aXRsZX08L2J1dHRvbj5gO1xuICB9XG4gIHB1YmxpYyBlbmRBdHRlbXB0KGU6IEV2ZW50KSB7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdlbmQtYXR0ZW1wdCcsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCBjb3VudEF0dGVtcHQ6IHRoaXMuY291bnRBdHRlbXB0ID09PSAndHJ1ZScgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic6IFF0aUVuZEF0dGVtcHRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdhcE1hdGNoSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktZ2FwLXRleHQnLCBmYWxzZSwgJ3F0aS1nYXAnKSB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAwLjVyZW07XG4gICAgICB9XG5cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy10b3ApIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1ib3R0b20pIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlO1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLWxlZnQpIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1yaWdodCkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gICAgICB9XG4gICAgICAvKiBbcGFydD0nZHJvcHMnXSAsICovXG4gICAgICBbcGFydD0nZHJhZ3MnXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj4gPC9zbG90PjxzbG90IHBhcnQ9XCJkcmFnc1wiIG5hbWU9XCJxdGktZ2FwLXRleHRcIj48L3Nsb3Q+IDxzbG90IHBhcnQ9XCJkcm9wc1wiPjwvc2xvdD5gO1xuICB9XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBsZXQgbWF0Y2hlczogeyB0ZXh0OiBzdHJpbmc7IGdhcDogc3RyaW5nIH1bXSA9IFtdO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG5cbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIG1hdGNoZXMgPSByZXNwb25zZS5tYXAoeCA9PiB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0geC5zcGxpdCgnICcpO1xuICAgICAgICByZXR1cm4geyB0ZXh0OiBzcGxpdFswXSwgZ2FwOiBzcGxpdFsxXSB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2FwcyA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWdhcCcpO1xuICAgIGdhcHMuZm9yRWFjaCgoZ2FwLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaWRlbnRpZmllciA9IGdhcC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgIGNvbnN0IHRleHRJZGVudGlmaWVyID0gbWF0Y2hlcy5maW5kKHggPT4geC5nYXAgPT09IGlkZW50aWZpZXIpPy50ZXh0O1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMucXVlcnlTZWxlY3RvcihgcXRpLWdhcC10ZXh0W2lkZW50aWZpZXI9XCIke3RleHRJZGVudGlmaWVyfVwiXWApPy50ZXh0Q29udGVudC50cmltKCk7XG4gICAgICBpZiAodGV4dElkZW50aWZpZXIgJiYgdGV4dCkge1xuICAgICAgICBpZiAoIWdhcC5uZXh0RWxlbWVudFNpYmxpbmc/LmNsYXNzTGlzdC5jb250YWlucygnY29ycmVjdC1vcHRpb24nKSkge1xuICAgICAgICAgIGNvbnN0IHRleHRTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgIHRleHRTcGFuLmNsYXNzTGlzdC5hZGQoJ2NvcnJlY3Qtb3B0aW9uJyk7XG4gICAgICAgICAgdGV4dFNwYW4udGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgICAgICAgIGdhcC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgdGV4dFNwYW4pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGdhcC5uZXh0RWxlbWVudFNpYmxpbmc/LmNsYXNzTGlzdC5jb250YWlucygnY29ycmVjdC1vcHRpb24nKSkge1xuICAgICAgICBnYXAubmV4dEVsZW1lbnRTaWJsaW5nLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlHYXBNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbmltcG9ydCB7Q2hpbGRQYXJ0LCBub0NoYW5nZX0gZnJvbSAnLi4vbGl0LWh0bWwuanMnO1xuaW1wb3J0IHtkaXJlY3RpdmUsIERpcmVjdGl2ZSwgUGFydEluZm8sIFBhcnRUeXBlfSBmcm9tICcuLi9kaXJlY3RpdmUuanMnO1xuaW1wb3J0IHtcbiAgaW5zZXJ0UGFydCxcbiAgZ2V0Q29tbWl0dGVkVmFsdWUsXG4gIHJlbW92ZVBhcnQsXG4gIHNldENvbW1pdHRlZFZhbHVlLFxuICBzZXRDaGlsZFBhcnRWYWx1ZSxcbn0gZnJvbSAnLi4vZGlyZWN0aXZlLWhlbHBlcnMuanMnO1xuXG5leHBvcnQgdHlwZSBLZXlGbjxUPiA9IChpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiB1bmtub3duO1xuZXhwb3J0IHR5cGUgSXRlbVRlbXBsYXRlPFQ+ID0gKGl0ZW06IFQsIGluZGV4OiBudW1iZXIpID0+IHVua25vd247XG5cbi8vIEhlbHBlciBmb3IgZ2VuZXJhdGluZyBhIG1hcCBvZiBhcnJheSBpdGVtIHRvIGl0cyBpbmRleCBvdmVyIGEgc3Vic2V0XG4vLyBvZiBhbiBhcnJheSAodXNlZCB0byBsYXppbHkgZ2VuZXJhdGUgYG5ld0tleVRvSW5kZXhNYXBgIGFuZFxuLy8gYG9sZEtleVRvSW5kZXhNYXBgKVxuY29uc3QgZ2VuZXJhdGVNYXAgPSAobGlzdDogdW5rbm93bltdLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikgPT4ge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHVua25vd24sIG51bWJlcj4oKTtcbiAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgbWFwLnNldChsaXN0W2ldLCBpKTtcbiAgfVxuICByZXR1cm4gbWFwO1xufTtcblxuY2xhc3MgUmVwZWF0RGlyZWN0aXZlIGV4dGVuZHMgRGlyZWN0aXZlIHtcbiAgcHJpdmF0ZSBfaXRlbUtleXM/OiB1bmtub3duW107XG5cbiAgY29uc3RydWN0b3IocGFydEluZm86IFBhcnRJbmZvKSB7XG4gICAgc3VwZXIocGFydEluZm8pO1xuICAgIGlmIChwYXJ0SW5mby50eXBlICE9PSBQYXJ0VHlwZS5DSElMRCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXBlYXQoKSBjYW4gb25seSBiZSB1c2VkIGluIHRleHQgZXhwcmVzc2lvbnMnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRWYWx1ZXNBbmRLZXlzPFQ+KFxuICAgIGl0ZW1zOiBJdGVyYWJsZTxUPixcbiAgICBrZXlGbk9yVGVtcGxhdGU6IEtleUZuPFQ+IHwgSXRlbVRlbXBsYXRlPFQ+LFxuICAgIHRlbXBsYXRlPzogSXRlbVRlbXBsYXRlPFQ+XG4gICkge1xuICAgIGxldCBrZXlGbjogS2V5Rm48VD4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRlbXBsYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRlbXBsYXRlID0ga2V5Rm5PclRlbXBsYXRlO1xuICAgIH0gZWxzZSBpZiAoa2V5Rm5PclRlbXBsYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGtleUZuID0ga2V5Rm5PclRlbXBsYXRlIGFzIEtleUZuPFQ+O1xuICAgIH1cbiAgICBjb25zdCBrZXlzID0gW107XG4gICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIGtleXNbaW5kZXhdID0ga2V5Rm4gPyBrZXlGbihpdGVtLCBpbmRleCkgOiBpbmRleDtcbiAgICAgIHZhbHVlc1tpbmRleF0gPSB0ZW1wbGF0ZSEoaXRlbSwgaW5kZXgpO1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlcyxcbiAgICAgIGtleXMsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcjxUPihpdGVtczogSXRlcmFibGU8VD4sIHRlbXBsYXRlOiBJdGVtVGVtcGxhdGU8VD4pOiBBcnJheTx1bmtub3duPjtcbiAgcmVuZGVyPFQ+KFxuICAgIGl0ZW1zOiBJdGVyYWJsZTxUPixcbiAgICBrZXlGbjogS2V5Rm48VD4gfCBJdGVtVGVtcGxhdGU8VD4sXG4gICAgdGVtcGxhdGU6IEl0ZW1UZW1wbGF0ZTxUPlxuICApOiBBcnJheTx1bmtub3duPjtcbiAgcmVuZGVyPFQ+KFxuICAgIGl0ZW1zOiBJdGVyYWJsZTxUPixcbiAgICBrZXlGbk9yVGVtcGxhdGU6IEtleUZuPFQ+IHwgSXRlbVRlbXBsYXRlPFQ+LFxuICAgIHRlbXBsYXRlPzogSXRlbVRlbXBsYXRlPFQ+XG4gICkge1xuICAgIHJldHVybiB0aGlzLl9nZXRWYWx1ZXNBbmRLZXlzKGl0ZW1zLCBrZXlGbk9yVGVtcGxhdGUsIHRlbXBsYXRlKS52YWx1ZXM7XG4gIH1cblxuICBvdmVycmlkZSB1cGRhdGU8VD4oXG4gICAgY29udGFpbmVyUGFydDogQ2hpbGRQYXJ0LFxuICAgIFtpdGVtcywga2V5Rm5PclRlbXBsYXRlLCB0ZW1wbGF0ZV06IFtcbiAgICAgIEl0ZXJhYmxlPFQ+LFxuICAgICAgS2V5Rm48VD4gfCBJdGVtVGVtcGxhdGU8VD4sXG4gICAgICBJdGVtVGVtcGxhdGU8VD4sXG4gICAgXVxuICApIHtcbiAgICAvLyBPbGQgcGFydCAmIGtleSBsaXN0cyBhcmUgcmV0cmlldmVkIGZyb20gdGhlIGxhc3QgdXBkYXRlICh3aGljaCBtYXlcbiAgICAvLyBiZSBwcmltZWQgYnkgaHlkcmF0aW9uKVxuICAgIGNvbnN0IG9sZFBhcnRzID0gZ2V0Q29tbWl0dGVkVmFsdWUoXG4gICAgICBjb250YWluZXJQYXJ0XG4gICAgKSBhcyBBcnJheTxDaGlsZFBhcnQgfCBudWxsPjtcbiAgICBjb25zdCB7dmFsdWVzOiBuZXdWYWx1ZXMsIGtleXM6IG5ld0tleXN9ID0gdGhpcy5fZ2V0VmFsdWVzQW5kS2V5cyhcbiAgICAgIGl0ZW1zLFxuICAgICAga2V5Rm5PclRlbXBsYXRlLFxuICAgICAgdGVtcGxhdGVcbiAgICApO1xuXG4gICAgLy8gV2UgY2hlY2sgdGhhdCBvbGRQYXJ0cywgdGhlIGNvbW1pdHRlZCB2YWx1ZSwgaXMgYW4gQXJyYXkgYXMgYW5cbiAgICAvLyBpbmRpY2F0b3IgdGhhdCB0aGUgcHJldmlvdXMgdmFsdWUgY2FtZSBmcm9tIGEgcmVwZWF0KCkgY2FsbC4gSWZcbiAgICAvLyBvbGRQYXJ0cyBpcyBub3QgYW4gQXJyYXkgdGhlbiB0aGlzIGlzIHRoZSBmaXJzdCByZW5kZXIgYW5kIHdlIHJldHVyblxuICAgIC8vIGFuIGFycmF5IGZvciBsaXQtaHRtbCdzIGFycmF5IGhhbmRsaW5nIHRvIHJlbmRlciwgYW5kIHJlbWVtYmVyIHRoZVxuICAgIC8vIGtleXMuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG9sZFBhcnRzKSkge1xuICAgICAgdGhpcy5faXRlbUtleXMgPSBuZXdLZXlzO1xuICAgICAgcmV0dXJuIG5ld1ZhbHVlcztcbiAgICB9XG5cbiAgICAvLyBJbiBTU1IgaHlkcmF0aW9uIGl0J3MgcG9zc2libGUgZm9yIG9sZFBhcnRzIHRvIGJlIGFuIGFycmF5IGJ1dCBmb3IgdXNcbiAgICAvLyB0byBub3QgaGF2ZSBpdGVtIGtleXMgYmVjYXVzZSB0aGUgdXBkYXRlKCkgaGFzbid0IHJ1biB5ZXQuIFdlIHNldCB0aGVcbiAgICAvLyBrZXlzIHRvIGFuIGVtcHR5IGFycmF5LiBUaGlzIHdpbGwgY2F1c2UgYWxsIG9sZEtleS9uZXdLZXkgY29tcGFyaXNvbnNcbiAgICAvLyB0byBmYWlsIGFuZCBleGVjdXRpb24gdG8gZmFsbCB0byB0aGUgbGFzdCBuZXN0ZWQgYnJhY2ggYmVsb3cgd2hpY2hcbiAgICAvLyByZXVzZXMgdGhlIG9sZFBhcnQuXG4gICAgY29uc3Qgb2xkS2V5cyA9ICh0aGlzLl9pdGVtS2V5cyA/Pz0gW10pO1xuXG4gICAgLy8gTmV3IHBhcnQgbGlzdCB3aWxsIGJlIGJ1aWx0IHVwIGFzIHdlIGdvIChlaXRoZXIgcmV1c2VkIGZyb21cbiAgICAvLyBvbGQgcGFydHMgb3IgY3JlYXRlZCBmb3IgbmV3IGtleXMgaW4gdGhpcyB1cGRhdGUpLiBUaGlzIGlzXG4gICAgLy8gc2F2ZWQgaW4gdGhlIGFib3ZlIGNhY2hlIGF0IHRoZSBlbmQgb2YgdGhlIHVwZGF0ZS5cbiAgICBjb25zdCBuZXdQYXJ0czogQ2hpbGRQYXJ0W10gPSBbXTtcblxuICAgIC8vIE1hcHMgZnJvbSBrZXkgdG8gaW5kZXggZm9yIGN1cnJlbnQgYW5kIHByZXZpb3VzIHVwZGF0ZTsgdGhlc2VcbiAgICAvLyBhcmUgZ2VuZXJhdGVkIGxhemlseSBvbmx5IHdoZW4gbmVlZGVkIGFzIGEgcGVyZm9ybWFuY2VcbiAgICAvLyBvcHRpbWl6YXRpb24sIHNpbmNlIHRoZXkgYXJlIG9ubHkgcmVxdWlyZWQgZm9yIG11bHRpcGxlXG4gICAgLy8gbm9uLWNvbnRpZ3VvdXMgY2hhbmdlcyBpbiB0aGUgbGlzdCwgd2hpY2ggYXJlIGxlc3MgY29tbW9uLlxuICAgIGxldCBuZXdLZXlUb0luZGV4TWFwITogTWFwPHVua25vd24sIG51bWJlcj47XG4gICAgbGV0IG9sZEtleVRvSW5kZXhNYXAhOiBNYXA8dW5rbm93biwgbnVtYmVyPjtcblxuICAgIC8vIEhlYWQgYW5kIHRhaWwgcG9pbnRlcnMgdG8gb2xkIHBhcnRzIGFuZCBuZXcgdmFsdWVzXG4gICAgbGV0IG9sZEhlYWQgPSAwO1xuICAgIGxldCBvbGRUYWlsID0gb2xkUGFydHMubGVuZ3RoIC0gMTtcbiAgICBsZXQgbmV3SGVhZCA9IDA7XG4gICAgbGV0IG5ld1RhaWwgPSBuZXdWYWx1ZXMubGVuZ3RoIC0gMTtcblxuICAgIC8vIE92ZXJ2aWV3IG9mIE8obikgcmVjb25jaWxpYXRpb24gYWxnb3JpdGhtIChnZW5lcmFsIGFwcHJvYWNoXG4gICAgLy8gYmFzZWQgb24gaWRlYXMgZm91bmQgaW4gaXZpLCB2dWUsIHNuYWJiZG9tLCBldGMuKTpcbiAgICAvL1xuICAgIC8vICogV2Ugc3RhcnQgd2l0aCB0aGUgbGlzdCBvZiBvbGQgcGFydHMgYW5kIG5ldyB2YWx1ZXMgKGFuZFxuICAgIC8vICAgYXJyYXlzIG9mIHRoZWlyIHJlc3BlY3RpdmUga2V5cyksIGhlYWQvdGFpbCBwb2ludGVycyBpbnRvXG4gICAgLy8gICBlYWNoLCBhbmQgd2UgYnVpbGQgdXAgdGhlIG5ldyBsaXN0IG9mIHBhcnRzIGJ5IHVwZGF0aW5nXG4gICAgLy8gICAoYW5kIHdoZW4gbmVlZGVkLCBtb3ZpbmcpIG9sZCBwYXJ0cyBvciBjcmVhdGluZyBuZXcgb25lcy5cbiAgICAvLyAgIFRoZSBpbml0aWFsIHNjZW5hcmlvIG1pZ2h0IGxvb2sgbGlrZSB0aGlzIChmb3IgYnJldml0eSBvZlxuICAgIC8vICAgdGhlIGRpYWdyYW1zLCB0aGUgbnVtYmVycyBpbiB0aGUgYXJyYXkgcmVmbGVjdCBrZXlzXG4gICAgLy8gICBhc3NvY2lhdGVkIHdpdGggdGhlIG9sZCBwYXJ0cyBvciBuZXcgdmFsdWVzLCBhbHRob3VnaCBrZXlzXG4gICAgLy8gICBhbmQgcGFydHMvdmFsdWVzIGFyZSBhY3R1YWxseSBzdG9yZWQgaW4gcGFyYWxsZWwgYXJyYXlzXG4gICAgLy8gICBpbmRleGVkIHVzaW5nIHRoZSBzYW1lIGhlYWQvdGFpbCBwb2ludGVycyk6XG4gICAgLy9cbiAgICAvLyAgICAgIG9sZEhlYWQgdiAgICAgICAgICAgICAgICAgdiBvbGRUYWlsXG4gICAgLy8gICBvbGRLZXlzOiAgWzAsIDEsIDIsIDMsIDQsIDUsIDZdXG4gICAgLy8gICBuZXdQYXJ0czogWyAsICAsICAsICAsICAsICAsICBdXG4gICAgLy8gICBuZXdLZXlzOiAgWzAsIDIsIDEsIDQsIDMsIDcsIDZdIDwtIHJlZmxlY3RzIHRoZSB1c2VyJ3MgbmV3XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gb3JkZXJcbiAgICAvLyAgICAgIG5ld0hlYWQgXiAgICAgICAgICAgICAgICAgXiBuZXdUYWlsXG4gICAgLy9cbiAgICAvLyAqIEl0ZXJhdGUgb2xkICYgbmV3IGxpc3RzIGZyb20gYm90aCBzaWRlcywgdXBkYXRpbmcsXG4gICAgLy8gICBzd2FwcGluZywgb3IgcmVtb3ZpbmcgcGFydHMgYXQgdGhlIGhlYWQvdGFpbCBsb2NhdGlvbnNcbiAgICAvLyAgIHVudGlsIG5laXRoZXIgaGVhZCBub3IgdGFpbCBjYW4gbW92ZS5cbiAgICAvL1xuICAgIC8vICogRXhhbXBsZSBiZWxvdzoga2V5cyBhdCBoZWFkIHBvaW50ZXJzIG1hdGNoLCBzbyB1cGRhdGUgb2xkXG4gICAgLy8gICBwYXJ0IDAgaW4tcGxhY2UgKG5vIG5lZWQgdG8gbW92ZSBpdCkgYW5kIHJlY29yZCBwYXJ0IDAgaW5cbiAgICAvLyAgIHRoZSBgbmV3UGFydHNgIGxpc3QuIFRoZSBsYXN0IHRoaW5nIHdlIGRvIGlzIGFkdmFuY2UgdGhlXG4gICAgLy8gICBgb2xkSGVhZGAgYW5kIGBuZXdIZWFkYCBwb2ludGVycyAod2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlXG4gICAgLy8gICBuZXh0IGRpYWdyYW0pLlxuICAgIC8vXG4gICAgLy8gICAgICBvbGRIZWFkIHYgICAgICAgICAgICAgICAgIHYgb2xkVGFpbFxuICAgIC8vICAgb2xkS2V5czogIFswLCAxLCAyLCAzLCA0LCA1LCA2XVxuICAgIC8vICAgbmV3UGFydHM6IFswLCAgLCAgLCAgLCAgLCAgLCAgXSA8LSBoZWFkcyBtYXRjaGVkOiB1cGRhdGUgMFxuICAgIC8vICAgbmV3S2V5czogIFswLCAyLCAxLCA0LCAzLCA3LCA2XSAgICBhbmQgYWR2YW5jZSBib3RoIG9sZEhlYWRcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBuZXdIZWFkXG4gICAgLy8gICAgICBuZXdIZWFkIF4gICAgICAgICAgICAgICAgIF4gbmV3VGFpbFxuICAgIC8vXG4gICAgLy8gKiBFeGFtcGxlIGJlbG93OiBoZWFkIHBvaW50ZXJzIGRvbid0IG1hdGNoLCBidXQgdGFpbFxuICAgIC8vICAgcG9pbnRlcnMgZG8sIHNvIHVwZGF0ZSBwYXJ0IDYgaW4gcGxhY2UgKG5vIG5lZWQgdG8gbW92ZVxuICAgIC8vICAgaXQpLCBhbmQgcmVjb3JkIHBhcnQgNiBpbiB0aGUgYG5ld1BhcnRzYCBsaXN0LiBMYXN0LFxuICAgIC8vICAgYWR2YW5jZSB0aGUgYG9sZFRhaWxgIGFuZCBgb2xkSGVhZGAgcG9pbnRlcnMuXG4gICAgLy9cbiAgICAvLyAgICAgICAgIG9sZEhlYWQgdiAgICAgICAgICAgICAgdiBvbGRUYWlsXG4gICAgLy8gICBvbGRLZXlzOiAgWzAsIDEsIDIsIDMsIDQsIDUsIDZdXG4gICAgLy8gICBuZXdQYXJ0czogWzAsICAsICAsICAsICAsICAsIDZdIDwtIHRhaWxzIG1hdGNoZWQ6IHVwZGF0ZSA2XG4gICAgLy8gICBuZXdLZXlzOiAgWzAsIDIsIDEsIDQsIDMsIDcsIDZdICAgIGFuZCBhZHZhbmNlIGJvdGggb2xkVGFpbFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIG5ld1RhaWxcbiAgICAvLyAgICAgICAgIG5ld0hlYWQgXiAgICAgICAgICAgICAgXiBuZXdUYWlsXG4gICAgLy9cbiAgICAvLyAqIElmIG5laXRoZXIgaGVhZCBub3IgdGFpbCBtYXRjaDsgbmV4dCBjaGVjayBpZiBvbmUgb2YgdGhlXG4gICAgLy8gICBvbGQgaGVhZC90YWlsIGl0ZW1zIHdhcyByZW1vdmVkLiBXZSBmaXJzdCBuZWVkIHRvIGdlbmVyYXRlXG4gICAgLy8gICB0aGUgcmV2ZXJzZSBtYXAgb2YgbmV3IGtleXMgdG8gaW5kZXggKGBuZXdLZXlUb0luZGV4TWFwYCksXG4gICAgLy8gICB3aGljaCBpcyBkb25lIG9uY2UgbGF6aWx5IGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLFxuICAgIC8vICAgc2luY2Ugd2Ugb25seSBoaXQgdGhpcyBjYXNlIGlmIG11bHRpcGxlIG5vbi1jb250aWd1b3VzXG4gICAgLy8gICBjaGFuZ2VzIHdlcmUgbWFkZS4gTm90ZSB0aGF0IGZvciBjb250aWd1b3VzIHJlbW92YWxcbiAgICAvLyAgIGFueXdoZXJlIGluIHRoZSBsaXN0LCB0aGUgaGVhZCBhbmQgdGFpbHMgd291bGQgYWR2YW5jZVxuICAgIC8vICAgZnJvbSBlaXRoZXIgZW5kIGFuZCBwYXNzIGVhY2ggb3RoZXIgYmVmb3JlIHdlIGdldCB0byB0aGlzXG4gICAgLy8gICBjYXNlIGFuZCByZW1vdmFscyB3b3VsZCBiZSBoYW5kbGVkIGluIHRoZSBmaW5hbCB3aGlsZSBsb29wXG4gICAgLy8gICB3aXRob3V0IG5lZWRpbmcgdG8gZ2VuZXJhdGUgdGhlIG1hcC5cbiAgICAvL1xuICAgIC8vICogRXhhbXBsZSBiZWxvdzogVGhlIGtleSBhdCBgb2xkVGFpbGAgd2FzIHJlbW92ZWQgKG5vIGxvbmdlclxuICAgIC8vICAgaW4gdGhlIGBuZXdLZXlUb0luZGV4TWFwYCksIHNvIHJlbW92ZSB0aGF0IHBhcnQgZnJvbSB0aGVcbiAgICAvLyAgIERPTSBhbmQgYWR2YW5jZSBqdXN0IHRoZSBgb2xkVGFpbGAgcG9pbnRlci5cbiAgICAvL1xuICAgIC8vICAgICAgICAgb2xkSGVhZCB2ICAgICAgICAgICB2IG9sZFRhaWxcbiAgICAvLyAgIG9sZEtleXM6ICBbMCwgMSwgMiwgMywgNCwgNSwgNl1cbiAgICAvLyAgIG5ld1BhcnRzOiBbMCwgICwgICwgICwgICwgICwgNl0gPC0gNSBub3QgaW4gbmV3IG1hcDogcmVtb3ZlXG4gICAgLy8gICBuZXdLZXlzOiAgWzAsIDIsIDEsIDQsIDMsIDcsIDZdICAgIDUgYW5kIGFkdmFuY2Ugb2xkVGFpbFxuICAgIC8vICAgICAgICAgbmV3SGVhZCBeICAgICAgICAgICBeIG5ld1RhaWxcbiAgICAvL1xuICAgIC8vICogT25jZSBoZWFkIGFuZCB0YWlsIGNhbm5vdCBtb3ZlLCBhbnkgbWlzbWF0Y2hlcyBhcmUgZHVlIHRvXG4gICAgLy8gICBlaXRoZXIgbmV3IG9yIG1vdmVkIGl0ZW1zOyBpZiBhIG5ldyBrZXkgaXMgaW4gdGhlIHByZXZpb3VzXG4gICAgLy8gICBcIm9sZCBrZXkgdG8gb2xkIGluZGV4XCIgbWFwLCBtb3ZlIHRoZSBvbGQgcGFydCB0byB0aGUgbmV3XG4gICAgLy8gICBsb2NhdGlvbiwgb3RoZXJ3aXNlIGNyZWF0ZSBhbmQgaW5zZXJ0IGEgbmV3IHBhcnQuIE5vdGVcbiAgICAvLyAgIHRoYXQgd2hlbiBtb3ZpbmcgYW4gb2xkIHBhcnQgd2UgbnVsbCBpdHMgcG9zaXRpb24gaW4gdGhlXG4gICAgLy8gICBvbGRQYXJ0cyBhcnJheSBpZiBpdCBsaWVzIGJldHdlZW4gdGhlIGhlYWQgYW5kIHRhaWwgc28gd2VcbiAgICAvLyAgIGtub3cgdG8gc2tpcCBpdCB3aGVuIHRoZSBwb2ludGVycyBnZXQgdGhlcmUuXG4gICAgLy9cbiAgICAvLyAqIEV4YW1wbGUgYmVsb3c6IG5laXRoZXIgaGVhZCBub3IgdGFpbCBtYXRjaCwgYW5kIG5laXRoZXJcbiAgICAvLyAgIHdlcmUgcmVtb3ZlZDsgc28gZmluZCB0aGUgYG5ld0hlYWRgIGtleSBpbiB0aGVcbiAgICAvLyAgIGBvbGRLZXlUb0luZGV4TWFwYCwgYW5kIG1vdmUgdGhhdCBvbGQgcGFydCdzIERPTSBpbnRvIHRoZVxuICAgIC8vICAgbmV4dCBoZWFkIHBvc2l0aW9uIChiZWZvcmUgYG9sZFBhcnRzW29sZEhlYWRdYCkuIExhc3QsXG4gICAgLy8gICBudWxsIHRoZSBwYXJ0IGluIHRoZSBgb2xkUGFydGAgYXJyYXkgc2luY2UgaXQgd2FzXG4gICAgLy8gICBzb21ld2hlcmUgaW4gdGhlIHJlbWFpbmluZyBvbGRQYXJ0cyBzdGlsbCB0byBiZSBzY2FubmVkXG4gICAgLy8gICAoYmV0d2VlbiB0aGUgaGVhZCBhbmQgdGFpbCBwb2ludGVycykgc28gdGhhdCB3ZSBrbm93IHRvXG4gICAgLy8gICBza2lwIHRoYXQgb2xkIHBhcnQgb24gZnV0dXJlIGl0ZXJhdGlvbnMuXG4gICAgLy9cbiAgICAvLyAgICAgICAgIG9sZEhlYWQgdiAgICAgICAgdiBvbGRUYWlsXG4gICAgLy8gICBvbGRLZXlzOiAgWzAsIDEsIC0sIDMsIDQsIDUsIDZdXG4gICAgLy8gICBuZXdQYXJ0czogWzAsIDIsICAsICAsICAsICAsIDZdIDwtIHN0dWNrOiB1cGRhdGUgJiBtb3ZlIDJcbiAgICAvLyAgIG5ld0tleXM6ICBbMCwgMiwgMSwgNCwgMywgNywgNl0gICAgaW50byBwbGFjZSBhbmQgYWR2YW5jZVxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWFkXG4gICAgLy8gICAgICAgICBuZXdIZWFkIF4gICAgICAgICAgIF4gbmV3VGFpbFxuICAgIC8vXG4gICAgLy8gKiBOb3RlIHRoYXQgZm9yIG1vdmVzL2luc2VydGlvbnMgbGlrZSB0aGUgb25lIGFib3ZlLCBhIHBhcnRcbiAgICAvLyAgIGluc2VydGVkIGF0IHRoZSBoZWFkIHBvaW50ZXIgaXMgaW5zZXJ0ZWQgYmVmb3JlIHRoZVxuICAgIC8vICAgY3VycmVudCBgb2xkUGFydHNbb2xkSGVhZF1gLCBhbmQgYSBwYXJ0IGluc2VydGVkIGF0IHRoZVxuICAgIC8vICAgdGFpbCBwb2ludGVyIGlzIGluc2VydGVkIGJlZm9yZSBgbmV3UGFydHNbbmV3VGFpbCsxXWAuIFRoZVxuICAgIC8vICAgc2VlbWluZyBhc3ltbWV0cnkgbGllcyBpbiB0aGUgZmFjdCB0aGF0IG5ldyBwYXJ0cyBhcmVcbiAgICAvLyAgIG1vdmVkIGludG8gcGxhY2Ugb3V0c2lkZSBpbiwgc28gdG8gdGhlIHJpZ2h0IG9mIHRoZSBoZWFkXG4gICAgLy8gICBwb2ludGVyIGFyZSBvbGQgcGFydHMsIGFuZCB0byB0aGUgcmlnaHQgb2YgdGhlIHRhaWxcbiAgICAvLyAgIHBvaW50ZXIgYXJlIG5ldyBwYXJ0cy5cbiAgICAvL1xuICAgIC8vICogV2UgYWx3YXlzIHJlc3RhcnQgYmFjayBmcm9tIHRoZSB0b3Agb2YgdGhlIGFsZ29yaXRobSxcbiAgICAvLyAgIGFsbG93aW5nIG1hdGNoaW5nIGFuZCBzaW1wbGUgdXBkYXRlcyBpbiBwbGFjZSB0b1xuICAgIC8vICAgY29udGludWUuLi5cbiAgICAvL1xuICAgIC8vICogRXhhbXBsZSBiZWxvdzogdGhlIGhlYWQgcG9pbnRlcnMgb25jZSBhZ2FpbiBtYXRjaCwgc29cbiAgICAvLyAgIHNpbXBseSB1cGRhdGUgcGFydCAxIGFuZCByZWNvcmQgaXQgaW4gdGhlIGBuZXdQYXJ0c2BcbiAgICAvLyAgIGFycmF5LiAgTGFzdCwgYWR2YW5jZSBib3RoIGhlYWQgcG9pbnRlcnMuXG4gICAgLy9cbiAgICAvLyAgICAgICAgIG9sZEhlYWQgdiAgICAgICAgdiBvbGRUYWlsXG4gICAgLy8gICBvbGRLZXlzOiAgWzAsIDEsIC0sIDMsIDQsIDUsIDZdXG4gICAgLy8gICBuZXdQYXJ0czogWzAsIDIsIDEsICAsICAsICAsIDZdIDwtIGhlYWRzIG1hdGNoZWQ6IHVwZGF0ZSAxXG4gICAgLy8gICBuZXdLZXlzOiAgWzAsIDIsIDEsIDQsIDMsIDcsIDZdICAgIGFuZCBhZHZhbmNlIGJvdGggb2xkSGVhZFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIG5ld0hlYWRcbiAgICAvLyAgICAgICAgICAgIG5ld0hlYWQgXiAgICAgICAgXiBuZXdUYWlsXG4gICAgLy9cbiAgICAvLyAqIEFzIG1lbnRpb25lZCBhYm92ZSwgaXRlbXMgdGhhdCB3ZXJlIG1vdmVkIGFzIGEgcmVzdWx0IG9mXG4gICAgLy8gICBiZWluZyBzdHVjayAodGhlIGZpbmFsIGVsc2UgY2xhdXNlIGluIHRoZSBjb2RlIGJlbG93KSBhcmVcbiAgICAvLyAgIG1hcmtlZCB3aXRoIG51bGwsIHNvIHdlIGFsd2F5cyBhZHZhbmNlIG9sZCBwb2ludGVycyBvdmVyXG4gICAgLy8gICB0aGVzZSBzbyB3ZSdyZSBjb21wYXJpbmcgdGhlIG5leHQgYWN0dWFsIG9sZCB2YWx1ZSBvblxuICAgIC8vICAgZWl0aGVyIGVuZC5cbiAgICAvL1xuICAgIC8vICogRXhhbXBsZSBiZWxvdzogYG9sZEhlYWRgIGlzIG51bGwgKGFscmVhZHkgcGxhY2VkIGluXG4gICAgLy8gICBuZXdQYXJ0cyksIHNvIGFkdmFuY2UgYG9sZEhlYWRgLlxuICAgIC8vXG4gICAgLy8gICAgICAgICAgICBvbGRIZWFkIHYgICAgIHYgb2xkVGFpbFxuICAgIC8vICAgb2xkS2V5czogIFswLCAxLCAtLCAzLCA0LCA1LCA2XSA8LSBvbGQgaGVhZCBhbHJlYWR5IHVzZWQ6XG4gICAgLy8gICBuZXdQYXJ0czogWzAsIDIsIDEsICAsICAsICAsIDZdICAgIGFkdmFuY2Ugb2xkSGVhZFxuICAgIC8vICAgbmV3S2V5czogIFswLCAyLCAxLCA0LCAzLCA3LCA2XVxuICAgIC8vICAgICAgICAgICAgICAgbmV3SGVhZCBeICAgICBeIG5ld1RhaWxcbiAgICAvL1xuICAgIC8vICogTm90ZSBpdCdzIG5vdCBjcml0aWNhbCB0byBtYXJrIG9sZCBwYXJ0cyBhcyBudWxsIHdoZW4gdGhleVxuICAgIC8vICAgYXJlIG1vdmVkIGZyb20gaGVhZCB0byB0YWlsIG9yIHRhaWwgdG8gaGVhZCwgc2luY2UgdGhleVxuICAgIC8vICAgd2lsbCBiZSBvdXRzaWRlIHRoZSBwb2ludGVyIHJhbmdlIGFuZCBuZXZlciB2aXNpdGVkIGFnYWluLlxuICAgIC8vXG4gICAgLy8gKiBFeGFtcGxlIGJlbG93OiBIZXJlIHRoZSBvbGQgdGFpbCBrZXkgbWF0Y2hlcyB0aGUgbmV3IGhlYWRcbiAgICAvLyAgIGtleSwgc28gdGhlIHBhcnQgYXQgdGhlIGBvbGRUYWlsYCBwb3NpdGlvbiBhbmQgbW92ZSBpdHNcbiAgICAvLyAgIERPTSB0byB0aGUgbmV3IGhlYWQgcG9zaXRpb24gKGJlZm9yZSBgb2xkUGFydHNbb2xkSGVhZF1gKS5cbiAgICAvLyAgIExhc3QsIGFkdmFuY2UgYG9sZFRhaWxgIGFuZCBgbmV3SGVhZGAgcG9pbnRlcnMuXG4gICAgLy9cbiAgICAvLyAgICAgICAgICAgICAgIG9sZEhlYWQgdiAgdiBvbGRUYWlsXG4gICAgLy8gICBvbGRLZXlzOiAgWzAsIDEsIC0sIDMsIDQsIDUsIDZdXG4gICAgLy8gICBuZXdQYXJ0czogWzAsIDIsIDEsIDQsICAsICAsIDZdIDwtIG9sZCB0YWlsIG1hdGNoZXMgbmV3XG4gICAgLy8gICBuZXdLZXlzOiAgWzAsIDIsIDEsIDQsIDMsIDcsIDZdICAgaGVhZDogdXBkYXRlICYgbW92ZSA0LFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2Ugb2xkVGFpbCAmIG5ld0hlYWRcbiAgICAvLyAgICAgICAgICAgICAgIG5ld0hlYWQgXiAgICAgXiBuZXdUYWlsXG4gICAgLy9cbiAgICAvLyAqIEV4YW1wbGUgYmVsb3c6IE9sZCBhbmQgbmV3IGhlYWQga2V5cyBtYXRjaCwgc28gdXBkYXRlIHRoZVxuICAgIC8vICAgb2xkIGhlYWQgcGFydCBpbiBwbGFjZSwgYW5kIGFkdmFuY2UgdGhlIGBvbGRIZWFkYCBhbmRcbiAgICAvLyAgIGBuZXdIZWFkYCBwb2ludGVycy5cbiAgICAvL1xuICAgIC8vICAgICAgICAgICAgICAgb2xkSGVhZCB2IG9sZFRhaWxcbiAgICAvLyAgIG9sZEtleXM6ICBbMCwgMSwgLSwgMywgNCwgNSwgNl1cbiAgICAvLyAgIG5ld1BhcnRzOiBbMCwgMiwgMSwgNCwgMywgICAsNl0gPC0gaGVhZHMgbWF0Y2g6IHVwZGF0ZSAzXG4gICAgLy8gICBuZXdLZXlzOiAgWzAsIDIsIDEsIDQsIDMsIDcsIDZdICAgIGFuZCBhZHZhbmNlIG9sZEhlYWQgJlxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWFkXG4gICAgLy8gICAgICAgICAgICAgICAgICBuZXdIZWFkIF4gIF4gbmV3VGFpbFxuICAgIC8vXG4gICAgLy8gKiBPbmNlIHRoZSBuZXcgb3Igb2xkIHBvaW50ZXJzIG1vdmUgcGFzdCBlYWNoIG90aGVyIHRoZW4gYWxsXG4gICAgLy8gICB3ZSBoYXZlIGxlZnQgaXMgYWRkaXRpb25zIChpZiBvbGQgbGlzdCBleGhhdXN0ZWQpIG9yXG4gICAgLy8gICByZW1vdmFscyAoaWYgbmV3IGxpc3QgZXhoYXVzdGVkKS4gVGhvc2UgYXJlIGhhbmRsZWQgaW4gdGhlXG4gICAgLy8gICBmaW5hbCB3aGlsZSBsb29wcyBhdCB0aGUgZW5kLlxuICAgIC8vXG4gICAgLy8gKiBFeGFtcGxlIGJlbG93OiBgb2xkSGVhZGAgZXhjZWVkZWQgYG9sZFRhaWxgLCBzbyB3ZSdyZSBkb25lXG4gICAgLy8gICB3aXRoIHRoZSBtYWluIGxvb3AuICBDcmVhdGUgdGhlIHJlbWFpbmluZyBwYXJ0IGFuZCBpbnNlcnRcbiAgICAvLyAgIGl0IGF0IHRoZSBuZXcgaGVhZCBwb3NpdGlvbiwgYW5kIHRoZSB1cGRhdGUgaXMgY29tcGxldGUuXG4gICAgLy9cbiAgICAvLyAgICAgICAgICAgICAgICAgICAob2xkSGVhZCA+IG9sZFRhaWwpXG4gICAgLy8gICBvbGRLZXlzOiAgWzAsIDEsIC0sIDMsIDQsIDUsIDZdXG4gICAgLy8gICBuZXdQYXJ0czogWzAsIDIsIDEsIDQsIDMsIDcgLDZdIDwtIGNyZWF0ZSBhbmQgaW5zZXJ0IDdcbiAgICAvLyAgIG5ld0tleXM6ICBbMCwgMiwgMSwgNCwgMywgNywgNl1cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIG5ld0hlYWQgXiBuZXdUYWlsXG4gICAgLy9cbiAgICAvLyAqIE5vdGUgdGhhdCB0aGUgb3JkZXIgb2YgdGhlIGlmL2Vsc2UgY2xhdXNlcyBpcyBub3RcbiAgICAvLyAgIGltcG9ydGFudCB0byB0aGUgYWxnb3JpdGhtLCBhcyBsb25nIGFzIHRoZSBudWxsIGNoZWNrc1xuICAgIC8vICAgY29tZSBmaXJzdCAodG8gZW5zdXJlIHdlJ3JlIGFsd2F5cyB3b3JraW5nIG9uIHZhbGlkIG9sZFxuICAgIC8vICAgcGFydHMpIGFuZCB0aGF0IHRoZSBmaW5hbCBlbHNlIGNsYXVzZSBjb21lcyBsYXN0IChzaW5jZVxuICAgIC8vICAgdGhhdCdzIHdoZXJlIHRoZSBleHBlbnNpdmUgbW92ZXMgb2NjdXIpLiBUaGUgb3JkZXIgb2ZcbiAgICAvLyAgIHJlbWFpbmluZyBjbGF1c2VzIGlzIGp1c3QgYSBzaW1wbGUgZ3Vlc3MgYXQgd2hpY2ggY2FzZXNcbiAgICAvLyAgIHdpbGwgYmUgbW9zdCBjb21tb24uXG4gICAgLy9cbiAgICAvLyAqIE5vdGUsIHdlIGNvdWxkIGNhbGN1bGF0ZSB0aGUgbG9uZ2VzdFxuICAgIC8vICAgaW5jcmVhc2luZyBzdWJzZXF1ZW5jZSAoTElTKSBvZiBvbGQgaXRlbXMgaW4gbmV3IHBvc2l0aW9uLFxuICAgIC8vICAgYW5kIG9ubHkgbW92ZSB0aG9zZSBub3QgaW4gdGhlIExJUyBzZXQuIEhvd2V2ZXIgdGhhdCBjb3N0c1xuICAgIC8vICAgTyhubG9nbikgdGltZSBhbmQgYWRkcyBhIGJpdCBtb3JlIGNvZGUsIGFuZCBvbmx5IGhlbHBzXG4gICAgLy8gICBtYWtlIHJhcmUgdHlwZXMgb2YgbXV0YXRpb25zIHJlcXVpcmUgZmV3ZXIgbW92ZXMuIFRoZVxuICAgIC8vICAgYWJvdmUgaGFuZGxlcyByZW1vdmVzLCBhZGRzLCByZXZlcnNhbCwgc3dhcHMsIGFuZCBzaW5nbGVcbiAgICAvLyAgIG1vdmVzIG9mIGNvbnRpZ3VvdXMgaXRlbXMgaW4gbGluZWFyIHRpbWUsIGluIHRoZSBtaW5pbXVtXG4gICAgLy8gICBudW1iZXIgb2YgbW92ZXMuIEFzIHRoZSBudW1iZXIgb2YgbXVsdGlwbGUgbW92ZXMgd2hlcmUgTElTXG4gICAgLy8gICBtaWdodCBoZWxwIGFwcHJvYWNoZXMgYSByYW5kb20gc2h1ZmZsZSwgdGhlIExJU1xuICAgIC8vICAgb3B0aW1pemF0aW9uIGJlY29tZXMgbGVzcyBoZWxwZnVsLCBzbyBpdCBzZWVtcyBub3Qgd29ydGhcbiAgICAvLyAgIHRoZSBjb2RlIGF0IHRoaXMgcG9pbnQuIENvdWxkIHJlY29uc2lkZXIgaWYgYSBjb21wZWxsaW5nXG4gICAgLy8gICBjYXNlIGFyaXNlcy5cblxuICAgIHdoaWxlIChvbGRIZWFkIDw9IG9sZFRhaWwgJiYgbmV3SGVhZCA8PSBuZXdUYWlsKSB7XG4gICAgICBpZiAob2xkUGFydHNbb2xkSGVhZF0gPT09IG51bGwpIHtcbiAgICAgICAgLy8gYG51bGxgIG1lYW5zIG9sZCBwYXJ0IGF0IGhlYWQgaGFzIGFscmVhZHkgYmVlbiB1c2VkXG4gICAgICAgIC8vIGJlbG93OyBza2lwXG4gICAgICAgIG9sZEhlYWQrKztcbiAgICAgIH0gZWxzZSBpZiAob2xkUGFydHNbb2xkVGFpbF0gPT09IG51bGwpIHtcbiAgICAgICAgLy8gYG51bGxgIG1lYW5zIG9sZCBwYXJ0IGF0IHRhaWwgaGFzIGFscmVhZHkgYmVlbiB1c2VkXG4gICAgICAgIC8vIGJlbG93OyBza2lwXG4gICAgICAgIG9sZFRhaWwtLTtcbiAgICAgIH0gZWxzZSBpZiAob2xkS2V5c1tvbGRIZWFkXSA9PT0gbmV3S2V5c1tuZXdIZWFkXSkge1xuICAgICAgICAvLyBPbGQgaGVhZCBtYXRjaGVzIG5ldyBoZWFkOyB1cGRhdGUgaW4gcGxhY2VcbiAgICAgICAgbmV3UGFydHNbbmV3SGVhZF0gPSBzZXRDaGlsZFBhcnRWYWx1ZShcbiAgICAgICAgICBvbGRQYXJ0c1tvbGRIZWFkXSEsXG4gICAgICAgICAgbmV3VmFsdWVzW25ld0hlYWRdXG4gICAgICAgICk7XG4gICAgICAgIG9sZEhlYWQrKztcbiAgICAgICAgbmV3SGVhZCsrO1xuICAgICAgfSBlbHNlIGlmIChvbGRLZXlzW29sZFRhaWxdID09PSBuZXdLZXlzW25ld1RhaWxdKSB7XG4gICAgICAgIC8vIE9sZCB0YWlsIG1hdGNoZXMgbmV3IHRhaWw7IHVwZGF0ZSBpbiBwbGFjZVxuICAgICAgICBuZXdQYXJ0c1tuZXdUYWlsXSA9IHNldENoaWxkUGFydFZhbHVlKFxuICAgICAgICAgIG9sZFBhcnRzW29sZFRhaWxdISxcbiAgICAgICAgICBuZXdWYWx1ZXNbbmV3VGFpbF1cbiAgICAgICAgKTtcbiAgICAgICAgb2xkVGFpbC0tO1xuICAgICAgICBuZXdUYWlsLS07XG4gICAgICB9IGVsc2UgaWYgKG9sZEtleXNbb2xkSGVhZF0gPT09IG5ld0tleXNbbmV3VGFpbF0pIHtcbiAgICAgICAgLy8gT2xkIGhlYWQgbWF0Y2hlcyBuZXcgdGFpbDsgdXBkYXRlIGFuZCBtb3ZlIHRvIG5ldyB0YWlsXG4gICAgICAgIG5ld1BhcnRzW25ld1RhaWxdID0gc2V0Q2hpbGRQYXJ0VmFsdWUoXG4gICAgICAgICAgb2xkUGFydHNbb2xkSGVhZF0hLFxuICAgICAgICAgIG5ld1ZhbHVlc1tuZXdUYWlsXVxuICAgICAgICApO1xuICAgICAgICBpbnNlcnRQYXJ0KGNvbnRhaW5lclBhcnQsIG5ld1BhcnRzW25ld1RhaWwgKyAxXSwgb2xkUGFydHNbb2xkSGVhZF0hKTtcbiAgICAgICAgb2xkSGVhZCsrO1xuICAgICAgICBuZXdUYWlsLS07XG4gICAgICB9IGVsc2UgaWYgKG9sZEtleXNbb2xkVGFpbF0gPT09IG5ld0tleXNbbmV3SGVhZF0pIHtcbiAgICAgICAgLy8gT2xkIHRhaWwgbWF0Y2hlcyBuZXcgaGVhZDsgdXBkYXRlIGFuZCBtb3ZlIHRvIG5ldyBoZWFkXG4gICAgICAgIG5ld1BhcnRzW25ld0hlYWRdID0gc2V0Q2hpbGRQYXJ0VmFsdWUoXG4gICAgICAgICAgb2xkUGFydHNbb2xkVGFpbF0hLFxuICAgICAgICAgIG5ld1ZhbHVlc1tuZXdIZWFkXVxuICAgICAgICApO1xuICAgICAgICBpbnNlcnRQYXJ0KGNvbnRhaW5lclBhcnQsIG9sZFBhcnRzW29sZEhlYWRdISwgb2xkUGFydHNbb2xkVGFpbF0hKTtcbiAgICAgICAgb2xkVGFpbC0tO1xuICAgICAgICBuZXdIZWFkKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobmV3S2V5VG9JbmRleE1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gTGF6aWx5IGdlbmVyYXRlIGtleS10by1pbmRleCBtYXBzLCB1c2VkIGZvciByZW1vdmFscyAmXG4gICAgICAgICAgLy8gbW92ZXMgYmVsb3dcbiAgICAgICAgICBuZXdLZXlUb0luZGV4TWFwID0gZ2VuZXJhdGVNYXAobmV3S2V5cywgbmV3SGVhZCwgbmV3VGFpbCk7XG4gICAgICAgICAgb2xkS2V5VG9JbmRleE1hcCA9IGdlbmVyYXRlTWFwKG9sZEtleXMsIG9sZEhlYWQsIG9sZFRhaWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbmV3S2V5VG9JbmRleE1hcC5oYXMob2xkS2V5c1tvbGRIZWFkXSkpIHtcbiAgICAgICAgICAvLyBPbGQgaGVhZCBpcyBubyBsb25nZXIgaW4gbmV3IGxpc3Q7IHJlbW92ZVxuICAgICAgICAgIHJlbW92ZVBhcnQob2xkUGFydHNbb2xkSGVhZF0hKTtcbiAgICAgICAgICBvbGRIZWFkKys7XG4gICAgICAgIH0gZWxzZSBpZiAoIW5ld0tleVRvSW5kZXhNYXAuaGFzKG9sZEtleXNbb2xkVGFpbF0pKSB7XG4gICAgICAgICAgLy8gT2xkIHRhaWwgaXMgbm8gbG9uZ2VyIGluIG5ldyBsaXN0OyByZW1vdmVcbiAgICAgICAgICByZW1vdmVQYXJ0KG9sZFBhcnRzW29sZFRhaWxdISk7XG4gICAgICAgICAgb2xkVGFpbC0tO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFueSBtaXNtYXRjaGVzIGF0IHRoaXMgcG9pbnQgYXJlIGR1ZSB0byBhZGRpdGlvbnMgb3JcbiAgICAgICAgICAvLyBtb3Zlczsgc2VlIGlmIHdlIGhhdmUgYW4gb2xkIHBhcnQgd2UgY2FuIHJldXNlIGFuZCBtb3ZlXG4gICAgICAgICAgLy8gaW50byBwbGFjZVxuICAgICAgICAgIGNvbnN0IG9sZEluZGV4ID0gb2xkS2V5VG9JbmRleE1hcC5nZXQobmV3S2V5c1tuZXdIZWFkXSk7XG4gICAgICAgICAgY29uc3Qgb2xkUGFydCA9IG9sZEluZGV4ICE9PSB1bmRlZmluZWQgPyBvbGRQYXJ0c1tvbGRJbmRleF0gOiBudWxsO1xuICAgICAgICAgIGlmIChvbGRQYXJ0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBObyBvbGQgcGFydCBmb3IgdGhpcyB2YWx1ZTsgY3JlYXRlIGEgbmV3IG9uZSBhbmRcbiAgICAgICAgICAgIC8vIGluc2VydCBpdFxuICAgICAgICAgICAgY29uc3QgbmV3UGFydCA9IGluc2VydFBhcnQoY29udGFpbmVyUGFydCwgb2xkUGFydHNbb2xkSGVhZF0hKTtcbiAgICAgICAgICAgIHNldENoaWxkUGFydFZhbHVlKG5ld1BhcnQsIG5ld1ZhbHVlc1tuZXdIZWFkXSk7XG4gICAgICAgICAgICBuZXdQYXJ0c1tuZXdIZWFkXSA9IG5ld1BhcnQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJldXNlIG9sZCBwYXJ0XG4gICAgICAgICAgICBuZXdQYXJ0c1tuZXdIZWFkXSA9IHNldENoaWxkUGFydFZhbHVlKG9sZFBhcnQsIG5ld1ZhbHVlc1tuZXdIZWFkXSk7XG4gICAgICAgICAgICBpbnNlcnRQYXJ0KGNvbnRhaW5lclBhcnQsIG9sZFBhcnRzW29sZEhlYWRdISwgb2xkUGFydCk7XG4gICAgICAgICAgICAvLyBUaGlzIG1hcmtzIHRoZSBvbGQgcGFydCBhcyBoYXZpbmcgYmVlbiB1c2VkLCBzbyB0aGF0XG4gICAgICAgICAgICAvLyBpdCB3aWxsIGJlIHNraXBwZWQgaW4gdGhlIGZpcnN0IHR3byBjaGVja3MgYWJvdmVcbiAgICAgICAgICAgIG9sZFBhcnRzW29sZEluZGV4IGFzIG51bWJlcl0gPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXdIZWFkKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQWRkIHBhcnRzIGZvciBhbnkgcmVtYWluaW5nIG5ldyB2YWx1ZXNcbiAgICB3aGlsZSAobmV3SGVhZCA8PSBuZXdUYWlsKSB7XG4gICAgICAvLyBGb3IgYWxsIHJlbWFpbmluZyBhZGRpdGlvbnMsIHdlIGluc2VydCBiZWZvcmUgbGFzdCBuZXdcbiAgICAgIC8vIHRhaWwsIHNpbmNlIG9sZCBwb2ludGVycyBhcmUgbm8gbG9uZ2VyIHZhbGlkXG4gICAgICBjb25zdCBuZXdQYXJ0ID0gaW5zZXJ0UGFydChjb250YWluZXJQYXJ0LCBuZXdQYXJ0c1tuZXdUYWlsICsgMV0pO1xuICAgICAgc2V0Q2hpbGRQYXJ0VmFsdWUobmV3UGFydCwgbmV3VmFsdWVzW25ld0hlYWRdKTtcbiAgICAgIG5ld1BhcnRzW25ld0hlYWQrK10gPSBuZXdQYXJ0O1xuICAgIH1cbiAgICAvLyBSZW1vdmUgYW55IHJlbWFpbmluZyB1bnVzZWQgb2xkIHBhcnRzXG4gICAgd2hpbGUgKG9sZEhlYWQgPD0gb2xkVGFpbCkge1xuICAgICAgY29uc3Qgb2xkUGFydCA9IG9sZFBhcnRzW29sZEhlYWQrK107XG4gICAgICBpZiAob2xkUGFydCAhPT0gbnVsbCkge1xuICAgICAgICByZW1vdmVQYXJ0KG9sZFBhcnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNhdmUgb3JkZXIgb2YgbmV3IHBhcnRzIGZvciBuZXh0IHJvdW5kXG4gICAgdGhpcy5faXRlbUtleXMgPSBuZXdLZXlzO1xuICAgIC8vIERpcmVjdGx5IHNldCBwYXJ0IHZhbHVlLCBieXBhc3NpbmcgaXQncyBkaXJ0eS1jaGVja2luZ1xuICAgIHNldENvbW1pdHRlZFZhbHVlKGNvbnRhaW5lclBhcnQsIG5ld1BhcnRzKTtcbiAgICByZXR1cm4gbm9DaGFuZ2U7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXBlYXREaXJlY3RpdmVGbiB7XG4gIDxUPihcbiAgICBpdGVtczogSXRlcmFibGU8VD4sXG4gICAga2V5Rm5PclRlbXBsYXRlOiBLZXlGbjxUPiB8IEl0ZW1UZW1wbGF0ZTxUPixcbiAgICB0ZW1wbGF0ZT86IEl0ZW1UZW1wbGF0ZTxUPlxuICApOiB1bmtub3duO1xuICA8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+LCB0ZW1wbGF0ZTogSXRlbVRlbXBsYXRlPFQ+KTogdW5rbm93bjtcbiAgPFQ+KFxuICAgIGl0ZW1zOiBJdGVyYWJsZTxUPixcbiAgICBrZXlGbjogS2V5Rm48VD4gfCBJdGVtVGVtcGxhdGU8VD4sXG4gICAgdGVtcGxhdGU6IEl0ZW1UZW1wbGF0ZTxUPlxuICApOiB1bmtub3duO1xufVxuXG4vKipcbiAqIEEgZGlyZWN0aXZlIHRoYXQgcmVwZWF0cyBhIHNlcmllcyBvZiB2YWx1ZXMgKHVzdWFsbHkgYFRlbXBsYXRlUmVzdWx0c2ApXG4gKiBnZW5lcmF0ZWQgZnJvbSBhbiBpdGVyYWJsZSwgYW5kIHVwZGF0ZXMgdGhvc2UgaXRlbXMgZWZmaWNpZW50bHkgd2hlbiB0aGVcbiAqIGl0ZXJhYmxlIGNoYW5nZXMgYmFzZWQgb24gdXNlci1wcm92aWRlZCBga2V5c2AgYXNzb2NpYXRlZCB3aXRoIGVhY2ggaXRlbS5cbiAqXG4gKiBOb3RlIHRoYXQgaWYgYSBga2V5Rm5gIGlzIHByb3ZpZGVkLCBzdHJpY3Qga2V5LXRvLURPTSBtYXBwaW5nIGlzIG1haW50YWluZWQsXG4gKiBtZWFuaW5nIHByZXZpb3VzIERPTSBmb3IgYSBnaXZlbiBrZXkgaXMgbW92ZWQgaW50byB0aGUgbmV3IHBvc2l0aW9uIGlmXG4gKiBuZWVkZWQsIGFuZCBET00gd2lsbCBuZXZlciBiZSByZXVzZWQgd2l0aCB2YWx1ZXMgZm9yIGRpZmZlcmVudCBrZXlzIChuZXcgRE9NXG4gKiB3aWxsIGFsd2F5cyBiZSBjcmVhdGVkIGZvciBuZXcga2V5cykuIFRoaXMgaXMgZ2VuZXJhbGx5IHRoZSBtb3N0IGVmZmljaWVudFxuICogd2F5IHRvIHVzZSBgcmVwZWF0YCBzaW5jZSBpdCBwZXJmb3JtcyBtaW5pbXVtIHVubmVjZXNzYXJ5IHdvcmsgZm9yIGluc2VydGlvbnNcbiAqIGFuZCByZW1vdmFscy5cbiAqXG4gKiBUaGUgYGtleUZuYCB0YWtlcyB0d28gcGFyYW1ldGVycywgdGhlIGl0ZW0gYW5kIGl0cyBpbmRleCwgYW5kIHJldHVybnMgYSB1bmlxdWUga2V5IHZhbHVlLlxuICpcbiAqIGBgYGpzXG4gKiBodG1sYFxuICogICA8b2w+XG4gKiAgICAgJHtyZXBlYXQodGhpcy5pdGVtcywgKGl0ZW0pID0+IGl0ZW0uaWQsIChpdGVtLCBpbmRleCkgPT4ge1xuICogICAgICAgcmV0dXJuIGh0bWxgPGxpPiR7aW5kZXh9OiAke2l0ZW0ubmFtZX08L2xpPmA7XG4gKiAgICAgfSl9XG4gKiAgIDwvb2w+XG4gKiBgXG4gKiBgYGBcbiAqXG4gKiAqKkltcG9ydGFudCoqOiBJZiBwcm92aWRpbmcgYSBga2V5Rm5gLCBrZXlzICptdXN0KiBiZSB1bmlxdWUgZm9yIGFsbCBpdGVtcyBpbiBhXG4gKiBnaXZlbiBjYWxsIHRvIGByZXBlYXRgLiBUaGUgYmVoYXZpb3Igd2hlbiB0d28gb3IgbW9yZSBpdGVtcyBoYXZlIHRoZSBzYW1lIGtleVxuICogaXMgdW5kZWZpbmVkLlxuICpcbiAqIElmIG5vIGBrZXlGbmAgaXMgcHJvdmlkZWQsIHRoaXMgZGlyZWN0aXZlIHdpbGwgcGVyZm9ybSBzaW1pbGFyIHRvIG1hcHBpbmdcbiAqIGl0ZW1zIHRvIHZhbHVlcywgYW5kIERPTSB3aWxsIGJlIHJldXNlZCBhZ2FpbnN0IHBvdGVudGlhbGx5IGRpZmZlcmVudCBpdGVtcy5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlcGVhdCA9IGRpcmVjdGl2ZShSZXBlYXREaXJlY3RpdmUpIGFzIFJlcGVhdERpcmVjdGl2ZUZuO1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHRoZSBjbGFzcyB0aGF0IHBvd2VycyB0aGlzIGRpcmVjdGl2ZS4gTmVjZXNzYXJ5IGZvciBuYW1pbmcgdGhlXG4gKiBkaXJlY3RpdmUncyByZXR1cm4gdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUge1JlcGVhdERpcmVjdGl2ZX07XG4iLCAiaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uLy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwb3NpdGlvbkhvdHNwb3RzKFxuICBzaGFwZTogc3RyaW5nLFxuICBjb29yZHNOdW1iZXI6IG51bWJlcltdLFxuICBpbWc6IEhUTUxJbWFnZUVsZW1lbnQsXG4gIGhvdHNwb3Q6IFF0aUhvdHNwb3RDaG9pY2Vcbikge1xuICBzd2l0Y2ggKHNoYXBlKSB7XG4gICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgIHtcbiAgICAgICAgY29uc3QgW2NlbnRlclgsIGNlbnRlclksIHJhZGl1c10gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgIGNvbnN0IGNlbnRlclhQZXIgPSAoY2VudGVyWCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IGNlbnRlcllQZXIgPSAoY2VudGVyWSAvIGltZy5oZWlnaHQpICogMTAwO1xuICAgICAgICBjb25zdCByYWRpdXNQZXIgPSAocmFkaXVzIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gY2VudGVyWFBlciAtIHJhZGl1c1BlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSBjZW50ZXJZUGVyIC0gcmFkaXVzUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gaG90c3BvdC5zdHlsZS5oZWlnaHQgPSA0ICogcmFkaXVzUGVyICsgJ3B4JztcbiAgICAgICAgaG90c3BvdC5zdHlsZS5ib3JkZXJSYWRpdXMgPSBgOTk5OXB4YDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncmVjdCc6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IFtsZWZ0WCwgdG9wWSwgcmlnaHRYLCBib3R0b21ZXSA9IGNvb3Jkc051bWJlcjtcbiAgICAgICAgY29uc3QgbGVmdFhQZXIgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCB0b3BZUGVyID0gKHRvcFkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmlnaHRYUGVyID0gKHJpZ2h0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IGJvdHRvbVlQZXIgPSAoYm90dG9tWSAvIGltZy5oZWlnaHQpICogMTAwO1xuICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBsZWZ0WFBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSB0b3BZUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gcmlnaHRYUGVyIC0gbGVmdFhQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gYm90dG9tWVBlciAtIHRvcFlQZXIgKyAnJSc7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3BvbHknOlxuICAgICAge1xuICAgICAgICAvLyBmcm9tIGEsYixjLGQsZSxmID0+IFt7eDphLCB5OmJ9LHt4OmMsIHk6ZH0se3g6ZSwgeTpmfV1cbiAgICAgICAgY29uc3QgcG9seWNvb3JkcyA9IGNvb3Jkc051bWJlci5yZWR1Y2UoKGFjYywgY3VycmVudFZhbHVlLCBjdXJyZW50SW5kZXgsIHBvbHlDKSA9PiB7XG4gICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCAlIDIgPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RWYWwgPSBhY2MucG9wKCk7XG4gICAgICAgICAgICBhY2NbYWNjLmxlbmd0aF0gPSB7IHg6IGxhc3RWYWwsIHk6IHBvbHlDW2N1cnJlbnRJbmRleF0gfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjLnB1c2goY3VycmVudFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10pO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBib3VuZGluZyBib3ggYnkgZmluZGluZyB0aGUgbWF4IGF4IG1pbiBjb29yZGluYXRlcyBvZiB4IGFuZCB5XG4gICAgICAgIGNvbnN0IGxlZnRYID0gTWF0aC5taW4oLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueCkpO1xuICAgICAgICBjb25zdCByaWdodFggPSBNYXRoLm1heCguLi5wb2x5Y29vcmRzLm1hcChwb2ludCA9PiBwb2ludC54KSk7XG4gICAgICAgIGNvbnN0IHRvcFkgPSBNYXRoLm1pbiguLi5wb2x5Y29vcmRzLm1hcChwb2ludCA9PiBwb2ludC55KSk7XG4gICAgICAgIGNvbnN0IGJvdHRvbVkgPSBNYXRoLm1heCguLi5wb2x5Y29vcmRzLm1hcChwb2ludCA9PiBwb2ludC55KSk7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSByZWxhdGl2ZSBkaXN0YW5jZSBjYXVzZSB3ZSB3YW50IHRvIHVzZSBwZXJjZW50YWdlc1xuICAgICAgICBjb25zdCBsZWZ0WFBlciA9IChsZWZ0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHRvcFlQZXIgPSAodG9wWSAvIGltZy5oZWlnaHQpICogMTAwO1xuICAgICAgICBjb25zdCByaWdodFhQZXIgPSAocmlnaHRYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgYm90dG9tWVBlciA9IChib3R0b21ZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG5cbiAgICAgICAgLy8gc2V0IHRoZSBob3RzcG90IG9uIHgseSBhbmQgc2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGluIHBlcmNlbnRhZ2VzXG4gICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IChsZWZ0WCAvIGltZy53aWR0aCkgKiAxMDAgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gKHRvcFkgLyBpbWcuaGVpZ2h0KSAqIDEwMCArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IHJpZ2h0WFBlciAtIGxlZnRYUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLmhlaWdodCA9IGJvdHRvbVlQZXIgLSB0b3BZUGVyICsgJyUnO1xuXG4gICAgICAgIC8vIGFsbCB0aGUgcG9seWdvbiBwb2ludHMgc2hvdWxkIGJlIGNvcnJlY3RlZCBjYXVzZWQgdGhleSBhcmUgZnJvbVxuICAgICAgICAvLyBpbWFnZSAwLDAgcG9pbnQsIGFuZCBzaG91bGQgYmUgZnJvbSB0aGUgaG90c3BvdCBwb2ludCB3aGljaCBhbHJlYWR5XG4gICAgICAgIC8vIGhhcyBiZWVuIG9mZnNldHRlZCBmcm9tIHRoZSBpbWFnZSBpbiB0aGUgcHJldmlvdXMgZmV3IGxpbmVzIG9mIGNvZGVcbiAgICAgICAgLy8gYWxzbyB0aGUgcG9pbnRzIGhhdmUgYSByZWxhdGl2ZSBkaXN0YW5jZSB0byB0aGUgaW1hZ2UsIGJ1dCBub3cgaGF2ZVxuICAgICAgICAvLyB0byBoYXZlIGEgcmVsYXRpdmUgZGlzdGFuY2UgZnJvbSB0aGUgd2lkdGggb2YgdGhlIGhvdHNwb3RcbiAgICAgICAgY29uc3QgcG9seWdvbkRhdGEgPSBwb2x5Y29vcmRzLm1hcChwb2ludCA9PiAoe1xuICAgICAgICAgIHg6ICgocG9pbnQueCAtIGxlZnRYKSAvIChyaWdodFggLSBsZWZ0WCkpICogMTAwLFxuICAgICAgICAgIHk6ICgocG9pbnQueSAtIHRvcFkpIC8gKGJvdHRvbVkgLSB0b3BZKSkgKiAxMDBcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBjbGlwIHBhdGggY29vcmRpbmF0ZSBzdHlsZSBpbiBwZXJjZW50YWdlc1xuICAgICAgICBjb25zdCBwb2x5RCA9IHBvbHlnb25EYXRhLm1hcChwID0+IE1hdGgucm91bmQocC54KSArICclICcgKyBNYXRoLnJvdW5kKHAueSkgKyAnJScpLmpvaW4oJywnKTtcblxuICAgICAgICAvLyA1MCUgMCUsIDEwMCUgNTAlLCA1MCUgMTAwJSwgMCUgNTAlXG4gICAgICAgIGhvdHNwb3Quc3R5bGUuY2xpcFBhdGggPSBgcG9seWdvbigke3BvbHlEfSlgO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIHN2ZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBxdWVyeSwgcXVlcnlBc3NpZ25lZEVsZW1lbnRzLCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGlmRGVmaW5lZCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2lmLWRlZmluZWQuanMnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzJztcbmltcG9ydCB7IHBvc2l0aW9uSG90c3BvdHMgfSBmcm9tICcuLi9pbnRlcm5hbC9ob3RzcG90cy9ob3RzcG90JztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdyYXBoaWNBc3NvY2lhdGVJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgY2hvaWNlT3JkZXJpbmc6IGJvb2xlYW47XG4gIGhvdHNwb3RzO1xuICBzdGFydFBvaW50ID0gbnVsbDtcbiAgZW5kUG9pbnQgPSBudWxsO1xuICBAc3RhdGUoKSBfbGluZXMgPSBbXTtcbiAgQHN0YXRlKCkgc3RhcnRDb29yZDogeyB4OiBhbnk7IHk6IGFueSB9O1xuICBAc3RhdGUoKSBtb3VzZUNvb3JkOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gIEBxdWVyeSgnc3ZnJykgc3ZnQ29udGFpbmVyO1xuICBAcXVlcnlBc3NpZ25lZEVsZW1lbnRzKHsgc2VsZWN0b3I6ICdpbWcnIH0pIGdySW1hZ2U7XG5cbiAgLy8gdGFyZ2V0IHRoZSBtYWluIHNsb3QgbWFrZSBpdCByZWxhdGl2ZSBhbmQgZml0IHdpdGggdGhlIGNvbnRlblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIHNsb3Q6bm90KFtuYW1lPSdwcm9tcHQnXSkge1xuICAgICAgICAvLyBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIHF0aS1ob3RzcG90LWNob2ljZSByZWxhdGl2ZSB0byB0aGUgc2xvdCAqL1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgd2lkdGg6IGZpdC1jb250ZW50OyAvKiBob3RzcG90cyBub3Qgc3RyZXRjaGluZyBmdXJ0aGVyIGlmIGltYWdlIGlzIGF0IG1heCBzaXplICovXG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIC8qIGltYWdlIG5vdCBzZWxlY3RhYmxlIGFueW1vcmUgKi9cbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKHF0aS1hc3NvY2lhYmxlLWhvdHNwb3QpIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICB9XG4gICAgICBsaW5lLWNvbnRhaW5lciB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB9XG4gICAgICBzdmcge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMHB4O1xuICAgICAgICBsZWZ0OiAwcHg7XG4gICAgICB9XG4gICAgYFxuICBdO1xuICBzdmc6IFNWR1NWR0VsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1ob3RzcG90JywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX2xpbmVzID0gW107XG4gIH1cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2xpbmVzLmxlbmd0aCA+IDA7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICB0aGlzLl9saW5lcyA9IHZhbDtcbiAgICB9XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fbGluZXM7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxsaW5lLWNvbnRhaW5lcj5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgIHdpZHRoPSR7aWZEZWZpbmVkKHRoaXMuZ3JJbWFnZVswXT8ud2lkdGgpfVxuICAgICAgICAgIGhlaWdodD0ke2lmRGVmaW5lZCh0aGlzLmdySW1hZ2VbMF0/LmhlaWdodCl9XG4gICAgICAgICAgdmlld2JveD1cIjAgMCAke3RoaXMuZ3JJbWFnZVswXT8ud2lkdGh9ICR7dGhpcy5nckltYWdlWzBdPy5oZWlnaHR9XCJcbiAgICAgICAgPlxuICAgICAgICAgICR7cmVwZWF0KFxuICAgICAgICAgICAgdGhpcy5fbGluZXMsXG4gICAgICAgICAgICBsaW5lID0+IGxpbmUsXG4gICAgICAgICAgICAobGluZSwgaW5kZXgpID0+IHN2Z2BcbiAgICAgICAgICAgICAgPGxpbmVcbiAgICAgICAgICAgICAgICBwYXJ0PVwibGluZVwiXG4gICAgICAgICAgICAgICAgeDE9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzBdICsgJ10nKS5zdHlsZS5sZWZ0KX1cbiAgICAgICAgICAgICAgICB5MT0ke3BhcnNlSW50KHRoaXMucXVlcnlTZWxlY3RvcjxTVkdMaW5lRWxlbWVudD4oJ1tpZGVudGlmaWVyPScgKyBsaW5lLnNwbGl0KCcgJylbMF0gKyAnXScpLnN0eWxlLnRvcCl9XG4gICAgICAgICAgICAgICAgeDI9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzFdICsgJ10nKS5zdHlsZS5sZWZ0KX1cbiAgICAgICAgICAgICAgICB5Mj0ke3BhcnNlSW50KHRoaXMucXVlcnlTZWxlY3RvcjxTVkdMaW5lRWxlbWVudD4oJ1tpZGVudGlmaWVyPScgKyBsaW5lLnNwbGl0KCcgJylbMV0gKyAnXScpLnN0eWxlLnRvcCl9XG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwicmVkXCJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCJcbiAgICAgICAgICAgICAgICBAY2xpY2s9JHsoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9saW5lcyA9IHRoaXMuX2xpbmVzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fbGluZXMpO1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICBgXG4gICAgICAgICAgKX1cbiAgICAgICAgICAke3RoaXMuc3RhcnRQb2ludCAmJlxuICAgICAgICAgIHN2Z2A8bGluZVxuICAgICAgICAgICAgcGFydD1cInBvaW50XCJcbiAgICAgICAgICAgIHgxPSR7dGhpcy5zdGFydENvb3JkLnh9XG4gICAgICAgICAgICB5MT0ke3RoaXMuc3RhcnRDb29yZC55fVxuICAgICAgICAgICAgeDI9JHt0aGlzLm1vdXNlQ29vcmQueH1cbiAgICAgICAgICAgIHkyPSR7dGhpcy5tb3VzZUNvb3JkLnl9XG4gICAgICAgICAgICBzdHJva2U9XCJyZWRcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiXG4gICAgICAgICAgLz5gfVxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPC9saW5lLWNvbnRhaW5lcj5gO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PFF0aUhvdHNwb3RDaG9pY2U+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcbiAgICBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoZSk6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChlKTtcblxuICAgIHRoaXMuaG90c3BvdHMgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnKTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGV2ZW50ID0+IHtcbiAgICAgIHRoaXMubW91c2VDb29yZCA9IHtcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCAtIHRoaXMuZ3JJbWFnZVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LFxuICAgICAgICB5OiBldmVudC5jbGllbnRZIC0gdGhpcy5nckltYWdlWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHRoaXMuaG90c3BvdHMuZm9yRWFjaChob3RzcG90ID0+IHtcbiAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzBdICsgJ3B4JztcbiAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpLnNwbGl0KCcsJylbMV0gKyAncHgnO1xuXG4gICAgICBob3RzcG90LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc3RhcnRQb2ludCkge1xuICAgICAgICAgIHRoaXMuc3RhcnRQb2ludCA9IGV2ZW50LnRhcmdldDtcblxuICAgICAgICAgIHRoaXMuc3RhcnRDb29yZCA9IHtcbiAgICAgICAgICAgIHg6IHRoaXMuc3RhcnRQb2ludC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpLnNwbGl0KCcsJylbMF0sXG4gICAgICAgICAgICB5OiB0aGlzLnN0YXJ0UG9pbnQuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzFdXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5lbmRQb2ludCkge1xuICAgICAgICAgIHRoaXMuZW5kUG9pbnQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgICB0aGlzLl9saW5lcyA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMuX2xpbmVzLFxuICAgICAgICAgICAgdGhpcy5zdGFydFBvaW50LmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpICsgJyAnICsgdGhpcy5lbmRQb2ludC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKVxuICAgICAgICAgIF07XG4gICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fbGluZXMpO1xuICAgICAgICAgIHRoaXMuc3RhcnRQb2ludCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5lbmRQb2ludCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uJzogUXRpR3JhcGhpY0Fzc29jaWF0ZUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdyYXBoaWNHYXBNYXRjaEludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKFxuICBJbnRlcmFjdGlvbixcbiAgJ3F0aS1nYXAtaW1nJyxcbiAgZmFsc2UsXG4gICdxdGktYXNzb2NpYWJsZS1ob3RzcG90J1xuKSB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cbiAgICBzbG90W25hbWU9J3F0aS1nYXAtaW1nJ10ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGdhcDogMXJlbTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPHNsb3QgbmFtZT1cInF0aS1nYXAtaW1nXCI+PC9zbG90PmA7XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIoZTogQ3VzdG9tRXZlbnQ8bnVsbD4pOiB2b2lkIHtcbiAgICBjb25zdCBpbWcgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgY29uc3QgaG90c3BvdCA9IGUudGFyZ2V0IGFzIFF0aUhvdHNwb3RDaG9pY2U7XG4gICAgY29uc3QgY29vcmRzID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpO1xuICAgIGNvbnN0IHNoYXBlID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ3NoYXBlJyk7XG4gICAgY29uc3QgY29vcmRzTnVtYmVyID0gY29vcmRzLnNwbGl0KCcsJykubWFwKHMgPT4gcGFyc2VJbnQocykpO1xuXG4gICAgLy8gcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICAgIHN3aXRjaCAoc2hhcGUpIHtcbiAgICAgIGNhc2UgJ2NpcmNsZSc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBbY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzXSA9IGNvb3Jkc051bWJlcjtcbiAgICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBjZW50ZXJYIC0gcmFkaXVzICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9IGNlbnRlclkgLSByYWRpdXMgKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSBob3RzcG90LnN0eWxlLmhlaWdodCA9IDIgKiByYWRpdXMgKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyZWN0JzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IFtsZWZ0WCwgdG9wWSwgcmlnaHRYLCBib3R0b21ZXSA9IGNvb3Jkc051bWJlcjtcbiAgICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBsZWZ0WCArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSB0b3BZICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gcmlnaHRYIC0gbGVmdFggKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gYm90dG9tWSAtIHRvcFkgKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJzogUXRpR3JhcGhpY0dhcE1hdGNoSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgQ2hvaWNlLCBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBIb3RzcG90Q2hvaWNlID0gQ2hvaWNlICYgeyBvcmRlcjogbnVtYmVyIH07XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpR3JhcGhpY09yZGVySW50ZXJhY3Rpb24gZXh0ZW5kcyBDaG9pY2VzTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktaG90c3BvdC1jaG9pY2UnKSB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuXG4gIC8vIGRvIG5vdCBzZWxlY3QgKCBoaWdobGlnaHQgYmx1ZSwgdGhlIGltYWdlKVxuICAvLyB0YXJnZXQgdGhlIG1haW4gc2xvdCBtYWtlIGl0IHJlbGF0aXZlIGFuZCBmaXQgd2l0aCB0aGUgY29udGVuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgc2xvdDpub3QoW25hbWU9J3Byb21wdCddKSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogcXRpLWhvdHNwb3QtY2hvaWNlIHJlbGF0aXZlIHRvIHRoZSBzbG90ICovXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7IC8qIGhvdHNwb3RzIG5vdCBzdHJldGNoaW5nIGZ1cnRoZXIgaWYgaW1hZ2UgaXMgYXQgbWF4IHNpemUgKi9cbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChpbWcpIHtcbiAgICAgICAgLyogaW1hZ2Ugbm90IHNlbGVjdGFibGUgYW55bW9yZSAqL1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SG90c3BvdE9yZGVyKGU6IEN1c3RvbUV2ZW50PHsgaWRlbnRpZmllcjogc3RyaW5nOyBjaGVja2VkOiBib29sZWFuIH0+KTogdm9pZCB7XG4gICAgY29uc3QgeyBpZGVudGlmaWVyIH0gPSBlLmRldGFpbDtcblxuICAgIGNvbnN0IGhvdHNwb3QgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maW5kKGVsID0+IGVsLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpID09PSBpZGVudGlmaWVyKSBhcyBIb3RzcG90Q2hvaWNlO1xuXG4gICAgY29uc3QgbWF4U2VsZWN0aW9uID0gdGhpcy5fY2hvaWNlRWxlbWVudHMubGVuZ3RoO1xuICAgIGlmICghdGhpcy5jaG9pY2VPcmRlcmluZykge1xuICAgICAgdGhpcy5jaG9pY2VPcmRlcmluZyA9IHRydWU7XG4gICAgICBpZiAoaG90c3BvdC5vcmRlciA9PSBudWxsKSB7XG4gICAgICAgIGlmICgodGhpcy5fY2hvaWNlRWxlbWVudHMgYXMgSG90c3BvdENob2ljZVtdKS5maWx0ZXIoaSA9PiBpLm9yZGVyID4gMCkubGVuZ3RoID49IG1heFNlbGVjdGlvbikge1xuICAgICAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47IC8vIGRvbid0IGRvIGFueXRoaW5nIGlmIHVzZXIgYWxyZWFkeSBzZWxlY3RlZCA1IGltYWdlcy5cbiAgICAgICAgfVxuICAgICAgICBob3RzcG90Lm9yZGVyID0gKHRoaXMuX2Nob2ljZUVsZW1lbnRzIGFzIEhvdHNwb3RDaG9pY2VbXSkuZmlsdGVyKGkgPT4gISFpLm9yZGVyKS5sZW5ndGggKyAxO1xuICAgICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICh0aGlzLl9jaG9pY2VFbGVtZW50cyBhcyBIb3RzcG90Q2hvaWNlW10pLmZvckVhY2goaG90c3BvdCA9PiB7XG4gICAgICAgICAgaWYgKGhvdHNwb3Qub3JkZXIgPiBob3RzcG90Lm9yZGVyKSB7XG4gICAgICAgICAgICBob3RzcG90Lm9yZGVyLS07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBob3RzcG90O1xuICAgICAgICB9KTtcbiAgICAgICAgaG90c3BvdC5vcmRlciA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PFF0aUhvdHNwb3RDaG9pY2U+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcblxuICAgIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdhY3RpdmF0ZS1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnNldEhvdHNwb3RPcmRlcik7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdhY3RpdmF0ZS1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnNldEhvdHNwb3RPcmRlcik7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJzogUXRpR3JhcGhpY09yZGVySW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHNwb3RJbnRlcmFjdGlvbiBleHRlbmRzIENob2ljZXNNaXhpbihJbnRlcmFjdGlvbiwgJ3F0aS1ob3RzcG90LWNob2ljZScpIHtcbiAgLy8gZG8gbm90IHNlbGVjdCAoIGhpZ2hsaWdodCBibHVlLCB0aGUgaW1hZ2UpXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgLyogd2lkdGg6MTAwJTsgKi9cbiAgICAgIH1cbiAgICBgXG4gIF07XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG5cbiAgICBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWNob2ljZScsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWludGVyYWN0aW9uJzogUXRpSG90c3BvdEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8qIFxucXRpLW1hdGNoLWludGVyYWN0aW9uXG5xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uXG4qL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuLy8gdHNsaW50OmRpc2FibGU6IGluZGVudFxuZXhwb3J0IGNsYXNzIFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICBzbG90IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIHNsb3RbbmFtZT0ncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSddIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgYDtcblxuICAvKiogdGhlIG1pbmltYWwgbnVtYmVyIG9mIHNlbGVjdGlvbnMgYSBjYW5kaWRhdGUgbXVzdCBtYWtlICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1pbidcbiAgfSlcbiAgcHVibGljIG1hdGNoTWluOiBudW1iZXIgPSAwO1xuXG4gIC8qKiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0aW9ucyBhIGNhbmRpZGF0ZSBtdXN0IG1ha2UsIHRoZSBvdGhlciBvcHRpb25zIHdpbGwgYmUgZGlzYWJsZWQgd2hlbiBtYXggb3B0aW9ucyBpcyBjaGVja2VkICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1heCdcbiAgfSlcbiAgcHVibGljIG1hdGNoTWF4OiBudW1iZXIgPSAxO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBhdHRyaWJ1dGU6ICdmaXhlZCdcbiAgfSlcbiAgcHVibGljIGZpeGVkID0gZmFsc2U7XG5cbiAgLy8gcGs6IFRoaXMgbmVlZHMgc29tZSBleHBsYW5hdGlvblxuICAvLyBpbiB0aGUgYXNzb2NpYXRlIGludGVyYWN0aW9uIHRoZXJlIGlzIGEgc3BlY2lhbCBzbG90IGZvciB0aGVzZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlc1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncGFydCcsICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyk7XG4gIH1cblxuICAvLyBwazogVGhpcyBuZWVkcyBzb21lIGV4cGxhbmF0aW9uXG4gIC8vIGluIHF0aS1tYXRjaC1pbnRlcmFjdGlvbiwgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyB1c2VkIHRvIGRlbm90ZSB0aGVcbiAgLy8gZHJhZ2dhYmxlLCBidXQgYWxzbyB0aGUgZHJvcHBhYmxlLiBXRUlSRC4uIGJ1dCBsZXRzIGRlYWwgd2l0aCBpdC5cbiAgLy8gU28gd2UgaGF2ZSBhIHNsb3QgZm9yIHdoZW5ldmVyIGFub3RoZXIgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyBkcm9wcGVkIGluIGhlcmUuXG4gIC8vIEFuZCB3ZSBoYXZlIHNsb3QgZm9yIGNvbnRlbnQgbGlrZSBpbiB0aGlzIGFzc29jaWF0ZSBpbnRlcmFjdGlvblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBwYXJ0PVwic2xvdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90IHBhcnQ9XCJkcm9wc2xvdFwiIG5hbWU9XCJxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlXCI+PC9zbG90PlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSc6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuLy8gaW1wb3J0IGNvbXBvbmVudFN0eWxlcyBmcm9tICcuLi8uLi91dGlsaXRpZXMvc3R5bGVzL2NvbXBvbmVudC5zdHlsZXMnO1xuXG4vKiAke2NvbXBvbmVudFN0eWxlc30gKi9cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgc2xvdCB7XG4gICAgLyogc2xvdCB3aGVyZSB0aGUgKi9cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiAwLjVyZW07XG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IC8qIHByZXZlbnRzIHRoZSBkcmFnIGFuZCBkcm9wIGNvbnRhaW5lciBzbG90cyBoYXZpbmcgdGhlIHNhbWUgaGVpZ2h0ICovXG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXRvcCkgc2xvdCB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLWxlZnQpIHNsb3Qge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXJpZ2h0KSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gIH1cbiAgc2xvdFtuYW1lPSdwcm9tcHQnXSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbiAgOjpzbG90dGVkKHF0aS1zaW1wbGUtbWF0Y2gtc2V0KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoZSBkcmFnIGFuZCBkcm9wIGNvbnRhaW5lciBzbG90cyBoYXZlIHRoZSBzYW1lIHdpZHRoICovXG4gICAgZmxleDogMTtcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBDU1NSZXN1bHRHcm91cCwgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZUludGVyYWN0aW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuLy8gaW1wb3J0IHsgVG91Y2hEcmFnQW5kRHJvcCB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcCc7XG5pbXBvcnQgJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuaW1wb3J0IHsgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSB9IGZyb20gJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi5zdHlsZXMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbmludGVyZmFjZSBDb2x1bW4ge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSb3cge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGlzQ2hlY2tlZDogYm9vbGVhbjtcbn1cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1tYXRjaC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpTWF0Y2hJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihcbiAgSW50ZXJhY3Rpb24sXG4gICdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLFxuICBmYWxzZSxcbiAgJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0Omxhc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJ1xuKSB7XG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuXG4gIHJvd3M6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2VbXTtcbiAgY29sczogUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZVtdO1xuICBsYXN0Q2hlY2tlZFJhZGlvOiBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgQHN0YXRlKCkgX3Jlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSA9IFtdO1xuICAvLyBkcmFnRHJvcEFwaTogVG91Y2hEcmFnQW5kRHJvcDtcbiAgZ2V0IHZhbHVlKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSByZXR1cm4gc3VwZXIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgZWxzZSByZXR1cm4gdGhpcy5fcmVzcG9uc2UgYXMgc3RyaW5nW107XG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nW10pIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSBzdXBlci52YWx1ZSA9IHZhbDtcbiAgICBlbHNlIHRoaXMuX3Jlc3BvbnNlID0gdmFsO1xuICB9XG4gIEBzdGF0ZSgpIGNvcnJlY3RPcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pIHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG5cbiAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAvLyBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlO1xuICAgIC8vIHRoaXMuZHJhZ0Ryb3BBcGkgPSBuZXcgVG91Y2hEcmFnQW5kRHJvcCgpO1xuICAgIC8vIHRoaXMuZHJhZ0Ryb3BBcGkuYWRkRHJhZ2dhYmxlRWxlbWVudHMoXG4gICAgLy8gICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0OmZpcnN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpXG4gICAgLy8gKTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpLmFkZERyb3BwYWJsZUVsZW1lbnRzKFxuICAgIC8vICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpsYXN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpXG4gICAgLy8gKTtcbiAgICB0aGlzLnJvd3MgPSBBcnJheS5mcm9tPFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U+KFxuICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgICk7XG4gICAgdGhpcy5jb2xzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlPihcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6bGFzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgICk7XG5cbiAgICB0aGlzLnZhbHVlID0gW107XG4gIH1cblxuICBoYW5kbGVSYWRpb0NsaWNrID0gZSA9PiB7XG4gICAgY29uc3QgcmFkaW8gPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGlmICh0aGlzLmxhc3RDaGVja2VkUmFkaW8gPT09IHJhZGlvKSB7XG4gICAgICByYWRpby5jaGVja2VkID0gZmFsc2U7XG4gICAgICB0aGlzLmxhc3RDaGVja2VkUmFkaW8gPSBudWxsO1xuICAgICAgdGhpcy5oYW5kbGVSYWRpb0NoYW5nZShlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gcmFkaW87XG4gICAgfVxuICB9O1xuXG4gIGhhbmRsZVJhZGlvQ2hhbmdlID0gZSA9PiB7XG4gICAgY29uc3QgY2hlY2tib3ggPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IHZhbHVlID0gY2hlY2tib3gudmFsdWU7XG4gICAgY29uc3QgbmFtZSA9IGNoZWNrYm94Lm5hbWU7XG4gICAgY29uc3QgdHlwZSA9IGNoZWNrYm94LnR5cGU7XG5cbiAgICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBbdmFsdWVdO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlLmluZGV4T2YodmFsdWUpID09PSAtMSkge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmZpbHRlcih2ID0+IHYuaW5kZXhPZihuYW1lKSA9PT0gLTEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUgPSBbLi4udGhpcy52YWx1ZSwgdmFsdWVdO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gY2hlY2tib3g7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKTtcbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFJlc3BvbnNlSW50ZXJhY3Rpb24+KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgIHJlc3BvbnNlOiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpID8gWy4uLnRoaXMudmFsdWVdIDogdGhpcy52YWx1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH07XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZShyZXNwb25zZVZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmIChyZXNwb25zZVZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZVZhbHVlKSkge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucyA9IHJlc3BvbnNlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ3F0aS1tYXRjaC10YWJ1bGFyJykpIHtcbiAgICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+IDxzbG90Pjwvc2xvdD5gO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8dGFibGU+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAke3RoaXMuY29scy5tYXAoKGNvbCwgaSkgPT4gaHRtbGA8dGggcGFydD1cInItaGVhZGVyXCI+JHt1bnNhZmVIVE1MKGNvbC5pbm5lckhUTUwpfTwvdGg+YCl9XG4gICAgICAgIDwvdHI+XG5cbiAgICAgICAgJHt0aGlzLnJvd3MubWFwKFxuICAgICAgICAgIChyb3csIHJJbmRleCkgPT5cbiAgICAgICAgICAgIGh0bWxgPHRyPlxuICAgICAgICAgICAgICA8dGQgcGFydD1cImMtaGVhZGVyXCI+JHt1bnNhZmVIVE1MKHJvdy5pbm5lckhUTUwpfTwvdGQ+XG4gICAgICAgICAgICAgICR7dGhpcy5jb2xzLm1hcCgoY29sLCBjSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dJZCA9IHJvdy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xJZCA9IGNvbC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGAke3Jvd0lkfSAke2NvbElkfWA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJblJvd0NvdW50ID0gdGhpcy52YWx1ZS5maWx0ZXIodiA9PiB2LnNwbGl0KCcgJylbMF0gPT09IHJvd0lkKS5sZW5ndGggfHwgMDtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVja2VkID0gdGhpcy52YWx1ZS5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydCA9IGByYiAke2NoZWNrZWQgPyAncmItY2hlY2tlZCcgOiAnJ30gJHt0aGlzLmNvcnJlY3RPcHRpb25zLmluY2x1ZGVzKHZhbHVlKSA/ICdyYi1jb3JyZWN0JyA6ICcnfWA7XG4gICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBpZiBtYXRjaCBtYXggaXMgZ3JlYXRlciB0aGFuIDEgYW5kIG1heCBpcyByZWFjaGVkXG4gICAgICAgICAgICAgICAgY29uc3QgZGlzYWJsZSA9XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3RPcHRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgICAgIDogcm93Lm1hdGNoTWF4ID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgIDogc2VsZWN0ZWRJblJvd0NvdW50ID49IHJvdy5tYXRjaE1heCAmJiAhY2hlY2tlZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbGA8dGQ+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT0ke3Jvdy5tYXRjaE1heCA9PT0gMSA/ICdyYWRpbycgOiBgY2hlY2tib3hgfVxuICAgICAgICAgICAgICAgICAgICBwYXJ0PSR7cGFydH1cbiAgICAgICAgICAgICAgICAgICAgbmFtZT0ke3Jvd0lkfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ke3ZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAuZGlzYWJsZWQ9JHtkaXNhYmxlfVxuICAgICAgICAgICAgICAgICAgICBAY2hhbmdlPSR7ZSA9PiB0aGlzLmhhbmRsZVJhZGlvQ2hhbmdlKGUpfVxuICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHtlID0+IChyb3cubWF0Y2hNYXggPT09IDEgPyB0aGlzLmhhbmRsZVJhZGlvQ2xpY2soZSkgOiBudWxsKX1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC90ZD5gO1xuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvdHI+YFxuICAgICAgICApfVxuICAgICAgPC90YWJsZT5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1tYXRjaC1pbnRlcmFjdGlvbic6IFF0aU1hdGNoSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1lZGlhLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlNZWRpYUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBwcml2YXRlIF92YWx1ZSA9IDA7XG4gIHJlc2V0KCkge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBtYXliZSBjaGVjayBpZiB0aGUgbWVkaWEgaGFzIGJlZW4gcGxheWVkP1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaXNOdW1iZXIgPSAhaXNOYU4ocGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpKTtcbiAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gcGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLkludGVyYWN0aW9uLnByb3BlcnRpZXMsXG4gICAgICAuLi57XG4gICAgICAgIHN0ZXA6IHtcbiAgICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgICAgYXR0cmlidXRlOiAnc3RlcCcsXG4gICAgICAgICAgZGVmYXVsdDogMTBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW2Nzc2BgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIC8vIGdldCBhdWRpbywgdmlkZW8gb2Ygb2JqZWN0IHRhZy5cbiAgICBjb25zdCBtZWRpYU9iamVjdCA9IHRoaXMucXVlcnlTZWxlY3RvcignYXVkaW8nKSB8fCB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJykgfHwgdGhpcy5xdWVyeVNlbGVjdG9yKCdvYmplY3QnKTtcbiAgICBpZiAobWVkaWFPYmplY3QpIHtcbiAgICAgIC8vIGxpc3RlbiB0byBlbmRlZCBldmVudFxuICAgICAgbWVkaWFPYmplY3QuYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCAoKSA9PiB7XG4gICAgICAgIC8vIHNldCB2YWx1ZSB0byAwXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoaXMudmFsdWUgaXMgYSBudW1iZXJcbiAgICAgICAgdGhpcy5fdmFsdWUrKztcbiAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW1lZGlhLWludGVyYWN0aW9uJzogUXRpTWVkaWFJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBTaHVmZmxlTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4nOyAvLyBJbXBvcnQgdGhlIG1peGluXG5pbXBvcnQgeyBRdGlTaW1wbGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWNob2ljZSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1vcmRlci1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpT3JkZXJJbnRlcmFjdGlvbiBleHRlbmRzIFNodWZmbGVNaXhpbihcbiAgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKEludGVyYWN0aW9uLCBgcXRpLXNpbXBsZS1jaG9pY2VgLCB0cnVlLCAnZHJvcC1saXN0JyksXG4gICdxdGktc2ltcGxlLWNob2ljZSdcbikge1xuICBjaGlsZHJlbk1hcDogRWxlbWVudFtdO1xuXG4gIEBzdGF0ZSgpIG5yQ2hvaWNlczogbnVtYmVyID0gMDtcbiAgQHN0YXRlKCkgY29ycmVjdFJlc3BvbnNlczogc3RyaW5nW10gPSBbXTtcbiAgQHN0YXRlKCkgc2hvd0NvcnJlY3RSZXNwb25zZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleDogMTtcbiAgICAgIH1cblxuICAgICAgW3BhcnQ9J2Ryb3BzJ10ge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLWF1dG8tZmxvdzogY29sdW1uO1xuICAgICAgICBncmlkLWF1dG8tY29sdW1uczogMWZyO1xuICAgICAgfVxuXG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSdob3Jpem9udGFsJ10pIFtwYXJ0PSdkcm9wcyddIHtcbiAgICAgICAgZ3JpZC1hdXRvLWZsb3c6IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0ndmVydGljYWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSd2ZXJ0aWNhbCddKSBbcGFydD0nZHJvcHMnXSB7XG4gICAgICAgIGdyaWQtYXV0by1mbG93OiByb3c7XG4gICAgICB9XG5cbiAgICAgIFtwYXJ0PSdkcm9wLWxpc3QnXSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgfVxuXG4gICAgICBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy10b3ApIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtbGVmdCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1yaWdodCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgICBpZiAodGhpcy5uckNob2ljZXMgPCBjaG9pY2VzLmxlbmd0aCkge1xuICAgICAgdGhpcy5uckNob2ljZXMgPSBjaG9pY2VzLmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPiA8L3Nsb3Q+XG4gICAgICA8ZGl2IHBhcnQ9XCJjb250YWluZXJcIj5cbiAgICAgICAgPHNsb3QgcGFydD1cImRyYWdzXCI+IDwvc2xvdD5cbiAgICAgICAgPGRpdiBwYXJ0PVwiZHJvcHNcIj5cbiAgICAgICAgICAke0FycmF5LmZyb20oQXJyYXkodGhpcy5uckNob2ljZXMpKS5tYXAoXG4gICAgICAgICAgICAoXywgaSkgPT5cbiAgICAgICAgICAgICAgaHRtbGA8ZHJvcC1saXN0IHBhcnQ9XCJkcm9wLWxpc3RcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2l9XCI+PC9kcm9wLWxpc3Q+JHt0aGlzLnNob3dDb3JyZWN0UmVzcG9uc2VzICYmXG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0UmVzcG9uc2VzLmxlbmd0aCA+IGlcbiAgICAgICAgICAgICAgICAgID8gdW5zYWZlSFRNTChgPHNwYW4gcGFydD0nY29ycmVjdC1yZXNwb25zZSc+JHt0aGlzLmNvcnJlY3RSZXNwb25zZXNbaV19PC9zcGFuPmApXG4gICAgICAgICAgICAgICAgICA6ICcnfWBcbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb3JyZWN0UmVzcG9uc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgcmVzcG9uc2VzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG5cbiAgICAgIHJlc3BvbnNlcy5mb3JFYWNoKChyZXNwb25zZSwgaW5kZXgpID0+IHtcbiAgICAgICAgbGV0IHNpbXBsZUNob2ljZSA9IHRoaXMucXVlcnlTZWxlY3RvcihgcXRpLXNpbXBsZS1jaG9pY2VbaWRlbnRpZmllcj1cIiR7cmVzcG9uc2V9XCJdYCk7XG4gICAgICAgIGlmICghc2ltcGxlQ2hvaWNlKSB7XG4gICAgICAgICAgc2ltcGxlQ2hvaWNlID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYHF0aS1zaW1wbGUtY2hvaWNlW2lkZW50aWZpZXI9XCIke3Jlc3BvbnNlfVwiXWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGV4dCA9IHNpbXBsZUNob2ljZT8udGV4dENvbnRlbnQudHJpbSgpO1xuICAgICAgICB0aGlzLmNvcnJlY3RSZXNwb25zZXMgPSBbLi4udGhpcy5jb3JyZWN0UmVzcG9uc2VzLCB0ZXh0XTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgPSB0cnVlO1xuICB9XG5cbiAgLy8gc29tZSBpbnRlcmFjdGlvbnMgaGF2ZSBhIGRpZmZlcmVudCB3YXkgb2YgZ2V0dGluZyB0aGUgcmVzcG9uc2VcbiAgLy8gdGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgZHJhZyBhbmQgZHJvcCBtaXhpbiBjbGFzc1xuICAvLyB5b3UgaGF2ZSB0byBpbXBsZW1lbnQgeW91ciBvd24gZ2V0UmVzcG9uc2UgbWV0aG9kIGluIHRoZSBzdXBlcmNsYXNzXG4gIC8vIGNhdXNlIHRoZXkgYXJlIGRpZmZlcmVudCBmb3Igc29tZSBpbnRlcmFjdGlvbnMuXG4gIC8vIE1IOiBpcyB0aGlzIGZ1bmN0aW9uIGNhbGxlZD8gU2hvdWxkbid0IHdlIHVzZSBnZXRWYWx1ZT9cbiAgcHJvdGVjdGVkIGdldFJlc3BvbnNlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBkcm9wcGFibGVzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVDaG9pY2U+KHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdkcm9wLWxpc3QnKSk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGRyb3BwYWJsZXMubWFwKGRyb3BwYWJsZSA9PiB7XG4gICAgICBjb25zdCBkcmFnc0luRHJvcHBhYmxlID0gZHJvcHBhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1txdGktZHJhZ2dhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgY29uc3QgaWRlbnRpZmllcnMgPSBBcnJheS5mcm9tKGRyYWdzSW5Ecm9wcGFibGUpLm1hcChkID0+IGQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgcmV0dXJuIFsuLi5pZGVudGlmaWVyc10uam9pbignICcpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICB0aGlzLmNoaWxkcmVuTWFwID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgIHRoaXMuY2hpbGRyZW5NYXAuZm9yRWFjaChlbCA9PiBlbC5zZXRBdHRyaWJ1dGUoJ3BhcnQnLCAncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW9yZGVyLWludGVyYWN0aW9uJzogUXRpT3JkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbiBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgY3Vyc29yOiBtb3ZlO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgbGVmdDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICB9XG4gICAgYFxuICBdO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24nLCBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbik7XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlJylcbmV4cG9ydCBjbGFzcyBRdGlQb3NpdGlvbk9iamVjdFN0YWdlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBzdGFydFg6IGFueTtcbiAgc3RhcnRZOiBhbnk7XG4gIGRyYWdFbGVtZW50OiBhbnk7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyID0gdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciA9IHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLmJpbmQodGhpcyk7XG4gIH1cblxuICAvLyBEZWZpbmUgYSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIG1vdXNlbW92ZSBldmVudCBvbiB0aGUgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgZHJhZ0VsZW1lbnRIYW5kbGVyKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgdGhlIG1vdXNlIGhhcyBtb3ZlZCBzaW5jZSB0aGUgbGFzdCBldmVudFxuICAgIGNvbnN0IGRlbHRhWCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXJ0WDtcbiAgICBjb25zdCBkZWx0YVkgPSBldmVudC5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuZHJhZ0VsZW1lbnQuc3R5bGUubGVmdCA9IHRoaXMuZHJhZ0VsZW1lbnQub2Zmc2V0TGVmdCArIGRlbHRhWCArICdweCc7XG4gICAgdGhpcy5kcmFnRWxlbWVudC5zdHlsZS50b3AgPSB0aGlzLmRyYWdFbGVtZW50Lm9mZnNldFRvcCArIGRlbHRhWSArICdweCc7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgIHRoaXMuc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcbiAgICB0aGlzLnN0YXJ0WSA9IGV2ZW50LmNsaWVudFk7XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoYSk6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChhKTtcblxuICAgIC8vIEdldCB0aGUgZHJhZ2dhYmxlIGFuZCBkcm9wIHpvbmUgZWxlbWVudHNcbiAgICB0aGlzLmRyYWdFbGVtZW50ID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uPmltZycpO1xuICAgIC8vIGNvbnN0IGNhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FudmFzJyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHZhcmlhYmxlcyBmb3IgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuc3RhcnRYID0gMDtcbiAgICB0aGlzLnN0YXJ0WSA9IDA7XG5cbiAgICAvLyBBZGQgYSBtb3VzZWRvd24gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgdGhpcy5kcmFnRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIFNhdmUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5zdGFydFkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgICAvLyBBZGQgYSBtb3VzZW1vdmUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRvY3VtZW50XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlbW92ZU1vdmVMaXN0ZW5lcihldmVudCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLCB0cnVlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLnJlbW92ZU1vdmVMaXN0ZW5lcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXBvc2l0aW9uLW9iamVjdC1zdGFnZSc6IFF0aVBvc2l0aW9uT2JqZWN0U3RhZ2U7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtBdHRyaWJ1dGVQYXJ0LCBub0NoYW5nZX0gZnJvbSAnLi4vbGl0LWh0bWwuanMnO1xuaW1wb3J0IHtcbiAgZGlyZWN0aXZlLFxuICBEaXJlY3RpdmUsXG4gIERpcmVjdGl2ZVBhcmFtZXRlcnMsXG4gIFBhcnRJbmZvLFxuICBQYXJ0VHlwZSxcbn0gZnJvbSAnLi4vZGlyZWN0aXZlLmpzJztcblxuLyoqXG4gKiBBIGtleS12YWx1ZSBzZXQgb2YgQ1NTIHByb3BlcnRpZXMgYW5kIHZhbHVlcy5cbiAqXG4gKiBUaGUga2V5IHNob3VsZCBiZSBlaXRoZXIgYSB2YWxpZCBDU1MgcHJvcGVydHkgbmFtZSBzdHJpbmcsIGxpa2VcbiAqIGAnYmFja2dyb3VuZC1jb2xvcidgLCBvciBhIHZhbGlkIEphdmFTY3JpcHQgY2FtZWwgY2FzZSBwcm9wZXJ0eSBuYW1lXG4gKiBmb3IgQ1NTU3R5bGVEZWNsYXJhdGlvbiBsaWtlIGBiYWNrZ3JvdW5kQ29sb3JgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0eWxlSW5mbyB7XG4gIFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsO1xufVxuXG5jb25zdCBpbXBvcnRhbnQgPSAnaW1wb3J0YW50Jztcbi8vIFRoZSBsZWFkaW5nIHNwYWNlIGlzIGltcG9ydGFudFxuY29uc3QgaW1wb3J0YW50RmxhZyA9ICcgIScgKyBpbXBvcnRhbnQ7XG4vLyBIb3cgbWFueSBjaGFyYWN0ZXJzIHRvIHJlbW92ZSBmcm9tIGEgdmFsdWUsIGFzIGEgbmVnYXRpdmUgbnVtYmVyXG5jb25zdCBmbGFnVHJpbSA9IDAgLSBpbXBvcnRhbnRGbGFnLmxlbmd0aDtcblxuY2xhc3MgU3R5bGVNYXBEaXJlY3RpdmUgZXh0ZW5kcyBEaXJlY3RpdmUge1xuICBwcml2YXRlIF9wcmV2aW91c1N0eWxlUHJvcGVydGllcz86IFNldDxzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKHBhcnRJbmZvOiBQYXJ0SW5mbykge1xuICAgIHN1cGVyKHBhcnRJbmZvKTtcbiAgICBpZiAoXG4gICAgICBwYXJ0SW5mby50eXBlICE9PSBQYXJ0VHlwZS5BVFRSSUJVVEUgfHxcbiAgICAgIHBhcnRJbmZvLm5hbWUgIT09ICdzdHlsZScgfHxcbiAgICAgIChwYXJ0SW5mby5zdHJpbmdzPy5sZW5ndGggYXMgbnVtYmVyKSA+IDJcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSBgc3R5bGVNYXBgIGRpcmVjdGl2ZSBtdXN0IGJlIHVzZWQgaW4gdGhlIGBzdHlsZWAgYXR0cmlidXRlICcgK1xuICAgICAgICAgICdhbmQgbXVzdCBiZSB0aGUgb25seSBwYXJ0IGluIHRoZSBhdHRyaWJ1dGUuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoc3R5bGVJbmZvOiBSZWFkb25seTxTdHlsZUluZm8+KSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHN0eWxlSW5mbykucmVkdWNlKChzdHlsZSwgcHJvcCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBzdHlsZUluZm9bcHJvcF07XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9XG4gICAgICAvLyBDb252ZXJ0IHByb3BlcnR5IG5hbWVzIGZyb20gY2FtZWwtY2FzZSB0byBkYXNoLWNhc2UsIGkuZS46XG4gICAgICAvLyAgYGJhY2tncm91bmRDb2xvcmAgLT4gYGJhY2tncm91bmQtY29sb3JgXG4gICAgICAvLyBWZW5kb3ItcHJlZml4ZWQgbmFtZXMgbmVlZCBhbiBleHRyYSBgLWAgYXBwZW5kZWQgdG8gZnJvbnQ6XG4gICAgICAvLyAgYHdlYmtpdEFwcGVhcmFuY2VgIC0+IGAtd2Via2l0LWFwcGVhcmFuY2VgXG4gICAgICAvLyBFeGNlcHRpb24gaXMgYW55IHByb3BlcnR5IG5hbWUgY29udGFpbmluZyBhIGRhc2gsIGluY2x1ZGluZ1xuICAgICAgLy8gY3VzdG9tIHByb3BlcnRpZXM7IHdlIGFzc3VtZSB0aGVzZSBhcmUgYWxyZWFkeSBkYXNoLWNhc2VkIGkuZS46XG4gICAgICAvLyAgYC0tbXktYnV0dG9uLWNvbG9yYCAtLT4gYC0tbXktYnV0dG9uLWNvbG9yYFxuICAgICAgcHJvcCA9IHByb3AuaW5jbHVkZXMoJy0nKVxuICAgICAgICA/IHByb3BcbiAgICAgICAgOiBwcm9wXG4gICAgICAgICAgICAucmVwbGFjZSgvKD86Xih3ZWJraXR8bW96fG1zfG8pfCkoPz1bQS1aXSkvZywgJy0kJicpXG4gICAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBzdHlsZSArIGAke3Byb3B9OiR7dmFsdWV9O2A7XG4gICAgfSwgJycpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdXBkYXRlKHBhcnQ6IEF0dHJpYnV0ZVBhcnQsIFtzdHlsZUluZm9dOiBEaXJlY3RpdmVQYXJhbWV0ZXJzPHRoaXM+KSB7XG4gICAgY29uc3Qge3N0eWxlfSA9IHBhcnQuZWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgIGlmICh0aGlzLl9wcmV2aW91c1N0eWxlUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcmV2aW91c1N0eWxlUHJvcGVydGllcyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoc3R5bGVJbmZvKSk7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXIoc3R5bGVJbmZvKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgb2xkIHByb3BlcnRpZXMgdGhhdCBubyBsb25nZXIgZXhpc3QgaW4gc3R5bGVJbmZvXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMuX3ByZXZpb3VzU3R5bGVQcm9wZXJ0aWVzKSB7XG4gICAgICAvLyBJZiB0aGUgbmFtZSBpc24ndCBpbiBzdHlsZUluZm8gb3IgaXQncyBudWxsL3VuZGVmaW5lZFxuICAgICAgaWYgKHN0eWxlSW5mb1tuYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzU3R5bGVQcm9wZXJ0aWVzIS5kZWxldGUobmFtZSk7XG4gICAgICAgIGlmIChuYW1lLmluY2x1ZGVzKCctJykpIHtcbiAgICAgICAgICBzdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgIChzdHlsZSBhcyBhbnkpW25hbWVdID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBvciB1cGRhdGUgcHJvcGVydGllc1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiBzdHlsZUluZm8pIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gc3R5bGVJbmZvW25hbWVdO1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fcHJldmlvdXNTdHlsZVByb3BlcnRpZXMuYWRkKG5hbWUpO1xuICAgICAgICBjb25zdCBpc0ltcG9ydGFudCA9XG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5lbmRzV2l0aChpbXBvcnRhbnRGbGFnKTtcbiAgICAgICAgaWYgKG5hbWUuaW5jbHVkZXMoJy0nKSB8fCBpc0ltcG9ydGFudCkge1xuICAgICAgICAgIHN0eWxlLnNldFByb3BlcnR5KFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGlzSW1wb3J0YW50XG4gICAgICAgICAgICAgID8gKHZhbHVlIGFzIHN0cmluZykuc2xpY2UoMCwgZmxhZ1RyaW0pXG4gICAgICAgICAgICAgIDogKHZhbHVlIGFzIHN0cmluZyksXG4gICAgICAgICAgICBpc0ltcG9ydGFudCA/IGltcG9ydGFudCA6ICcnXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgIChzdHlsZSBhcyBhbnkpW25hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vQ2hhbmdlO1xuICB9XG59XG5cbi8qKlxuICogQSBkaXJlY3RpdmUgdGhhdCBhcHBsaWVzIENTUyBwcm9wZXJ0aWVzIHRvIGFuIGVsZW1lbnQuXG4gKlxuICogYHN0eWxlTWFwYCBjYW4gb25seSBiZSB1c2VkIGluIHRoZSBgc3R5bGVgIGF0dHJpYnV0ZSBhbmQgbXVzdCBiZSB0aGUgb25seVxuICogZXhwcmVzc2lvbiBpbiB0aGUgYXR0cmlidXRlLiBJdCB0YWtlcyB0aGUgcHJvcGVydHkgbmFtZXMgaW4gdGhlXG4gKiB7QGxpbmsgU3R5bGVJbmZvIHN0eWxlSW5mb30gb2JqZWN0IGFuZCBhZGRzIHRoZSBwcm9wZXJ0aWVzIHRvIHRoZSBpbmxpbmVcbiAqIHN0eWxlIG9mIHRoZSBlbGVtZW50LlxuICpcbiAqIFByb3BlcnR5IG5hbWVzIHdpdGggZGFzaGVzIChgLWApIGFyZSBhc3N1bWVkIHRvIGJlIHZhbGlkIENTU1xuICogcHJvcGVydHkgbmFtZXMgYW5kIHNldCBvbiB0aGUgZWxlbWVudCdzIHN0eWxlIG9iamVjdCB1c2luZyBgc2V0UHJvcGVydHkoKWAuXG4gKiBOYW1lcyB3aXRob3V0IGRhc2hlcyBhcmUgYXNzdW1lZCB0byBiZSBjYW1lbENhc2VkIEphdmFTY3JpcHQgcHJvcGVydHkgbmFtZXNcbiAqIGFuZCBzZXQgb24gdGhlIGVsZW1lbnQncyBzdHlsZSBvYmplY3QgdXNpbmcgcHJvcGVydHkgYXNzaWdubWVudCwgYWxsb3dpbmcgdGhlXG4gKiBzdHlsZSBvYmplY3QgdG8gdHJhbnNsYXRlIEphdmFTY3JpcHQtc3R5bGUgbmFtZXMgdG8gQ1NTIHByb3BlcnR5IG5hbWVzLlxuICpcbiAqIEZvciBleGFtcGxlIGBzdHlsZU1hcCh7YmFja2dyb3VuZENvbG9yOiAncmVkJywgJ2JvcmRlci10b3AnOiAnNXB4JywgJy0tc2l6ZSc6XG4gKiAnMCd9KWAgc2V0cyB0aGUgYGJhY2tncm91bmQtY29sb3JgLCBgYm9yZGVyLXRvcGAgYW5kIGAtLXNpemVgIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHN0eWxlSW5mb1xuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9saXQuZGV2L2RvY3MvdGVtcGxhdGVzL2RpcmVjdGl2ZXMvI3N0eWxlbWFwIHN0eWxlTWFwIGNvZGUgc2FtcGxlcyBvbiBMaXQuZGV2fVxuICovXG5leHBvcnQgY29uc3Qgc3R5bGVNYXAgPSBkaXJlY3RpdmUoU3R5bGVNYXBEaXJlY3RpdmUpO1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHRoZSBjbGFzcyB0aGF0IHBvd2VycyB0aGlzIGRpcmVjdGl2ZS4gTmVjZXNzYXJ5IGZvciBuYW1pbmcgdGhlXG4gKiBkaXJlY3RpdmUncyByZXR1cm4gdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUge1N0eWxlTWFwRGlyZWN0aXZlfTtcbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzJztcbmltcG9ydCB7IHN0eWxlTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvc3R5bGUtbWFwLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgICAgcG9pbnQtY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF4LWNob2ljZXMnXG4gIH0pXG4gIHB1YmxpYyBtYXhDaG9pY2VzOiBudW1iZXIgPSBJbmZpbml0eTtcblxuICBAcHJvcGVydHkoe1xuICAgIHR5cGU6IE51bWJlcixcbiAgICBhdHRyaWJ1dGU6ICdtaW4tY2hvaWNlcydcbiAgfSlcbiAgcHVibGljIG1pbkNob2ljZXM6IG51bWJlciA9IDA7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfcG9pbnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIFJlZmVyZW5jZSB0byB0aGUgaW1hZ2UgZWxlbWVudFxuICBwcml2YXRlIF9pbWdFbGVtZW50OiBIVE1MSW1hZ2VFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gRXh0cmFjdGVkIGNsaWNrIGhhbmRsZXIgbWV0aG9kXG4gIHByaXZhdGUgX29uSW1hZ2VDbGljayA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGlmICh0aGlzLl9wb2ludHMubGVuZ3RoIDwgdGhpcy5tYXhDaG9pY2VzKSB7XG4gICAgICBjb25zdCB4ID0gZXZlbnQub2Zmc2V0WDtcbiAgICAgIGNvbnN0IHkgPSBldmVudC5vZmZzZXRZO1xuXG4gICAgICB0aGlzLl9wb2ludHMgPSBbLi4udGhpcy5fcG9pbnRzLCBgJHt4fSAke3l9YF07XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl9wb2ludHMpO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8cG9pbnQtY29udGFpbmVyPlxuICAgICAgICAke3JlcGVhdChcbiAgICAgICAgICB0aGlzLl9wb2ludHMsXG4gICAgICAgICAgcG9pbnQgPT4gcG9pbnQsXG4gICAgICAgICAgKHBvaW50LCBpbmRleCkgPT4gaHRtbGBcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgcGFydD1cInBvaW50XCJcbiAgICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlKC01MCUsIC01MCUpJyxcbiAgICAgICAgICAgICAgICBsZWZ0OiBgJHtwb2ludC5zcGxpdCgnICcpWzBdfXB4YCxcbiAgICAgICAgICAgICAgICB0b3A6IGAke3BvaW50LnNwbGl0KCcgJylbMV19cHhgXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVtb3ZlIHBvaW50IGF0ICR7cG9pbnR9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb2ludHMgPSB0aGlzLl9wb2ludHMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fcG9pbnRzKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICBgXG4gICAgICAgICl9XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvcG9pbnQtY29udGFpbmVyPmA7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9wb2ludHMgPSBbXTtcbiAgfVxuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wb2ludHMubGVuZ3RoID49IHRoaXMubWluQ2hvaWNlcyAmJiB0aGlzLl9wb2ludHMubGVuZ3RoIDw9IHRoaXMubWF4Q2hvaWNlcztcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fcG9pbnRzID0gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF07XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcG9pbnRzO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKCk6IHZvaWQge1xuICAgIHRoaXMuX2ltZ0VsZW1lbnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuXG4gICAgaWYgKHRoaXMuX2ltZ0VsZW1lbnQpIHtcbiAgICAgIC8vIEF0dGFjaCB0aGUgY2xpY2sgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGltYWdlIGVsZW1lbnRcbiAgICAgIHRoaXMuX2ltZ0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkltYWdlQ2xpY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05vIDxpbWc+IGVsZW1lbnQgZm91bmQgaW4gPHF0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24+Jyk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGlmICh0aGlzLl9pbWdFbGVtZW50KSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIGNsaWNrIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIGltYWdlIGVsZW1lbnRcbiAgICAgIHRoaXMuX2ltZ0VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkltYWdlQ2xpY2spO1xuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJzogUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgcXVlcnkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgU2xpZGVySW50ZXJhY3Rpb24uVHlwZSAocXRpLXNsaWRlci1pbnRlcmFjdGlvbikgcHJlc2VudHMgdGhlIGNhbmRpZGF0ZSB3aXRoIGEgY29udHJvbCBmb3Igc2VsZWN0aW5nIGEgbnVtZXJpY2FsIHZhbHVlIGJldHdlZW4gYSBsb3dlciBhbmQgdXBwZXIgYm91bmQuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLnM2MXhjcmo0cWN5alxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA2LjBcbiAqXG4gKiBAZXZlbnQgcXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uIC0gZW1pdHRlZCB3aGVuIHRoZSBpbnRlcmFjdGlvbiB3YW50cyB0byByZWdpc3RlciBpdHNlbGZcbiAqIEBldmVudCBxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UgLSBlbWl0dGVkIHdoZW4gdGhlIGludGVyYWN0aW9uIGNoYW5nZXNcbiAqXG4gKiBAY3NzcHJvcCAtLXNob3ctdmFsdWUgLSBzaG93cyB0aGUgY3VycmVudCB2YWx1ZSB3aGlsZSBzbGlkaW5nXG4gKiBAY3NzcHJvcCAtLXNob3ctdGlja3MgLSBzaG93cyB0aGUgdGlja3MgYWNjb3JkaW5nIHRvIHN0ZXBzXG4gKiBAY3NzcHJvcCAtLXNob3ctYm91bmRzIC0gc2hvd3MgdmFsdWUgZm9yIGxvd2VyIGFuZCB1cHBlciBib3VuZGFyeVxuICpcbiAqIEBjc3NwYXJ0IHNsaWRlciAtLSBzbGlkZXIgaW5sdWRpbmcsIGJvdW5kcyBhbmQgdGlja3MgYW5kIHZhbHVlLCB1c2UgaXQgZm9yIHBhZGRpbmdzIGFuZCBtYXJnaW5zXG4gKiBAY3NzcGFydCBib3VuZHMgLS0gZGl2IGZvciBib3VuZHMsIGNvbnRhaW5pbmcgdHdvIGRpdnMgZm9yIHdpdGggbWluLCBhbmQgbWF4IGJvdW5kcyB2YWx1ZVxuICogQGNzc3BhcnQgdGlja3MgLS0gZGl2IGZvciB0aWNrcywgdXNlIGxpbmVhaXIgZ3JhZGllbnQgYW5kIGV4cG9zZWQgY3NzIHZhcmlhYmxlcyBmb3Igc3R5bGluZ1xuICogQGNzc3BhcnQgcmFpbCAtLSBkaXYgZm9yIHJhaWwsIHN0eWxlIGFjY29yZGluZyB0byBuZWVkc1xuICogQGNzc3BhcnQga25vYiAtLSBkaXYsIHNob3VsZCBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZVxuICogQGNzc3BhcnQgdmFsdWUgLS0gZGl2LCBjb250YWluaW5nIHZhbHVlXG4gKlxuICogQHNsb3QgLSBUaGUgZGVmYXVsdCBzbG90IHdoZXJlIDxxdGktc2ltcGxlLWNob2ljZT4gbXVzdCBiZSBwbGFjZWQuXG4gKiBAc2xvdCBwcm9tcHQgLSBzbG90IHdoZXJlIHRoZSBwcm9tcHQgaXMgcGxhY2VkLlxuICovXG5cbkBjdXN0b21FbGVtZW50KCdxdGktc2xpZGVyLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlTbGlkZXJJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgcHJpdmF0ZSBfdmFsdWUgPSAwO1xuICBjc0xpdmU6IENTU1N0eWxlRGVjbGFyYXRpb247XG5cbiAgQHF1ZXJ5KCcja25vYicpXG4gIHByaXZhdGUgX2tub2I6IEhUTUxFbGVtZW50O1xuXG4gIEBxdWVyeSgnI3JhaWwnKVxuICBwcml2YXRlIF9yYWlsOiBIVE1MRWxlbWVudDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdzdGVwLWxhYmVsJyB9KSBzdGVwTGFiZWwgPSBmYWxzZTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIHJldmVyc2UgPSBmYWxzZTtcblxuICBwcml2YXRlIF9taW46IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdsb3dlci1ib3VuZCcgfSkgc2V0IG1pbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWluID0gdmFsdWU7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1pbicsIGAke3RoaXMuX21pbn1gKTtcbiAgfVxuICBnZXQgbWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHByaXZhdGUgX21heDogbnVtYmVyO1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ3VwcGVyLWJvdW5kJyB9KSBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1heCcsIGAke3RoaXMuX21heH1gKTtcbiAgfVxuICBnZXQgbWF4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIHByaXZhdGUgX3N0ZXA6IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdzdGVwJyB9KSBzZXQgc3RlcCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc3RlcCA9IHZhbHVlO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tc3RlcCcsIGAke3RoaXMuX3N0ZXB9YCk7XG4gIH1cbiAgZ2V0IHN0ZXAoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RlcDtcbiAgfVxuXG4gIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVEaXNhYmxlZENoYW5nZSA9IChvbGQsIGRpc2FibGVkKSA9PiB7fTtcblxuICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAob2xkLCByZWFkb25seSkgPT4ge307XG5cbiAgcmVzZXQoKSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaXNOdW1iZXIgPSAhaXNOYU4ocGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpKTtcbiAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gcGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG4gIH1cblxuICAvLyBzdGF0aWMgc2hhZG93Um9vdE9wdGlvbnM6IFNoYWRvd1Jvb3RJbml0ID0geyAuLi5MaXRFbGVtZW50LnNoYWRvd1Jvb3RPcHRpb25zLCBkZWxlZ2F0ZXNGb2N1czogdHJ1ZSwgbW9kZTogJ29wZW4nIH07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvKiB0aGUgY29tcHV0ZWQgc3R5bGUgaXMgYSBsaXZlIHByb3BlcnR5LCB3ZSB1c2UgdGhpcyB0byBnZXQgY3NzIHZhcmlhYmxlc1xuICAgIHNlZSByZW5kZXIgdGVtcGxhdGUgKi9cbiAgICB0aGlzLmNzTGl2ZSA9IGdldENvbXB1dGVkU3R5bGUodGhpcyk7XG4gIH1cblxuICBzZXQgcmVzcG9uc2UobXlSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShteVJlc3BvbnNlKSkge1xuICAgICAgY29uc29sZS5lcnJvcignUXRpU2xpZGVySW50ZXJhY3Rpb246IHJlc3BvbnNlIGlzIGFuIGFycmF5LCBidXQgc2hvdWxkIGJlIGEgc2luZ2xlIHZhbHVlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQobXlSZXNwb25zZSk7XG4gICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1F0aVNsaWRlckludGVyYWN0aW9uOiByZXNwb25zZSBpcyBub3QgYSBudW1iZXInKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbY3NzYGBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICAvLyBjb252ZXJ0IHRoZSB2YWx1ZSwgd2hpY2ggaXMgdGhlIHJlYWwgc2xpZGVyIHZhbHVlIHRvIGEgcGVyY2VudGFnZSBmb3IgdGhlIGRvbS5cbiAgICBpZiAodGhpcy5fdmFsdWUgPCB0aGlzLm1pbikge1xuICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLm1pbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ZhbHVlID4gdGhpcy5tYXgpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5tYXg7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlUGVyY2VudGFnZSA9ICgodGhpcy5fdmFsdWUgLSB0aGlzLm1pbikgLyAodGhpcy5tYXggLSB0aGlzLm1pbikpICogMTAwO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tdmFsdWUtcGVyY2VudGFnZScsIGAke3ZhbHVlUGVyY2VudGFnZX0lYCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCB0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxkaXYgaWQ9XCJzbGlkZXJcIiBwYXJ0PVwic2xpZGVyXCI+XG4gICAgICAgICR7dGhpcy5jc0xpdmUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaG93LWJvdW5kcycpID09ICd0cnVlJ1xuICAgICAgICAgID8gaHRtbGA8ZGl2IGlkPVwiYm91bmRzXCIgcGFydD1cImJvdW5kc1wiPlxuICAgICAgICAgICAgICA8ZGl2PiR7dGhpcy5fbWlufTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PiR7dGhpcy5fbWF4fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YFxuICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgJHt0aGlzLmNzTGl2ZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXNob3ctdGlja3MnKSA9PSAndHJ1ZScgPyBodG1sYDxkaXYgaWQ9XCJ0aWNrc1wiIHBhcnQ9XCJ0aWNrc1wiPjwvZGl2PmAgOiBub3RoaW5nfVxuICAgICAgICA8ZGl2IGlkPVwicmFpbFwiIHBhcnQ9XCJyYWlsXCIgQG1vdXNlZG93bj0ke3RoaXMuX29uTW91c2VEb3dufSBAdG91Y2hzdGFydD0ke3RoaXMuX29uVG91Y2hNb3ZlfT5cbiAgICAgICAgICA8ZGl2IGlkPVwia25vYlwiIHBhcnQ9XCJrbm9iXCI+XG4gICAgICAgICAgICAke3RoaXMuY3NMaXZlLmdldFByb3BlcnR5VmFsdWUoJy0tc2hvdy12YWx1ZScpID09ICd0cnVlJ1xuICAgICAgICAgICAgICA/IGh0bWxgPGRpdiBpZD1cInZhbHVlXCIgcGFydD1cInZhbHVlXCI+JHt0aGlzLnZhbHVlfTwvZGl2PmBcbiAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc3RlcCA9IDE7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncm9sZScsICdzbGlkZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uVG91Y2hNb3ZlKGV2ZW50KSB7XG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gZXZlbnQgPT4ge1xuICAgICAgY29uc3QgeyB4IH0gPSB0aGlzLmdldFBvc2l0aW9uRnJvbUV2ZW50KGV2ZW50KTtcbiAgICAgIGNvbnN0IGRpZmZYID0geCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBoYW5kbGVUb3VjaEVuZCk7XG5cbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGhhbmRsZVRvdWNoTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBoYW5kbGVUb3VjaEVuZCk7XG5cbiAgICBjb25zdCB7IHggfSA9IHRoaXMuZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZXZlbnQpO1xuICAgIGNvbnN0IGRpZmZYID0geCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIHRoaXMuY2FsY3VsYXRlVmFsdWUoZGlmZlgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIGlmIHRoZSBxdGktc2xpZGVyLWludGVyYWN0aW9uIGhhcyBhbiBhYnNvbHV0ZSBsZWZ0IHBvc2l0aW9uIGFuZCBib2R5IGlzIHNjcm9sbGVkIGEgYml0LCB0YWtlIGFjY291bnQgZm9yIHRoYXRcbiAgICAgIGNvbnN0IGRpZmZYID0gZXZlbnQucGFnZVggLSB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcblxuICAgICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBoYW5kbGVNb3VzZVVwKTtcblxuICAgIC8vIGlmIHRoZSBxdGktc2xpZGVyLWludGVyYWN0aW9uIGhhcyBhbiBhYnNvbHV0ZSBsZWZ0IHBvc2l0aW9uIGFuZCBib2R5IGlzIHNjcm9sbGVkIGEgYml0LCB0YWtlIGFjY291bnQgZm9yIHRoYXRcbiAgICBjb25zdCBkaWZmWCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG5cbiAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqIGNhbGN1bGF0ZVZhbHVlIGdldHMgeCBwb3NpdGlvbiBhbmQgY29tcGFyZXMgdGhpcyB3aXRoIHRoZSB0b3RhbCB3aWR0aCBpbiBwaXhlbHMgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVWYWx1ZShkaWZmWDogbnVtYmVyKSB7XG4gICAgY29uc3QgdmFsdWVOb3cgPSB0aGlzLm1pbiArICgodGhpcy5tYXggLSB0aGlzLm1pbikgKiBkaWZmWCkgLyB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIGNvbnN0IHJvdW5kZWRTdGVwVmFsdWUgPSB0aGlzLm1pbiArIE1hdGgucm91bmQoKHZhbHVlTm93IC0gdGhpcy5taW4pIC8gdGhpcy5fc3RlcCkgKiB0aGlzLl9zdGVwO1xuICAgIHRoaXMuX3ZhbHVlID0gcm91bmRlZFN0ZXBWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZTogYW55KToge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0ge1xuICAgIGxldCBfdG91Y2hNb3ZlO1xuICAgIGlmIChlLnR5cGUgPT0gJ3RvdWNoc3RhcnQnIHx8IGUudHlwZSA9PSAndG91Y2htb3ZlJyB8fCBlLnR5cGUgPT0gJ3RvdWNoZW5kJyB8fCBlLnR5cGUgPT0gJ3RvdWNoY2FuY2VsJykge1xuICAgICAgY29uc3QgZXZ0ID0gdHlwZW9mIGUub3JpZ2luYWxFdmVudCA9PT0gJ3VuZGVmaW5lZCcgPyBlIDogZS5vcmlnaW5hbEV2ZW50O1xuICAgICAgY29uc3QgdG91Y2ggPSBldnQudG91Y2hlc1swXSB8fCBldnQuY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgICBfdG91Y2hNb3ZlID0ge1xuICAgICAgICB4OiB0b3VjaC5wYWdlWCxcbiAgICAgICAgeTogdG91Y2gucGFnZVlcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGUudHlwZSA9PSAnbW91c2Vkb3duJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZXVwJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZW1vdmUnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlb3ZlcicgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VvdXQnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlZW50ZXInIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlbGVhdmUnXG4gICAgKSB7XG4gICAgICBfdG91Y2hNb3ZlID0ge1xuICAgICAgICB4OiBlLmNsaWVudFgsXG4gICAgICAgIHk6IGUuY2xpZW50WVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIF90b3VjaE1vdmU7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNsaWRlci1pbnRlcmFjdGlvbic6IFF0aVNsaWRlckludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ2FsY3VsYXRlIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbi8qKlxuICogaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5maTI5cThkdWJqZ3dcbiAqIDxxdGktY3VzdG9tLW9wZXJhdG9yIGNsYXNzPVwianMub3JnXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJzdHJpbmdcIj48IVtDREFUQVtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjb250ZXh0LnZhcmlhYmxlcyk7XG4gICAgICAgICAgcmV0dXJuICdCJ1xuICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbicpLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICBdXT48L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktY3VzdG9tLW9wZXJhdG9yPlxuICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWN1c3RvbS1vcGVyYXRvcicpXG5leHBvcnQgY2xhc3MgUXRpQ3VzdG9tT3BlcmF0b3IgZXh0ZW5kcyBMaXRFbGVtZW50IGltcGxlbWVudHMgQ2FsY3VsYXRlIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBwcml2YXRlIG9wZXJhdG9yRnVuY3Rpb246IEZ1bmN0aW9uO1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9jb250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IEBzbG90Y2hhbmdlPSR7dGhpcy5oYW5kbGVTbG90Q2hhbmdlfT48L3Nsb3Q+YDtcbiAgfVxuXG4gIGhhbmRsZVNsb3RDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gZXhwZWN0aW5nIDxbIUNEQVRBWyAuLi4gXV0+IGlzIGNvbnZlcnRlZCBpbnRvIDwhLS0gLi4uIC0tPiB3aXRoIHF0aS10cmFuc2Zvcm06IGNEYXRhVG9Db21tZW50XG4gICAgY29uc3QgY29tbWVudE5vZGUgPSBBcnJheS5mcm9tKHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQ/LmNoaWxkTm9kZXMgPz8gW10pLmZpbmQoXG4gICAgICBub2RlID0+IG5vZGUubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vcGVyYXRvckZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKCdjb250ZXh0JywgJ2ZuJywgJ2l0ZW0nLCBjb21tZW50Tm9kZS50ZXh0Q29udGVudCA/PyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignY3VzdG9tLW9wZXJhdG9yIGNvbnRhaW5zIGludmFsaWQgamF2YXNjcmlwdCBjb2RlJywgZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCBmbiA9IHtcbiAgICAgIHZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcpID0+XG4gICAgICAgIHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpPy52YWx1ZSA/PyAnJyxcbiAgICAgIGNvcnJlY3Q6IChyZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZykgPT5cbiAgICAgICAgKHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpIGFzIFJlc3BvbnNlVmFyaWFibGUpXG4gICAgICAgICAgPy5jb3JyZWN0UmVzcG9uc2UgPz8gJydcbiAgICB9O1xuICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICBnZXRWYXJpYWJsZTogKHZhcmlhYmxlSWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICAgICAgICB0aGlzLl9jb250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdmFyaWFibGVJZGVudGlmaWVyKSxcbiAgICAgIHVwZGF0ZU91dGNvbWVWYXJpYWJsZTogKG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCB7XG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB1cGRhdGVSZXNwb25zZVZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcsIHJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgcmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmc7IHJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvckZ1bmN0aW9uKHRoaXMuX2NvbnRleHQsIGZuLCBpdGVtKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY3VzdG9tLW9wZXJhdG9yJzogUXRpQ3VzdG9tT3BlcmF0b3I7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnKVxuZXhwb3J0IGNsYXNzIFF0aUFzc29jaWFibGVIb3RzcG90IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicXRpLWdhcC1pbWdcIj48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc29jaWFibGUtaG90c3BvdCc6IFF0aUFzc29jaWFibGVIb3RzcG90O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcCcpXG5leHBvcnQgY2xhc3MgUXRpR2FwIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicXRpLWdhcC10ZXh0XCI+PC9zbG90PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdhcCc6IFF0aUdhcDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtaW1nJylcbmV4cG9ydCBjbGFzcyBRdGlHYXBJbWcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktZ2FwLWltZycpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtaW1nJzogUXRpR2FwSW1nO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ2FwLXRleHQnKVxuZXhwb3J0IGNsYXNzIFF0aUdhcFRleHQgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1nYXAtdGV4dCcpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktZ2FwLXRleHQnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwLXRleHQnOiBRdGlHYXBUZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8vIHR5cGUgc2hhcGUgPSB7IHNoYXBlOiAncmVjdCcgfCAnY2lyY2xlJyB8ICdwb2x5JzsgY29vcmRzOiBudW1iZXJbXSB9O1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHNwb3QtY2hvaWNlJylcbmV4cG9ydCBjbGFzcyBRdGlIb3RzcG90Q2hvaWNlIGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktaG90c3BvdC1jaG9pY2UnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYXJpYS1vcmRlcnZhbHVlJywgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIG9yZGVyOiBudW1iZXI7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWNob2ljZSc6IFF0aUhvdHNwb3RDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEFjdGl2ZUVsZW1lbnRNaXhpbiB9IGZyb20gJy4vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHRleHQnKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHRleHQgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1ob3R0ZXh0Jykge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxkaXYgcGFydD1cImNoXCI+PGRpdiBwYXJ0PVwiY2hhXCI+PC9kaXY+PC9kaXY+XG4gICAgICA8c2xvdD48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHRleHQnOiBRdGlIb3R0ZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWlubGluZS1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aUlubGluZUNob2ljZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3NzYFxuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB9XG4gICAgICBgXG4gICAgXTtcbiAgfVxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vblNlbGVjdElubGluZUNob2ljZSk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLXJlZ2lzdGVyJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2VcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vblNlbGVjdElubGluZUNob2ljZSk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90Pjwvc2xvdD4gYDtcbiAgfVxuXG4gIHByaXZhdGUgX29uU2VsZWN0SW5saW5lQ2hvaWNlKCkge1xuICAgIC8vIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWlubGluZS1jaG9pY2Utc2VsZWN0Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1pbmxpbmUtY2hvaWNlJzogUXRpSW5saW5lQ2hvaWNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50LCBub3RoaW5nIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8qKlxuICogcXRpLW9yZGVyLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktc2ltcGxlLWNob2ljZScpXG5leHBvcnQgY2xhc3MgUXRpU2ltcGxlQ2hvaWNlIGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktc2ltcGxlLWNob2ljZScpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICBzbG90IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuICAgIFtwYXJ0PSdjaCddIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICB9XG4gIGA7XG5cbiAgLy8gcHJvcGVydHkgbGFiZWxcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHB1YmxpYyBtYXJrZXI6IHN0cmluZztcblxuXG4gIGdldCBjaGVja2VkKCkge1xuICAgIHJldHVybiB0aGlzWydpbnRlcm5hbHMnXS5zdGF0ZXMuaGFzKCctLWNoZWNrZWQnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8ZGl2IHBhcnQ9XCJjaFwiPlxuICAgICAgICA8ZGl2IHBhcnQ9XCJjaGFcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgJHt0aGlzLm1hcmtlciA/IGh0bWxgPGRpdiBpZD1cImxhYmVsXCI+JHt0aGlzLm1hcmtlcn08L2Rpdj5gIDogbm90aGluZ31cbiAgICAgIDxzbG90IHBhcnQ9XCJzbG90XCI+PC9zbG90PiBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zaW1wbGUtY2hvaWNlJzogUXRpU2ltcGxlQ2hvaWNlO1xuICB9XG59XG4iLCAiLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL2ludGVybmFsL2V2ZW50LXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXZlbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHknO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktcHJvbXB0L3F0aS1wcm9tcHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktc3R5bGVzaGVldC9xdGktc3R5bGVzaGVldCc7XG4vKiBzdGFydCByZXNwb25zZSBhbmQgb3V0Y29tZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbic7XG4vKiBlbmQgcmVzcG9uc2UgYW5kIG91dGNvbWUgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktY29udGVudC1ib2R5JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktcnVicmljLWJsb2NrJztcbi8qIHN0YXJ0IGZlZWRiYWNrICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2stYmxvY2svcXRpLWZlZWRiYWNrLWJsb2NrJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1pbmxpbmUvcXRpLWZlZWRiYWNrLWlubGluZSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrJztcbi8qIGVuZCBmZWVkYmFjayAqL1xuLyogc3RhcnQgdGV4dGVudHJ5aW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJztcbi8qIGVuZCB0ZXh0ZW50cnlpbnRlcmFjdGlvbiAqL1xuLyogc3RhcnQgaG90dGV4dCAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGhvdHRleHQgKi9cbi8qIHN0YXJ0IGlubGluZWNob2ljZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGlubGluZWNob2ljZSAqL1xuLyogc3RhcnQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbic7XG4vKiBlbmQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuLyogc3RhcnQgY3VzdG9tIGludGVyYWN0aW9ucyAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJztcbi8qIGVuZCBjdXN0b20gaW50ZXJhY3Rpb25zICovXG4vKiBzdGFydCBvbmx5IHByZXZpZXcgaXRlbXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbic7XG4vKiBlbmQgb25seSBwcmV2aWV3IGl0ZW1zICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWN1c3RvbS1vcGVyYXRvci9xdGktY3VzdG9tLW9wZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLWltZyc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLXRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1jaG9pY2UnO1xuXG5jb25zb2xlLmxvZyhcbiAgJyVjQ1x1MDBCRlRPJWNMYWIlYzogcXRpLWNvbXBvbmVudHMgbG9hZGVkJyxcbiAgJ2ZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOmdyZWVuJyxcbiAgJ2ZvbnQtZmFtaWx5OiBcIlBUIFNhbnNcIiwgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6Z3JlZW47IGZvbnQtc2l6ZTogc21hbGxlcjt2ZXJ0aWNhbC1hbGlnbjogc3ViJyxcbiAgJ2ZvbnQtd2VpZ2h0OnVuc2V0J1xuKTtcblxuLy8gY3NzIGZvciBmb250IHB0LXNhbnMgYW5kIHN1YnNjcmlwdCBhbmQgZ3JlZW5cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpQXNzZXNzbWVudEl0ZW0gfSBmcm9tICcuLi9xdGktY29tcG9uZW50cyc7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXRpSXRlbUludGVyZmFjZSB7XG4gIGlkZW50aWZpZXI/OiBzdHJpbmc7XG4gIGhyZWY/OiBzdHJpbmc7XG4gIHhtbERvYzogRG9jdW1lbnRGcmFnbWVudDtcbiAgYXNzZXNzbWVudEl0ZW06IFF0aUFzc2Vzc21lbnRJdGVtIHwgbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFF0aUl0ZW1NaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I8TGl0RWxlbWVudD4+KEJhc2U6IFQpIHtcbiAgY2xhc3MgUXRpSXRlbUNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCByZWZsZWN0OiB0cnVlIH0pIGlkZW50aWZpZXI/OiBzdHJpbmc7XG4gICAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGhyZWY/OiBzdHJpbmc7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBPYmplY3QsIGF0dHJpYnV0ZTogZmFsc2UgfSlcbiAgICB4bWxEb2MhOiBEb2N1bWVudEZyYWdtZW50OyAvLyB0aGUgWE1MRG9jdW1lbnRcblxuICAgIHByb3RlY3RlZCBjcmVhdGVSZW5kZXJSb290KCk6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBnZXQgYXNzZXNzbWVudEl0ZW0oKTogUXRpQXNzZXNzbWVudEl0ZW0gfCBudWxsIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclJvb3Q/LnF1ZXJ5U2VsZWN0b3IoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKTtcbiAgICB9XG5cbiAgICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pdGVtLWNvbm5lY3RlZCcsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogeyBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsIGhyZWY6IHRoaXMuaHJlZiB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiBodG1sYCR7dGhpcy54bWxEb2N9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFF0aUl0ZW1DbGFzcyBhcyBDb25zdHJ1Y3RvcjxRdGlJdGVtSW50ZXJmYWNlPiAmIFQ7XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpSXRlbU1peGluIH0gZnJvbSAnLi9xdGktaXRlbS5taXhpbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaXRlbScpXG5leHBvcnQgY2xhc3MgUXRpSXRlbSBleHRlbmRzIFF0aUl0ZW1NaXhpbihMaXRFbGVtZW50KSB7fVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaXRlbSc6IFF0aUl0ZW07XG4gIH1cbn0iLCAiaW1wb3J0IHsgUXRpQXNzZXNzbWVudEl0ZW0gfSBmcm9tICcuLi9xdGktY29tcG9uZW50cyc7XG5pbXBvcnQgeyBxdGlUcmFuc2Zvcm1JdGVtLCBxdGlUcmFuc2Zvcm1UZXN0IH0gZnJvbSAnLi4vcXRpLXRyYW5zZm9ybWVycyc7XG5pbXBvcnQgeyBxdGlUcmFuc2Zvcm1NYW5pZmVzdCB9IGZyb20gJy4uL3F0aS10cmFuc2Zvcm1lcnMvcXRpLXRyYW5zZm9ybS1tYW5pZmVzdCc7XG5cbmV4cG9ydCB0eXBlIE1hbmlmZXN0SW5mbyA9IHtcbiAgdGVzdElkZW50aWZpZXI6IHN0cmluZztcbiAgdGVzdEhUTUxEb2M6IERvY3VtZW50RnJhZ21lbnQ7XG4gIHRlc3RVUkk6IHN0cmluZztcbiAgdGVzdFVSTDogc3RyaW5nO1xuICBpdGVtczoge1xuICAgIGlkZW50aWZpZXI6IHN0cmluZztcbiAgICBocmVmOiBzdHJpbmc7XG4gICAgY2F0ZWdvcnk6IHN0cmluZztcbiAgfVtdO1xufTtcblxuLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBlbnN1cmUgcGFja2FnZSBVUklzIGVuZCB3aXRoIGEgJy8nXG4vLyBjb25zdCBub3JtYWxpemVVcmkgPSAodXJpOiBzdHJpbmcpID0+ICh1cmkuZW5kc1dpdGgoJy8nKSA/IHVyaSA6IGAke3VyaX0vYCk7XG5cbi8vIEZldGNoZXMgYXNzZXNzbWVudCBkYXRhIGZyb20gdGhlIG1hbmlmZXN0XG5leHBvcnQgY29uc3QgZ2V0TWFuaWZlc3RJbmZvID0gYXN5bmMgKG1hbmlmZXN0VVJMOiBzdHJpbmcpOiBQcm9taXNlPE1hbmlmZXN0SW5mbz4gPT4ge1xuICBjb25zdCBiYXNlVVJJID0gbWFuaWZlc3RVUkwuc3Vic3RyaW5nKDAsIG1hbmlmZXN0VVJMLmxhc3RJbmRleE9mKCcvJykpO1xuXG4gIGNvbnN0IHRlc3QgPSBhd2FpdCBxdGlUcmFuc2Zvcm1NYW5pZmVzdCgpXG4gICAgLmxvYWQoYCR7bWFuaWZlc3RVUkx9YClcbiAgICAudGhlbihhcGkgPT4gYXBpLmFzc2Vzc21lbnRUZXN0KCkpO1xuXG4gIGNvbnN0IHRlc3RIVE1MRG9jID0gYXdhaXQgcXRpVHJhbnNmb3JtVGVzdCgpXG4gICAgLmxvYWQoYCR7YmFzZVVSSX0vJHt0ZXN0LmhyZWZ9YClcbiAgICAudGhlbihhcGkgPT4gYXBpLmh0bWxEb2MoKSk7XG5cbiAgY29uc3QgaXRlbXMgPSBhd2FpdCBxdGlUcmFuc2Zvcm1UZXN0KClcbiAgICAubG9hZChgJHtiYXNlVVJJfS8ke3Rlc3QuaHJlZn1gKVxuICAgIC50aGVuKGFwaSA9PiBhcGkuaXRlbXMoKSk7XG5cbiAgY29uc3QgdGVzdFVSTCA9IGAke2Jhc2VVUkl9LyR7dGVzdC5ocmVmfWA7XG4gIGNvbnN0IHRlc3RVUkkgPSBgJHtiYXNlVVJJfS8ke3Rlc3QuaHJlZi5zdWJzdHJpbmcoMCwgdGVzdC5ocmVmLmxhc3RJbmRleE9mKCcvJykpfWA7XG5cbiAgcmV0dXJuIHtcbiAgICB0ZXN0SFRNTERvYyxcbiAgICB0ZXN0VVJJLFxuICAgIHRlc3RVUkwsXG4gICAgaXRlbXMsXG4gICAgdGVzdElkZW50aWZpZXI6IHRlc3QuaWRlbnRpZmllclxuICB9O1xufTtcblxuLy8gRmV0Y2hlcyBhIHNpbmdsZSBpdGVtIGJ5IFVSSVxuZXhwb3J0IGNvbnN0IGdldEl0ZW1CeVVyaSA9IGFzeW5jIChpdGVtVXJpOiBzdHJpbmcpOiBQcm9taXNlPFF0aUFzc2Vzc21lbnRJdGVtPiA9PlxuICBxdGlUcmFuc2Zvcm1JdGVtKClcbiAgICAubG9hZChpdGVtVXJpKVxuICAgIC50aGVuKGFwaSA9PiBhcGkuaHRtbERvYygpLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUFzc2Vzc21lbnRJdGVtKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlETSxJQUFPQSxJQUFQLGNBQ0lDLE1BQUFBO0VBYVIsWUFDRUMsSUFDQUMsSUFDQUMsS0FBQUE7QUFFQUMsVUFBTSxtQkFBbUIsRUFBQ0MsU0FBQUEsTUFBZUMsVUFBQUEsS0FBVSxDQUFBLEdBQ25EQyxLQUFLTixVQUFVQSxJQUNmTSxLQUFLTCxXQUFXQSxJQUNoQkssS0FBS0osWUFBWUEsT0FBQUEsT0FBQUEsTUFBQUE7RUFDbEI7QUFBQTs7O0FDbkJHLFNBQVVLLEVBQXNDQyxJQUFBQTtBQUNwRCxTQUFPQTtBQUNUOzs7SUNyQmFDLFdBQUFBO0VBc0JYLFlBQ0VDLElBQ0FDLElBQ0FDLElBQ0FDLElBQUFBOztBQUtBLFFBdkJNQyxLQUFTRCxZQUFBQSxPQUVUQyxLQUFRQyxXQUFBQSxPQUVoQkQsS0FBS0UsUUFBQUEsUUFxREdGLEtBQUFHLElBQTZDLENBQUNELElBQU9FLE9BQUFBO0FBRXZESixXQUFLSSxnQkFFSEosS0FBS0ksZ0JBQWdCQSxPQUV2QkosS0FBS0MsV0FBQUEsT0FDTEQsS0FBS0ksWUFBQUEsSUFHRkosS0FBS0QsYUFDUkMsS0FBS0ksWUFBQUEsSUFLVEosS0FBS0UsUUFBUUEsSUFFYkYsS0FBS0osS0FBS1MsY0FBQUEs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QUFPLE1BQU0scUJBQXFCLEVBQ3JDLEtBQUssR0FBRyxXQUFXLEVBQUUsRUFDckIsS0FBSyxTQUFPLElBQUksZUFBZSxDQUFDO0FBRW5DLFFBQU0sY0FBYyxNQUFNLGlCQUFpQixFQUN4QyxLQUFLLEdBQUcsT0FBTyxJQUFJLEtBQUssSUFBSSxFQUFFLEVBQzlCLEtBQUssU0FBTyxJQUFJLFFBQVEsQ0FBQztBQUU1QixRQUFNLFFBQVEsTUFBTSxpQkFBaUIsRUFDbEMsS0FBSyxHQUFHLE9BQU8sSUFBSSxLQUFLLElBQUksRUFBRSxFQUM5QixLQUFLLFNBQU8sSUFBSSxNQUFNLENBQUM7QUFFMUIsUUFBTSxVQUFVLEdBQUcsT0FBTyxJQUFJLEtBQUssSUFBSTtBQUN2QyxRQUFNLFVBQVUsR0FBRyxPQUFPLElBQUksS0FBSyxLQUFLLFVBQVUsR0FBRyxLQUFLLEtBQUssWUFBWSxHQUFHLENBQUMsQ0FBQztBQUVoRixTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsZ0JBQWdCLEtBQUs7QUFBQSxFQUN2QjtBQUNGO0FBR08sSUFBTSxlQUFlLE9BQU8sWUFDakMsaUJBQWlCLEVBQ2QsS0FBSyxPQUFPLEVBQ1osS0FBSyxTQUFPLElBQUksUUFBUSxFQUFFLGlCQUFzQzsiLAogICJuYW1lcyI6IFsiQ29udGV4dFJlcXVlc3RFdmVudCIsICJFdmVudCIsICJjb250ZXh0IiwgImNhbGxiYWNrIiwgInN1YnNjcmliZSIsICJzdXBlciIsICJidWJibGVzIiwgImNvbXBvc2VkIiwgInRoaXMiLCAiY3JlYXRlQ29udGV4dCIsICJrZXkiLCAiQ29udGV4dENvbnN1bWVyIiwgImhvc3QiLCAiY29udGV4dE9yT3B0aW9ucyIsICJjYWxsYmFjayIsICJzdWJzY3JpYmUiLCAidGhpcyIsICJwcm92aWRlZCIsICJ2YWx1ZSIsICJfY2FsbGJhY2siLCAidW5zdWJzY3JpYmUiLCAicmVxdWVzdFVwZGF0ZSIsICJjb250ZXh0IiwgIm9wdGlvbnMiLCAiYWRkQ29udHJvbGxlciIsICJob3N0Q29ubmVjdGVkIiwgImRpc3BhdGNoUmVxdWVzdCIsICJob3N0RGlzY29ubmVjdGVkIiwgImRpc3BhdGNoRXZlbnQiLCAiQ29udGV4dFJlcXVlc3RFdmVudCIsICJWYWx1ZU5vdGlmaWVyIiwgInZhbHVlIiwgInRoaXMiLCAiX3ZhbHVlIiwgInYiLCAic2V0VmFsdWUiLCAiZm9yY2UiLCAidXBkYXRlIiwgIk9iamVjdCIsICJpcyIsICJ1cGRhdGVPYnNlcnZlcnMiLCAiZGVmYXVsdFZhbHVlIiwgInN1YnNjcmlwdGlvbnMiLCAiTWFwIiwgImNhbGxiYWNrIiwgImRpc3Bvc2VyIiwgImNvbnN1bWVySG9zdCIsICJzdWJzY3JpYmUiLCAiaGFzIiwgInNldCIsICJkZWxldGUiLCAiZ2V0IiwgImNsZWFyQ2FsbGJhY2tzIiwgImNsZWFyIiwgIkNvbnRleHRQcm92aWRlckV2ZW50IiwgIkV2ZW50IiwgImNvbnRleHQiLCAic3VwZXIiLCAiYnViYmxlcyIsICJjb21wb3NlZCIsICJ0aGlzIiwgIkNvbnRleHRQcm92aWRlciIsICJWYWx1ZU5vdGlmaWVyIiwgImhvc3QiLCAiY29udGV4dE9yT3B0aW9ucyIsICJpbml0aWFsVmFsdWUiLCAib25Db250ZXh0UmVxdWVzdCIsICJldiIsICJjb25zdW1lckhvc3QiLCAiY29tcG9zZWRQYXRoIiwgInN0b3BQcm9wYWdhdGlvbiIsICJhZGRDYWxsYmFjayIsICJjYWxsYmFjayIsICJzdWJzY3JpYmUiLCAib25Qcm92aWRlclJlcXVlc3QiLCAiY2hpbGRQcm92aWRlckhvc3QiLCAic2VlbiIsICJTZXQiLCAic3Vic2NyaXB0aW9ucyIsICJoYXMiLCAiYWRkIiwgImRpc3BhdGNoRXZlbnQiLCAiQ29udGV4dFJlcXVlc3RFdmVudCIsICJhdHRhY2hMaXN0ZW5lcnMiLCAiYWRkQ29udHJvbGxlciIsICJhZGRFdmVudExpc3RlbmVyIiwgImhvc3RDb25uZWN0ZWQiLCAicHJvdmlkZSIsICJjb250ZXh0IiwgInByb3RvT3JUYXJnZXQiLCAibmFtZU9yQ29udGV4dCIsICJjb250cm9sbGVyTWFwIiwgIldlYWtNYXAiLCAiYWRkSW5pdGlhbGl6ZXIiLCAic2V0IiwgInRoaXMiLCAiQ29udGV4dFByb3ZpZGVyIiwgImdldCIsICJjYWxsIiwgInZhbHVlIiwgInNldFZhbHVlIiwgImNvbnN0cnVjdG9yIiwgImVsZW1lbnQiLCAiZGVzY3JpcHRvciIsICJPYmplY3QiLCAiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwgIm5ld0Rlc2NyaXB0b3IiLCAidmFsdWVNYXAiLCAiY29uZmlndXJhYmxlIiwgImVudW1lcmFibGUiLCAib2xkU2V0dGVyIiwgImRlZmluZVByb3BlcnR5IiwgImNvbnN1bWUiLCAiY29udGV4dCIsICJzdWJzY3JpYmUiLCAicHJvdG9PclRhcmdldCIsICJuYW1lT3JDb250ZXh0IiwgImFkZEluaXRpYWxpemVyIiwgIkNvbnRleHRDb25zdW1lciIsICJ0aGlzIiwgImNhbGxiYWNrIiwgInZhbHVlIiwgInNldCIsICJjYWxsIiwgImNvbnN0cnVjdG9yIiwgImVsZW1lbnQiLCAiX2EiLCAiX2EiLCAiY3VzdG9tRWxlbWVudHMiLCAiZ2xvYmFsIiwgImdsb2JhbFRoaXMiLCAic3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzIiwgIlNoYWRvd1Jvb3QiLCAiU2hhZHlDU1MiLCAibmF0aXZlU2hhZG93IiwgIkRvY3VtZW50IiwgInByb3RvdHlwZSIsICJDU1NTdHlsZVNoZWV0IiwgImNvbnN0cnVjdGlvblRva2VuIiwgIlN5bWJvbCIsICJjc3NUYWdDYWNoZSIsICJXZWFrTWFwIiwgIkNTU1Jlc3VsdCIsICJjc3NUZXh0IiwgInN0cmluZ3MiLCAic2FmZVRva2VuIiwgInRoaXMiLCAiRXJyb3IiLCAiX3N0cmluZ3MiLCAic3R5bGVTaGVldCIsICJfc3R5bGVTaGVldCIsICJjYWNoZWFibGUiLCAibGVuZ3RoIiwgImdldCIsICJyZXBsYWNlU3luYyIsICJzZXQiLCAidG9TdHJpbmciLCAidW5zYWZlQ1NTIiwgInZhbHVlIiwgIlN0cmluZyIsICJjc3MiLCAidmFsdWVzIiwgInJlZHVjZSIsICJhY2MiLCAidiIsICJpZHgiLCAiYWRvcHRTdHlsZXMiLCAicmVuZGVyUm9vdCIsICJzdHlsZXMiLCAiYWRvcHRlZFN0eWxlU2hlZXRzIiwgIm1hcCIsICJzIiwgInN0eWxlIiwgImRvY3VtZW50IiwgImNyZWF0ZUVsZW1lbnQiLCAibm9uY2UiLCAic2V0QXR0cmlidXRlIiwgInRleHRDb250ZW50IiwgImFwcGVuZENoaWxkIiwgImdldENvbXBhdGlibGVTdHlsZSIsICJzaGVldCIsICJydWxlIiwgImNzc1J1bGVzIiwgImlzIiwgImRlZmluZVByb3BlcnR5IiwgImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsICJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwgImdldE93blByb3BlcnR5U3ltYm9scyIsICJnZXRQcm90b3R5cGVPZiIsICJPYmplY3QiLCAiZ2xvYmFsIiwgImdsb2JhbFRoaXMiLCAiY3VzdG9tRWxlbWVudHMiLCAidHJ1c3RlZFR5cGVzIiwgImVtcHR5U3RyaW5nRm9yQm9vbGVhbkF0dHJpYnV0ZSIsICJlbXB0eVNjcmlwdCIsICJwb2x5ZmlsbFN1cHBvcnQiLCAicmVhY3RpdmVFbGVtZW50UG9seWZpbGxTdXBwb3J0IiwgIkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkiLCAicHJvcCIsICJfb2JqIiwgImRlZmF1bHRDb252ZXJ0ZXIiLCAidmFsdWUiLCAidHlwZSIsICJCb29sZWFuIiwgIkFycmF5IiwgIkpTT04iLCAic3RyaW5naWZ5IiwgImZyb21WYWx1ZSIsICJOdW1iZXIiLCAicGFyc2UiLCAiZSIsICJub3RFcXVhbCIsICJvbGQiLCAiZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb24iLCAiYXR0cmlidXRlIiwgIlN0cmluZyIsICJjb252ZXJ0ZXIiLCAicmVmbGVjdCIsICJoYXNDaGFuZ2VkIiwgIlN5bWJvbCIsICJtZXRhZGF0YSIsICJsaXRQcm9wZXJ0eU1ldGFkYXRhIiwgIldlYWtNYXAiLCAiUmVhY3RpdmVFbGVtZW50IiwgIkhUTUxFbGVtZW50IiwgImluaXRpYWxpemVyIiwgInRoaXMiLCAiX19wcmVwYXJlIiwgIl9pbml0aWFsaXplcnMiLCAicHVzaCIsICJvYnNlcnZlZEF0dHJpYnV0ZXMiLCAiZmluYWxpemUiLCAiX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwIiwgImtleXMiLCAibmFtZSIsICJvcHRpb25zIiwgInN0YXRlIiwgImVsZW1lbnRQcm9wZXJ0aWVzIiwgInNldCIsICJub0FjY2Vzc29yIiwgImtleSIsICJkZXNjcmlwdG9yIiwgImdldFByb3BlcnR5RGVzY3JpcHRvciIsICJwcm90b3R5cGUiLCAiZ2V0IiwgInYiLCAiY2FsbCIsICJvbGRWYWx1ZSIsICJyZXF1ZXN0VXBkYXRlIiwgImNvbmZpZ3VyYWJsZSIsICJlbnVtZXJhYmxlIiwgImhhc093blByb3BlcnR5IiwgInN1cGVyQ3RvciIsICJNYXAiLCAiZmluYWxpemVkIiwgInByb3BzIiwgInByb3BlcnRpZXMiLCAicHJvcEtleXMiLCAicCIsICJjcmVhdGVQcm9wZXJ0eSIsICJhdHRyIiwgIl9fYXR0cmlidXRlTmFtZUZvclByb3BlcnR5IiwgImVsZW1lbnRTdHlsZXMiLCAiZmluYWxpemVTdHlsZXMiLCAic3R5bGVzIiwgImlzQXJyYXkiLCAiU2V0IiwgImZsYXQiLCAiSW5maW5pdHkiLCAicmV2ZXJzZSIsICJzIiwgInVuc2hpZnQiLCAiZ2V0Q29tcGF0aWJsZVN0eWxlIiwgInRvTG93ZXJDYXNlIiwgImNvbnN0cnVjdG9yIiwgInN1cGVyIiwgIl9faW5zdGFuY2VQcm9wZXJ0aWVzIiwgImlzVXBkYXRlUGVuZGluZyIsICJoYXNVcGRhdGVkIiwgIl9fcmVmbGVjdGluZ1Byb3BlcnR5IiwgIl9faW5pdGlhbGl6ZSIsICJfX3VwZGF0ZVByb21pc2UiLCAiUHJvbWlzZSIsICJyZXMiLCAiZW5hYmxlVXBkYXRpbmciLCAiXyRjaGFuZ2VkUHJvcGVydGllcyIsICJfX3NhdmVJbnN0YW5jZVByb3BlcnRpZXMiLCAiZm9yRWFjaCIsICJpIiwgImNvbnRyb2xsZXIiLCAiX19jb250cm9sbGVycyIsICJhZGQiLCAicmVuZGVyUm9vdCIsICJpc0Nvbm5lY3RlZCIsICJob3N0Q29ubmVjdGVkIiwgImRlbGV0ZSIsICJpbnN0YW5jZVByb3BlcnRpZXMiLCAic2l6ZSIsICJjcmVhdGVSZW5kZXJSb290IiwgInNoYWRvd1Jvb3QiLCAiYXR0YWNoU2hhZG93IiwgInNoYWRvd1Jvb3RPcHRpb25zIiwgImFkb3B0U3R5bGVzIiwgImNvbm5lY3RlZENhbGxiYWNrIiwgImMiLCAiX3JlcXVlc3RlZFVwZGF0ZSIsICJkaXNjb25uZWN0ZWRDYWxsYmFjayIsICJob3N0RGlzY29ubmVjdGVkIiwgIl9vbGQiLCAiXyRhdHRyaWJ1dGVUb1Byb3BlcnR5IiwgImF0dHJWYWx1ZSIsICJ0b0F0dHJpYnV0ZSIsICJyZW1vdmVBdHRyaWJ1dGUiLCAic2V0QXR0cmlidXRlIiwgImN0b3IiLCAicHJvcE5hbWUiLCAiZ2V0UHJvcGVydHlPcHRpb25zIiwgImZyb21BdHRyaWJ1dGUiLCAiXyRjaGFuZ2VQcm9wZXJ0eSIsICJfX2VucXVldWVVcGRhdGUiLCAiaGFzIiwgIl9fcmVmbGVjdGluZ1Byb3BlcnRpZXMiLCAicmVqZWN0IiwgInJlc3VsdCIsICJzY2hlZHVsZVVwZGF0ZSIsICJwZXJmb3JtVXBkYXRlIiwgIndyYXBwZWQiLCAic2hvdWxkVXBkYXRlIiwgImNoYW5nZWRQcm9wZXJ0aWVzIiwgIndpbGxVcGRhdGUiLCAiaG9zdFVwZGF0ZSIsICJ1cGRhdGUiLCAiX19tYXJrVXBkYXRlZCIsICJfJGRpZFVwZGF0ZSIsICJfY2hhbmdlZFByb3BlcnRpZXMiLCAiaG9zdFVwZGF0ZWQiLCAiZmlyc3RVcGRhdGVkIiwgInVwZGF0ZWQiLCAidXBkYXRlQ29tcGxldGUiLCAiZ2V0VXBkYXRlQ29tcGxldGUiLCAiX19wcm9wZXJ0eVRvQXR0cmlidXRlIiwgIm1vZGUiLCAicmVhY3RpdmVFbGVtZW50VmVyc2lvbnMiLCAiZ2xvYmFsIiwgImdsb2JhbFRoaXMiLCAidHJ1c3RlZFR5cGVzIiwgInBvbGljeSIsICJjcmVhdGVQb2xpY3kiLCAiY3JlYXRlSFRNTCIsICJzIiwgImJvdW5kQXR0cmlidXRlU3VmZml4IiwgIm1hcmtlciIsICJNYXRoIiwgInJhbmRvbSIsICJ0b0ZpeGVkIiwgInNsaWNlIiwgIm1hcmtlck1hdGNoIiwgIm5vZGVNYXJrZXIiLCAiZCIsICJkb2N1bWVudCIsICJjcmVhdGVUcmVlV2Fsa2VyIiwgImNyZWF0ZU1hcmtlciIsICJjcmVhdGVDb21tZW50IiwgImlzUHJpbWl0aXZlIiwgInZhbHVlIiwgImlzQXJyYXkiLCAiQXJyYXkiLCAiaXNJdGVyYWJsZSIsICJTeW1ib2wiLCAiaXRlcmF0b3IiLCAiU1BBQ0VfQ0hBUiIsICJ0ZXh0RW5kUmVnZXgiLCAiY29tbWVudEVuZFJlZ2V4IiwgImNvbW1lbnQyRW5kUmVnZXgiLCAidGFnRW5kUmVnZXgiLCAiUmVnRXhwIiwgInNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4IiwgImRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4IiwgInJhd1RleHRFbGVtZW50IiwgInRhZyIsICJ0eXBlIiwgInN0cmluZ3MiLCAidmFsdWVzIiwgIl8kbGl0VHlwZSQiLCAiaHRtbCIsICJzdmciLCAibWF0aG1sIiwgIm5vQ2hhbmdlIiwgImZvciIsICJub3RoaW5nIiwgInRlbXBsYXRlQ2FjaGUiLCAiV2Vha01hcCIsICJ3YWxrZXIiLCAidHJ1c3RGcm9tVGVtcGxhdGVTdHJpbmciLCAidHNhIiwgInN0cmluZ0Zyb21UU0EiLCAiaGFzT3duUHJvcGVydHkiLCAiRXJyb3IiLCAiZ2V0VGVtcGxhdGVIdG1sIiwgImwiLCAibGVuZ3RoIiwgImF0dHJOYW1lcyIsICJyYXdUZXh0RW5kUmVnZXgiLCAicmVnZXgiLCAiaSIsICJhdHRyTmFtZSIsICJtYXRjaCIsICJhdHRyTmFtZUVuZEluZGV4IiwgImxhc3RJbmRleCIsICJleGVjIiwgInRlc3QiLCAiZW5kIiwgInN0YXJ0c1dpdGgiLCAicHVzaCIsICJUZW1wbGF0ZSIsICJjb25zdHJ1Y3RvciIsICJvcHRpb25zIiwgIm5vZGUiLCAidGhpcyIsICJwYXJ0cyIsICJub2RlSW5kZXgiLCAiYXR0ck5hbWVJbmRleCIsICJwYXJ0Q291bnQiLCAiZWwiLCAiY3JlYXRlRWxlbWVudCIsICJjdXJyZW50Tm9kZSIsICJjb250ZW50IiwgIndyYXBwZXIiLCAiZmlyc3RDaGlsZCIsICJyZXBsYWNlV2l0aCIsICJjaGlsZE5vZGVzIiwgIm5leHROb2RlIiwgIm5vZGVUeXBlIiwgImhhc0F0dHJpYnV0ZXMiLCAibmFtZSIsICJnZXRBdHRyaWJ1dGVOYW1lcyIsICJlbmRzV2l0aCIsICJyZWFsTmFtZSIsICJzdGF0aWNzIiwgImdldEF0dHJpYnV0ZSIsICJzcGxpdCIsICJtIiwgImluZGV4IiwgImN0b3IiLCAiUHJvcGVydHlQYXJ0IiwgIkJvb2xlYW5BdHRyaWJ1dGVQYXJ0IiwgIkV2ZW50UGFydCIsICJBdHRyaWJ1dGVQYXJ0IiwgInJlbW92ZUF0dHJpYnV0ZSIsICJ0YWdOYW1lIiwgInRleHRDb250ZW50IiwgImVtcHR5U2NyaXB0IiwgImFwcGVuZCIsICJkYXRhIiwgImluZGV4T2YiLCAiX29wdGlvbnMiLCAiaW5uZXJIVE1MIiwgInJlc29sdmVEaXJlY3RpdmUiLCAicGFydCIsICJwYXJlbnQiLCAiYXR0cmlidXRlSW5kZXgiLCAiY3VycmVudERpcmVjdGl2ZSIsICJfX2RpcmVjdGl2ZXMiLCAiX19kaXJlY3RpdmUiLCAibmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yIiwgIl8kaW5pdGlhbGl6ZSIsICJfJHJlc29sdmUiLCAiVGVtcGxhdGVJbnN0YW5jZSIsICJ0ZW1wbGF0ZSIsICJfJHBhcnRzIiwgIl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiIsICJfJHRlbXBsYXRlIiwgIl8kcGFyZW50IiwgInBhcmVudE5vZGUiLCAiXyRpc0Nvbm5lY3RlZCIsICJmcmFnbWVudCIsICJjcmVhdGlvblNjb3BlIiwgImltcG9ydE5vZGUiLCAicGFydEluZGV4IiwgInRlbXBsYXRlUGFydCIsICJDaGlsZFBhcnQiLCAibmV4dFNpYmxpbmciLCAiRWxlbWVudFBhcnQiLCAiXyRzZXRWYWx1ZSIsICJfX2lzQ29ubmVjdGVkIiwgInN0YXJ0Tm9kZSIsICJlbmROb2RlIiwgIl8kY29tbWl0dGVkVmFsdWUiLCAiXyRzdGFydE5vZGUiLCAiXyRlbmROb2RlIiwgImlzQ29ubmVjdGVkIiwgImRpcmVjdGl2ZVBhcmVudCIsICJfJGNsZWFyIiwgIl9jb21taXRUZXh0IiwgIl9jb21taXRUZW1wbGF0ZVJlc3VsdCIsICJfY29tbWl0Tm9kZSIsICJfY29tbWl0SXRlcmFibGUiLCAiaW5zZXJ0QmVmb3JlIiwgIl9pbnNlcnQiLCAiY3JlYXRlVGV4dE5vZGUiLCAicmVzdWx0IiwgIl8kZ2V0VGVtcGxhdGUiLCAiaCIsICJfdXBkYXRlIiwgImluc3RhbmNlIiwgIl9jbG9uZSIsICJnZXQiLCAic2V0IiwgIml0ZW1QYXJ0cyIsICJpdGVtUGFydCIsICJpdGVtIiwgInN0YXJ0IiwgImZyb20iLCAiXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZCIsICJuIiwgInJlbW92ZSIsICJlbGVtZW50IiwgImZpbGwiLCAiU3RyaW5nIiwgInZhbHVlSW5kZXgiLCAibm9Db21taXQiLCAiY2hhbmdlIiwgInYiLCAiX2NvbW1pdFZhbHVlIiwgInNldEF0dHJpYnV0ZSIsICJ0b2dnbGVBdHRyaWJ1dGUiLCAic3VwZXIiLCAibmV3TGlzdGVuZXIiLCAib2xkTGlzdGVuZXIiLCAic2hvdWxkUmVtb3ZlTGlzdGVuZXIiLCAiY2FwdHVyZSIsICJvbmNlIiwgInBhc3NpdmUiLCAic2hvdWxkQWRkTGlzdGVuZXIiLCAicmVtb3ZlRXZlbnRMaXN0ZW5lciIsICJhZGRFdmVudExpc3RlbmVyIiwgImV2ZW50IiwgImNhbGwiLCAiaG9zdCIsICJoYW5kbGVFdmVudCIsICJfJExIIiwgIl9ib3VuZEF0dHJpYnV0ZVN1ZmZpeCIsICJfbWFya2VyIiwgIl9tYXJrZXJNYXRjaCIsICJfSFRNTF9SRVNVTFQiLCAiX2dldFRlbXBsYXRlSHRtbCIsICJfVGVtcGxhdGVJbnN0YW5jZSIsICJfaXNJdGVyYWJsZSIsICJfcmVzb2x2ZURpcmVjdGl2ZSIsICJfQ2hpbGRQYXJ0IiwgIl9BdHRyaWJ1dGVQYXJ0IiwgIl9Cb29sZWFuQXR0cmlidXRlUGFydCIsICJfRXZlbnRQYXJ0IiwgIl9Qcm9wZXJ0eVBhcnQiLCAiX0VsZW1lbnRQYXJ0IiwgInBvbHlmaWxsU3VwcG9ydCIsICJsaXRIdG1sUG9seWZpbGxTdXBwb3J0IiwgImxpdEh0bWxWZXJzaW9ucyIsICJyZW5kZXIiLCAiY29udGFpbmVyIiwgInBhcnRPd25lck5vZGUiLCAicmVuZGVyQmVmb3JlIiwgIkxpdEVsZW1lbnQiLCAiUmVhY3RpdmVFbGVtZW50IiwgImNvbnN0cnVjdG9yIiwgInRoaXMiLCAicmVuZGVyT3B0aW9ucyIsICJob3N0IiwgIl9fY2hpbGRQYXJ0IiwgImNyZWF0ZVJlbmRlclJvb3QiLCAicmVuZGVyUm9vdCIsICJzdXBlciIsICJyZW5kZXJCZWZvcmUiLCAiZmlyc3RDaGlsZCIsICJjaGFuZ2VkUHJvcGVydGllcyIsICJ2YWx1ZSIsICJyZW5kZXIiLCAiaGFzVXBkYXRlZCIsICJpc0Nvbm5lY3RlZCIsICJ1cGRhdGUiLCAiY29ubmVjdGVkQ2FsbGJhY2siLCAic2V0Q29ubmVjdGVkIiwgImRpc2Nvbm5lY3RlZENhbGxiYWNrIiwgIm5vQ2hhbmdlIiwgImdsb2JhbFRoaXMiLCAibGl0RWxlbWVudEh5ZHJhdGVTdXBwb3J0IiwgInBvbHlmaWxsU3VwcG9ydCIsICJsaXRFbGVtZW50UG9seWZpbGxTdXBwb3J0IiwgImdsb2JhbFRoaXMiLCAibGl0RWxlbWVudFZlcnNpb25zIiwgInB1c2giLCAiY3VzdG9tRWxlbWVudCIsICJ0YWdOYW1lIiwgImNsYXNzT3JUYXJnZXQiLCAiY29udGV4dCIsICJhZGRJbml0aWFsaXplciIsICJjdXN0b21FbGVtZW50cyIsICJkZWZpbmUiLCAiZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb24iLCAiYXR0cmlidXRlIiwgInR5cGUiLCAiU3RyaW5nIiwgImNvbnZlcnRlciIsICJkZWZhdWx0Q29udmVydGVyIiwgInJlZmxlY3QiLCAiaGFzQ2hhbmdlZCIsICJub3RFcXVhbCIsICJzdGFuZGFyZFByb3BlcnR5IiwgIm9wdGlvbnMiLCAidGFyZ2V0IiwgImNvbnRleHQiLCAia2luZCIsICJtZXRhZGF0YSIsICJwcm9wZXJ0aWVzIiwgImdsb2JhbFRoaXMiLCAibGl0UHJvcGVydHlNZXRhZGF0YSIsICJnZXQiLCAic2V0IiwgIk1hcCIsICJuYW1lIiwgInYiLCAib2xkVmFsdWUiLCAiY2FsbCIsICJ0aGlzIiwgInJlcXVlc3RVcGRhdGUiLCAiXyRjaGFuZ2VQcm9wZXJ0eSIsICJ2YWx1ZSIsICJFcnJvciIsICJwcm9wZXJ0eSIsICJwcm90b09yVGFyZ2V0IiwgIm5hbWVPckNvbnRleHQiLCAicHJvdG8iLCAiaGFzT3duUHJvcGVydHkiLCAiY29uc3RydWN0b3IiLCAiY3JlYXRlUHJvcGVydHkiLCAid3JhcHBlZCIsICJPYmplY3QiLCAiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwgInN0YXRlIiwgIm9wdGlvbnMiLCAicHJvcGVydHkiLCAiYXR0cmlidXRlIiwgImRlc2MiLCAib2JqIiwgIm5hbWUiLCAiZGVzY3JpcHRvciIsICJjb25maWd1cmFibGUiLCAiZW51bWVyYWJsZSIsICJSZWZsZWN0IiwgImRlY29yYXRlIiwgIk9iamVjdCIsICJkZWZpbmVQcm9wZXJ0eSIsICJxdWVyeSIsICJzZWxlY3RvciIsICJjYWNoZSIsICJwcm90b09yVGFyZ2V0IiwgIm5hbWVPckNvbnRleHQiLCAiZGVzY3JpcHRvciIsICJkb1F1ZXJ5IiwgImVsIiwgInJlbmRlclJvb3QiLCAicXVlcnlTZWxlY3RvciIsICJnZXQiLCAic2V0IiwgImtleSIsICJTeW1ib2wiLCAidGhpcyIsICJ2IiwgImRlc2MiLCAicmVzdWx0IiwgImNhbGwiLCAiaGFzVXBkYXRlZCIsICJxdWVyeUFzc2lnbmVkRWxlbWVudHMiLCAib3B0aW9ucyIsICJvYmoiLCAibmFtZSIsICJzbG90IiwgInNlbGVjdG9yIiwgInNsb3RTZWxlY3RvciIsICJkZXNjIiwgImdldCIsICJzbG90RWwiLCAidGhpcyIsICJyZW5kZXJSb290IiwgInF1ZXJ5U2VsZWN0b3IiLCAiZWxlbWVudHMiLCAiYXNzaWduZWRFbGVtZW50cyIsICJmaWx0ZXIiLCAibm9kZSIsICJtYXRjaGVzIiwgInIiLCAiXyIsICJlIiwgInYiLCAiaSIsICJfYSIsICJuIiwgInQiLCAiX2EiLCAieG1sIiwgImF0dHJpYnV0ZXMiLCAieG1sIiwgInhtbCIsICJyIiwgIm4iLCAidCIsICJuIiwgImkiLCAiciIsICJ0IiwgInIiLCAidCIsICJyIiwgInQiLCAiciIsICJuIiwgInQiLCAiX2EiLCAiX2IiLCAidiIsICJpIiwgIm4iLCAiciIsICJ0IiwgIl9hIiwgIl9iIiwgInYiLCAiaSIsICJuIiwgInIiLCAidCIsICJyIiwgInQiLCAiciIsICJ0IiwgInIiLCAiaSIsICJuIiwgInQiLCAiciIsICJ2IiwgIm4iLCAiaSIsICJ0IiwgImkiLCAidCIsICJpIiwgInQiLCAiaWZEZWZpbmVkIiwgInZhbHVlIiwgIm5vdGhpbmciLCAiciIsICJuIiwgImkiLCAibyIsICJyIiwgIm4iLCAidCIsICJfQ2hpbGRQYXJ0IiwgIkNoaWxkUGFydCIsICJfJExIIiwgImlzU2luZ2xlRXhwcmVzc2lvbiIsICJwYXJ0IiwgInN0cmluZ3MiLCAiY3JlYXRlTWFya2VyIiwgImRvY3VtZW50IiwgImNyZWF0ZUNvbW1lbnQiLCAiaW5zZXJ0UGFydCIsICJjb250YWluZXJQYXJ0IiwgInJlZlBhcnQiLCAiY29udGFpbmVyIiwgIl8kc3RhcnROb2RlIiwgInBhcmVudE5vZGUiLCAicmVmTm9kZSIsICJfJGVuZE5vZGUiLCAic3RhcnROb2RlIiwgImluc2VydEJlZm9yZSIsICJlbmROb2RlIiwgIkNoaWxkUGFydCIsICJvcHRpb25zIiwgIm5leHRTaWJsaW5nIiwgIm9sZFBhcmVudCIsICJfJHBhcmVudCIsICJwYXJlbnRDaGFuZ2VkIiwgIm5ld0Nvbm5lY3Rpb25TdGF0ZSIsICJfJHJlcGFyZW50RGlzY29ubmVjdGFibGVzIiwgIl8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQiLCAiXyRpc0Nvbm5lY3RlZCIsICJzdGFydCIsICJuIiwgInNldENoaWxkUGFydFZhbHVlIiwgInZhbHVlIiwgImRpcmVjdGl2ZVBhcmVudCIsICJfJHNldFZhbHVlIiwgIlJFU0VUX1ZBTFVFIiwgInNldENvbW1pdHRlZFZhbHVlIiwgIl8kY29tbWl0dGVkVmFsdWUiLCAiZ2V0Q29tbWl0dGVkVmFsdWUiLCAicmVtb3ZlUGFydCIsICJlbmQiLCAicmVtb3ZlIiwgIlBhcnRUeXBlIiwgIkFUVFJJQlVURSIsICJDSElMRCIsICJQUk9QRVJUWSIsICJCT09MRUFOX0FUVFJJQlVURSIsICJFVkVOVCIsICJFTEVNRU5UIiwgImRpcmVjdGl2ZSIsICJjIiwgInZhbHVlcyIsICJfJGxpdERpcmVjdGl2ZSQiLCAiRGlyZWN0aXZlIiwgIl9wYXJ0SW5mbyIsICJfJGlzQ29ubmVjdGVkIiwgInRoaXMiLCAiXyRwYXJlbnQiLCAicGFydCIsICJwYXJlbnQiLCAiYXR0cmlidXRlSW5kZXgiLCAiX19wYXJ0IiwgIl9fYXR0cmlidXRlSW5kZXgiLCAicHJvcHMiLCAidXBkYXRlIiwgIl9wYXJ0IiwgInJlbmRlciIsICJub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQiLCAicGFyZW50IiwgImlzQ29ubmVjdGVkIiwgImNoaWxkcmVuIiwgIl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiIsICJvYmoiLCAicmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50IiwgIl8kcGFyZW50IiwgImRlbGV0ZSIsICJzaXplIiwgImFkZERpc2Nvbm5lY3RhYmxlVG9QYXJlbnQiLCAiU2V0IiwgImhhcyIsICJhZGQiLCAiaW5zdGFsbERpc2Nvbm5lY3RBUEkiLCAicmVwYXJlbnREaXNjb25uZWN0YWJsZXMiLCAibmV3UGFyZW50IiwgInRoaXMiLCAibm90aWZ5Q2hpbGRQYXJ0Q29ubmVjdGVkQ2hhbmdlZCIsICJpc0NsZWFyaW5nVmFsdWUiLCAiZnJvbVBhcnRJbmRleCIsICJ2YWx1ZSIsICJfJGNvbW1pdHRlZFZhbHVlIiwgIkFycmF5IiwgImlzQXJyYXkiLCAiaSIsICJsZW5ndGgiLCAidHlwZSIsICJQYXJ0VHlwZSIsICJDSElMRCIsICJfJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkIiwgIl8kcmVwYXJlbnREaXNjb25uZWN0YWJsZXMiLCAiQXN5bmNEaXJlY3RpdmUiLCAiRGlyZWN0aXZlIiwgImNvbnN0cnVjdG9yIiwgInBhcnQiLCAiYXR0cmlidXRlSW5kZXgiLCAic3VwZXIiLCAiXyRpbml0aWFsaXplIiwgIl8kaXNDb25uZWN0ZWQiLCAiaXNDbGVhcmluZ0RpcmVjdGl2ZSIsICJyZWNvbm5lY3RlZCIsICJkaXNjb25uZWN0ZWQiLCAiaXNTaW5nbGVFeHByZXNzaW9uIiwgIl9fcGFydCIsICJfJHNldFZhbHVlIiwgIm5ld1ZhbHVlcyIsICJfX2F0dHJpYnV0ZUluZGV4IiwgImNyZWF0ZVJlZiIsICJSZWYiLCAibGFzdEVsZW1lbnRGb3JDb250ZXh0QW5kQ2FsbGJhY2siLCAiV2Vha01hcCIsICJyZWYiLCAiZGlyZWN0aXZlIiwgIkFzeW5jRGlyZWN0aXZlIiwgIl9yZWYiLCAibm90aGluZyIsICJwYXJ0IiwgInJlZkNoYW5nZWQiLCAidGhpcyIsICJfdXBkYXRlUmVmVmFsdWUiLCAidW5kZWZpbmVkIiwgIl9sYXN0RWxlbWVudEZvclJlZiIsICJfZWxlbWVudCIsICJfY29udGV4dCIsICJvcHRpb25zIiwgImhvc3QiLCAiZWxlbWVudCIsICJpc0Nvbm5lY3RlZCIsICJjb250ZXh0IiwgImdsb2JhbFRoaXMiLCAibGFzdEVsZW1lbnRGb3JDYWxsYmFjayIsICJnZXQiLCAic2V0IiwgImNhbGwiLCAidmFsdWUiLCAiZGlzY29ubmVjdGVkIiwgInJlY29ubmVjdGVkIiwgImkiLCAiZSIsICJvIiwgIm4iLCAiciIsICJ0IiwgIl8iLCAiX2EiLCAiZSIsICJuIiwgInQiLCAiVW5zYWZlSFRNTERpcmVjdGl2ZSIsICJEaXJlY3RpdmUiLCAicGFydEluZm8iLCAic3VwZXIiLCAidGhpcyIsICJfdmFsdWUiLCAibm90aGluZyIsICJ0eXBlIiwgIlBhcnRUeXBlIiwgIkNISUxEIiwgIkVycm9yIiwgImNvbnN0cnVjdG9yIiwgImRpcmVjdGl2ZU5hbWUiLCAidmFsdWUiLCAiX3RlbXBsYXRlUmVzdWx0IiwgIm5vQ2hhbmdlIiwgInN0cmluZ3MiLCAicmF3IiwgIl8kbGl0VHlwZSQiLCAicmVzdWx0VHlwZSIsICJ2YWx1ZXMiLCAidW5zYWZlSFRNTCIsICJkaXJlY3RpdmUiLCAiaSIsICJvIiwgInIiLCAibiIsICJ0IiwgImkiLCAiaiIsICJuIiwgIl9hIiwgImMiLCAiYSIsICJiIiwgImkiLCAibiIsICJpIiwgIm4iLCAidCIsICJyIiwgImkiLCAidCIsICJyIiwgImkiLCAidCIsICJyIiwgInQiLCAibiIsICJpIiwgInYiLCAiciIsICJpIiwgImkiLCAiciIsICJlIiwgInYiLCAiaSIsICJjIiwgImUiLCAibiIsICJ4IiwgInYiLCAibiIsICJuIiwgInIiLCAibiIsICJyIiwgIm4iLCAiX2EiLCAiaSIsICJjIiwgImUiLCAiciIsICJfYSIsICJfYiIsICJ2IiwgIm4iLCAidjIiLCAibiIsICJjIiwgImEiLCAiYiIsICJ2IiwgImUiLCAicCIsICJhIiwgImMiLCAiayIsICJyZXF1aXJlIiwgIm4iLCAiciIsICJ0IiwgImUiLCAieCIsICJ5IiwgIl9hIiwgIl9hIiwgIm4iLCAiX2EiLCAiZSIsICJuIiwgImQiLCAiZHJhZ2dhYmxlIiwgInBhcmVudCIsICJpbmRleCIsICJ0YXJnZXRJbmRleCIsICJuIiwgImkiLCAiXyIsICJyIiwgInQiLCAiaWZyYW1lIiwgImUiLCAibiIsICJyIiwgInQiLCAiZSIsICJuIiwgInQiLCAieCIsICJfYSIsICJfYiIsICJpIiwgInQiLCAiZ2VuZXJhdGVNYXAiLCAibGlzdCIsICJzdGFydCIsICJlbmQiLCAibWFwIiwgIk1hcCIsICJpIiwgInNldCIsICJyZXBlYXQiLCAiZGlyZWN0aXZlIiwgIkRpcmVjdGl2ZSIsICJwYXJ0SW5mbyIsICJzdXBlciIsICJ0eXBlIiwgIlBhcnRUeXBlIiwgIkNISUxEIiwgIkVycm9yIiwgIml0ZW1zIiwgImtleUZuT3JUZW1wbGF0ZSIsICJ0ZW1wbGF0ZSIsICJrZXlGbiIsICJrZXlzIiwgInZhbHVlcyIsICJpbmRleCIsICJpdGVtIiwgInRoaXMiLCAiX2dldFZhbHVlc0FuZEtleXMiLCAiY29udGFpbmVyUGFydCIsICJvbGRQYXJ0cyIsICJnZXRDb21taXR0ZWRWYWx1ZSIsICJuZXdWYWx1ZXMiLCAibmV3S2V5cyIsICJBcnJheSIsICJpc0FycmF5IiwgIl9pdGVtS2V5cyIsICJvbGRLZXlzIiwgIm5ld1BhcnRzIiwgIm5ld0tleVRvSW5kZXhNYXAiLCAib2xkS2V5VG9JbmRleE1hcCIsICJvbGRIZWFkIiwgIm9sZFRhaWwiLCAibGVuZ3RoIiwgIm5ld0hlYWQiLCAibmV3VGFpbCIsICJzZXRDaGlsZFBhcnRWYWx1ZSIsICJpbnNlcnRQYXJ0IiwgImhhcyIsICJvbGRJbmRleCIsICJnZXQiLCAib2xkUGFydCIsICJuZXdQYXJ0IiwgInJlbW92ZVBhcnQiLCAic2V0Q29tbWl0dGVkVmFsdWUiLCAibm9DaGFuZ2UiLCAicCIsICJfYSIsICJfYiIsICJvIiwgImMiLCAiZSIsICJfIiwgImkiLCAicyIsICJyIiwgInQiLCAiZSIsICJzIiwgImkiLCAidCIsICJlIiwgImkiLCAiaG90c3BvdCIsICJzIiwgInQiLCAiZSIsICJzIiwgImkiLCAidCIsICJyIiwgImkiLCAibiIsICJ0IiwgImkiLCAiZSIsICJ2IiwgImkiLCAibyIsICJyIiwgIm4iLCAidCIsICJpIiwgInQiLCAiXyIsICJpIiwgIm8iLCAiZCIsICJyIiwgIm4iLCAidCIsICJyIiwgImkiLCAiciIsICJhIiwgImkiLCAidCIsICJpbXBvcnRhbnQiLCAiaW1wb3J0YW50RmxhZyIsICJzdHlsZU1hcCIsICJkaXJlY3RpdmUiLCAiRGlyZWN0aXZlIiwgInBhcnRJbmZvIiwgInN1cGVyIiwgInR5cGUiLCAiUGFydFR5cGUiLCAiQVRUUklCVVRFIiwgIm5hbWUiLCAic3RyaW5ncyIsICJsZW5ndGgiLCAiRXJyb3IiLCAic3R5bGVJbmZvIiwgIk9iamVjdCIsICJrZXlzIiwgInJlZHVjZSIsICJzdHlsZSIsICJwcm9wIiwgInZhbHVlIiwgImluY2x1ZGVzIiwgInJlcGxhY2UiLCAidG9Mb3dlckNhc2UiLCAicGFydCIsICJlbGVtZW50IiwgInRoaXMiLCAiX3ByZXZpb3VzU3R5bGVQcm9wZXJ0aWVzIiwgIlNldCIsICJyZW5kZXIiLCAiZGVsZXRlIiwgInJlbW92ZVByb3BlcnR5IiwgImFkZCIsICJpc0ltcG9ydGFudCIsICJlbmRzV2l0aCIsICJzZXRQcm9wZXJ0eSIsICJzbGljZSIsICJub0NoYW5nZSIsICJ4IiwgInkiLCAiYyIsICJvIiwgImUiLCAiXyIsICJpIiwgIm4iLCAiciIsICJ0IiwgImV2ZW50IiwgIngiLCAiZGlmZlgiLCAiZSIsICJpIiwgIm4iLCAidCIsICJyIiwgIl9hIiwgIl9iIiwgImUiLCAidiIsICJ0IiwgInIiLCAiaSIsICJ0IiwgInIiLCAiaSIsICJuIiwgInQiLCAiciIsICJpIiwgIm4iLCAidCIsICJyIiwgImkiLCAibiIsICJ0IiwgInIiLCAiaSIsICJuIiwgInQiLCAiciIsICJpIiwgInQiLCAiciIsICJpIiwgIm4iLCAidCIsICJyIiwgImkiLCAibiIsICJ0IiwgIl9hIiwgIm4iLCAiciIsICJ0Il0KfQo=